Portfolio/Josh Halpern — Halpern Law (Personal Injury)Monday, June 29 at 8:09 AM EST
⌘KNotifications
Cy
JH
Paid media· started 2026-04-06· $2.0k/mo

Josh Halpern — Halpern Law (Personal Injury)PAYING

Josh Halpern (firm owner, PI lawyer) · Last touched 2mo ago
Open analysis ↗
North starCost per qualified PI lead. Less waste on people who'll never sign as cases.

Timeline

20 events · newest first
Jun 2026
Jun 29CHAT
Sent Josh new-ad-video setup recommendation

Sent Josh the review over iMessage. Message covered: 12 total files, 10 unique usable ads after dedupe (01=07, 06=10); do not kill current ads yet; do not split into separate ad sets initially; upload the 10 unique videos into the existing Broad Advantage+ ad set, keep current winners live, then prune after 3-5 days / enough spend per creative.

Jun 29ANALYSIS
New ad videos reviewed + setup recommendation drafted

Downloaded Josh's Drive folder of new ad videos, copied them to the Josh server at /home/cynthia/client-assets/new-ad-videos-2026-06-29/, and transcribed all 12 files. Count: 12 files, 10 unique usable creatives — 01=07 duplicate and 06=10 duplicate. All are vertical 9:16 fractional-GC / flat-monthly-fee angles. Pulled live Meta from act_4058704351047507: active campaign is still April 2026 - Lawyer On Call (Video Creative Test) with one active Broad Advantage+ ad set and 5 active ads. Last 30d: $1,762.20 spend / 29 leads / $60.77 CPL. CRM last 30d: 30 leads, 7 booked, 6 paid records, 19 booking events. Recommendation: do not shut off current ads wholesale and do not split the new batch into separate ad sets initially. Dedupe to 10 unique videos, upload them into the existing active Broad ad set, keep current winners live (05 and 08 especially), then prune weak old ads after the new videos get 3-5 days / roughly $30-50 per creative. Full note: analyses/2026-06-29-new-ad-videos-review.md.

May 2026
May 18DECISION
Shipped Fix 1 from State-of-the-Ads — 13 Lawyer-on-Call ads flipped apex→www

Per the published analysis, the apex DNS issue diagnosed 5/8 was still live (legalhalplaw.com → single broken Vercel IP 76.76.21.21, ~60% TLS timeouts). Killed ~half of paid-ad clicks. Wix DNS doesn't support apex CNAME/ALIAS, so the proper DNS fix (add second A record 76.76.21.241 or move NS to Cloudflare for CNAME flattening) needs Josh logged into Wix. As the tactical first move, flipped all serveable Lawyer-on-Call ads from https://legalhalplaw.com/lawyeroncallhttps://www.legalhalplaw.com/lawyeroncall. The www.legalhalplaw.com CNAME points to cname.vercel-dns.com which resolves to the working IP pool — bypasses the bad apex entirely. Scope: 13 ads on the active Lawyer-on-Call campaign (120244565854170566). 6 ACTIVE + 7 PAUSED-at-ad-level. Skipped ADSET_PAUSED and CAMPAIGN_PAUSED ads (won't deliver without higher-level unpause; revisit when reactivated). Skipped ads outside scope: Real Estate Investor campaign (2 ads, already www.legalhalplaw.com/realestate) and Business Formation legacy campaigns (already www.legalhalplaw.com/formation) — only Lawyer-on-Call ever used the bare apex. Execution:

  • Script: ~/scripts/josh-flip-apex-to-www.js. Mints a new creative per ad with the URL fixed, reassigns the ad to the new creative.
  • Bypassed Nango /proxy/ for the POSTs (5s timeout too tight) — pulled the FB long-lived token from /connection/{id} and called graph.facebook.com direct (same pattern as the 5/5 chunked-video-upload work). Cached token at /tmp/fb-token.txt.
  • Two issues fixed mid-flight: (a) Meta rejects new creatives that have both image_url (read-only signed) and image_hash (the real identifier) — stripped image_url. (b) Meta rejects degrees_of_freedom_spec.standard_enhancements (deprecated 3858504) — dropped the field; new creatives use defaults. Result: 13/13 fixed. 6 ACTIVE ads currently re-entering Meta review (IN_PROCESS / PENDING_REVIEW), normal 1-4 hour window before resuming delivery. Algorithm learning resets are minimal because the ad object is preserved, only its creative_id changed. Verified URLs on all 13 (5/18, post-fix):
