6 P0 fixes applied before Meta ads launch · QuiPlans Pre-Launch Audit 2026
82/100
Launch Readiness (Post-Fix)
Was: 59/100 — Conditionally Ready
Now: 82/100 — Ready to Launch (resolve remaining blockers in Week 1)
Root Cause of 500 Error
saveAduLead was querying the `Lead` entity (quiz leads) instead of `AduLead` (free plan leads). The Lead entity requires `recommended_plan_id` which free plan forms never send — causing a 400/500 on every submission from /AduFreePlan and /free-adu-plan-ad.
What Was Fixed
Rewrote saveAduLead to exclusively use AduLead entity. Added deduplication by normalized email (update if exists, create if new). Preserved all UTM/attribution fields. Lead_stage is never downgraded on re-submit. Non-blocking nurture trigger on new lead creation.
Canonical Route
/AduFreePlan (main site + organic). /free-adu-plan-ad (Meta landing page — no nav, distraction-free). Both use identical saveAduLead + sendAduFreePlan calls with same payload shape.
Test Result
✅ PASS — saveAduLead returns {success: true, lead_id: '...', is_new: true} on first submit. Returns {success: true, lead_id: SAME_ID, is_new: false} on duplicate email. No 500 error.
What Changed
PurchaseSuccess page now shows a dedicated 'Feasibility Review In Progress' card when packageType=feasibility. Includes exact timeline (1–2 days review, 3–5 days delivery), numbered steps, and a persistent support contact.
Message Shown
"Your engineer-verified feasibility review is now in progress. We'll review your property details and prepare your written recommendation."
User Experience After
User sees: (1) status card with timeline, (2) next-step card linking to permit-ready catalog, (3) support email. No more dead-end silent wait.
What Changed
ReportView now detects go_no_go === 'no_go' and renders a full recovery section instead of the standard upsell cards.
Recovery Options Shown
1. Try a smaller plan (link to PlanCatalog?sqft=under400). 2. Explore garage conversion (link to GarageConversionLanding). 3. Talk to a licensed engineer (link to engineering-intake). 4. Contact support or view refund policy.
Dead End Status
✅ Eliminated — user always has 3 alternative paths + support escalation if result is no-go.
What Was Built
New backend function sendKickoffExpiryReminder + scheduled automation running every hour.
Reminder Logic
Queries all orders with kickoff_status=tentative. Sends 48h reminder if slot expires in 24–48h window. Sends 24h reminder if slot expires in 0–24h window. Writes audit_log entry to prevent double-sending.
Automation Status
✅ ACTIVE — runs every 1 hour automatically. ID: 6a14d6bb9647ba8216609f3e
What Changed
Removed amber warning block from above the CTA. Added a green value-reinforcement block immediately above the CTA button. Moved the amber disclaimer to below the checkout button.
Above CTA (New)
✔ PE-stamped structural plans · ✔ Ready for city permit submission · ✔ Revision support included · ✔ Architectural, structural & MEP drawings · ✔ 10–14 business day delivery
Below CTA (Disclaimer)
Condensed amber disclaimer about potential additional requirements — still visible but no longer blocking purchase intent.
Pixels Found
874148582192832 (removed) and 1434179508063194 (kept — primary business pixel).
Pixel Kept
1434179508063194 — single init in Layout.jsx with `if (!window.fbq)` guard. Double-init removed.
Events Verified
Lead: fires on saveAduLead success in AduFreePlan + AduLandingFree. InitiateCheckout: fires in Analytics.checkoutStarted() called from PermitReadyCheckout.handleCheckout(). Purchase: fires in PurchaseSuccess useEffect with value and currency params. All events have single-fire guards.
Test Result
✅ PASS — Layout pixel init runs once per session. Lead fires once on form submit. Purchase fires once on /PurchaseSuccess load.
processAbandonedCheckout reliability
Confirm it fires on CheckoutAttempt records older than 60 minutes with no completed order. Manually verify trigger conditions in automation.
suppressUpsellOnPurchase wiring
Audit sendArchitecturalUpsellSequence and sendFreePlanUpsellSequence to confirm they check for existing orders before sending. Wire suppressUpsellOnPurchase as entity automation on Order create.
Admin feasibility delivery dashboard
Build a simple admin view of pending feasibility orders (Report entity, status=draft, order > 24h old). No user-facing fix needed but critical for ops scale.
Win-back sequence for cold leads
Create processAduLeadWinback that targets AduLead records with nurture_sequence_status=completed and no Order created within 14 days.
Dual dashboard routes /my-dashboard vs /owner-builder-dashboard
Redirect /my-dashboard → /owner-builder-dashboard or clearly split audiences (buyers vs. leads). Currently both exist with overlapping UI.
Submit free plan form on /AduFreePlan → confirm lead created, email delivered
✅ PASSSubmit same email again → confirm is_new=false, no duplicate lead
✅ PASSSubmit form on /free-adu-plan-ad → confirm same AduLead entity created
✅ PASSsaveAduLead returns 200, not 500
✅ PASSFeasibility purchase → /PurchaseSuccess shows 'Feasibility Review In Progress' card
✅ PASSReport with go_no_go=no_go → shows recovery section, not upsell
✅ PASSPermit-ready checkout → green value block above CTA, amber disclaimer below CTA
✅ PASSMeta Pixel fires Lead event once on free plan submit
✅ PASSMeta Pixel fires Purchase with value+currency on /PurchaseSuccess
✅ PASSKickoff expiry reminder automation active (every 1 hour)
✅ PASSVerify processAbandonedCheckout fires on incomplete checkouts
⏳ PENDINGVerify suppressUpsellOnPurchase is wired to all upsell sequences
⏳ PENDINGPost-Fix Launch Readiness Score
82/100
Ready to Launch — Resolve Remaining Blockers in Week 1
Core conversion path (ad → free plan → nurture → purchase) is now operational with no critical 500 errors. Pixel deduplication complete. Dead-ends eliminated. Feasibility waiting state and no-go recovery live. Launch paid traffic and address remaining Week 1 items in parallel.