Website Lead Capture: Formats, Payload, and Consent
Website lead capture is a data contract, not a form design: every entry point must emit the same minimum payload of 6 elements, an identity signal, a channel, a source, a timestamp, the request itself and consent evidence. A form that collects more fields than that buys you nothing and costs you replies.
Want this checked on your own site? Run the free AI visibility check, or order the full audit.
Website lead capture is the moment a stranger becomes a record somebody can act on. Most advice about it is design advice: shorten the form, add proof, test the button, remove a field. That advice ends at the submit event, which is exactly where operations begins. The systems that come next do not care how the form looked. They care about what arrived with the submit.
That gap explains a common pattern. A team shortens the form on somebody’s recommendation, conversion looks better for a month, and then routing has nothing to route on, the qualification bot asks questions the form used to ask, and the source report collapses into one bucket called direct. The format decision and the payload decision are the same decision, and treating them separately is how capture quietly breaks everything downstream.
This guide owns capture formats, the entry payload contract, progressive capture, and consent at the point of entry. It does not own the source vocabulary, which belongs to inbound lead attribution, or the script that runs after the request lands, which belongs to AI lead qualification.
In one sentence
Website lead capture is a data contract, not a form design: every entry point must emit the same minimum payload, meaning an identity signal, a channel, a source, a timestamp, the request itself, and consent evidence, and the format you choose only changes how you collect that payload, never whether it exists.
What does a capture point actually have to produce?
Ask the question backwards. Instead of “what should we ask the visitor”, ask “what decision runs in the next ten minutes, and what does it read”.
Routing needs an identity and something to route on. The response clock needs a capture timestamp that does not depend on when the CRM write succeeded. Qualification needs the request text. Attribution needs the parameters that were present on the page. Deduplication needs at least one strong key. Compliance needs proof of what the person agreed to. That list, not aesthetics, sets the floor for every entry point on the site.
The visible symptom of a broken floor is response lag. A Harvard Business Review audit published in 2011 covered 2,241 US companies and found a median first response of about 42 hours among the firms that answered at all. That study is old and describes one sample, so read it as a picture of unmanaged inbound handling rather than a current benchmark. What it illustrates still holds: when nothing in the captured record forces an action by a specific time, nothing happens on time.
| Downstream decision | What it reads from capture | Failure when capture omits it |
|---|---|---|
| Deduplication | Normalized email, phone, company domain | One buyer becomes three records |
| Routing | Region, segment hint, language, product interest | Everything lands in one queue |
| Response clock | Capture timestamp and channel | Integration delay hides inside the SLA |
| Qualification | Free-text request, page context | The bot re-asks what the form asked |
| Attribution | Landing URL, referrer, campaign parameters | Paid channels look worthless |
| Follow-up | A contact method that was verified as usable | Sequences send into nowhere |
| Compliance | Consent wording, version, timestamp | No defensible record of permission |
Which capture format fits which buyer?
There are four formats in practice: the form, the live chat or bot, the scheduler, and the direct message link. Each is good at something specific and weak at something specific, and the weaknesses are what you have to compensate for in the payload.
| Format | Strong at | Weak at | Payload risk to compensate |
|---|---|---|---|
| Form | Structured fields, asynchronous teams, complex requests | Cold traffic that is still comparing options | Almost none, this is the baseline |
| Live chat or bot | Short questions, cutting hesitation at the decision moment | Long specifications, unstaffed hours | Conversation can end with no contact method |
| Scheduler | Buyers who already decided to talk | Anyone who needs a gate before the meeting | Booking fields are often thinner than your form |
| Direct message link | Mobile traffic, buyers who live in messengers | Structured data, thread continuity | The browser context is lost at the jump |
None of these formats converts better than the others in general. Comparisons published as universal numbers ignore traffic mix, offer, price point, and whether anyone was staffing the channel at the time. Treat the comparison above as a description of mechanics, not a ranking.
The most common mistake is running all four with no shared contract. A visitor who books a meeting produces one shape of record, a visitor who writes on a messenger produces another, and the person building the weekly report ends up reconciling four vocabularies by hand.
How do buyer intent and staffing decide the format?
Two inputs decide, and neither of them is fashion.
The first is where the buyer is. Someone comparing three vendors will not book a meeting; they want to describe their situation and get an answer. Someone who read the pricing page twice and returned on a Tuesday morning is ready to talk now and a form is friction. Someone on a phone at a construction site will not fill in five fields but will send a message from an app already open.
The second is staffing reality. A chat widget with nobody behind it converts a warm visitor into an unanswered greeting. A scheduler with a stale calendar books a slot nobody attends. Every format you turn on is a promise about availability, and a promise you cannot keep at 8pm on Friday should not be visible at 8pm on Friday.
| Situation | Reasonable primary format | Why | What must be true |
|---|---|---|---|
| Complex B2B request, small team | Form | Structured input, answered when someone is free | Response commitment stated on the page |
| High-intent page, staffed hours | Chat or scheduler | The buyer is ready now | A named person is genuinely available |
| Mobile-heavy traffic | Direct message link | The app is already open | Message threads reach the same hub |
| After hours or holidays | Form with a stated response window | An honest promise beats an empty widget | Chat and scheduler hidden or set to leave a message |
| Qualification gate required | Form, then scheduler after qualification | The gate runs before the calendar | Booking link issued only after the gate |
| Existing customer support request | Separate path, not the sales queue | Different owner, different clock | Capture asks whether they are already a customer |
That last row is worth building early. A support request routed into the new-business queue burns a rep’s time and delays an actual customer, and the only thing standing between you and that outcome is one field asked at capture.
What is the minimum payload every capture must emit?
This is the contract. It applies identically to a form, a chat transcript, a booking, and a message thread. If a format cannot produce a field, the format owner has to say how it will be filled in later, before the entry point goes live.
| Field | Type | Where it comes from | Required at capture |
|---|---|---|---|
| Event id | Stable string | Generated at the entry point | Yes |
| Capture timestamp | Timestamp with time zone | Server side, not the browser clock | Yes |
| Channel | Controlled value | The entry point itself | Yes |
| Entry point id | Controlled value | Registry of forms, widgets, links | Yes |
| At least one contact method | Email or phone, normalized | The visitor | Yes |
| Request text | Free text or transcript | The visitor | Yes, even if short |
| Landing URL and referrer | URL | Page context at submit | Yes |
| Campaign parameters | Key and value set | Page context at submit | Yes when present |
| Consent evidence | Structured record | Capture endpoint | Yes where applicable |
| Name | Text | The visitor | Recommended |
| Company or domain | Text | The visitor or the email domain | Recommended |
| Region or country | Controlled value | Asked, or derived and marked derived | Recommended |
| Company size, industry, revenue band | Various | Enrichment or the first reply | No |
Three rules keep this contract honest. Every value that drives a decision arrives as a controlled value or gets normalized at the endpoint, never as free text a report has to clean later. Every derived value is flagged as derived, so a routing rule can decide whether to trust it. And a missing optional field is stored as absent, not as an empty string, because a later enrichment step needs to know the difference between unknown and deliberately cleared.
Platform requirements sit underneath this contract. Salesforce documents lead assignment rules that evaluate entries in order and hand unmatched records to a default owner, and HubSpot documents lead pipeline automation where progression follows recorded activity. Both behaviors assume the record arrived with enough on it to evaluate. Check the current documentation for your own instance, then work backwards to what capture has to send.
What can you collect without asking, and what does it cost?
Some of the payload is available from page context, which is why the payload floor does not translate into a longer form. Google’s analytics documentation on traffic source dimensions describes the difference between session-scoped and user-scoped source data, which matters here for one practical reason: what the analytics tool knows is not automatically what your capture endpoint knows. If you want the source on the lead record, capture has to read it and send it.
| Signal | Available without asking | Reliability caveat |
|---|---|---|
| Landing URL and page path | Yes | Lost on a same-page widget unless read explicitly |
| Referrer | Usually | Stripped by some privacy settings and apps |
| Campaign parameters in the URL | Yes when present | Absent on direct and organic visits |
| First-touch page, session entry | Yes, with first-party storage | Cleared by private browsing and cookie policies |
| Device type and browser language | Yes | A language hint, not a stated preference |
| Approximate region from IP | Yes | Directional only, marked as derived |
| Company from IP or enrichment | Sometimes | Unreliable for small companies and remote workers |
| Consent state | Only if you record it | The one field nobody can reconstruct later |
Capture records these parameters. It does not decide what they mean. The vocabulary, the first-touch versus latest-touch model, and the rules for correcting a wrong source are governed in inbound lead attribution, and a capture endpoint that invents its own source values is the most common way that governance gets bypassed.
How should progressive capture actually work?
Progressive capture means splitting the questions across time instead of stacking them into one form. The split is not arbitrary. A question belongs at the entry point only if a decision in the next few minutes depends on it.
| Ask now, at the entry point | Ask after the first reply | Never ask on a public form |
|---|---|---|
| A contact method that works | Company size and structure | Current budget as a free-text number |
| What the person needs, in their words | Timeline and decision process | Internal politics or incumbent vendor |
| Region or country when it routes | Technical environment and integrations | Personal data with no operational use |
| Whether they are already a customer | Who else is involved in the decision | Anything you already know from enrichment |
| Product or service of interest | Preferred meeting time | Anything nobody has ever read afterwards |
| Consent where applicable | Detailed requirements and volumes | Speculative fields added “for later analysis” |
The middle column is where most teams leak value. They ask everything at the entry point because nobody owns the follow-up conversation, so the form becomes the only chance to learn anything. Fix the follow-up and the form gets shorter without losing data. That mechanism is the subject of the lead follow-up system.
The right column deserves a rule of its own: delete any field nobody has read in the last quarter. Ask an operations person to open the last fifty records and say which fields changed a decision. Fields that changed nothing are pure friction, and they are also stored personal data you now have to protect and eventually delete.
One caution on multi-step forms. Splitting one form into three screens is not progressive capture; it is the same questionnaire with more chances to abandon. Real progressive capture means the second set of questions is asked in a different conversation, by a person or a bot, after you have already replied once.
How do you capture consent as evidence rather than as a checkbox?
A checkbox state is a boolean sitting in a field. Six months later it tells you nothing about what the person saw. Evidence is a record of the interaction, and it is the only thing that helps when someone asks what exactly they agreed to.
| Element to store | Why it matters |
|---|---|
| Exact wording displayed | The text changes over time and the old text is what applied |
| Policy version identifier | Links the record to a specific published document |
| Entry point id and page URL | Different pages show different notices |
| Timestamp with time zone | Establishes when permission started |
| What the person did | Ticked, left unticked, or a separate action entirely |
| Purpose or purposes shown | Contacting about a request is not the same as marketing |
| Method of capture | Form field, chat message, checkbox, verbal on a call |
| Withdrawal events | Append only, never overwrite the original record |
Two design rules follow from that table. Store consent as an append-only history rather than a single current-state field, because a merge or a re-submission must never erase the earlier evidence. And keep the operational contact permission separate from the marketing permission, because the person who asked you a question expects an answer to it and that is a different thing from being added to a newsletter.
Consent mechanics, lawful bases, wording requirements, and retention periods differ by jurisdiction, by the type of communication, and by whether the contact is a consumer or a business. This guide describes what to store so the record is usable. It does not tell you what is lawful where you operate. Have counsel review the wording, the purposes, and the retention rules before an entry point goes live, and have them review it again when you add a channel.
Operator note. Retention has an operational edge that legal review alone will not catch. If your policy says you delete inactive contact data after a set period, but your capture log keeps the raw payload forever “for debugging”, you have two retention policies and only one of them is written down. Decide at capture how long the raw event is kept, separately from how long the CRM record is kept, and put both in the same document.
Which identity signals arrive at capture, and how do they affect deduplication later?
Deduplication runs downstream, and it can only work with the keys capture supplied. This section defines the keys; the matching rules, survivorship, and merge behavior belong to CRM automation for inbound leads.
| Signal at capture | Strength as an identity key | What capture must do |
|---|---|---|
| Email address | Strong for a person | Lowercase, trim, apply one plus-addressing policy |
| Phone number | Strong for a person, shared office numbers aside | Convert to a single international format at the endpoint |
| Corporate email domain | Strong for a company, weak for a person | Store the domain as a separate field |
| Free mail domain | No company signal | Store, but flag as non-corporate |
| Messenger account handle or id | Strong within that channel only | Store the channel-specific id, never as an email |
| Stated company name | Medium | Store raw and normalized side by side |
| First-party visitor id | Useful for stitching sessions | Store, expect gaps, never treat as a person |
| Name alone | Weak | Never a match key on its own |
The practical rule is that normalization happens at the endpoint, not in a nightly cleanup job. A phone written as a local number, with spaces, or with a country prefix omitted is a different string in every report until somebody normalizes it, and by then the routing decision has already been made on the raw value.
Messenger identities deserve their own field. A chat handle is a real identity inside its channel and meaningless outside it, so storing it in the email field to make the record “complete” corrupts matching for every future submission. Keep one field per identity namespace and let the matching layer decide which ones to trust.
How does the capture format change the qualification script that follows?
The script itself, its branching, and its scoring belong to AI lead qualification. What capture decides is the starting position that script inherits.
A long form hands qualification a filled-in structure and a short free-text field, so the script’s job is to verify and go deeper. A chat conversation hands over a transcript with the context already stated in the buyer’s own words, so re-asking the same questions reads as if nobody was listening. A booking hands over almost nothing except an intent to talk, so the qualification either happens in the meeting or has to run in the confirmation flow. A messenger thread hands over a name, a handle, and one line of text.
| Format | What qualification inherits | First move of the script |
|---|---|---|
| Form | Structured fields plus a stated request | Confirm and go one level deeper |
| Chat or bot | A transcript with context in the buyer’s words | Continue the thread, never restart it |
| Scheduler | An intent to meet, thin data | Qualify before or inside the meeting |
| Direct message | A handle and one line of text | Ask one question, then a contact method |
Write this mapping down before you connect a bot, because the most common qualification complaint is a script that asks a buyer for information the buyer already typed into the form thirty seconds earlier.
What are the failure modes of a capture point?
Capture failures are quiet by nature. The visitor saw a confirmation, so nobody complains, and the loss shows up weeks later as a channel that “stopped working”.
| Failure mode | What the visitor sees | Underlying cause | How you detect it |
|---|---|---|---|
| Silent submit | A thank-you message | Webhook timed out, mail landed in spam, required field rejected | Accepted events versus records created |
| Double submit | Nothing unusual | Double click, retry after a slow response | Duplicate suppression count by entry point |
| Bot that captures nothing | A friendly conversation | The flow ended without a contact method | Conversations started versus records created |
| Scheduler with no fallback | An empty calendar | Stale availability, time zone mismatch, all slots taken | Booking page views versus bookings |
| Messenger jump loses context | Nothing unusual | Page parameters do not survive the app switch | Share of messenger leads with no source |
| Script blocked | A form that does nothing | Ad blocker or consent tool blocking the handler | Client-side error rate on the entry point |
| Validation trap | An error they cannot clear | Phone format rejected, required field invisible on mobile | Form starts versus completed submits |
| Wrong owner from the start | A normal reply, days later | Support request captured into the sales queue | Reassignment rate within the first hour |
The silent submit is the one worth rehearsing. Take one entry point, break the destination deliberately, submit a test lead, and watch what happens. If the visitor still sees a thank-you page, if nothing appears in the failure queue, and if nobody is alerted within an hour, you have just reproduced the exact conditions under which a month of leads disappears. Fix it in that order: park the payload where a human can find it, alert somebody by name, and only then decide what the visitor should see.
The scheduler fallback is the second rehearsal. Open your own booking link on a Friday afternoon in a different time zone. If there is no available slot and no alternative path on the page, that visitor has nowhere to go, and the booking tool will report nothing at all because a page view with no booking is not an event anybody looks at.
How do you instrument every entry point?
Instrumentation starts with a registry. Every entry point on the site gets an id, an owner, a destination, and a declared payload. Entry points that are not in the registry get removed, because an unregistered form is a form nobody is watching.
| Instrumentation layer | What it records | Who reads it |
|---|---|---|
| Client side | Form starts, field errors, script blocked, submit attempts | Marketing and web |
| Endpoint | Accepted events, rejected payloads, validation reasons | Operations |
| Delivery | Write success, retries, parked events with the payload | Operations |
| Record | Created, matched to an existing identity, owner assigned | Sales operations |
| Consent store | Evidence written, withdrawal events | Compliance owner |
The single most useful number is the ratio between accepted events at the endpoint and records created downstream, split by entry point. Anything below one means loss, and the size of the gap tells you where to look. Put that ratio on the same screen as the response-time report so a capture problem cannot masquerade as a slow-team problem.
The NIST AI Risk Management Framework makes a point that applies well beyond AI: automated decisions are governable only when they are traceable and measurable. A capture endpoint that accepts, transforms, and forwards an event is exactly such a decision point, and it needs the same log discipline as anything downstream of it.
What does the pre-launch test matrix look like?
Test every entry point with fixtures before it goes live, and re-run the set whenever a form, a widget, or a destination changes. A single happy-path submit proves nothing except that the happy path exists.
| Fixture | Input | Required assertions |
|---|---|---|
| Clean submit | New identity, full campaign parameters | One record, correct source and channel, consent stored, owner set, clock started |
| Known buyer resubmits | Email matching an existing contact | No second identity created, re-entry logged, prior owner preserved |
| Double click | The same payload twice within seconds | Second event suppressed, one task only |
| Partial payload | Phone only, no email | Record created, phone normalized, review flag set, routing still resolves |
| Missing parameters | Direct visit, no campaign values | Source falls back to a defined value, never blank |
| After-hours arrival | Submit outside working hours | Clock behaves per policy, no ownerless record, honest promise shown |
| Consent declined | Optional marketing box left unticked | Record created, operational contact allowed, marketing flag false, evidence stored |
| Forced write failure | Deliberately invalid field value | Bounded retries, event parked with payload and error, alert raised |
| Script blocked | Handler blocked in the browser | Visitor sees a real error, not a false confirmation |
| Chat abandoned mid-flow | Conversation ends before contact details | Transcript stored, follow-up path defined, no silent discard |
| Scheduler with no slots | All availability consumed | Fallback path visible, request still capturable |
| Messenger jump | Link followed from a campaign landing page | Source carried through or reconstructed, entry point id recorded |
Every fixture asserts the same five things: one correct identity, a complete payload against the contract, controlled values, consent evidence where applicable, and one readable log entry. Timer behavior in the after-hours fixture is defined by policy in SLA and speed-to-lead; this matrix only checks that capture handed the timer a correct start.
How do you retire entry points nobody owns?
Entry points accumulate. A campaign landing page from two years ago, a chat widget on a subdomain, an old contact address on a partner page, a booking link in an email signature. Each one is a place a request can arrive and be ignored.
Run an inventory once, then quarterly. Crawl the site for forms and widgets, list every published address and messenger link, and match each one against actual arrivals in the last ninety days.
| Inventory finding | Decision | Action |
|---|---|---|
| Active, registered, owned | Keep | Confirm the payload still matches the contract |
| Active, no volume in 90 days | Consolidate | Redirect to the main entry point, keep the URL alive |
| Active, no named owner | Assign or remove | An unowned live form is an open loss channel |
| Delivers to a personal mailbox | Rewire | Point at the hub, keep a forwarding rule for one cycle |
| Duplicate of another form | Merge | One canonical form per intent, different entry point ids |
| Legacy page still indexed | Keep the page, replace the form | Traffic exists, the destination was the problem |
| Widget on a subdomain nobody maintains | Remove | Promises availability the team cannot keep |
Never delete an entry point and its URL in the same step. Redirect first, watch for a cycle, then remove. Someone has that link saved, and the cost of a redirect is nothing compared to a bounced request from a buyer who already decided to contact you.
What is the implementation sequence for a capture rebuild?
Do the contract before the interface. Redesigning forms first is how teams end up rebuilding twice.
- Inventory. List every entry point with its owner, destination, current fields, and volume for the last ninety days.
- Contract. Fill in the minimum payload table for your business and mark each field as required, recommended, or enriched later.
- Gap map. For each entry point, record which contract fields it cannot produce and how that gap will be filled.
- Normalize at the edge. Implement email, phone, and domain normalization at the endpoint, storing raw and normalized values side by side.
- Consent. Design the evidence record, agree the wording with counsel, and write the retention rule for raw events and CRM records separately.
- Instrument. Turn on the entry point registry, the accepted-versus-created ratio, and the failure queue before any new form ships.
- Rebuild one entry point. Take the highest-volume form, apply the contract, and run the full fixture set including the forced-failure cases.
- Extend to the other formats. Bring chat, scheduler, and messenger onto the same contract, one at a time, each with its own fixtures.
- Retire. Consolidate the unowned and zero-volume entry points from step one, redirecting rather than deleting.
- Review quarterly. Re-run the inventory, delete fields nobody read, and re-test every entry point that changed.
Step six is the one that gets skipped, and it is the only step that decides whether the next capture failure is a visible incident or an invisible loss.
Where does capture connect to the rest of the stack?
Capture is the first module in the lead ops stack, and it is the only module that cannot recover data it failed to collect. Everything after it either uses what capture emitted or asks the buyer to repeat themselves.
Five neighbouring topics have their own owners, and capture only feeds them. The source vocabulary, the first-touch and latest-touch model, and source corrections are governed in inbound lead attribution; capture records the parameters, attribution decides what they mean. Qualification scripts, thresholds, and confidence handling belong to AI lead qualification; capture only sets the script’s starting position. Matching, survivorship, and merges belong to CRM automation for inbound leads; capture supplies the keys and normalizes them. Rule precedence, ownership, and fallback queues belong to the lead routing playbook; capture supplies the attributes the rules read. Timer definitions, escalation, and after-hours policy belong to SLA and speed-to-lead; capture supplies the start time.
Two more connections are worth naming. The definition of what counts as a qualified handoff is settled in MQL to SQL handoff, and it constrains which fields capture must collect versus which can wait. And where entry points live on generated pages at scale, the discipline in programmatic SEO for lead generation has to match the entry point registry described here, otherwise a template ships a thousand forms with one shared id.
Whether the capture layer belongs in your CRM or in a separate hub is a boundary question worked through in Lead Hub vs CRM, and the OperStack system map shows where capture sits relative to everything else. Scope options are on the pricing page.
What is the operator red flag?
The red flag is an entry point that reports success to the visitor before the payload has been durably stored somewhere a human can reach. Everything else on this page is a variation of that single failure: the thank-you page that fires on a client-side event, the chat that closes the window on a friendly note with no contact method, the booking confirmation that exists only in a calendar tool, the messenger link that drops the campaign parameters at the jump.
When you find one, resist the urge to redesign the form. Store the raw payload first, at the endpoint, before any transformation or forwarding. Then make the confirmation conditional on that store succeeding. Then fix the routing and the fields. A team that does those three things in that order can survive a broken integration for a week; a team that redesigned the form first will not notice the integration broke.
If you want the entry point inventory and the payload contract filled in from your own site rather than from a template, a lead operations audit returns both tables, plus the list of entry points currently reporting success to visitors whose requests reach nobody. Start with inbound lead audit if you would rather run it yourself. Wiring that payload into the systems you already run, with contracts per boundary, is covered by AI integration services.
Is ChatGPT recommending you?
Buyers now ask ChatGPT and Perplexity which company to call. OperStack shows whether they name you, and who they name instead.
- Run the free AI visibility check: ten pages read, a score out of 100 and three buyer questions asked in ChatGPT.
- See a sample report: a real paid audit, anonymised, so you know what you get before paying.
- How OperStack Watch works: the weekly check, the rivals named and the fix text to paste.
Map your stack
Free written assessment: where leads leak between site, chat and CRM, with a fixed price for the fix.
Frequently asked questions
- What is website lead capture?
- Website lead capture is the set of entry points that turn an anonymous visitor into a record your team can act on: forms, chat widgets, schedulers, and direct message links. The visible part is the interface. The operational part is the payload each entry point emits, because routing, timers, and reporting can only use what capture recorded.
- How many fields should a lead capture form have?
- There is no field count that converts better in general, and any number quoted as a benchmark ignores traffic quality, offer, and price point. Ask instead which fields a downstream decision actually needs: a contact method, a source, and enough text to qualify. Every extra field must earn its place by changing a routing or response decision.
- Should we use a form or a chat widget?
- Neither format wins in the abstract. A form suits buyers who already know what they want and teams that answer asynchronously. Chat suits shorter questions and staffed hours. Choose by buyer intent and by whether someone is actually available, then make both emit the same payload so the choice does not fragment your data.
- Should prospects be allowed to book a meeting directly?
- Direct booking works when the meeting is genuinely available, the round is short, and no qualification gate has to run first. It fails when calendars are stale, the booking form collects less than your form does, or the confirmation is the only record. Always keep a fallback path for people who cannot find a slot.
- How do you capture consent on a lead form?
- Record evidence, not a boolean. Store the exact wording shown, the version of the policy, the timestamp, the entry point, and what the person actually did. Consent mechanics and lawful bases differ by jurisdiction and by whether you are contacting or marketing, so have counsel confirm the wording and the retention rules before launch.
- Why do leads submit but never appear in the CRM?
- Usually the submit succeeded in the browser and failed after it. A form plugin sends mail that lands in spam, a webhook times out and retries silently, a required CRM field rejects the payload, or a chat conversation ends without a handoff. Each of these looks like success to the visitor, which is why you monitor accepted events against created records.
- How do you test a lead capture form before launch?
- Run fixtures, not a single happy-path submit. Test a clean submit, a resubmit by a known buyer, a double click, a partial payload with phone only, an after-hours arrival, a deliberately rejected write, and an ad-blocked page. Each fixture asserts one record, correct source and channel, consent evidence stored, and a task with a due time.