TRUST
We run a commerce platform on shared infrastructure. Trust isn't a slogan — it's an audit trail. Here is ours.
DATA RESIDENCY
MailOdds runs on 11 Contabo VPS nodes: 4 EU infrastructure nodes (database, app, standby, CI/CD), 4 MTA nodes (EU Central, US East, US West, APAC), and 3 storefront edge nodes (EU, US, APAC). The primary PostgreSQL database lives in Germany; there is no shadow copy outside the EU.
US and APAC nodes replicate configuration + serve the public storefront, but no customer PII is persisted there. Orders + events stream back to the EU primary. Demo stores (paste-a-URL flow) live in the region closest to the visitor and auto-delete after seven days.
AVG / GDPR
MailOdds B.V. is registered in Amsterdam (KVK 99761246) and is the controller for all data processed through our platform. Our lawful basis for processing is contract performance (Art. 6(1)(b) AVG) for merchants and legitimate interest (Art. 6(1)(f) AVG) for storefront visitors, subject to the Telecommunicatiewet Art. 11.7 cookie regime.
Data subject rights (access, rectification, erasure, portability) are served via the privacy policy. Response SLA: 30 days, per AVG Art. 12.
Personal data is encrypted at rest. Production email addresses and reply-forwarding destinations use the DATA_ENCRYPTION_KEY hierarchy with rotation support and a PREVIOUS_DEK grace window. Webhook secrets are stored encrypted. Plaintext columns are staged for removal.
SECRETS
Every environment file on every production node is encrypted with SOPS using per-node age keypairs. Private keys never leave the Ansible vault; the vault password is out-of-band. To decrypt, an operator must have both the vault password and SSH to the target node. There is no master key that decrypts everything at once.
Secret rotation is first-class: the DATA_ENCRYPTION_KEY hierarchy re-encrypts encrypted DB columns without downtime; webhook secret migrations run through a dual-write window with a hard fail-over if decryption with the new key fails.
SUB-PROCESSORS
MailOdds is the controller for data you submit through our platform. A small number of third-party services act as processors under AVG Art. 28, strictly to make the product work. Customer-initiated integrations (Shopify, WooCommerce, Salesforce, and similar) connect only when you authorize the OAuth flow; you can disconnect at any time from the dashboard.
See the data processing addendum for the full list plus controller/processor roles.
SENDER AUTHENTICATION
We own our MTA fleet. Every sending domain signs with both RSA-2048 and Ed25519 DKIM, publishes a correct SPF record with lookup budget, and enforces DMARC at reject. TLS 1.3 on hop-to-hop; MTA-STS + DANE where supported. Bounce + complaint + reply processing is native, not polled.
OBSERVABILITY
Prometheus scrapes every service on every node every 15 seconds.
Alertmanager fires SLO-based alerts (validation p95 < 2s,
dashboard p95 < 1s, storefront p95 < 500ms) to the dashboard
SSE feed and — when wired — to on-call. Grafana lives behind SSH
tunnel on the standby node; incident runbooks live in docs/runbooks/.
CREDITS
Geist (body) by Vercel. Plus Jakarta Sans (display) by Tokotype. Both licensed under the SIL Open Font License.
Wong 2011 colorblind-safe palette. Published in Nature Methods as a default-accessible palette for scientific visualization; adopted here as the semantic colorway for the whole product (emerald = positive, red = negative, amber = caution, blue = info, orange = risk).
The homepage hero plays a silent looping recording of a real demo provisioner run. Our own product in motion, not stock footage.
The three outcome sections (storefront, email, data) play ambient loops from the following Pexels creators:
section-storefront — Storefront commerce cycle by Kindel Media (with Polina Tankilevitch, Kampus Production, Pavel Danilyuk, Ron Lach)section-email — Mobile notification macro by Sambhaji Gaikwadsection-data — Interactive analytics on a tablet by Jakub ZerdzickiStatic hero composites + per-page OG cards produced with Google's
Gemini 3 Pro Image Preview (gemini-3-pro-image-preview). Every generation call passes personGeneration: "dont_allow", so no
human faces are hallucinated. Composites include a SynthID
watermark (invisible) per Google's commercial-use guidelines.
Where Gemini was rate-limited or capped, hero composites fall back to
a deterministic Pillow build that layers real screenshots on a brand
gradient (scripts/demo-inventory/compose-hero-pillow.py). The fallback path is recorded in brand/hero/manifest.json as model: pillow-composite-fallback.
Numbers visible in marketing screenshots (visitor counts, captured leads, revenue) are illustrative demo values, not customer data. They are rewritten at capture time via a temporary browser extension so the dashboard reads as a growing store rather than the near-empty state of our internal test account. Your dashboard always reflects your real activity.
We reply in hours. support@mailodds.com, or send a GitHub issue.