// design

Paid Media Budget Allocation

Use when the user wants to plan, split, or optimize a paid advertising budget across channels (Google, Microsoft, LinkedIn, Meta, TikTok, YouTube, Amazon, Capterra/G2, and more) to hit a CAC target or a customer goal. Also use when the user mentions ad budget allocation, channel mix, media plan, paid spend split, CAC target, marginal CAC, diminishing returns, or "how should I split my ad spend." Produces a defensible per-channel allocation with projected customers, blended CAC, LTV:CAC, payback, and pacing.

DesignengineIntermediate
bash
$npx skills add sarojkjha/aaj-marketing-skills --skill paid-media-budget-allocation
Or run it in Claude or ChatGPT through the AAJ engines connector

How to install and run this

Install it in your project:

npx skills add sarojkjha/aaj-marketing-skills --skill paid-media-budget-allocation

No 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/mcp

Then ask: Use the AAJ paid-media-budget-allocation 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@aaj

OpenAI Codex

codex plugin marketplace add sarojkjha/aaj-marketing-skills
codex plugin add aaj-marketing-skills@aaj

Claude or ChatGPT — no install

Add this as a custom connector:

https://aaj-engines-mcp.sarojkjha10.workers.dev/mcp
Recipes: vendor data in, a verdict out

// when to use it

Use when the user wants to plan, split, or optimize a paid advertising budget across channels (Google, Microsoft, LinkedIn, Meta, TikTok, YouTube, Amazon, Capterra/G2, and more) to hit a CAC target or a customer goal. Also use when the user mentions ad budget allocation, channel mix, media plan, paid spend split, CAC target, marginal CAC, diminishing returns, or "how should I split my ad spend." Produces a defensible per-channel allocation with projected customers, blended CAC, LTV:CAC, payback, and pacing.

// what you give

Business model, monthly budget OR CAC target OR customer goal, LTV, and per-channel CPC / click-to-lead % / lead-to-customer % (or cost-per-lead for directories)

// what you get

A per-channel budget split with projected customers, blended CAC, LTV:CAC, ROAS, payback, and weekly/daily pacing

Engine spec

// decision it supports

How should we split our paid budget across channels to get the most customers under our CAC ceiling?

// inputs

Business model, monthly budget OR CAC target OR customer goal, LTV, and per-channel CPC / click-to-lead % / lead-to-customer % (or cost-per-lead for directories)

// output

A per-channel budget split with projected customers, blended CAC, LTV:CAC, ROAS, payback, and weekly/daily pacing

// acts or analyzes

Analyzes only

Makes no network calls, writes no files and changes nothing in your tools.

// where your information goes

How you run itWhere your inputs go
Skill installed in your agent, or the local MCP serverThe 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 serverYour 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

  • It stops with an error on unrecognised fields, a missing budget, CAC target or customer goal for the chosen mode, and unknown channel keys. It can't check your CPC and conversion rates against your account.
  • Any channel you don't supply in full uses AAJ's illustrative CPC, conversion and close rates, which are not benchmarks. Default channels you leave out stay in the plan on those placeholders.
  • It reports paid-media CAC only. Fully-loaded CAC is higher, so LTV:CAC and payback here show ad efficiency, not the whole business case.
  • The diminishing-returns curve and each channel's scale cap are modelled, not measured from your account, and it can't see attribution lag on deals that close weeks after the click.

// review before acting

Whoever runs paid media replaces every placeholder channel with account data, and the founder or finance lead confirms the LTV and budget, before the split sets spend. Rebalance monthly and track ROAS to 90 days.

// setup

install
$npx skills add sarojkjha/aaj-marketing-skills --skill paid-media-budget-allocation
hosted mcp
$https://aaj-engines-mcp.sarojkjha10.workers.dev/mcp

Agents listed: Claude Code, Cursor, OpenAI Codex, Windsurf, Cline. Tested and recorded: Claude Code, OpenAI Codex (Windows, ab-test-significance only).

Full spec on GitHub

Paid Media Budget Allocation

Allocate a paid advertising budget across channels by cost per customer, not gut feel — funding each channel until the cost of its next customer reaches the target, so the marginal cost of a customer is roughly equal everywhere. This is the most customers a given budget can buy.

Before you start

  1. Read the brand/product context first. If a context file exists (e.g. .agents/product-marketing.md, .agents/aaj-brand.md, or similar), read it for the product, audience, pricing, and positioning. If none exists, ask the user for the essentials below before allocating.
  2. Establish the unit economics. You need: business model (B2B SaaS / ecommerce / local-services / marketplace), average contract or order value, gross margin, and gross-margin LTV per customer. If LTV is unknown, help the user estimate it (or invoke the unit-economics skill) before continuing.
  3. Confirm the objective — one of: a fixed monthly budget, a CAC target, or a customer goal.

