A form fill measures volume. Qualification tells you which variants bring the leads you want, and CRM stages tell you what happened after the form: who was contacted, booked and won. granvl keeps two separate signals on every lead:
Qualified: did the lead match what you're looking for? Your rule sets it at submit. Your CRM or your agent can change it later.
Outcome: the furthest pipeline stage the lead reached, reported by your CRM (or set by hand).
A lead can be qualified and Lost, or not qualified and Booked. Both are kept, and the Leads tab flags the difference.
Set a qualification rule
Open the funnel and select the Settings tab, then Qualification.
In the Qualification rule card, choose Match all conditions or Match any condition.
Select + Add condition, then pick a field, an operator and a value. Fields and answers come from your funnel's forms.
To mix logic, select + Add group. A group uses the opposite combinator, and groups nest up to 5 levels.
Select Save changes.
Operator | Use it for |
equals, does not equal | One answer |
is one of, is not one of | A list of answers (pick them from the form's options) |
contains | Text that includes a word |
is greater than, is greater than or equal to, is less than, is less than or equal to | Numbers such as a balance or budget |
is answered (truthy), is empty (falsy) | Whether the question was answered |
Before saving, use Test against sample answers to see whether a sample lead comes out Qualified or Not qualified. It runs the unsaved rule in your browser and sends the sample nowhere. Clear rule removes the rule.
The rule runs when the visitor submits. A lead with a missing or invalid answer counts as unqualified. With no rule, every lead counts as unqualified for routing, and the Qualified numbers stay blank.
Your agent sets rules with set_qualification_rule and reads them with get_qualification_rule. set_funnel_form_fields declares each question's answer options so the rule builder can offer them.
Choose how unqualified leads are treated
The Qualification section has these settings. Each takes effect when you select Save changes.
Setting | Default | What it does |
Stats display | Total leads | Which conversion totals the funnel shows: Total leads, Qualified only, or Both total and qualified. |
Route by qualification | Off | Sends qualified and unqualified leads to different thank-you pages. Needs two thank-you pages. Pick a Qualified thank-you page and an Unqualified thank-you page. Off sends everyone to the default thank-you page. |
Show unqualified leads in stats | On | Off hides unqualified conversions from the funnel's numbers. Nothing is deleted, so turning it back on shows them again. |
Send unqualified conversions to ad platforms | Off | Off stops server-side conversion events (Meta Conversions API, GA4, TikTok) for unqualified leads, so ad platforms learn from the leads you want. granvl's own analytics still record them. |
Count thank-you page views as conversions | Off | Counts a visit to the thank-you page as a conversion. Use it when the form is a third-party embed that redirects to your thank-you page. |
Your agent can change the two unqualified-lead switches with set_qualification_settings.
Track outcomes from your CRM
Every lead your forms send carries a hidden granville_lead_id. Store it on the contact in your CRM. When the lead moves through your pipeline, your CRM posts the id and its own stage name back to granvl, and the outcome attaches to the variant that produced the lead.
Get the postback URL
Each domain has its own postback URL. It only accepts leads from funnels on that domain.
Go to Settings > Domains and select Manage on the domain.
Open the CRM Quality tab.
Under Postback URL, select Copy.
Rotate creates a new URL, and the old one stops working immediately. Your agent can get the URL with get_qualify_webhook_url (pass the domain).
Funnels without a domain use a workspace URL. Create it from the funnel's Settings > Qualification section under Outcome webhook: select Create URL and copy it right away, because it's shown only once. New URL replaces it and the old one stops working.
Send updates from your CRM
Set up an automation in your CRM that runs when a deal or opportunity changes pipeline stage. It sends a POST request to the postback URL with the header Content-Type: application/json and a body like this:
{ "lead_id": "<granville_lead_id>", "stage": "Appointment Booked", "value": 1200 }
Field | Required | What to send |
| Yes | The |
| One of | Your CRM's own pipeline stage name, as it appears in the CRM. |
| One of |
|
| No | Deal amount. |
| No | A short note, such as why a deal was lost. |
For HubSpot, send the stage label rather than its internal id, or map the ids in CRM Quality.
Map your CRM's stage names
The first time your CRM sends a stage name, it appears in the domain's CRM Quality tab. Common names map themselves. Any other name stays unmapped and doesn't count until you map it.
Go to Settings > Domains, select Manage, then open CRM Quality.
For each row under CRM sends, choose a stage in granvl stage, or choose Ignore to drop the name from reporting.
Select Save mapping.
Mapping a name also updates every past lead that carried it. To set up a stage before your CRM sends it, type it in Add a name and select Add. Every funnel on the domain shares the map, and the funnel's Qualification section shows it with a Manage on domain link. Your agent can map names with set_domain_crm_stages.
granvl's lead stages
Stage | Meaning |
Contacted | Someone reached out: a call attempted, a text or email sent. |
Conversation | A real two-way exchange happened. |
Booked | Appointment or meeting scheduled. |
No show | Booked but didn't turn up. Can still be rebooked. |
Held | The appointment or meeting took place. |
Quoted | Estimate, proposal or application sent. |
Won | Closed, sold, funded or paid. Carries the deal value. |
Bad contact | End state. Wrong number, fake or unreachable: the form attracted junk. |
Not a fit | End state. A real person your rule should have screened out. |
Lost | End state. A real prospect who chose not to buy. |
Progress stages run in the order above, and leads only move forward: a late Contacted update doesn't undo Booked. An end state stops the lead, and only Won can move it again.
When an update includes a stage but no qualified value, the stage sets it: Conversation and later stages (including No show and Lost) mark the lead qualified, Bad contact and Not a fit mark it not qualified, and Contacted leaves it as it was.
Mark a lead or record a sale from your agent
mark_lead_qualifiedmarks a single lead qualified or not qualified, with an optional stage, deal value and note. It overrides the rule's result, and a later update from your CRM overrides it.record_external_conversionreports a conversion that happened somewhere else, such as a sale on your store or a booked call. granvl adds agv_cidclick id to outbound links on your pages; send it back with the conversion and it's credited to the variant that sent the visitor and forwarded to the funnel's ad platforms. Repeat calls with the sameexternal_idare ignored, so retries are safe.
Read lead quality
Lead quality on the Analytics tab
The funnel's Analytics tab has a Lead quality section for the selected period (form submissions, bots excluded).
Number | What it counts |
Leads | Form submissions in the period. |
Qualified | Leads marked qualified, by your rule at submit or later by your CRM or by hand. Shows a dash until the funnel has a rule. |
Booked, Won | Leads your CRM reported at that stage or further along. They appear once your CRM has reported them. |
Rates divide by all of the variant's visitors. Leads are grouped by submission date, so outcomes your CRM reports later still count toward the period the lead came in.
Once your CRM reports outcomes, two more views appear:
CRM outcomes shows, for each variant, how many leads reached each stage. Stage counts include leads that went further (a Won lead also counts as Booked and Held), and end states are shown separately. Leads your CRM hasn't reported on are not counted as Lost. Columns hides stages you don't use (for every funnel on the domain).
Lead outcome shows the share of each variant's leads that reached each stage. Closed is Won divided by leads.
If a variant's qualified rate and booked rate are far apart, a note suggests your rule may need review.
Pick the leading metric
Leading metric chooses the rate the funnel compares variants on. The leading variant gets a Leading label. It's an observed rate, not a confirmed test winner.
Automatic: picks the best signal the funnel has. Won rate once any lead is won, then Booked rate once any lead reaches Booked or later, then Qualified rate once you have a rule, otherwise Conversion rate.
Conversion rate · filled the form
Qualified rate · passed your rule
Booked rate · appointment set
Held rate · appointment held
Won rate · deal closed
Options stay unavailable until the funnel has that data. Your agent can set it with update_funnel (leading_metric).
The Qualified column in the variants table on the Overview tab shows each variant's qualified count.
The Leads tab
The Leads tab lists each submission's answers (never contact details) for 180 days.
Column | What it shows |
Qualified · Rule | Qualified, Not qualified, or Not evaluated when no rule ran. |
Outcome · CRM or manual | The furthest stage reported, and who reported it. Awaiting CRM update until the first report. A stage name that isn't mapped yet shows UNMAPPED. |
Updated | When the outcome last changed. |
Delivery | Whether the lead reached your destinations (see Set up forms and lead delivery). |
Lead source | The visit's UTM source and campaign. |
Filter by Variant, Delivery, Verification, Outcome and Differences. Rule / CRM differ shows leads where the qualified result and the reported stage disagree, for example a lead marked not qualified that reached Booked. Select a lead to see every answer, which contact fields were present (names only), delivery per destination and the visit's UTMs. Export CSV downloads every lead that matches your filters.