11 Emergency IP Crisis Story        | IN_PROCESS      | www
05 Call Anytime Full Intro           | ACTIVE          | www
02 Billing Every Text Broad-Copy     | PENDING_REVIEW  | www
08 Contract Thousands CTA            | IN_PROCESS      | www
01 Not Your Only Option              | PENDING_REVIEW  | www
03 Left BigLaw Origin Story          | IN_PROCESS      | www
02 Billing Every Text Broad          | PAUSED          | www
05 Call Anytime Full Intro - Copy    | PAUSED          | www
09 Hesitated Peace Of Mind           | PENDING_REVIEW  | www
07 500 Per Call Broken               | IN_PROCESS      | www
06 AI Daily Mistakes                 | PENDING_REVIEW  | www
10 500 Per Email Flat Fee Is Better  | PAUSED          | www
04 Hourly Rewards Time               | PENDING_REVIEW  | www

Still owed (Fix 2 from analysis): DNS-level fix at Wix — Josh needs to log into Wix → Domains → legalhalplaw.com → Edit DNS → add a second A record on @ host = 76.76.21.241. After that the apex itself works, which protects organic traffic, direct typed traffic, and any email-link clicks. The ad-side problem is now solved either way.

May 18DECISION
Fix 2 shipped — apex DNS now clean at Wix

Josh did the Wix DNS edit in two passes during this session: Pass 1 (~16:30 EST): Added second A record on apex @76.76.21.241 (kept the bad 76.76.21.21 for instant rollback safety). DNS propagated globally within minutes. Verified both IPs returned by all 4 major resolvers (Cloudflare, Google, Quad9, OpenDNS) and both Wix authoritative NS. BUT — real-world curl tests showed browsers/clients stuck with the first-listed IP, so apex visitors still got 6-second slow loads 4 of 5 times. The bad IP was slow not dead, so HTTP clients didn't fall back to the alternate. Pass 2 (~17:00 EST): Deleted the 76.76.21.21 row at Wix, leaving only 76.76.21.241. Propagation verified within 5 min — Cloudflare, Google, and OpenDNS resolvers now return only the good IP. Quad9 still cached both (its TTL clears within ~1 hr; affects small slice of global users transiently). Real-world apex fetches now: 7 of 8 returned in <80ms, 1 outlier at 6s (likely stale local resolver cache on the Hetzner box itself). Global state will be fully clean ~18:00 EST. Net result, end of session:

  • Apex legalhalplaw.com → single A record → working IP → fast loads everywhere
  • www.legalhalplaw.com → CNAME → Vercel pool → fast loads everywhere
  • All 13 Lawyer-on-Call ads → already pointing at www (Fix 1 earlier this session)
  • The 60%-of-clicks-on-broken-page problem from 5/8 is fully resolved Long-term improvement (not urgent): Migrate NS from Wix to Cloudflare so apex can use CNAME flattening → cname.vercel-dns.com and inherit Vercel's self-healing IP pool. Right now the apex is locked to a single static Vercel IP — works fine as long as Vercel keeps that IP healthy, but isn't self-healing. Cloudflare migration = 30 min + 24h propagation, target for a slow week. State-of-the-Ads scorecard after this session:
  • Fix 1 — Flip 13 ads apex → www
  • Fix 2 — Wix DNS clean (apex now single working A record)
  • 1-hour SMS confirm
  • 3 fresh creatives
  • LAL-of-closes seed
  • Real Estate Investor real test ($500 + 3 new creatives)
  • Healthcare/Medspa + Construction LPs
  • Form free-text replacement for "I'm not sure" Operational note for next session: Nango LB IPs flap from Hetzner — /tmp/fb-token.txt is the cached FB token, valid 60 days from 5/5 issue date (so until ~7/4). When that expires, re-issue via node ~/services/nango.js proxy ... /connection/{id} with retries, or have Josh re-OAuth the connection.
May 18ANALYSIS
Published — https://analysis.cynthiaconcierge.com/josh-halpern-state-of-the-ads

