Skip to main content
Use Campaigns to inspect retained Meta campaigns, ad sets, ads and daily metrics, then use Pause, Resume, or an available daily-budget control for a governed change to an eligible object. The MCP inventory tools provide the same kind of stored inspection without making changes. Inventory reads do not contact Meta or trigger a refresh; check freshness before treating them as current account state.

Before you begin

For the dashboard, sign in to the intended workspace and select an available Meta ad account. For MCP, connect a Read or Write workspace key with an active grant covering the inventory tools. The issuer must still have the required workspace role. Both tools require account_id: the internal Plainrouter account ID, not Meta’s external act_… identifier. The account must be available to the authorized workspace. An older account-bound key can name only its bound account. Retained data may remain readable for a disconnected account; that does not authorize live provider operations or revive revoked credentials.

Browse Campaigns

  1. Open Campaigns and select the intended account. Read any connection, access, import-progress or stale-data notice first.
  2. Choose Campaigns, Ad sets or Ads. Open a parent’s ad sets or ads when you need that scope, and use the table’s Previous page / Next page controls to continue through rows.
  3. Open Date range to choose Today, Yesterday, Last 7 days, Last 14 days, Last 30 days or This month. Enable Compare to previous period when needed, then inspect the actual dates and account timezone. Today is incomplete, and retained coverage can shorten a requested window.
  4. Inspect delivery, budgets and pending proposals before deciding what needs attention. Read-only access and unavailable currency or provider state can disable changes.
The page reads retained metrics. A displayed value can change while a fresh read or a submitted change is pending; the temporary display is not proof of a verified Meta result. Missing rows or displayed zero totals do not prove zero provider activity when synchronization is incomplete.

Check Plainrouter ad-tag coverage

get_account_inventory and GET /api/v1/workspaces/{workspace}/admin/ad-accounts/{account_id}/inventory expose tag_coverage for the bound inventory projection. Use a Read or Write Workspace key with get_account_inventory. This read combines tag states for currently visible mirrored ads with retained spend over the last seven complete account-local days, including metric ads no longer visible in that inventory. Inspect the reported reasons and completeness before interpreting a coverage ratio. A checked date with no spend rows can mean zero; a missing or too-early provider read is incomplete. Unusable currency, amount or date evidence can leave totals unavailable, and the ratio is unavailable unless the window is complete and total spend is positive. This is retained mirrored evidence, not proof of exhaustive live account coverage. The check does not add tags or change ads.

Pause or resume a campaign, ad set, or ad

You need a signed-in browser session, workspace membership, and an eligible active Meta account and connection. Check Meta access and workspace policy first. Retained access to a disconnected account does not authorize changes.
  1. Select the intended account and object level in Campaigns, then find the exact row.
  2. Use the row’s on/off switch, or its Pause / Turn on menu action. Selected rows also support bulk Pause or Turn on. A person’s submitted change follows the authorized human decision path; it does not necessarily wait for a second Inbox approval in Ask.
  3. Watch the saving/result state and inspect any refusal or unconfirmed response. A switch can move while saving; that display alone is not provider verification.
  4. Follow the associated batch and receipt in Inbox or Actions reads. Required policy, provider-state and execution checks still apply.
When a successful status change offers Undo, that submits the opposite change through current checks. It is not a guarantee of restoration. Existing agent proposals can also appear on the row for an authorized person to decide; their stored mode and actual policy result remain relevant.

How do I change a daily budget?

  1. Click the displayed daily-budget amount on an eligible campaign or ad set. The Daily budget editor requires an available account currency and an editable owned daily budget. Lifetime and parent-owned budgets remain read-only here.
  2. Enter a different positive amount in the displayed currency. Plainrouter applies Meta’s currency offset; do not multiply every currency by 100.
  3. Review the amount and choose Save to submit the change. Cancel, Escape or closing the editor leaves the budget unchanged.
  4. Follow the saving state, response and receipt. An unconfirmed change is not success; a refusal restores the prior display and gives a reason.
The current editor does not use the former Confirm budget change dialog. Unknown currency precision, malformed amounts and unchanged budgets cannot be submitted. Meta budget units must not be reused for Signals decimal-string revenue. Read Actions inputs and receipts.

How do I verify a Pause or Resume?

Check the stored action and receipt, rather than the switch position or toast alone. Saving means work is in progress. A pending approval, refusal, provider uncertainty or failed result requires its own next step; only exact durable provider verification establishes Landed. Review an unsettled batch before submitting another change to the same target. Interpret execution and recovery.

Read objects with MCP

Call get_account_inventory with tool arguments such as:
The response contains account, sync, staleness, objects and next_cursor. Verify the returned account first. When next_cursor is non-null, repeat the same request with that value as after_id. Stop when it is null. Keep filters unchanged between pages. An object’s internal id is not its external Meta external_id. Objects include configured/effective status, hierarchy, available budget fields, sync timestamps and related Plainrouter receipt fields. Budget fields ending in _minor use Meta budget units for the account currency; unavailable values remain null. They are not universally ISO currency subunits. Budget-unit reference.

Read retained metrics and changes

