WhatsApp API phone number format for European numbers (E.164, the leading 0 and the missing +)
How to write a customer's phone number for the WhatsApp Business API: the + and country code, which European countries drop the leading 0, why Italy keeps it, and how to normalise numbers in code.
October 25, 2026 · 6 min read
If a WhatsApp API message is "sent" but never arrives, check the phone number before anything else. Two small things go wrong again and again with European numbers: a missing +, and a leading 0 that should have been removed (or, in Italy, kept).
All numbers in this guide are made up for illustration. Do not send to them.
The rule: plus sign, country code, number
Write every customer number in international format, also called E.164: a +, the country calling code, then the national number with no spaces. A UK mobile written locally as 07700 900123 becomes +447700900123.
Meta's documentation says plus signs, hyphens, brackets and spaces are accepted in send requests, and that it highly recommends including both the plus sign and the country calling code (Meta, Cloud API phone numbers reference, read 25 Oct 2026). Our own REST API reference asks for the same: to in international format with country code.
The trap: leave off the + and Meta adds your country code
Here is the sentence from Meta's page, quoted exactly (read 25 Oct 2026):
"If the plus sign is omitted, your business phone number's country calling code is prepended to the customer's phone number."
Meta adds: "This can result in undelivered or misdelivered messages."
Notice whose country code gets added: your business number's, not the customer's. That matters in Europe, where many businesses message customers in other countries.
Worked example (our reading of Meta's rule, not a captured API result). A business with a UK WhatsApp number sends to a Dutch customer and writes the number as 31612345678, with no plus. Under the rule above, the UK country code (44) is put in front, so the message is addressed to +4431612345678, not to +31612345678. Depending on whether that number exists, the message either never arrives or reaches someone else. We have not reproduced this against a live API key.
The fix costs one character: always store and send the +.
The leading 0: dropped in most countries, kept in Italy
In many countries, people dial a 0 in front of the area code or mobile prefix when calling inside the country. That 0 is a "trunk prefix". It is for domestic dialling only. In international format it is removed: UK 07700 900123 is +44 7700 900123.
This table is a summary for common European markets. It comes from Wikipedia's Trunk prefix and Telephone numbers in Europe articles, both read 25 Oct 2026, with Italy checked against Wikipedia's Telephone numbers in Italy article. The examples are invented.
| Country | Code | Local 0 in front? | Local written | International |
|---|---|---|---|---|
| United Kingdom | +44 | Yes, drop it | 07700 900123 | +447700900123 |
| Ireland | +353 | Yes, drop it | 087 123 4567 | +353871234567 |
| Germany | +49 | Yes, drop it | 0151 12345678 | +4915112345678 |
| Netherlands | +31 | Yes, drop it | 06 12345678 | +31612345678 |
| France | +33 | Yes, drop it | 06 12 34 56 78 | +33612345678 |
| Belgium | +32 | Yes, drop it | 0470 12 34 56 | +32470123456 |
| Sweden | +46 | Yes, drop it | 070 123 45 67 | +46701234567 |
| Finland | +358 | Yes, drop it | 040 1234567 | +358401234567 |
| Spain | +34 | No trunk prefix | 612 34 56 78 | +34612345678 |
| Portugal | +351 | No trunk prefix | 912 345 678 | +351912345678 |
| Norway | +47 | No trunk prefix | 412 34 567 | +4741234567 |
| Denmark | +45 | No trunk prefix | 20 12 34 56 | +4520123456 |
| Italy | +39 | Landlines keep the 0; mobiles have none | 02 1234 5678 (Milan landline) / 312 345 6789 (mobile) | +390212345678 / +393123456789 |
Italy is the one that surprises people. Wikipedia's Italy article says the leading 0 of landline numbers must be included when calling from abroad. If a script strips every leading 0 from every country, it breaks Italian landline numbers. (WhatsApp customers mostly use mobiles, but contact lists from shops and clinics often include landlines.)
Two caveats. Numbering plans change, and this table is a secondary-source summary, not a regulator's text. For anything important, check the national regulator or use a maintained library, as in the next section. And some numbers in a contact list will simply be wrong: a library can tell you a number is invalid, but it cannot guess a missing country.
Normalise numbers in code instead of writing your own rules
Google's libphonenumber is the usual answer, with ports for most languages. You give it the raw string and a default region (the country to assume when the number has no +), and it returns E.164 or tells you the number is not valid.
The two samples below show the shape of the calls. We did not run them for this guide and have not run them against a live API key. Check them against the library versions you install.
Node, with libphonenumber-js:
import { parsePhoneNumberFromString } from "libphonenumber-js";
// defaultRegion is the customer's country, e.g. "GB", "NL", "DE", "IT"
export function toE164(raw, defaultRegion) {
const parsed = parsePhoneNumberFromString(raw, defaultRegion);
if (!parsed || !parsed.isValid()) return null; // route to a "fix this number" list
return parsed.number; // "+31612345678"
}
Python, with phonenumbers:
import phonenumbers
def to_e164(raw: str, default_region: str) -> str | None: # needs Python 3.10+
try:
parsed = phonenumbers.parse(raw, default_region)
except phonenumbers.NumberParseException:
return None
if not phonenumbers.is_valid_number(parsed):
return None
return phonenumbers.format_number(parsed, phonenumbers.PhoneNumberFormat.E164)
Two habits that prevent most problems:
- Store the number as E.164 with the
+, and keep the customer's country as its own field. Do not store it as a number type: a leading 0 or+is lost, and the default region is a guess you want to avoid repeating. - Never send when validation fails. Put the row on a list for a person to fix. A skipped message is cheaper than one that reaches a stranger.
Spreadsheets and bulk sends
The same problem hits spreadsheets, with an extra twist: Excel can drop leading zeros and show long numbers in scientific notation. Export contact lists as text columns where you can.
In SendFromChat, when you import contacts from a CSV or Excel file, common formats are normalised to international format. Numbers should include the country code. We do not say it can repair numbers that have no country code, so keep the country code in your source data.
Quick checklist
- Every number has a
+and a country code before it reaches the API. - The leading 0 is removed for UK, IE, DE, NL, FR, BE, SE and FI numbers, and handled for Italy.
- A library validates, and you use a default region per customer, not one for the whole list.
- Failed validations go to a review list and are not sent.
- You tested with a test number first, then one real message to your own phone.
What we did not test
- We did not run the code samples above, or any API request, against a live API key for this guide.
- The UK-to-Netherlands example is our reading of Meta's rule, not a captured result.
- Country rules come from public secondary sources read on 25 Oct 2026 and may change.
Try it
Want to see how a send looks end to end? The /try page shows it in Claude, in Claude Code and in the dashboard. Or start the 30-day free trial (no card), connect a number and send a test message to your own phone first.
Related: the 24-hour window, error codes and WhatsApp Business API in Europe.
SendFromChat is independent. It is not made by, or affiliated with, Meta or WhatsApp. "WhatsApp" is a trademark of Meta.
Do this from your AI assistant
SendFromChat connects Claude, ChatGPT, Cursor or any MCP client to the WhatsApp Business API — templates, bulk sends, inbox, chatbots and sequences, just by asking. 30 days free, no card.
Start freeMore guides
Add WhatsApp to your app with Claude Code: connect it, then review four things
Connect Claude Code to SendFromChat with one command, ask it to add WhatsApp order notifications, then check what it wrote: where the key lives, retries, STOP replies and templates.
Questions to ask a WhatsApp provider before you sign: who owns your account, number and templates
Three questions to put to any WhatsApp Business API provider (BSP or Tech Provider) before you sign — who owns the WhatsApp Business Account, whether you can leave with your number and templates, and who bills Meta's charges.
Build a WhatsApp reply assistant with Claude (with a human hand-off)
Answer customer WhatsApp messages about your own business with the Claude API. A webhook, a restricted system prompt, a hand-off to a person, STOP respected and replies sent inside the 24-hour window.
WhatsApp appointment reminders from your app: a working example (with clock-change-safe timing)
Send WhatsApp appointment reminders from your own code with a REST API. A scheduled job, an approved template, time zones that survive the October clock change, safe retries and CONFIRM / CANCEL / STOP replies.