Sparrow Messenger connects your Facebook page to an inbox shared by your teams: routine requests answer themselves, the rest reach the right person, and the full history stays attached to the contact in your CRM.
Click a use case to see in detail how Sparrow Messenger sets it up for your business.
Messages sent to your page no longer land on one person's phone. They arrive in a shared inbox where every conversation is assigned, tagged and tracked — with the contact's full history in front of the agent.
Opening hours, address, order tracking, item availability: these requests make up most of the volume and teach your teams nothing. A guided journey answers them instantly, at any hour, and hands over to an agent as soon as the question falls outside the script.
A Facebook or Instagram ad that opens Messenger gives you an identified contact from the first click: no form to fill in, no mistyped email address. The conversation starts on the product seen in the ad, and you know which campaign it came from.
One HTTP request is enough to post a message into an open conversation: order confirmation, shipping notice, appointment reminder. Inbound messages are returned to you by webhook, so your application can reply on its own.
Every conversation carries its first response time, its resolution time, its agent and its tag. You can see where volume concentrates, which hours are understaffed, and which requests would be worth automating.
One channel, different rules: within twenty-four hours of a customer's message you write freely; beyond that, only certain categories of message remain permitted by Meta.
Questions, complaints and information requests, handled by your agents from a shared inbox.
24-hour windowOpening hours, address, order tracking: a guided journey answers without involving anyone.
Available 24/7The ad opens a conversation instead of a landing page, and the source stays attached to the contact.
Campaign source keptOrder placed, parcel shipped, ready for collection: triggered by your application.
Post-purchase tagConfirmation, reminder the day before, rescheduling offered in one button.
Confirmed event tagPassword change, case update, document expiry.
Account tagThe customer subscribes to your updates in one click, and receives your messages at the frequency they accepted.
On explicit opt-inCatalogue browsed in the conversation, basket built, payment completed by link.
Carousels and buttonsA comment under a post gets a public reply and a private message.
Public and privateThe shared inbox, automation and the API in one subscription, with no extra tool to plug in.
Every conversation on your page in one screen, assigned, tagged and tracked. Internal notes, mentions between colleagues, and handover without losing the thread.
Persistent menu, ice breakers, quick replies and buttons. Routine requests settle themselves and an agent takes over whenever needed.
The Messenger profile, the conversation history and your CRM data on one screen. The agent knows who they are talking to before replying.
The platform shows how long you have left to reply freely and suggests the right tag once the window has closed. No Meta rule broken by accident.
First response time, resolution time, automated share, contact source. CSV export, weekly report, API feed.
Your applications send and receive messages without going through the interface. One token per application, a test environment, and examples in the main languages.
No proprietary library to install. The REST API is called from any language, and the shared inbox remains available for conversations handled by your agents.
POST /api/v1/login with your credentials returns a token
(api_token) that you then place in the
Authorization: Bearer {api_token} header of every request.
One account can hold several applications, each with its own token:
statistics stay separate, application by application.
| Operation | Method | URL |
|---|---|---|
| Get a token | POST | https://app.sparrowmessage.com/api/v1/login |
| Send a message | POST | https://app.sparrowmessage.com/api/v1/messenger/send/one |
| Receive a message | POST inbound | https://your-site.com/sparrow/webhook |
| Message status | POST | https://app.sparrowmessage.com/api/v1/messenger/status |
| Status of a list | POST | https://app.sparrowmessage.com/api/v1/messenger/status/bulk |
SEMS
Amplitude HR
1 — Get the token, then send a message.
<?php
$base = 'https://app.sparrowmessage.com/api/v1';
// — Authentication: keep the token, don't request a new one for every send
$ch = curl_init("$base/login");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Accept: application/json', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'email' => 'you@company.com',
'password' => 'your-password',
]),
]);
$token = json_decode(curl_exec($ch), true)['api_token'];
curl_close($ch);
// — Send a message
$ch = curl_init("$base/messenger/send/one");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Accept: application/json',
'Content-Type: application/json',
"Authorization: Bearer $token",
],
CURLOPT_POSTFIELDS => json_encode([
'recipient' => '718294106203941',
'text' => 'Your verification code is 385 214.',
// Optional: Sparrow will post status changes here
'notifyurl' => 'https://your-site.com/sparrow/status',
]),
]);
$reponse = json_decode(curl_exec($ch), true);
curl_close($ch);
// Every response carries a code field: OK or KO
echo $reponse['code'] === 'OK' ? "Message envoyé\n" : "Échec : {$reponse['error']}\n";
Single send, then bulk send.
import requests
base = 'https://app.sparrowmessage.com/api/v1'
# — Authentication
token = requests.post(f'{base}/login', json={
'email': 'you@company.com',
'password': 'your-password',
}).json()['api_token']
headers = {'Authorization': f'Bearer {token}', 'Accept': 'application/json'}
# — Send a message
r = requests.post(f'{base}/messenger/send/one', headers=headers, json={
'recipient': '718294106203941',
'text': 'Your verification code is 385 214.',
'notifyurl': 'https://your-site.com/sparrow/status',
}).json()
print('Message envoyé' if r['code'] == 'OK' else f"Échec : {r['error']}")
# — Bulk send: one request, several recipients
requests.post(f'{base}/messenger/send/bulk', headers=headers, json={
'phones': ['718294106203941', '+2126YYYYYYYY'],
'text': 'Soldes : -20 % jusqu\'à dimanche. STOP au 36000',
})
# — Delivery status, from the identifier returned
status = requests.post(f'{base}/messenger/status', headers=headers, json={
'message_id': '8f21c4',
}).json()
print(status['result'])
Node 18 or later: fetch is built in.
const base = 'https://app.sparrowmessage.com/api/v1';
// — Authentication
const { api_token } = await fetch(`${base}/login`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
body: JSON.stringify({
email: 'you@company.com',
password: 'your-password',
}),
}).then(r => r.json());
const headers = {
'Content-Type': 'application/json',
Accept: 'application/json',
Authorization: `Bearer ${api_token}`,
};
// — Send a message
const reponse = await fetch(`${base}/messenger/send/one`, {
method: 'POST',
headers: headers,
body: JSON.stringify({
phone: '718294106203941',
text: 'Your verification code is 385 214.',
notifyurl: 'https://your-site.com/sparrow/status',
}),
}).then(r => r.json());
console.log(reponse.code === 'OK' ? 'Message envoyé' : `Échec : ${reponse.error}`);
// — Bulk send
await fetch(`${base}/messenger/send/bulk`, {
method: 'POST',
headers: headers,
body: JSON.stringify({
phones: ['718294106203941', '+2126YYYYYYYY'],
text: 'Soldes : -20 % jusqu\'à dimanche. STOP au 36000',
}),
});
.NET 6 or later.
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://app.sparrowmessage.com/api/v1/") };
// — Authentication
var auth = await http.PostAsJsonAsync("login", new {
email = "you@company.com",
password = "your-password",
});
var token = (await auth.Content.ReadFromJsonAsync<Dictionary<string, string>>())["api_token"];
http.DefaultRequestHeaders.Authorization = new("Bearer", token);
// — Send a message
var msg = await http.PostAsJsonAsync("sms/send/one", new {
phone = "718294106203941",
text = "Your verification code is 385 214.",
notifyurl = "https://your-site.com/sparrow/status",
});
var result = await msg.Content.ReadFromJsonAsync<Dictionary<string, object>>();
Console.WriteLine(result["code"].ToString() == "OK" ? "Message envoyé" : $"Échec : {result["error"]}");
// — Bulk send
await http.PostAsJsonAsync("sms/send/bulk", new {
phones = new[] { "718294106203941", "+2126YYYYYYYY" },
text = "Soldes : -20 % jusqu'à dimanche. STOP au 36000",
});
Java 11 or later, native HTTP client.
import java.net.URI;
import java.net.http.*;
var client = HttpClient.newHttpClient();
var base = "https://app.sparrowmessage.com/api/v1";
// — Authentication
var auth = HttpRequest.newBuilder(URI.create(base + "/login"))
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("""
{"email":"you@company.com","password":"your-password"}"""))
.build();
var token = extract(client.send(auth, HttpResponse.BodyHandlers.ofString()).body(), "api_token");
// — Send a message
var msg = HttpRequest.newBuilder(URI.create(base + "/messenger/send/one"))
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.header("Authorization", "Bearer " + token)
.POST(HttpRequest.BodyPublishers.ofString("""
{"recipient":"718294106203941",
"text":"Your verification code is 385 214.",
"notifyurl":"https://your-site.com/sparrow/status"}"""))
.build();
System.out.println(client.send(msg, HttpResponse.BodyHandlers.ofString()).body());
Copy and paste into a terminal.
# — 1. Get the token
curl -X POST https://app.sparrowmessage.com/api/v1/login \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"email":"you@company.com","password":"your-password"}'
# Response: {"code":"OK","api_token":"eyJ0eXAiOiJKV1Qi..."}
# — 2. Send a message
curl -X POST https://app.sparrowmessage.com/api/v1/messenger/send/one \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"recipient":"718294106203941",
"text":"Your verification code is 385 214.",
"notifyurl":"https://your-site.com/sparrow/status"}'
# — 3. Receive inbound messages
curl -X POST https://app.sparrowmessage.com/api/v1/messenger/send/bulk \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"phones":["718294106203941","+2126YYYYYYYY"],
"text":"Reminder: your appointment is tomorrow at 2:30 pm."}'
# — 4. Delivery status
curl -X POST https://app.sparrowmessage.com/api/v1/messenger/status \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"message_id":"8f21c4"}'
# — 5. Status of a batch
curl -X POST https://app.sparrowmessage.com/api/v1/messenger/status/bulk \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"messages_id":["8f21c4","8f21c5"]}'
Every response carries a code field set to OK ou
KO. On anOK, result — or results
for bulk calls — carries the detail; on a KO,
error gives the reason.
Full documentation and a sandbox are provided when your account opens.
Enterprises, institutions and public bodies, in Morocco and abroad. The same organisations, whatever the channel.

