A Central-region growth lead can export 412 generate_lead hits from last month and still have a sales WhatsApp that only logged 67 real conversations. Pageviews never booked a site visit in Punggol. Neither did a scroll-to-70% event you marked as a conversion because it looked tidy in the GA4 interface.
This is a scored audit, not another “add more events” list. You inspect what fires, what you mark as a key event, and whether that number can sit next to your enquiry log without someone in finance asking why Google Ads ROAS looks healthier than the diary. Failing here looks like Smart Bidding chasing form starts, thank-you page reloads, and outbound clicks that never became a quoted job.
Singapore enquiry paths are messy on purpose. HDB and condo buyers tap WhatsApp. Landed-home owners call from mobile. B2B operators still submit a form, then follow up on PayNow terms later. If GA4 does not name those actions the same way your team names them, you are training paid media on noise.
Twelve GA4 checks Singapore marketers can score against the enquiry log
Work through the cards in order. Each item is something you can open in GA4, Tag Assistant, or the live site this week. Pass means the event maps to a human who asked for a quote, a booking, or a callback. Weak means the event exists but over-counts or under-counts. Fail means the event is missing, duplicated, or is a vanity proxy.
Audit scorecard
-
Key events vs the sales diary Export last 30 days of GA4 key events and line them up against WhatsApp threads, call logs, and CRM notes. A pass is within roughly 15% of unique enquiries after you strip repeats from the same person. A fail is a 3x gap, which is common when generate_lead fires on every form field blur. What it costs: Google Ads learns the wrong success, and SGD spend follows the fake volume.
-
WhatsApp click is a named event Inspect click events on wa.me and the in-page WhatsApp widget. Good looks like a single event (for example contact_whatsapp) with a parameter for page path, fired once per session unless they open a second thread. Fail is counting every floating-button hover, or no event at all while half your East-side traffic never touches the form. Cost: you under-report the channel Singapore buyers actually use.
-
Click-to-call is not a pageview tel: taps on mobile should fire once, with a destination number parameter you can audit. Good: one event per tap, not on desktop hover. Fail: you marked outbound clicks as conversions and now every PDF download looks like pipeline. Cost: mobile is most of paid search clicks, and a lagging conversion rate versus desktop gets blamed on “creative” when the event is the leak.
-
Form submit, not form start Confirm the event fires after a successful POST or thank-you render, not on first focus. Good: generate_lead or form_submit with form_id, and it does not refire on refresh. Fail: GTM listens to every input. Cost: thank-you reloads in Safari can double-count a single Tampines booking request.
-
One enquiry, one conversion across tools Compare GA4 key events, Google Ads conversions, and Meta’s lead event for the same 7-day window. Good: you can explain residual gaps (consent, ad blockers, iOS). Weak: Ads is 40% higher because the tag and GA4 both fire. Fail: you import GA4 and still fire the Ads tag on the same thank-you. Cost: last-click already double-counts across channels; you do not need a third copy of the same lead.
-
Enhanced conversions actually match Check that hashed email or phone is present on the conversion hit when the form collects it. Good: Event Match Quality is usable and the hashed values match what sales received. Fail: you toggled Enhanced Conversions on and the data layer is empty. Cost: privacy and blockers already eat 20%+ of conversion data; empty hashes make Smart Bidding guess harder.
-
Consent mode is not a silent drop Walk a first-visit session that declines analytics. Good: you still see modelled conversions documented, and ads tags respect the same consent state. Fail: declined users still fire generate_lead, or accepted users fire nothing because the CMP never updated the data layer. Cost: your Singapore traffic mix (lots of mobile Chrome plus iOS) will look “down” after a CMP change even when enquiries held steady.
-
Landing URL parameters survive the handoff Use a test click with UTMs into a typical enquiry page. Good: session source/medium and campaign stick through WhatsApp click and form submit. Fail: a redirect to a homepage or a PayNow FAQ strips query strings. Cost: Performance Max already concentrates spend; if the landing strip loses campaign, you cannot tell which asset booked the job.
-
Thank-you page is unique and slow-proof Confirm the conversion page is not the same URL as the form, and that INP and load do not cause double submits. May 2026 CrUX still has only 55.9% of origins passing all three Core Web Vitals. A sticky form on a heavy homepage is a fail. Cost: users mash submit; GA4 counts two leads; sales sees one name.
-
Scroll and video are not key events Keep engagement events for content diagnosis. Do not mark them as conversions unless a human would call that an enquiry. Fail: file_download of a price list marked as generate_lead. Cost: bidding optimises for curiosity, not quoted work.
-
DebugView matches production names Trigger each enquiry path in DebugView: form, WhatsApp, call. Event names and parameters must match production, including case. Fail: generateLead in GTM and generate_lead in GA4, so reports split. Cost: you “fix” the wrong event for weeks.
-
On-page friction is visible, not guessed If key events look healthy but booked jobs are thin, watch where the form or WhatsApp CTA dies. Session recordings and heatmaps in HeyLead Insights show abandoned fields, rage taps on the call button, and proof that sits below the fold on mobile. Fail: you add more ads before you fix the 11-second stall on GST-inclusive pricing. Cost: clean tracking of a broken page just scales the leak.
If the scorecard already shows duplicate Ads plus GA4 tags, pause new budget until item 5 is a pass. A GA4 configuration pass is cheaper than another month of Smart Bidding on form starts.
Mark pass, weak, or fail, then freeze what bidding can see
Score each card as pass (maps to a unique enquiry), weak (exists but noisy), or fail (missing, duplicated, or vanity). Do not average them into a vanity “82% healthy” number. Three fails on items 1, 4, and 5 beat nine passes on scroll depth.
Fix order is not optional. Tracking integrity before scale. Intent events before budget. Form and WhatsApp speed before new creative. You can ship a new Meta video in an afternoon. You cannot unteach Performance Max a month of fake generate_lead hits.
When you freeze bidding inputs, unmark every key event that is not an enquiry. Leave them as events for diagnostics. Import into Google Ads only the cleaned set, once. If Meta still fires Instant Form leads that never reach WhatsApp, do not “align” by marking those as GA4 conversions too. Align by matching definitions, not by inflating both dashboards.
A Woodlands operator we worked through this with had 19 generate_lead events on days sales logged 6. The extra 13 were form_start plus a thank-you that loaded twice. After they unmarked the starts, CPC looked worse for 11 days and booked jobs per dollar improved. That dip is the audit working.
Get a free marketing audit - we review your search, ads, and landing pages and send back what to fix first.
Get a free audit

