Lead Discovery
Everything starts with an admin entering a target industry (e.g., "HVAC contractor") and a city (e.g., "Houston TX") in the Lead Engine. The system then takes over completely.
-
1SERP Scraping via OxylabsThe Lead Engine builds a Google search query: "HVAC contractor Houston TX". Oxylabs residential proxies fetch the rendered results page, bypassing anti-bot detection. 10–25 businesses are extracted per query.
-
2Parse & NormalizeEach result is parsed for business name, website URL, address, phone. The domain is normalized into a
domain_key(lowercased, www-stripped) for deduplication. -
3Directory Expansion (Optional)A second pass scrapes Yelp, BBB, and Angi for the same category to catch businesses not on page 1 of Google.
-
4Store in LeadReservoirNew leads are inserted into the
LeadReservoirtable. Duplicates are skipped (upsert ondomain_key). Status is set tonew.
Enrichment
A raw lead only has a business name and website. For outreach to work, we need a decision-maker's direct email. Enrichment runs a 3-tier contact discovery pipeline.
-
1Homepage CrawlThe business website is fetched and scanned for phone numbers, email addresses, staff names, and meta description text. Regex and DOM selectors extract structured signals.
-
2Apollo.io People SearchApollo's API searches for people at the company domain — returns names, titles, emails, LinkedIn URLs. Filtered for decision-maker titles: Owner, CEO, President, Manager.
-
3Hunter.io FallbackIf Apollo finds no contacts, Hunter is queried for the most likely email pattern at the domain (e.g., firstname@hvachouston.com). Returns confidence score.
-
4Contact Form (Playwright Fallback)If no direct email is found, Playwright submits a stealth inquiry via the business's website contact form. This is the last resort — low volume.
Result: The LeadReservoir row is updated with contact_email, contact_name, enrichment_status: complete. The lead is now ready for auditing.
no_contact. These are visible in the reservoir but are not automatically released for proposals — admin review is required before any manual outreach attempt.SEO Audit
The SEO audit is the core value driver — it creates the "before" snapshot that makes the proposal feel personalized and data-driven rather than generic cold outreach.
Scores are normalized to a 0–100 composite score stored in target_score. A full audit JSON with all signal details is stored in site_audit_json. Proposals pull directly from this — no re-scraping on every view.
Proposal Generation
When an admin clicks Release in the Lead Reservoir, two things happen simultaneously: a proposal record is created in the database, and an email dispatch begins.
-
1Pathway DetectionDoes the lead have a website? Yes → Migrate pathway (shows their existing site, before/after). No → Rebrand pathway (new website from scratch). The pathway controls which cinematic sections appear.
-
2Subdomain AssignmentA unique vanity subdomain is generated from the company name (e.g.,
hvachouston.brandlift.ai). AProposalrecord is created withsubdomain+lead_id+custom_data(pathway, audit data, brand defaults). -
3AI Copy GenerationGemini 2.5 Flash generates a personalized email subject line and body referencing the business's audit scores, industry, and city. Output is structured JSON to prevent prompt injection.
-
4Proposal Page is LiveThe vanity URL
https://hvachouston.brandlift.aiis immediately accessible — it renders from the database on each visit. No static generation needed.
What the Proposal Contains
| Section | Content | Personalized? |
|---|---|---|
| Hero | Business name, city, industry headline | ✅ Yes |
| SEO Audit Grid | 20-signal audit with score visualization | ✅ Yes — their actual scores |
| Migrate Showreel | Animated "before/after" of their website | ✅ Yes — live screenshot |
| Competitor Comparison | Top 3 competitors in their city ranking higher | ✅ Yes — SERP data |
| Brand Configurator | AI logo gen, tagline gen, color/font picker | Starts generic, user customizes |
| Template Selector | Industry-filtered website template gallery | Industry pre-filtered |
| Domain Transfer | Transfer existing domain or search for new one | Their domain pre-filled |
| Brand Package | Upsell branding add-on | Static |
| Pricing Plans | Launch / Growth / Authority tiers | Static |
Cold Outreach
The email goes out through Instantly.ai — a specialized cold email platform that handles sending schedules, deliverability warming, and bounce management automatically.
SENT.OPENED. Lead is flagged as warm in the reservoir.CLICKED. Admin sees this in the reservoir row's email history column.REPLIED. This is the highest-value event — triggers admin notification for human follow-up.Conversion
The proposal has a built-in pricing selector. When the client is ready to buy, they click their preferred plan — no sales call required.
-
1Plan Selection on ProposalClient sees three tiers: Launch ($499/mo), Growth ($799/mo), Authority ($1,299/mo). Clicking "Select" triggers Stripe Checkout Session creation via /api/stripe/create-checkout.
-
2Stripe Hosted CheckoutClient is redirected to Stripe's secure hosted checkout page. Enters card details. BrandLift never touches raw card data — PCI scope is zero.
-
3Stripe Webhook: checkout.session.completedStripe fires a webhook to /api/stripe/webhook. BrandLift verifies the signature, then automatically provisions the client account.
-
4ClientAccount CreatedA
ClientAccountrow is inserted: email from Stripe, plan tier, portal password (PBKDF2 hashed), active_plan = selected tier. The Proposal record is linked to this account.
Client Onboarding
After payment, the client receives a welcome email with login credentials for their client portal. From here, they complete onboarding at their own pace.
can be a paying client by Friday.