Most bad solar leads aren't a targeting problem. They're a capture problem. A one-tap form lets anyone through and tells you nothing. Here's the system we use to get quote-ready leads instead: the ad, the landing page, a multi-step survey, tracking that teaches Meta what a good lead looks like, and the exact tech stack and prompts to build it yourself.
Most solar leads come from one of two places: a lead seller who sells the same enquiry to three or four installers, or a Meta instant form that fills itself in from the person's Facebook profile. Both have the same flaw. The homeowner never had to think.
An instant form is one tap. People submit it while scrolling, forget they did, and don't answer when you call. You get a name, a number and maybe a postcode. You don't know if they own the home, what their bill is, whether they already have panels, or if they're buying this year or just curious.
So you spend the first ten minutes of every call qualifying, half the calls go nowhere, and Meta keeps sending you more of the same people, because as far as it can tell, every one of those taps was a success.
Better leads don't come from better targeting. They come from asking better questions before the lead reaches you.
If you're comparing lead sources, our breakdowns of exclusive vs shared solar leads and what solar leads cost in Australia cover the economics. This guide is about the build.
Each step does one job. The ad earns the click. The landing page earns the start. The survey does the filtering and collects what you need to quote. Tracking tells the ad platform which people turned into real leads, so it finds more of them. And the CRM gets the whole picture the moment the lead lands, so you or an AI SMS can reply while they're still on the page.
None of it is new technology. What's different is that every step is built around one idea: make the lead tell you who they are before you pay attention to them.
Run the ad with a website conversion objective, not lead forms. You want the click to go to your own page, where you control the questions, not to an instant form Meta fills in for them.
For more on why ads that worked last month stop working, see why Meta creative testing feels like gambling.
The landing page exists to get the survey started. Everything else is a distraction.
This is the part that does the work. A LeadsHook-style survey asks one question per screen, answered with big tap buttons, with contact details at the very end. It feels like a quiz, not a form.
It sounds backwards, but a well-built survey often converts as well as a short form, and the leads are far better. Here's why:
| # | Question | Answers |
|---|---|---|
| 1 | What are you interested in? | Solar / Battery / Solar + battery / Not sure yet |
| 2 | Do you already have solar? | No / Yes, panels only / Yes, panels + battery |
| 3 | How old is your system? (only if they have solar) | Under 5 / 5 to 10 / 10 to 15 / 15+ years |
| 4 | What's your feed-in tariff? (only if they have solar) | Free text, or "Not sure" |
| 5 | Average quarterly power bill? | Under $300 / $300 to $600 / $600 to $1,000 / $1,000+ |
| 6 | Do you own the home? | Own outright / Mortgaged / Renting (ends the survey) |
| 7 | What type of property is it? | Freestanding house / Townhouse or duplex / Apartment / Commercial |
| 8 | When are you looking to install? | ASAP / 1 to 3 months / 3 to 6 months / Just researching |
Then, and only then: name, email, phone and postcode.
Every lead arrives knowing what they want, their current system, their bill, that they own the home and when they want it done. That's what we call quote-ready: you could rough out a quote before you dial. Our guide to high-quality solar leads goes deeper on what makes a lead worth calling.
After the contact step, offer an optional upload: "Got your last power bill handy? Upload it and we'll size your system properly." Make it clearly optional, and never block the lead on it.
Not everyone will do it. The ones who do are the most motivated leads you'll get, and the bill gives you usage, tariff and retailer before you call. Store uploads in a private storage bucket, only accessible to your team, and say so in your privacy policy. A power bill has a name, address and account number on it.
This is the step most people skip, and it's why their ads keep finding tyre-kickers. Meta optimises for whatever event you tell it is a success. If that event is "tapped submit on a form", it finds people who tap submit. If it's "finished an 8-question survey as a homeowner", it finds those people instead.
PageView on load and Lead only when the full survey and contact step are submitted. Not on the first question.Lead event server-side from your backend, with hashed email and phone and the same event_id so Meta de-duplicates it.fbclid and the UTM tags from the URL and store them on the lead, so every lead traces back to the ad that produced it.The survey filters the leads you get today. The tracking changes who Meta shows your ads to tomorrow. Together, lead quality gets better over time instead of worse.
Running Google too? The same idea applies: conversion tracking on the finished survey, with enhanced conversions. Our Google vs Meta comparison covers when each one makes sense.
A quote-ready lead goes cold fast. The homeowner who just finished your survey is probably filling in a competitor's too. An automatic SMS within seconds ("Thanks Sarah, got your details. Is now a good time for a quick call about the battery?") keeps them warm, and an AI agent can confirm their details and book the call before a human picks up the phone.
The data on this is consistent. See why lead response time matters for the numbers.
You don't need a funnel builder subscription. A survey funnel is a fast static page plus a small backend, and the tools are free or close to it.
Lead event fires if you prefer a confirmation page.Never put an API key in the page. Anything in index.html can be read by anyone. The page sends the lead to your Supabase Edge Function, and the function, which holds the keys, posts it to your CRM and Meta. That's why the stack has a backend at all.
Open Claude Code in an empty folder (or your GitHub repo) and give it something like this. Swap in your business details.
Build a mobile-first solar lead funnel as a static site for
GitHub Pages. Business: Sunny Coast Solar, Sunshine Coast QLD.
Brand colour #F59E0B, dark background, modern sans-serif.
Pages: index.html, thank-you.html, privacy.html, terms.html.
Plain HTML, CSS and vanilla JS. No frameworks, no build step.
index.html
- Headline: "See what solar and a battery would save you."
- One line of proof under it, then the survey straight away.
- A LeadsHook-style survey: one question per screen, big tap
buttons with icons, a progress bar ("Step 3 of 8") and a
Back link. Auto-advance on tap.
- Questions, in order:
1. What are you interested in? Solar / Battery /
Solar + battery / Not sure yet
2. Do you already have solar? No / Yes, panels only /
Yes, panels + battery
3. (only if they have solar) How old is your system?
Under 5 / 5-10 / 10-15 / 15+ years
4. (only if they have solar) Feed-in tariff? text, or Not sure
5. Average quarterly power bill? Under $300 / $300-600 /
$600-1,000 / $1,000+
6. Do you own the home? Own outright / Mortgaged / Renting
- Renting ends the survey with a friendly "sorry, you need
to own the home" message. No lead is sent.
7. Property type? Freestanding house / Townhouse or duplex /
Apartment / Commercial
8. When are you looking to install? ASAP / 1-3 months /
3-6 months / Just researching
- Final step: first name, last name, email, mobile, postcode,
with a consent checkbox for calls, SMS and email. Validate an
Australian mobile and a 4-digit postcode.
- Optional power bill upload (PDF or photo) after the contact
step, clearly marked optional.
- Capture fbclid and utm_* from the URL and include them.
- Add Cloudflare Turnstile (site key: TURNSTILE_SITE_KEY).
- On submit, POST JSON to SUPABASE_FUNCTION_URL with every
answer, contact details, tracking and an event_id (UUID).
Then fire fbq('track', 'Lead', {}, {eventID: event_id}) and
go to thank-you.html. Never put API keys in the page.
- Meta Pixel ID: PIXEL_ID, PageView on every page.
privacy.html: an Australian Privacy Principles style policy
covering what we collect, the Meta Pixel and Conversions API,
bill uploads stored privately, SMS follow-up, and how to request
access or deletion. Contact: hello@sunnycoastsolar.com.au.
terms.html: simple website terms of use.
Then write a Supabase Edge Function (TypeScript) that receives
the POST, verifies Turnstile, saves the lead to a "leads" table,
stores the bill in a private bucket, sends the Lead event to the
Meta Conversions API (hashed email and phone, same event_id) and
forwards the lead to my CRM. Give me the SQL for the table.
Claude Code will build the pages, show you the files and explain how to deploy them. Review the copy, check it on your phone, and push it to GitHub. Treat the privacy policy and terms it writes as a first draft to check, not legal advice.
Almost every CRM accepts new leads over an HTTP POST: a webhook URL, or an API endpoint with a key. Your Edge Function sends something like this:
POST https://api.your-crm.com/v1/leads
Authorization: Bearer YOUR_CRM_API_KEY
Content-Type: application/json
{
"first_name": "Sarah",
"last_name": "Nguyen",
"email": "sarah@example.com",
"phone": "0412345678",
"postcode": "4556",
"source": "Meta - Battery retrofit",
"custom_fields": {
"interested_in": "Solar + battery",
"existing_solar": "Yes, panels only",
"system_age": "10-15 years",
"feed_in_tariff": "44c",
"quarterly_bill": "$300-600",
"ownership": "Own outright",
"property_type": "Freestanding house",
"timeframe": "1-3 months",
"bill_url": "https://.../signed-link"
},
"tracking": { "fbclid": "...", "utm_campaign": "..." }
}
Every CRM names its fields differently, and that's where Claude Code earns its keep. Give it your CRM's API documentation (paste the "create a lead" or "create a contact" page, or the link) and ask it to map the survey answers to your CRM's fields, including any custom fields you've set up. Then test with one fake lead, check it lands in the CRM with every answer, and you're live.
Fewer total submissions than a one-tap instant form, usually. But far more usable leads, because the ones who finish are real homeowners who told you what they want. With tap answers, branching and contact details last, a well-built survey often converts about as well as a short form.
Around 8 tap questions, plus contact details. That covers everything a quote needs. Past that, each extra question costs more completions than the answer is worth.
A landing page with a survey, if lead quality matters. Instant forms are cheap per lead because they're easy to submit, and that's exactly the problem: they're easy to submit without meaning it.
Yes. The Pixel alone misses a meaningful share of conversions because of ad blockers and browser privacy settings. CAPI sends the same events from your server, so Meta sees more of your real leads and optimises better.
With Claude Code, mostly yes. It writes the pages, the backend function and the CRM mapping from a plain-English brief. You'll still need to set up the accounts (GitHub, Supabase, your domain, Meta) and test it properly before you spend on ads.
We build this exact system on your own ad account and your own domain, ready to go live within 48 hours of access, then hand it over in your name. 10 quote-ready leads in your first 30 days, or we keep working for free until you have them.
Your ad accounts Your domain No lock-in