How to check your Facebook ad account health, weekly
Pull the last 7 days and the 7 days before it, then score a fixed battery of checks on the change between them. Result cost worse by 15 percent flags, 30 percent is critical. CPM up 25 percent flags, 60 percent is critical. One score, and every threshold visible and editable.
Most guides hand you a list of things to look at without saying what a bad reading looks like. This one has the numbers written down, so the same account gets the same verdict whoever is looking and whenever they look.
Why do account health checklists not work?
Search for this and you mostly get checklists. Look at spend, look at frequency, look at your relevance diagnostics. All reasonable advice, but none of it tells you what a bad number actually looks like, which is the part you need.
You open the account, CPM is 14 dollars, and nothing on the screen tells you whether 14 is normal for this account. So the call becomes a judgement you make on the day. Two people can look at the same week and reach opposite conclusions, and the same person can reach different conclusions on a Monday and a Thursday.
Industry benchmarks do not solve it either, because they describe other people's accounts. Your seasonality, your offer and your audience are all different, so a fixed CPA target will mark a perfectly decent week as a bad one. The comparison that works is the same account, the week before.
What thresholds does the score actually use?
All of them live in one config node, where you can read them and change them:
| Check | Flag | Critical |
|---|---|---|
| Primary result cost worse, week over week | 15% | 30% |
| Spend up while result cost worsens | 10% | 20% |
| CPM up | 25% | 60% |
| Impressions down | 25% | flag only |
The second row needs a word of explanation. Rising spend on its own is not a problem, it is usually just growth, so the check only fires when spend rises while your result cost is getting worse. That combination means you are putting more money behind something that is working less well, which is an expensive thing to leave running for a week.
If you think a 25 percent CPM rise is nothing to worry about on your account, change the number and the score changes with it. Free graders score you against thresholds you cannot see or adjust.
How does the weekly comparison work?
The date maths matters more than it looks. Meta's last_7d preset ends yesterday, not today, so the prior window has to be the 7 days immediately before that. Get this wrong and your two windows overlap by a day, which quietly flattens every change you are trying to detect:
const thisEnd = yesterday;
const thisStart = new Date(yesterday.getTime() - 6 * day);
const priorEnd = new Date(thisStart.getTime() - day);
const priorStart = new Date(priorEnd.getTime() - 6 * day);With the windows fixed, it pulls account totals for both, plus ad set and ad level insights for the current week so the report can name what is dragging the score down rather than just reporting a number.
There is a bigger problem than date maths, and most week-over-week reporting gets it wrong. Meta attributes a conversion to the date of the click, not the date the conversion happened. On the default 7-day click window, a purchase today can be written back to a click six days ago. Your most recent days therefore keep filling in for about a week after the fact.
The consequence is that a naive comparison is biased against the current week every single time. You are measuring a window that is still filling against one that has already settled, so the recent week looks worse than it will turn out to be, and the score flags problems that resolve themselves by Thursday.
Two ways to deal with it. Lag both windows by 7 days so you compare two settled periods, which costs you a week of freshness and is the honest option for accounts with long consideration cycles. Or keep the windows where they are and read the trend rather than the absolute, accepting that the current week is a floor and not a reading. What you cannot do is compare a fresh week to a settled one and treat the difference as real, which is what most weekly reports do.
One node runs the check battery and scores it. A Claude step then ranks the flagged checks into the top three fixes, with a hard instruction to use only figures that appear verbatim in the input, so it cannot invent a number. Delete that node and the score still works.
Want this landing every Monday?
We build these end to end. Bring your ad account and we will scope it in 30 minutes, free. You can also hire an n8n expert for the whole stack, or see what an n8n expert costs first.
How do I build it step by step?
1. Config node. Every threshold in one place, plus the list of conversion events that count as a result for your account. That list matters. A lead gen account and an ecommerce account do not share a definition of success:
KPI_FLAG_PCT: 15, // primary KPI worse by this much = flag
KPI_CRIT_PCT: 30, // ...= critical
SPEND_UP_PCT: 10, // spend up this much while KPI worsens = flag
CPM_FLAG_PCT: 25,
VOLUME_DROP_PCT: 25, // impressions down2. Build the two windows. Pure date maths, no API calls, producing a this-window and prior-window range.
3. Fetch. Account totals for each window, then ad set and ad insights plus the ad set entities, because insights give you performance but not names or budgets.
4. Run checks and score. One node, pure transforms. Each check returns pass, flag or critical, and the score falls out of the results.
5. Triage and print. The AI step ranks fixes, the final node assembles the scorecard. Swap it for Slack or a sheet without touching anything upstream.
What made it tricky?
No data is not a zero score. An account that spent nothing last week is not unhealthy, it is idle. The first version scored it catastrophically. It now short circuits and says no score produced, because a zero would have sent someone investigating a problem that did not exist.
Results mean different things per account. There is no single purchase event in the Meta API. The config carries a list of action types, and the account matches whichever it actually fires. Hardcode one and half of all accounts report zero results forever.
The AI will happily invent numbers. Early runs produced confident percentages that appeared nowhere in the data. The system prompt now forbids deriving any figure not present verbatim in the input, which fixed it.
How do I adapt it to my own account?
Tune the thresholds first. A high-volume account is more stable, so 15 percent is a real signal. A small account swings 15 percent on noise. Raise it until the flags mean something.
Set your result actions. The single most important edit. Get this wrong and every other number is meaningless.
Compare month over month. Widen both windows for low-volume accounts where a week is too noisy to read.
Log the score.Append each run to a sheet and the score becomes a trend line, which is far more useful than any single week's number.
Put it on a schedule. Swap the manual trigger for a Monday Schedule Trigger. That is the change that turns a check into monitoring.
Facebook ad account health questions, straight answers.
How do I check my Facebook ad account health?
Compare this week to the week before on a fixed set of checks, rather than glancing at the dashboard. Pull the last 7 days and the 7 days before it, measure the change in your primary result cost, spend, CPM and impressions, then score each check against a threshold you wrote down in advance.
What thresholds count as a healthy Meta ad account?
The ones this workflow ships with: primary KPI worsening 15 percent flags, 30 percent is critical. Spend rising 10 percent while the KPI worsens flags, 20 percent is critical. CPM up 25 percent flags, 60 percent is critical. Impressions down 25 percent flags. Change any of them, they are yours.
Why compare week over week instead of using a fixed benchmark?
Because industry benchmarks describe other people's accounts. Your account has its own seasonality, offer and audience, so a fixed CPA target labels a good week bad and a bad week fine. Comparing an account to its own prior week catches the change, which is what you can actually act on.
Does attribution lag break a week over week comparison?
It biases it. Meta attributes conversions to the click date, not the conversion date, so on a 7-day click window your most recent days keep filling in for about a week. A fresh week compared against a settled one always looks worse than it really is. Lag both windows, or read trend rather than absolutes.
What is a single health score actually good for?
Triage, not diagnosis. One number tells you whether this week needs attention, so you open the account on the right days instead of every day. The value is the checks underneath it. A score with no visible checks is a black box you cannot argue with or fix.
Why does spend going up count against the account?
It only counts against you when it rises while your result cost worsens. That combination means you are scaling into weakness, which is the most expensive mistake in the account. Spend rising while efficiency holds is not flagged at all, because that is just growth.
How is this different from a free Facebook ads grader?
Graders score you against thresholds you cannot see, change, or audit, and most exist to sell you something. Here every threshold sits in one config node in plain sight. If you disagree that a 25 percent CPM rise matters, edit the number and the score changes accordingly.
How often should I run the health check?
Weekly, on a Monday. The workflow compares two 7 day windows and Meta excludes today from its last 7 days preset, so a Monday run reads a clean week against the one before. Running it daily produces overlapping windows and a lot of noise for no extra signal.
Want a score in your inbox every Monday?
30 minutes, free. Bring your ad account. You leave with a plan for a weekly health score and the top three fixes, whether you build it or we do.
Keep reading.
Know which ad to scale, and by how much
Spend and result floors, a margin over the account average, frequency headroom and budget cap checks, then a sized raise.
Find out where your mail actually lands
Checks SPF, DKIM, DMARC and MX, then reads real placement from your own Gmail and Outlook so you see inbox, Promotions or spam.
Find the below-average ads costing you most
One flow reads all three Meta ad relevance diagnostics, flags every below-average ad, and ranks them by the spend behind them.
Rather have it built for you?
Skip the build. A free 30-minute call and we set this up in your stack, live in a week or two.