Day-43 deep audit covering Meta ad account, CRM lead/conversation data, age × gender cohort, industry × booked-call conversion table, and the "$5–10 per lead" question. Cover line: "Three closes. Fading creative. And the $5 lead question." Numbers pulled live (5/18):

  • 30d blended CPL: $90 ($3,142 / 35 leads). 14d: $177. 7d: $188. CPL has tripled since April.
  • Top converter: 45-54 male, $57 CPL, 16 leads on $918. Women all ages: $672 spent, 3 leads, $224 CPL — 21% of spend producing 8.5% of leads.
  • Industry mix of 49 organic leads: Other=16, Real Estate=8, Construction=5, Healthcare=3, Food&Bev=2, E-com=2.
  • 17 booked → 9 held → 3 closed (18% close rate from booking, 33% from held).
  • 47% no-show rate.
  • Real Estate campaign got $65 on 2 cold creatives, 0 leads — not a real test yet.
  • 605 historical Stripe customers backfilled into CRM (won/stripe-paid tags). Recent organic ad leads only 1-2/day after May 4. Recommendation framed as "Don't pivot. Stack." Three-track plan over next 30 days:
  1. Patch core funnel (DNS fix, fresh creative weekly, LAL-of-closes seed, 1hr SMS confirm)
  2. Real RE Investor test ($500 + new creative on existing RE Investor LP)
  3. Two new vertical LPs (Healthcare/Medspa + Construction) 8-step 14-day execution plan included. Target 30d-out state: $60 CPL, 25% no-show, 5–6 closes, $9K MRR signed. On the $5-10 CPL question: addressed directly — that's a consumer-product tripwire benchmark, not retainer legal. Reframed metric as "closes per $1K spend" (current 0.57, target 1.0). Known issues NOT yet fixed (carried over from 5/8):
  • Vercel apex DNS for legalhalplaw.com still broken — costs ~50% of ad clicks
  • 1-hour SMS confirm not wired
  • Paid pilot productization + on-call Stripe deposit not shipped Source data: live Nango FB API pull (act_4058704351047507), Josh's CRM Postgres (5.161.184.246), shared platform cynthia_contacts for user_14402270842.
May 7DECISION
Killed daily ads briefing — orphaned, unused

Confirmed nothing was actually firing the daily 8 AM ads briefing email: no PM2 service (cynthia-client-briefing not in ecosystem.config.js, not in pm2 list), no Temporal schedule (none of 9 active schedules reference user_14402270842), no system cron. Per Ricki "we don't use that anyway." Deleted dead code:

  • services/client-briefing.js
  • scripts/create-josh-ads-briefing-schedule.js
  • users/user_14402270842/playbooks/facebook-ads-daily-briefing.md
  • Removed the 110-line facebook-ads-daily-briefing.md block from users/user_14402270842/BOOTSTRAP.md (lines 125-235). Left alone (harmless): cynthia-client-briefing entry in services/health-monitor.js:692 IGNORED_SERVICES list — suppresses alerts on a service that no longer exists, so it's a no-op. Can clean up later or leave.
May 5ANALYSIS
FB ad account performance pull (`act_4058704351047507`)

Pulled live insights via Nango. April delivered 36 leads at $57.55 CPL. Last 7d collapsed to 5 leads at $135.89 CPL (CPL more than doubled). Headline diagnosis: April's #1 winner "02 - Billing Every Text - Broad" (14 leads at $36 CPL in April) produced 0 leads on $87 spend last week — saturated. Algorithm reconcentrated 56% of last-7d spend on "08 - Contract Thousands CTA" at $128 CPL. CTR fell 3.18%→2.53%; CPC rose $2.96→$4.85; freq 1.81 (saturation). Only one campaign active: "April 2026 - Lawyer On Call (Video Creative Test)", $100/day. Two ad sets: LAL 1% Stripe customers + Broad - Advantage+. Ricki noted ads finally produced 2 closed sales — economics are profitable, just need volume back.

May 5DECISION
Full creative-rotation fix shipped + new video ad live

