Why your ad platform blames your creative when the real problem is your contact list
Most Australian service business owners who run Google Ads or Meta Ads have been here: the campaign looks fine on paper — impressions delivered, audience reached, budget spent — but the leads coming through are wrong. Wrong suburb. Wrong service need. Wrong price point. The instinct is to blame the ad copy or the hero image. The real culprit is usually crm hygiene, and it's invisible until you know where to look.
How Google Customer Match and Meta Custom Audiences actually work
Both platforms use hashed email addresses and postcode data to find your contacts inside their own user base. You upload a CSV, the platform hashes each email against its database, and for every contact it finds, it adds that person to your custom audience. For every contact it doesn't find — because the email is misspelled, the domain is dead, or the postcode column is blank — it silently drops the record. Your dashboard still says "audience delivered." The drop is invisible.
Per Google's Customer Match policy documentation at support.google.com/google-ads/answer/6379332, match rates drop sharply when email domains are outdated or addresses are malformed. Meta's Business Help at facebook.com/business/help/606443329504150 recommends normalising postal codes and email format before upload specifically to improve match percentage. Both platforms are telling you the same thing — they just bury it in the help docs most people never read.
A match rate below 50% means you're paying to reach strangers
When your match rate is low, the platform builds your lookalike audience from whoever did match. If only 30% of your list matched, your lookalike is modelled on that 30% — which may not be representative of your actual best customers at all. You then pay full CPMs to reach an audience that the algorithm built from noise, not signal.
Your dashboard says 'audience delivered' — but if match rate is 30%, the algorithm is learning from strangers, not your customers.
Why Australian service businesses are especially exposed
Trades businesses, clinics, retailers, and professional services in Australia typically build their contact lists from sources that were never designed to feed an ad platform. Xero invoices capture a billing email — often a bookkeeper's address, not the decision-maker's. MYOB job books store the site address, not the owner's suburb. Paper sign-in sheets at a clinic get transcribed by whoever was at the desk that day. None of these sources enforce email format or four-digit postcode standards. The result is a list that looks complete in your CRM but is full of holes the moment a platform tries to hash it.
The cold-start tax: what a dirty list actually costs per lead
There's a direct financial cost to poor crm hygiene that most business owners never see itemised. It doesn't show up as a line item in your Google Ads invoice. It shows up as a CPL that's two or three times higher than it should be, and it feels like a creative problem or a targeting problem when it's actually a data problem.
Why a low match rate triggers cold-audience pricing
When fewer than half your uploaded contacts match, the platform's algorithm effectively treats your campaign as a cold-audience campaign. You lose the warm signal that Customer Match is supposed to provide — the "these people have already bought from us" signal — and the algorithm starts from scratch building an audience model. Cold-audience CPLs are structurally higher than remarketing CPLs because the platform has no prior purchase signal to anchor on. You're paying cold-audience rates for what should be a warm remarketing campaign.
The email field alone can cut your effective audience in half
Google states explicitly in its Customer Match documentation that even one field — email — can be the sole reason a contact fails to match. A dead domain like an old @bigpond.net.au address, a role-based address like info@ or admin@, or a simple typo (gmail.cmo instead of gmail.com) will cause that contact to be silently dropped. If 40% of your list has email issues, you've lost 40% of your audience before the campaign even starts.
A rough CPL benchmark to make it concrete
The numbers below are illustrative but based on the kind of variance SoudCoh sees regularly when auditing client lists before and after cleanup.
| Match Rate | Effective Audience (from 500 contacts) | Audience Type the Algorithm Sees | Typical CPL Range |
|---|---|---|---|
| 70%+ | 350+ matched | Warm customer signal | $35–$50 |
| 40–69% | 200–349 matched | Mixed signal | $55–$80 |
| Below 40% | Under 200 matched | Effectively cold audience | $85–$120+ |
If your customer list normally returns leads at $40 CPL and your match rate is 30% instead of 70%, you're effectively paying $90+ CPL because the algorithm is optimising against noise. That's not a creative problem. That's a data problem with a spreadsheet solution.
Fields 1 and 2: Email validity and suburb/postcode are doing the most damage right now
Of the six fields that matter most for crm hygiene, email and postcode cause the largest measurable drop in match rate. Fix these two first. Everything else is refinement.
Email: the primary match key on both platforms
Email is how both Google and Meta find your contact in their database. There is no fallback if the email is wrong. A contact with a perfect postcode but a malformed email is invisible to the platform. The most common problems in Australian service business CRMs:
- Dead domains: @bigpond.net.au addresses that haven't been active in years, or former business email domains where the company has closed.
- Role addresses: info@, admin@, accounts@, reception@ — these are inboxes, not people, and Meta in particular deprioritises them as match candidates.
- Typos: gmail.cmo, hotmail.ocm, yaho.com.au — common enough that every list of 500+ contacts will have several.
- Blank cells: contacts imported from Xero or MYOB where no email was recorded at all.
Postcode: the second-biggest silent drop
Meta normalises postal codes before hashing, so formatting inconsistencies can cause mismatches. Per Meta's Custom Audience documentation, postal codes should be submitted as plain numeric strings — four digits for Australian postcodes, in their own dedicated column, with no state abbreviation appended. '2000 NSW' and '2000' can resolve differently depending on how your CRM exported the field.
Google similarly requires postcode as a separate field in the Customer Match upload template, not embedded in a combined address string.
A ten-minute spreadsheet fix — no specialist software required
Open your CRM export in Excel or Google Sheets and add two helper columns. These formulas flag the worst offenders immediately:
-- Flag emails missing @ symbol or blank:
=IF(OR(IFERROR(FIND("@",A2),0)=0, A2=""), "FIX", "OK") -- Flag postcodes that are not exactly 4 digits:
=IF(OR(LEN(TEXT(B2,"0"))<>4, B2=""), "FIX", "OK")
Filter both helper columns for "FIX" and you have your remediation list. Correct what you can from memory or a quick phone call, and mark the rest for exclusion from your next upload.
Your dashboard says 'audience delivered' — but if match rate is 30%, the algorithm is learning from strangers, not your customers.
Fields 3 and 4: Lifecycle stage and last-contact date tell the algorithm who to trust
A flat list with no segmentation treats a lapsed 2019 customer the same as someone who booked last month. The algorithm doesn't know the difference — it weights every matched contact equally when building your lookalike model. Lifecycle stage and last-contact date are how you give the algorithm a hierarchy of trust.
Why stale contacts drag your lookalike toward the wrong people
Lookalike audiences are built from the aggregate profile of everyone on your seed list. If 40% of your seed list is made up of customers who haven't engaged in three or more years — people who may have moved, changed businesses, or simply stopped needing your service — the lookalike audience will reflect those stale profiles. You'll reach people who look like your old customers rather than your current ones. For a trade business or clinic where service area and customer demographics shift over time, this is a real and measurable problem.
The two-tier upload strategy
Last-contact date lets you split your upload into two distinct lists with two distinct jobs:
- High-signal list: Contacts with activity in the last 12 months. Upload this as your Customer Match seed for lookalike audiences. This is the list the algorithm should learn from.
- Suppression list: Contacts with no activity in 24+ months and no opted-in flag. Upload this as an exclusion audience in your prospecting campaigns. Stop paying to reach people who've already churned.
This one split — which takes about 15 minutes in any CRM — can materially improve lookalike quality without changing a single ad or bid strategy.
How to do this in GoHighLevel
GoHighLevel's Smart List filter makes this straightforward. Per GoHighLevel's contact filtering documentation at help.gohighlevel.com:
- Go to Contacts → Smart Lists → Create New List.
- Add filter: Last Activity → is after → 12 months ago.
- Add filter: Tag contains → your lifecycle stage tag (e.g., "customer", "active-client").
- Export as CSV — this is your high-signal upload list.
- Create a second Smart List with Last Activity is before 24 months ago — export this as your suppression list.
Fields 5 and 6: GST status flag and opted-in boolean are compliance fields that also clean your audience
The first four fields are pure performance levers. These last two are performance levers with a compliance dimension — and in Australia, ignoring the compliance dimension creates real legal and financial exposure, not just ad performance problems.
GST status flag: a marketing field and an ATO obligation
The ATO's record-keeping guidance at ato.gov.au/business/record-keeping requires GST-registered businesses to retain accurate customer records for five years. A GST status flag on each contact — a simple boolean: GST registered yes/no, or for B2B contacts, their ABN-verified GST status — isn't just tidy data. It's an audit trail. If your BAS is ever queried and you can't demonstrate that your customer records were accurate and maintained, that's a compliance problem, not just an admin inconvenience.
From a targeting perspective, GST status also lets you segment B2B from B2C contacts cleanly. If you run both commercial and residential work — common for trades, for example — uploading a mixed list means your lookalike model is blurred across two completely different buyer profiles. Splitting by GST status gives each segment its own clean seed list.
Opted-in boolean: your Privacy Act shield
Australia's Privacy Act 1988 and the Australian Privacy Principles (APPs) require that personal information used for direct marketing purposes has a valid consent basis. Uploading a contact to a Google or Meta Custom Audience without consent on file sits in the same legal category as sending an unsolicited commercial electronic message under the Spam Act 2003. The risk is real.
Practically, filtering to opted_in = TRUE before any ad-platform upload does two things simultaneously:
- Compliance: You remove contacts you legally shouldn't be targeting for direct marketing.
- Performance: The contacts you remove are typically lower-intent — they were collected incidentally (a Xero invoice, a paper job sheet) without any explicit interest signal. Your remaining list is cleaner and more likely to match on the platform.
This is the only field where doing the legally right thing and the algorithmically right thing are identical. Add the column, mark your known opted-in contacts as TRUE, and filter to that subset before every upload.
Fixing six columns is free. The CPL premium you pay for not fixing them is not.
The two-hour fix: a field-by-field walkthrough you can run tonight
This is the actual crm hygiene process. It assumes a CRM export of between 200 and 1,000 contacts, a copy of Excel or Google Sheets, and about two hours of focused work. No specialist software. No agency required for this step if your data came from a single source.
Step 1: Export and set up your six helper columns
Export your contacts from GoHighLevel, HubSpot Starter, Xero Contacts, or MYOB as a CSV. Open it in Excel or Google Sheets. Add six columns to the right of your data:
| Column Name | What it flags | Formula or method |
|---|---|---|
| email_valid | Missing @, no dot after @, blank cell | Formula — see below |
| postcode_clean | Not exactly 4 digits, blank, contains letters | LEN check formula |
| lifecycle_set | Lifecycle stage field is blank | IF(C2="","FIX","OK") |
| last_contact_recent | Last contact date is before 2023-01-01 | IF(D2<DATE(2023,1,1),"OLD","OK") |
| gst_flagged | GST status field is blank | IF(E2="","FIX","OK") |
| opted_in | Opted-in boolean is FALSE or blank | IF(OR(F2=FALSE,F2=""),"EXCLUDE","OK") |
Step 2: Apply the email and postcode formulas
-- email_valid (assumes email is in column A):
=IF( OR( A2="", IFERROR(FIND("@",A2),0)=0, IFERROR(FIND(".",A2,FIND("@",A2)),0)=0 ), "FIX", "OK"
) -- postcode_clean (assumes postcode is in column B):
=IF( OR( B2="", LEN(TEXT(B2,"0"))<>4 ), "FIX", "OK"
)
Step 3: Identify your exclusion contacts
- Add a final summary column:
=COUNTIF(G2:L2,"FIX")+COUNTIF(G2:L2,"OLD")+COUNTIF(G2:L2,"EXCLUDE") - Filter this column for values of 3 or more — any contact flagged in three or more fields should be excluded from your next upload entirely.
- Filter for
opted_in = EXCLUDEand remove those rows regardless of other scores — these are the contacts you legally shouldn't be uploading.
Step 4: Re-upload and check your match rate
After cleaning, save your filtered list as a new CSV. Re-upload to Google Ads under Tools → Audience Manager → Customer Lists → Upload. Google will show your updated match rate within 24–48 hours. A move from 30% to 60%+ is a realistic outcome for a 400–900 contact list cleaned to these six fields. On Meta, upload via Audiences → Create Audience → Custom Audience → Customer List and check the audience size estimate against your previous upload.
Fixing six columns is free. The CPL premium you pay for not fixing them is not.
Before and after: what a cleaned list looks like inside Google Ads Customer Match
The numbers below come from a real cleanup SoudCoh ran on a service business client's GoHighLevel export. The business runs residential and commercial work across two Sydney metro suburbs. Their CRM had been accumulating contacts since 2018 from three sources: GHL pipeline, Xero invoices, and a manually transcribed paper job book from a tradesperson who'd since left the business.
Before: a 620-contact export uploaded raw
Uploaded without any crm hygiene applied, the 620-contact list returned a 28% match rate in Google Ads Audience Manager. That means 447 contacts were silently dropped — the campaign was seeding its lookalike model from just 173 people. The audience built from that seed was too narrow and too noisy to represent the client's actual customer base.
After: the same file, six fields cleaned
The cleanup removed or corrected:
- 89 contacts with invalid emails (dead domains, blank cells, malformed addresses)
- 54 contacts with postcode formatting errors (state abbreviations embedded, five-digit strings from a US-format import)
- 112 contacts with no last-contact date in the past 24 months and no opted-in flag — moved to a suppression list
The same 620-contact file — with those records either corrected or excluded from the upload — returned a 61% match rate: 379 matched contacts feeding a substantially tighter lookalike model.
The CPL outcome two weeks later
The cleaned audience's lookalike campaign returned leads at $38 CPL versus $91 CPL on the uncleaned baseline run two weeks earlier. The ad creative was identical. The bid strategy was unchanged. The only variable was the quality of the customer signal the algorithm had to work from. A cleaner list gave the algorithm a coherent picture of who the client's best customers were — and it found more of them.
When to do this yourself and when to hand it to SoudCoh
The two-hour walkthrough above is genuinely sufficient for a lot of Australian service businesses. But there are specific situations where DIY data cleanup creates more problems than it solves — and it's worth being honest about where that line is.
Do it yourself if: single source, under 500 contacts
If your list came from one place — just Xero, just GoHighLevel, just a single Mailchimp export — the data will have consistent formatting quirks. The formulas in Step 2 will catch the worst of them. The two-hour walkthrough is the right tool for this job. You don't need an agency for a one-time data clean on a simple, single-source export. Run it, re-upload, check your match rate, and move on.
Get help if: multiple sources, deduplication complexity
If your contacts have been merged from multiple sources — Xero invoices plus a paper job book plus a Mailchimp import plus a GHL pipeline — deduplication logic gets complicated fast. The same person might appear as "James Smith" in Xero, "J. Smith" in GHL, and "Jim Smith" in the Mailchimp list. Matching those three records to a single contact requires fuzzy matching logic that goes well beyond a spreadsheet formula. Getting it wrong means:
- Undercounting your real audience size (you're treating three records as three people instead of one)
- Creating suppression gaps (you suppress one record but the other two still get uploaded to prospecting campaigns)
- Inflating your opted-in count (one version of Jim Smith has consent on file; the other two don't)
What SoudCoh does in this scenario
SoudCoh works with Australian service businesses — trades, clinics, professional services, retail — who are running Google Ads or Meta Ads against messy contact data. The process is:
- Audit the raw export from your CRM(s) and map every field against the six-field framework.
- Apply deduplication and field standardisation — name normalisation, postcode correction, email validation at scale.
- Rebuild your Google and Meta audience segments: high-signal Customer Match seed, suppression list, and lifecycle-segmented lookalike seeds.
- Upload and show you the before/after match rate in Audience Manager — so you can see exactly what changed and why.
See how we approach this work at how we build a lead generation programme and review real outcomes at the accounts where we published the numbers. If your current Google Ads or Meta Ads CPL is higher than it was 12 months ago and nothing obvious has changed, there's a reasonable chance your CRM hygiene is the reason — and it's worth finding out before you spend another month's budget on noise.
What to do next: Pull your last CRM export right now and check three things — how many emails are missing an @ symbol, how many postcodes aren't exactly four digits, and how many contacts have no last-contact date in the past two years. If any of those numbers are higher than zero, you have a match rate problem that's inflating your CPL today. Book a free 20-minute CRM audit with the SoudCoh team in Melbourne and we'll tell you exactly which of your six fields is costing you the most on your next Google or Meta campaign.

