Answer every channel. Automate any of it.
WhatsApp, Facebook and Instagram arrive in one inbox your whole team works from, each person with their own login. Whatever you would rather not type twice is one HTTP call, or an integration with the shop you already run.
Seven days free, no card. Connecting a number takes about two minutes and no technical setup.
Hi, is the 20 litre paint still in stock?
Morning Amina - yes, we have 6 tins in white.
Great. Can you send the price?
KES 4,200 a tin. Shall I hold two for you?
Channels
However they reach you, you read it in one place
Each conversation keeps a mark saying which channel it came from, so whoever answers always knows where their reply is going. Pages and Instagram accounts are part of your package rather than an extra charge, the same way your WhatsApp numbers are. When a channel is added, it appears in the same list.
Link the number you already give customers
Scan a code from the phone that has the number, or use Meta's Cloud API if you have that. Either way the conversations arrive in Njiwa and your team answers from there instead of passing one handset around.
Answer your Page's messages and its comments
Connect the Page with one button. Its Messenger conversations appear beside your WhatsApp ones, and the comments people leave on your posts get a screen of their own, grouped by the post they are on. A reply typed in Njiwa arrives as the Page, not as a person.
Direct messages and post comments, without the phone
Connect the Instagram professional account attached to your Page. Direct messages land in the same list and comments join the Facebook ones, so the person who answers customers does not need the Instagram password.
Facebook and Instagram are opening account by account while Meta completes its review of our app. If yours is not switched on yet, the Channels screen says so plainly rather than starting something it cannot finish.
Setting up
Nobody on your team has to be technical
No tokens, no app ids, no webhook addresses. The four steps below are the whole of getting a business answering customers in Njiwa.
Make an account
An email address and a password. Seven days free, no card. You do not have to decide on a plan to start.
Connect your channels
WhatsApp is a code you scan from the phone, the same way WhatsApp Web works. Facebook and Instagram are a Connect button and a list of the Pages you already run: pick the ones you want. Nothing asks you for a token, an app id or a webhook address.
Add your team
Invite colleagues by email. Each gets their own login and a role, so an agent can answer customers without being able to touch your keys or your plan. If you have two numbers, you can decide who sees which.
Start answering
Every conversation is in one list with a mark saying which channel it came from. That is the whole of it. Automation and code are there when you want them and nothing is waiting on them.
For the people answering
The number is shared. Being answerable for it should not be.
Most of a business's messaging is not the integration. It is three people in an office answering customers on a number the business owns, and needing to know who said what.
What they sent, not the word for it
A photograph opens as the photograph. A PDF invoice is read inside the conversation rather than found later in a downloads folder. Voice notes play where they arrived and a dropped pin opens in a map. Nobody downloads a file to find out what it is.
Everybody gets their own login
Invite colleagues by email and give each of them a role: run the account, manage it, answer customers, or read only. One password shared around an office is how a number ends up with nobody accountable for it.
Only the numbers they should see
A business with a sales number and an HR number can put the sales team on the sales number and leave the HR conversations where they belong. It fails closed, so a mistake shows somebody less than they should see rather than more.
Book the meeting they asked for
A customer asking to meet on Thursday is answered from the conversation: pick the day, and the invitation goes to them out of your own Google Calendar. Their address is filled in from the last time somebody met them, and what was booked drops into the reply box for you to send.
Who replied is on the record
Every outgoing message keeps the name of whoever sent it, whether that was a person, one of your keys, or an auto-reply. The customer sees your business number and nothing else, unless you switch signatures on and let them see who they are talking to.
For developers
And when you want it automated, it is one HTTP call
The same account, the same numbers, the same conversations. There is nothing to install and no SDK you are obliged to use: if your language can make an HTTP request, it can send a message.
curl -X POST https://njiwa.upeo.ai/v1/messages \
-H "Authorization: Bearer sk_live_your_key" \
-d '{"to": "0712345678", "text": "Your order has shipped"}'
{
"id": "msg_01J9ZK4Q7M2X8P0R3V6T5W1YHD",
"status": "sent",
"to": "254712345678",
"type": "text",
"created_at": "2026-08-31T09:14:02Z"
}
A test key that delivers nothing
Every account gets a live key, and can make a test key beside it. The test key validates every request and fires real webhooks, and sends nothing to anybody, so a whole integration can be built before one message leaves the building.
Status updates find you
Njiwa posts message.status to your endpoint as a message
moves from sent to delivered to read, and message.received
when somebody writes back. Every delivery is signed, so your handler can
prove the request came from us before it acts on it.
Or no code at all
If your shop runs on WooCommerce, Shopify, Magento, ERPNext or one of the other platforms we integrate with, there is nothing to write. The integrations install and ask for a key.
Sending a WhatsApp message from your code is the whole of it on one page, and the four ways a message starts covers the routes that need no code at all.
What you get
The details that decide whether an integration is pleasant
Most WhatsApp APIs can send a message. These are the things you notice in week three, when something has gone wrong at 9pm and you are reading a log.
Any country, any format
Send to +44 7700 900123, to 254712345678, or to a local 0712345678 that Njiwa resolves against your own number's country code. No formatting rules for your team to remember, and no silent failures because someone pasted a number out of a spreadsheet.
Files three ways
Attach a file by public URL, by direct upload, or by a media id you stored earlier and can reuse. Njiwa reads the real type from the file's own bytes rather than trusting what it is called, so a PDF renamed .jpg still arrives as a PDF.
One error shape, always
Every failure returns the same envelope with a type, a machine readable code, a sentence a human can act on, and a link to a page explaining that exact code. No guessing what a 400 meant.
Webhooks you can verify
Incoming messages and status changes are posted to your endpoint and signed with HMAC SHA-256, timestamped so a captured request cannot be replayed at you later. Every attempt is logged with what we sent and what came back.
Safe to retry
Send an Idempotency-Key and a repeat of the same request returns the same message id instead of a second message. A timeout on your side stops being a decision about whether to risk sending twice.
Paced on purpose
Messages leave one number at a set interval rather than as fast as the socket allows. Blasting is the fastest way to lose a number, so the default is deliberately unhurried and you can slow it further.
Accepted means it will go
Once Njiwa answers with an id, sending it is our problem. If the number is offline the message waits for it. If a send fails it is retried. If we restart in the middle, it is picked back up and sent. A message that genuinely cannot go is marked failed with a reason, never left sitting in a queue nobody is watching.
The whole conversation, both sides
Every contact is one thread with what they sent and what you sent, oldest to newest, and you can reply straight from it. Not a log of outgoing messages in one place and incoming ones in another, which is two lists nobody can read as a conversation.
Two ways to send WhatsApp
Two rails, and you should know which one you are on
Njiwa sends over the WhatsApp Web protocol, with a number you already own and no application to make. There is a second rail, Meta's official Cloud API, behind the same API and the same code. They are not equivalent, and the difference matters enough to put on the front page.
Compare the two rails
| Web rail | Cloud rail | |
|---|---|---|
| Approval from Meta | Not needed | Required, with business verification |
| Works with a number you already own | Yes | No, the number is dedicated to the API |
| Cost per message | None from Meta | Meta charges per conversation |
| Who can start the conversation | Either side | The customer, or a template you got approved |
| Message types | Anything WhatsApp supports | Templates outside the 24 hour window |
| Time to first message | About five minutes | Days to weeks, depending on verification |
| Same Njiwa API | Yes | Yes |
You always know which rail you are on
The Web rail is not the official Meta API and we never describe it as one. It is the multi-device protocol WhatsApp Web speaks, which is why it needs no approval and works with a number you already own.
The console labels every number with its rail, the API returns it on every instance, and Njiwa paces your sends by default, because a number that behaves like a person keeps working and one that blasts does not. The longer explanation.
What people build
Mostly, messages somebody is waiting for
Invoices and receipts
Attach the PDF your system already generates and send it to the number on the order. It arrives in the same app the customer is already reading.
Delivery and order updates
Tell someone their order has shipped without paying per message for an SMS that may not be read.
Appointment reminders
Fire them from a cron job. Replies come back to your webhook, so a customer answering the reminder reaches a person.
Two way support
Incoming messages arrive at your endpoint within a second. Reply from your own system, or from the console, where each customer is a single thread showing both sides of what was said.
If the messages you want are order updates, there is probably no code to write at all: the integrations do this for WooCommerce, Shopify, Magento, PrestaShop, OpenCart, Shopware, Medusa, ERPNext and Odoo, with every event off until you switch it on.
Signals
And then it tells you what all of it was about
A year of conversations is the best market research your business will ever have and nobody has time to read it. Signals does: what people asked for that you could not give them, where conversations die, how long customers actually wait, and which advert brought them.
A free report with no AI in it
Words your customers actually used, ranked by how many different people said them rather than how often they were typed. Reply times counted twice - once with your auto-reply and once without it, because a robot answering in four seconds is not you answering.
A paid read of whole conversations
"Tyres" becomes "195/65 R15". "They went quiet" becomes "they stopped replying after you gave the price". You are told what it will cost before it runs, and reading again only pays for the conversations that have moved since.
Every figure opens onto the people
Thirteen people were never answered - click it, and there are the thirteen by name. Clicking one opens that conversation in the Desk with the reply box under it. The list and the figure are the same count.
Nobody is opted into any of it, the paid half is prepaid rather than billed, and an account that has told Njiwa not to keep message content cannot turn it on at all. How Signals works.
Questions worth asking first
Do I need a developer to use Njiwa?
No. Connecting a WhatsApp number is a code you scan from the phone, and connecting a Facebook Page or an Instagram account is a button and a list of the Pages you already run. Nothing asks you for a token, an app id or a webhook address. The API is there for the businesses that want their own system sending messages, and it is one of four ways a message can start rather than the only one.
Can my team answer Facebook and Instagram messages here too?
Yes. A connected Page's Messenger conversations and a connected Instagram account's direct messages arrive in the same list as WhatsApp, each marked with the channel it came from, and a reply typed in Njiwa goes back out on that channel. Facebook and Instagram are opening account by account while Meta completes its review of our app; until yours is switched on, the Channels screen says so rather than starting something it cannot finish.
Can we answer the comments on our posts too?
Yes, and they get a screen of their own rather than being mixed into the conversations. Comments on your Facebook and Instagram posts arrive grouped by the post they are on, because three comments under one photograph is one job. You reply in public as the Page, and you can hide a comment that is spam or abuse, which takes it off the post for everybody but its author and can be undone. Njiwa will not delete somebody else's comment at all, only your own replies.
How do we know what still needs answering?
The Desk splits itself into what is unanswered and what has been answered, and a conversation moves between them on its own. A reply that failed to send does not count as an answer, and neither does an auto-reply, so nothing is marked dealt with because a machine said something. A conversation that needs no reply can be settled, which clears it without anybody pretending to have answered, and if that person writes again it is waiting again. Opened conversations stop being unread for the whole team rather than for one person.
Can we book a meeting with a customer from the conversation?
Yes, into your own Google Calendar. A button in the reply box opens a month rather than a date field, their email address is already filled in from the last meeting somebody booked with them or from their contact record, and you can add a Google Meet link and other guests. Google emails them the invitation from your address, and what was booked drops into the reply box as a message for you to send. The calendar belongs to the person, not to the account: a colleague connects their own, nobody else on the account can see or use it, and Njiwa asks Google only for permission to create events.
What does a Facebook Page or an Instagram account cost?
Nothing on its own - they are part of the package. Growth includes one, Scale includes three, Team includes five, Business includes ten, and the high volume packages put no ceiling on them at all. Starter includes none, so connecting your first one is the reason to move to Growth. A Page and the Instagram account attached to it count as two, because they are two inboxes. Past what your package includes, connecting another is refused rather than billed, and the refusal names the package that would carry it. Disconnecting one frees the place immediately and keeps every conversation it brought in.
What counts as a message?
One message you send to one recipient. It counts the same whether it started from the API, the shared inbox, an auto-reply or a campaign, and a message to a group counts once. Messages arriving from other people are never counted, however many there are - so a busy month of customers writing to you costs nothing. Sends on a test key are not counted either, because they are not delivered to anybody, and neither is a message that failed to send.
What happens when I use up the month's messages?
Sending pauses. Nothing else does. Messages coming in still arrive, the shared inbox still works, and anybody mid-conversation with you can still reach you - it is only your outbound sending that waits for the cycle to reset or for you to move up a tier. We warn you in the console and by email at eighty percent and again at a hundred, so the first you hear of it is not a message that would not send. There is no charge for going over: the ceiling is a stop rather than a meter, and there is no overage billing on any package. The first time an account ever runs out we add twenty percent on top, once, and tell you it was one-time - nobody's first meeting with a limit should be a customer left waiting.
What happens when the media storage fills up?
Uploading a file is refused and everything else carries on. Messages coming in still arrive, photographs customers send are still stored and still shown, and nothing already in a conversation is touched. We write at eighty percent and again when it is full, saying where the space went, because an account fills this by receiving photographs rather than by doing anything - and the alternative is finding out weeks later when an upload fails. Deleting a conversation gives its space back. Photographs are also re-encoded on the way in to something nearer the size anybody looks at, which makes the allowance go several times further without anybody being asked to do anything.
How do I move up a package part way through a month?
From the console, and it applies the moment it goes through. You are charged for the rest of the cycle only, not another full month, and the larger message allowance applies at once - so an account that has run out can be sending again in about a minute. Moving down is the other way round: it takes effect at your next renewal rather than mid-cycle, so you keep what you have already paid for, and we will not let you move down to a package smaller than what you are currently using without telling you what has to come off first.
Why does the Cloud API become compulsory on the bigger tiers?
Because of what is at stake by then. Connecting your own number is the fastest way to start and WhatsApp can restrict a number at any time, without warning and without appeal - at a few hundred messages a month that is a bad afternoon, and at a hundred thousand it is a business off the air. The Cloud API is the rail with an agreement behind it, so from the Volume tier upwards it is the only one we will run, and we ask for your Meta business verification before switching the tier on rather than after.
How are Meta's own fees billed?
Only on the high volume packages, because they are the only ones where Meta charges per conversation. What Meta charges for your conversations is passed through at cost plus fifteen percent and itemised on your invoice, so what we add is a line you can read rather than a margin hidden inside a price. It is the only charge anywhere that sits outside a package price. On every other package there is no per conversation fee at all.
Does the customer see which of my staff replied?
No. They see your business name and number, exactly as they did before. If you would rather they knew who they were talking to, you can switch signatures on and each reply carries the name of the person who sent it, but that is off unless you choose it.
What is the difference between the two rails?
The Cloud rail is the official WhatsApp Business Cloud API from Meta: it needs business verification and a dedicated number, and Meta charges per conversation. The Web rail uses the multi-device protocol that WhatsApp Web speaks, needs no approval and works with a number you already own, and you can be sending in about five minutes. Njiwa labels which rail every number is on, in the console and in the API.
How do I keep a number healthy?
Behave like a person. Pace your sends, which Njiwa does for you by default. Message people who are expecting to hear from you rather than a bought list. Let them reply, and answer when they do. Warm a new number up over a few days instead of opening at full volume. Keep your contacts in Njiwa rather than only on the phone, so that changing number is an afternoon rather than a disaster.
How long does it take to send the first message?
About five minutes. Create an account, and you get a live key straight away; a test key is one click away on the API keys screen. Link your own WhatsApp number, then send with the test key first: it validates every request, stores every message and fires real webhooks, and delivers nothing to WhatsApp. The live key sends from the same number, so nothing changes but the key.
Is there anything I have to do after signing up?
Confirm two things within 72 hours: the email address you signed up with, by clicking a link, and a WhatsApp number, by messaging us from it. We never message you first for this, because sending codes to numbers that did not ask is how a number gets banned. An account that confirms neither is locked at 72 hours and removed at 96, which is what keeps this from being a free service for people signing up with throwaway addresses. Nothing is ever deleted from an account that has paid us or that has real customer traffic on it.
What if we lose an API key?
An owner can read it back by typing their password. It is a handful of attempts and then a wait, it is refused while somebody from Njiwa is supporting your account, and every reveal is written into your audit log with who did it and when. The key is stored sealed with a secret that is not in the database, so a stolen copy of the database opens nothing on its own. The webhook signing secret works the same way. Some older keys are stored only as a hash and can never be shown, because we do not know them either - the console marks which, and those have to be replaced.
Do I need to install anything?
No. It is an HTTP API, so curl, PHP, Python, Node, Go or whatever you already use will do. There are thin SDKs for PHP, Node and Python if you would rather not write the HTTP yourself.
Can more than one person use it?
Yes. Everybody gets their own login and one of four roles: an owner runs the account including the plan, an admin does everything except change the plan, an agent reads conversations and replies, and a viewer reads without sending. An agent and a viewer never see your API keys or your billing, so somebody answering customers all day cannot revoke the key your website sends on. You can also restrict somebody to particular numbers, so a business with a sales number and an HR number can keep each team to its own. Each package includes people - two on Starter, four on Growth, eight on Scale, fifteen on Team, thirty on Business and more above that - and that number is the limit: an invitation past it is refused rather than accepted and billed, and the refusal names the package that would carry them. Nobody is charged per person.
Can my customers see which of my staff replied?
No, unless you decide they should. WhatsApp shows the recipient your business number and there is no per agent identity on a shared number, so who replied is something your console knows and your customer does not. If you would rather they knew, one setting puts the sender's name in front of the message. It is off until you turn it on, and it is never applied to messages your own code sends or to auto-replies, where a person's name would be a lie about who wrote it.
What happens if the number is offline when I send?
The message waits and goes when the number reconnects. Nothing is thrown away for being early. The same is true of a send that fails for a moment: it is retried, with a widening gap, rather than given up on. A message that genuinely cannot be sent is marked failed with a reason you can read, because the one thing worse than a message that did not go is a message that did not go and said nothing.
Where is my data?
On a server we run, and we can tell you which one. Media files are stored on disk and served through signed, expiring links rather than left readable to anyone who guesses a filename. Messages are stored so that you can see what happened to them.
Who is behind Njiwa?
UPEO.AI. Message 0116888777 on WhatsApp and you reach a person, not a queue.
Start answering customers today
Seven days free and no card. Connect a channel, invite the people who answer, and see the whole thing working before you decide anything. The keys and the test key are there from the first minute if you want them.
Start a 7 day trial