notifications@mail.oncoeverything.com. The sender is in apps/api/src/mailer.ts, and the templates are React Email components in apps/api/src/emails.
- SES verifies the domain with DKIM. SPF and DMARC records are in Route 53, from
infra/email.tf. - DMARC is at
p=nonefor now. Move it toquarantine, thenreject, when the DMARC reports are clean. - New staff requests go to
REQUEST_NOTIFY_EMAIL, which is hello@oncoeverything.com. - Locally, when
MAIL_FROMis not set, the API prints each email to its console instead of sending it.
/internal/emails on the site.
Card payments
Stripe takes the card on its own hosted page. Card details never reach the platform.1
The buyer clicks Buy this report
The API creates a Stripe Checkout session and sends the buyer to Stripe.
2
Stripe calls the webhook
Stripe posts to the API’s
/webhooks/stripe. The API checks the signature and records the event in stripe_events, so the API processes a repeated event only once.3
The API fulfills the order
It creates a paid invoice, grants access to the report, queues a copy and sends the receipt.
checkout.session.completedcheckout.session.async_payment_succeededcheckout.session.async_payment_failedcheckout.session.expired
STRIPE_SECRET_KEY and STRIPE_WEBHOOK_SECRET are in the app secret. Until then, Buy this report opens the inquiry form and the webhook answers 404.
Invoices paid by bank transfer do not go through Stripe. Staff record those payments by hand. See Invoices.
