Skip to main content

Status, switches, and budgets

Status columns​

Three columns describe whether a row is running. They are available at every level of the report (campaign, ad set, ad).

  • Status — the row's own on/off setting on the ad platform: Active, Paused, Archived, or Deleted. On an ad it is the ad's own status.
  • Effective Status (Meta) — answers "if this row were on, would it actually serve?" It reads Delivering, or Not Delivering followed by every reason that applies, in this order: Account Disabled, Billing Issue, Rejected, In Review, With Issues, Ad Paused, Ad Set Paused, Campaign Paused, Scheduled (starts in the future), Schedule Ended, Spend Cap Reached. An ad set or campaign can also show that none of its children can deliver. An archived or deleted row says so first (for example "Ad Set Archived").
  • Serving Status (Google) — Google's own serving state for the row, with the same Title Case wording as Effective Status.

A blank value means the platform has not reported one yet; the report never invents a reason.

Campaign and ad set on/off switches​

For clients where it has been turned on, a Super Admin sees an on/off switch on campaign and ad set rows (Campaigns table and each campaign's Ad Sets tab). Pausing or turning something on opens a confirmation first and then changes it on Meta or Google. Every change is logged with who did it, the account, the item, and before and after status; a failed change is logged too.

  • Only Super Admins see the switch, and only for clients where Campaign and ad set on/off switches is turned on in the client's Overview tab. It is off by default.
  • Nobody else sees the switch, and the server refuses the request from anyone else.

Daily budget edits​

For clients where it has been turned on, a Super Admin can change the daily budget of a Meta or Google campaign or ad set from the Budget cell of the report.

  • The dialog shows the live budget from the platform (not the last synced number) and the range you may set.
  • One edit can move a budget by at most $500 up or down, and never below $1.00. For example, a $300.00 budget can be set anywhere from $1.00 to $800.00. There is no waiting period, so a bigger move is a few edits in a row.
  • Every attempt (applied, rejected, or failed) is stored in an audit log with the before and after amounts in dollars.
  • It is off by default. A Super Admin turns on Allow daily budget edits from the report per client in the Overview tab.

If you cannot see a switch or edit button​

That is expected for most people. See A switch or budget edit is missing.

For developers — routes, guards, and internals
  • Status engine: src/lib/marketing/effective-status.ts (pure, client-safe; blocker order is the numbered list in the file header). Meta status, effective status, schedule, spend cap and account state are stored by the entity-metadata sync (sync-entity-metadata, cron 23 */6 * * *).
  • Switches: POST/GET /api/admin/campaign-actions/status — requireLiveSuperAdmin (role re-read from the user row), then clients.campaign_status_actions_enabled (default false, otherwise 403). Audit table campaign_status_actions. UI: EntityStatusSwitch.tsx.
  • Budgets: /api/admin/budgets — requireLiveSuperAdmin and clients.budget_edits_enabled (null or false means off). Rule in src/lib/budgets/check-change.ts (MAX_BUDGET_CHANGE_DOLLARS = 500, MIN_DAILY_BUDGET_DOLLARS = 1, compared in integer cents). Audit table ad_budget_changes (decimal dollars). UI: BudgetEditDialog.tsx.
  • Migrations: 20261015130000_campaign_status_actions.sql, 20261016120000_budget_edits.sql.