paid ads · playbook

Reddit Ads campaign review

A periodic audit framework for Reddit Ads campaigns.

Updated
Read time
22 min read

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

AspectGoogle Ads (search)Reddit Ads
IntentExplicit queryCommunity/contextual interest, mostly passive browsing
Main leversKeywords, queriesCommunities, keywords, interests, creative
Conversion roleLast-click captureEarly-stage / assist; last-click undercounts it
WasteIrrelevant queriesWrong communities, fatigued creative, curiosity clicks, hostile comments
Unique signalSearch terms reportPublic comments on the ad

So weigh community fit, creative freshness, sentiment and assist value; distrust platform CPA.

2. Principles

  1. Measurement first: R1 gates every CPA finding. Every finding cites data (metrics + window).
  2. 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).
  3. Community is the unit of analysis; always break down by community (and keyword/placement).
  4. Creative decays fast; comments are data and risk. Valid public criticism is a reason to pause.
  5. Respect learning, don’t starve it (§11). Humans approve every change; agents only propose.

3. Cadence & Windows

WorkstreamWeeklyMonthlyQuarterly
R1 Measurementevents arriving (Pixel/CAPI)dedup, match quality, rejections, CRM reconciliationattribution settings, CRM loop
R2 Governancerejected ads, stale “active” objectsbrand safety, exclusions, Highlights accuracyaccess, naming, policy
R3 Budgetpacing, ACTIVE-no-spendbudget vs spendallocation by funnel role
R4 Biddinglearning resetsstrategy vs volumeMAX test, optimization event
R5 Targetingworst communities by spendfull community/keyword/placement breakdowntier map refresh, expansion on/off
R7 Creativefrequency vs CTRvariant ranking, refresh queueangle/format strategy
R8 Commentsevery comment-enabled adobjection themescomments-on policy
R9 Landing pagesbroken URLs, UTMsengagement by LPoffer/LP tests
R6 / R10 / R11—R6 pools, R10 lead → SQLR6 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

