Providers
Supported providers per channel and the credentials each one needs.
A provider is the backend that actually delivers a message. You connect one or more per channel in the dashboard under Settings, Providers. Credentials are encrypted the moment you save them, and plaintext never leaves the POST body. For how MessagePipe chooses among several providers, see Providers.
Catalog
| Provider | Channel | Credentials |
|---|---|---|
| SendGrid | api_key | |
| Mailgun | api_key, domain | |
| Amazon SES | access_key_id, secret_access_key, region | |
| SMTP | host, port, username, password | |
| Resend | api_key | |
| Postmark | server_token | |
| MailerSend | api_key | |
| ZeptoMail | send_mail_token, bounce_address, region (optional) | |
| Mailtrap | api_token (optional stream, inbox_id) | |
| Elastic Email | api_key | |
| Bird email (SparkPost) | email (type sparkpost) | api_key, region (optional: us or eu) |
| MessagePipe managed email | email (type messagepipe_email) | none (platform-managed) |
| Twilio | sms | account_sid, auth_token, from_number |
| Termii | sms | api_key, sender_id, base_url (optional) |
| Infobip | sms | api_key, base_url |
| Amazon SNS | sms | access_key_id, secret_access_key, region |
| Telnyx | sms | api_key, from_number |
| Bandwidth | sms | account_id, application_id, from_number, client_id, client_secret |
| Plivo | sms | auth_id, auth_token, sender_id |
| Sinch | sms | service_plan_id, api_token, sender_id, region |
| Vonage | sms | api_key, api_secret, sender_id |
| Bird SMS | sms (type bird_sms) | api_key, sender_id |
| MessagePipe (managed) | sms | none (platform-managed) |
| FCM (Firebase) | push | project_id, access_token |
| APNs (Apple) | push | team_id, key_id, private_key, bundle_id |
| OneSignal | push | app_id, api_key |
| WhatsApp (Cloud API) | chat | phone_number_id, access_token |
| WhatsApp via Twilio | chat | account_sid, auth_token, from_number |
| Telegram | chat | bot_token |
| Signal | chat | phone_number, api_endpoint |
WhatsApp, Telegram, and Signal are delivered over the chat channel (Channels).
Credential notes
- SendGrid: a SendGrid API key with Mail Send permission.
- Mailgun: your Mailgun private API key plus the verified sending
domain. - Amazon SES: an IAM access key pair with SES send permission and the SES
region(for exampleus-east-1). - SMTP: any SMTP server. Host, port, and login credentials.
- Resend: an API key. A key limited to sending access is enough.
- Postmark: the Server API token of the server you send from. Set the
optional
message_streamin the provider settings to use a stream other than the default transactional one. - MailerSend: an API token with email access. Custom headers need a MailerSend Professional plan or above; on a lower plan sends that carry custom headers are refused.
- ZeptoMail: the Send Mail token for a Mail Agent and its bounce address.
regionselects the data centre (us,eu,in,au,jp,ca,sa,cn; defaultus) and must match where the Mail Agent was created. - Mailtrap: an API token.
streampickstransactional(default),bulk, orsandbox; sandbox needs the numericinbox_id. - Elastic Email: an API key with send access. The optional
channel_nameandpool_namesettings route through a named channel or IP pool. For delivery events, add a webhook under Settings > Notifications (a PRO-plan feature) with Sign requests on, then save thewhsec_…secret it shows once aswebhook_secret. - Bird email (SparkPost): a SparkPost API key. Use
region: eufor EU accounts. This is registered as thesparkpostprovider type. - Twilio: account SID, auth token, and the
from_numberyou send from. - Termii: a Termii API key and an approved alphanumeric
sender_id. Termii gives each account its own base URL (shown on the dashboard); set it asbase_url(for examplehttps://api.ng.termii.com) if yours is not the defaulthttps://v3.api.termii.com. It must be an httpstermii.comhost. Choose the route under Sending on the provider page: usedndfor OTP and other transactional traffic (the default,generic, is promotional and skips numbers on Do Not Disturb), orwhatsapp. For delivery events, paste your Termii secret key aswebhook_secret; requests are verified through theX-Termii-Signatureheader (HMAC-SHA512 of the body). A request without the header is checked against the shared-secret headers instead, for webhooks relayed through a proxy of your own; set the provider configrequire_signatureto"true"to refuse any request that is not signed. - Infobip: your Infobip API key and the account
base_url(for examplehttps://xxxxx.api.infobip.com). - Amazon SNS: an IAM access key pair with SNS publish permission and the
region. - Telnyx: an API v2 key and a
from_number(or a messaging profile). - Bandwidth: your account id, the messaging application id, a
from_number, and OAuth client credentials (client_id,client_secret). Legacyusername/passwordlogin still works until Bandwidth retires it on 2 December 2026. - Plivo: the Auth ID and Auth Token, plus a
sender_id(number or approved sender). - Sinch: the SMS service plan id and its API token.
regionis one ofus,eu,au,br,ca. This uses Sinch's SMS REST API, not the Conversation API. - Vonage: the API key and secret, and a
sender_id. This uses the Messages API with key and secret auth; application JWT auth is not supported. - Bird SMS: a Bird workspace access key (
bk_…) and the channelsender_id. EU workspaces are detected from the key orregion: eu. This is Bird's current API, which replaces the old MessageBird one. - MessagePipe managed email (
messagepipe_email): no credentials. Sends through MessagePipe's own Amazon SES account and is billed from the managed email credit bucket (email_managed), not the BYOKemailbucket. See Managed email. - MessagePipe (managed): no credentials. Sends through MessagePipe's own provider account, so you can send SMS without any provider setup of your own.
- FCM: the Firebase
project_idand anaccess_tokenfor the FCM v1 API. - APNs: token-based auth, the Apple
team_id, the keykey_id, the.p8private_key, and your appbundle_id. - OneSignal: your OneSignal
app_idand a REST API key. - WhatsApp: the Meta
phone_number_idand a WhatsApp Businessaccess_token. - WhatsApp via Twilio: Twilio account SID, auth token, and your
WhatsApp-enabled
from_number. - Telegram: a bot token from BotFather.
- Signal: the registered
phone_numberand theapi_endpointof your signal-cli REST API instance.
Termii sender IDs and batching
Termii only sends from sender IDs it has approved. The provider page lists the
IDs registered on your Termii account with their status, and Request a sender
ID files a new one (3 to 11 letters and digits, your company name, and a
sample message). Termii reviews it by hand, so it stays pending until approved.
The same is available as GET and POST /providers/{id}/sender-ids.
By default every message is its own request to Termii, and its delivery report
is matched to it exactly. Send mode on the provider page can instead be set
to batch, which sends up to 100 recipients of the same message in one call to
Termii's bulk endpoint. Batching:
- applies to the Generic and DND routes only, and only to messages with the same text and sender that are in flight at the same moment;
- needs the dispatcher to run sends together: set
DISPATCH_BATCH_SIZE(above 1) on the send-dispatch-worker. Without it,batchbehaves like the default; - holds a message for up to
DISPATCH_BATCH_WINDOW_MS(250 by default) so others can join it, so a lone message is a little slower; - stores each message under Termii's batch
message_idjoined with the recipient (<message_id>:<number>) and matches a delivery report to it by itsreceiver. Termii documents onemessage_idper bulk call, not how its delivery reports name a batched message, so check that reports arrive for a few batched test messages before relying on it. A bulk call that Termii refuses fails over message by message, as an unbatched send does.
A timeout or dropped connection after Termii has accepted a bulk call looks like a failure to MessagePipe, so every message in that call fails over to your next provider and its recipient can receive the text twice (up to 100 recipients at once). An unbatched send has the same risk for one recipient. If duplicates matter more to you than throughput, leave Send mode on the default or don't configure a fallback provider for that route.
Test an SMS provider
To prove an SMS provider works end to end, open it under Settings > Providers,
enter your phone number in international format (for example +2348012345678)
and choose Send test SMS. It sends a short fixed message through that
provider, bypassing credits and routing. Each provider accepts one test every 30
seconds and a workspace 25 a day, each test is recorded in the audit log (with
the number masked), and the MessagePipe managed provider can't be tested this
way.
Managed email
Managed email sends through MessagePipe's own Amazon SES account instead of
your keys. A workspace can have several SES tenants: one per project and
sender domain. A send goes out only when its from domain has an active
tenant with a verified identity in that project. Otherwise the provider is
skipped as tenant_not_ready and the send fails over to the next provider.
Likewise, a paused or suspended SES sender (sending_paused) is skipped at
once and never retried in place. Only real credential errors (auth_failed)
fail a send outright. BYOK providers, including your own Amazon SES keys, are
unaffected by the managed layer.
Publishing the DNS records automatically
A new sender domain comes with a handful of DNS records (three DKIM CNAMEs, the MAIL FROM MX and SPF records, and DMARC). You can add them by hand, or connect Cloudflare on the Managed email screen and let MessagePipe publish them.
Create a Cloudflare API token with Zone → Zone → Read and Zone → DNS → Edit, limited to the zone your sender domain is in, and paste it into Connect Cloudflare. MessagePipe stores it encrypted and never shows it again. A connection is either the workspace default or limited to one project (the project's own connection is tried first).
Set up DNS automatically reads your DNS first and shows what it would do for each record. Nothing is written until you press the button.
- A record that is missing is added.
- A record that is already right is left alone.
- A record that differs is a conflict, and you choose for each one: keep what I have (the default), merge (add MessagePipe to your existing SPF record, or add its MX alongside yours), or replace. Existing records are never changed without that choice.
- Where changing one record cannot be done safely (for example a CNAME that cannot share a name with other records, or two SPF records), the row is marked do this by hand and nothing is touched.
MessagePipe keeps a list of what it published. When you delete the domain you can have it take those records back: it deletes only records it created and that still have the content it gave them, and puts back any record it merged into. A record you have edited since is left alone. If another project in the workspace still uses the domain, the records stay. If you remove the connection first, MessagePipe can no longer take its records back and you remove them by hand.
Operators configure the managed account on the services that send and receive its events:
| Variable | Purpose |
|---|---|
MANAGED_SES_REGION | SES region of the managed account (a tenant's own region wins). |
MANAGED_SES_ACCESS_KEY_ID | IAM access key id. |
MANAGED_SES_SECRET_ACCESS_KEY | IAM secret access key. |
MANAGED_SES_SESSION_TOKEN | Optional, for temporary credentials. |
MANAGED_SES_SNS_TOPIC_ARN | SNS topic the account's configuration sets publish events to; only this topic is accepted for managed events. |
Delivery events by provider
Terminal statuses (delivered, bounced, failed) arrive through provider
delivery webhooks, so coverage depends on the provider:
- Report delivery events: SendGrid, Mailgun, Amazon SES, MessagePipe managed email, Resend, Postmark, MailerSend, Bird email (SparkPost), Elastic Email, Twilio, Termii, Infobip, Telnyx, Plivo, Bandwidth, Sinch, Vonage, Bird SMS, WhatsApp (Cloud API), WhatsApp via Twilio.
- Send only, no events yet: ZeptoMail and Mailtrap send
normally, but MessagePipe does not ingest their webhooks, so sends settle at
sent. - No HTTP delivery webhook: SMTP, Amazon SNS, MessagePipe managed,
Telegram, Signal, and the push providers (FCM, APNs, OneSignal). Sends
through these settle at
sent; there is no downstream delivery callback.
Webhook verification
Each provider signs (or does not sign) its webhooks differently, so the verification secret you save differs:
| Provider | What to save on the provider configuration |
|---|---|
| Resend, Bird SMS | webhook_secret: the whsec_… signing secret |
| MailerSend | webhook_secret: the webhook signing secret |
| Twilio, Plivo | webhook_secret (auth token or signing secret) and status_callback_url, the exact URL you gave the provider |
| Elastic Email | webhook_secret: the whsec_… secret of a webhook created with Sign requests on. Unsigned notifications are rejected. GET (default) and POST JSON delivery both work |
| Telnyx | webhook_public_key: the account public key |
| SendGrid | webhook_public_key: the signed-event-webhook public key |
| Vonage | webhook_secret: the signature secret (HS256) |
| Postmark, Bird email (SparkPost), Bandwidth, Sinch | webhook_secret: a shared secret you also add to the provider as Basic auth, a Bearer token, or an X-Webhook-Secret header. These providers do not sign payloads |
Unverified webhooks are dropped. Webhook timestamps are checked within five minutes for the providers that sign one.
Failover note
auth_failed and payload_too_large are terminal errors, so a bad API key or
an oversized message does not fail over to your next provider. Only
rate limits, 5xx responses, timeouts, and connection failures do.
Pointing each live provider's dashboard webhook at the ingress and verifying it is part of going to production. Until then, downstream metrics stay empty even though sends flow. See Webhooks and Delivery logs.