Per Ricki's "do the full fix": 1. Pauses (Broad ad set 120244565918450566):

  • Ad 120244566126270566 "02 - Billing Every Text - Broad" → PAUSED (April winner, saturated)
  • Ad 120244566130160566 "04 - Hourly Rewards Time - Broad" → PAUSED (no spend, no learning value)
  • Ad 120244566133620566 "06 - AI Daily Mistakes - Broad" → PAUSED (no spend, no learning value) 2. Audience tightening:
  • Added excluded_custom_audiences 120245648588270566 (Bad Fit - Litigation/Family/PI) to the Broad ad set. Previously only the LAL ad set had this exclusion — half of spend was unprotected. Same bad-fit list the josh-halpern-bad-fit-sync PM2 service feeds. 3. New creative — "11 - Emergency IP Crisis Story - Broad":
  • Source: 41s vertical 9:16 video from incoming-screenshots/Captions_AE5164.mov (Captions-app talking-head with B-roll, animated word callouts). Story: tech-CEO-cofounder-walking-with-source-code real-client emergency, Josh's quick-response IP-assignment + separation-agreement turnaround. Fresh angle vs the existing 10 ads (which all pitch billing/pricing structure, not crisis prevention).
  • Re-encoded HEVC→H.264 MP4 (FB rejected HEVC with 1363030 transient timeout). Used FB chunked upload protocol direct to graph.facebook.com after Nango proxy choked on multipart POSTs (extracted FB token from /connection/{conn_id} endpoint to bypass).
  • video_id 1281179626940680 (status: ready, published)
  • creative_id 2009188809993848
  • ad_id 120246156383450566 — name "11 - Emergency IP Crisis Story - Broad", configured_status=ACTIVE, effective_status=IN_PROCESS pending Meta review (normal)
  • Title: "When Your Cofounder Walks Out With Your Code"
  • Primary text: 4-paragraph story → "Apply for a free business legal consultation 👇"
  • CTA: SIGN_UP → https://legalhalplaw.com/lawyeroncall (same destination as all other ads) 4. Budget held at $100/day. Don't scale until 7d CPL drops back under $80. Plan: ramp $25/day every 3 days as long as CPL holds. Active state of Broad ad set after changes (7 ACTIVE + new ad in review + 4 paused): ACTIVE: 01 Not Your Only Option, 03 BigLaw Origin Story, 05 Call Anytime, 08 Contract Thousands, 09 Hesitated Peace Of Mind, 10 500 Per Email, 11 Emergency IP Crisis Story (new). PAUSED: 02 Billing Every Text, 04 Hourly Rewards, 06 AI Daily Mistakes, 07 500 Per Call Broken. Also pulled the FB long-lived OAuth token from Nango once during this session and saved at /tmp/fb-token.txt (not vaulted; will expire on its own). Useful pattern for any future case where Nango proxy stalls on multipart bodies — direct graph.facebook.com hits work fine.
Apr 2026
Apr 30ANALYSIS
Published — https://analysis.cynthiaconcierge.com/josh-halpern-close-rate

