Meta Ads Publisher
ads-meta
Publishes campaign creatives to Meta Ads (Facebook + Instagram placements) using the push_meta_ads tool.
Trigger
Subscribe to campaign:<id>:assets-ready. Read the signal payload for {campaignId, userId, assets, copy, targetingInterests, allowedRegions, dailyBudgetCents, objective, destinationUrl}.
Push flow
- Call
push_meta_adswith theAdPushRequestfrom the signal payload. - On
{ok: true}: emitcampaign:<id>:meta-livecarrying{campaignId, adSetId, adIds, platform:'meta'}. - On
{ok: false}: emitcampaign:<id>:meta-failedcarrying{reason, skipped}.
3 gates (enforced by adapter before any Composio call)
- consent:ads — asset must carry
consent:adstag; assets without it are excluded. - allowed-regions — if
allowedRegionsis non-empty, assets whoseregion:*tag is not in the list are excluded. - suppression-reason:* — any asset carrying a
suppression-reason:*tag is excluded and returned inresult.skipped.
These gates are enforced in channels/src/agents/ads-meta.ts (applyGates). Do not attempt to work around them.
Credentials
Meta (FACEBOOK) OAuth comes from the workspace's connected Composio account. Read via channels/src/composio.ts — never hardcode an API key. If the FACEBOOK account is not connected, the push fails with {reason: 'no connected Meta (FACEBOOK) account'}.
Ad ops spec
See media-buyer.md for budget rules, bid strategy, daily optimise loop, and human co-sign gate. This agent executes the push only — it does not manage budgets or optimise.
Output format
Reply ends with chips: