{"id":"demo","isDemo":true,"createdAt":"2026-11-14T17:00:00+01:00","gaps":["Example data only — not fetched from api.ads.openai.com.","Account spend-limit windows were not modeled (v1 skips that endpoint)."],"inventory":{"campaigns":[{"id":"cmpn_101","name":"Product trials — Clicks","status":"active","bidding_type":"clicks","adGroups":2,"ads":4,"spend":3200,"clicks":800,"conversions":40},{"id":"cmpn_102","name":"Brand reach — Impressions","status":"active","bidding_type":"impressions","adGroups":2,"ads":3,"spend":200,"clicks":0,"conversions":0},{"id":"cmpn_103","name":"Qualified demos — Conversions","status":"active","bidding_type":"conversions","adGroups":1,"ads":2,"spend":80,"clicks":18,"conversions":2},{"id":"cmpn_104","name":"Legacy webinar — leftover","status":"active","bidding_type":"clicks","adGroups":1,"ads":1,"spend":120,"clicks":0,"conversions":0},{"id":"cmpn_105","name":"Empty shell — Q4 idea","status":"active","bidding_type":"clicks","adGroups":0,"ads":0,"spend":0,"clicks":0,"conversions":0}]},"overall":44,"weights":{"structure":15,"hints":20,"bids":20,"waste":20,"creative":15,"pacing":10},"categories":{"structure":{"label":"Account structure","score":78,"weight":15,"findingCount":1},"hints":{"label":"Context hints","score":42,"weight":20,"findingCount":4},"bids":{"label":"Bids & CPC","score":56,"weight":20,"findingCount":2},"waste":{"label":"Wasted spend","score":44,"weight":20,"findingCount":3},"creative":{"label":"Creative","score":0,"weight":15,"findingCount":9},"pacing":{"label":"Budget pacing","score":34,"weight":10,"findingCount":3}},"recommendations":[{"id":"pacing.lifetime_under.cmpn_102","category":"pacing","severity":"high","title":"Campaign “Brand reach — Impressions” is far behind its lifetime budget","why":"Lifetime cap is $5,000.00 but this 30-day window only shows $200.00 spent (4% of the cap in-window).","expectedImpact":"High — likely a material change in wasted spend, delivery, or efficiency.","exactChange":"Diagnose delivery on cmpn_102 (bids, hints, approved ads, targeting) before raising the lifetime cap.","entityIds":["cmpn_102"],"evidence":{"lifetime":5000,"spend":200}},{"id":"waste.no_clicks.ad_506","category":"waste","severity":"high","title":"Ad “Reach variant A” spent $140.00 with 0 clicks","why":"In the last 30 days this ad recorded $140.00 spend and 90000 impressions, but no clicks. That spend did not produce an engagement.","expectedImpact":"High — likely a material change in wasted spend, delivery, or efficiency.","exactChange":"Pause ad_506 (or its parent if the whole group is wasted), then fix creative and context hints before reactivating. This audit will not pause it for you.","entityIds":["ad_506"],"evidence":{"spend":140,"clicks":0,"impressions":90000}},{"id":"waste.no_clicks.ad_510","category":"waste","severity":"high","title":"Ad “June webinar card” spent $120.00 with 0 clicks","why":"In the last 30 days this ad recorded $120.00 spend and 15000 impressions, but no clicks. That spend did not produce an engagement.","expectedImpact":"High — likely a material change in wasted spend, delivery, or efficiency.","exactChange":"Pause ad_510 (or its parent if the whole group is wasted), then fix creative and context hints before reactivating. This audit will not pause it for you.","entityIds":["ad_510"],"evidence":{"spend":120,"clicks":0,"impressions":15000}},{"id":"pacing.under_daily.cmpn_104","category":"pacing","severity":"high","title":"Campaign “Legacy webinar — leftover” is under-pacing its daily budget","why":"Daily cap is $40.00 (40000000 micros). Over 30 day(s) the expected spend is about $1,200.00, but Insights show $120.00 (10%).","expectedImpact":"High — likely a material change in wasted spend, delivery, or efficiency.","exactChange":"On cmpn_104, check bids, context hints, creative review status, and targeting. If delivery is constrained, raise the click bid toward the $3–$5 starting band or add approved ads — do not only raise the daily cap.","entityIds":["cmpn_104"],"evidence":{"daily":40,"expected":1200,"spend":120,"ratio":0.1,"activeDays":30}},{"id":"pacing.lifetime_under.cmpn_103","category":"pacing","severity":"high","title":"Campaign “Qualified demos — Conversions” is far behind its lifetime budget","why":"Lifetime cap is $8,000.00 but this 30-day window only shows $80.00 spent (1% of the cap in-window).","expectedImpact":"High — likely a material change in wasted spend, delivery, or efficiency.","exactChange":"Diagnose delivery on cmpn_103 (bids, hints, approved ads, targeting) before raising the lifetime cap.","entityIds":["cmpn_103"],"evidence":{"lifetime":8000,"spend":80}},{"id":"structure.empty_campaign.cmpn_105","category":"structure","severity":"high","title":"Active campaign “Empty shell — Q4 idea” has no ad groups","why":"cmpn_105 is status=active but GET /ad_groups?campaign_id=cmpn_105 returned no groups, so the campaign cannot serve.","expectedImpact":"High — likely a material change in wasted spend, delivery, or efficiency.","exactChange":"Create at least one ad group under cmpn_105, or pause the campaign if it should not spend.","entityIds":["cmpn_105"],"evidence":{}},{"id":"hints.empty.adgrp_302","category":"hints","severity":"high","title":"“Trial — generic catch-all” has no context hints","why":"Context hints on the ad group tell ChatGPT when the ad may be useful. They are not exact-match keywords, but an empty list gives the auction no placement guidance from you.","expectedImpact":"High — likely a material change in wasted spend, delivery, or efficiency.","exactChange":"Set context_hints on adgrp_302 to 3–8 specific descriptions of prompts or jobs-to-be-done (short sentences, not single generic words).","entityIds":["adgrp_302"],"evidence":{}},{"id":"bids.below_guidance.adgrp_302","category":"bids","severity":"high","title":"“Trial — generic catch-all” max CPC bid is below OpenAI’s $3–$5 starting guidance","why":"max_bid_micros is 1200000 ($1.20 CPC). OpenAI’s Help Center starting range for CPC is $3.00–$5.00. A bid under $3 often under-competes in this auction.","expectedImpact":"High — likely a material change in wasted spend, delivery, or efficiency.","exactChange":"On ad group adgrp_302, raise bidding_config.max_bid_micros from 1200000 ($1.20) to at least 3000000 ($3.00), then watch actual CPC.","entityIds":["adgrp_302"],"evidence":{"maxBid":1.2,"max_bid_micros":1200000}},{"id":"bids.below_guidance.adgrp_306","category":"bids","severity":"high","title":"“Webinar — leftover group” max CPC bid is below OpenAI’s $3–$5 starting guidance","why":"max_bid_micros is 2500000 ($2.50 CPC). OpenAI’s Help Center starting range for CPC is $3.00–$5.00. A bid under $3 often under-competes in this auction.","expectedImpact":"High — likely a material change in wasted spend, delivery, or efficiency.","exactChange":"On ad group adgrp_306, raise bidding_config.max_bid_micros from 2500000 ($2.50) to at least 3000000 ($3.00), then watch actual CPC.","entityIds":["adgrp_306"],"evidence":{"maxBid":2.5,"max_bid_micros":2500000}},{"id":"creative.few_variants.adgrp_303","category":"creative","severity":"high","title":"“Reach — short keywords” has 0 approved active ad variants","why":"Ad groups with a single (or zero) approved variant cannot test titles, bodies, or images against each other, so weak creative keeps all of the spend.","expectedImpact":"High — likely a material change in wasted spend, delivery, or efficiency.","exactChange":"Get at least one ad in adgrp_303 to review_status=approved (edit rejected ads so they can be re-reviewed), and add a second distinct variant.","entityIds":["adgrp_303","ad_505"],"evidence":{}},{"id":"creative.rejected.ad_505","category":"creative","severity":"high","title":"Ad “Brand reach card — rejected” was rejected","why":"review_status=rejected means the ad violated ads policy and will not serve until it is edited and re-reviewed.","expectedImpact":"High — likely a material change in wasted spend, delivery, or efficiency.","exactChange":"Edit the creative on ad_505 to comply with ads policies and resubmit. Blobbo will not edit the ad.","entityIds":["ad_505"],"evidence":{}},{"id":"waste.no_clicks.ad_507","category":"waste","severity":"medium","title":"Ad “Reach variant A copy” spent $60.00 with 0 clicks","why":"In the last 30 days this ad recorded $60.00 spend and 40000 impressions, but no clicks. That spend did not produce an engagement.","expectedImpact":"Medium — a meaningful efficiency, coverage, or structure improvement.","exactChange":"Pause ad_507 (or its parent if the whole group is wasted), then fix creative and context hints before reactivating. This audit will not pause it for you.","entityIds":["ad_507"],"evidence":{"spend":60,"clicks":0,"impressions":40000}},{"id":"hints.thin.adgrp_303","category":"hints","severity":"medium","title":"“Reach — short keywords” only has short keyword-like hints","why":"All 2 hint(s) are under 3 words / 18 characters (“saas”, “tools”). Official docs allow descriptions or keywords; single generic tokens usually under-specify when the ad is useful.","expectedImpact":"Medium — a meaningful efficiency, coverage, or structure improvement.","exactChange":"Replace the hints on adgrp_303 with fuller descriptions, e.g. turn “saas” into a sentence about the situation or prompt in which this product should appear.","entityIds":["adgrp_303"],"evidence":{"hints":["saas","tools"]}},{"id":"hints.thin.adgrp_306","category":"hints","severity":"medium","title":"“Webinar — leftover group” only has short keyword-like hints","why":"All 1 hint(s) are under 3 words / 18 characters (“webinar”). Official docs allow descriptions or keywords; single generic tokens usually under-specify when the ad is useful.","expectedImpact":"Medium — a meaningful efficiency, coverage, or structure improvement.","exactChange":"Replace the hints on adgrp_306 with fuller descriptions, e.g. turn “webinar” into a sentence about the situation or prompt in which this product should appear.","entityIds":["adgrp_306"],"evidence":{"hints":["webinar"]}},{"id":"hints.overlap","category":"hints","severity":"medium","title":"Context hints overlap across ad groups in the same campaign","why":"These hints appear in more than one group: “saas”. Overlapping hints make groups compete for the same prompts instead of covering distinct situations.","expectedImpact":"Medium — a meaningful efficiency, coverage, or structure improvement.","exactChange":"Give each overlapping group in adgrp_303, adgrp_304 a distinct hint set. Keep shared themes only where the offer is truly identical, otherwise split or merge the groups.","entityIds":["adgrp_303","adgrp_304"],"evidence":{"overlaps":[{"hint":"saas","owners":["adgrp_303","adgrp_304"]}]}},{"id":"creative.few_variants.adgrp_302","category":"creative","severity":"medium","title":"“Trial — generic catch-all” has 1 approved active ad variant","why":"Ad groups with a single (or zero) approved variant cannot test titles, bodies, or images against each other, so weak creative keeps all of the spend.","expectedImpact":"Medium — a meaningful efficiency, coverage, or structure improvement.","exactChange":"Add at least one more distinct chat_card in adgrp_302 (different title/body or image) so you have 2–4 approved variants.","entityIds":["adgrp_302","ad_504"],"evidence":{}},{"id":"creative.duplicate.adgrp_304.ad_506","category":"creative","severity":"medium","title":"Duplicate creative in “Reach — overlapping tools”","why":"Ads ad_506, ad_507 share the same title and body, so they are not useful variants.","expectedImpact":"Medium — a meaningful efficiency, coverage, or structure improvement.","exactChange":"Keep one of ad_506 / ad_507 and change the title, body, or image on the others — or pause the duplicates.","entityIds":["ad_506","ad_507"],"evidence":{}},{"id":"creative.few_variants.adgrp_305","category":"creative","severity":"medium","title":"“Demos — finance ops leads” has 1 approved active ad variant","why":"Ad groups with a single (or zero) approved variant cannot test titles, bodies, or images against each other, so weak creative keeps all of the spend.","expectedImpact":"Medium — a meaningful efficiency, coverage, or structure improvement.","exactChange":"Add at least one more distinct chat_card in adgrp_305 (different title/body or image) so you have 2–4 approved variants.","entityIds":["adgrp_305","ad_508","ad_509"],"evidence":{}},{"id":"creative.few_variants.adgrp_306","category":"creative","severity":"medium","title":"“Webinar — leftover group” has 1 approved active ad variant","why":"Ad groups with a single (or zero) approved variant cannot test titles, bodies, or images against each other, so weak creative keeps all of the spend.","expectedImpact":"Medium — a meaningful efficiency, coverage, or structure improvement.","exactChange":"Add at least one more distinct chat_card in adgrp_306 (different title/body or image) so you have 2–4 approved variants.","entityIds":["adgrp_306","ad_510"],"evidence":{}},{"id":"creative.stale.ad_504","category":"creative","severity":"medium","title":"Ad “Generic catch-all card” has not been updated in 65 days","why":"The API does not expose a last-served timestamp. This check uses updated_at/created_at plus weak or thin performance in the audit window as a stale-creative signal.","expectedImpact":"Medium — a meaningful efficiency, coverage, or structure improvement.","exactChange":"Create a new variant alongside ad_504 (new title, body, or image) and keep the original paused if the new one wins.","entityIds":["ad_504"],"evidence":{"updated_at":1789048800,"created_at":1789048800,"ageDays":65}},{"id":"creative.short_title.ad_504","category":"creative","severity":"low","title":"Ad “Generic catch-all card” has a very short title","why":"Title “Try it” is 6 characters (API allow 3–50). Short titles often under-explain the offer in a chat card.","expectedImpact":"Low — incremental hygiene; useful, but smaller than the items above.","exactChange":"Rewrite the title on ad_504 to a clearer 15–50 character offer.","entityIds":["ad_504"],"evidence":{}},{"id":"creative.short_body.ad_504","category":"creative","severity":"low","title":"Ad “Generic catch-all card” has a very short body","why":"Body is 19 characters (API max 100). That leaves little room to explain why someone should click.","expectedImpact":"Low — incremental hygiene; useful, but smaller than the items above.","exactChange":"Expand the body on ad_504 toward 40–100 characters with a concrete benefit.","entityIds":["ad_504"],"evidence":{}}],"totals":{"impressions":193300,"clicks":818,"spend":3600,"conversions":42,"conversionsAvailable":true,"ctr":0.0042317640972581476,"cpc":4.400977995110025},"wasteStats":{"wastedNoClicks":320,"noClickEntities":[{"type":"ad","id":"ad_506","name":"Reach variant A","spend":140},{"type":"ad","id":"ad_507","name":"Reach variant A copy","spend":60},{"type":"ad","id":"ad_510","name":"June webinar card","spend":120}]},"currency":"USD","period":{"since":"2026-10-16","until":"2026-11-14","days":30,"timezone":"America/New_York"},"account":{"id":"adacct_nw_demo","name":"Northwind Analytics","legal_name":"Northwind Analytics LLC","timezone":"America/New_York","currency_code":"USD","status":"active","review":"approved"},"counts":{"campaigns":5,"adGroups":6,"ads":10,"activeCampaigns":5}}