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:

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