After the Form report
Sample report
This is an example of what you receive, built on a fictional account. The company, the figures and the screenshots are illustrative. They are not a client result.
- Account
- Example Co (fictional), B2B software
- Stack
- HubSpot Marketing Hub Professional, Google Ads, Google Tag Manager
- Period compared
- The last 30 days
Summary
Google Ads is bidding on form fills. The qualified stages exist in the account, but they are Secondary, one of them is sent twice, and Customer arrives through a legacy upload that records nothing. Click IDs are not reaching HubSpot, so later stages cannot be tied back to ad clicks.
Six changes are proposed. All of them live in Google Ads, HubSpot or Tag Manager settings. None touches the website outside Tag Manager.
Findings
Each finding comes with what we saw, why it matters, the change we propose and how to reverse it. In a real report every finding also has a screenshot.
Qualified stages are imported but not used for bidding
What we saw. “Lead form submit” is the only Primary conversion action. “HubSpot MQL” and “HubSpot SQL” are syncing, but they are set to Secondary and sit outside the account-level goal.
Why it matters. Smart Bidding optimizes toward Primary actions in the goal. With form fills as the only Primary action, it looks for more form fills and cannot tell which leads sales later qualified.
Proposed change. Set “HubSpot SQL” to Primary and include it in the account-level goal. Move “Lead form submit” to Secondary. You decide the date, because bidding will relearn.
To reverse. Set “Lead form submit” back to Primary and “HubSpot SQL” back to Secondary.
Example conversion action list Conversion action Goal Lead form submit Primary HubSpot MQL Secondary HubSpot SQL Secondary Test conversion Secondary Example
The same stage is sent twice
What we saw. “HubSpot SQL” reaches Google Ads through the HubSpot integration and through a Zapier automation that fires on the same lifecycle stage change.
Why it matters. Google Ads counts both. SQL conversions read about twice as high as the stage changes recorded in HubSpot, which inflates the value Smart Bidding assigns to those clicks.
Proposed change. Pause the Zapier automation and keep the HubSpot integration.
To reverse. Turn the Zapier automation back on.
Click IDs are on the page but not reaching HubSpot
What we saw. The
_gcl_awcookie is set after an ad click. The demo form is built in Webflow, not HubSpot, and its hidden click ID field is empty on submit.Why it matters. Without the click ID, HubSpot cannot match the contact to the ad click, so later stages cannot be attributed to the campaign that produced them.
Proposed change. Add a Tag Manager tag that reads the cookie and fills the hidden field before the form is submitted. This stays inside Tag Manager, so no website code changes.
To reverse. Pause or delete the new tag. The form keeps working without it.
- Name
- _gcl_aw
- Value
- GCL.1700000000.Cj0KCQ…
- Domain
- .example.com
Example
Customer conversions still use legacy offline import
What we saw. “Customer” is uploaded from a weekly CSV through offline conversion import. No customer conversions were recorded in Google Ads in the period.
Why it matters. Google calls offline conversion import a legacy method and recommends enhanced conversions for leads. The weekly upload also arrives late and is easy to miss.
Proposed change. Send the Customer stage through the HubSpot integration and retire the CSV upload once the first conversions appear.
To reverse. Re-enable the CSV upload. Nothing is deleted.
Consent defaults load after the Google tags
What we saw. On pages served to UK and EEA visitors, the consent defaults are set after the first Google tag fires, and ad_user_data is not set at all.
Why it matters. Consent signals have to be in place before any Google tag loads, or the tags run without them.
Proposed change. Add a consent default tag that fires first and sets all four signals to denied until the visitor accepts.
To reverse. Pause the consent default tag.
- consent: default
- ad_storagedenied
- analytics_storagedenied
- ad_user_datadenied
- ad_personalizationdenied
Example
A test conversion is counted as a goal
What we saw. “Test conversion” is a Primary action and is included in the account-level goal.
Why it matters. It is a leftover from setup. Any traffic that triggers it adds noise to what bidding learns from.
Proposed change. Remove it from the goal and set it to Secondary.
To reverse. Set it back to Primary and add it to the goal.
Side-by-side count
Same 30 days. Example data.
| Stage | HubSpot, from Google Ads contacts | Google Ads recorded |
|---|---|---|
| MQL | 142 | 131 |
| SQL | 61 | 118 |
| Opportunity | 24 | 22 |
| Customer | 9 | 0 |
HubSpot says the two counts are not expected to match, so differences alone are not a fault. These ones are explained. SQL in Google Ads is about double because it is sent twice. Customer is zero because the legacy upload is not recording. MQL and Opportunity are close.
Change log
We send the proposed changes first and make only the ones you approve. This log lists what we touched. Each change has its reversal in the findings above.
| Change | Status |
|---|---|
| Set “HubSpot SQL” to Primary; “Lead form submit” to Secondary | Approved, scheduled |
| Pause the Zapier automation | Approved, done |
| Tag Manager tag to fill the hidden click ID field | Approved, done |
| Move Customer to the HubSpot integration; retire CSV upload | Approved, waiting on first conversions |
| Consent default tag in Tag Manager | Approved, done |
| Remove “Test conversion” from the goal | Approved, done |
Handover
The report comes with a recorded screen walkthrough of the findings and a 30-minute handover call. If something on the fix list is not working at handover, we keep going until it does.
HubSpot only syncs stage changes that happen after an event is created, so results count from handover forward.