Wallpaper gallery

Wallpapppers sends its account and billing emailthrough OpenEmail.

Wallpapppers offers free, reimagined wallpapers on the web and on phones. One SDK call carries every email it sends, and the key that stops a duplicate in its database also stops one at OpenEmail.

services/emails/sendTransactionalEmail.ts
await getOpenEmail().emails.send(  {    from: fromEmail(),    to,    subject,    html,    text,  },  {    idempotencyKey,    signal: AbortSignal.timeout(EMAIL_SEND_TIMEOUT_MS),  },)

Each billing email reuses the key Wallpapppers stored with the event, and every send gives up after 15 seconds instead of holding a job open.

9

kinds of email in production

15

seconds before any send is cut off

Sep 2026

The month it started on OpenEmail

What runs through it

What Wallpapppers runs
on OpenEmail.

  • Sign-in codesSent the moment someone asks for one.
  • WelcomeSent to new accounts during their first week.
  • Download resetA note when a free download is available again, with the three newest wallpapers.
  • BillingSix emails, from a plan starting to a refund, for web and App Store subscribers alike. Wallpapppers turned off its payment provider's own emails, so these are the only payment notices people get.

How it was built

How Wallpapppers
put it together.

  1. 01

    One client, made once

    Wallpapppers creates the OpenEmail client on first use and reuses it for every send.

  2. 02

    Queue every billing event

    Payment and App Store webhooks queue an email with a key that names the exact event, such as a subscription and the moment it was cancelled.

  3. 03

    Send with the same key

    A job every ten minutes sends what is queued and passes that key to OpenEmail as the idempotency key, so a retry can never deliver a second copy.

  4. 04

    Fail fast, then retry

    Each send is cut off after 15 seconds. A billing email gets up to three attempts, and one that is stuck or failed raises an alert.

Features in use

The OpenEmail features
Wallpapppers relies on.

Email API

Send one message or a hundred per call, now or later, and retry without sending twice.

Typed SDKs

TypeScript, Python and Ruby clients, one method for every operation.

/threads?query=invoice
{ "threads": 12 }
Same mailbox, whether a person or a program is holding it.
API keys

A key per job, limited to the scopes and senders it needs, with every call logged.

Multiple domains

Point several domains at one inbox, subdomains included.

acme.comacme.devteam.acme.comhey.acme.io

Questions

Questions about
Wallpapppers and OpenEmail.

Mint a key.
Send something.

Full API, MCP and SDK access on every plan, the free one included.