Your branding, not ours#
Set your name, colour and logo once under Settings → API and every template below comes out looking like you. Nothing to pass per request, and no HTML to maintain. The previews on this page use a sample shop's branding.
Templates#
Seven of them, each validated on the way in. A missing invoice total is a 422naming the field, not a blank line in a customer's inbox. Every preview here is rendered by the code that sends the real thing.
Receipt
After a payment lands. The one email customers keep and search for later.
{
"name": "receipt",
"receiptNumber": "R-1042",
"total": "25,000",
"paidOn": "5 August 2026",
"customerName": "Neema",
"paymentMethod": "M-Pesa",
"items": [
{
"description": "Kitenge fabric, 2 metres",
"quantity": 2,
"amount": "18,000"
},
{
"description": "Delivery, Kariakoo",
"amount": "7,000"
}
]
}Subject: Receipt R-1042: TZS 25,000
Invoice
Asking to be paid. Add payUrl and the button takes them straight to checkout.
{
"name": "invoice",
"invoiceNumber": "INV-2026-118",
"total": "480,000",
"dueDate": "19 August 2026",
"customerName": "Neema",
"items": [
{
"description": "Monthly retainer, August",
"amount": "400,000"
},
{
"description": "Extra support hours",
"quantity": 4,
"amount": "80,000"
}
],
"payUrl": "https://example.co.tz/pay/inv-2026-118"
}Subject: Invoice INV-2026-118 from Duka Langu: TZS 480,000
Order confirmation
Straight after checkout, while they are still wondering whether it worked.
{
"name": "order_confirmation",
"orderNumber": "ORD-8891",
"total": "62,000",
"customerName": "Neema",
"items": [
{
"description": "Sandals, size 39",
"quantity": 1,
"amount": "62,000"
}
],
"deliveryEstimate": "Thursday, 7 August",
"deliveryAddress": "Mikocheni B, Dar es Salaam",
"trackUrl": "https://example.co.tz/orders/8891"
}Subject: Order ORD-8891 confirmed
One-time code
The code leads the subject line, so it is readable from the notification banner.
{
"name": "otp",
"code": "482913",
"app": "Duka Langu",
"expiresMinutes": 10
}Subject: 482913 is your Duka Langu code
Password reset
Says plainly that ignoring it is safe. This is the message phishing imitates most.
{
"name": "password_reset",
"resetUrl": "https://example.co.tz/reset/abc123",
"userName": "Neema",
"expiresMinutes": 30
}Subject: Reset your Duka Langu password
Welcome
First contact after signup.
{
"name": "welcome",
"userName": "Neema",
"message": "Your shop is ready. Add your first product and you are live.",
"actionUrl": "https://example.co.tz/start",
"actionLabel": "Open my shop"
}Subject: Welcome to Duka Langu
Notification
Anything else you need to tell someone. Title, message, optional button.
{
"name": "notification",
"title": "Your delivery is on the way",
"message": "The rider left the shop a few minutes ago and should reach you within the hour.",
"actionUrl": "https://example.co.tz/track/8891",
"actionLabel": "Track it"
}Subject: Your delivery is on the way
Money and dates#
Amounts are strings you have already formatted, so write "25,000", not 25000. currency defaults to TZS. That is deliberate: formatting shillings automatically means deciding on your behalf that 25,000/= should read "TZS 25,000.00", which is not how anybody writes it here. Dates are strings too, so they read the way your customers expect.
Send anything else#
Skip template and write the message yourself. Give html, text, or both; whichever you leave out is derived from the other.
{
"from": "Receipts <billing@yourdomain.co.tz>",
"to": ["customer@gmail.com"],
"subject": "Your statement for July",
"text": "Asante! Your July statement is attached."
}