Lead Attribution
Lead Attribution captures the moments a visitor shows intent to contact you — tapping a phone number, clicking a "show number" button, or submitting a form — and ties each one back to how that visitor found your site (the page they landed on, the referring site, and the campaign/UTM tags). Every captured lead becomes a tidy, timestamped record you can review, export, share, and get alerted about.
It's built for anyone who needs to prove a lead came from the website — for example, to document the leads your marketing produced.
What it can (and can't) track
- Phone-call clicks — when someone taps a
tel:link on mobile (tap-to-call), that's captured along with where they came from. - "Reveal number" clicks — if your site hides the number behind a button, clicking it counts as call intent (useful on desktop).
- Form submissions — contact and quote forms (Fluent Forms, Gravity Forms, Contact Form 7, WPForms are auto-detected; you can also target a form by CSS selector).
What it cannot do, by design, is track a call placed by someone who reads your number off the screen and dials from a different phone — no website tool can see that without a special tracking phone number, which this feature deliberately avoids. To help bridge that gap, every lead gets a short reference code (e.g. WEB-7K2QF) you can ask callers to mention.
Turn it on
Lead Attribution ships with SyteOps as a built-in module. Enable it from SyteOps → Modules, then open the new Leads menu item.
Set up your goals
On the Leads → Settings tab, choose which actions to capture:
- Phone (tel:) link clicks — on by default. Fires whenever a visitor taps or clicks any
tel:link on your site, capturing their source and the page they were on. - "Reveal number" clicks — turn this on and enter the CSS selector of your reveal button (e.g.
.reveal-phone). Useful when your site shows a button like "Show phone number" instead of a rawtel:link. See the CSS selector cookbook below for help finding the right selector. Leave Only count reveal clicks on desktop on (the default) to ignore taps on phones, where the number is already tap-to-call. - Form submissions — pick your form plugin (or "auto"), or enter a specific CSS selector to target one particular form (e.g.
#gform_1or.wpcf7-form). Auto-detection covers Fluent Forms, Gravity Forms, Contact Form 7, and WPForms.
Consent
Choose between two modes to match your privacy requirements:
- Opt-out (default) — tracking runs for all visitors unless they actively withdraw consent. Works well if your analytics consent banner already covers tracking.
- Opt-in — tracking only starts after a visitor grants consent. Use this if you need explicit permission before recording any data.
Email reports
Stay informed without watching a dashboard:
- Per-lead emails — get an email the moment a new lead is captured. You can set a short digest window (e.g. 15 minutes) so that several leads arriving in quick succession are bundled into one message.
- Scheduled summaries — choose daily, weekly, or monthly digests for a periodic overview of lead volume and sources. Pick the send hour, and (for weekly/monthly) the day it goes out.
Email branding
You can put your own logo at the top of the lead emails this feature sends (new-lead alerts, digests, and scheduled summaries):
- Go to Leads → Settings → Email reports.
- Next to Email logo, click Select logo and choose an image from your Media Library.
- Save settings.
Your logo appears at the top of every lead email, on a white background, and it displays correctly in both light and dark email apps. For best results use a logo that reads on white — a transparent PNG is ideal (many email apps don't display SVG). Leave the field empty to show your site name as text instead.
The logo is embedded directly in each email, so it shows even in inboxes that block remote images.
Qualify your leads (scoring)
Beyond capturing that a lead arrived, you can capture how good it is. Turn on Lead qualification in Settings and define a short set of questions — each answer carries points, and the totals roll into tiers you control (Hot / Warm / Cold by default).
How points and tiers work
Every question you define has answer options, and each option carries a point value. When a lead submits the form, SyteOps adds up the points from each answer. The lead is then assigned the highest tier whose min threshold the total reaches.
For example, if you configure:
[
{ "id": "hot", "label": "Hot", "min": 60 },
{ "id": "warm", "label": "Warm", "min": 30 },
{ "id": "cold", "label": "Cold", "min": 0 }
]
A lead who scores 70 points gets the Hot tier. A lead who scores 45 gets Warm. A lead who scores 10 gets Cold.
The score and tier attach to the lead, show on the dashboard and proof packet, and travel to your CRM via webhook.
Building questions with the visual builder
The visual builder lets you create your question set without writing any JSON. Click Add Question, give it a label, choose a type, and add answer options with their point values.
Valid question types are:
select— a dropdown; answers carry points.radio— single-choice buttons; answers carry points.checkbox— multi-select; answers carry points.number— a numeric input; no point values (used to capture data like budget figures).text— a free-text input; no point values (used to capture open-ended answers).
For each question you can also set a CRM field name — a short key like budget or timeline. This maps the answer to a named field in the webhook payload your CRM or automation receives (see Send leads to your tools below).
Advanced: raw JSON
If you prefer to work directly in JSON — or want to paste a configuration from another site — use the Advanced (raw JSON) toggle to edit the questions array directly. Here is a complete example:
[
{
"id": "budget",
"label": "What's your budget?",
"type": "select",
"crm_field": "budget",
"options": [
{ "value": "under_1k", "label": "Under $1,000", "points": 0 },
{ "value": "1k_5k", "label": "$1,000–$5,000", "points": 20 },
{ "value": "over_5k", "label": "Over $5,000", "points": 40 }
]
},
{
"id": "timeline",
"label": "When do you need this done?",
"type": "radio",
"crm_field": "timeline",
"options": [
{ "value": "asap", "label": "As soon as possible", "points": 30 },
{ "value": "browsing", "label": "Just researching", "points": 0 }
]
}
]
And the matching tiers array:
[
{ "id": "hot", "label": "Hot", "min": 60 },
{ "id": "warm", "label": "Warm", "min": 30 },
{ "id": "cold", "label": "Cold", "min": 0 }
]
Two ways to ask the questions
- Fluent Forms — if you already build forms with Fluent Forms, point SyteOps at the form (enter its form ID) and map each Fluent Forms field to a question ID. When someone submits that form, SyteOps scores their answers and attaches them to the lead automatically. No extra form widget needed.
- Native form — drop the built-in questionnaire anywhere with the
[syteops_lead_form]shortcode or the Lead Form block, or configure it as a pop-up (see Shortcode & block reference below).
Send leads to your tools (webhooks)
Lead Attribution can fire webhooks to any tool that accepts an incoming HTTP POST — an automation webhook (FlowMattic, Make, Zapier, n8n, or any other platform), a CRM, a custom endpoint, or a combination.
There are two distinct webhooks:
Automation webhook (every new lead)
This fires the moment a new lead is captured, before qualification. Use it for speed-to-lead flows — text or email your team while the visitor is still warm.
Paste any URL into the Automation webhook URL field to activate it. Use the Which conversions to send switches to choose which first actions trigger it (phone clicks, reveal clicks, form submissions) — based on the lead's first action. The payload sent to your tool looks like this:
| Field | Meaning |
|---|---|
event | Always new_lead |
ref | Short reference code, e.g. WEB-7K2QF |
lead_id | Internal lead ID |
source | Attributed source |
campaign | Campaign / UTM campaign |
status | Lead status |
first_seen | First-touch timestamp |
landing | Landing page URL |
referrer | Referring URL |
utm_source | UTM source tag |
utm_medium | UTM medium tag |
utm_campaign | UTM campaign tag |
gclid | Google Ads click ID |
fbclid | Facebook Ads click ID |
admin_url | Deep link to the lead in WP admin |
proof_url | Shareable read-only proof link |
CRM webhook (qualified leads only)
This fires only after a lead has been scored. Use it to push enriched lead data — including the score, tier, and individual answers — directly into your CRM or a workflow that routes hot leads to a rep.
Paste any URL into the CRM webhook URL field to activate it. The payload includes all of the fields listed above except proof_url, plus:
| Field | Meaning |
|---|---|
event | Always qualified |
score | Total points |
tier | Tier id (e.g. hot) |
tier_label | Tier display label (e.g. Hot) |
answers | Array of { id, label, value, points } for each answered question |
fields | Object mapping each question's crm_field key → the answer value |
The fields object is what most CRMs consume directly — for example, { "budget": "over_5k", "timeline": "asap" } — so you can map the values straight to CRM contact properties without extra transformation in your automation.
CSS selector cookbook
A CSS selector tells Lead Attribution exactly which element on the page to watch. The table below covers the most common goals:
| Goal | Selector | Notes |
|---|---|---|
| All phone links | a[href^="tel:"] | Default; covers tap-to-call on all tel: links |
| A specific "call" button | .btn-call | Use your button's class |
| Reveal-number button | .reveal-phone | Whatever class your theme uses |
| A specific form (Gravity Forms) | #gform_1 | Replace 1 with your form's ID |
| A specific form (Contact Form 7) | .wpcf7-form | Targets any CF7 form on the page |
| A specific form (Fluent Forms) | .fluentform | Targets any Fluent Forms form |
| Elementor button | .elementor-button | Narrow with a section ID if needed |
Finding a selector: right-click the element on your page, choose Inspect (or "Inspect Element"), and look for a class name or id attribute in the highlighted HTML. Classes start with . and IDs start with #.
Shortcode & block reference
The native qualification form can be placed anywhere on your site:
- Shortcode:
[syteops_lead_form]— paste into any post, page, or widget area. - Block: search for Lead Form in the Gutenberg block inserter and drop it where you want the form to appear.
- Pop-up: configure the pop-up options in the qualification settings — choose a trigger (time delay, scroll percentage, or exit intent) and optionally set a title for the pop-up overlay. The pop-up appears automatically without any shortcode or block.
The dashboard
Leads → Dashboard shows your totals (all-time, last 7 and 30 days), the most recent leads, and an Export CSV button. Click any lead to open its proof packet.
Proof packets and shareable links
Each lead's proof packet shows its full story: the source, campaign, landing page, and a timeline of every event — with an integrity check that confirms the record hasn't been altered since it was captured.
Need to show a client the evidence without giving them admin access? Use the shareable proof link — a read-only web page for that single lead. You can regenerate the link at any time to revoke the old one.
WP Full Picture
If you use WP Full Picture for analytics, turn on the mirror option and SyteOps will also record each conversion as a WP Full Picture event, so your existing dashboards stay in sync. It's entirely optional — Lead Attribution works on its own.
Troubleshooting
- Leads not captured — check that the goal (phone, reveal, or form) is toggled on, that the CSS selector matches the actual element on the page, and that consent mode isn't set to opt-in without a consent signal being present.
- Webhook not received — verify the URL is entered correctly and the webhook toggle is on. Webhooks are sent in the background (fire-and-forget), so a failed delivery won't show as an error on the lead record — check your receiving tool's logs.
- Integrity check failed — the record was altered after it was captured, or it was imported from another site. Records imported from a different site can't be re-verified because the cryptographic proof was generated with that site's keys.
- Pop-up not showing — its trigger conditions (delay, scroll depth, or exit intent) haven't been met yet, or lead qualification is turned off in settings.