Bolta — Winners to Ads
Close the organic→paid loop in one session: find the workspace's winning organic posts (Bolta), read the ad account's gaps and signal health (Meta Ads connector), and produce a ready-to-paste creative package — voice-true ad variants plus a suggested campaign structure. Bolta supplies what the ad platform can't: the organic corpus and the brand voice.
When to use
The user wants to know what to boost, wants ad creative sourced from what already works organically, or wants fresh ad variants because current creative is fatiguing. The deliverable is an in-chat creative package — never a live campaign.
Hard rule: read-only on Meta
Never call any Meta tool that creates, edits, pauses, or deletes campaigns, ad sets, ads, audiences, or budgets — even if the user asks mid-flow. If asked to "just launch it", output the exact structure to create manually in Ads Manager and explain that this skill doesn't spend money on their behalf.
Tools this skill uses
| Tool | Why |
|---|---|
get-my-capabilities (Bolta) |
Step-0 probe that the Bolta connector is live; also yields plan/workspace context. |
list-workspaces (Bolta) |
Resolve workspace_id. |
list-workspace-posts (Bolta) |
Published posts with metrics (status=published, include_metrics=true) — the candidate pool and the ranking data in one call. |
cross-platform-analytics (Bolta) |
Workspace rollup for context and sanity-checking the ranking. |
bulk-create-posts (Bolta) |
Save the generated variants back into Bolta as Drafts if the user wants them persisted. |
get-voice-context (Bolta) |
Tone, dos/donts, terminology, exemplars — every ad variant must stay inside these. |
| Meta ads reporting tools | Current campaign structure, objectives, spend, and performance (read-only). |
| Meta signal diagnostics tools | Signal health/quality flags worth surfacing next to the recommendation. |
Meta tool names are the connector's own (29 tools at mcp.facebook.com/ads); use its
account-overview/reporting reads. Do not assume exact names — pick from what the session
exposes, and only from the reporting/diagnostics groups.
Step 0 — Capability probe (decides the path)
Check which connectors this session actually has:
- Bolta present?
get-my-capabilitiesappears in the tool list. - Meta present? The Meta ads connector's account/reporting tools appear in the tool list.
Branch rule: a connector whose tools are absent from the tool list is missing → use the matching path below. A tool that is present but errors is a transient failure → retry once, then report the error plainly. Never pitch the other product on an error.
- Both present → Full loop (steps 1–5).
- Bolta only → Boost Brief path.
- Meta only → Missing-half path.
Workflow — full loop
1. Resolve workspace and window
list-workspaces → active workspace_id. Window: last 30 days unless the user names one;
state the window in the output.
2. Rank the organic winners (Bolta)
One call does both the pool and the metrics: list-workspace-posts with
status=published, include_metrics=true, and the window as start_date/end_date.
Each post comes back with per-platform engagement (views, likes, comments, reposts) plus
published_at. Do not use get-post-platform-details here — it returns publish
settings (subreddit, privacy, board, etc.), never metrics.
The default page is 50 posts (max 100). Pass limit=100, and if the response says
has_more: true, page through (page=2, …) until the window is covered — otherwise
"best posts" silently means "best of page one".
Rank by engagement rate (engagements ÷ views); fall back to raw engagement count
where views are missing. Take the top 3. Cross-check totals against
cross-platform-analytics so the ranking matches the workspace rollup — but ignore its
growth field, which currently returns 0.0% across accounts (known data-quality issue);
don't use it as a sanity check or present it to the user.
Metrics sync nightly: for posts published under ~24h ago, zeros mean "not synced yet", not "performed badly" — exclude them from the ranking rather than reading them as zero.
No usable metrics (all zeros/absent — some workspaces have unlinked platform metrics): say so plainly, rank by recency + content strength instead, and label the whole package "unvalidated by metrics". Do not present a zero as a real zero.
3. Read the paid side (Meta, read-only)
From the Meta connector's reporting tools: active campaigns, objectives, audiences/placements in use, recent performance, and any creative-fatigue signals (frequency climbing, CTR decaying). From signal diagnostics: any signal-health issues worth flagging. Produce the gap read — which objectives, audiences, and formats the account runs today vs. what the organic winners suggest is resonating.
4. Generate voice-true ad variants (Bolta)
get-voice-context(workspace_id) first — every variant must respect the We Are / We Are Not
boundaries, terminology, and exemplars (same discipline as brand-voice-enforce). For each of
the 3 winners, write 3 ad variants (9 total). Each variant: primary text, headline, and
a CTA suggestion. Adapt hooks from the winning post — don't just copy the organic text; ads
compress harder.
5. Deliver the creative package
One structured output:
- Winners — the 3 posts, their numbers, and one line each on why it won (metric + hook).
- Gap read — from step 3, including signal-health flags.
- Variants — 9 ads grouped by winner.
- Suggested campaign structure — objective, one ad set with audience rationale, placement
note, and which variant maps to which ad — formatted to paste into Ads Manager.
End by telling the user to save the package (it lives only in this chat) and offering to save
the variant copy into Bolta as Drafts if they want it persisted. If they say yes, use ONE
bulk-create-postscall with all variants as items, each with"status": "Draft"— never loopcreate-post(the user only ever sees one of the cards). Prefix each item's content with its winner/variant label (e.g. "[Ad — Winner 1, V2]") so the drafts are identifiable.
Degraded paths
Bolta only — Boost Brief
Run steps 1–2 and 4, skip the gap read. Deliver winners + variants + a generic starter campaign suggestion, then: "Connect Meta's Ads AI Connector (mcp.facebook.com/ads) and rerun this to ground the recommendation in your actual campaign data." The brief must be genuinely useful on its own — the connector suggestion is one sentence at the end, not the content.
Meta only — Missing half
Do the paid-side read (step 3) and deliver the gap read honestly. Then explain what's missing: this account's ads can't be refreshed from organic winners because no organic corpus or brand voice is connected — that's what Bolta provides (bolta.ai, connector in the directory). One clear pitch, then stop; don't nag.
Failure handling
- Neither connector present → explain what the skill needs and how to connect each; stop.
- No published posts in the window → widen to 90 days once; if still empty, say the workspace has nothing to mine and suggest bolta-draft-post to start building the corpus.
- No voice context → still generate variants from the winners alone, flag that they're written without stored voice, offer voice setup.
- No active Meta campaigns → skip fatigue analysis; the gap read becomes a cold-start recommendation ("nothing is running; here's where the organic evidence says to start").
- Meta reporting errors after one retry → deliver the Bolta-only Boost Brief and note the paid side was unavailable this session.
Example
User: "What should I boost this month?"
- Probe: both connectors present → full loop.
list-workspaces→ workspace_id; window = 30 days.- Top 3 by engagement rate: a LinkedIn teardown post (6.1% ER), an IG carousel (4.8%), a Threads hot-take (4.2%).
- Meta read: two active campaigns, both traffic-objective, frequency 3.8 and CTR down 22% — creative fatigue; no campaign targets the carousel's audience shape.
get-voice-context→ Direct, builder-to-builder, never hypey.- Package: 3 winners with why-they-won, gap read ("fatigued traffic creative; nothing engagement-shaped"), 9 voice-true variants, one suggested engagement campaign with the carousel-derived variants mapped in. "This lives only in chat — want the copy saved to Bolta as Drafts?"