Meta Ads Daily Pulse

Security

[Didoo AI] Rapid daily health scan for Meta Ads — detects week-over-week performance changes and flags urgent issues before meetings. Use every morning or before any daily review meeting. This is a change detector, not a full diagnostic.

Install

openclaw skills install meta-ads-daily-pulse

Meta Ads Daily Pulse

Required Credentials

CredentialWhere to GetUsed ForOAuth Scope
META_ACCESS_TOKENMeta Developer Console → Graph API Explorer → Generate TokenFetching account and campaign insightsads_read (read-only)
META_AD_ACCOUNT_IDAds Manager URL: adsmanager.facebook.com/act_XXXXXXXXXIdentifying which account to query

When to Use

Use every morning or before any daily review meeting. This skill is a change detector — it answers: "Did anything important change overnight compared to the same day last week?"

Not sure which monitoring skill to use?

meta-ads-daily-pulsemeta-ads-healthcheck
Primary question"Did anything change vs. last week?""Is this campaign healthy or not?"
Comparison basisSame day of prior week (WoW)Fixed Green/Yellow/Red thresholds
Best forDaily routine, morning check, meeting prepSomething feels off — quick on-demand check
Output styleChange alerts ranked by revenue impactCampaign-by-campaign status report

Requirements

  • account_id (required)
  • date_range: yesterday (default) — fetches yesterday's data; compare to same day of prior week (WoW)
  • campaign_ids (optional) — defaults to all active campaigns

Step 1: Pull Account Baseline

Fetch account-level metrics for yesterday and the same day of the prior week:

  • Spend, impressions, results, ROAS
  • CTR, CPC, CPM, frequency
  • Conversions, cost per conversion

Use exec + curl to call the Meta Graph API:

Account-level (yesterday):

# Cross-platform date helper (Python, works on macOS and Linux):
YESTERDAY=$(python3 -c "from datetime import date, timedelta; print((date.today() - timedelta(days=1)).isoformat())")
SAME_DAY_LAST_WEEK=$(python3 -c "from datetime import date, timedelta; print((date.today() - timedelta(days=8)).isoformat())")

curl -G "https://graph.facebook.com/v21.0/act_${META_AD_ACCOUNT_ID}/insights" \
  -d "fields=spend,impressions,results,roas,ctr,cpc,cpm,frequency,conversion_rate" \
  -d "time_range={'since':'${YESTERDAY}','until':'${YESTERDAY}'}" \
  -d "access_token=${META_ACCESS_TOKEN}"

Same day of prior week (7 days back):

# Same YESTERDAY and SAME_DAY_LAST_WEEK variables as above

curl -G "https://graph.facebook.com/v21.0/act_${META_AD_ACCOUNT_ID}/insights" \
  -d "fields=spend,impressions,results,roas,ctr,cpc,cpm,frequency,conversion_rate" \
  -d "time_range={'since':'${SAME_DAY_LAST_WEEK}','until':'${SAME_DAY_LAST_WEEK}'}" \
  -d "access_token=${META_ACCESS_TOKEN}"

Campaign-level (yesterday, if you need per-campaign breakdown):

# Same YESTERDAY variable as above

curl -G "https://graph.facebook.com/v21.0/act_${META_AD_ACCOUNT_ID}/insights" \
  -d "fields=campaign_name,spend,impressions,results,roas,ctr,cpc,cpm,frequency" \
  -d "level=campaign" \
  -d "time_range={'since':'${YESTERDAY}','until':'${YESTERDAY}'}" \
  -d "access_token=${META_ACCESS_TOKEN}"

Important — Same Day of Prior Week comparison: Meta Ads performance follows day-of-week patterns (e.g., Tuesdays often differ from Saturdays). Always compare each day to its same day of prior week — not the prior day. Comparing to the prior day creates false alarms.

For each day in the date range, pull the equivalent day from 7 days prior:

  • Monday this week → Monday last week
  • Tuesday this week → Tuesday last week
  • etc.

Step 2: Run Detection Checks

Run all four detection checks:

#IssueDetection Logic
1Spend without conversionsspend > 0 AND conversions = 0
2Week-over-week dropCTR, ROAS, or CVR down > 20% vs same day of prior week
3Budget cap + strong ROASspend > 80% daily budget AND ROAS > 2x account average
4Creative fatiguefrequency > 3 AND CTR declining vs same day of prior week

For each flag, calculate estimated revenue impact:

  • Lost conversions = (prior period CVR − current CVR) × current impressions
  • Revenue impact = lost conversions × average order value

Step 3: Prioritize by Revenue Impact

Sort alerts by estimated revenue impact. Do not exceed 3 items per section.


Step 4: Format Output

🚨 Critical
- [Campaign/Ad ID]: [Issue] | [Metric] | [Immediate action]

⚠️ Watch
- [Trending decline not yet critical]

✅ Healthy
- [Brief confirmation]

💡 Opportunity
- [Quick win if found]

Skill Boundary

  • This is a detection tool only — do not output recommendations
  • After flagging issues, route to meta-ads-recommendation for action plans
  • If you need a full campaign-by-campaign status check (not change-focused), use meta-ads-healthcheck instead

Rules

  • Always compare to the same day of prior week (not prior day — day-of-week patterns matter in Meta Ads)
  • Include specific campaign/ad IDs and numbers in every line
  • One immediate action per issue
  • Do not re-fetch data if it was recently pulled in the same session