Sparrow Emailing brings together the campaign platform and the SMTP server: drag-and-drop editor, segmentation, automation, transactional sending via API, and real-time tracking of opens, clicks and unsubscribes.
Click a use case to see in detail how Sparrow Emailing sets it up for your business.
Build your emails by drag and drop, without writing a line of code, then choose exactly who receives them. Segmentation draws on your own data: purchase history, location, recent activity, list membership.
Order confirmation, invoice, password reset, verification code: these messages are expected, opened and read. They go out via API or SMTP from your application, in a few hundred milliseconds.
A journey is triggered by an event — signup, purchase, birthday, inactivity — then runs its steps on its own, with delays and conditions you set once and for all.
Your applications — website, ERP, CRM, intranet — send through an authenticated SMTP server, on an IP address whose reputation belongs to you. Your recipients' mailboxes recognise your domain, not a third party's.
220 smtp.sparrowmessage.com ESMTP EHLO app.yourcompany.com 250-STARTTLS 250 AUTH LOGIN PLAIN STARTTLS 220 Ready to start TLS AUTH LOGIN 235 Authentication successful MAIL FROM:<facture@yourcompany.com> 250 OK RCPT TO:<client@exemple.com> 250 Accepted DATA 354 End data with . 250 Queued as 8F2C1A
A sent email is not a read email. The dashboard separates what was delivered, opened, clicked, refused or reported — and tells you why, address by address.
The platform and the sending server in one subscription, with no extra tool to plug in.
Build a clean email in minutes, from a template or a blank page. It renders correctly on phone and desktop, with no adjustment on your side.
Import your lists from a file or your CRM, deduplicate, segment, and let the platform remove invalid addresses and unsubscribes on its own.
SPF, DKIM and DMARC authentication, IP warm-up, blacklist monitoring: the target is the inbox, not the spam folder.
Welcome, birthday, abandoned cart, re-engagement: your sequences are triggered by an event and run on their own, with your delays and your conditions.
Opens, clicks, bounces, complaints and unsubscribes, campaign by campaign and contact by contact, with CSV export and webhook delivery.
A documented REST API and an authenticated SMTP server: your applications send directly, in the language you already use.
No proprietary library to install. SMTP works with what you already use; the REST API is called from any language.
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 an email | POST | https://app.sparrowmessage.com/api/v1/mail/send/one |
| Send in bulk | POST | https://app.sparrowmessage.com/api/v1/mail/send/bulk |
| SMTP server | SMTP | smtp.sparrowmessage.com — port 587 (TLS) or 465 (SSL) |
SEMS
Amplitude HR
1 — Get the token, then send an email.
<?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',
]),
]);
$auth = json_decode(curl_exec($ch), true);
curl_close($ch);
if (($auth['code'] ?? '') !== 'OK') {
throw new RuntimeException($auth['error'] ?? 'Authentication failed');
}
$token = $auth['user']['api_token'];
// ── Single send
$ch = curl_init("$base/mail/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([
'email' => 'client@exemple.com',
'subject' => 'Your order #4521 is confirmed',
'html' => '<p>Thank you for your order.</p>',
]),
]);
$msg = json_decode(curl_exec($ch), true);
curl_close($ch);
// $msg['message_id'] identifies the email for tracking
// ── Bulk send: “emails” is an array of addresses
$ch = curl_init("$base/mail/send/bulk");
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([
'emails' => ['client1@exemple.com', 'client2@exemple.com'],
'subject' => 'This month's offers',
'html' => '<h1>What's new</h1><p>Discover the selection.</p>',
]),
]);
$masse = json_decode(curl_exec($ch), true);
curl_close($ch);
// $masse['mails_error'] lists the rejected addresses, if any
With requests, the most common HTTP library.
import requests
BASE = 'https://app.sparrowmessage.com/api/v1'
HEADERS = {'Accept': 'application/json', 'Content-Type': 'application/json'}
# ── Authentication
auth = requests.post(f'{BASE}/login', headers=HEADERS, json={
'email': 'you@company.com',
'password': 'your-password',
}).json()
if auth.get('code') != 'OK':
raise RuntimeError(auth.get('error', 'Authentication failed'))
token = auth['user']['api_token']
headers = {**HEADERS, 'Authorization': f'Bearer {token}'}
# ── Single send
msg = requests.post(f'{BASE}/mail/send/one', headers=headers, json={
'email': 'client@exemple.com',
'subject': 'Your order #4521 is confirmed',
'html': '<p>Thank you for your order.</p>',
}).json()
print(msg['message_id'])
# ── Bulk send
masse = requests.post(f'{BASE}/mail/send/bulk', headers=headers, json={
'emails': ['client1@exemple.com', 'client2@exemple.com'],
'subject': 'This month's offers',
'html': '<h1>What's new</h1><p>Discover the selection.</p>',
}).json()
print(masse['message_ids'], masse.get('mails_error'))
fetch is built in from Node 18 onwards.
const BASE = 'https://app.sparrowmessage.com/api/v1';
const JSON_HEADERS = { 'Accept': 'application/json', 'Content-Type': 'application/json' };
// ── Authentication
const auth = await (await fetch(`${BASE}/login`, {
method: 'POST',
headers: JSON_HEADERS,
body: JSON.stringify({ email: 'you@company.com', password: 'your-password' })
})).json();
if (auth.code !== 'OK') throw new Error(auth.error || 'Authentication failed');
const headers = { ...JSON_HEADERS, Authorization: `Bearer ${auth.user.api_token}` };
// ── Single send
const msg = await (await fetch(`${BASE}/mail/send/one`, {
method: 'POST',
headers: headers,
body: JSON.stringify({
email: 'client@exemple.com',
subject: 'Your order #4521 is confirmed',
html: '<p>Thank you for your order.</p>'
})
})).json();
// ── Bulk send
const masse = await (await fetch(`${BASE}/mail/send/bulk`, {
method: 'POST',
headers: headers,
body: JSON.stringify({
emails: ['client1@exemple.com', 'client2@exemple.com'],
subject: 'This month's offers',
html: '<h1>What's new</h1><p>Discover the selection.</p>'
})
})).json();
HttpClient, with no external dependency.
using System.Net.Http.Json;
const string Base = "https://app.sparrowmessage.com/api/v1";
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("Accept", "application/json");
// ── Authentication
var auth = await (await http.PostAsJsonAsync($"{Base}/login", new {
email = "you@company.com",
password = "your-password"
})).Content.ReadFromJsonAsync<JsonElement>();
if (auth.GetProperty("code").GetString() != "OK")
throw new Exception(auth.GetProperty("error").GetString());
var token = auth.GetProperty("user").GetProperty("api_token").GetString();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token);
// ── Single send
var msg = await http.PostAsJsonAsync($"{Base}/mail/send/one", new {
email = "client@exemple.com",
subject = "Your order #4521 is confirmed",
html = "<p>Thank you for your order.</p>"
});
// ── Bulk send
var masse = await http.PostAsJsonAsync($"{Base}/mail/send/bulk", new {
emails = new[] { "client1@exemple.com", "client2@exemple.com" },
sujet = "This month's offers",
html = "<h1>What's new</h1><p>Discover the selection.</p>"
});
java.net.http, included since Java 11.
String base = "https://app.sparrowmessage.com/api/v1";
HttpClient client = HttpClient.newHttpClient();
// ── Authentication
HttpRequest login = HttpRequest.newBuilder(URI.create(base + "/login"))
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("""
{"email":"you@company.com","password":"your-password"}"""))
.build();
String reponse = client.send(login, HttpResponse.BodyHandlers.ofString()).body();
String token = new JSONObject(reponse).getJSONObject("user").getString("api_token");
// ── Single send
HttpRequest msg = HttpRequest.newBuilder(URI.create(base + "/mail/send/one"))
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.header("Authorization", "Bearer " + token)
.POST(HttpRequest.BodyPublishers.ofString("""
{
"email": "client@exemple.com",
"subject": "Your order #4521 is confirmed",
"html": "<p>Thank you for your order.</p>"
}"""))
.build();
client.send(msg, HttpResponse.BodyHandlers.ofString());
// ── Bulk send: "emails" is an array
HttpRequest masse = HttpRequest.newBuilder(URI.create(base + "/mail/send/bulk"))
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.header("Authorization", "Bearer " + token)
.POST(HttpRequest.BodyPublishers.ofString("""
{
"emails": ["client1@exemple.com", "client2@exemple.com"],
"subject": "This month's offers",
"html": "<h1>What's new</h1>"
}"""))
.build();
client.send(masse, HttpResponse.BodyHandlers.ofString());
To try it from a terminal, before writing a single line.
# ── 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", "token":"…", "user":{ "api_token":"…" } }
# ── 2. Send an email
curl -X POST https://app.sparrowmessage.com/api/v1/mail/send/one \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer VOTRE_API_TOKEN" \
-d '{
"email": "client@exemple.com",
"subject": "Your order #4521 is confirmed",
"html": "<p>Thank you for your order.</p>"
}'
# ── 3. Send to several recipients
curl -X POST https://app.sparrowmessage.com/api/v1/mail/send/bulk \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer VOTRE_API_TOKEN" \
-d '{
"emails": ["client1@exemple.com", "client2@exemple.com"],
"subject": "This month's offers",
"html": "<h1>What's new</h1><p>Discover the selection.</p>"
}'
If your application already sends email, there is nothing to code: just change the outgoing server settings.
Server : smtp.sparrowmessage.com
Port : 587 (STARTTLS) · 465 (SSL/TLS) · 2525 (fallback)
Security : TLS required
Username : provided when the account is opened
Password : provided when the account is opened
Sender : an address on your authenticated domain
# ── PHP example, using PHPMailer
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.sparrowmessage.com';
$mail->SMTPAuth = true;
$mail->Username = 'your-username';
$mail->Password = 'your-key';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('facture@yourcompany.com', 'Your Company');
$mail->addAddress('client@exemple.com');
$mail->Subject = 'Your order #4521 is confirmed';
$mail->isHTML(true);
$mail->Body = '<p>Thank you for your order.</p>';
$mail->send();
# ── Python example, no dependencies
import smtplib
from email.message import EmailMessage
msg = EmailMessage()
msg['From'] = 'facture@yourcompany.com'
msg['To'] = 'client@exemple.com'
msg['Subject'] = 'Your order #4521 is confirmed'
msg.set_content('Thank you for your order.')
with smtplib.SMTP('smtp.sparrowmessage.com', 587) as s:
s.starttls()
s.login('your-username', 'your-key')
s.send_message(msg)
Every response carries a code field set to OK ou
KO : 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
Promotions, new arrivals, order confirmations and abandoned cart follow-ups.
Statements, payment reminders, loyalty campaigns and regulatory notices.
Invitations, results, information for parents and recruitment campaigns.
New listings sent to the right segment, case tracking, prospect follow-ups.
Shipping notices, delivery tracking, supplier information.
Meeting notices, membership fee reminders, member newsletters.
Supplier communication, internal memos, recruitment campaigns.
Appointment reminders, results available, prevention campaigns.
The subscription covers the platform, the sending server and support. The number of emails included depends on the contact tier you choose.
For companies starting out with campaigns, from 500 to 15,000 contacts.
For sustained volumes and transactional sending, from 10,000 to 50,000 contacts.
Beyond 50,000 contacts, or with constraints specific to your organisation.
volume, dedicated IP and service commitment defined with you
Bank transfer to E-solution, Casablanca. Moroccan invoice with tax ID, VAT applicable.
Invoiced by E-SOLUTION TECHNOLOGIES LLC, New York — EIN 32-0781906. Useful if your accounting works in dollars, wherever you are.
Bank details and the secure payment link are sent with the invoice, never published on this page.
Prices excluding tax. An annual commitment, paid in advance, receives a 10% discount on the subscription.
Choose your plan and your contact volume. The quote reflects exactly what you select here.
Up to 7,000 emails per month included.
Three sending domains are included; each additional domain is billed at 100 MAD per month. The shared IP is included and suits most volumes; a dedicated IP is billed at 100 MAD per month per address. Both options are taken with a one-year commitment.
The support pack is billed annually.
Indicative estimate excluding tax, based on our published rates.
The SMTP server only carries your messages: you then have to compose the emails and manage the lists elsewhere. The plan brings both together — the platform to create, segment and measure, the server to send — in one subscription and one invoice.
The plan is chosen on the number of contacts stored in your database. Each tier includes a monthly email volume, enough to reach your contacts several times. A one-off overage does not block your sending: it is settled with you afterwards.
It is your emails' ability to reach the inbox rather than the spam folder. It depends on your domain authentication (SPF, DKIM, DMARC), the reputation of the sending IP address, how clean your lists are, and how your recipients behave. We work on all four.
Not necessarily. Below roughly 50,000 emails a month, a well-maintained shared IP performs better: its reputation is already established. A dedicated IP becomes worthwhile above that, or if you want sole control over your sender reputation.
Three records to publish: an SPF record authorising our servers to send for your domain, a DKIM key that signs your messages, and a DMARC policy telling mailboxes what to do with a non-compliant message. We provide the exact values and check that they propagate.
Yes, from a CSV or Excel file, or directly from your CRM. The import deduplicates, discards malformed addresses and preserves earlier unsubscribes. A purchased list, or one collected without consent, is another matter: it does lasting damage to your sender reputation.
Yes. Confirmations, invoices and verification codes use a queue separate from campaigns: a large campaign in progress never delays an email your customer is waiting for.
Yes — upwards at any time, with a pro-rata adjustment. Downwards, the change takes effect at the end of the current period.
In Morocco, personal data processing falls under Law 09-08 and the CNDP. Your contact file must be declared, and every commercial send requires the recipient's prior consent. The unsubscribe link appears on all our sends and is processed immediately; consents, collection dates and deletion requests are kept and exportable as evidence. We are not lawyers: have your setup and your CNDP declaration reviewed by your counsel.
In the United States, commercial email falls under the CAN-SPAM Act, enforced by the Federal Trade Commission. Three obligations fall on the sender: a valid physical postal address in every message, a subject line and header that do not mislead about the content or the sender's identity, and an unsubscribe mechanism processed within ten business days. The unsubscribe link appears on all our sends and is applied immediately; deletion requests are kept and exportable. We are not lawyers: have your setup reviewed by your counsel, particularly if you also address California, whose CCPA adds obligations of its own.
The unsubscribe link appears on every send and is processed immediately. Consents, collection dates and deletion requests are kept and exportable, ready to feed your record of processing activities. We are not lawyers: for your privacy notices and the legal basis of your sends, have your setup reviewed by your counsel.
Account opening, domain authentication and the first test campaign are guided. A training day can be added for your marketing teams, and integration with your information system is quoted in person-days.
A 30-minute demo is enough to see the platform, the editor and the analytics on a case close to yours.
Request a demo
Your email platform up and running in 4 phases
From signature to first send, a mapped-out path and a single point of contact.
Typical timeline: account opened within 24 hours, first send as soon as the DNS records propagate.