Fallstudie
Automajl
Kundutskick per mejl för småföretag. Företaget lägger in sin kundlista, skriver ett utskick och skickar det nu eller vid en bestämd tid, från sin egen domän och med en avregistrering som följer lagen. Byggt på Firebase och tänkt att säljas som en tjänst.
- Roll
- Allt: krav, säkerhetsgranskning, backend, gränssnitt, drift
- Byggt med
- React 19, Vite, Firebase Auth, Firestore, Cloud Functions, Brevo
- Status
- Byggs om. Nya versionen är klar i testmiljön, inte i drift än
- Kvalitet
- Enhetstester, regeltester mot emulatorn och en grind som stoppar driftsättningen
Problem
Ett litet företag som vill nå sina kunder med ett erbjudande har två dåliga val. Antingen ett nyhetsbrevsverktyg byggt för marknadsavdelningar, eller en lista i Outlook där alla mottagare syns för varandra och ingen kan avregistrera sig.
Första versionen byggde jag 2025 åt ett lokalt företag. Den fungerade för dem, men var byggd för en enda kund. Nu är den ombyggd till en tjänst där varje företag är en egen organisation och bara ser sitt eget.
Vem använder det
Personalen hos kunden, oftast någon som jobbar med marknadsföring och inte med teknik. Ett utskick görs i fyra steg: mottagare, innehåll, testmejl till sig själv och skicka nu eller schemalägg. Kundlistan läses in från CSV, även svensk Excel med semikolon, och granskas innan något sparas.
Mottagarna får ett mejl från företagets eget namn och adress, med en länk som avregistrerar utan inloggning. Den som har avregistrerat sig får aldrig fler utskick från det företaget.
Det jag hittade i min egen kod
Innan ombyggnaden granskade jag den första versionen som om någon annan hade skrivit den. Listan var inte smickrande, och det var poängen.
- Källkoden låg publikt via källkodskartor i produktionsbygget.
- Kunddata skrevs med innerHTML, så en CSV-fil kunde bära med sig skript.
- Två funktioner kunde skicka mejl utan inloggning.
- Felsökningsskript följde med i produktion, och sidan saknade säkerhetshuvuden.
- Hemligheter låg i ett konfigurations-API som Firebase har avvecklat.
Arkitektur
En React-app på Firebase Hosting, Firestore som databas och Cloud Functions för allt som skickar mejl eller ändrar behörigheter.
- En organisation per kund. Varje användare har roll och organisation i sin inloggning, och databasreglerna kräver att varje dokument tillhör användarens organisation. Kampanjer och loggar skrivs bara av servern.
- Ingen självregistrering. Konton skapas av admin, och den nya användaren väljer själv sitt lösenord via mejl.
- Lagkraven är inbyggda. Avregistreringslänk utan inloggning, List-Unsubscribe-huvud, avsändarens namn och adress i sidfoten, och ett sparat skäl per kontakt: samtycke eller befintlig kund, med datum.
- Mejlen går via Brevo från kundens egen domän, signerade med DKIM. Utvecklingsläget tar emot utskick men levererar inget, så ett test kan aldrig nå en riktig kund.
- Hemligheter i Secret Manager, App Check framför funktionerna och strikt CSP. Datan ligger i Stockholm.
Svåraste delen
Att flytta befintlig data från en modell med en användare till en modell med organisationer, utan att tappa något. Migreringen lägger bara till fält och tar aldrig bort, den kör som torrkörning tills man uttryckligen säger åt den att skriva, och databasen säkerhetskopieras varje dag innan något driftsätts.
Det andra var att få avregistreringen att hålla på riktigt. Länken är signerad så att ingen kan avregistrera någon annan, och spärren ligger på serversidan, så att inte ens en användare med fel i sin kundlista kan skicka till någon som har tackat nej.
Resultat
Den nya versionen går igenom hela flödet mot Firebase emulatorer: import av kontakter, mall, testmejl, utskick, avregistrering och ett nytt utskick där den avregistrerade hoppas över. Byggd för produktion fick den full pott i Lighthouse på prestanda, tillgänglighet och bästa praxis på de fyra viktigaste vyerna.
Kvar innan drift: en förhandsvisning som jag själv godkänner, domänautentisering för den första kunden och ett personuppgiftsbiträdesavtal. Driftsättningen stoppas automatiskt om något test fallerar.
Länkar
Hör av dig om ditt företag vill använda Automajl
Källkoden är privat eftersom tjänsten ska säljas. Jag visar den gärna vid en intervju.