WhatsApp display name rejected? The rules, the fix, and the 14-day re-register
Why Meta rejects a WhatsApp Business display name, what each rejection reason in the webhook means, how to edit and resubmit it (10 edits in 30 days), and the 14-day window to re-register the number after approval. Includes a mock-tested Node script.
November 11, 2026 · 9 min read
A display name is the business name people see in the chat header. Meta reviews it, and a rejected one can hold up a number that is otherwise ready. Most rejections come from a short list of rules, and Meta's API tells you which rule you broke.
This page covers the rules, how to read the rejection reason, how to edit and resubmit the name, and one step people miss: after a display name change is approved, you have 14 days to register the number again.
SendFromChat is an independent product and is not affiliated with Meta or WhatsApp. It runs on Meta's official WhatsApp Cloud API. Meta's rules change; where this page relies on Meta it names the page and the date we read it (11 November 2026). We do not know how long a review takes (Meta's page gives no duration) and we cannot promise a name will pass.
The short version
| Question | What Meta's docs say |
|---|---|
| What must the name be? | Your business name, in line with your branding or legal name. Three principles: policy compliance, accurate representation, a clear relation to your legal name or branding. |
| Name rejected, what now? | Edit it and submit again, or appeal through Developer Support. |
| How many edits? | Up to 10 in 30 days. |
| Name change approved, what next? | Register the number again within 14 days. If the window expires, submit the name for review again. Registering before approval has no effect. |
| How do I find out the result? | A phone_number_name_update webhook and a Business Suite notification, or poll the number's new_name_status. |
What Meta does not accept
These come from Meta's Help Centre page "Display name guidelines for the WhatsApp Business platform", with Meta's own examples where it gives them:
| Don't | Meta's example | What to do instead |
|---|---|---|
| Use a generic term as the name | "Fashion", "Juice" | Use your actual business name. |
| Use a generic place | "New York" | Use your business name; a place on its own does not identify you. |
| Put "Official" or "Verified" in it | n/a | Drop the word. |
| Refer to Meta or its apps | "Minni's Muffins WhatsApp" | Use "Minni's Muffins". |
| Add promotion | "– 20% off sale" | Keep the name to the business name only. |
| Format it as a website or email address | n/a | Use the brand name, not the address. |
Meta's accepted examples include "Fresh Produce by Global Grocers Inc." and an abbreviation, "FP Cold Pressed Juices". Where a brand and the company behind it are not obviously linked, Meta says the relationship should be evident on your website, and Meta's "by [company name]" example is "Fruit Snacks by Fresh Produce".
The rule behind most consistency rejections: the name should match what a reviewer finds outside WhatsApp, on your website and social pages, or your verified legal name. If your website says "Acme Studio" and your display name says "Acme Plumbing Ltd", expect a question.
Read the rejection reason
When Meta decides on a name, it sends a phone_number_name_update webhook. The decision is APPROVED, DEFERRED, PENDING or REJECTED. On a rejection the payload carries a rejection_reason. Meta's webhook reference lists these values:
rejection_reason |
What to try (our reading of Meta's guidelines) |
|---|---|
NAME_FORMAT_UNACCEPTABLE |
Fix the format: business name only, no website, email, promotion or "Official". |
NAME_NOT_CONSISTENT |
Make the name match your website and social branding, or your legal name. |
NAME_ENDCLIENT_NOTRELATED |
Show the link to that business on your website, or use your own business name. |
NAME_EMPLOYEE_ISSUE |
Use the business name, not a person's name or employee ID. |
NAME_INDIVIDUAL_ISSUE |
Use the business name, not a person's name or employee ID. |
UNKNOWN |
No reason given. Check the rules above, then contact Meta support. |
The "what to try" column is our reading, not Meta's wording; Meta's webhook reference lists the reason codes without prescribing fixes.
Edit the name
In WhatsApp Manager: Account tools > Phone numbers > pick the number > Profile > Display name > Edit. Meta says you can make up to 10 display name edit requests in a 30-day period. Numbers with an Official Business Account status must contact Meta's direct support instead.
Through the API, you send the new name on the phone number ID and read the state back:
curl -X POST "https://graph.facebook.com/v27.0/PHONE_NUMBER_ID?new_display_name=Acme%20Studio" \
-H "Authorization: Bearer ACCESS_TOKEN"
curl "https://graph.facebook.com/v27.0/PHONE_NUMBER_ID?fields=verified_name,name_status,new_display_name,new_name_status" \
-H "Authorization: Bearer ACCESS_TOKEN"
verified_name and name_status describe the name in effect. new_display_name and new_name_status describe the request under review. Meta runs verification automatically when your number reaches a higher messaging limit; its page states no review time, so do not plan a launch around a date.
Name change approved? Register the number again, within 14 days
This is the step people miss. Meta says that after a display name change is approved you have 14 days to re-register the phone number, and that if the window expires without re-registration you must submit the display name for review again. The call is the same one used for first registration:
curl -X POST "https://graph.facebook.com/v27.0/PHONE_NUMBER_ID/register" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"messaging_product":"whatsapp","pin":"YOUR_6_DIGIT_PIN"}'
Meta also says that re-registering before the change is approved has no effect. So wait for the approval, then register. The register call has its own limit (10 requests per 72 hours), and it needs the right PIN: read the two-step verification PIN guide before you retry anything.
A script: pre-check a name, ask for it, read the result
The script below does four things. lintName is a rough pre-check of the written rules, not Meta's review: it flags obvious problems such as a web address, "Official", a Meta product name or promotional words, and it can't judge whether the name matches your website. getNameStatus and requestNewName call the two endpoints above. describeNameUpdate turns a phone_number_name_update webhook body into one readable line per change, for a log or a chat message.
// Display name helpers for the WhatsApp Cloud API. Node 18+, no dependencies.
// lintName() is a rough pre-check of the written guidelines. Meta's review decides.
const GRAPH = process.env.GRAPH_BASE ?? "https://graph.facebook.com/v27.0";
export function lintName(name) {
const n = name.trim();
const problems = [];
if (n.length < 3) problems.push("Too short to identify a business.");
if (/https?:\/\/|www\.|\.(com|net|org|io|co|app)\b/i.test(n)) problems.push("Looks like a website address.");
if (/\S+@\S+/.test(n)) problems.push("Looks like an email address.");
if (/\b(official|verified)\b/i.test(n)) problems.push('Contains "Official" or "Verified".');
if (/\b(whatsapp|meta|facebook|instagram|messenger)\b/i.test(n)) problems.push("Refers to Meta or one of its apps.");
if (/\d+\s*%|\boff\b|\bsale\b|\bbest\b|\bcheapest\b/i.test(n)) problems.push("Reads like promotional language.");
return problems;
}
export async function getNameStatus(phoneNumberId, token) {
const url = `${GRAPH}/${phoneNumberId}?fields=verified_name,name_status,new_display_name,new_name_status`;
const res = await fetch(url, { headers: { Authorization: `Bearer ${token}` } });
const body = await res.json();
if (!res.ok) throw new Error(`Graph ${res.status}: ${body?.error?.message ?? "unknown error"}`);
return body;
}
export async function requestNewName(phoneNumberId, token, newName) {
const problems = lintName(newName);
if (problems.length) return { sent: false, problems };
const url = `${GRAPH}/${phoneNumberId}?new_display_name=${encodeURIComponent(newName)}`;
const res = await fetch(url, { method: "POST", headers: { Authorization: `Bearer ${token}` } });
const body = await res.json();
if (!res.ok) throw new Error(`Graph ${res.status}: ${body?.error?.message ?? "unknown error"}`);
return { sent: body.success === true, problems: [] };
}
const WHAT_TO_DO = {
NAME_FORMAT_UNACCEPTABLE: "Fix the format: business name only, no website, email, promotion or 'Official'.",
NAME_NOT_CONSISTENT: "Make the name match the branding on your website and social pages, or your legal name.",
NAME_ENDCLIENT_NOTRELATED: "Show the link to that business on your website, or use your own business name.",
NAME_EMPLOYEE_ISSUE: "Use the business name, not a person's name or employee ID.",
NAME_INDIVIDUAL_ISSUE: "Use the business name, not a person's name or employee ID.",
UNKNOWN: "Meta gave no reason. Check the guidelines, then contact Meta support.",
};
// Turns a phone_number_name_update webhook body into one line per change, to log or post to Slack.
export function describeNameUpdate(body) {
const out = [];
for (const entry of body?.entry ?? []) {
for (const change of entry.changes ?? []) {
if (change.field !== "phone_number_name_update") continue;
const v = change.value ?? {};
if (v.decision === "APPROVED") {
out.push(`${v.display_phone_number}: "${v.requested_verified_name}" approved. Re-register the number within 14 days.`);
} else if (v.decision === "REJECTED") {
const next = WHAT_TO_DO[v.rejection_reason] ?? WHAT_TO_DO.UNKNOWN;
out.push(`${v.display_phone_number}: "${v.requested_verified_name}" rejected (${v.rejection_reason ?? "no reason"}). ${next}`);
} else {
out.push(`${v.display_phone_number}: "${v.requested_verified_name}" is ${v.decision ?? "unknown"}. Nothing to do yet.`);
}
}
}
return out;
}
Usage:
import { lintName, requestNewName, getNameStatus } from "./display-name.mjs";
console.log(lintName("Acme Official WhatsApp"));
// [ 'Contains "Official" or "Verified".', 'Refers to Meta or one of its apps.' ]
const r = await requestNewName(PHONE_NUMBER_ID, ACCESS_TOKEN, "Acme Studio");
console.log(r.sent ? "Requested." : r.problems);
console.log(await getNameStatus(PHONE_NUMBER_ID, ACCESS_TOKEN));
What we ran, and what we did not. We ran this against a local mock server we wrote ourselves; it is not Meta. 15 checks passed, covering the lint rules, a name request and status read, an API error, and the webhook helper's decisions and reasons. We did not run it against Meta, because that needs a number and a token. Treat it as a starting point. If you receive the webhook yourself, verify the signature and handle repeats as described in the webhooks guide.
Checklist before you submit
- Is the name your business name, with no "Official", "Verified", promotion, web address or email?
- Does it avoid WhatsApp, Meta, Facebook and Instagram?
- Is it more specific than a generic word or a place?
- Does your website show the same name, or the link between brand and company?
- If the brand and the company are not obviously linked, did you use "Brand by Company"?
The wider list of what a number needs is in WhatsApp Business API requirements. If you are stuck before this step, see WhatsApp number won't connect?.
What we have not checked
- How long Meta takes to review a name. Meta's page gives no duration.
- Your odds of approval. The rules above are the written ones; reviewers decide.
- The exact behaviour of the appeal route. Meta says to use Developer Support; we have not filed one.
- The script against Meta. It ran against a mock only.
Where SendFromChat fits
SendFromChat does not change your display name. That stays in WhatsApp Manager; the dashboard shows the status Meta reports (for example "In review" or "Declined by Meta") and links you there. We do not currently act on the phone_number_name_update webhook, so use Meta's notification or the script above. When the name is sorted, connect your number: the 30-day free trial needs no card. If you run Meta's API yourself, the Cloud API setup guide covers Meta's side.
Sources
All read 11 November 2026; we saw no "last updated" date on any of them.
- Meta Business Help Centre, "Display name guidelines for the WhatsApp Business platform": https://www.facebook.com/business/help/757569725593362
- Meta for Developers, "Display names": https://developers.facebook.com/documentation/business-messaging/whatsapp/display-names
- Meta for Developers, webhook reference
phone_number_name_update: https://developers.facebook.com/documentation/business-messaging/whatsapp/webhooks/reference/phone_number_name_update/ - SendFromChat code checked 11 November 2026: the dashboard reads
verified_name,name_statusandnew_name_status; the display name is not editable in SendFromChat.
SendFromChat stores data in Mumbai, India; transfers from the EU and UK are covered by the Standard Contractual Clauses and the UK Addendum in our Data Processing Agreement.
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
Send WhatsApp messages from Zapier or Make with one HTTP request
Send WhatsApp template messages from a Zap or a Make scenario using a plain webhook or HTTP step, with a test key, idempotent re-runs, refusal handling and a webhook for delivery status and replies.
WhatsApp two-step verification PIN: what to do when register asks for it
What the 6-digit two-step verification PIN does on the WhatsApp Cloud API, when the register call needs your existing one, how to change a forgotten PIN, why you should not loop the call (10 tries in 72 hours), and Meta's PIN deprecation for eligible numbers.
Send a WhatsApp message when a Stripe payment fails (and when it succeeds)
Tell a customer on WhatsApp when their Stripe invoice payment fails, with a link to fix it, and send a receipt when it is paid. A signed-webhook Node server, two templates, no double sends on Stripe retries.
Send yourself WhatsApp alerts from a script (cron, CI, uptime check)
Get a WhatsApp message on your own phone when a cron job, CI run or health check fails. One approved template, one REST call, a Node script, a bash cron check and a GitHub Actions step, with no double alerts on retries.