Thirty days to make key events match the Singapore diary
This is repair work. You are not migrating to a new measurement religion. You are making the existing property tell the truth about enquiries.
30-day repair sequence
-
Days 1-3: dump key events, Ads conversions, and the enquiry log (WhatsApp, calls, forms) into one sheet. Tag every GA4 event as enquiry, engagement, or junk.
-
Days 4-8: rebuild form_submit, contact_whatsapp, and click_to_call in GTM with unique event names and a form_id or click_url parameter. Test in DebugView on mobile Chrome and Safari.
-
Days 9-12: turn off duplicate conversion tags. Keep one primary path into Google Ads. Confirm Enhanced Conversions hashes on a real test submit (use a dummy PayNow-safe email).
-
Days 13-18: unmark scroll, video, and file_download as key events. Republish. Watch 72 hours of volume versus the diary, not versus last month’s inflated baseline.
-
Days 19-24: fix the landing handoff. Preserve UTMs through redirects. Run Core Web Vitals on the enquiry URL. If INP is ugly, cut scripts before you add fields.
-
Days 25-30: only then reopen bidding on the cleaned conversion. Compare cost per qualified enquiry, not ROAS theatre. Google’s 4.2x average ROAS is meaningless if your conversion column is form starts.
Free tools - try these yourself
If a landing still leaks after the tags are clean, treat that as a conversion-rate problem, not a GA4 problem. Dedicated enquiry pages beat sending paid traffic to a homepage. That is the supporting job, not a new channel strategy.
What marketing leaders are seeing
A client scenario we see often: generate_lead firing on every WhatsApp icon hover. Ads CPA looked brilliant until actual threads in the sales phone were counted. The number that mattered was 61 unique chats, not 400 events - typical of Singapore home-services teams whose primary close happens in chat, not the form.
A client scenario we see often: a consent banner went live on a Thursday. Key events fell off a cliff. Enquiries did not. The declined path had never been tested, so bidding starved on a CMP bug - common among mid-size B2B services operators in Singapore after a first CMP rollout.

FAQs
Should WhatsApp clicks count as conversions in GA4?
Yes, if a click starts a real sales conversation and you count unique sessions, not icon hovers. No, if your team only treats a replied thread or a booked slot as an enquiry. Match the diary, then mark the event.
Do I import GA4 key events into Google Ads or fire a separate tag?
Pick one primary conversion path. Importing GA4 while the Ads tag still fires on thank-you is how Singapore accounts invent 40% extra conversions overnight. Document the choice and stick to it.
Why did key events drop after we added a cookie banner?
Consent mode can suppress tags for declined users. Compare enquiry volume in WhatsApp and the CRM for the same week. If humans still wrote in and GA4 did not, fix the data layer update, not the ad creative.
Is generate_lead the right event name?
generate_lead is in GA4’s official recommended events list. Use it if the hit is a completed enquiry. Keep recommended names when they fit, but a precise contact_whatsapp you can audit beats a generic generate_lead that also fires on newsletter signup.
When should we add budget again?
After items 1, 4, and 5 are pass for two consecutive weeks against the diary. Scaling on weak events teaches Smart Bidding the wrong job.
Putting it to work
Execution sprint
This week
- Pull 30-90 days of performance for ga4 events checklist that match real enquiries (Search Console, ads, CRM, or call logs - whatever you have).
- Flag the top leak: wrong intent, weak page, slow response, or dirty conversion tracking.
- Ship one fix on the highest-traffic money path (page, campaign split, or response rule).
- Run the free tools below on that same URL or account and log the findings.
Free tools for this sprint
Next 30 days
- Expand the fix to the next one or two money paths only after the first one shows cleaner bookings.
- Align creative, keywords, or content with the same offer the page now states.
- Review booked outcomes weekly; cut anything that still only produces unqualified volume.
This week
-
Export 30 days of GA4 key events and unique WhatsApp, call, and form enquiries into one sheet.
-
Mark each key event pass, weak, or fail using the twelve cards.
-
Unmark scroll, video, and form_start as conversions.
-
Fire one test submit, one WhatsApp tap, and one tel: tap in DebugView on a phone.
-
Build a UTM test link and confirm campaign survives the thank-you and WhatsApp click.
-
Check Core Web Vitals on the enquiry URL before you touch Ads budgets.
Next 30 days
-
Deduplicate GA4 and Google Ads conversion tags.
-
Ship hashed email or phone on form conversions.
-
Re-enable bidding only on the cleaned enquiry events.
-
Review cost per qualified enquiry weekly against the sales log, not in-platform CPA alone.
Start by lining last month’s GA4 key events against unique WhatsApp threads and form names in the CRM, then freeze any event that is not an enquiry before you add spend. HeyLead can own the GA4 event map, GTM triggers, and Ads import so generate_lead matches real Singapore enquiries instead of form starts. Chat with us on WhatsApp
Free marketing audit, or reach Martin directly:
Get a free audit Connect on WhatsApp · martin@heylead.com