> ## Documentation Index
> Fetch the complete documentation index at: https://docs.semicola.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Set up a campaign

> Use when a buyer wants to turn a brief into a draft campaign, request and compare proposals from sellers, attach creatives and stage the chosen media buys. Stops before launch.

Skill `set-up-a-campaign` · version 1.0.0 · for buyers.

## When to use

* A person hands you a brief, a budget or a plan and wants it in front of sellers.
* A person wants to compare what sellers offer before committing to anything.
* A draft campaign exists but has no proposals or no staged media buys yet.

To change or launch a campaign that is already staged, use
[Manage a campaign](/skills/manage-a-campaign). To work with one named seller, use
[Buy from a seller](/skills/buy-from-seller).

## Before you start

* The account is ready to buy. If not, run [Get an account ready to buy](/skills/get-account-ready-to-buy).
* The advertiser exists, and you know its `advertiserId`.
* You have from the person: the full brief, total budget and currency, flight dates, and target
  countries and channels. If they have a conversion goal, run
  [Set up an event source](/skills/set-up-an-event-source) first.

## Steps

1. Call `get_status`. Stop and resolve any readiness blocker first.
2. Call `search` with `kind: "campaign"` to check the person does not already have this campaign.
3. Call `save_campaign` with `advertiserId`, `name`, `brief`, `flight`, `budget` (`total`,
   `currency`, `pacing`), `targeting` and an `idempotencyKey`. Pass the brief exactly as the person
   wrote it. Answer any `needs_input` with the person. Keep the returned `campaignId` and `revision`.
4. Call `request_proposals` with `campaignId`, `expectedCampaignRevision` and a new
   `idempotencyKey`. It returns at once with an execution id and the status `running`. Only one
   execution runs per buyer account.
5. Collect results by calling `request_proposals` again with the same `idempotencyKey` and each
   `resultCursor` until the execution completes, or read proposals with `get` and
   `kind: "proposal"`. Tell the person which sellers quoted, which returned products and which
   failed.
6. Compare the proposals with the person: products, price, flight fit and share of budget.
7. Where the person wants changes, call `refine_proposal` with the `proposalId`, plain
   `instructions`, and optionally `keepProductIds`, `dropProductIds` or `budgetDelta`. The seller may
   decline parts of a refinement; report what it accepted.
8. Creatives. Call `open_creative_library` or `upload_creative_asset` so the person can add assets,
   or `open_creative_composer` to build one. Then call `save_creative` with `sourceAssets` and
   `campaignIds` to attach it, and read the format fit it reports per campaign.
9. Stage. For each proposal the person picked, call `save_media_buy` with `fromProposalId` and an
   `idempotencyKey`. Staging contacts no seller and books nothing.
10. Call `open_campaign_receipt` with the `campaignId` to show the plan, staged buys, budget,
    creative coverage and remaining blockers.

## Guardrails

* Do not launch in this skill. Launching is a separate decision that
  [Manage a campaign](/skills/manage-a-campaign) handles with the person's explicit approval.
* Never fill in a budget, currency, date or audience the person did not give you.
* If your process stops while a proposal request is running, do not start a new one. Call
  `request_proposals` with the same `idempotencyKey` to pick the execution back up.
* Keep each decision point visible: draft, proposals, refinements, staging.
* Rehearse with a sandbox advertiser when the person is testing.

## Done when

* A draft campaign exists with at least one staged media buy.
* The campaign receipt shows no blockers, or you have told the person each one that remains.
* The person knows the next step is launch, and that it needs their approval.
