Performance Marketing · Meta Ads

GH + UG Optimization · April 2026

Campaign structure review after Meta audit · Keep / Kill / Change · LN0 & CAC analysis
Total Spend
$27,690
GH $20,681 · UG $7,009
LN0s (first loans)
1,809
GH 1,521 · UG 288
Blended CAC
$15.31
GH $13.60 · UG $24.34
App Installs
16,792
GH 14,104 · UG 2,688
Registrations
30,431
GH 25,659 · UG 4,772
📋
Context: Copy campaigns = post-audit restart, not underperformers
Last week's Meta audit paused the new campaign structure. After passing, campaigns had to be duplicated and restarted — all "-Copy" campaigns are the active new structure rebuilding its learning phase. Higher CPI/CPR/CAC vs originals is expected and normal. Originals should continue running in parallel while copies accumulate 50+ conversions/ad set/week. Do not kill Copy campaigns.
🚨
FidoBiz campaigns still spending — product discontinued April 2026
GH: $2,563 on FidoBiz LN0 + Copy this month. UG FidoBiz LN0 ($391) is actually one of the best performers (CAC $13.47) — before pausing, confirm what offer is being served and whether the creative can be repurposed to personal credit.
⚠️
"GH - FB Existing Posts Marketing" is in the UG account — structural error
A GH-named campaign is spending UG budget ($218, zero LN0s). Pause and resolve naming/account assignment.
🇬🇭 Ghana (GH)
Spend
$20,681
LN0s
1,521
Blended CAC
$13.60
To kill immediately
$3,425
FidoBiz ($2,563) · Social engagement ($430) · Referral web ($397) · Salaried Copy ($21)
Learning phase (copies) — keep
$2,062
Personal Loans Copy ($1,209) · Cold Copy ($564) · MoMo Copy ($372) · Salaried Copy ($21)
Scale candidates (freed budget)
→ Core Acquisition Easysave & Cold
Best CAC in account: $9.46 (Personal Loans "Delay") · $11.99 (Cold)
Campaign-level · April 2026
Decision Campaign Spend LN0 CAC CPI CPR Notes
Keep GH App Acquisition - Cold $6,112 510 $11.99 $1.32 $2.64 Workhorse. "Problem and Solution" ($5.1k, CAC $11.53) drives 87% of LN0s
Keep App GH - Personal Loans - LN0 $3,505 354 $9.90 $1.34 $2.65 "Delay" (CAC $9.32) + "UGC Style" ($9.46) best. Reduce "Medical Emergencies" budget (CAC $11.74)
Kill App GH - FidoBiz - LN0 $2,088 230 $9.08 $1.01 $2.00 Product discontinued April 2026
Keep GH App Retargeting - Funnel $1,469 64 $22.96 $1.39 $2.71 High CAC typical for retargeting. Kill "KYC 1 - Copy" ad (CAC $93). "Cash Ready" best at $15.52
Keep App GH - MoMo Agent - LN0 $1,221 129 $9.46 $1.18 $2.75 "Stressed Agent" ad efficient. CTR 7% — high engagement
Learning App GH - Personal Loans - LN0 - Copy $1,209 48 $25.18 $2.61 $5.55 Post-audit restart. Learning phase — target CAC <$13.60. Keep parallel to original
Keep App GH - Salaried Workers - LN0 $1,178 104 $11.33 $1.53 $3.29 Kill "Ad Set V1" ad (CAC $41.97). Rest is solid
Scale Web GH - Personal Loans - Reg $882 $0.07 11,789 web regs · LN0 not tracked via Meta purchase event (see open question)
Learning GH App Acquisition - Cold - Copy $564 $1.81 $3.59 Post-audit restart. Keep running
Kill App GH - FidoBiz - LN0 - Copy $475 26 $18.26 $1.53 $2.93 Product discontinued. No reason to keep learning
Keep Web GH - Finance - Reg $423 $0.08 7 ads all performing uniformly at $0.07–0.09 CPR
Kill Web GH - Referral - Reg $397 0 $6.84 CPR 100× worse than other web campaigns. 0 LN0s
Learning App GH - MoMo Agent - LN0 - Copy $372 17 $21.91 $2.55 $5.82 Post-audit restart. Keep running alongside original
Kill GH - Existing Posts AdOps {SM IG} $300 0 0 LN0s, 0 installs, 0 regs
Keep App GH - Core Acquisition {App Purchase} $236 13 $18.19 $1.58 $3.94 Early stage, small volume. Watch
Keep App GH - EasySave & Credit A/B Testing $216 20 $10.79 $1.42 $3.37 Good CAC, only 1 ad — add more creative variants
Kill GH - Existing Posts AdOps {SM FB} $130 0 0 LN0s, 0 conversions
Keep App GH - iOS Quick Credit - Installs $96 0* $0.81 Low CPI. *LN0 likely iOS attribution gap — don't kill based on this
Scale App GH - Core Acquisition_Easysave $63 5 $12.58 $0.49 $1.01 Best CPI in account at $0.49. Only $63 spend — scale to $500+
Change GH Web Acquisition Lander Test $54 $0.21 Strong web CPR. Scale to $300 to validate
Keep Web GH - EasySave - Reg $135 $0.09 Efficient web channel
Learning App GH - Salaried Workers - LN0 - Copy $21 1 $20.96 $2.99 $6.99 Just started. Minimal data — keep running
TOTAL $20,681 1,521 $13.60
Ad-level highlights — within active campaigns
Campaign Ad Spend LN0 CAC CPI CTR% Action
GH App Acquisition - Cold Problem and Solution $5,131 445 $11.53 $1.30 2.96% Scale
GH App Acquisition - Cold Speed Demo $753 52 $14.47 $1.35 1.96% Keep
App GH - Personal Loans Delay $1,155 124 $9.32 $1.13 2.30% Scale
App GH - Personal Loans UGC Style $530 56 $9.46 $1.20 2.99% Scale
App GH - Personal Loans Medical Emergencies $798 68 $11.74 $1.79 0.47% Reduce budget
App GH - MoMo Agent Stressed Agent $1,148 124 $9.26 $1.17 7.03% Keep
App GH - Salaried Workers Growth $481 67 $7.17 $1.38 0.65% Scale
App GH - Salaried Workers Ad Set V1 $84 2 $41.97 $4.00 3.26% Kill
GH Retargeting - Funnel Cash Ready $497 32 $15.52 $1.28 1.80% Keep
GH Retargeting - Funnel KYC 1 - Copy $93 1 $93.39 5.62% Kill
GH Retargeting - Funnel Finish Sign up $290 6 $48.28 $1.14 4.28% Watch
App GH - Core Acq_Easysave Easysave App promotion $63 5 $12.58 $0.49 2.35% Scale urgently
LN0 = first loan disbursement, tracked via Meta app_custom_event.fb_mobile_purchase. Web campaigns not included — purchase event not firing on web flow.
🇺🇬 Uganda (UG)
Spend
$7,009
LN0s
288
Blended CAC
$24.34
To kill immediately
$993
Social engagement ($705) · Lander traffic ($218) · FidoBiz Copy ($90) · Misnamed GH campaign ($218 — already in social)
Learning phase (copies) — keep
$1,408
Cold Copy ($705, CAC $14.68 — already near target) · Retargeting Copy ($703)
UG Cold Copy outperforming original
$14.68 vs $18.93
Cold Copy CAC already below original — consider killing original once copy is stable
Campaign-level · April 2026
Decision Campaign Spend LN0 CAC CPI CPR Notes
Keep UG App Acquisition - Cold $2,063 109 $18.93 $2.40 $3.46 Kill weak segments inside (Gov workers, Market Traders). Food Vendors best at CAC $9.23
Learning UG App Acquisition - Cold - Copy $705 48 $14.68 $2.41 $3.28 ⚡ Copy already beating original (CAC $14.68 vs $18.93). Consider killing original when stable
Learning UG App Retargeting - Funnel - Copy $703 16 $43.95 $2.58 $3.91 Learning phase. "Finish KYC" ad at CAC $173 — kill that specific ad
Keep UG App Retargeting - Funnel $678 14 $48.46 $2.36 $3.33 Retargeting CAC naturally higher. Kill "Finish KYC" (CAC $100) and "Finish Sign up" (CAC $66)
Scale App UG - Boda Boda Rider $555 61 $9.09 $0.97 $1.27 Best campaign in either account. CAC $9.09, CPI $0.97. Double budget
Kill UG - IG Existing Posts Marketing $487 0 $37.48 0 LN0s. "Testimonial 2" ad: CPR $105
Scale Web UG - Personal Loans - Reg $447 $0.18 2,477 web regs. LN0 not tracked via Meta — see open question
Keep ⚠️ App UG - FidoBiz - LN0 $391 29 $13.47 $1.48 $1.82 Strong performance — before pausing, verify offer being served. Repurpose creative to credit
Kill GH - FB Existing Posts (in UG account) $218 0 $19.85 Wrong account. 0 LN0s
Kill UG Lander · Personal Credit · Traffic (×2) $218 0 6 ads, $218 spend, 0 LN0s, 0 installs, 0 regs
Change UG Retargeting · Bottom Funnel $167 5 $33.46 $3.98 $5.77 Kill "Lapsed Borrowers" ad (CAC $73.68). Keep "Signed Up, No KYC" (CAC $23.79)
Keep Web UG - Food Vendor Awareness $126 $0.67 Good segment-specific web CPR
Kill App UG - FidoBiz - LN0 - Copy $90 4 $22.49 $1.70 $2.09 Product discontinued
Scale App UG - Credit {App purchase} $33 2 $16.26 $0.88 $0.99 CPR $0.99 — only $33 spend. Scale to $300 immediately
TOTAL $7,009 288 $24.34
UG App Acquisition - Cold · audience segment breakdown
Segment Spend LN0 CAC CPI Action
Food Vendors $129 14 $9.23 $1.23 Scale
Nurses $49 5 $9.75 $2.03 Keep
Boda Boda Riders $213 11 $19.39 $2.45 Keep
Motorcycle $377 22 $17.16 $2.84 Watch
Broad Kampala + major towns $562 28 $20.05 $2.60 Watch
Teachers $510 23 $22.17 $2.46 Reduce
Transport workers $31 2 $15.64 $3.91 Reduce
Market Traders $170 4 $42.38 $2.23 Kill
Government workers & office staff $19 0 $6.34 Kill
💸 Budget Reallocation
Total freed
~$4,418
1
🇺🇬 App UG - Boda Boda Rider
CAC $9.09 — best campaign in both accounts. "Broken Bike" and "Silent Wallet" are the top ads. Double budget to ~$1,100/mo.
2
🇬🇭 App GH - Core Acquisition_Easysave
CPI $0.49, CAC $12.58 — best CPI in GH on $63 spend. Scale to $500+ to test if it holds at volume.
3
🇬🇭 "Delay" + "UGC Style" in Personal Loans
CAC $9.32 / $9.46 — best app ads in GH. Shift budget from "Medical Emergencies" (CAC $11.74) toward these two.
4
🇺🇬 App UG - Credit {App purchase}
CPI $0.88, CPR $0.99 — only $33 spend. Scale to $300 to validate signal.
5
🇺🇬 UG Cold — Food Vendors segment
CAC $9.23 — standout within Cold. Shift budget away from Market Traders ($42) and Government workers (0 LN0s) into Food Vendors.
6
🇬🇭 "Salaried Workers - Growth" ad
CAC $7.17 — best in the Salaried Workers campaign, yet not the highest-budget ad. Kill "Ad Set V1" (CAC $41.97) and redirect.
🌐 Web Campaign Attribution — Snowflake Investigation
🔴
Web → App attribution chain is broken. 0 LN0s attributable to web campaigns.
Investigated via VIEWS_DATA → CLICKS_DATA → GA4_EVENTS using click_id chain. The link severs at the App Store install boundary — the app's first_open and BE_LOAN_FIRST_DISBURSEMENT events fire without the original web click_id. This is not a query problem; it's a missing instrumentation problem.
Web funnel — what we can and cannot measure (April 2026, GH)
StepVolumeSourceStatus
Web page views (landers) 55,670 VIEWS_DATA Tracked
CTA clicks ("Download App" button) 4,761 CLICKS_DATA (8.5% CTR) Tracked
Web form fills (phone number submission) ~11,789 Meta pixel — "complete_registration" Meta only, not Snowflake
App installs attributed to web click 47 GA4 first_open via click_id referrer 1% of CTA clicks — chain broken
LN0s attributed to web campaigns 0 BE_LOAN_FIRST_DISBURSEMENT via click_id Unattributable
Why the chain breaks
FindingDetail
GA4_EVENTS.CLICK_ID column Never populated — 0 of 16.9M April events have this field set
GA4_EVENTS.REFERRER:"click_id" Only 561 events in April carry a click_id in referrer — 0.003% of all events
Root cause User fills web form → taps "Download App" → goes to Play/App Store → installs. The store install severs the URL chain. App's GA4 events fire fresh, with no memory of the original web click_id
What Meta's $0.07 CPR actually measures Web form fills (phone number submitted on lander) — NOT app registrations, NOT installs, NOT LN0s
How to fix it — options
1
Server-side phone matching (best, no external dependency)
At web form fill: store phone number + click_id server-side. When user registers in app with the same phone → link the LN0 to the original web click. Full funnel becomes attributable in Snowflake.
2
Meta Conversions API — send LN0 event with fbclid
Store the fbclid from the web click server-side at form fill. When LN0 fires (by phone number match), send the BE_LOAN_FIRST_DISBURSEMENT event to Meta Conversions API with the stored fbclid → Meta reports real CAC for web campaigns.
3
MMP deep link attribution (Adjust / AppsFlyer)
Use a Mobile Measurement Partner to create a deep link that survives the app store install (deferred deep link). When the app first opens, it pings the MMP to retrieve the original campaign attribution. Adds cost and SDK dependency.
~
Scale decision on web: hold until fixed
The $0.07–0.18 CPR looks exceptional but measures an unqualified signal. Do not scale web campaigns significantly until server-side phone matching (option 1) is in place and we can verify downstream LN0 quality.