Add your domain and the DNS records shown in your dashboard.
Your business deserves
its own email address.
Your domain, your team and your important messages. All in one place.
A closer look
Email that fits
the way you work.
How WazobiaMail works
From your domain to their inbox.
Give your team their own addresses and shared account storage.
Connect a mail client with your mailbox’s IMAP and SMTP settings.
Send receipts, login codes and updates from your app or website using the API.
Connect SMTP to Commanda or your marketing tool, then send to your opted-in list.
Receive messages in your hosted mailbox and sync them with your IMAP email client.
A walkthrough of the platform · 1 / 6
Try it now.
Send an email straight to your inbox.
POST /api/v1/sending/messages · X-API-Key
{
"to": ["someone@example.com"],
"content": {
"from": "Your Brand <hello@yourbrand.com>",
"subject": "A good place to start.",
"htmlBody": "<p>Hello from your brand.</p>"
}
} Illustrative request · keep your API key on your server.
Every message matters.
A clearer view of your email.
EXAMPLE ACTIVITYBuilt for the way you use email
Who is WazobiaMail
made for?
Individuals who need their own address. Businesses that need staff inboxes. Developers who send from apps. Marketers who keep an audience informed. All of them tired of spam folders, missing analytics and overpriced subscriptions.
For individuals
Your own address. Not a borrowed one.
Sites reject generic addresses. Recruiters and clients take Gmail less seriously. Your name deserves its own domain.
Get you@yourname.com in minutes and receive messages in your own inbox. Keep your identity as your work grows.
- Receive registration and verification messages without spam folders.
- Use a professional address for freelance work or a portfolio.
- Keep work enquiries in a dedicated mailbox you control.
you@yourname.com
Create your personal inbox ↗For businesses and teams
One business name. Every staff inbox.
Staff using personal addresses makes your business look inconsistent and replies get lost.
Create an inbox for each staff member plus sales@ and support@. Customers see your brand and know where to reply.
- Let customers contact sales@ or support@ on your business domain.
- Give each member of staff their own address and mailbox credentials.
- Receive customer replies after a quote, enquiry or order update.
ada@yourbusiness.com
Set up your team email ↗For developers and companies
Stop losing users to missing emails.
A delayed login code or missing receipt becomes your support problem. Other providers start at $20/month before you send one message.
Send from your app through HTTP or SMTP. Pay per 1,000 recipients from ₦250 / $0.50. Manage keys, domains and delivery activity in one place.
- Send welcome emails and password-reset links from your application.
- Trigger receipts, booking confirmations and account alerts.
- Check sending activity when a customer reports a missing message.
notifications@yourapp.com
Connect your application ↗For marketers and agencies
Reach your audience without overpaying.
Sending to a few thousand contacts should not cost a monthly enterprise plan.
Send branded updates and campaigns to an opted-in audience on your own domain. Choose sending capacity for your volume, with credits that never expire.
- Announce products, offers or upcoming events to opted-in contacts.
- Send newsletters through the email API or your connected sending tools.
- Choose a plan around your audience size and sending allowance.
news@yourbrand.com
Plan your email sending ↗Give your messages a better chance
Your email should
reach the conversation.
When a receipt or login code disappears into spam, people lose time and trust. Start with an authenticated domain, then check your sending activity when something needs attention.
Set up your sending domain ↗Build trust before you send.
- Follow the SPF, DKIM and DMARC records for your domain.
- Send useful messages to people who expect them.
- Test your sender address and content before launch.
- Review delivery activity and investigate failed sends.
- Track opens and clicks so you know what landed.
Authentication helps email avoid spam. Placement also depends on your reputation, content and the receiving service. No email provider can guarantee every message reaches the inbox.
For the builders.
And the businesses they build.
02A place for every message
All the essentials.
Beautifully together.
Keep signups moving, reply to customers and give your team a professional address.
Email that fits your code.
A missed login code can stop a signup. Send receipts, password resets and notifications from your backend with HTTP or SMTP.
- Create and revoke sending API keys
- Use your own verified sending domains
- Keep sending credentials on your server
Your name. Your domain.
Use you@yourname.com for your work, business enquiries or services that ask for a domain-based address.
- See verification status in one workspace
- Configure SPF, DKIM and DMARC
- Manage domains for multiple brands
An address for every role.
Give every staff member an inbox on your business domain. Receive customer replies and send from an address people recognise.
- Create and manage mailbox credentials
- Connect with IMAP and SMTP
- Choose the capacity your team needs
For developers · Backend written in Rust
Ship your app.
Let us handle the email.
A signup needs its login code. An order needs its receipt. Send both from your backend with one HTTP request.
Your stack is welcome here.
- Create an account and verify your sending domain.
- Create an API key and save it in your server environment as WAZOBIA_API_KEY.
- Replace the sender and recipient below, then run the example on your server.
Use HTTP for new integrations or authenticated SMTP for tools you already use. Keep keys out of browser code and public repositories.
Follow the quickstart ↗A successful response means accepted for sending. Check delivery activity to see what happens next.
curl -X POST https://app.wazobiamail.com/api/v1/sending/messages \
-H 'Content-Type: application/json' \
-H "X-API-Key: $WAZOBIA_API_KEY" \
-d '{
"to": [
"you@example.com"
],
"content": {
"from": "Your Brand <hello@yourbrand.com>",
"subject": "Welcome to Your Brand",
"htmlBody": "<p>Your account is ready. Welcome aboard!</p>"
}
}'// Node.js 18+ · run on your server
const response = await fetch('https://app.wazobiamail.com/api/v1/sending/messages', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.WAZOBIA_API_KEY
},
body: JSON.stringify({
"to": [
"you@example.com"
],
"content": {
"from": "Your Brand <hello@yourbrand.com>",
"subject": "Welcome to Your Brand",
"htmlBody": "<p>Your account is ready. Welcome aboard!</p>"
}
})
});
const result = await response.json();
if (!response.ok || result.success !== true) throw new Error(result.message || 'Send failed');
console.log(result);// Node.js 18+ · run on your server
const key = process.env.WAZOBIA_API_KEY;
if (!key) throw new Error('Set WAZOBIA_API_KEY');
const message = {
"to": [
"you@example.com"
],
"content": {
"from": "Your Brand <hello@yourbrand.com>",
"subject": "Welcome to Your Brand",
"htmlBody": "<p>Your account is ready. Welcome aboard!</p>"
}
};
const response = await fetch('https://app.wazobiamail.com/api/v1/sending/messages', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Key': key },
body: JSON.stringify(message)
});
const result = await response.json();
if (!response.ok || result.success !== true) throw new Error(result.message || 'Send failed');
console.log(result);<?php
// Requires the PHP cURL extension.
$key = getenv('WAZOBIA_API_KEY');
if (!$key) throw new RuntimeException('Set WAZOBIA_API_KEY');
$message = json_decode('{"to":["you@example.com"],"content":{"from":"Your Brand <hello@yourbrand.com>","subject":"Welcome to Your Brand","htmlBody":"<p>Your account is ready. Welcome aboard!</p>"}}', true, 512, JSON_THROW_ON_ERROR);
$curl = curl_init('https://app.wazobiamail.com/api/v1/sending/messages');
curl_setopt_array($curl, [
CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'X-API-Key: ' . $key],
CURLOPT_POSTFIELDS => json_encode($message, JSON_THROW_ON_ERROR)
]);
$body = curl_exec($curl);
if ($body === false) throw new RuntimeException(curl_error($curl));
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
if ($status >= 300 || ($result['success'] ?? false) !== true) {
throw new RuntimeException($result['message'] ?? 'Send failed');
}
print_r($result);package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
"time"
)
func main() {
key := os.Getenv("WAZOBIA_API_KEY")
if key == "" { panic("Set WAZOBIA_API_KEY") }
payload := []byte(`{
"to": [
"you@example.com"
],
"content": {
"from": "Your Brand <hello@yourbrand.com>",
"subject": "Welcome to Your Brand",
"htmlBody": "<p>Your account is ready. Welcome aboard!</p>"
}
}`)
req, err := http.NewRequest("POST", "https://app.wazobiamail.com/api/v1/sending/messages", bytes.NewReader(payload))
if err != nil { panic(err) }
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-API-Key", key)
client := &http.Client{Timeout: 30 * time.Second}
res, err := client.Do(req)
if err != nil { panic(err) }
defer res.Body.Close()
var result map[string]any
if err := json.NewDecoder(res.Body).Decode(&result); err != nil { panic(err) }
if res.StatusCode >= 300 || result["success"] != true { panic(fmt.Sprint(result)) }
fmt.Println(result)
}// Cargo.toml: reqwest = { version = "0.12", features = ["blocking", "json"] }
// serde_json = "1"
use reqwest::blocking::Client;
use serde_json::{json, Value};
use std::{env, time::Duration};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let key = env::var("WAZOBIA_API_KEY")?;
let message = json!({
"to": [
"you@example.com"
],
"content": {
"from": "Your Brand <hello@yourbrand.com>",
"subject": "Welcome to Your Brand",
"htmlBody": "<p>Your account is ready. Welcome aboard!</p>"
}
});
let result: Value = Client::builder().timeout(Duration::from_secs(30)).build()?
.post("https://app.wazobiamail.com/api/v1/sending/messages")
.header("X-API-Key", key)
.json(&message).send()?.error_for_status()?.json()?;
if result["success"] != true { return Err(format!("Send failed: {result}").into()); }
println!("{result}");
Ok(())
}# Python 3 · standard library only
import json
import os
import urllib.request
message = {
"to": [
"you@example.com"
],
"content": {
"from": "Your Brand <hello@yourbrand.com>",
"subject": "Welcome to Your Brand",
"htmlBody": "<p>Your account is ready. Welcome aboard!</p>"
}
}
request = urllib.request.Request(
'https://app.wazobiamail.com/api/v1/sending/messages',
data=json.dumps(message).encode('utf-8'),
headers={
'Content-Type': 'application/json',
'X-API-Key': os.environ['WAZOBIA_API_KEY'],
},
method='POST',
)
# HTTP errors raise urllib.error.HTTPError.
with urllib.request.urlopen(request, timeout=30) as response:
result = json.load(response)
if result.get('success') is not True:
raise RuntimeError(result.get('message', 'Send failed'))
print(result)// .NET 6+ · run on your server
using System.Net.Http.Json;
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key",
Environment.GetEnvironmentVariable("WAZOBIA_API_KEY"));
var response = await client.PostAsJsonAsync(
"https://app.wazobiamail.com/api/v1/sending/messages",
new {
to = new[] { "you@example.com" },
content = new {
from = "Your Brand <hello@yourbrand.com>",
subject = "Welcome to Your Brand",
htmlBody = "<p>Your account is ready. Welcome aboard!</p>"
}
});
response.EnsureSuccessStatusCode();// Java 11+ · run on your server
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
var json = """
{
"to": ["you@example.com"],
"content": {
"from": "Your Brand <hello@yourbrand.com>",
"subject": "Welcome to Your Brand",
"htmlBody": "<p>Your account is ready. Welcome aboard!</p>"
}
}""";
var request = HttpRequest.newBuilder()
.uri(URI.create("https://app.wazobiamail.com/api/v1/sending/messages"))
.header("Content-Type", "application/json")
.header("X-API-Key", System.getenv("WAZOBIA_API_KEY"))
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() / 100 != 2) throw new RuntimeException("Send failed: " + response.body());04Small steps, good beginnings
From setup
to sent.
Create your account.
Create your account and choose the plan that fits the way you work.
Connect your domain.
Add your domain and follow the DNS setup. Connect the sending service you need.
Send, receive and grow.
Create your inboxes or connect the API to your app. Send a test to an address you control before going live.
Make every address
feel like your business.
Your domain. Your team. A proper home for your email, with hosted mailboxes and the mail clients you already use.
Explore business emailA familiar address
Use your own domain so every conversation carries your name.
Ready for your team
Create mailboxes and manage credentials from one workspace.
Your favourite mail client
Connect through IMAP and authenticated SMTP.
Keep up with customers.
Keep your day simple.
Keep customer details, messages and follow-ups in one app on your computer. Send email, SMS or WhatsApp updates, get help with a first draft and remember the next important task.
Explore Commanda
Remember the details
Keep customer names, contact details and notes handy. Choose who needs each update.
Make the next message easier
Reuse a saved message, ask AI for a first draft and send through the service you connect.
Know what you pay for
The app is free. Some functions need a paid subscription, including Gmail reading through WazobiaMail. Connected services may have their own charges.
What is WazobiaMail?
WazobiaMail is an email platform from Bonifade Technologies for developers, businesses and agencies. It brings email sending, custom domains and hosted mailboxes into one workspace.
Can I send email from my existing application?
Yes. Use the HTTP sending API from your server, or connect an application that supports authenticated SMTP. Your dashboard provides the credentials and domain settings for your account.
Can I use my own domain?
Yes. Add a domain in your dashboard and publish the DNS records provided for it. Domain verification, SPF, DKIM and DMARC help receiving servers identify your messages.
Do I get an inbox, or only an email sending service?
You can have both. Hosted mailboxes receive mail on your domain and connect to IMAP-capable mail apps. The sending API and SMTP connect your applications to outgoing email. Choose a plan with the mailbox and sending limits you need.
What does pay as you go cost?
Sending 4,000 emails costs ₦1,000 or $2. The minimum credit purchase is ₦2,000 or $3. One email sent to one recipient uses one credit, so a message sent to three people uses three credits. Check the current price before paying.
Do unused email credits carry over?
Yes. Purchased sending credits stay in your account until you use them. Your plan’s included sending allowance resets monthly. The included allowance is used before purchased credits.
Does the free plan include a business inbox?
No. Free and pay-as-you-go cover sending only. Choose a plan that includes receiving if you want hosted inboxes such as hello@yourbusiness.com. The pricing table shows each plan’s mailbox and storage limits.
How can I try sending before setting up an account?
Open Test an email in the homepage walkthrough, enter an address you control, add a subject and message, and choose Send test email. You can use plain or rich text. The public sample allows three attempts, with up to three recipients each, and has a shared daily limit. To test your own verified domain, use your sending API key in the integrations guide.
A plan for your next chapter
Start small.
Make room to grow.
Free
Try sending with your connected Gmail. No receiving or hosted inboxes.
Best for Individuals trying email sending
Total for the selected billing term.
Choose Free- Receiving
- Not included
- Mailboxes
- 0 — not included
- Total shared storage
- 0 GB — not included
- Team members
- 1
3,000 emails / month
- Ticket Support
- 1 Domain
- 1 API Key
- Sending only — no receiving
Provider sending limits also apply.
Starter
Professional sending and receiving for individuals and small businesses.
Best for Individuals, freelancers and small businesses
Total for the selected billing term.
Choose Starter- Receiving
- Included
- Mailboxes
- 2
- Total shared storage
- 5 GB
- Team members
- 1
10,000 emails / month
- Sending & Receiving
- 5,000 emails per month
- Ticket Support
- 3 Mailboxes
- 5 GB inbox storage
- 1 API Keys
Provider sending limits also apply.
Business
Higher sending volume and more mailboxes for busy teams.
Best for Busy teams and applications sending regularly
Total for the selected billing term.
Choose Business- Receiving
- Included
- Mailboxes
- 10
- Total shared storage
- 50 GB
- Team members
- 10
25,000 emails / month
- Sending & Receiving
- Priority Ticket Support
- Dedicated IP Add-on
- 1 API Key
Provider sending limits also apply.
Prices and allowances come from the current active plans. Confirm your selection before payment.
Pay as you go
A little or a lot.
Pay for what you send.
No subscription. Choose your email volume and see the estimated credit cost.
Best for occasional senders and apps with changing volume. Sending only; no hosted receiving inboxes.
Buy 4,000 credits ↗Start pay as you go ↗Find your sending budget
$0.5
per 1,000 emails
Top up $3 for 6,000 email credits. Unused credits stay in your account.
Your name belongs in your email
Your brand.
Every time you press send.
Create your account Custom domain inboxes for you and your team. Email sending for your apps.
