Naar de inhoud
Datadenkt

Gereedschap  /  Kosten

Egress: de rekening die je niet zag aankomen

Waarom een app die niemand gebruikt opeens 200 euro kost, en welke vier knoppen dat oplossen.

Egress is het woord dat je gaat leren op de dag dat je het niet meer wilt weten. Het betekent alle data die jouw dienst naar buiten stuurt: niet wat je opslaat, maar wat eruit gaat, elke keer opnieuw. Opslag kost een paar cent per gigabyte per maand. Uitgaand verkeer niet. Eén foto van 4 MB die duizend keer bekeken wordt is 4 GB egress, en bij Supabase zit er 5 GB in de gratis laag.

Meenemen naar je editor

Deze handleiding is geschreven om als werkopdracht te dienen. Neem hem in zijn geheel mee naar Cursor, Claude Code of waar je ook bouwt, en werk hem fase voor fase af.

Waar het misgaat

Opslag is goedkoop, verkeer nietJe let op de eerste en betaalt voor de tweede. Dat is precies waarom de rekening verrast.
Foto's gaan onverkleind de lijn overEen telefoonfoto is 3 tot 8 MB. Op je scherm zie je hem op 400 pixels breed.
Eén polling-lus is 86.400 verzoeken per dagPer open tabblad. Een vergeten interval van één seconde kost meer dan al je bezoekers samen.
Een limiet zonder waarschuwing is een storingZet ze altijd allebei: een melding op de helft en een harde rem op een bedrag dat je kunt missen.

Fase 0Vaststellen

Kijk waar het weglekt voordat je iets aanpast. Anders optimaliseer je het verkeerde.

  1. Open het gebruiksoverzicht van je dienst. Bij Supabase staat dat onder Reports en dan Egress; bij Vercel onder Usage.
  2. Kijk niet naar het totaal maar naar de verdeling: komt het uit storage, uit de database, of uit je functies? Dat bepaalt welke van de vier knoppen hieronder je nodig hebt.
  3. Open daarna je eigen site met F12 en het tabblad Network, en kijk onderaan hoeveel kilobytes één paginabezoek kost. Boven de 2 MB heb je een probleem dat je met het blote oog kunt vinden.
  4. Sorteer die lijst op grootte. Het bovenste item is bijna altijd een foto.

Fase 1De vier knoppen

Op volgorde van opbrengst. De eerste alleen is meestal al een factor 25.

  1. Verklein je afbeeldingen vóór het uploaden, in de browser. Een canvas van 1600 pixels breed en kwaliteit 0,8 brengt een foto van 5 MB terug naar ongeveer 200 kB.
  2. Zet een CDN voor je opslag. Cloudflare ervoor hangen is gratis en haalt de herhaalde verzoeken bij je opslag weg. Statische bestanden krijgen een lange cache-header, want een logo verandert niet.
  3. Vraag alleen de kolommen en rijen die je toont. select('id, naam, datum') in plaats van select('*'), met een limit en paginering. Dit is meestal de grootste winst in een dashboard.
  4. Vervang polling door een abonnement, of verleng de interval. Realtime als je het echt nodig hebt, en anders elke dertig seconden in plaats van elke seconde.

Waar het bij AI-gebouwde apps standaard misgaat

  • Foto's worden opgeslagen zoals ze binnenkwamen, en twintig keer te groot uitgeleverd.
  • Er zit geen CDN voor, dus elke bezoeker gaat rechtstreeks naar je opslag, ook voor een logo dat nooit verandert.
  • Hele tabellen worden opgehaald en in de browser gefilterd: 5.000 rijen egress om er drie te tonen.
  • Een useEffect zonder goede afhankelijkheden haalt bij elke render opnieuw op.
  • Een polling-lus die elke seconde vraagt of er iets nieuws is.

Fase 2De rem erop

Los van optimaliseren: zorg dat een fout je niet failliet laat gaan.

Zet bij elke dienst een uitgavenlimiet en een waarschuwing op ongeveer de helft daarvan. Bij Supabase heet dat een spend cap, bij Vercel een spend limit, bij OpenAI en Anthropic een usage limit. Doe dit voordat je live gaat, niet erna.

Fase 3Controleren

Bewijs voordat je zegt dat het klaar is. Meet hetzelfde als in fase 0 en vergelijk.

  • Eén paginabezoek kost minder dan 1 MBMeet opnieuw met F12 en Network, met een lege cache. Vergelijk met wat je in fase 0 opschreef.
  • Geen enkele afbeelding is groter dan 300 kBSorteer de netwerklijst op grootte. Staat er nog een foto van megabytes, dan slaat je verkleining bij het uploaden over.
  • Een tweede paginabezoek haalt de statische bestanden uit de cacheHerlaad zonder cache te legen. Logo, lettertypen en scripts moeten uit de cache komen en niet opnieuw over de lijn.
  • Er staat geen interval korter dan tien seconden in je codeZoek op setInterval en op refetchInterval. Elke treffer onder de tien seconden verdient een reden.
  • De uitgavenlimiet en de waarschuwing staan aanBij elke dienst apart. Laat het overzicht zien in plaats van het je te herinneren.
Nog een keer, nu je weet wat erin staat

Alles hierboven in één keer, inclusief de fases, de SQL en de controlestap.

Werkt dit, maar wil je het niet zelf doen?

Dit blad is gratis en blijft gratis. Wil je dat het bij jou automatisch draait in plaats van met de hand, dan bouw ik dat. Beschrijf in vijf vragen wat er vastloopt en stuur het adres van je app mee; binnen één werkdag heb je mijn antwoord op papier.

Vertel wat er vastloopt