Method

  1. Set the CAC ceiling from LTV. David Skok's SaaS guidance puts LTV:CAC above 3:1 (SaaS Metrics 2.0). Work backwards: ceiling ≈ LTV ÷ 3. This is the most you should pay per customer from ads (blended). Note this is paid-media CAC; fully-loaded CAC is higher.
  2. Pick the channel set for the model. Don't run every channel — pick the 3–5 where the buyer actually researches and purchases. See resources/channel-benchmarks.md for the default set per model.
  3. Get a base CAC per channel from the funnel inputs (formula below). This is the cost per customer at efficient, modest spend.
  4. Allocate against diminishing returns. Each channel gets more expensive as you scale (you exhaust the best-matched audience), so the cheapest channel is not where all the budget goes. Fund each channel until the cost of its next customer hits the target, then stop. Channels whose first customer already costs more than the target drop out — correctly.
  5. Present the split with projected customers, blended CAC, LTV:CAC, ROAS, payback, and pacing, plus guardrails.

The math

For each channel:

Cost per lead (CPL)   = CPC ÷ (click→lead %)
Base CAC              = CPL ÷ (lead→customer %)
  · Pay-per-lead channels (Capterra/G2): CPL is a direct input, so Base CAC = CPL ÷ (lead→customer %)

Saturation (diminishing returns), with cap = scale headroom, DR = aggressiveness:
  customers(spend)    = (cap / (BaseCAC · DR)) · ln(1 + DR · spend / cap)
  marginalCAC(spend)  = BaseCAC · (1 + DR · spend / cap)        # cost of the NEXT customer
  spendForMarginal(λ) = 0 if λ ≤ BaseCAC, else (cap / DR) · (λ / BaseCAC − 1)

Allocation by objective:

  • Budget: binary-search a single marginal-CAC level λ so the sum of spendForMarginal(λ) across channels equals the budget (water-filling).
  • CAC target T: set each channel's spend to spendForMarginal(T).
  • Customer goal G: binary-search λ so total customers equal G.

DR presets: gentle 0.4 · moderate 0.8 (default) · aggressive 1.5.

Run the engine (preferred in a coding agent)

Don't approximate the water-filling by hand — run the bundled engine for exact numbers.

Paths assume you installed with npx skills add. From a clone of this repo, use skills/paid-media-budget-allocation/resources/… instead.

# Demo: B2B SaaS, 30k USD budget
node .agents/skills/paid-media-budget-allocation/resources/allocation-engine.js

# Custom — pass a JSON config
node .agents/skills/paid-media-budget-allocation/resources/allocation-engine.js '{"model":"saas","mode":"budget","budget":30000,"diminishingReturns":"moderate","channels":[{"key":"capterra","model":"cpl","cpl":90,"l2c":22,"cap":8000}]}'

# Schema and channel keys
node .agents/skills/paid-media-budget-allocation/resources/allocation-engine.js --help

The engine prints a per-channel table plus a JSON block you can parse. Always seed the per-channel inputs with the user's own account data; the defaults exist so the engine runs.

Channel defaults

To run on the user's numbers alone, add "onlyListedChannels": true: the engine then uses only the channels listed (each needs cpc, cvr, l2c and cap, or cpl, l2c and cap), no preset LTV, ACV or margin, and skips LTV:CAC, ROAS or payback when their input is missing. The default channel set per business model and placeholder CPC / conversion / close-rate numbers are in resources/channel-benchmarks.md. They are AAJ's illustrative defaults, not benchmarks, and aren't traced to a published survey. Say so whenever an output still uses them, and replace them with the client's own numbers before anyone budgets from the result.

Present the result

Use the format in resources/output-format.md: the split (channel, $, %, customers, CAC), the blended summary (customers, CAC, LTV:CAC, ROAS, payback), weekly/daily pacing, and a short "what this means" with guardrails.

Show where it came from. Open your answer with "AAJ paid-media-budget-allocation engine result:" and print the engine's output block exactly as it returned it, then add the line Method: https://skills.aajconsult.com/skills/paid-media-budget-allocation. 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

  • Optimize on customers/revenue, not cost-per-lead. Cheap leads that never close are the most expensive thing in paid media.
  • Don't pour everything into the cheapest channel — average CAC hides diminishing returns; the next customer there may already cost more than elsewhere.
  • Right-size the channel count. Three to five channels funded above their learning minimums beat many channels starved of budget. If two or more channels would get under about 1,500 USD a month, recommend consolidating (the engine flags this; 1,500 USD is this engine's rule of thumb, not a platform minimum).
  • Mind attribution and lag. In B2B, deals close weeks after the click — track ROAS to 90 days and year one, not month one.
  • Rebalance monthly, not daily. Large budget swings reset platform learning; give a change two to four weeks.
  • Be explicit that this is paid-media CAC. Fully-loaded CAC (salaries, tools, content) is higher, so LTV:CAC and payback here reflect ad efficiency only.

unit-economics (LTV and the CAC ceiling) · marketing-budget-planning (how much to spend in total) · ab-test-significance (prove a channel's lift before scaling) · marketing-report (measure customers, not form fills).

// faq

// install

$npx skills add sarojkjha/aaj-marketing-skills --skill paid-media-budget-allocation

// run it

$node .agents/skills/paid-media-budget-allocation/resources/allocation-engine.js --demo

// worked example

Get the worked example for Paid Media Budget Allocation

One email. The filled-in config, the output, and how to read it.

No spam. Unsubscribe anytime.

// sprint

Unit Economics & Retention Sprint — $3,500, 10 business days

This skill is one of the engines behind the Unit Economics & Retention Sprint — $3,500, ten business days.

LTV, CAC, payback and churn on your actual numbers — with a verdict, not a dashboard.

See what's included.

// 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.