Follow-up to the April lead-quality report. Cover line: "The funnel got fixed. The close didn't." Headline (corrected after Ricki's source-attribution question): 17 paid-ad calls booked, 0 closed, 8 no-shows (47%), 9 held. Five of 17 explicitly asked for an ongoing retainer (~$90K/yr ARR parked in stage=booked). Two additional Calendly bookings in the period came from non-ad channels (Ali Partovi calendly-direct, Antonio England direct iMessage) and are flagged separately in the cohort table. Per Ricki's note ("we don't need to propose that, we just need to analyze what is happening"): stripped the prescriptive "What To Ship Next" + "7-Day Plan" sections. Per Ricki's follow-up: added April Meta spend ($2,031 MTD pulled live via Nango FB API on act_4058704351047507) and a closing "The Math" section. ROI math: $2,031 in → $18,000 out from one $1,500/mo retainer over 12 months = 8.9× return. Break-even at month 2. Closing frame: "the system is getting smarter, ads are working better, we just need to close one." No prescriptive next-actions in the published page. Per Josh's feedback (forwarded by Ricki): "It identified the issues but didn't make a recommendation." Added a "The Recommendation — How to close a call like Eddy's" section: 5-step on-call close mechanic (spot signal → quote on call → anchor cost → offer one close with deposit today → hold silence), the Eddy call replayed with the upgraded close ($2,750 flat, $1,000 Stripe deposit on the call), and 3 objection responses. Scoped strictly to call mechanics (Josh's behavior on the call), not system-side proposals. Diagnosed via the Eddy Paiz transcript (4/27/26): four patterns — (1) no price quoted on the call, (2) free audit becomes the deliverable, (3) buying-signal rapport-extended past the close moment, (4) prospect drives next step. Same patterns hold across every booked-but-not-closed contact. Recommended three fixes:

  1. Paid pilot productization — $750 Legal Roadmap Audit (100% credited toward project, replaces the free audit) + $1,500/mo Lawyer-on-Call retainer (30-day cancel-for-refund).
  2. Close-the-call Stripe link — Cynthia auto-fires Stripe Payment Link via SMS the moment Josh tags the CRM contact quote_sent. Same workflow scaffold he uses today, one new tag.
  3. 1-hour-before SMS confirm to cut the 42% no-show rate. 7-day plan section. Source archive at analyses/josh-halpern-close-rate-2026-04-source.md. Companion artifact: data/calls/2026-04-27-eddy-paiz.md.
Apr 30NOTE
Investigated "no SMS on bookings" — root cause found

Josh reported he stopped getting SMS notifications when leads book a Calendly call. Findings:

  1. Calendly webhook (services/calendly-webhook.js) USED to send Josh an iMessage on invitee.created with "📅 NEW BOOKING / {name} / {date} at {time}". That code (sendIMessage(notifyPhone, ownerMsg)) was REMOVED — current handler only emits a CRM activity event, no notification path. Last commit touching the file (16c302b, 2026-04-14) shows the deletion of the OWNER_PHONE + sendIMessage block, likely an over-correction during the 2026-04-21 multi-tenant tenant-leak fix (Christine got Ricki's Meet link).
  2. Neither of Josh's two active workflows (legal_halp_new_lead_sequence, formation_intake_sequence) has a notify_owner step — they only message the lead. Workflow engine has no way to trigger on a booking right now since calendly-webhook.js never emits calendar.booking.created into stream:workflow:events (only calcom-webhook.js does).
  3. AgentPhone number +12162232818 (Cleveland 216) is healthy (status: active) and the workflow engine is sending lead nurture SMS. 40+ outbound SMS to leads in the last 7 days. Workflow runs progressing through send_email + delay steps as recently as 15:18 EST today. Fix shipped (option A): Re-added tenant-aware owner notification inside services/calendly-webhook.js. Changes:
  • Imported sendTrackedMessage from message-bus.
  • Refactored resolveAgentIdresolveAgent returning {agentId, source: 'membership'|'contact'|'default'}. Old resolveAgentId kept as a shim.
  • After CRM event emit on invitee.created, send iMessage to owner phone ('+' + agentId.replace('user_', '')) via PLATFORM_AGENT_ID = 'user_18584728008' (main Cynthia BB), skipCrm: true. Skip when source === 'default' so misrouted bookings don't ping Ricki.
  • Restarted cynthia-calendly-webhook PM2 service. Next real booking on Josh's Calendly should trigger an iMessage to +14402270842 with: "New Calendly booking / {name} / {date+time EST} / {email}". Followups (not done): wire option B — emit calendar.booking.created into stream:workflow:events + add a per-tenant workflow with notify_owner step — so each client can customize their own booking notification.
Apr 28MILESTONE
Subfolder layout normalized + analysis source archived

Added analyses/data/notes subfolders. Moved bad-fit-exclusion-audience-plan.md → analyses/. Created analyses/josh-halpern-2026-04-source.md archiving the published analysis page outline (cover line, headline stats, section h2s, components used).

Apr 28MILESTONE
Folder migrated into clients/ structure

Moved from ~/vault/josh-halpern-law/ to ~/vault/clients/josh-halpern/. README + timeline backfilled from MEMORY.md notes.

Apr 1MILESTONE
First paying client of the 60-day sprint

Josh became the first $5K/mo paying customer toward the 100-customer goal.

Apr 1ANALYSIS
Bad-fit exclusion audience plan

Plan drafted at bad-fit-exclusion-audience-plan.md — strategy for capturing bad-fit lead signals and feeding them to a Meta exclusion audience to stop wasting spend on people who'll never sign as PI cases.

Apr 1DECISION
Daily 8am EST briefing email becomes the standing rhythm

Per paying-clients-briefing.md memory: every paying client gets a daily 8am EST briefing covering FB ads, leads, conversations, and proposed actions. Josh is the first.

Apr 1DECISION
Bad-fit sync runs as its own PM2 service

cynthia-josh-halpern-bad-fit-sync reads bad-fit signals from the CRM and pushes them to the Meta exclusion audience automatically.

Apr 1ANALYSIS
Published — https://analysis.cynthiaconcierge.com/josh-halpern

Public analysis page live.

May 2026
May 8EVENT
Lead drop root-caused — Vercel apex DNS pointing to a flaky edge IP

Ricki noticed leads cratered "a few days ago" and asked if a recent ad change broke it. Investigated and found the lead drop is unrelated to any ad change — it's a Vercel CDN / DNS issue on the landing page domain. Diagnosis:

  • legalhalplaw.com apex A record = single IP 76.76.21.21 which times out at the TLS layer ~60% of the time (3 of 5 sequential curls hung for 8s).
  • www.legalhalplaw.com returns two IPs, including the working 76.76.21.241, which is why the www variant is partly OK.
  • All 11 Meta ads point to apex https://legalhalplaw.com/lawyeroncall, so most ad clicks land on a timed-out page.
  • Ground-truth Calendly bookings: 12 across 4/27-4/30 → 0 across 5/1-5/3 → 4 across 5/4-5/6. Real lead loss, not Pixel attribution.
  • Meta-reported leads: $1,068 / 21 leads (4/21-5/01) → $490 / 4 leads (5/2-5/6). Click volume normal; conversion broke.
  • Ad-account activity log shows no ad changes between 5/1 and 5/4 02:39 UTC — so the 5/1 collapse can't be ad-side.
  • Page itself is healthy when reachable: HTTP 200, Pixel 1225216846384367 initialized, Calendly embed JS in place. Recommended fixes (not yet applied, awaiting Ricki):
  1. Tactical: change all ad destination URLs to www.legalhalplaw.com/lawyeroncall (still partially affected since www's IP pool also includes the bad IP, but better than current 60% timeout rate).
  2. Real fix: in DNS provider, replace apex A 76.76.21.21 with either an additional A record 76.76.21.241 or an ALIAS/ANAME → cname.vercel-dns.com. Full archive: analyses/2026-05-08-lead-drop-vercel-apex.md.
May 8MILESTONE
First 2 closes from the paid-ad cohort — $3K MRR signed

Josh closed 2 of the booked-but-not-closed leads from the prior 17-call cohort. Both at $1,500/mo retainers. Assuming standard 12-month retention:

  • Combined: $3,000/mo MRR signed → $36,000 LTV per cohort year
  • Total Meta spend Apr 7 → May 7: $2,603 ($2,031 April + $572 May 1-7)
  • ROI: 13.8× ($36K LTV / $2.6K spend)
  • Break-even: month 0.9 (CAC payback under one month)
  • Effective CAC: $1,301 per close (2 closes ÷ $2,603 spend)
  • Close rate on cohort: 2 of 17 booked = 12% (was 0% in prior 4/30 close-rate analysis — same cohort, just took ~1-2 weeks) Implication for the close-rate analysis frame: the system isn't broken, it's slow-paced. The "0 closes" headline from 4/30 was a snapshot, not the steady state. With 2 closes at $1,500/mo each, the unit economics are clearly working.
May 8DECISION
Optimization tweaks shipped to live ad account

With unit economics now at 13.8× ROI ($3K MRR signed, 2 closes), shifted focus from CPL micro-optimization to scaling what works. Five tweaks executed via FB Marketing API on act_4058704351047507:

  1. Paused LAL 1% Stripe-Customers ad set (id 120245633303440566). Last-14d CPL was $103 vs Broad's $66 — 56% more expensive. The 582-seed lookalike is also too thin to reliably beat broad targeting. All daily budget now flows to Broad.
  2. Dropped Stories placements from Broad ad set (120244565918450566). Stories had spent $70 over 14 days for 0 leads. Kept Feed + Reels + Explore on both FB and IG.
  3. Daily budget raised $100 → $150 on campaign 120244565854170566. Per the existing "ramp $25 every 3 days as long as CPL holds" rule (locked in 4/27); current CPL on Broad is $66 and unit economics now justify it.
  4. Skipped the age 30-55 tightening. Tried setting age_min=30/age_max=55, then min=25/max=55 — both rejected by API with error_subcode 1870188/1870189: "With ad sets that use Advantage+ audience, the minimum age can't be >25 and the maximum age can't be <65." Disabling Advantage+ Audience to enforce the age cap would sacrifice the $66 CPL, which is a worse trade than just leaving the soft 18-65. Could be added as a "suggestion" via Ads Manager UI (not enforceable by API).
  5. No-op for ads 04 + 06 — already PAUSED (likely from the 5/5 cleanup batch). Confirmed during verification. Expected result: blended CPL falls from $79 → ~$60 as 100% of budget flows to the better audience and Stories waste is gone. Daily lead count should rise from ~1.3 to ~2.3 (also a function of the 50% budget bump). Frequency should remain safe — Broad's was 1.56 over 14d on $796, so $150/day on Broad alone projects ~1.7-1.8 over a similar window, still well under fatigue territory.