Call get_inventory_metrics:
Use dates appropriate to your account’s available history. Optional campaign_id, adset_id and ad_id filters use external Meta IDs. Dates use YYYY-MM-DD; the end cannot precede the start. The response contains metrics, object_metrics, unmatched_arrivals, changes, activities, activity_history, effective_range, account details, freshness and pagination. Daily metrics rows include currency, spend, impressions, clicks, inline link clicks, Meta action data, fetch time and counted arrivals. Spend is a decimal string in the account currency; do not interpret it as an integer minor-unit budget field. Set limit from 1–100 (default 25) for each of metrics, object_metrics, changes and activities. Inspect each collection’s total, next_cursor and truncated under pagination. Repeat with the opaque top-level next_cursor as cursor, preserving the account, dates, filters and include_changes; stop when the top-level cursor is null. One collection can finish before another. A short or empty collection on a page does not establish that the complete window has no activity. Date bounds are inclusive in the account timezone, with UTC as the fallback. Plainrouter clips the requested range to the workspace’s customer-visible retention cutoff and today. Inspect effective_range rather than assuming the full request was returned. If no range remains, it is null and metrics, object_metrics and changes are empty. changes is populated only when include_changes is true; it records observed field changes, not a complete causal audit of every Meta edit.

Read the same metrics over REST

Use a Read or Write Workspace key with an active get_inventory_metrics grant for the workspace and account. A Signals Server secret cannot authenticate this route. Replace workspace 42, internal account 91 and the dates with your own values; load the key from server-side secret storage.
The response has the same comparison and pagination fields as MCP. Add limit=25 and, for later requests, the returned opaque cursor as query parameters. This read does not call Meta or refresh inventory. Account scope, date filters and nullable values still apply. The public OpenAPI contract defines the route and authentication.

How do counted arrivals compare with Meta metrics?

Use API or MCP object_metrics to compare a retained campaign, ad set or ad on the same account-local date. The Campaigns dashboard currently shows retained Meta metrics; the counted-arrival comparison is available through these read interfaces. An arrival can match its campaign, ad set and ad. Do not sum all hierarchy levels into a total: that would count the same arrival more than once. Rows can contain arrivals without Meta metrics, or Meta metrics without matching arrivals. To verify a comparison, confirm account and effective_range, choose one hierarchy level, then inspect dates, object IDs, freshness and nullable fields. Check your snippet installation and captured URL fields, numeric Meta object IDs in the ad’s URL tags, and inventory synchronization when matching counts are missing. An unavailable arrivals store is not a measured zero. These arrivals count eligible observations, not unique people, purchases or Meta-attributed conversions. meta.clicks is all Meta clicks and meta.inline_link_clicks is link clicks; neither is the outbound-click figure used by get_arrivals_comparison. meta.spend is a decimal amount in major units of account_currency, and action metrics use Meta’s default attribution. Meta clicks and arrivals can differ. This comparison is separate from Signals reconciliation and does not establish causal lift or admissible quantitative proposal evidence by itself.

Read Meta account activity

With include_changes: true, get_inventory_metrics and its REST equivalent can return activities alongside object diffs. Each activity can identify its event time and object, provider event type, source, application or actor, available old/new summary, and a related Plainrouter receipt. Read receipt_missing and null fields instead of inventing an actor or before/after state. activity_history reports read errors and a possible gap window. Activities have their own pagination inside the shared continuation cursor; preserve the same account, dates, filters and include_changes when continuing. A missing activity is not proof that nobody changed Meta. These are retained provider observations, separate from Plainrouter’s workspace audit chain; they do not establish a complete external edit history or independent receipt verification.

Which creative produced an ad?

Ad-level metrics can include creative_id, generator, generator_job and parent_creative. Plainrouter resolves these fields from a related creation receipt and a creative in the same workspace. Campaign and ad-set rows do not inherit an ad’s provenance. Treat null fields as unknown. A Meta ad without a related Plainrouter creative receipt can have metrics while all four fields remain null; a creative name or arbitrary URL tag is not proof of its generator. These fields describe recorded provenance, not comparative creative quality or performance. See the creative workflow for the separate asset-selection and approval process.

What do freshness and undo warnings mean?

Metrics refresh uses the Meta ad account’s local dates. Recent days are revisited more frequently than older retained days so late reporting changes can be read. A successful read covering a date with no Meta row is different from a date that has not been read. Unchanged metric values can keep an older row fetched_at; check the returned freshness state and reporting dates rather than interpreting every older row timestamp as a failed sync. These refresh checks do not extend plan history or make a missing value zero. Follow Inbox and current disposition and Audit before retrying uncertain or failed recovery. Reading this inventory never performs an undo.

Troubleshoot access and incomplete results

  • Account not found or outside key binding: check the internal account ID, workspace access and older key binding. Trying another workspace’s ID cannot widen access.
  • Missing tool or insufficient scope: inspect discovery and the active grant; replace a credential with the intended permitted scope if necessary. Inventory and Actions record reads can use appropriately scoped Read keys; neither operation gains missing grants from the other.
  • Only some objects appear: follow next_cursor; remove unintended status/parent filters and check freshness.
  • Dates return less history: inspect effective_range and the workspace retention limit. Empty retained results are not proof of zero provider activity.
  • Arrival counts are missing or do not match clicks: distinguish null from 0, inspect matching tags and freshness, and compare one hierarchy level over the same dates. Do not add the workspace’s unmatched count to a filtered ad total.
Tool names and input contracts are published in the Plainrouter MCP server card; response fields are defined in the public OpenAPI contract. For live image/video asset selection, use the separate creative-library workflow.