Already have a key? Install the SDK and send in three lines.
dotnet add package XpressNotification.Sdkvar client = new XpressNotificationClient("xpn_your_key", "https://your-api.com");
await client.Email.SendAsync(new EmailSendRequest
{
To = "user@example.com",
Subject = "Welcome!",
Html = "<p>Hello from XpressNotification</p>"
});1Create an account
Sign up for a free dashboard account — you land on the Free plan, no card required. Each signup gets its own isolated organization account.
2Create an API key
In the dashboard go to API Keys → Create key. Copy the key — it is shown only once. Optionally restrict the key to specific IPs or CIDR ranges right there (see Security).
Keys are shown once
3Send your first email
Install the .NET SDK:
dotnet add package XpressNotification.SdkThen send:
var client = new XpressNotificationClient("xpn_your_key", "https://your-api.com");
await client.Email.SendAsync(new EmailSendRequest
{
To = "user@example.com",
Subject = "Welcome!",
Html = "<p>Hello from XpressNotification</p>"
});4Other channels
Every channel uses the same client — just a different sub-client. SMS via Twilio:
await client.Sms.SendAsync(new SmsSendRequest
{
To = "+233200000000",
Body = "Your OTP is 1234"
});Push (client.Push) and WhatsApp (client.WhatsApp) follow the same pattern. See the SDK docs for full examples of each.
5Email providers & failover
Email sends through Amazon SES by default. Add your own SMTP servers under Settings → Providers → Email → SMTP fallback — as many as you like, in priority order. Sends try them top-to-bottom, falling through only on connection/auth failures (a rejected recipient stops immediately, since another server can't fix a bad address).
The same page sets your account's routing & failover for sends that don't specify a provider:
SES → SMTP(default) try SES, fall over to SMTP if it fails.SMTP → SEStry your SMTP servers first, fall over to SES.SES only / SMTP onlyno cross-provider failover.
Override a single message by setting "provider": "smtp" (or "ses") in the send body — an explicit provider is used as-is, with no failover. SMTP passwords are encrypted at rest, and each config has a Test button plus a delivery-attempt log.
6Validate addresses
Check deliverability (syntax, MX records, disposable domains) before you send, to cut bounces:
var check = await client.Email.ValidateAsync("user@example.com");
// check.IsValid, check.Reason ("valid" | "invalid_syntax" | "no_mx_record" | "disposable_domain")Use client.Email.ValidateBulkAsync(...) for lists, and there's a “validate before send” toggle (Settings → Providers → Email → Validation) that runs the check automatically and rejects undeliverable recipients up front.
7Opens, clicks & analytics
Outgoing HTML emails get a tracking pixel and click-through links injected automatically. The dashboard Analytics page shows opens and clicks broken down by device, mail client, and country.
A note on open rates
8Secure your keys
Give each API key an IP allowlist (single IPs or CIDR ranges) on the API Keys page. Empty means the key works from anywhere; otherwise a call from any other address is rejected with a clear 401. Keys are stored hashed and shown only once.
Ready to go deeper?
The full .NET SDK reference covers DI setup, every channel, templates, and error handling.