Periodic review of a live Reddit Ads account: parallel workstreams → consolidation with cross-checks → ranked change proposals + manual tasks → follow-up next cycle.
BigData Boutique defaults: B2B data/search consulting, technical audience, long sales cycle, low conversion volume. Reddit is mainly a community-reach and assist channel, not a last-click lead source. Reddit Ads MCP money fields are USD (
*_usd).
1. How Reddit Differs
| Aspect | Google Ads (search) | Reddit Ads |
|---|---|---|
| Intent | Explicit query | Community/contextual interest, mostly passive browsing |
| Main levers | Keywords, queries | Communities, keywords, interests, creative |
| Conversion role | Last-click capture | Early-stage / assist; last-click undercounts it |
| Waste | Irrelevant queries | Wrong communities, fatigued creative, curiosity clicks, hostile comments |
| Unique signal | Search terms report | Public comments on the ad |
So weigh community fit, creative freshness, sentiment and assist value; distrust platform CPA.
2. Principles
- Measurement first: R1 gates every CPA finding. Every finding cites data (metrics + window).
- Judge qualified outcomes and assist value (lead → SQL, pipeline, self-reported, branded/direct lift), not CTR or platform CPA. Split click-through from view-through (suspect for B2B).
- Community is the unit of analysis; always break down by community (and keyword/placement).
- Creative decays fast; comments are data and risk. Valid public criticism is a reason to pause.
- Respect learning, don’t starve it (§11). Humans approve every change; agents only propose.
3. Cadence & Windows
| Workstream | Weekly | Monthly | Quarterly |
|---|---|---|---|
| R1 Measurement | events arriving (Pixel/CAPI) | dedup, match quality, rejections, CRM reconciliation | attribution settings, CRM loop |
| R2 Governance | rejected ads, stale “active” objects | brand safety, exclusions, Highlights accuracy | access, naming, policy |
| R3 Budget | pacing, ACTIVE-no-spend | budget vs spend | allocation by funnel role |
| R4 Bidding | learning resets | strategy vs volume | MAX test, optimization event |
| R5 Targeting | worst communities by spend | full community/keyword/placement breakdown | tier map refresh, expansion on/off |
| R7 Creative | frequency vs CTR | variant ranking, refresh queue | angle/format strategy |
| R8 Comments | every comment-enabled ad | objection themes | comments-on policy |
| R9 Landing pages | broken URLs, UTMs | engagement by LP | offer/LP tests |
| R6 / R10 / R11 | — | R6 pools, R10 lead → SQL | R6 exclusions, R10 pipeline/assist, R11 landscape |
Windows: weekly = last 7 days + 28-day context; monthly = 30 vs prior 30; quarterly = 90 vs prior 90. Exclude the last ~2 days from efficiency windows: CAPI accepts events up to 7 days late, and dedup needs both copies within 2 days plus up to 24 h processing.
4. Execution Model
Phase 4 Follow-up (run FIRST) ─ did last cycle's applied changes work? (§10)
Phase 0 Context pack (sequential) ─ account, goals, windows, entity map, community tiers
Phase 1 R1…R11 (PARALLEL) ─ each pulls its own data → Findings[] (no proposals)
Phase 2 Consolidation (sequential) ─ R1 gate, cross-check matrix, dedupe, root causes
Phase 3 Prioritize & act (sequential) ─ score, guardrails, ≤N proposals + manual tasks, report
Workstreams return candidate actions only; proposals/tasks are filed once, after consolidation.
5. Phase 0: Context Pack
| Item | Source |
|---|---|
account_id (a2_…), currency, timezone, ad profiles | task fields / reddit_ads_list_ad_accounts |
| Funnel role per campaign (awareness / traffic / retargeting / conversion / lead gen) | objective + goals |
| Target CPA/CPL, max allowable CPA, target cost per SQL | goals / human |
| Community tier map: T1 = ICP (r/elasticsearch, r/dataengineering, r/devops…), T2 adjacent, T3 broad tech; brand/competitor terms | guides / human / R11 |
| Entity map: campaigns → ad groups → ads (ids, status, objective, bid strategy, budget, targeting) | reddit_ads_list_campaigns, reddit_ads_list_ad_groups, reddit_ads_list_ads |
| Known events (launches, LP/tracking changes, outages); Phase 4 results | human / §10 |
6. Phase 1: Parallel Workstreams
Severity: 🔴 critical, 🟠 material, 🟡 hygiene. Decision thresholds are in §11 (stated once).
R1 Measurement & Attribution
Data: Events Manager (UI, manual), get_report conversion metrics (*_clicks vs *_views,
reddit_leads), CRM leads with utm_source=reddit.
- Pixel on all relevant pages (Reddit warns after 6 h without data; primary event silent → 🔴) and CAPI for the same events (warns after 48 h; no CAPI → 🟠).
- Dedup: same ID in Pixel
conversionIdand CAPImetadata.conversion_id; source coverage (share of events with a conversion ID) high; dedup rate ~50% is healthy; a much higher rate can mean a reused ID collapsing real events → 🔴. - Rejected events > 10% of an event type (Reddit banner; e.g. CAPI events > 7 days old) → 🟠.
- Match quality (0–10, needs ≥100 events in 7 days) low → add match keys (email, phone, IP,
user agent, external ID, click ID
rdt_cid, UUID). 🟠 - Attribution: default 28-day click / 1-day view (1/7/28-day options, view ≤ click); reporting window changes don’t change optimization. Mostly view-through → 🟠 “unproven”.
- Event choice = real outcome (Lead/Sign Up) when volume allows. Reconcile Reddit vs CRM leads (§11). UTMs on every URL (content = ad id) → 🟠 if missing; self-reported field → 🟡.
Required verdict: measurement_confidence: high | medium | low.
R2 Governance, Policy & Brand Safety
Data: list_campaigns / list_ad_groups / list_ads (effective_status, rejection_reason);
UI: brand safety, exclusions, members.
- Rejected ads (top spender → 🔴); stale objects (past end date, no active ads, clutter) 🟡.
- Brand safety tier chosen deliberately (Expanded = default/recommended, Standard, Limited w/ IAS for managed accounts only); community/keyword exclusions for off-brand contexts. 🟠
- Redditor Highlights (on by default for eligible feed ads; AI summary + organic posts, not editable): is the summary accurate and on-message? Opt out (UI) if not. 🟠
- Policy: substantiated claims, no implied Reddit endorsement, LP matches ad; AI/synthetic media disclosed where required (political ads). Naming by role/targeting/tier; access minimal. 🟡
R3 Budget, Pacing & Delivery
Data: get_account_performance_summary, get_report (campaign/ad_group × date); budget
is on the ad group (goal_value), campaigns have only spend_cap.
- ACTIVE, ~no spend → bid, audience size, rejection, budget, schedule (🔴 if key campaign).
- Under-delivery → budget isn’t the constraint; see R4/R5/R7. 🟠
- Underfunded / fragmented ad groups (§11 floor) → consolidate. 🟠
- Pacing, spend mix by funnel role vs plan, concentration without results.
R4 Objective, Bidding & Optimization
Data: objective (list_campaigns); bid_strategy, bid_value, optimization_goal
(list_ad_groups); results by ad group.
- Objective fits role (judge each on its own metric; mismatch → 🟠, e.g. Traffic expected to
produce SQLs). API
objective→ UI name; formats per Reddit’s “Ad format by objective”:
| Role | Objective (API) | Formats | Prerequisites | Red flags |
|---|---|---|---|---|
| Awareness (new T1/T2 reach, launches) | Awareness & Consideration (IMPRESSIONS) | free-form, image, video, carousel | none; CPM / CPV | judged on CPA; frequency high, reach flat |
| Video consumption | Video Views (VIDEO_VIEWABLE_IMPRESSIONS) | video only | video assets; CPV | judged on clicks/leads |
| Content / tool / benchmark reads | Traffic (CLICKS) | free-form, image, video, carousel | UTMs, GA4; CPC | curiosity clicks, low LP engagement (C8) |
| Demo / contact / signup | Sales / Conversions (CONVERSIONS) | image, video, carousel | healthy Pixel + CAPI (R1); event volume | R1 low; event too deep for volume; event can’t change after ad group save |
| Gated asset / lead | Lead Generation (LEAD_GENERATION) | image, video | Pixel/CAPI (Reddit is retiring onsite lead forms) | leads not reaching CRM (R10) |
| n/a for BDB | App Promotion (APP_INSTALLS), CATALOG_SALES | — | app / product catalog | any spend |
Default BDB mix [H]: Traffic or Awareness for cold T1/T2, Conversions only for retargeting or
once R1 is high. Feed vs conversation placements apply to all formats (R5). The objective isn’t
editable (update_campaign has no objective; Reddit locks some settings after save) → fix =
new campaign via a PAUSED create plan (create_campaign → create_ad_group → create_ad),
then pause the old one in a separate proposal. create_ad makes TEXT/IMAGE/VIDEO posts only;
carousel, free-form and lead forms are manual (UI).
- Bid strategy (API → UI:
MAXIMIZE_VOLUME= lowest cost,TARGET_CPX= cost cap,MANUAL_BIDDING). Reddit recommends automated bidding: lowest cost usually best, cost cap for control (may underspend). Bid/cap below market → under-delivery (C1). - Optimization event too deep for volume → step up the funnel. Learning resets from frequent edits. 🟠
- MAX campaigns (beta; Traffic/App/Sales; Sales needs Pixel/CAPI): test only after a baseline (C11); manual (UI).
R5 Targeting: Communities, Keywords, Interests, Expansion
Data: get_report(level=ad_group, breakdowns=[community|keyword|interest|placement|country|os_type]);
targeting from list_ad_groups; candidates via search_targeting.
- Community breakdown (spend share, CTR, CPC, CVR, click-through CPA) → winners (protect / dedicated ad group), spenders without results, low CTR, off-map (often expansion).
- Community targeting reaches people active in those communities anywhere on Reddit, not only in the subreddit; too few communities per ad group can’t deliver (§11).
- One targeting type per ad group (mixed → 🟡); overlap across ad groups → 🟡.
- Keywords: short problem/solution terms (Reddit favours short terms over long phrases). Interests: lowest B2B intent; judge separately.
- Automated targeting (
expand_targeting): Reddit recommends on; off is valid for precise, small budgets. Off-map spend dominant with worse CPA → 🟠. - Placement: feed vs conversation (between post and first comment); keep both unless one is clearly worse. Geo/OS: serviceable market; mobile spend with poor CVR → LP fix/split. 🟠
- Demographics. Reddit targets location (IP at serve time: country, region, DMA (US),
city, postal code), gender (profile-set) and language (first-party signals); no age
targeting. Devices/OS and platform (desktop / mobile web / app) are separate targeting.
- Review:
get_report(level=ad_group, breakdowns=[country|region|gender|language|os_type])→ spend share, CTR, CVR, click-through CPA per segment vs the ad group average. Act only past §11 floors (≥ 5–10k impr; spend ≥ 1.5–2× target CPA for a zero-conversion segment) [H]; no age breakdown exists. Reddit’s gender reflects only profile-set data, so an unknown/unset bucket is expected [H]. - Selection (B2B): geo + language = serviceable market (where we sell and deliver, and the ad/LP language); out-of-market spend → 🟠 exclude. Don’t target or exclude by gender without CRM-qualified evidence (lead → SQL), never on CTR alone [H]; community fit beats demographics. Split desktop vs mobile into separate ad groups only when CVR clearly differs (R9) [H].
- Action:
geolocations/excluded_geolocations,languages,gender,platforms,devicesviaupdate_ad_group(proposable; list keys replace). Postal-code geo needs ids fromsearch_targeting(kind=geolocations).
- Review:
R6 Custom Audiences, Retargeting & Exclusions
Data: list_custom_audiences (type, status, size), ad group custom_audience_ids, results.
- Retargeting pools exist and grow (flat → R1 or no traffic) 🟠; short high-intent windows for conversion campaigns.
- Exclusions: customers/converters out of prospecting → 🟠 if missing. Customer lists fresh (≥1,000 matches to be VALID) 🟡. Lookalikes from SQL/customer seeds.
- Retargeting not beating prospecting CVR → R7 or C12.
R7 Creative Performance & Fatigue
Data: get_report(level=ad) (reach, frequency, CTR, CPC, conversions, video); headline/body
via get_ad(include_creative=true); age from list_ads.
- Variant count, fatigue and age vs §11 → refresh queue. 🟠 Rank within ad group on CTR and click-through CVR; pause losers past §11 minimums.
- Native fit: reads like a Reddit post (specific problem, data, plain language); screenshots and numbers over stock imagery. Same ad diverging across T1 vs T3 → community-specific variants.
- Formats on their own metric (video: completion/CPV). Posts are immutable (
update_adonly changes name/click URL): a change means a new ad, losing the winner’s votes/comments.
R8 Comments & Sentiment
Data: manual (Ads Manager / Reddit UI); no MCP tool reads comments. If unavailable, say so.
- Coverage: owner per comment-enabled ad, fast answers; unanswered or unmonitored → 🟠.
- Sentiment/objections (price, trust, “another vendor”, wrong audience, technical correction); valid unresolved criticism → 🔴 pause or fix (C10). Wrong-audience signals → R5 (C9).
- Objections feed R7 creative and R9 FAQs.
R9 Landing Pages & Post-Click
Data: ad click_urls, HTTP checks, GA4 (utm_source=reddit engagement), CVR by LP.
- Broken/redirecting URLs, UTMs stripped 🔴/🟠; low engagement vs other channels → curiosity clicks or mismatch; message match ad ↔ LP headline.
- Offer fit: cold → content/tool/benchmark, retargeting → demo; cold → demo with poor CVR → 🟠.
- Mobile-first (most Reddit users are on mobile); forms fire the conversion once.
R10 Business Outcomes, Lead Quality & Assist Value
Data: CRM (HubSpot) leads with Reddit UTMs/click IDs, stages, pipeline; self-reported attribution; GA4/GSC branded search and direct trends.
- Lead → SQL and cost per SQL / pipeline per $ vs LinkedIn/Google (same windows); far below → junk source 🟠/🔴. Spam leads clustered by community/interest/expansion → exclude.
- Assist value (self-reported “Reddit”, branded/direct lift, multi-touch): record before any cut.
- CRM → CAPI only for events ≤7 days old; later stages stay in CRM reporting.
- No CRM data → say so; efficiency findings become platform-only, lower confidence.
R11 Community & Market Landscape (quarterly)
Data: reddit_ads_search_targeting (communities with subscriber counts), organic monitoring,
subreddit rules.
- New/growing T1/T2 communities untargeted; dead ones still targeted. Organic themes ads miss.
- Competitor presence, our organic mentions (feeds creative, Highlights), vendor-hostile subs, paid ↔ organic consistency.
7. Finding Format
- id: R5-02
workstream: R5
title: "r/learnprogramming takes 18% of 'Data Eng - Communities' spend, 0 conversions"
entities: {campaign_ids: ["…"], ad_group_ids: ["…"], communities: ["learnprogramming"]}
evidence:
window: "2026-08-25..2026-09-21"
metrics: {spend_usd: 412, clicks: 233, ctr: 0.0041, conversions_click: 0, share_of_ad_group_spend: 0.18}
source: "reddit_ads_get_report level=ad_group breakdowns=[community]"
severity: material # critical | material | hygiene
confidence: high # high | medium | low; capped by R1 verdict
est_monthly_impact_usd: 440
root_cause_hint: "Learner community, off the tier map (expansion?)"
candidate_actions:
- kind: proposable # proposable (propose_reddit_ads_change) | manual (human task)
tool: update_ad_group
summary: "Add r/learnprogramming to excluded_communities of ad group …"
depends_on: []
conflicts_with: [] # filled in Phase 2
No finding without metrics and a window. Efficiency uses click-through conversions unless stated.
8. Phase 2: Consolidation & Cross-Checks
8.1 Gate on measurement (R1)
| R1 verdict | Effect |
|---|---|
high | findings stand |
medium | downgrade CPA/CVR-based findings one level |
low (Pixel/CAPI or dedup broken, mostly view-through, no UTMs) | no bid/budget/pause-on-CPA proposals; report R1 fixes + non-conversion findings (delivery, rejections, broken LPs, CTR fatigue, comments, off-map communities) |
8.2 Cross-check matrix
| # | If… | …and… | Then |
|---|---|---|---|
| C1 | R3 under-delivery | R4 manual bid / cost cap below market | bid/cap change, not budget |
| C2 | R3 under-delivery | R5 small audience / few communities | broaden with T1/T2 communities |
| C3 | R3 ACTIVE no spend | R2 ads rejected | fix the ad; no bid/budget change |
| C4 | R5 community spends w/o conversions | R10 assist/self-reported evidence | don’t exclude; judge as assist |
| C5 | R5 community excellent | R3 its ad group budget-limited | scale step or dedicated ad group |
| C6 | R7 CTR falling | R7 frequency rising | fatigue → refresh creative, not targeting |
| C7 | R7 CTR low everywhere | R5 high off-map share | fix targeting first |
| C8 | high CTR, low CVR | R9 low engagement / mismatch | LP/offer fix; if LP fine, qualify the hook |
| C9 | R8 negative comments on ad X | R5 X runs on T3 / interests | narrow targeting before rewriting |
| C10 | R8 valid factual criticism | any scale proposal for that ad | block; pause or fix claim first |
| C11 | R4 cost cap / MAX switch | R1 ≤ medium, or no steady conversions / baseline | defer; fix measurement/volume |
| C12 | R6 retargeting ≤ prospecting | pools stale / exclusions missing | fix pools first |
| C13 | any spend change | ad group in learning or changed < 72 h ago | defer |
| C14 | R10 cost/SQL worse than other channels | strong assist evidence | no cut on last-click; propose holdout |
| C15 | R5 exclude community | it is an organic focus (R11) | exclude only if paid hurts there; note it |
| C16 | several findings on one ad group | — | ≤1 spend-affecting change per cycle (exclusions/new paused ads don’t count) |
| C17 | budget increases | total | fit the envelope or be funded by cuts |
| C18 | Phase 4: last change failed/underdelivered | — | revert/adjust before new proposals on that entity |
8.3 Dedupe & sanity
- Merge same-entity findings (R3 under-delivery + R4 low bid → one); collapse leaf findings into one cause (“exclude learner-community cluster”).
- Totals reconcile with
get_account_performance_summary(±2%). Ids exist and are active. Savings ≤ spend. Nothing contradicts a recorded human decision or an openreddit-ads-changetask (a duplicate proposal returnsstatus: duplicate).
9. Phase 3: Prioritization, Proposals & Manual Tasks
Score impact × confidence ÷ effort (confidence 1.0/0.6/0.3; effort 1 = one API call, 2 = new
creative/LP, 3 = restructure/tracking). Buckets: Fix now (broken tracking, rejected top ads,
valid public criticism, runaway spend) → Quick wins (exclusions, pauses, bid/cap, one budget step)
→ Optimizations (new angles, restructure, LP/offer tests) → Strategic (CAPI/CRM loop, MAX test,
holdout, tier-map refresh, channel role).
9.1 Proposable changes → propose_reddit_ads_change
Each call creates one reddit-ads-change task on the Paid Ads board (todo,
requires_human=true, assigned to the Ad Change Applier). A human reviews and clears
Requires human; the deterministic applier then runs the sealed call once (cancel/archive =
reject; editing fields breaks the seal). Rules:
- One change per call (
tool_name+arguments, the tool’s own arg names), or one ordered create plan (steps, ≤5 ofcreate_campaign/create_ad_group/create_ad, later steps reference"{{steps.N.id}}"). Everything is created PAUSED; activation (set_statusACTIVE) is always a separate proposal. - Pass
account_id, a one-linesummary, a quantifiedexpected_impact, and arationale(evidence + cross-checks passed). Use ids from pulled data only. On an error, fix the named args or drop the change. Cap: weekly ≤10, highest priority first.
| Finding | Tool (allowlist) | Notes |
|---|---|---|
| Pause / enable / archive | set_status(item_type, item_ids, status) | spend-affecting; prefer PAUSED over DELETED (irreversible) |
| Budget, bid, bid strategy, optimization goal, schedule | update_ad_group | budget lives on the ad group; server warns on >50% increases |
| Exclude / replace communities, keywords, interests, geos, languages, gender, platforms/devices, audiences | update_ad_group | each list replaces that key (send full list incl. existing); other keys kept |
| Campaign spend cap, dates, name | update_campaign | status via set_status |
| Ad name / click URL (UTMs) | update_ad | post creative is immutable |
| New creative / refresh | create_ad | PAUSED |
| Dedicated ad group (+ ads) for a winner | plan: create_ad_group → create_ad | PAUSED |
| Wrong objective (R4) | plan: create_campaign → create_ad_group → create_ad | PAUSED; pause old campaign separately |
| Customer-list audience (emails) | create_custom_audience | customer lists only |
9.2 Manual changes → human tasks
Not proposable: Pixel/CAPI/dedup fixes, attribution settings, brand-safety tier and account
exclusions, Redditor Highlights opt-out, pixel/engagement retargeting and lookalike audiences,
comment replies/moderation, MAX campaigns, carousel/free-form/lead-form ads, LP/form work, CRM→CAPI loop, holdout tests.
For each: create_board_task(board_id="paid-ads", status="todo", labels="Reddit Ads", …) with
title = action, description = finding id + evidence pointer (no copied prose), priority from
score. Never label manual tasks reddit-ads-change (that routes to the applier). If the
task tool isn’t bound, list them in the report under “Manual actions”.
9.3 Experiments over guesses
Uncertain-direction changes (MAX vs standard, bid strategy, interest vs community, channel incrementality via geo/time holdout on branded, direct, self-reported, pipeline) → manual test task.
10. Phase 4: Follow-up (start of each cycle)
list_board_tasks(board_id="paid-ads") (also status="done"), keep reddit-ads-change tasks since
the last review, read fields with get_board_task, then:
- Applied (
applied_at): entity metrics pre vs post (equal windows, skip learning days) vsexpected_impact→ worked / neutral / harmful (C18). - Held/failed (
apply_error, orapply_started_atwithoutapplied_at= unknown outcome): report; a human verifies in Ads Manager before re-approving. Don’t re-propose. - Awaiting approval (
requires_human): don’t duplicate; flag if stale. Created-PAUSED entities never activated → proposeset_statusACTIVE or cleanup.
11. Thresholds & Decision Rules
[R] = Reddit guidance; [H] = internal rule of thumb (adjust to account history).
| Topic | Threshold | Action |
|---|---|---|
| Ad group budget | ≥ $50/day [R] | consolidate or fund |
| Communities per community ad group | ≥ 15 [R] | broaden if delivery-limited |
| CTR target | ~0.1–0.3% after setup [R]; < 0.1% with ≥10k impr [H] | creative/community mismatch |
| Headline refresh | every 3–4 weeks [R] | refresh queue |
| Fatigue | frequency rising & CTR −20–30% vs first 2 weeks [H] | refresh creative |
| Live ads per ad group | 3–5; < 2 or > 6 [H] | add / consolidate |
| Judge CTR / pause variant | ≥ 5–10k impr, bottom on CTR and CVR [H] | pause |
| Exclude community/keyword for no conversions | spend ≥ 1.5–2× target CPA, no assist evidence [H] | exclude |
| ACTIVE no spend | 3+ days [H] | delivery diagnosis |
| Under-delivery | spend < 50% of budget for a week [H] | R4/R5/R7, not budget |
| Pacing | projected > 110% or < 80% of plan [H] | adjust |
| Concentration | one entity > 60% of spend w/o results [H] | rebalance |
| Budget/bid step | ≤ 20–30% per 72 h, no change < 72 h or in learning [H] | step |
| Judge new ad group / strategy | 7–14 days at funded budget [H] | wait |
| Judge channel value (B2B) | ≥ 60–90 days with CRM + self-reported [H] | — |
| Reddit vs CRM leads gap | > 20–30% [H] | reconcile |
| Measurement thresholds are in R1. For cost (CPM/CPC/CPA) use the account’s own trailing history, | ||
| not third-party benchmark ranges. |
Pause vs optimize (ad group/community), first match wins: at/under target with OK lead quality → keep (scale if budget-limited) · not enough data → watch · R1 unhealthy → fix tracking, don’t pause on CPA · assist evidence → judge as assist · fatigued → refresh · off-map/wrong audience → exclude/narrow · LP/offer mismatch → fix LP/offer · otherwise → lower bid/cap or pause. Scale only if all hold: CPA ≤ target with OK lead → SQL; budget-limited (spend ≈ budget); frequency not high; not in learning; last change ≥ 72 h; one step, re-check in 3–7 days — or clone into adjacent T1/T2 communities, one variable at a time.
12. Symptom → Root Cause
| Symptom | Check | Likely causes |
|---|---|---|
| No / low spend | R2, R4, R5 | rejected ads, bid/cap below market, tiny audience, weak CTR |
| CPM spiking | R5 | competitive/narrow communities, seasonality |
| CTR low | R7, R5, R8 | non-native creative, off-map communities, fatigue, negative comments |
| CTR high, CVR low | R9, R7 | curiosity hook, LP mismatch, offer too deep, mobile friction |
| Conversions up, CRM flat | R1 | dedup broken, view-through inflation, spam leads |
| Conversions vanished | R1 | Pixel removed, CAPI auth expired, ID/event rename |
| CPA creeping up | R7, R6, R5 | fatigue, exhausted pools, expansion drift |
| Negative comments | R8, R5 | wrong audience, overclaiming, reputation |
| Good leads but few | R3, R4 | underfunded/fragmented ad groups, tight cap |
13. Report Format
One markdown asset Reddit Ads Review: <account_id> <period>, sections in order:
- Verdict + R1 confidence + channel role · 2. Scorecard (spend, impr, CPM, CTR, CPC, conversions click/view, CPA, cost/SQL vs prior and target) · 3. Last-cycle follow-up ·
- Critical issues · 5. Communities (winners / no-result spenders / off-map, top 10) ·
- Creative & comments (fatigue queue, objections) · 7. Ranked actions (id, entity, impact, confidence, proposable/manual, task id) · 8. Workstream notes (“checked and fine” too), Deferred/blocked (reason, revisit date), Open questions.
Appendix A: Data Pulls (Reddit Ads MCP)
LLM agents get only read tools (reddit_ads_get_* / list_* / search_*) plus
propose_reddit_ads_change.
| Need | Call |
|---|---|
| Accounts, ad profiles | reddit_ads_list_ad_accounts |
| Totals, period-over-period, top/bottom campaigns | reddit_ads_get_account_performance_summary(account_id, days≤90) |
| Entities | reddit_ads_list_campaigns / _list_ad_groups / _list_ads / _list_custom_audiences; get_campaign / get_ad_group / get_ad(include_creative=true) |
| Performance | reddit_ads_get_report(level=account|campaign|ad_group|ad, breakdowns=[…], start_date, end_date, metrics=[…]) |
| Breakdowns | date, hour, country, region, dma, metro, community, interest, keyword, placement, os_type, gender, language (≤3 incl. level; 4 only with country+region; one of community/interest/keyword per request; hour ≤ 7 days; no age) |
| Demographic pull (R5) | get_report(level=ad_group, breakdowns=[gender]), then [language], [country, region], [os_type] |
| Useful metrics | impressions, reach, frequency, clicks, spend, ctr, cpc, ecpm, key_conversion_clicks/_views/_ecpa, conversion_lead_clicks/_views, reddit_leads, video_* |
| Targeting discovery | reddit_ads_search_targeting(kind=communities|interests|geolocations|devices, query) |
| Events Manager, attribution, brand safety, comments | Ads Manager UI — manual |
Appendix B: Platform Facts & Changes That Affect Audits
| When | Change | Audit implication |
|---|---|---|
| Jun 2025 | Community Intelligence: Reddit Insights (listening) and Conversation Summary Add-ons (alpha; Reddit reported ~19% higher CTR vs standard image ads) | test where organic sentiment is positive |
| 2025–2026 | Redditor Highlights: AI summary + 3–5 positive organic posts on eligible feed ads, on by default, not editable | R2 accuracy check |
| Jan 2026 | MAX campaigns beta (AI bids, creative combos, budget); Reddit reported ~17% lower CPA in split tests | R4: test vs standard after a baseline |