Skip to main content
    Proof
    Impress Blinds — cost per enquiry down 62.63%, $23.6 to $8.82SLS Solicitors — cost per enquiry down 58.48%, $84.64 to $35.14FixCare Property — cost per enquiry down 56.36%, $35.24 to $15.38Rubbish Removal WA — cost per enquiry down 53.18%, $71.02 to $33.25Floral Cakery — cost per enquiry down 49.82%, $13.83 to $6.94ILLUMINATE Laser Emporium — cost per enquiry down 48.54%, $138.65 to $71.35Aussie Plumbing — cost per enquiry down 41.96%, $117.75 to $68.34Sydney Fence Painting — cost per enquiry down 33.68%, $136.62 to $90.61Alliance Plumbing — cost per enquiry down 29.6%, $81.26 to $57.21Gridless Build Solutions — cost per enquiry down 29.16%, $78.16 to $55.37FacilityWorx — cost per enquiry down 23.62%, $157.13 to $120.01Cornerstone Roofing — cost per enquiry down 20.47%, $41.71 to $33.17A council finance platform — 194 of 194 requirements metA council finance build — 14 weeks to UAT, −34% 10-yr costA cultural institution — $634K of $750K kept workingA council platform — $470,106 built vs $503,262 SaaSA federal agency — n=5,000 prevalence survey at ±1.4%A civic mural — 36 concepts for a 71m × 9m wallA regional shire — 32-page visitor guide, 3 weeks earlyA shire council — one platform retiring 8 of 9 vendorsA pressure washing business — 138 jobs at A$20.43 eachA pressure washing business — 21.20% conversion rateA carpet cleaner — 53 jobs in 15 days at A$24.92 eachA roofing company — 68 quote requests in 35 daysA CCTV installer — 39 qualified leads in 15 daysA fence painter — 36 jobs in 24 days, quotes by day 3A maintenance business — live in 8 weeks, 3 stacks gone41 numbered clauses, published in full5.0 across every Google review$120M+ in media under management250+ active engagements across five countries
    Small Business

    CRM Hygiene: Fix 6 Fields Before You Run One Ad

    Your CRM is full of contacts you collected over years — but half those suburbs are wrong, a quarter of those emails bounce, and you're about to upload that mess to Google and Meta as a custom audience.

    Every dollar you spend targeting noise is a dollar the algorithm uses to teach itself the wrong lesson about your customers.

    Fix six fields first — tonight, in under two hours — and you'll see a cleaner match rate before your next campaign even launches.

    • 22 March 2025
    • 15 min read
    • 3,192 words
    • 4 sources

    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.

    A Google Ads Audience Manager screen showing a customer list with a 29% match rate highlighted in amber, with the 'matched users' count well
    A Google Ads Audience Manager screen showing a customer list with a 29% match rate highlighted in amber, with the 'matched users' count well below the uploaded total

    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.

    Flow diagram — "Contact uploaded" → "Platform hashes email" → two branches: "Match found" (leads to "Warm audience / lower CPL") and "No mat
    Flow diagram — "Contact uploaded" → "Platform hashes email" → two branches: "Match found" (leads to "Warm audience / lower CPL") and "No match" (leads to "Conta

    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:

    1. 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.
    2. 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:

    1. Go to Contacts → Smart Lists → Create New List.
    2. Add filter: Last Activityis after → 12 months ago.
    3. Add filter: Tag contains → your lifecycle stage tag (e.g., "customer", "active-client").
    4. Export as CSV — this is your high-signal upload list.
    5. Create a second Smart List with Last Activity is before 24 months ago — export this as your suppression list.
    ' and 'Tag contains customer' filters applied, with a green contact count and an Export button visible]

    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

    1. Add a final summary column: =COUNTIF(G2:L2,"FIX")+COUNTIF(G2:L2,"OLD")+COUNTIF(G2:L2,"EXCLUDE")
    2. 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.
    3. Filter for opted_in = EXCLUDE and 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.

    Side-by-side comparison graphic — left side shows "Before: 620 contacts uploaded, 28% match rate, 173 matched users" with a red indicator; r
    Side-by-side comparison graphic — left side shows "Before: 620 contacts uploaded, 28% match rate, 173 matched users" with a red indicator; right side shows "After: 620 contacts uploaded, 61% match rate, 379 matched users" with a green indicator

    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.

    Before/after bar chart — two bars labelled "Before clean" ($91 CPL, 28% match rate) and "After clean" ($38 CPL, 61% match rate), with annota
    Before/after bar chart — two bars labelled "Before clean" ($91 CPL, 28% match rate) and "After clean" ($38 CPL, 61% match rate), with annotations showing the sp

    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:

    1. Audit the raw export from your CRM(s) and map every field against the six-field framework.
    2. Apply deduplication and field standardisation — name normalisation, postcode correction, email validation at scale.
    3. Rebuild your Google and Meta audience segments: high-signal Customer Match seed, suppression list, and lifecycle-segmented lookalike seeds.
    4. 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.

    What to do next

    Book a free 20-minute CRM audit with SoudCoh at soudcoh.com/about-us and we'll tell you exactly which of your six fields is costing you the most on your next Google or Meta campaign.

    There is a calculator for the arithmetic above: what a budget this size should be producing. It runs on your own figures, needs no sign-up, and shows its workings.

    Talk to SoudCoh

    Where the claims in this piece come from.

    Listed so you can check the reasoning rather than take it on trust. If a source has moved or been superseded, tell us and we will correct the piece.

    1. Google Ads Help: 'Customer Match policies and match rates' — Google states match rates drop sharply when email domains are outdated or addresses are malformed (support.google.com/google-ads/answer/6379332)

    2. Meta Business Help: 'About Custom Audiences from customer lists' — Meta recommends normalising postal codes and email format before upload to improve match percentage (facebook.com/business/help/606443329504150)

    3. GoHighLevel documentation on contact filtering and bulk field-edit (help.gohighlevel.com)

    4. ATO: 'Records you need to keep' — GST-registered businesses must hold accurate customer data for 5 years, making data hygiene a compliance matter, not just a marketing one (ato.gov.au/business/record-keeping)

    Read next

    Filed under the same desk first. The full index is searchable and filters by reader.

    If you would rather we just did it.

    The briefing above is the reasoning. These are the pages that describe what it looks like as a piece of paid work, including what it costs and what gets reported.

    Related evidence from live accounts.

    These are individual engagements where the market, system or measurement problem overlaps with the briefing. Each study names its window and the evidence available; none is a forecast for another account.

    Apply it to your account

    Reading it is the easy half. Thirty minutes with someone who runs accounts and you leave with a written list of what is leaking on yours — yours to keep either way.

    No pitch deck. No upsell. A real conversation and a written list of leaks.