The messages identity has to send
Verification codes, invitations, password resets and security alerts — templated per channel and per language, sent through your own providers, with delivery you can actually see
Templates
Every message the platform sends, per channel and language.
Subject
Verify your email
Hi {{name}},
Your code is {{code}}. It expires in 10 minutes.
— Acme
Templates
Every message the platform sends is a template you own, not a string we picked for you
Verify your email
Hi {{name}},
Your code is {{code}}. It expires in 10 minutes.
— Acme
{{code}} is your Acme code. Expires in 10 minutes.
The same message, rendered per channel and per language — variables checked before anything goes out
Per channel
Email and SMS versions of the same message, edited side by side
Per language
A locale per template, with a fallback when one is missing
Variables
Typed placeholders, validated before a broken send goes out
Live preview
See the rendered message with real values before saving
Your providers
Deliverability is a relationship with a provider. It stays yours
Providers
Delivery runs through your own accounts, per environment.
Bring your own SendGrid, Twilio or SMTP. Development points at a sandbox so a test never reaches a real phone
Bring your own SMTP
Your domain, your reputation, your provider account
SMS providers
Configured per environment, so tests never hit a real number
Per-environment routing
Development to a sandbox, production to the real thing
Failover
A second provider for when the first one has a bad afternoon
Delivery
"Did they get the email?" should take one query, not a support thread
Stats
What went out, through which channel, and whether it landed.
Summary
99.4% of messages delivered
Emails sent
57,071
SMS sent
12,088
Not sent
402
Recent events
Stats
Volume and failure rate per channel and template.
| Template | Channel | Sent | Failed |
|---|---|---|---|
| email-otp-verification | 48,210 | 0.2% | |
| reset-password-email | 6,904 | 0.4% | |
| grants-invite | 1,255 | 0.1% | |
| email-otp-verification | sms | 12,088 | 1.8% |
| welcome-user | 702 | 0.0% |
Delivery rate, volume per channel, and the individual messages that failed with the reason why
Delivery logs
Every message with its status, provider response and timing
Rate limits
Per recipient and per template, so a retry loop cannot spend your quota
Stats
Volume and failure rate per channel and template over time
Retries
Backoff handled for you, with the attempts visible
Name the template, not the transport
Providers, templates and languages are configured per environment. Your code asks for a template and a locale; everything else is a setting.
// Providers and templates are configured per environment,
// so the SDK only names the template it wants.
const { data, error } = await nulvless.comms.email.send({
to: "[email protected]",
template: "grants-invite",
language: "pt-BR",
params: { organization: "Acme Inc", role: "admin" },
});One platform, from your first user
Focus on your product. We handle identity infrastructure
What you would have built
Six areas, every one of them a project of its own.
- Authenticationpasswords, providers, MFA, sessions
- AuthorizationRBAC, scopes, per-resource grants
- OAuth serverOIDC discovery, JWKS, PKCE
- Edge functionsDeno runtime, deploys, rollback
- Notificationstemplates, providers, delivery logs
- Observabilitymonitoring, audit trail, query