Stop counting pageviews as conversions
Link Google Analytics to Google Ads and a pile of events arrives with it, already switched on. Most accounts end up with at least one of them counting a pageview as a conversion — and because Google’s default for a new action is primary, that pageview lands in the same Conversions column as your leads.
That column is what Smart Bidding optimizes toward. So the bidding isn’t buying leads any more; it’s buying whoever loads a page. On a small account it is easy for pageviews to become the large majority of the conversion count, at which point every “cost per conversion” number anyone quotes is measuring something you never wanted to pay for.
The fix is one line in a .bid file.
Find the culprit
bidsmith query "SELECT conversion_action.name, conversion_action.category, conversion_action.primary_for_goal FROM conversion_action WHERE conversion_action.status = 'ENABLED'"conversion_action.name conversion_action.category conversion_action.primary_for_goalLead form submit SUBMIT_LEAD_FORM truepage_view (GA4) PAGE_VIEW trueCalls from ads PHONE_CALL_LEAD trueAnything with a PAGE_VIEW, ENGAGEMENT or OUTBOUND_CLICK category
sitting at primary_for_goal = true is worth a second look. If you
want the count alongside it, ask the reporting side which actions the
conversions are actually coming from:
bidsmith query "SELECT segments.conversion_action_name, metrics.all_conversions FROM campaign WHERE segments.date DURING LAST_30_DAYS"Demote it
-
Declare the action. bidsmith matches a conversion action to the live one by name, so a block that repeats the account’s name for it adopts what’s there instead of creating a second one. Copy the name exactly:
resource "google_ads_conversion_action" "ga4_page_view" {name = "page_view (GA4)"type = "GOOGLE_ANALYTICS_4_CUSTOM"category = "PAGE_VIEW"status = "ENABLED"primary_for_goal = false}Or let
bidsmith refresh -d ads/write every account-level resource intoads/account.bidfor you, and edit the block it produced. -
Check the plan. Only the one field should move:
Terminal window bidsmith plan .Expected: one
~ updaterow on the conversion action, spelling out the change asprimary_for_goal: true -> false, and nothing created or destroyed. If you instead see a+ create, thenamedoesn’t match the live action character for character. -
Apply after review.
bidsmith apply .— the action keeps recording, keeps showing up under “all conversions”, and stops feeding the column bidding chases.
While you’re there: short calls
The call action Google creates for you comes with a 60-second threshold, so a 45-second call that booked a job is not counted as anything. It is the same shape of surprise, one attribute along:
resource "google_ads_conversion_action" "calls_from_ads" { name = "Calls from ads" type = "AD_CALL" category = "PHONE_CALL_LEAD" primary_for_goal = true phone_call_duration_seconds = 15}Keeping it that way
bidsmith validatewarns about aPAGE_VIEWaction that is primary, or that says nothing aboutprimary_for_goal— which is the same thing, because Google’s default is primary.- Omitting the attribute leaves it unmanaged. A file that doesn’t
mention
primary_for_goalis not declaring itfalse; the account keeps whatever it has, and so does the next person who opens the UI. Write it down. bidsmith plancatches the flip back. Once the file saysfalse, anyone promoting the action in the UI shows up as a one-line diff on the next plan.
See also
google_ads_conversion_action— the full reference, including attribution models.- See how your campaigns are performing —
more
bidsmith queryreporting. - Google on primary and secondary conversion actions — what each setting does inside Google Ads.