// design
ABM Program Design
Use when the user is setting up or fixing an account-based marketing program - deciding how many accounts to target, how to tier them, how many touches each tier gets, and whether the team can actually run it. Also use when the user mentions ABM, account-based marketing, target account program, 1:1 or 1:few or 1:many, account tiering, named accounts, or "our ABM program isn't producing pipeline". Checks capacity and coverage together and names which of the two is the binding constraint.
npx skills add sarojkjha/aaj-marketing-skills --skill abm-program-designHow to install and run this
Install it in your project:
npx skills add sarojkjha/aaj-marketing-skills --skill abm-program-designNo install? Add https://aaj-engines-mcp.sarojkjha10.workers.dev/mcp as a custom connector in Claude, ChatGPT or any MCP client.
https://aaj-engines-mcp.sarojkjha10.workers.dev/mcpThen ask: Use the AAJ abm-program-design skill on my numbers.
Step-by-step for every agent, Windows, Mac and Linux →Claude Code
/plugin marketplace add sarojkjha/aaj-marketing-skills/plugin install aaj-marketing-skills@aajOpenAI Codex
codex plugin marketplace add sarojkjha/aaj-marketing-skillscodex plugin add aaj-marketing-skills@aajClaude or ChatGPT — no install
Add this as a custom connector:
https://aaj-engines-mcp.sarojkjha10.workers.dev/mcp// when to use it
Use when the user is setting up or fixing an account-based marketing program - deciding how many accounts to target, how to tier them, how many touches each tier gets, and whether the team can actually run it. Also use when the user mentions ABM, account-based marketing, target account program, 1:1 or 1:few or 1:many, account tiering, named accounts, or "our ABM program isn't producing pipeline". Checks capacity and coverage together and names which of the two is the binding constraint.
// what you give
The pipeline target and period, average contract value, how many hours a week the team can genuinely give ABM, and per tier the account count, touches per month, minutes per touch and the engagement, opportunity and win rates
// what you get
A viability verdict, hours needed against hours available, expected pipeline against target, the binding constraint named, the list the team could actually run, and hours per opportunity by tier
Engine spec
// decision it supports
Can our team actually run this account list, and would it hit the pipeline target if they did?
// inputs
The pipeline target and period, average contract value, how many hours a week the team can genuinely give ABM, and per tier the account count, touches per month, minutes per touch and the engagement, opportunity and win rates
// output
A viability verdict, hours needed against hours available, expected pipeline against target, the binding constraint named, the list the team could actually run, and hours per opportunity by tier
// acts or analyzes
Analyzes onlyMakes no network calls, writes no files and changes nothing in your tools.
// where your information goes
| How you run it | Where your inputs go |
|---|---|
| Skill installed in your agent, or the local MCP server | The engine runs on your machine and AAJ receives nothing. Your AI agent still sends what you give it to its model provider (Anthropic, OpenAI and so on), under your own account's terms. |
| Hosted MCP server | Your agent's model provider, as above, plus AAJ's server on Cloudflare, which receives the engine inputs over HTTPS, runs them in memory and keeps no copy. Cloudflare keeps error logs (no inputs) for up to 7 days. |
No engine needs customer names, emails or other personal data; leave them out.
// limitations
- Capacity is only as honest as the hours a week entered. Headcount or "50 per cent on ABM" inflates it; the skill says to halve the number if those people own a lot else.
- Engagement, opportunity and win rates are inputs. Benchmark rates make coverage a forecast of someone else's business; label them as placeholders and re-run monthly with actuals.
- It assumes every listed account gets its planned touches. An account nobody contacts still counts toward coverage, so a list the team cannot touch overstates expected pipeline.
- It does not check that the accounts fit the ICP. Run it only on a fit-scored list, or it sizes the wrong work.
// review before acting
// setup
npx skills add sarojkjha/aaj-marketing-skills --skill abm-program-designhttps://aaj-engines-mcp.sarojkjha10.workers.dev/mcpAgents listed: Claude Code, Cursor, OpenAI Codex, Windsurf, Cline. Tested and recorded: Claude Code, OpenAI Codex (Windows, ab-test-significance only).
ABM Program Design
ABM programs rarely fail because the accounts were wrong. They fail because the list was sized to hit the pipeline target and the team was sized by whoever happened to be free, and nobody multiplied the two together.
Three months in, the Tier 1 accounts are getting Tier 3 treatment, the personalised work everyone agreed to has quietly stopped, and the programme is reported as "needs more time".
When to use
The user is standing up an ABM program, re-tiering an existing one, being asked how many accounts to target, or trying to work out why a running program is not producing pipeline.
Do not use this before there is an account list with a fit score behind it. A capacity model over a list nobody validated just tells you how long it will take to do the wrong work.
Before you start
- Read the brand/product context (
.agents/product-marketing.md) for the ICP the account list should already reflect. - Get the real hours. Not headcount - hours a week those people can genuinely give ABM after their existing work. This is the number people inflate, and inflating it is what produces the plan that collapses in month three.
- Get the rates from your own history if you have any: what share of targeted accounts engage, what share of those become opportunities, what share close. Use benchmarks only as a placeholder and say so.
- Get the tier definitions, including minutes per touch. A Tier 1 touch that takes forty minutes and a Tier 3 touch that takes three are different programs sharing a name.
Method
An ABM program has to clear two independent tests, and teams usually plan for one.
Capacity. Accounts times touches times minutes, against the hours that actually exist. This is arithmetic, and it is where most programs are already lost on the day they launch. A list at 260 per cent of capacity does not run at 260 per cent - it runs at 100 per cent and silently drops the rest, usually the personalised Tier 1 work that justified the program.
Coverage. Accounts times engagement rate times opportunity rate times ACV, against the target. This is the number the plan was built around, and it is the easier of the two to hit on paper.
The binding constraint is the answer. Over-committed and under-sized need opposite fixes - cut the list, or widen it - so a program that is both is not a planning problem, it is a target problem. The engine names which one binds rather than reporting two ratios and leaving you to guess.
| Tier | Shape | What it buys | What it costs |
|---|---|---|---|
| Tier 1 | 1:1 | Genuine relationships in the accounts worth most | The most hours per opportunity, by a wide margin |
| Tier 2 | 1:few | Clustered by industry or use case, part-personalised | Middle of both |
| Tier 3 | 1:many | Programmatic coverage and air cover | Cheapest per account, weakest per account |
Hours per opportunity is the comparison nobody runs. A Tier 1 opportunity can cost ten times a Tier 3 one. That may be entirely right - it may be the only way into the accounts that matter - but it should be a decision rather than something discovered afterwards.
Workflow
Step 1 - Fix the target and the period. One pipeline number, one window. Without them there is nothing to test coverage against.
Step 2 - Get the honest hours. Ask what else those people own. If the answer is "a lot", halve the number you were given before modelling it.
Step 3 - Tier the list. Accounts, touches per month, minutes per touch, per tier. Use the fit
score from target-account-list rather than intuition.
Step 4 - Run the model. Both tests at once. Read the verdict before the detail.
Step 5 - Move one of the three. If it is not viable, the movable things are the target, the team, or the rates. Adding accounts is only a fix when capacity has room.
Step 6 - Set the review. Re-run monthly with actual engagement rates. Rate drift is what turns a viable plan into a missed number, and it shows up in the model before it shows up in pipeline.
Run the tool
node resources/abm-design.js --demo
design(cfg) returns the capacity ratio, the coverage ratio, the binding constraint, the list the
team could actually run at the current mix, and hours per opportunity by tier. Rates are proportions
between 0 and 1; passing 45 instead of 0.45 is rejected rather than absorbed.
Use the engine rather than a spreadsheet built for the occasion. The point is that both tests run every time - a spreadsheet built to justify a list will only ever compute coverage.
Present the result
- The verdict and the binding constraint, in one line, before any numbers.
- Capacity: hours needed against hours available, and the shortfall in hours.
- Coverage: expected pipeline against target.
- The list they could actually run, when the plan is over-committed. This is usually the most useful output on the page.
- Hours per opportunity by tier, so the tier mix is a decision.
- Which of the three you are proposing to move, and why that one.
Show where it came from. Open your answer with "AAJ abm-program-design engine result:" and print the engine's output block exactly as it returned it, then add the line Method: https://skills.aajconsult.com/skills/abm-program-design. Say the numbers come from the AAJ engine, not from the model. Put your interpretation under that block. Do not retype the figures from memory. If you could not run the engine, say so and label any numbers as your own estimate, not an AAJ result.
Guardrails & common mistakes
- Do not accept headcount as capacity. Two people at "50 per cent on ABM" is almost never forty hours. Ask what else they own and model the number that survives that answer.
- Do not plan a list you cannot touch. An account on a list nobody contacts is not coverage, and it inflates every ratio that depends on account count.
- Do not fix an under-sized program by adding accounts when capacity is already tight. That is the change that looks like progress and guarantees the personalised work stops.
- Do not use benchmark rates without saying so. Label them as placeholders. A program justified on somebody else's conversion rates is a forecast of somebody else's business.
- Do not let Tier 1 quietly become Tier 3. It is the most common silent failure: the treatment degrades, the label does not, and the read-out blames the accounts.
- Do not model in percentages. Rates are proportions. The engine rejects a rate above 1 because a 4,500 per cent engagement rate should stop the run, not scale the answer.
- A target that needs five times the list is a target problem. At that multiple, stop modelling the list and go back to the number, the ACV, or the rates.
Related AAJ resources
- Full method: https://aajconsult.com/playbooks/abm-playbook
- Building and scoring the account list: https://aajconsult.com/playbooks/icp-account-scoring
- Scoring accounts by fit: https://aajconsult.com/tools/icp-fit-scorer
- Checking the pipeline it has to feed: https://aajconsult.com/tools/pipeline-forecast-calculator
Related skills
target-account-list— the fit-scored list this program runs onpipeline-and-forecast— whether the resulting pipeline covers the numbercold-email-sequence— the touches themselves, once the tiers are set
// faq
// install
npx skills add sarojkjha/aaj-marketing-skills --skill abm-program-design// worked example
Get the worked example for ABM Program Design
One email. The filled-in config, the output, and how to read it.
// human in the loop
Need a human in the loop?
AAJ builds the strategies, tools, and playbooks these skills are made of — with engagements for growth-stage and enterprise teams.
