📢 Marketing

Google Ads Customer Match Upload Prep: CSV Headers, Normalization, SHA-256 Hashing, and Consent Checks from a CRM Export

Turn a raw CRM or ecommerce export into a Google Ads Customer Match customer list file: correct column headers, normalization before hashing, which columns stay unhashed, consent and exclusion filters, and a short upload runbook.

0.0
0Reviews
P
October 5, 2026

Prompt

Act as a paid media operations specialist who prepares Google Ads Customer Match customer lists from CRM exports. You care about match quality and policy at the same time: a list that matches well but includes people without consent is a liability, not a win.

Inputs:
- CRM export column names and one fake sample row: [CrmColumns]
- Consent fields available and what each one means (marketing opt-in, GDPR consent date, unsubscribe flag): [ConsentFields]
- Regions in the list, especially any EEA or UK records: [Regions]
- What the list is for (exclusion of existing buyers, retention upsell, lookalike seed): [UseCase]
- Membership duration wanted and how often the list will be refreshed: [MembershipDays]
- Hashing path (upload plain text and let Google Ads hash it, or hash in-house before upload): [HashingPath]
- Output format: [Format]
- Language: [Lang]

Generate:
1. Column mapping. Map CrmColumns to the Customer Match customer list headers Email, Phone, First Name, Last Name, Country, Zip. Mark which ones are hashed and state that Country and Zip are never hashed. Drop every CRM column that is not needed.
2. Normalization rules applied before any hashing: trim whitespace, lowercase email, remove dots before the @ only for gmail.com and googlemail.com, phone in E.164 with a leading plus and country code, lowercase names with no surrounding spaces, Country as a two letter ISO code.
3. Consent and exclusion filter. Write the filter logic from ConsentFields and Regions: who is included, who is excluded (unsubscribed, no opt-in, missing EEA consent), and rows with no usable identifier. For EEA records, note that consent for ad user data and ad personalization must be collected and passed.
4. Hashing step for HashingPath. If hashing in-house, give SHA-256 lowercase hex on the normalized value and a short script. If uploading plain text, say which option to choose in the upload flow.
5. Upload runbook for the Google Ads UI: Audience manager, Your data segments, new Customer list, file upload, membership duration from MembershipDays, and the policy acknowledgment.
6. Refresh and QA plan: how to replace or append on each refresh, what to check after processing (match rate shown by Google Ads, rejected rows), and how UseCase changes the campaign setup.

Constraints:
- Never put real customer data in the output; use the fake sample only.
- Do not promise a match rate or minimum list size outcome; tell me where Google Ads reports it.
- This is operational guidance, not legal advice; flag anything that needs the privacy owner's sign-off.
- No em dashes.

Instructions

Replace every [bracket] with your details before running. Works on ChatGPT, Claude, and Gemini.

Generated Output

This image was generated using the prompt above.

Google Ads Customer Match Upload Prep: CSV Headers, Normalization, SHA-256 Hashing, and Consent Checks from a CRM Export - Result

Examples

Example Input

CrmColumns: customer_id, email_address, mobile, first, last, ship_country (full names like United States), postcode, sms_opt_in, email_opt_in, gdpr_consent_ts, unsubscribed_at, last_order_date
Sample row: 4412, ' Dana.Ruiz@Gmail.com ', '(415) 555-0142', 'Dana ', 'Ruiz', 'United States', '94110', true, true, null, null, 2026-08-14
ConsentFields: email_opt_in is our marketing consent; gdpr_consent_ts is filled only for EU signups that accepted ads use; unsubscribed_at is set when someone opts out
Regions: mostly US, about a tenth of rows are Germany and France
UseCase: exclude past buyers from prospecting Search campaigns
MembershipDays: 540, refreshed monthly
HashingPath: hash in-house
Format: mapping, rules, filter, script, runbook
Lang: English

Example Output

1. Column mapping
| CRM column | Customer Match header | Hashed |
| email_address | Email | yes |
| mobile | Phone | yes |
| first | First Name | yes |
| last | Last Name | yes |
| ship_country | Country | no, two letter code |
| postcode | Zip | no |
Dropped: customer_id, sms_opt_in, email_opt_in, gdpr_consent_ts, unsubscribed_at, last_order_date (used for filtering only, never uploaded).

2. Normalization (sample row)
- Email: ' Dana.Ruiz@Gmail.com ' -> danaruiz@gmail.com (trimmed, lowercased, dot removed because the domain is gmail.com)
- Phone: '(415) 555-0142' with Country US -> +14155550142
- First Name: 'Dana ' -> dana; Last Name: ruiz
- Country: 'United States' -> US; Germany -> DE; France -> FR
- Zip: 94110 kept as text so leading zeros elsewhere survive

3. Consent and exclusion filter
Include a row only if:
- unsubscribed_at is null, and
- email_opt_in is true, and
- if Country is DE or FR, gdpr_consent_ts is not null, and
- at least one of Email or Phone is non-empty after normalization.
Rows for DE and FR without gdpr_consent_ts are excluded even if email_opt_in is true, because the opt-in field does not say it covers ads use. Ask your privacy owner to confirm that gdpr_consent_ts maps to consent for ad user data and ad personalization before the first upload.

4. Hashing (in-house, SHA-256)
import hashlib
def h(v):
    return hashlib.sha256(v.encode('utf-8')).hexdigest() if v else ''
# apply h() to Email, Phone, First Name, Last Name after normalization
# leave Country and Zip as plain text
Output file headers: Email,Phone,First Name,Last Name,Country,Zip. Save as UTF-8 CSV. Keep the unhashed working file out of shared drives and delete it after upload.

5. Upload runbook
1. Tools, Shared library, Audience manager, Your data segments, plus button, Customer list.
2. Choose to upload hashed data, attach the CSV, and name it with the export date, for example Past buyers 2026-10.
3. Set membership duration to 540 days.
4. Confirm the Customer Match policy acknowledgment that the data was collected first-party and shared with consent.
5. Upload and wait for processing; the segment shows a size and match rate only after Google Ads finishes.

6. Refresh, QA, and campaign setup
- Monthly: rebuild the file from a fresh export with the same filter, then replace the list contents so unsubscribes drop out instead of lingering.
- After processing, record the match rate Google Ads reports in your change log; if it drops sharply, check phone formatting first.
- UseCase is exclusion: add the segment as an excluded audience on each prospecting Search campaign. Do not add it as observation or targeting.
- Needs privacy owner sign-off: the DE and FR consent mapping and the retention of the hashed file.

Reviews (0)

Please login to leave a review.
Loading reviews...