Employee, supplier and customer communication

Customer and employee communication

Customer and employee communication

Supplier communication

Customer and employee communication

Candidate and employer communication

Member and partner communication

Member communication

Partner and donor communication

Customer communication

Customer notifications from the CRM

Customer communication

Candidate and employer communication

Member communication

Customer and partner communication

Supplier communication

Student and partner communication

Tourism industry communication

Customer communication

Member communication

Customer and user communication

Student and administration communication

Student and administration communication

Customer and store communication

Employee communication

Customer and prospect communication

Customer and prospect communication

Customer communication

Customer communication

Customer communication

Customer notifications and relations

Customer and supplier notifications

Customer notifications and campaigns
Item availability, order tracking, in-store collection notices.
Case tracking, branch appointments, answers to common questions.
Enrolment enquiries, term start dates, answers for families.
Enquiry qualification, viewing appointments, prospect follow-up.
Parcel tracking, delivery slot, complaints handled in the conversation.
Booking, today's menu, table confirmation and reminder.
Member enquiries, event registrations, answers to requests.
Appointment booking, consultation reminders, answers to administrative questions.
Messenger is not billed per message like SMS: the cost depends on the conversation, the number of agents and what you automate. We therefore build a tailored proposal after a thirty-minute conversation.
How many conversations open each month, and how many resolve without a human. This is the main cost driver.
How many people log into the shared inbox, and during which hours. An extra agent can be added at any time.
Guided journeys, catalogue connection, CRM or ERP integration: setup is quoted once, then running costs apply.
Tell us your current volume and your most frequent requests. We come back with a costed proposal and a rollout schedule, with no commitment.
As soon as a customer writes to your page, you have twenty-four hours to reply with whatever you like: text, image, button, carousel. Each new message from them restarts the clock. Once that time passes with no message from them, free exchange stops: only certain categories of message remain permitted. The platform shows the time left on each conversation, so your agents never have to work it out.
Meta permits three categories of message outside the window: post-purchase updates (order shipped, ready for collection), account updates (password change, case updated) and reminders for an event the customer confirmed (appointment, booking). These messages cannot be promotional. For marketing you must use recurring notifications, which the customer subscribes to explicitly.
Yes. Messenger sits on top of a page: the page receives the messages and appears as the party you are talking to. If your page already exists, connecting it takes a few minutes. If not, we create it with you. A Meta Business account is also required to attach the page and the access rights.
Yes — that is exactly what the shared inbox is for. Each conversation is assigned to one agent, visible to the others, and cannot receive two competing replies. Handover takes one click, internal notes included, and the history stays attached to the contact whichever agent replied.
This is the most important setting to get right at the start. Automation handles what is repetitive and verifiable: opening hours, order tracking, availability. As soon as a request falls outside that, or the customer asks for an advisor, the conversation moves to an agent with everything already exchanged. We also recommend switching automation off during the hours your teams are available.
A Facebook or Instagram ad whose button opens a Messenger conversation instead of a landing page. The contact is identified from the first click, with no form and no email address to type, and the campaign source stays attached to the conversation. You know which ad produced which enquiry, and your salesperson picks up where the automated journey left off.
Yes, through the REST API and webhooks. Every inbound message can be pushed to your system, and your system can write into the conversation. Connectors exist for the most widely used CRMs and e-commerce platforms; for an in-house tool, integration through the API takes a few days.
Yes, with the full history attached to the contact: a customer who comes back six months later is recognised, and the agent sees what was said. Retention is configurable to match your data policy, and export is available at any time.
There is no technical ceiling on the platform side. The practical limit comes from your headcount and the share of requests you automate: a well-tuned journey routinely absorbs two thirds of the volume, which lets a small team handle several thousand conversations a month.
In Morocco, personal data processing falls under Law 09-08 and the CNDP: Messenger conversations contain personal data and must appear in your declaration. Meta's rules apply on top, forbidding promotional messages outside the twenty-four-hour window and outside accepted recurring notifications. Subscriptions, consent withdrawals and deletion requests are kept and exportable. We are not lawyers: have your setup and your CNDP declaration reviewed by your counsel.
The GDPR applies to Messenger conversations as to any processing of personal data: legal basis, informing the customer, retention period and the right to erasure. Meta's rules apply on top, forbidding promotional messages outside the twenty-four-hour window and outside accepted recurring notifications. Subscriptions, consent withdrawals and deletion requests are kept and exportable, ready to feed your record of processing activities. We are not lawyers: have your setup reviewed by your counsel.
In the United States, commercial solicitation by message falls under the CAN-SPAM Act for email and the TCPA for phone messaging, both enforced by the FTC and the FCC; messaging is treated by analogy and carries the same requirement of consent and easy opt-out. Meta's rules apply on top, forbidding promotional messages outside the twenty-four-hour window and outside accepted recurring notifications. Subscriptions and opt-outs are kept and exportable. We are not lawyers: have your setup reviewed by your counsel before any campaign.
The page is connected and the shared inbox usable within twenty-four hours. Automated journeys take one to two weeks depending on their complexity: you have to list the frequent requests, write the answers, then test them on real cases before going live.
Your Messenger channel live in 4 phases
From connecting your page to the first automated journey, a mapped-out path and a single point of contact.
Typical timeline: page connected within 24 hours, first automated journeys live within one to two weeks depending on their complexity.