Email Botseon sends you
Member·3 minutes to read
Every mail Botseon sends is transactional: it tells you something about your account, your subscription or your usage, and none of it needs your consent to send. Botseon sends no marketing mail in this build, so nothing here carries an unsubscribe link (F-MAIL-4).
What sends today
Three of the catalogue's messages are wired up and render with real, fixed wording — plain text only, with no HTML layout yet:
export const BILLING_MAIL_TEMPLATES = [
'billing.payment_failed',
'billing.payment_required',
'billing.payment_received',
] as const;
| Message | When it sends | Subject |
|---|---|---|
| Payment failed | Your card was declined or could not be charged. | Your payment did not go through |
| Payment required | Your account is paused until a payment succeeds. | Your account is paused until payment succeeds |
| Payment received | A payment succeeded and your account is active again. | Your payment succeeded |
Each names the page to visit — Usage & Billing in the app — rather than a link, because this build has no public URL that is true on every deployment for a mail to point at (packages/billing/src/mail-templates.ts:35-38).
How a send works
No template is ever sent from inside a web request or a payment provider's webhook handler. A send is a mail_send row the worker claims separately, so a slow mail provider never holds a webhook open, and a failure retries with a growing backoff instead of being lost (packages/billing/src/jobs/mail-send.ts:9-18,57-67). Each send carries an idempotency key of the template, your user id and the triggering event — the invoice id, for the three billing messages above — so a redelivered webhook or a retried job sends the same mail at most once (packages/billing/src/jobs/mail-send.ts:20-26,94-100).
The rest of the catalogue
The mail system declares fourteen further message kinds — the sign-in code, the welcome mail, the trial ending, the plan-cancelled and usage-allowance mails, the account and organisation deletion confirmations, and more — as named, typed triggers ready to render (packages/core/src/mail-catalogue.ts:13-31). Each has a defined context (which facts it may state) but no filled-in wording yet: this build's copy catalogue for them is present with every subject and body left empty (packages/mail/src/strings.ts:82-124). None of them sends mail today.
Turning a message off
Nothing here is optional mail: every message reports something about your own account or subscription, so none of them carries a preferences link in this build. If a message ever concerns you, the page it names — Usage & Billing, or your account settings — is where the underlying setting lives, not the mail itself.
See also
Last verified against build c0f77aa.