Coexistence, properly explained.
One WhatsApp number, two clients: the Business app on a phone and the Cloud API in your stack. Here is exactly how it works, what imports, and where the limits are — including the ones that would change your mind.
What coexistence actually is
Coexistence is a Meta feature that lets one WhatsApp business phone number be driven by two things at the same time: the WhatsApp Business app on the owner's phone, and the Cloud API, through a partner application like ours. It went generally available for solution providers in February 2025.
It is not a workaround, a session hack or an unofficial client. Onboarding uses Meta's own Embedded Signup flow for businesses that already have a WhatsApp Business app account — the number is already registered, so the registration step is skipped entirely.
Meta keeps the two sides in sync, in four directions:
- Messages Cosend sends through the Cloud API appear in the app on the phone.
- Messages the owner sends from the app are mirrored to us as message-echo webhooks, so the inbox is never missing half a conversation.
- Inbound customer messages arrive as webhooks and show up in the app.
- The app's address book is mirrored to us, and up to 180 days of chat history can be imported once.
What you keep
Five things, and they are the ones that usually stop a business from adopting an API at all:
- Your number. Not ported, not resold, not re-registered.
- Your phone. The WhatsApp Business app stays installed and keeps working on the same number, at the same time as the API.
- Your chats. Existing conversations stay where they are.
- Your Meta billing relationship. Meta invoices your WhatsApp Business Account directly, at Meta's rates. Nobody resells your messages to you.
- Your catalog and your business profile. These live in the app and coexistence does not change them. What the API can do with a catalog is a different question, and it is answered in the table below.
The 180-day import, and its one shot
During onboarding the owner taps Confirm in the app, and Meta begins streaming prior conversations to us in three phases — day 0 to 1, day 1 to 90, then day 90 to 180 — with a progress figure as it goes.
It runs once. One attempt per onboarding cycle, and it must complete within 24 hours of onboarding or the connection has to be offboarded and started again. That is Meta's constraint, not ours, and it is the single most consequential sentence on this page: if the import is missed, recovering it means disconnecting in the app and re-running the whole flow.
New conversations are unaffected either way. History is worth having and it is not a blocker — a connection with no imported history sends, receives and automates exactly as well as one with it.
The limits, stated plainly
Coexistence is good and it is bounded. These are Meta's constraints rather than ours, and we would rather you knew them before you built on them.
Every row below says which of the two surfaces it applies to, because almost everything written about coexistence gets this wrong. There is the app on the phone, which keeps working — that is the whole promise — and there is the Cloud API on the same number, which is where the limits live. “Catalogs are not supported” is the classic example: true of the API, false of the app, and a retailer who reads the flat version leaves for no reason.
| Limit | Applies to | Value | What it means |
|---|---|---|---|
| History import | Cloud API | 180 days | Messages sent or received in the 180 days before onboarding import into Cosend. Older chats stay on the phone, where they still work. |
| Import window | Cloud API | 24 hours, once | The sync runs once per onboarding and must complete within 24 hours of it. There is no second attempt — reconnecting means disconnecting first. |
| Send throughput | Cloud API | 20 messages / second | Per number, fixed. Coexistence numbers cannot be upgraded to a higher tier, so a large campaign is bounded by arithmetic rather than by budget. |
| Unique recipients | Cloud API | 250 → 2,000 / 24 h | Meta’s messaging limit for a new business portfolio, which binds long before the send rate does. It rises with sustained quality. |
| Media in imported chats | Cloud API | 14 days | Media attached to imported messages is retrievable only for messages sent within 14 days of onboarding. Older attachments import as text placeholders. |
| Group chats | Cloud API | Not available | Groups are not synced to the API and are excluded from the import, so they never reach Cosend. They are untouched in the app. |
| Catalog and product messages | Cloud API | Cannot send | Your catalog and business profile keep working in the app. The API cannot send catalog messages on a coexistence number. |
| The catalog, the business profile, the number | The app | Unchanged | Coexistence’s promise is that the phone is untouched, and this is that promise rather than a list Meta publishes — see the note below the table. |
On the last row, plainly: Meta documents what the Cloud API can and cannot do on a coexistence number, and does not publish a feature-by-feature list of what the app keeps. Everything above the last row is from Meta's own documentation. The last row is coexistence's promise, which we have not seen Meta enumerate — so if one specific app feature is the reason you are here, ask us before you rely on it and we will find out rather than guess.
Throughput cannot be raised on a coexistence number: the upgrade path that exists for ordinary Cloud API numbers is unavailable here. Twenty a second is 72,000 an hour in theory, but the unique-recipient limit above binds long before that does — so plan a campaign against recipients, not against seconds.
What changes, and on which side
The honest half of the page. Three of these are things the API cannot do; four are things that genuinely change on the phone, and those are the ones that surprise people on day one if nobody says them out loud beforehand.
- Voice and video calls Cloud API
- Cosend cannot place or receive WhatsApp calls on a coexistence number, so there is no call feature in the product. If your business runs on voice, the API is not where you will get it.
- Group chats and Channels Cloud API
- Not synced, not supported, and excluded from the history import.
- View-once and live location Cloud API
- Neither crosses to the API side.
- Broadcast lists The app
- Existing lists become read-only on the phone. Promotional sends move to approved marketing templates, which cost money per message and need review.
- The app’s own messaging tools The app
- Quick replies, away messages, greeting messages and label automations stop working in the app. Cosend reimplements greeting, away and quick replies in the free tier, because onboarding that removes features is not onboarding.
- Disappearing messages The app
- Turned off for one-to-one chats after onboarding. Worth telling anyone who chose that setting deliberately.
- Linked devices The app
- Companion apps are unlinked at onboarding and can be re-linked afterwards — except Windows and WearOS, which are not supported at all. Expect to sign back in to WhatsApp Web.
Why a connection drops, in Meta's own words
When a coexistence link ends, Meta tells us why. There are six reasons, and each one has a different fix — which is why we show you the fix rather than the error code:
| Reason | What it means, and what to do |
|---|---|
| PRIMARY_INACTIVITY | The WhatsApp Business app has not been opened on the phone recently. Open it, then reconnect. |
| COMPANION_INACTIVITY | A linked device went inactive. Open WhatsApp Business on the phone and reconnect. |
| CHANGE_NUMBER | The WhatsApp number changed. Connect the new number to carry on. |
| USER_RE_REGISTERED | The number was re-registered on WhatsApp, which ends the API connection. Reconnect to resume. |
| BUSINESS_DOWNGRADE | The account was downgraded from WhatsApp Business. Switch back, then reconnect. |
| ACCOUNT_DISCONNECTED | The connection was removed from the WhatsApp Business app’s own settings. |
The first of those is the one that catches people: if the phone stops opening the WhatsApp Business app, the link eventually ends. Meta names the reason but does not publish a threshold, so we do not quote one — we infer liveness from the message traffic we already receive and warn you when a number has gone quiet, rather than asking you to remember a countdown.
Whatever the reason, sends stop immediately, the inbox stays readable, and the history stays where it is.
Where to go next
One connection is free — the API, the webhook routing and the shared inbox, with no card and no trial clock.