# Lead qualification form with scoring and round-robin routing

Canonical: https://useformwork.com/use-cases/lead-qualification

Updated: 2026-10-09

A lead qualification form that scores each enquiry, shares sales-ready leads between reps in turn, chases first contact and hands leads to your CRM.

A lead qualification form should do more than drop a name into a shared inbox. In FormWork it can score each enquiry, give sales-ready leads to the next rep in turn, flag the ones nobody has called, and hand qualified leads to your CRM. This is a configuration pattern for a fictional software company's demo requests, not a case study; the points and thresholds are examples.

## Why a basic lead form isn't enough

A contact form that emails a sales inbox leaves whoever reads it first to decide what to do. Good leads wait, support requests land in the sales queue, nobody can say which leads were never contacted, and the CRM gets whatever someone copied across. The aim here is that every lead has a score, an owner, a due time for first contact and a recorded outcome.

## Build the lead qualification form

Three pages keep the form short:

1. **About you**: **Name**, work **Email**, an optional **Phone**, job title, and a **Single choice** for their role in the decision (I make the decision, I recommend, I'm researching).
2. **Your company**: company name, website (**URL**), a **Dropdown** for company size and a **Country**.
3. **What you need**: a **Single choice** for the reason (see a demo, talk about pricing, partnerships, support for an existing account), timeline, whether budget is agreed, and a **Long text** for anything else.

Use [conditional logic](/docs/logic/conditional-logic) so that choosing support shows a paragraph pointing to your support page and hides the qualifying questions. [Validation rules](/docs/logic/validation-rules) with **Must not contain** can refuse personal email domains, though that also refuses some genuine sole traders. Turn on **Security check (CAPTCHA)** in [form settings](/docs/forms/form-settings) to keep spam out of the queue.

## Score each lead with a calculated value

Add a **Hidden value** field called Lead score. Respondents never see it. Set its **Default value** to **Calculation**, with one `IF` per scored question added together. For example:

| Question | Points |
| --- | --- |
| Company size | 0 for 1–9 staff, 10 for 10–49, 15 for 50–249, 25 for 250 or more |
| Role in the decision | 20 decides, 10 recommends, 0 researching |
| Timeline | 25 this month, 15 within 3 months, 5 within 6 months, 0 just researching |
| Budget agreed | 20 yes, 10 in progress, 0 no |
| Reason | 10 for a demo or pricing |

Compare against each option's value, not its label. A calculation stays empty until every answer it uses has a value, so make scored questions required or add a `default:0` fallback. The server works the score out each time an answer is saved; see [calculated values](/docs/logic/calculations) and [server-side logic](/product/server-side-logic).

## Set up the sales stages

Entries start in New lead when they are submitted, so half-finished forms never reach the queue. Create an Inbound sales group in **Account settings** > **Team**, then set up the [stages](/product/process) on the **Process** page:

| Stage | Kind | Owner and due time | Actions |
| --- | --- | --- | --- |
| New lead | Open | The Inbound sales group, due within 4 hours | **Meeting booked** to Qualified, **Reached out** to Waiting for reply, **Not a fit** to Not progressed (comment required) |
| Waiting for reply | Waiting | Keep the current owner, due within 5 days | **Meeting booked**, **No response** to Not progressed |
| Qualified | Open | Keep the current owner, due within 2 days | **Send to CRM** (the owner only), **Not a fit** |
| CRM hand-off failed | Open | A Sales operations group, due within 1 day | **Try again** to Sent to CRM |
| Sent to CRM, Not progressed | Closed | None | |

Add three [team fields](/docs/entries/team-fields): Priority (a **Dropdown**), Next step and CRM record ID. Leave [respondent status](/docs/process/respondent-status) off: prospects don't need to see "Not progressed".

## Route leads to the next rep with the Assign step

An automation called Route new leads runs on **Form is submitted**:

1. An **If** with two branches. When the reason is support, **Move to stage** Not progressed with the comment "Support request", **Send email** to your support inbox, then **Stop**. When Lead score **Is less than** 30, move it to Not progressed with the comment "Score below 30" and **Stop**.
2. A second **If**: when Lead score **Is at least** 70, **Update entry or row** sets Priority to High and **Send Slack message** posts it in your sales channel.
3. **Assign**, set to **Next in a group** with Inbound sales. People take turns in the order they joined the group. Keep **Skip people marked away** on, so reps who set **I'm away until** in their profile get no new leads; see [marking yourself as away](/docs/process/owners-due-dates#mark-yourself-as-away).
4. **Send email** to the new owner, using **Use a template** with the owner's email.

If nobody can take the entry, because everyone is marked away or the group is empty, the Assign step fails and the lead stays unassigned in Inbound sales. It shows in each member's [My work](/docs/process/my-work) under **In my groups (unassigned)**, with **Assign to me**. Under **If it fails**, email the sales manager, and set **When it fails** to **Stop, with the run completed**. Keep the default, **Stop and mark the run as failed**, if admins should get the failure email too.

The turn belongs to the group, so every Assign step using Inbound sales shares one rotation. It is strictly in turn and doesn't weigh workload. For territories, use a **Switch** on region with a group and an Assign step for each.

## Chase first contact with In a stage too long

FormWork doesn't email owners when a lead is assigned or becomes overdue, so add reminders. The **Remind the owner when a stage is overdue** template is a starting point.

- **Chase first contact**: **In a stage too long**, in New lead, for longer than 4 hours, matching the due time. An **If** checks for an owner: without one, post in the sales channel; otherwise email the owner and copy the sales manager.
- **Reassign untouched leads**: **In a stage too long**, in New lead, for longer than 1 day, then **Assign** with **Next in a group** and **Send email** to the new owner. Reassigning doesn't reset the due time, so the lead stays overdue.

Each runs once each time a lead enters the stage. Due times and these triggers count calendar time, not working hours, so a lead submitted at 22:00 is overdue by 02:00. Pick times your team can meet, or accept overnight leads showing as overdue in the morning.

## Hand qualified leads to your CRM

A rep selects **Send to CRM** once a lead is qualified. An automation on **Stage changes**, to Sent to CRM, then:

1. **Send to webhook** with **Method** POST, an authorisation header set to **A secret**, and a **Body (JSON)** with the contact, company, score, owner's email and entry ID. Set **Retries** to **Retry 3 times**.
2. **Update entry or row** saves the record ID from the response into the CRM record ID team field. Run **Test this request** against a sandbox first so later steps can pick response fields; the test sends a real request.

If your CRM has an OpenAPI description, an [API connector](/docs/extensions/api-connectors) does the same with test and live environments.

Under **If it fails**, **Move to stage** CRM hand-off failed with a comment, so Sales operations owns the fix and **Try again** resends it. Keep **When it fails** on **Stop and mark the run as failed**, and turn on **Email admins when an automation run fails** in [notifications](/docs/forms/notifications). A timeout can come after the CRM has created the record, so send the entry ID and use the CRM's create-or-update where it has one. See [when a step fails](/docs/automations/steps#when-a-step-fails) and [automation runs](/docs/automations/runs).

## Who can see leads

Everyone in the account can open every lead, whichever rep owns it: groups decide who owns work, not who sees it. Review [team members and roles](/docs/platform/users-permissions) before inviting people.

## Test these cases before you publish

- A support request, a score of exactly 30 and of exactly 70.
- An optional scored question left empty, and the score that results.
- Every member of Inbound sales marked away, and a group with one person.
- A lead submitted late in the evening, and when its reminder arrives.
- A CRM that times out, rejects the request, and accepts a retry.
- **Try again** after a failed hand-off, checking the CRM for duplicates.

## Change it safely

Publish new questions, points, stages and automations as a [new form version](/product/versioned-forms). Submitted leads keep their questions and scores, while the process and automations follow the latest version. Changing New lead's owner or due time asks whether to apply it to leads already there. Group changes take effect at once, and a new rep joins the end of the rotation. See [drafts and publishing](/docs/forms/form-versions).

## What success looks like

Every lead has a score, a named owner or a visible unassigned state, and a recorded outcome: sent to the CRM with a record ID, or not progressed with a reason. Failed hand-offs land with someone who owns them. Set your own response-time targets; this pattern doesn't promise one.

Compare this with [accountancy quotes](/use-cases/accountancy-quotes), see [automations](/product/automations) and [pricing](/pricing), or [talk through your sales process](/#contact).