---
title: meta_create_campaign
description: Create a Meta campaign from a conversation. It always arrives PAUSED.
---

Creates a campaign on a live Meta ad account your organization owns and has connected with write access — so setting one up no longer means leaving the conversation for Ads Manager.

:::warning[Nothing spends until you say so]

The campaign is always created **PAUSED**, and cannot be created active. There is no `status` input, at any layer — the guardrail lives below the tool surface, so no client can reach around it. Activate it yourself with `meta_set_status` once you have reviewed it.

:::

## Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `advertiserId` | `acc_*` | yes | The Meta advertiser. Must belong to your active organization. |
| `name` | `string` | yes | Campaign name, as it appears in Ads Manager. |
| `objective` | `OUTCOME_*` | yes | What the campaign optimizes toward. Constrains its ad sets' optimization goals. |
| `specialAdCategories` | `string[]` | no | Regulated categories Meta requires you to declare. Declaring one limits targeting. |
| `dailyBudget` | `integer` | no | Campaign-level daily budget, in minor currency units (cents). |
| `lifetimeBudget` | `integer` | no | Campaign-level lifetime budget, in minor currency units. |

Objectives are `OUTCOME_AWARENESS`, `OUTCOME_ENGAGEMENT`, `OUTCOME_LEADS`, `OUTCOME_SALES`, `OUTCOME_TRAFFIC`, `OUTCOME_APP_PROMOTION`.

Setting a budget here turns on **Advantage campaign budget** (CBO) — Meta distributes one pot across the ad sets. Omitting it means each ad set carries its own budget instead. Provide at most one of the two.

## Output

`{ workflowId }`, immediately. The write runs asynchronously: call `get_mutation_status` with that `workflowId` to get the created campaign's `{ id }`.

That returned `id` is the handle — pass it to `meta_update_budget`, `meta_set_status`, or a future ad set. Do not expect the new campaign to appear in `list_entities` right away; AdCrunch refreshes it in the background, and the id is the contract.

## Example

> _"Set up a sales campaign called Spring Prospecting on my Meta account, €50 a day."_

Claude calls `meta_create_campaign({ advertiserId: 'acc_998877', name: 'Spring Prospecting', objective: 'OUTCOME_SALES', dailyBudget: 5000 })`, then polls `get_mutation_status` and reports the new campaign's ID — paused, spending nothing.

## Errors

- `Advertiser not found for this organization` — call `list_advertisers`.
- `This advertiser is connected without write access` — reconnect Meta and grant write permission.
- A budget above the safety cap is rejected with the same message `meta_update_budget` gives; it is one guardrail, not two.
- Anything Meta itself refuses is surfaced in Meta's own words, including its error subcode.
- `401` or `403` — see [Errors](/mcp/errors), which every tool shares. This one needs `mutation:write`.