ItemSource
account_id (a2_…), currency, timezone, ad profilestask 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 SQLgoals / human
Community tier map: T1 = ICP (r/elasticsearch, r/dataengineering, r/devops…), T2 adjacent, T3 broad tech; brand/competitor termsguides / 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 resultshuman / §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 conversionId and CAPI metadata.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”:
RoleObjective (API)FormatsPrerequisitesRed flags
Awareness (new T1/T2 reach, launches)Awareness & Consideration (IMPRESSIONS)free-form, image, video, carouselnone; CPM / CPVjudged on CPA; frequency high, reach flat
Video consumptionVideo Views (VIDEO_VIEWABLE_IMPRESSIONS)video onlyvideo assets; CPVjudged on clicks/leads
Content / tool / benchmark readsTraffic (CLICKS)free-form, image, video, carouselUTMs, GA4; CPCcuriosity clicks, low LP engagement (C8)
Demo / contact / signupSales / Conversions (CONVERSIONS)image, video, carouselhealthy Pixel + CAPI (R1); event volumeR1 low; event too deep for volume; event can’t change after ad group save
Gated asset / leadLead Generation (LEAD_GENERATION)image, videoPixel/CAPI (Reddit is retiring onsite lead forms)leads not reaching CRM (R10)
n/a for BDBApp Promotion (APP_INSTALLS), CATALOG_SALES—app / product catalogany 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, devices via update_ad_group (proposable; list keys replace). Postal-code geo needs ids from search_targeting(kind=geolocations).

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_ad only 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 verdictEffect
highfindings stand
mediumdowngrade 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
C1R3 under-deliveryR4 manual bid / cost cap below marketbid/cap change, not budget
C2R3 under-deliveryR5 small audience / few communitiesbroaden with T1/T2 communities
C3R3 ACTIVE no spendR2 ads rejectedfix the ad; no bid/budget change
C4R5 community spends w/o conversionsR10 assist/self-reported evidencedon’t exclude; judge as assist
C5R5 community excellentR3 its ad group budget-limitedscale step or dedicated ad group
C6R7 CTR fallingR7 frequency risingfatigue → refresh creative, not targeting
C7R7 CTR low everywhereR5 high off-map sharefix targeting first
C8high CTR, low CVRR9 low engagement / mismatchLP/offer fix; if LP fine, qualify the hook
C9R8 negative comments on ad XR5 X runs on T3 / interestsnarrow targeting before rewriting
C10R8 valid factual criticismany scale proposal for that adblock; pause or fix claim first
C11R4 cost cap / MAX switchR1 ≤ medium, or no steady conversions / baselinedefer; fix measurement/volume
C12R6 retargeting ≤ prospectingpools stale / exclusions missingfix pools first
C13any spend changead group in learning or changed < 72 h agodefer
C14R10 cost/SQL worse than other channelsstrong assist evidenceno cut on last-click; propose holdout
C15R5 exclude communityit is an organic focus (R11)exclude only if paid hurts there; note it
C16several findings on one ad group—≤1 spend-affecting change per cycle (exclusions/new paused ads don’t count)
C17budget increasestotalfit the envelope or be funded by cuts
C18Phase 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 open reddit-ads-change task (a duplicate proposal returns status: 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 of create_campaign / create_ad_group / create_ad, later steps reference "{{steps.N.id}}"). Everything is created PAUSED; activation (set_status ACTIVE) is always a separate proposal.
  • Pass account_id, a one-line summary, a quantified expected_impact, and a rationale (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.
FindingTool (allowlist)Notes
Pause / enable / archiveset_status(item_type, item_ids, status)spend-affecting; prefer PAUSED over DELETED (irreversible)
Budget, bid, bid strategy, optimization goal, scheduleupdate_ad_groupbudget lives on the ad group; server warns on >50% increases
Exclude / replace communities, keywords, interests, geos, languages, gender, platforms/devices, audiencesupdate_ad_groupeach list replaces that key (send full list incl. existing); other keys kept
Campaign spend cap, dates, nameupdate_campaignstatus via set_status
Ad name / click URL (UTMs)update_adpost creative is immutable
New creative / refreshcreate_adPAUSED
Dedicated ad group (+ ads) for a winnerplan: create_ad_group → create_adPAUSED
Wrong objective (R4)plan: create_campaign → create_ad_group → create_adPAUSED; pause old campaign separately
Customer-list audience (emails)create_custom_audiencecustomer 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) vs expected_impact → worked / neutral / harmful (C18).
  • Held/failed (apply_error, or apply_started_at without applied_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 → propose set_status ACTIVE or cleanup.

11. Thresholds & Decision Rules

[R] = Reddit guidance; [H] = internal rule of thumb (adjust to account history).

TopicThresholdAction
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 refreshevery 3–4 weeks [R]refresh queue
Fatiguefrequency rising & CTR −20–30% vs first 2 weeks [H]refresh creative
Live ads per ad group3–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 conversionsspend ≥ 1.5–2× target CPA, no assist evidence [H]exclude
ACTIVE no spend3+ days [H]delivery diagnosis
Under-deliveryspend < 50% of budget for a week [H]R4/R5/R7, not budget
Pacingprojected > 110% or < 80% of plan [H]adjust
Concentrationone 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 / strategy7–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

SymptomCheckLikely causes
No / low spendR2, R4, R5rejected ads, bid/cap below market, tiny audience, weak CTR
CPM spikingR5competitive/narrow communities, seasonality
CTR lowR7, R5, R8non-native creative, off-map communities, fatigue, negative comments
CTR high, CVR lowR9, R7curiosity hook, LP mismatch, offer too deep, mobile friction
Conversions up, CRM flatR1dedup broken, view-through inflation, spam leads
Conversions vanishedR1Pixel removed, CAPI auth expired, ID/event rename
CPA creeping upR7, R6, R5fatigue, exhausted pools, expansion drift
Negative commentsR8, R5wrong audience, overclaiming, reputation
Good leads but fewR3, R4underfunded/fragmented ad groups, tight cap

13. Report Format

One markdown asset Reddit Ads Review: <account_id> <period>, sections in order:

  1. 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 ·
  2. Critical issues · 5. Communities (winners / no-result spenders / off-map, top 10) ·
  3. 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.

NeedCall
Accounts, ad profilesreddit_ads_list_ad_accounts
Totals, period-over-period, top/bottom campaignsreddit_ads_get_account_performance_summary(account_id, days≤90)
Entitiesreddit_ads_list_campaigns / _list_ad_groups / _list_ads / _list_custom_audiences; get_campaign / get_ad_group / get_ad(include_creative=true)
Performancereddit_ads_get_report(level=account|campaign|ad_group|ad, breakdowns=[…], start_date, end_date, metrics=[…])
Breakdownsdate, 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 metricsimpressions, reach, frequency, clicks, spend, ctr, cpc, ecpm, key_conversion_clicks/_views/_ecpa, conversion_lead_clicks/_views, reddit_leads, video_*
Targeting discoveryreddit_ads_search_targeting(kind=communities|interests|geolocations|devices, query)
Events Manager, attribution, brand safety, commentsAds Manager UI — manual

Appendix B: Platform Facts & Changes That Affect Audits

WhenChangeAudit implication
Jun 2025Community 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–2026Redditor Highlights: AI summary + 3–5 positive organic posts on eligible feed ads, on by default, not editableR2 accuracy check
Jan 2026MAX campaigns beta (AI bids, creative combos, budget); Reddit reported ~17% lower CPA in split testsR4: test vs standard after a baseline