What does a deep Meta Ads (Facebook/Instagram) audit of an online store by UPLIFY look like?
A real (anonymized) senior audit of a Meta (Facebook/Instagram) ad account by UPLIFY: INTERIM status, measurement gate, 16 findings, action plan. Prepared by the AI operator Nestor AI; a manager approves it.
A senior-level audit of an ad account on Meta.
A real audit of a real UPLIFY client — fully anonymized. The niche, brands, domain and all IDs are hidden; all the analysis, methodology, structure and actual metrics are preserved unchanged. Note the INTERIM status — it is honesty, not an unfinished job: we do not pass off modeled numbers as fact.
The audit in 90 seconds.
- Learning-reset cut ROAS in half: mature campaigns (5.90 / 4.71) were paused while the new ones are still “learning” (3.86 / 1.75).
- VALUE optimization at $5/day is unattainable: ~3-4 purchases/week against a learning threshold of ≈50 — the system will never stabilize.
- CAPI disabled + retargeting pools are empty (~20 people) → RM is actually harvesting the warm IG audience, the lowest ROAS at 2.16.
- Creative — one auto-generated catalog template across all 8 videos, the hook fails in the 1st second. Score 32/100.
- The 45-64 segment converts best (ROAS 4.93-5.83) yet receives only 13.6% of budget.
- Enable CAPI + event deduplication — priority #1.
- Freeze the cascade of manual edits for 7-10 days.
- Exclude the non-government-controlled areas of 2 regions.
- Measurement: Meta will start seeing real purchases, not modeled noise.
- Stability: no learning-reset every 2 weeks.
- Scale: underfunded 45-64 and FB Reels (ROAS 6.89).
- CAPI/server events are not working → reported ROAS is inflated by the modeled share.
- No backend data (CRM/margin/returns) → incrementality is unconfirmed.
- Catalog API is locked by permissions → the feed was verified manually only.
- 98% of spend covered: all 7 campaigns, 16 ad sets, all 13 placements, every age breakdown, retention curves for all 8 videos.
- Performance conclusions are honestly labeled directional until the gates are closed.
- Independent validation: PASS (coverage 90 · depth 80 · rigor 78 · client-safety 88).
Can you trust these numbers?
In Meta this is question #1: if site events are incomplete, the ad account shows a modeled estimate rather than reality. That is why the measurement verdict comes BEFORE the performance analysis, and until the gate is closed the report honestly carries the status INTERIM.
| Check | Status | Details |
|---|---|---|
| Pixel is alive | OBSERVED | Fires correctly, automatic matching ON (11 fields) |
| Key events are being sent | OBSERVED | PageView / ViewContent / AddToCart / InitiateCheckout / Purchase are present |
| CAPI / server events | NOT WORKING | Browser events only — no server-side → iOS underreporting, lower match quality, inflated modeled-ROAS |
| Deduplication / match quality | MANUAL | Not exposed by the API — verify in Events Manager |
| Backend reconciliation | BLOCKER | No data available — incrementality cannot be confirmed |
The state of the account at a glance.
Key takeaway (directional): the account looks profitable in the ad manager but suffers from systemic self-sabotage of structure and measurement — it is underdelivering on both volume and stability. A single catalog strategy: 3 active campaigns (Prospecting / Lookalike / Remarketing), all CBO at $5/day, optimized for VALUE.
Learning-reset
P1Instead of scaling the working campaigns, new ones were created and the mature ones were paused. Old: ROAS 5.90 / 4.71; the new ones are still “learning”: 3.86 / 1.75. The relaunch effectively cut ROAS in half.
VALUE at $5/day
P1Value optimization needs a large event volume; at ~3-4 purchases/week (threshold ≈50/wk) the system will never exit learning. Minimum to exit ≈ $45/day.
CAPI off + empty RM
P0Website retargeting is empty (~20 people) — RM is actually being shown to the warm IG audience (~30k) → the lowest ROAS at 2.16 and the lowest incrementality (capturing existing demand).
16 findings — each backed by evidence.
| Campaign | Opt goal | Spend | Purch. | ROAS | Status |
|---|---|---|---|---|---|
| Prospecting 01.05 | VALUE | $202.75 | 20 | 3.86 | ACTIVE |
| Remarketing 10.04 | CONV | $213.03 | 28 | 2.16 | ACTIVE |
| Lookalike 01.05 | VALUE | $132.52 | 8 | 1.75 | ACTIVE |
| Prospecting 16.03 | VALUE | $225.96 | 60 | 5.90 | ⏸ PAUSED |
| Lookalike 10.04 | CONV | $102.64 | 28 | 4.71 | ⏸ PAUSED |
🔴 The mature (better) versions sit paused while the weaker (new) ones are active — the main learning-reset. Below is the full table with a severity filter.
| # | Area | Finding | Sev. |
|---|---|---|---|
| F1 | Measurement | CAPI off — browser events only; conversions are modeled, reported ROAS is inflated. | P0 |
| F2 | Structure | Learning-reset: mature campaigns paused, new ones “learning” → ROAS halved. | P1 |
| F3 | Structure | VALUE optimization at ~5 purchases/wk is unattainable (threshold ≈50/wk). | P1 |
| F4 | Structure | Fragmentation: 4 ad sets targeting the same audience at $5/day → internal competition. | P2 |
| F5 | Targeting | RM is fictitious: website pools ~20 people; it actually runs against the warm IG audience (~30k). | P1 |
| F6 | Targeting | Prospecting does not exclude buyers — the customer base is ready for exclusion right now. | P2 |
| F7 | Geo / compliance | Delivery into the non-government-controlled areas of 2 regions (~1.2% of budget) — add exclusions. | P2 |
| F8 | Placements | IG Stories — 25.6% of budget at ROAS 2.71 (below blended); the video is not adapted for vertical. | P2 |
| F9 | Demographics | The 45-64 segment converts best (ROAS 4.93 / 5.83) yet receives 13.6% of budget. | P2 |
| F10 | Creative | One auto-template across all videos, hook failure in the 1st second, zero variety — score 32/100. | P1 |
| F11 | Funnel | Main drop-off ATC → InitiateCheckout (24.8%) — cart/checkout, not creative. | P2 |
| F12 | Billing | Account status “flickered” 10×, spend-limit reset 2× → delivery throttling. | P2 |
| F13 | Changes | Excessive manual intervention (relaunches, goal changes, duplicates) — the main cause of unstable CPA. | P2 |
| F14 | Incrementality | No holdout/lift test at all; ROAS is attributional, not incremental. | P2 |
| F15 | Hygiene | 6 “ACTIVE” 2024 traffic campaigns with stop_time in the past — junk → PAUSED. | P3 |
| F16 | Catalog | smart_pse disabled; product_set coverage of best-sellers — to be verified (Catalog API locked by permissions). | P3 |
Where the ads live — and where they bleed money.
| Placement | % spend | ROAS | Verdict |
|---|---|---|---|
| Facebook Feed | 43.8% | 4.15 | CARRIES THE ACCOUNT protect |
| Instagram Stories | 25.6% | 2.71 | INEFFICIENCY video not built for vertical |
| Instagram Feed | 20.7% | 3.78 | ok |
| Facebook Reels | 3.1% | 6.89 | UNDERSERVED impressions |
| Threads | 2.9% | 4.71 | UNDERSERVED impressions |
| Age (f) | % spend | ROAS | CPA |
|---|---|---|---|
| 25-34 | 44.1% | 3.30 | $7.55 |
| 35-44 | 31.5% | 3.49 | $6.33 |
| 45-54 | 8.3% | 4.93 | $4.25 |
| 55-64 | 5.3% | 5.83 | $4.89 |
Pattern: the older 45-64 segment converts best (lowest CPA) yet receives only 13.6% of budget — an undervalued scaling reserve.
Creative score: 32/100.
Testing framework: customer pain (UGC) · social-proof (review carousel) · offer/price (promo) · founder talking-head · demo texture — all with a strong 0-1s hook. Executable cards → the “Creatives” tab in OS.
Where the real drop-off is.
| Transition | Conversion | Assessment |
|---|---|---|
| Impression → link click | 2.72% | normal for catalog |
| Link click → landing page view | 82% | STRONG site speed is fine |
| Landing page → cart | 12.8% | acceptable |
| Cart → checkout initiation | 24.8% | MAIN DROP-OFF |
| Checkout → purchase | ~92% | STRONG |
CTR and landing page views are healthy → the problem is not the creative, it is the cart/offer/checkout (friction, price/shipping at this step, phone-order model). Check the cart UX + the correctness of the InitiateCheckout event.
Prompt cards beyond the auto-catalog.
Ready to paste into a generator. Draft concepts that need brand/legal review. The product is masked.
1 · UGC hook “customer pain”
9:16 · stories/reels · hook 0-1s2 · Social-proof carousel
1:1 · warm/rm · reviews + best-sellers3 · Founder talking-head
9:16 · cold · brand-trustDo-no-harm first, then Winner-Protection.
Do-no-harm
Enable CAPI + deduplication (priority #1); freeze the cascade of manual edits for 7-10 days; exclude the non-government-controlled areas; remove the 6 stale campaigns; exclude the customer base from prospecting.
Restructuring
Consolidate 4 ad sets → 1-2 (more events per ad set); VALUE → CONVERSIONS on small budgets; raise 1 winning campaign by +20-30%, not a wholesale replacement. ⛔ Budget scaling is blocked until margin/target-ROAS.
Creative
3-5 new concepts beyond the auto-catalog (UGC pain, founder, social-proof, demo) with a strong 0-1s hook; separate vertical versions for Stories/Reels.
Winner-protection
Do NOT touch FB Feed delivery or the 45-64 segment (ROAS 4.93-5.83). Do not switch paused versions on alongside the active ones (overlap) — pick one and let it mature without edits.
Success criteria, monitoring and rollback.
Every change is controlled: the control metric, observation window and rollback trigger are defined before implementation. A “before” snapshot of the state is stored; rollback is a single action.
| Change | Control metric | Window | Rollback trigger |
|---|---|---|---|
| CAPI + deduplication | Browser ↔ server event discrepancy; Purchase coverage | 7-14 days | Duplicate purchases >5% → verify event_id before scaling |
| Freeze on manual edits | Day-over-day CPA stabilization | 7-10 days | — (do-no-harm, no rollback needed) |
| VALUE → CONVERSIONS | Campaign ROAS vs baseline | 14 days | ROAS −10% two weeks in a row → revert to VALUE |
| Consolidation of 4 ad sets → 1-2 | Events/week per ad set; CPA | 14 days | CPA +20% after exiting learning → roll back the structure |
| +20-30% on the winning campaign | ROAS no lower than −15% vs baseline | 7 days per step | Drop below the threshold → restore the previous budget (“before” snapshot) |
Monitoring 24/7 — without being asked.
An audit is a snapshot. From then on the account lives under the daily supervision of our platform: the system itself checks every Meta account against 16 problem types and surfaces failures to the manager before they eat the budget.
Measurement
Pixel went silent · purchases not reaching Meta (server events) · low data transmission quality · gaps in funnel events · ad manager numbers diverging from our database.
Structure and audiences
Remarketing vanished while the pixel is alive · “one ad set for everything” · segments overlap and compete with each other.
Catalog and delivery
Rejected products in the catalog · dynamic product ads not configured · Advantage+ placements disabled · creatives burned out with no refresh.
Coverage + validation.
| What | Coverage |
|---|---|
| Campaigns | all 7 with spend (top-5 = 98% of spend) |
| Ad sets | 16 (top-10 = 95%) |
| Placements | all 13 |
| Demographics | every age breakdown · all 23 regions with spend |
| Creatives | all 8 videos with retention curves |
| Finding classification | measurement (3) · structural (5) · creative (2) · scaling/targeting (6) |
Independent validation (a second AI model): PASS with remarks — coverage 90 · depth 80 · rigor 78 · client-safety 88. Performance conclusions remain directional until the gates are closed (CAPI + backend) — and this is flagged in every relevant conclusion, not buried in fine print.
How this audit was made.
The report was prepared by Nestor AI — our AI operator inside UPLIFY OS: senior-level analysis under our own Meta methodology, with independent validation. Note the status INTERIM: as a matter of principle we do not pass off modeled data as fact until the measurement gates are closed — this is the honesty that trust is built on. Every proposed change is approved by a manager — nothing is applied automatically, every change is reversible and logged.