Meta ads: structure, spend, and who has been touching it
Internal working notes, pulled 1 Sep 2026. Not the client deliverable. Second person and byline treatment happens at the report-writing stage. Every call in this file is a GET against the Graph API (v21.0) or a read-only Meta Ads MCP tool. Nothing was created, updated, paused, or deleted.
What would falsify these findings
These delivery findings die if the account changed after 12 Aug 2026, the date the established facts cite as the most recent ad activity. Re-pulled directly, 1 Sep 2026, before writing anything below:
- Campaigns: latest
updated_timeacross all 7 is2026-06-09T08:23:43-0700. - Ad sets: latest
updated_timeacross all 15 is2026-07-23T22:52:04-0700. - Ads: latest
updated_timeacross all 63 is2026-08-12T21:21:27-0700.
No object anywhere in the account carries an updated_time after 12 Aug 2026. The account has not changed since that date. This finding does not die.
A second falsifiability condition: the lifetime spend and purchase figures below die if a second independent pull disagrees with the first. Every headline number in this file was pulled at least twice, by structurally different queries (account-level single row, campaign-level summed, ad-set-level summed, ad-level summed), not by re-running the same query twice. Where those methods disagreed, both numbers are shown and the disagreement is the finding, not resolved by picking one (see META-01).
Full hierarchy
7 campaigns, 15 ad sets, 63 ads. Structure and objective/optimization-goal pairing, data/_snapshots/2026-09-01/meta-campaigns.json, meta-adsets.json, meta-ads.json, all pulled 1 Sep 2026.
| Campaign | Status | Objective | Created | Last updated | |||
|---|---|---|---|---|---|---|---|
| [USA] [String Protech] [Venda] | ACTIVE | OUTCOME_SALES | 2026-05-21 | 2026-05-21 | |||
| [USA] [String Protech] [Remarketing] | ACTIVE | OUTCOME_SALES | 2026-03-09 | 2026-05-21 | |||
| [USA] [String Protech] [Engajamento] | ACTIVE | OUTCOME_ENGAGEMENT | 2026-03-06 | 2026-03-24 | |||
| [USA] [String Protech] [Visualização de vídeo] | ACTIVE | OUTCOME_ENGAGEMENT | 2026-03-09 | 2026-03-16 | |||
| [USA] [String Protech] [Visitas ao Perf] | ACTIVE | OUTCOME_TRAFFIC | 2026-03-09 | 2026-06-09 | |||
| USA \ | String Protech \ | Sales \ | JET | PAUSED | OUTCOME_SALES | 2025-12-08 | 2026-01-05 |
| USA \ | String Protech \ | Sales \ | JET copy | PAUSED | OUTCOME_ENGAGEMENT | 2025-12-08 | 2025-12-09 |
15 ad sets sit under those 7 campaigns. optimization_goal values present: OFFSITE_CONVERSIONS (7 ad sets, all with promoted_object.custom_event_type = PURCHASE, confirmed by direct field pull), POST_ENGAGEMENT (3), MESSAGING_PURCHASE_CONVERSION (3, all under the paused JET campaign), PROFILE_VISIT (1), THRUPLAY (1). Two of the OFFSITE_CONVERSIONS ad sets (PACK_005, PACK_006) sit inside the paused JET campaign and carry effective_status: CAMPAIGN_PAUSED, not their literal status: ACTIVE field value: the campaign-level pause does silence them, the ad-set status field alone does not show that.
Lifetime and last-90-day spend by campaign, cross-checked at three levels (account single row, campaign-level rows summed, ad-set-level rows summed): all three agree at $4,821.05 lifetime. A fourth, ad-level sum agrees to within 8 cents ($4,821.13 across 62 line items), which reads as ordinary per-row rounding drift across many small entries, not a real disagreement.
| Campaign | Lifetime spend | Last 90d spend | |||
|---|---|---|---|---|---|
| [USA] [String Protech] [Venda] | $928.08 | $856.25 | |||
| USA \ | String Protech \ | Sales \ | JET | $1,332.73 | $0 (pre-window) |
| [USA] [String Protech] [Visitas ao Perf] | $823.97 | $214.03 | |||
| [USA] [String Protech] [Engajamento] | $752.81 | $446.12 | |||
| [USA] [String Protech] [Remarketing] | $631.27 | $562.79 | |||
| [USA] [String Protech] [Visualização de vídeo] | $323.88 | $169.41 | |||
| USA \ | String Protech \ | Sales \ | JET copy | $28.31 | $0 (pre-window) |
Full ad-set and ad-level insight rows (spend, impressions, clicks, reach, frequency, actions, action_values), lifetime and last-90-day, are in meta-insights-adset-lifetime.json, meta-insights-adset-90d.json, meta-insights-ad-lifetime.json, meta-insights-ad-90d.json.
Spend on objectives that cannot produce a purchase, recomputed
The brief named a figure of roughly $829 from an earlier conversation and required it not be reused. It is not reused below; it is explained.
Definition used, checked against the platform, not assumed: an ad set "cannot produce a purchase" when its optimization_goal carries no purchase- capable promoted_object. Checked directly per ad set:
OFFSITE_CONVERSIONSad sets (7) all carry `promoted_object.custom_event_
type: PURCHASE`. Purchase-capable by design.
MESSAGING_PURCHASE_CONVERSIONad sets (3, JET, paused) name the purchase
outcome directly in the goal itself. Purchase-capable by design, via Messenger rather than the website.
POST_ENGAGEMENTad sets (2 active) and theTHRUPLAYad set (1) carry no
promoted_object at all. PROFILE_VISIT (1) carries only a page_id, no pixel event. None of these four ad sets has a purchase event anywhere in their configuration; Meta's campaign objectives that host these goals (OUTCOME_ENGAGEMENT, OUTCOME_TRAFFIC) do not offer Purchase as a selectable optimization event. This is a platform-structural fact, not an inference from behaviour.
Lifetime spend on the four structurally non-purchase ad sets: $1,900.66, cross-checked a second way by summing the 31 individual ads that sit inside them: $1,900.69. The 3-cent gap is rounding noise across granularity levels, consistent with the 8-cent gap seen at the ad-level total above.
| Ad set | Optimization goal | Lifetime spend | Purchases attributed anyway |
|---|---|---|---|
| [Visitas ao Perfil] [25-64] | PROFILE_VISIT | $823.97 | 0 |
| [Engajamento com a publicação] [25-64] | POST_ENGAGEMENT | $505.71 | 1 |
| [Visualizçação de vídeo] [25-64] | THRUPLAY | $323.88 | 0 |
| [Engajamento com a publicação] [25-64] [facebook] | POST_ENGAGEMENT | $247.10 | 0 |
One caveat, stated rather than hidden: one of the four ad sets shows 1 purchase in Meta's own attribution despite not optimizing toward it. Meta's attribution model credits a purchase to whichever ad a person last touched inside the attribution window, independent of what that ad set was bidding toward. "Cannot produce a purchase" describes the optimization target, not a guarantee that Meta's attribution will never post one there. Both facts are recorded rather than one erasing the other.
Where the ~$829 figure in conversation likely came from: the same four ad sets, same definition, over the last 90 days only, total $829.56 (meta-insights-adset-90d.json, cross-checked against data/_snapshots/2026-09-01/meta.txt's independent 90-day pull from a different task, which reports $247.10 + $214.03 + $169.41 for three of the four ad sets, consistent to the cent). The lifetime figure is not a rounding of that 90-day figure; it is more than double it, because these ad sets predate the 90-day window by roughly two months (the [Engajamento] and [Visualização de vídeo] campaigns were created 6-9 March 2026).
Two related buckets, computed the same way, kept separate rather than folded into the total above because they are purchase-capable by design even though neither is currently producing purchases:
MESSAGING_PURCHASE_CONVERSION(JET, paused): **$28.31 lifetime, 0
purchases**, despite being purchase-optimized by name.
OFFSITE_CONVERSIONSad sets sitting inside the paused JET campaign
(PACK_005, PACK_006): $1,332.73 lifetime, 4 purchases, all of it accrued before the campaign's 5 Jan 2026 pause.
Learning-phase status, frequency, overlap, and saturation
Learning-phase status is not retrievable as a documented field. Direct test: GET /{adset_id}?fields=learning_stage_info returns (#100) Tried accessing nonexisting field (learning_stage_info). Meta exposes learning status only in the Ads Manager UI, not through this API. The best available proxy, already used in the account's own prior pull (data/_snapshots/2026-09-01/meta.txt): Meta's own published threshold of roughly 50 conversions per ad set per week to exit learning. No ad set in this account gets remotely close. Across the last 90 days, the single highest-purchase ad set ([Remarketing] [público frio] [25-64]) recorded 2 purchases total, not per week. Every ad set in the account, by this proxy, sits permanently in or near the learning phase, which is consistent with spend levels this low against a $59.99 product.
Frequency, checked at ad-set level, lifetime: one ad set stands out. [Remarketing] [Visitantes do site 7-14D] [25-64] shows frequency 17.79 lifetime (17,881 impressions against a reach of 1,005 people) and 17.03 in the last 90 days alone. Every other ad set in the account sits between 1.0 and 2.5.
Audience overlap, checked structurally, not via a special overlap tool: four ad sets under the [Remarketing] campaign run concurrently, targeting nested time windows of the same site-visitor pool: last 30 days, last 14 days, last 7 days, and 7-14 days (meta-adsets.json, targeting.custom_audiences). A 30-day-visitor audience necessarily contains the 14-day and 7-day audiences as subsets by definition of a rolling window; the 7-14D audience is the tail overlap between the 30D and 14D pools. All four ran at the same time against the same product with the same purchase-optimized goal. The 17.79 frequency on the narrowest of the four (7-14D) is the visible symptom of that structural overlap: a small, repeatedly-targeted pool being hit by more than one ad set's delivery at once.
This is independently corroborated, not just inferred here: Meta's own Opportunity Score tool (below) separately flags a fragmentation issue on a different pair of ad sets in the [Engajamento] campaign, "similar objectives and creative, different audiences," with an estimated 25% lower cost per engagement available by combining them. Two unrelated audience- design habits (nested remarketing windows, and split-by-interest ad sets with identical creative) both point the same direction: ad sets were multiplied rather than consolidated.
Creative inventory and fatigue
63 ads total, 61 distinct creative IDs (near 1:1: essentially no creative reuse across ads). Status breakdown, effective_status, which accounts for parent-level pauses that the literal status field does not show:
| effective_status | Count |
|---|---|
| ACTIVE | 30 |
| PAUSED | 23 |
| CAMPAIGN_PAUSED | 4 |
| ADSET_PAUSED | 4 |
| DISAPPROVED | 1 |
| WITH_ISSUES | 1 |
Two ads sit in a state that blocks delivery regardless of budget or targeting: [Venda] [AN4] is DISAPPROVED (policy rejection, inside the purchase-optimized [Venda] campaign, $3.67 lifetime spend before rejection); [Post] [17-06] is WITH_ISSUES (inside [Engajamento], $7.01 lifetime spend). Neither can serve again without manual review or a new upload.
Ad names embed creation dates in a DD-MM pattern ([post] [19-06], [Post] [28-05], [instagram] [engajamento 17-07]) and the pattern holds against actual created_time on inspection. Most date-named ads move to PAUSED within roughly two to four weeks of creation. Read as a manual creative- refresh cadence: someone has been rotating in new creative on a short cycle rather than letting individual assets run to exhaustion. This is INFERRED from the naming and lifecycle pattern, not read off a fatigue metric Meta itself reports at the ad level over time; no per-ad time series was pulled to confirm CTR or frequency decay before each swap.
Opportunity score, industry benchmark, auction ranking
Pulled via the read-only Meta Ads MCP tools, 1 Sep 2026, data/_snapshots/2026-09-01/meta-opportunity-score.json, meta-industry-benchmark.txt, meta-auction-ranking-benchmarks.txt.
Opportunity score: 75/100 (account-level; Meta's own tool is explicit this never applies to one campaign, ad set, or ad). Seven live recommendations, the two most material:
- Fragmentation, +4 points, "25% lower cost per post engagement": flags
ad sets 6936204393808 and 52534413502612, both inside the [Engajamento] campaign, both POST_ENGAGEMENT, "similar objectives and creative, different audiences." Independently corroborates the overlap pattern described above, from Meta's own recommendation engine, not from this audit's inference.
- Budget-limited, +12 points, the largest single lever offered: flags
campaigns 6994075424008 ([Venda]), 6936204393808 ([Engajamento]), and ad set 6938453311408 (inside [Visualização de vídeo]) as budget- constrained. Recorded as fact, not endorsed as a recommendation to spend more; more budget behind an unmeasured, largely non-purchase-optimized structure is not obviously the fix.
Industry benchmark: unavailable. The tool returned "No industry benchmark data available for the given criteria" rather than a comparison. Recorded as a gap, not fabricated.
Auction ranking benchmarks: most ads (across every cohort) show Not Yet Available on quality, engagement, and conversion-rate ranking, meaning Meta itself has too little volume per ad to rank it. Two ads have a ranking. [Engajamento] [07-08] (POST_ENGAGEMENT): Conversion Rate Ranking Below Average, bottom 35% of ads, Meta's own diagnosis: "the ad is not producing conversions." [Engajamento] [06-08]: all rankings Average or above, "You are all good." Both are read literally from Meta's diagnostic text, not paraphrased.
Vendor archaeology
Naming convention and created_time alone, matched against the JetAds and Nuuk dates already established, plus one source not available to the prior document: Meta's own account activity log ({ad_account_id}/activities), which records a named actor for every change, independent of who currently holds agency-level access.
What the activity log shows, five named actors, none currently an assigned agency:
| Actor | First activity | Last activity | Event count in window |
|---|---|---|---|
| Patrick Velasco | 2025-12-04 | 2026-01-14 | 75 |
| Gustavo Bandeira | 2025-12-09 | 2026-01-15 | 52 |
| (7-week gap: no named-actor activity 2026-01-15 to 2026-03-06) | |||
| Aguiar Prates | 2026-03-06 | 2026-07-24 | 252 |
| Roberta Pereira | 2026-07-03 | 2026-07-07 | 121 |
Pulled across four paginated calls covering 2025-12-01 through 2026-09-01 (800 rows total), data/_snapshots/2026-09-01/meta-activities-full*.json. The log's most recent entry of any kind is 2026-07-24; there is no logged activity between 24 Jul and today, even though ad updated_time shows changes as late as 12 Aug. That gap is recorded, not explained: the activity log and the object-level updated_time field are evidently not the same data source, and this pull cannot say why 12 Aug's changes left no activity- log trace.
Mapped against the established vendor timeline, matched to the day where the match is exact, not rounded to fit:
- Patrick Velasco / Gustavo Bandeira, 4 Dec 2025 - 15 Jan 2026. This
window opens the day after the ad account and pixel were created (3 Dec 2025) and closes 10 days after the established JetAds pause date (5 Jan 2026). Consistent with the JetAds engagement, not proof of it: the log records names, not company affiliation. No document in this repo names "Patrick Velasco" or "Gustavo Bandeira" as JetAds staff.
- 7-week silence, 15 Jan - 6 Mar 2026. Matches the established "Feb 2026
had zero Meta spend" fact exactly: nobody with visible activity touched the account for seven weeks, spanning the whole of February.
- Aguiar Prates, first activity 6 Mar 2026 at 18:52 UTC. This is the
exact day the bracket-style Portuguese campaigns were created (established fact: "2026-03-06 to 2026-03-09"). Aguiar Prates's activity continues through 24 Jul 2026, spanning the [Engajamento], [Visualização de vídeo], and [Visitas ao Perf] campaign builds and the March-onward remarketing setup.
- Roberta Pereira, 3-7 Jul 2026. A short, dense burst (121 events in 5
days: create_ad_set, create_audience, create_ad, image uploads) overlapping Aguiar Prates's ongoing activity, coinciding with the [Remarketing] ad sets' creation dates (3 Jul 2026) recorded in the hierarchy above.
Where the evidence runs out. No document reviewed for this task names Aguiar Prates, Roberta Pereira, Patrick Velasco, or Gustavo Bandeira, and none of the four appears in the account's current agencies list, which shows exactly one entry: Node AI (business 3759942604308482, access confirmed 2026-08-28, MANAGE task): re-checked directly here, not assumed from the prior guardrails note, via GET /{ad_account_id}/agencies. This is not a contradiction of that note. "Zero individual users enumerable" describes who currently holds access; the activity log is a separate, append-only historical record of who took actions while some agency's access was live at the time, before that access was presumably replaced. Both can be, and are, true at once. What this pull does not establish: which of the four names belongs to JetAds, whether any belongs to Nuuk (Nuuk holds no agency access per the established fact, and nothing here places any of these four names inside Nuuk), or whether the client engaged them directly. Confirm with the client who Aguiar Prates and Roberta Pereira are before naming them to him as if the answer were already known; this pull proves timing, not identity or contract.
Findings
ID format META-nn. Class: BLOCKS / CORRUPTS / WASTES / SUPPRESSES. Tier: HARD (pulled from a system, dated) / DERIVED (arithmetic on HARD) / INFERRED (reasoned from HARD facts) / UNKNOWN. Remit: unowned / media / client.
| ID | Finding | Evidence | Class | Tier | Remit |
|---|---|---|---|---|---|
| META-01 | Two independent Meta sources disagree on lifetime spend by $19.63. Three cross-checked query methods (account-level single row, campaign-level summed, ad-set-level summed) all agree at $4,821.05. The ad-account object's amount_spent field, the source of the previously-established $4,801.41/$4,801.42 figure, reads $4,801.42 on the same day. Both figures are pulled directly, dated, and reproducible; they simply do not agree. | meta-insights-account-lifetime.json, meta-insights-campaign-lifetime.json, meta-insights-adset-lifetime.json, meta-account.json, 1 Sep 2026 | CORRUPTS | HARD | unowned |
| META-02 | Meta's own lifetime purchase count, re-pulled today, is 11, not the previously-established 13. Re-derived two ways (single lifetime row, and a fresh monthly time-series summed) and both agree with each other at 11. Every month matches the established figures exactly except December 2025, where the established fact reads 6 purchases and today's pull reads 4, on identical spend ($1,135.51 both times). Meta's own attributed-conversion count for a closed, 9-month-old month changed between pulls. | meta-insights-account-lifetime.json, meta-insights-account-monthly.json, 1 Sep 2026, vs. established facts in this task's brief | CORRUPTS | HARD | unowned |
| META-03 | Lifetime spend on ad sets whose optimization goal carries no purchase-capable event (POST_ENGAGEMENT x2, PROFILE_VISIT, THRUPLAY) is $1,900.66 (cross-checked at ad level: $1,900.69), against 13 purchases lifetime for the whole account. The previously-quoted ~$829 figure is this same bucket's last-90-day total ($829.56), not the lifetime one; the lifetime figure is more than double it. | meta-insights-adset-lifetime.json, meta-insights-ad-lifetime.json, meta-adsets-promoted-object.json, 1 Sep 2026 | WASTES | HARD (spend, goal) / DERIVED (bucket total) | media |
| META-04 | Four ad sets under the [Remarketing] campaign ran concurrently against nested, structurally overlapping windows of the same site-visitor audience (30D, 14D, 7D, 7-14D). The narrowest, 7-14D, carries a lifetime frequency of 17.79 (90-day: 17.03), five to fifteen times every other ad set in the account. Independently flagged by Meta's own Opportunity Score tool as fragmentation on a separate ad-set pair in a different campaign, +4 points available by consolidating. | meta-adsets.json (targeting.custom_audiences), meta-insights-adset-lifetime.json, meta-opportunity-score.json, 1 Sep 2026 | WASTES | HARD | media |
| META-05 | No ad set in the account is within an order of magnitude of Meta's own published ~50-conversions-per-week threshold to exit the learning phase; the highest-purchase ad set over the last 90 days recorded 2 purchases total. learning_stage_info is not a queryable Graph API field (confirmed: direct request returns error code 100, nonexisting field), so this is read from Meta's own stated threshold applied to insights data, not from a learning-phase flag itself. | meta-insights-adset-90d.json, direct field-existence test, 1 Sep 2026 | WASTES | DERIVED | media |
| META-06 | Meta's own auction-ranking diagnostic scores one currently-active ad, [Engajamento] [07-08], Below Average / bottom 35% on Conversion Rate Ranking, with the stated diagnosis "the ad is not producing conversions." Most other ads in the account carry no ranking at all (Not Yet Available across all three ranking dimensions), meaning Meta has too little volume to assess them either way. | meta-auction-ranking-benchmarks.txt, 1 Sep 2026 | WASTES | HARD | media |
| META-07 | One currently-active ad, [Venda] [AN4], sits DISAPPROVED inside the purchase-optimized [Venda] campaign and cannot deliver without manual review. A second, [Post] [17-06], sits WITH_ISSUES inside [Engajamento]. Combined lifetime spend before each stopped delivering: $10.68. Small in dollars, structurally a delivery blocker on live ad-set inventory that looks active in a status list that only shows status, not effective_status. | meta-ads.json, meta-insights-ad-lifetime.json, 1 Sep 2026 | BLOCKS | HARD | media |
| META-08 | Meta's account activity log records five distinct actors managing this account by name (Patrick Velasco, Gustavo Bandeira: Dec 2025-Jan 2026; Aguiar Prates: Mar-Jul 2026; Roberta Pereira: Jul 2026), none of whom appears in the account's current agency list (re-confirmed directly: one entry, Node AI). A 7-week window with no named-actor activity (15 Jan-6 Mar 2026) matches the established "February had zero spend" fact exactly, and Aguiar Prates's first logged action (6 Mar 2026) matches the bracket-campaign creation date exactly. Which named individual belongs to which vendor is not established here; the timing correlation is. | meta-activities-full*.json, meta-agencies.json, 1 Sep 2026 | UNKNOWN (ownership) | HARD (timing, names) / INFERRED (vendor mapping) | client |
Appendix: raw state
Pulled 1 Sep 2026. Full JSON in data/_snapshots/2026-09-01/: meta-campaigns.json, meta-adsets.json, meta-adsets-promoted-object.json, meta-ads.json, meta-account.json, meta-account-business.json, meta-insights-account-lifetime.json, meta-insights-account-monthly.json, meta-insights-campaign-lifetime.json, meta-insights-campaign-90d.json, meta-insights-adset-lifetime.json, meta-insights-adset-90d.json, meta-insights-ad-lifetime.json, meta-insights-ad-90d.json, meta-activities.json, meta-activities-full.json (+ -p2, -p3, -p4), meta-agencies.json, meta-assigned-users.json (errors: business param required, account-scoped assigned_users is not queryable without a Business Manager context this token does not have), meta-opportunity-score.json, meta-industry-benchmark.txt, meta-auction-ranking-benchmarks.txt.
Account object, re-pulled
name: String Protech Official
currency: USD
account_status: 1 (ACTIVE)
disable_reason: 0
amount_spent: 480142 (cents) = $4,801.42
business: { id: 3280011615507066, name: "String Protech Official" }
created_time: 2025-12-03T12:40:55-0800
Business ownership matches the established "healthy configuration" fact exactly: ad account and business both created 2025-12-03, business is the client's own, not an agency's.
Ad status, effective_status, all 63 ads
ACTIVE 30, PAUSED 23, CAMPAIGN_PAUSED 4, ADSET_PAUSED 4, DISAPPROVED 1, WITH_ISSUES 1. 61 distinct creative IDs across 63 ads.
Pixel
894327239922738, "String Protech Official Pixel," last fired 2026-08-31T23:32:32+0000 (from the same-day general pull, data/_snapshots/2026-09-01/meta.txt).