WhatsApp data cleaning in Philippines is the step most teams skip, and it is the reason a list that looks fine in a spreadsheet collapses the moment it is sent. Numbers collected from trade shows, inbound forms, marketplace chats and old CRM exports arrive in mixed formats: some start with 0, some with +63, some with 63, and a fair share are landlines or typos. If you push that raw list into a sending tool, you pay for messages that never arrive and you damage the reputation of the accounts doing the sending.
This tutorial walks through a seven-step workflow you can run on any Philippine contact list, whether it has 500 rows or 500,000. Each step states what to do and what "done" looks like, so you can hand it to an operator and check the result.
Why Philippine lists need their own cleaning routine
Before the steps, it helps to understand what makes this market different, because the differences change the order of operations.
First, the number format is inconsistent. The same person may appear as 0917xxxxxxx, +63917xxxxxxx, 63917xxxxxxx and +63 917 xxx xxxx. Any de-duplication done before normalisation will treat these as four different people.
Second, mobile penetration is high and most people rely on a single mobile number for messaging, banking and delivery apps. That means one wrong digit usually means reaching a stranger rather than reaching nobody, which is a compliance risk, not just a wasted credit.
Third, SIM registration rules mean inactive or unregistered lines disappear from the network over time. A list that was clean twelve months ago is not clean today, so cleaning is a recurring job rather than a one-off project.
Fourth, English and Filipino are both widely used, and many contacts prefer a mix. Cleaning is also where you tag language preference, because sending the wrong language lowers replies even when delivery is perfect.
If you work across several markets, the general workflow is the same and only the country rules change; see the platform-by-platform notes in /en/platforms for how other markets differ.
What you need before you start
Three things, and all of them are cheap:
- The raw list in a single file, one number per row, with any extra columns you already have (name, source, city, last contact date).
- A decision on your output format. Pick one canonical form and use it everywhere. We recommend E.164:
+639171234567. - A tool that can check registration status at scale. Manual checks do not survive past a few hundred rows. The screening side of the job is covered in /en/social-filter.
Do not clean inside your sending tool. Clean in a separate sheet, then import. That way a bad batch never touches a live account.
Step 1: Consolidate every source into one sheet
Pull every list into a single table and add a source column before you touch anything else. Sources typically include exhibition leads, website forms, chat history exports, partner lists and past customer records.
Keeping the source column matters later: if one source produces a much lower valid rate than the others, you will want to know which one, and you can only tell if the label survives the whole workflow.
Done when: one file, one row per contact, every row tagged with a source, and a row count you have written down.
Step 2: Normalise to a single country format
Strip spaces, dashes, parentheses and any leading 00. Then apply the Philippine rules:
09XXXXXXXXX→ drop the leading 0, prefix+63→+639XXXXXXXXX639XXXXXXXXX→ prefix+→+639XXXXXXXXX+639XXXXXXXXX→ already correct, leave it- Anything already starting with another country code → keep it, but tag it as non-PH; do not force it into +63
Done when: every Philippine row matches +639 followed by nine digits, and every row that failed to convert is in a separate "review" tab rather than deleted.
Do not delete the review tab. Those rows are usually fixable by hand and often contain your best contacts.
Step 3: De-duplicate and split into batches
Now that formats match, remove duplicates. Two passes:
- Exact duplicates on the normalised number.
- Near-duplicates: same person, two numbers. If you have name or email columns, group on those and decide which number to keep. Tag the other one as an alternate rather than deleting it.
After de-duplication, split the list into batches of roughly 5,000 to 10,000. Batches let you run checks in parallel, keep costs predictable and, most importantly, isolate problems. If one batch has a strange failure rate, you can quarantine it without holding up the rest.
Done when: unique count is known, batches are numbered, and you have a per-batch row count recorded.
Step 4: Check registration status
This is the step that actually tells you whether a number can receive a WhatsApp message. Send each batch through registration detection and capture the raw result per row, not just a yes/no.
Keep the raw status because the difference between "not registered", "registered but long inactive" and "registered, recently active" changes what you do next. The first you drop. The second you can try once with a soft message. The third is your sending core.
Done when: every row has a status, and you have counts for each status per batch.
If you are doing this on WhatsApp at scale, the country-specific notes in /en/whatsapp cover what to watch for on this platform.
Step 5: Layer by activity, not just by validity
A registered number is not automatically worth messaging. Use whatever signals you have — last seen, profile photo presence, prior reply history, source recency — to split valid numbers into layers:
- Layer recently active. Send first, send your best content.
- Layer B: registered, activity unknown. Send a low-volume test wave before committing budget.
- Layer C: registered but long inactive. One re-permission message, then stop if there is no reply.
Layer C is where most wasted spend hides. Teams keep messaging it month after month because it "still looks valid".
Done when: each valid row has a layer tag and you know the size of each layer.
Step 6: Tag language, region and consent
Philippine contacts are not a single audience. Add three tags while you are already in the sheet:
- Language: English, Filipino, or mixed. Use the language of the original conversation if you have it.
- Region: Metro Manila, other Luzon, Visayas, Mindanao. This matters for send timing more than for targeting.
- Consent: where the contact came from and whether they ever replied. Treat "never replied" differently from "replied once last year".
Done when: every row in layers A and B has language and consent tags.
Step 7: Export, then run a 5% test wave
Export each layer separately, with a filename that states the list, the layer and the date. Never overwrite an old export; versioning is how you recover from a bad batch.
Then, before any full send, run a test wave of about 5% of layer A. Watch two numbers: delivery rate and reply rate. If delivery looks fine but replies are near zero, the problem is the message, not the list. If delivery itself is weak, stop and go back to step 4.
Done when: test wave results are recorded, and the full send plan is adjusted based on them.
Completion criteria at a glance
| Step | Output you should hold | Ready to move on when |
|---|---|---|
| 1. Consolidate | One sheet with source column | Row count recorded |
| 2. Normalise | +63 format, review tab | No unparsed rows left in main tab |
| 3. De-duplicate | Unique count, numbered batches | Per-batch counts saved |
| 4. Registration check | Status per row | Status counts per batch known |
| 5. Activity layers | A/B/C tags | Layer sizes known |
| 6. Tags | Language, region, consent | All A/B rows tagged |
| 7. Export + test | Versioned exports, test results | Test wave reviewed before full send |
Five mistakes that undo the whole workflow
Cleaning after sending instead of before. Sending first and cleaning the bounces afterwards burns account reputation you cannot buy back.
Mixing layers in one send. If layer C goes out with layer A, your signals become unreadable and you will blame the list for a message problem.
Deleting the review tab. Unparsed rows are often your highest-value contacts; deleting them is silent data loss.
Treating cleaning as a one-time project. Numbers go dead, people change SIMs. Re-run steps 2 through 5 on any list older than six months.
Skipping the test wave. A 5% test costs almost nothing and catches message problems before they reach your whole list.
Keeping other channels in sync
Most Philippine audiences are not on one platform only. Once a number is confirmed valid on WhatsApp, the same normalised list can be checked against other messengers you operate, so you are not paying to validate the same contact twice. If Telegram or Facebook are part of your mix, run them through the same seven steps — the country rules are identical, only the detection step differs. See /en/telegram for the Telegram variant.
Where cleaning fits in your overall cost
Cleaning is not overhead; it is the cheapest lever you have. Every invalid row removed is a message you do not pay for, an account you do not risk, and a support ticket you do not handle. Teams usually find that the first full pass removes a large share of the list, and that the remaining list outperforms the original by a wide margin on both delivery and replies.
Pricing for screening is volume-based rather than flat, so the economics improve as you clean in larger batches — details are on /en/pricing.
Summary
Run the seven steps in order, keep the outputs of each one, and never send a list that has not passed step 4. Start with the messiest list you have; that is where the largest gain usually sits. Once the routine is stable, schedule it: consolidate monthly, re-verify quarterly, and re-layer before every major campaign.