Collect the qualified-lead action in parallel before making it the campaign’s bidding goal. Measure how many unique leads qualify, how quickly those outcomes reach Google Ads, and how consistently the destination reports them. Repair any button taps, duplicates or rejected forms already feeding the current goal.
If closed jobs are too sparse or slow, a consistently reviewed qualified lead may be a better intermediate goal. Agree on the definition with sales. For a local service business, it might require a reachable contact, a request the business handles, and a location in the service area. Use the same rules across campaigns and reviewers.
Observe qualification before changing bidding
- Assign each accepted lead a stable business ID. Record the later review decision and time as separate fields. Keep pending and disqualified leads distinct so a slow review does not look like a bad lead.
- Set up the supported import route and a distinct qualified-lead action. Verify row results, destination ownership and attributed reporting using the offline conversion diagnostic.
- For parallel observation, use the secondary action and verify it is outside any custom goal selected by the campaign. A secondary action inside a selected custom goal can still affect bidding. Compare actions individually in All conversions.
Google Ads primary and secondary action behavior.
Compare leads by interaction date and allow for delay
In your CRM, group leads with a known paid interaction by the interaction date. Use the campaign’s spend from the same dates, scope and timezone. Keep unlinked leads in a separate bucket. Measure the time from interaction to qualification, then from qualification to upload and reported outcome. Use the observed delays to choose a cutoff and record the remaining pending reviews.
Run the example with this SQLite file. It uses eight synthetic leads and three daily spend records. The snapshot is day 14 and the example allows seven days before a cohort enters the older comparison. Choose your own cutoff from your data.
sqlite3 -header -column :memory: < qualified-lead-cohorts.sqlInspect the cohort SQL
-- Synthetic click cohorts observed at the end of day 14.
-- Run with: sqlite3 -header -column :memory: < qualified-lead-cohorts.sql
CREATE TABLE click_day_cost (
click_day INTEGER PRIMARY KEY,
spend_cents INTEGER NOT NULL
);
CREATE TABLE accepted_lead (
lead_id TEXT PRIMARY KEY,
click_day INTEGER NOT NULL,
qualification_day INTEGER,
rejection_day INTEGER,
report_seen_day INTEGER
);
INSERT INTO click_day_cost VALUES (1, 7000), (5, 5000), (10, 9000);
INSERT INTO accepted_lead VALUES
('lead-a', 1, 2, NULL, 3),
('lead-b', 1, NULL, 2, NULL),
('lead-c', 1, 3, NULL, 4),
('lead-d', 5, 8, NULL, NULL),
('lead-e', 5, NULL, NULL, NULL),
('lead-f', 10, 11, NULL, NULL),
('lead-g', 10, NULL, NULL, NULL),
('lead-h', 10, NULL, 11, NULL);
WITH settings(as_of_day, review_lag_days) AS (VALUES (14, 7)),
cohort_days AS (
SELECT click_day, spend_cents, as_of_day,
CASE WHEN click_day <= as_of_day - review_lag_days
THEN 'older' ELSE 'recent' END AS cohort
FROM click_day_cost CROSS JOIN settings
WHERE click_day <= as_of_day
),
costs AS (
SELECT cohort, SUM(spend_cents) AS spend_cents
FROM cohort_days
GROUP BY cohort
),
outcomes AS (
SELECT cohort,
COUNT(*) AS accepted,
COUNT(CASE WHEN qualification_day <= as_of_day THEN 1 END) AS qualified,
COUNT(CASE WHEN qualification_day <= as_of_day
AND report_seen_day <= as_of_day THEN 1 END) AS report_seen,
COUNT(CASE WHEN (qualification_day IS NULL OR qualification_day > as_of_day)
AND (rejection_day IS NULL OR rejection_day > as_of_day)
THEN 1 END) AS pending_review
FROM accepted_lead JOIN cohort_days USING (click_day)
GROUP BY cohort
)
SELECT costs.cohort, costs.spend_cents / 100.0 AS spend_usd,
COALESCE(accepted, 0) AS accepted, COALESCE(qualified, 0) AS qualified,
COALESCE(report_seen, 0) AS report_seen,
COALESCE(pending_review, 0) AS pending_review,
CASE WHEN costs.cohort = 'older'
THEN ROUND(costs.spend_cents / 100.0 / NULLIF(qualified, 0), 2)
END AS cost_per_qualified_usd
FROM costs LEFT JOIN outcomes USING (cohort)
ORDER BY costs.cohort;| Cohort | Spend | Accepted | Qualified | Report seen | Review pending | Cost per qualified lead |
|---|---|---|---|---|---|---|
| Older | 120 USD | 5 | 3 | 2 | 1 | 40 USD |
| Recent | 90 USD | 3 | 1 | 0 | 1 | Wait for more evidence |
The older cohort has three qualified leads and two seen in reports. Review the third lead’s upload and reporting trail. The recent cohort’s zero reported outcomes still includes one known qualification, so keep that cohort out of the cost comparison. Summing spend before joining the outcomes prevents a busy day’s cost from being counted once per lead.
Google Ads conversion lag reporting and conversion cycles and Smart Bidding.
Choose a goal the campaign can observe regularly
Google’s high-quality lead guidance recommends at least 15 conversions in the last 30 days at the account level for the selected action, ideally with the action occurring within seven days of the ad interaction. That recommendation comes from its lead-generation guidance. Check the rules for your campaign type, bidding strategy and experiment before treating a count as sufficient.
- Sparse or late: continue observing the deeper action, repair import or review delays, and measure an earlier validated stage while you collect evidence.
- Consistent and timely: record the current settings and review a scoped goal change. Keep the business definition, budget and other major settings stable during the comparison where possible. Assess cost per qualified lead, qualified volume and later sales on comparable cohorts.
- Changing to value bidding too: follow Google’s staged transition guidance. For example, Google recommends moving from form submissions on target CPA to qualified leads on CPA before switching to qualified leads on target ROAS. Verify that the value feed represents differences in business value.
Google Ads high-quality lead guidance, value-based bidding setup and Search and Shopping experiment requirements.
Check which actions are primary
Use the sample or paste settings from the read-only action export into the local browser audit. Then open the campaign’s goal settings to verify its selected actions. Keep the action list beside the cohort review so you can trace which outcome the campaign was using at each date.
Runs in this browser. Your action names and settings stay here.
Check campaign goals to confirm bidding eligibility. Custom goals can include secondary actions. Match transaction or lead IDs to verify repeated events.
Record one decision and its review date
Download the goal review worksheet to record the source action, observation window, proposed change, comparison and rollback owner.
Preview the goal review worksheet
QUALIFIED-LEAD BIDDING REVIEW
Campaign, account, bidding strategy, owner:
Current selected standard and custom goals:
Accepted, qualified and closed definitions:
Disqualification reasons and pending-review state:
Stable lead ID and how the ad interaction was associated:
CRM qualification to upload delay:
Upload to reporting delay:
Comparison date basis, timezone and mature cutoff:
Cohort spend, unique accepted leads and reviewed leads:
Qualified leads, pending reviews and unresolved report matches:
Business cost per qualified lead and its denominator:
Action reported in Google Ads, observed volume and cadence:
One proposed goal change and a named comparison group:
Primary outcome and minimum evidence for evaluation:
Budget, targeting and creative settings to hold steady:
Check date after comparable conversion cycles:
Rollback owner, trigger and prior campaign goal settings:Start upstream if rejected or fake submissions are reaching your current conversion action. For already-counted invalid events, review the conversion adjustment workflow.
Start a free AdProtektor trial to review visitor evidence and configure protection for your site. Use ConversionOS to inspect supported conversion delivery, and use the CRM’s review decision to determine qualification.