Bygde e‑post som en plattformfunksjon — tre leverandører med failover, leveringswebhooks, logging av sending og levering, maler og kampanjer — bak en oppstartskontroll som ikke lar plattformen starte uten minst én leverandør.
Arbeidet utført: 2025
e‑posttjeneste som nekter å starte uten en måte å sende på
Situasjon. E‑post bærer mye av tyngden på plattformen — verifisering, varslinger, sammendrag, kampanjer, det en bruker faktisk venter på. Og en e‑postleverandør er nettopp den typen avhengighet som svikter i det stille: konfigurasjonen ser grei ut, appen starter, og man oppdager først at noe er galt når et ekte menneske aldri får meldingen vedkommende ble lovet. Det er den verste måten å få vite det på. Med bare én leverandør blir det verre, fordi feilen er total og det er noen andre som må rette den.
Oppgave. E‑post måtte behandles som en kapabilitet plattformen eier, ikke som et klientbibliotek den kaller — i stand til å overleve et driftsavbrudd hos en leverandør, i stand til å si hva som skjedde med en gitt melding, og høylytt ved oppstart i miljøene der stillhet er farlig.
Handling. Tre leverandører står bak ett grensesnitt — SendGrid som primær, med SMTP2GO og Azure Communication Services bak — og failover mellom dem skjer automatisk, ikke som en konfigurasjonsendring gjort under press. Levering tas ikke for gitt: innkommende webhooks rapporterer hva hver leverandør gjorde med en melding, og begge sider registreres, i en sendelogg og en tabell for leveringshendelser, slik at «fikk denne personen verifiseringsmeldingen sin» er en spørring og ikke en gjetning. Maler holder meldingsinnholdet utenfor koden, og et eget skjema for masseutsendelser — 5 tabeller og 24 funksjoner — bringer kampanjer ut til brukersegmenter, som er et annet problem enn transaksjonell e‑post og ble bygget som et eget. Foran alt dette sender en oppstartskontroll en ekte melding gjennom hele stakken, styrt av et flagg: i utvikling logger den en advarsel og fortsetter, fordi ingen vil at den bærbare maskinen skal nekte å starte på grunn av en utløpt sandbox‑nøkkel, og i staging og produksjon er en feil fatal, og prosessen avslutter heller enn å produksjonssette et bygg som ikke kan sende e‑post. Selve sendeveien går gjennom en SSRF‑beskyttet klient med et tidsavbrudd på 30 sekunder, og den asynkrone leveringsveien har nye forsøk med backoff, slik at et kortvarig hikk ikke fører til at en melding går tapt.
Resultat. En hel kategori stille feil gikk fra «en bruker merker det dager senere» til «produksjonssettingen stopper», og en leverandør med en dårlig ettermiddag ble til degradert drift i stedet for et driftsavbrudd. Prisen er tre integrasjoner å holde i gang i stedet for én, og leveringslogger som vokser og må ryddes — begge deler akseptert, fordi e‑post er kanalen plattformen ikke kan rute utenom.
Se tilbake på Genererte API‑kontrakten fra databasen og utover — OpenAPI, en typet TypeScript‑klient på 44 076 linjer, 61 mock‑handlere og grensene brukergrensesnittet håndhever — med en kontroll i hvert ledd som feiler ved avvik. Les videre: Bygde laget for betaling og tilgangsrettigheter — Stripe sammen med kjøp i appen hos Apple og Google — som styrer tilgangen til katalogen, søket og eksporten gjennom en tilgangsmodell på 11 tabeller som kontrolleres på serveren. Eller ta en titt på hele porteføljen.
Ett stykke av en lengre oversikt — og den ligger i sin helhet her.
Hver oppføring er skrevet på samme måte: situasjonen, oppgaven, hva vi gjorde, og hva som endret seg.