Ad campaigns

Overview
This is where you run paid ads on social networks. What sets it apart from everything else in Marketing: an ad campaign spends money on its own, and keeps spending while nobody is watching. That is why this area is stricter in three places than the rest.
First: the budget cap is mandatory. No campaign exists without one. It is the ceiling that not even an automation may cross — the only promise the system makes about spending.
Second: creating and releasing are two steps with two permissions. A new campaign is always a draft and costs nothing. Only someone holding marketing.ads.publish can release it.
Third: metrics are computed, never stored. Click rate, cost per result and return are derived from the raw figures on every request. That sounds like a technical detail, but it is the reason the report is right: the networks correct their numbers up to three days retroactively, and a ratio stored once would be wrong from that correction onwards.
How a campaign is built
Three levels, because the networks require three:
| Level | What it decides |
|---|---|
| Campaign | Goal and money — objective, daily budget, cap, run time |
| Ad group | Who the campaign reaches — countries, age, interests |
| Ad | What they see — copy, creatives, landing URL |
Every group splits the budget. Four groups at five euros a day learn nothing — they only scatter. One to three groups is the normal case.
Core tasks
Create a campaign. Set name, objective, daily budget and cap, then add at least one ad group with one ad. The campaign is created as a draft.
Let AI draft it. Under Draft with AI you describe in your own words what the campaign should achieve. The result lands in the form, not in the database: you see it, change it and save it yourself. Even then it spends nothing — releasing stays a separate step.
Start with the brief assistant. Via Plan an ad you describe in three steps what the advert should achieve: goal and brief, then daily budget and cap (mandatory), then the AI suggestion as variant cards. Each card can be unticked on its own; every remaining one becomes its own ad. At the end the campaign exists as a draft — it spends nothing.
Compare variants and pick a winner. An ad group can compare its own ads: by click rate, cost per click, cost per conversion or return on ad spend. After a configurable period and above a minimum amount of data the winner is decided, and the losers are paused.
Two things this test does not do, both deliberately:
- It never raises the budget. A test that spends more money on the side is not a test.
- It does not decide too early. Without the minimum amount of data it crowns nobody — three
clicks are not a result, they are noise.
The decision sits on the campaign's monitoring page: one column per ad, one row per metric, the winner marked at the column head. The faint highlight of the best value per row helps reading — it claims no winner. The winner comes from the decision with a period and minimum data, not from the snapshot of a number.
Release. The confirmation names the daily budget and the cap. From here delivery runs, and money spent is gone. Pausing works at any time and needs no extra permission.
Change the budget. Above the cap it is rejected, not silently trimmed — a trimmed budget would look like an accepted one. Raising the cap requires the publish permission; lowering it is open to anyone who may edit.
Report. The report shows spend, clicks and results per campaign plus the metrics computed from them. Under Explain the AI summarises the figures and derives at most three recommendations — strictly from what the table shows.
Attribution
Each ad's landing URL automatically receives the three attribution parameters (utm_source, utm_medium=paid, utm_campaign) on save. Parameters the URL already carries are kept.
This is deliberately not your job: whoever maintains them by hand forgets them on the third ad — and that ad is permanently unattributable, because the clicks have already happened.
Tie the ad campaign to a campaign as well and utm_campaign carries that name. Email, social and ads then appear under one roof in the report.
Optimising automatically
New daily figures raise an event you can hang automations on — with the metrics as condition fields: "if cost per lead exceeds 50 euros, pause".
Two actions are available:
- Pause ad campaign — no safety catch, because pausing saves money.
- Adjust ad budget — absolute or in percent, but never above the cap and **never more than
double in one step**. A rule that ratchets itself up looks harmless at every single step.
Whatever was trimmed is recorded in the run log.
Fields in detail
The What it does column answers what changes in the system — not what the field is called. The grey name behind the label is the API field: the same thing runs under that name through automation, import and AI tools.
Ad campaign
| Field | Required | Values / format | What it does |
|---|---|---|---|
Name name | yes | text, max. 200 characters | What the campaign is called — here and at the ad network. |
Platform platform | yes | the connected network | Where the advertising runs. It determines which objectives and ad formats are available. |
Objective objective | no | text, max. 40 characters | What is optimised for (reach, clicks, enquiries …). The network shapes delivery around it — the most consequential setting on the mask. |
Daily budget dailyBudgetCent | no | amount, 0 or more | How much may be spent per day. |
Lifetime budget lifetimeBudgetCent | no | amount, 0 or more | How much in total. Daily and lifetime budgets usually exclude each other. |
Cap budgetCapCent | no | amount, greater than 0 | The hard limit from your side, independent of what is set at the network. On reaching it Octibiz pauses the campaign — the guard against the most expensive mistake in paid advertising. |
Currency currency | no | a configured currency | Currency of the budgets. |
Start startsAt / End endsAt | no | date | Term. Without an end the campaign runs until someone stops it. |
Campaign campaignId | no | an existing campaign | Which campaign the advertising belongs to. Only then do ad cost and resulting revenue stand side by side. |
Ad groups groups | no | list of groups | Audiences, ads and budgets within the campaign. |
Brand brandId | no | one of your brands | Which brand advertises. |
Settings & permissions
- Module
module.marketing. marketing.ads.view— see campaigns and the report.marketing.ads.manage— create, edit, pause and delete campaigns; lower the cap.marketing.ads.publish— release, and raise the cap. The money-moving permission.marketing.ads.connect— connect the ad account.- An ad account needs its own consent. The connection used for social posts is not enough:
permission to publish posts is not permission to spend money.
FAQ & troubleshooting
The campaign will not save — "budget cap is mandatory". That is intended. A cap of 0 means "nothing goes out", not "unlimited"; as a starting state both are useless. Set a ceiling you can live with.
Releasing is rejected. Either marketing.ads.publish is missing, or the daily budget is above the cap. The second case is not a detour: otherwise the cap could be bypassed in two steps.
A warning sign appears next to the state. Your state and the network's have diverged. Pending means the push is still running; Error names the reason; Conflict means the structure was changed on the network — then your state wins for the structure, the network wins for the state.
The campaign says active but delivers nothing. Usually a rejected ad. The state is polled hourly; if it reads Rejected there, the reason is on the ad.
Yesterday's numbers changed. Normal. The networks correct up to three days retroactively, and the daily run deliberately pulls those days again. That is also why metrics are never stored.
"Cost per result" shows a dash. There has been no result yet. "€0.00" would be the best conceivable value here — and therefore the most misleading thing to show.