JTBD Matrix
You turn an ICP into a scored, ranked list of jobs, then attach the messaging each job needs: the pain in the buyer's words, the angle, the proof required, the trigger, the discovery question, and the objection.
Your output is a prioritisation instrument. The point is the ranking. A matrix where fourteen jobs all score "important" has told the reader nothing and cost them a day.
Input
Takes icp/icp-summary.md.
If it does not exist, run the icp-summary skill first, using the domain the user gave you, and carry the result forward. Do not build a job matrix from a domain alone. Jobs come from segments and their four forces; without those you are guessing at the buyer and the scores will be decoration.
If the user supplies first-party materials (transcripts, win/loss notes, support tickets), read them before scoring. They are the only source that gives you real Satisfaction evidence.
What you produce
Two files in the output directory (default icp/):
jtbd-matrix.md: the source of truthjtbd-matrix.xlsx: generated byscripts/md_to_xlsx.py
See references/jtbd-template.md for the structure.
Process
1. Extract job candidates
Read the ICP and pull every candidate job from:
- Each segment's job statement (these are usually your anchor jobs)
- Each segment's pains today and gains sought
- The Push and Pull rows of the four forces (a push is a job waiting to be written)
- The Anxiety and Habit rows (these become switching and migration jobs, which most matrices miss)
- The hidden secondary competition (what people hire instead is a job description)
Expect 20 to 30 raw candidates. Over-collect now, dedupe next.
2. Cluster and dedupe
Group candidates into 6 to 9 job segments. A job segment is a theme, not a persona: "Multi-Framework Scaling," "Switching and Migration," "Deal and Fundraise Support."
Give each segment a two-letter prefix and number the jobs inside it: MF-01, MF-02, SW-01.
Target 10 to 16 jobs total. Fewer than 10 and you have not looked hard enough at the anxiety and habit forces. More than 16 and you are listing features as jobs.
Dedupe rule: two jobs are the same job if the same capability, delivered once, satisfies both. Merge them and keep the better-evidenced statement.
3. Score
For each job, assign Importance and Satisfaction on 1 to 10, then compute:
Opportunity = Importance + max(0, Importance - Satisfaction)
Full scoring discipline is in references/opportunity-scoring.md. The rules that matter most:
- Both scores need a stated basis. Not a citation for every point, but a clause you could defend. Unsourced scores make the ranking arbitrary, and the ranking is the whole product.
- Importance is about the buyer's stakes, not how much you would like the job to matter.
- Satisfaction is about the status quo, including doing nothing, a spreadsheet, or the incumbent tool. It is not about your product. This is the score people get wrong.
- High Importance with high Satisfaction is a red flag. If the status quo already serves an important job well, there is no opportunity there. Check your evidence before keeping it.
Tiers:
| Opportunity | Tier |
|---|---|
| 15+ | Critical |
| 12 to 14.9 | High |
| 9 to 11.9 | Moderate |
| Below 9 | Low |
4. Build the messaging layer
Fill the Messaging sheet for every job. Column-by-column guidance is in references/messaging-fields.md. The demanding column is The Pain, In Their Words: it should be a quote or near-quote from a real review, forum post, case study, or transcript. Where you have no real language, write your best reconstruction and mark it [inferred]. Do not invent a quotation and present it as one.
Each job also needs the honest version of its Likely Objection, with the response. If the response is weak, say so. That weakness becomes a proof-audit item in value-prop-canvas.
Where a job has no capability answer from the vendor, record it as a gap in the matrix. Do not quietly drop the job. Unanswered jobs are the most valuable rows in the handoff, because they become the "Not addressed" rows in the canvas and the do-not-claim list in positioning.
5. Rank and roll up
Sort by Opportunity descending into the Priority sheet. Then build the Scorecard: per job segment, count of jobs, average Importance, average Satisfaction, average Opportunity, count of Critical, count of High, and the maximum opportunity in the segment.
The scorecard is where the strategic read lives. A segment with high average opportunity and no Critical job is a broad, shallow opportunity. A segment with one Critical job and a low average is a single sharp wedge. These call for different go-to-market and the doc should say which one this is.
6. Generate the workbook
python3 scripts/md_to_xlsx.py icp/jtbd-matrix.md icp/jtbd-matrix.xlsx
7. Hand off
Report: the top three jobs by opportunity, the job segment with the highest average, any job where the vendor has no answer, and that value-prop-canvas takes this file as input.
The rules that make this useful
Every job statement is product-agnostic. When / I want / so I can. No product name, no category name, no feature. A job survives the vendor going out of business.
A job is a job, not an activity. "Run a quarterly access review" is an activity. "Prove to an auditor that only the right people had access, without spending a week reconstructing it" is a job. Activities are how the current solution works; jobs are what the buyer is trying to achieve regardless of solution.
Every job needs a named Current Workaround. What are they doing today instead? "Nothing" is only valid when you write it as explicit non-consumption, with the reason: they are absorbing the cost, or they have not felt the trigger yet. A job with no workaround usually means you invented the job.
What Breaks at Scale is the column that earns the matrix. The status quo works until it does not. Naming the exact point of failure is what makes the job urgent, and it is what the trigger event in the messaging sheet is derived from.
Success Metric must be a unit the buyer already tracks. Weeks to audit-ready. Hours per questionnaire. Engineering hours diverted. Deals stalled at review. If you invented the metric, the buyer will not recognise it and the job is not real to them.
The Emotional and Social layer is not decoration. Buyers justify with functional reasons and decide with emotional ones. "Stop being the department that slows every deal down" is why the champion pushes internally. Write it for every job.
Quality gate
- Every job statement names no product and no category.
- No two jobs are satisfied by the same capability delivered once.
- Both scores for every job have a stated basis.
- Every Satisfaction score is about the status quo, not about the vendor's product.
- No job has Importance 8+ and Satisfaction 8+ without explicit evidence for both.
- Every job has a named Current Workaround, with non-consumption written explicitly where it applies.
- Every Success Metric is a unit the buyer already tracks.
- Every pain quote is real and attributed, or marked
[inferred]. - Jobs with no vendor answer are recorded as gaps, not dropped.
- The opportunity scores are computed, not assigned. Check the arithmetic.
Anti-patterns
| Do not | Instead |
|---|---|
| Score everything 8 to 10 on Importance | Use the range. If nothing is a 4, you are not discriminating |
| Score Satisfaction against your own product | Score it against what the buyer uses today |
| Write features as jobs | Write the progress the buyer wants, with no solution in it |
| Invent a customer quote | Use real language, or mark the reconstruction as inferred |
| Drop a job the vendor cannot serve | Keep it and mark it. It is the most useful row downstream |
| Present the ranking as objective | Show the basis for each score so the reader can disagree with a specific number |