campaign_plan_create
Write down what you intend to run — on which channels, for whom, for how much, over what period.
Creates a Campaign Plan: a statement of intent you can sum, execute, and later compare against what actually ran.
Input
| Field | Type | Required | Description |
|---|---|---|---|
name |
string |
yes | Display name, e.g. "Q4 Acquisition". |
description |
string |
yes | One-line summary used to pick this plan from a list. |
currency |
string |
yes | ISO 4217. Changeable until a Line Item carries a budget. |
slug |
string |
no | Explicit handle; normalized to kebab-case. Defaults to one derived from the name. |
brand_name |
string |
no | The brand this plan is for. A plan may precede its brand, or cover several. |
total_budget |
number |
no | The envelope, in whole units of the currency. Omit for “no declared constraint”. |
start_date / end_date |
YYYY-MM-DD |
no | Either may be omitted. No end date means always-on. |
rationale |
string |
no | The argument for the split — what a reviewer approves. |
measurement |
string |
no | How success will be judged. |
Example
campaign_plan_create({
name: 'Q4 Acquisition',
description: 'Prospecting across Meta and TikTok, Oct–Dec.',
currency: 'EUR',
total_budget: 100_000, // €100,000.00
start_date: '2026-10-01',
end_date: '2026-12-31',
rationale: 'Meta carries the proven CPA; TikTok is a 30% test we can cut.',
});
// → { campaignPlan: { slug: 'q4-acquisition', status: 'draft', revision: 1, … } }
Requires the campaign_plan:write scope.
Reference
Create a Campaign Plan: what this organization intends to run, on which channels, for whom, for how much, over what period. Only a name, a description and a currency are required — the window, the budget envelope and the brand are all authored incrementally. Amounts are whole units of the plan’s currency: send 40.5 for €40.50, never 4050. The plan starts as a draft. A Campaign Plan is AdCrunch’s own planning document — it is not a campaign on Meta or Google. For those, use list_entities and get_entity.
Input
| Argument | Type | Required | Description |
|---|---|---|---|
brand_name |
string | no | The slug of the brand this plan is for. Optional and changeable later — a plan may precede its brand, or cover several. |
currency |
string, 3 characters | yes | ISO 4217, e.g. EUR. Changeable until a Line Item carries a budget, frozen after that. |
description |
string | yes | One-line summary used to pick this plan from a list. |
end_date |
string | no | Omit for an always-on plan. Line Items inherit this when they set no end of their own — and a line with no effective end reads as a daily rate. |
measurement |
string | no | How success will be judged. |
name |
string | yes | Display name, e.g. “Q4 Acquisition”. |
rationale |
string | no | The argument for the split — why this money goes to these channels. It is what a reviewer approves. |
slug |
string | no | Optional explicit slug handle; normalized to kebab-case. Defaults to one derived from the name. |
start_date |
string | no | |
total_budget |
number, at least 0 | no | The envelope: what you have, in whole units of the plan currency (40.5 is 40.50). Omit for “no declared constraint” — which is not the same as zero. |
Failure codes
A failed call has isError set, and structuredContent.error holds one of these codes. Errors describes the shape of a failed call.
not_foundinvalid_sluginvalid_currencyinvalid_amountinvalid_windowslug_conflictforbiddeninvalid_requestinternal_error
Scope
The token must hold campaign_plan:write. Auth & scopes lists each scope.
Annotations
A client reads these hints. A hint that the tool does not declare has the default value of the MCP specification.
- Writes. The tool can change data.
- Destructive. The tool can make a change that you cannot undo. A client can ask you to confirm before it calls the tool.
- Not idempotent. A second call with the same arguments can change more.
- Closed world. The tool reads and writes the data of AdCrunch only.