# Psm Skill

> Run a Van Westendorp Price Sensitivity Meter (PSM) analysis from survey data. Use this whenever a user drops or uploads a survey file (CSV/Excel) and wants pricing analysis, mentions "price sensitivity", "Van Westendorp", "PSM", "optimal price point", "acceptable price range", "OPP/IPP/PMC/PME", "willingness to pay" from the four PSM questions, or asks to find the right price from "too cheap / cheap / expensive / too expensive" survey responses. Also trigger when a user has pricing-survey columns and wants the curves, key price points, an interactive chart, an Excel workbook, or a Word/PDF report. Produces all three deliverables by default.

- Skill: `itsnagarajan/psm-skill` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add itsnagarajan/psm-skill`
- Raw SKILL.md: https://api.skillmd.com/api/skills/itsnagarajan/psm-skill/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Data & Analytics
- Author: itsnagarajan (https://skillmd.com/u/itsnagarajan)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/itsnagarajan/psm-skill

---


# Price Sensitivity Meter (Van Westendorp)

Turn a pricing survey into the four cumulative curves, the four key price points
(PMC, OPP, IPP, PME) and the acceptable price range — then deliver an interactive
chart, an Excel workbook, and a Word/PDF report.

A deterministic engine does all the math and the chart/Excel rendering. Your job
is to wire it up to the user's file, sanity-check the column mapping, build the
report, and explain the results. Do not re-implement the curve math yourself.

## Workflow

### 1. Locate the data file
The user drops a CSV or Excel file. Find it under `/mnt/user-data/uploads/`.
The file needs one row per respondent and four price columns (the four PSM
questions). Extra columns (respondent ID, demographics, etc.) are fine and ignored.

If no file is present, check what the user has:
- **They have raw responses but no formatted file** → offer the blank input
  template at `assets/psm_template.xlsx`. Present it with `present_files` so they
  can fill it in. It has the four correctly-named question columns (which makes
  auto-detection foolproof), an Instructions sheet, and an Example sheet.
- **They have nothing yet** → point them to the template as a starting point for
  collecting responses, and briefly explain the four PSM questions.

### 2. Run the engine
```bash
python /path/to/skill/scripts/psm_analysis.py "<uploaded_file>" \
    --outdir /mnt/user-data/outputs/psm --currency "$"
```
Set `--currency` to match the data (`$`, `€`, `£`, `AED`, etc.; it is only used
for cleaning and labels). The script auto-detects the four columns from header
keywords, strips currency symbols, drops blank/non-numeric rows, and flags
**intransitive** responses (those violating `too_cheap ≤ cheap ≤ expensive ≤
too_expensive`), excluding them by default.

It writes to the outdir:
- `results.json` — price points, curves, diagnostics, the column mapping it chose
- `psm_curves.png` — static chart (embed this in the report)
- `psm_chart.html` — self-contained interactive chart
- `psm_analysis.xlsx` — Summary, Curves (+ native chart), Clean Data, Excluded

### 3. Verify the column mapping (important)
Read `column_mapping` from the script's stdout / `results.json` and confirm it
matched the right column to each role. If headers were vague, it falls back to
ordering the first four numeric columns by median. If the mapping looks wrong,
re-run with explicit overrides (accepts a header name or a 0-based index):
```bash
... --too-cheap "Q1" --cheap "Q2" --expensive "Q3" --too-expensive "Q4"
```
Also glance at `n_analyzed`, `n_dropped_missing`, and `n_intransitive` — a high
intransitive share signals a data-quality or column-mapping problem worth raising.

### 4. Present results
Show the interactive chart inline using the visualizer (`show_widget`) by reading
`psm_chart.html` content, OR present `psm_chart.html` as a file for download.
Give the four price points and the acceptable range in a short readable summary.
Pull interpretation language from `references/methodology.md` — especially the
OPP-vs-IPP reading and the standard caveats (PSM gives an acceptable band, not a
revenue-maximizing price or demand volume).

### 5. Build the deliverables the user asked for
By default produce all three. The Excel workbook and both charts already exist
from step 2. For the **Word/PDF report**, use the `docx` skill (and `pdf` skill if
PDF is requested) — read that skill first, then build a report that contains:

- Title + one-paragraph executive summary naming the recommended price (OPP) and
  the acceptable range (PMC–PME)
- A **Key price points** table (code, price, meaning) from `results.json`
- The embedded `psm_curves.png`
- A short **Methodology** section and a **Caveats** section (from `methodology.md`)
- Sample size and exclusions (`n_analyzed`, dropped, intransitive)

Finally, call `present_files` with the report first, then the Excel and the
interactive HTML chart.

## Output summary template
Use this structure when summarizing in chat:

```
Recommended price (OPP): <currency><price>
Acceptable range (PMC–PME): <currency><low> – <currency><high>
Indifference price (IPP): <currency><price>
Based on N = <n_analyzed> valid responses (<dropped> dropped, <intransitive> intransitive).
```

## Notes & edge cases
- **Currency / locale**: pass the right `--currency`; the cleaner removes
  thousands separators and stray symbols automatically.
- **Too few rows**: the engine errors below 5 usable responses — relay that and
  ask for more data.
- **Two-column "cheap/expensive" only data**: PSM needs all four questions; if
  only two are present, explain that a full PSM isn't possible.
- **Purchase-intent fields present**: a revenue-optimizing extension
  (Newton-Miller-Smith) becomes possible — see `references/methodology.md`. Only
  pursue it if intent data genuinely exists; otherwise keep scope to classic PSM.
- **Blank input template**: `assets/psm_template.xlsx` is a ready-to-fill
  workbook whose headers match the engine's auto-detection. Offer it whenever a
  user needs to collect or reformat responses before analysis.
- The four roles, intersections, and interpretation are documented in
  `references/methodology.md`; read it before writing report narrative.

