LokaleBanen – Van spreadsheet-chaos naar real-time revenue intelligence
Hoe we een netwerk van vacatureportalen van uren handmatig rapportwerk naar instant financieel inzicht brachten
LokaleBanen exploiteert een netwerk van lokale vacatureportalen in Nederland. Ze verkopen abonnementen, losse vacatureplaatsingen en credits aan werkgevers die personeel zoeken. Hun financiële data zat echter opgesloten in een complexe Google Sheets-structuur met 4 tabs en meer dan 10 databereiken — waardoor elke rapportagecyclus uren handmatig werk kostte en de data altijd verouderd was tegen de tijd dat het rapport klaar was.
Resultaten
~95%
Tijdsbesparing
Van circa 6 uur handmatige rapportage per cyclus naar een real-time dashboard dat elke 15 minuten automatisch ververst
24x
Snellere data-verversing
Van wekelijkse handmatige rapporten naar automatische updates elke 15 minuten
0
Handmatige rekenfouten
Geautomatiseerde NL/EN bedragparsing en proportionele multi-portal verdeling elimineren menselijke rekenfouten volledig
9
Interactieve visualisaties
Van ruwe spreadsheet-data naar 9 overzichtelijke grafieken: omzet, targets, liquiditeit en meer — filterbaar per portaal en periode
🎯De Uitdaging
- •Financiële data verspreid over 4 tabs en 10+ databereiken in Google Sheets — geen centraal overzicht mogelijk
- •Handmatig samenvoegen van targets, abonnees, vacatureplaatsingen, credits en gap-to-target data per portaal per maand
- •Multi-portal abonnees (één abonnee op meerdere portalen) vereisten handmatige proportionele verdeling van bedragen
- •Spreadsheet bevatte een mix van Nederlandse en Engelse notaties (EUR 34.920,21 vs 1,234.56; Yes/Ja; No/Nee) — foutgevoelig bij handmatige interpretatie
- •Geen onderscheid tussen gegarandeerde omzet (bevestigde contracten) en risicovolle verwachte omzet (opzegbare abonnementen)
- •Geen inzicht in liquiditeitsverdeling: welk deel van de omzet is maandelijks, jaarlijks of eenmalig gefactureerd?
- •Rapportagecyclus kostte geschat 4-8 uur per keer — data was altijd verouderd bij oplevering
💡Onze Oplossing
- Password-protected web dashboard met cookie-based authenticatie en 30-dagen sessie voor veilige toegang
- Geautomatiseerde JWT-geauthenticeerde batchGet die alle 10 databereiken uit 4 Google Sheets tabs in één keer ophaalt
- Intelligente data-transformatie engine die automatisch NL/EN bedragnotaties detecteert en parseert, percentages verwerkt, en multi-portal abonnees proportioneel verdeelt
- ISR caching (15 minuten) zodat het dashboard razendsnel laadt zonder de Google Sheets API te overbelasten
- 9 interactieve visualisaties: totale omzet met KPI-indicator, omzet per product (stacked bar), gegarandeerde vs. verwachte omzet, gap-to-target analyse, en liquiditeitsweergave
- Sticky filterbar waarmee je per portaal en tijdsperiode kunt filteren — van uren Excel-werk naar één klik
- Dynamische portal-detectie: nieuwe portalen worden automatisch opgepikt zonder code-aanpassingen
- Visuele waarschuwingsbanner bij verwachte (risicovolle) omzet zodat het team direct ziet waar aandacht nodig is
LokaleBanen: van versnipperde spreadsheets naar real-time revenue inzicht
LokaleBanen is een snelgroeiend recruitment-platform met meer dan tien lokale vacatureportalen in Nederland. Werkgevers kunnen er abonnementen afsluiten, losse vacatures plaatsen en credits kopen. De omzetstroom is divers en het bedrijf schaalt hard, maar de financiële rapportage liep achter.
Uitdaging: financiële data opgesloten in Google Sheets
Alle omzet- en cashflowdata zat verspreid over een complexe Google Sheets-structuur:
- 4 tabs met meer dan 10 verschillende databereiken
- Een mix van Nederlandse en Engelse valuta-notaties (bijv.
EUR 34.920,21en1,234.56) - Multi-portal abonnees die handmatig over meerdere portalen verdeeld moesten worden
In de praktijk betekende dit:
- 4–8 uur handmatig werk per rapportagecyclus om data te exporteren, samen te voegen en te controleren
- Regelmatige parseerfouten door gemengde NL/EN-notaties
- Fouten of vergeten stappen bij de proportionele verdeling van multi-portal abonnees
- Geen helder onderscheid tussen gegarandeerde omzet (contracten met vaste looptijd) en verwachte omzet (opzegbare abonnementen)
- Geen inzicht in liquiditeit: welk deel van de omzet maandelijks, jaarlijks of eenmalig gefactureerd werd
Tegen de tijd dat een rapport klaar was, was de data al verouderd. Strategische beslissingen werden genomen op basis van achterhaalde cijfers.
Oplossing: een real-time revenue dashboard
We ontwikkelden een beveiligd web dashboard dat alle financiële data automatisch uit Google Sheets ophaalt, transformeert en visualiseert in 9 interactieve grafieken.
Datastroom en automatisering
- Via een JWT-geauthenticeerde verbinding haalt het dashboard in één batchGet-call alle 10 databereiken uit 4 Google Sheets-tabs op.
- Een intelligente transformatie-engine:
- Detecteert automatisch of bedragen in Nederlandse (
34.920,21) of Engelse (34,920.21) notatie staan en parseert ze correct. - Verdeelt omzet van multi-portal abonnees proportioneel over alle actieve portalen (bijv. 1 klant op 3 portalen → bedrag / 3 per portaal).
- Herkent nieuwe portalen automatisch, zonder codewijzigingen.
- Classificeert omzet als gegarandeerd (met bevestigde einddatum) of verwacht (risicovoller, opzegbaar).
- Met Incremental Static Regeneration (ISR) in Next.js wordt de data elke 15 minuten ververst. Dit biedt vrijwel real-time inzicht zonder de Google Sheets API te overbelasten.
9 interactieve visualisaties
Het dashboard geeft een volledig financieel overzicht via 9 grafieken:
- Totale Omzet – KPI-indicator met trend en gemiddelde.
- Omzet per Product – Stacked barchart met abonnementen, vacatures en credits.
- Gegarandeerde Omzet – Alleen contracten met bevestigde looptijd.
- Verwachte Omzet – Risicovolle omzet, duidelijk gemarkeerd met een waarschuwingsbanner.
- Gap to Target – Per portaal: hoeveel boven of onder target.
- Percentage to Target – Voortgang per portaal als percentage.
- Target vs. Werkelijk – Maandelijkse vergelijking tussen doel en realisatie.
- Liquiditeitsweergave – Cashflow per facturatiefrequentie (maandelijks, jaarlijks, eenmalig) versus totale omzet.
- Omzetoverzicht per Portaal – Detailoverzicht per individueel portaal.
Alle grafieken zijn filterbaar via een sticky filterbar:
- Filter op specifiek portaal
- Kies een tijdsperiode
- Reset alle filters met één klik
Technische stack
Het dashboard is gebouwd met een moderne, schaalbare stack:
- Next.js 14 (App Router) en React 18
- TypeScript met 7 zorgvuldig gedefinieerde interfaces voor type safety
- Tremor (op basis van Recharts) voor interactieve datavisualisaties
- Tailwind CSS voor consistente, snelle styling
- Google Sheets API v4 met JWT service account authenticatie voor betrouwbare data-integratie
- Next.js ISR voor automatische 15-minuten caching
- Deploy op Vercel voor performance en eenvoudige schaalbaarheid
Resultaat: van uren werk naar direct inzicht
Het nieuwe dashboard heeft het rapportageproces bij LokaleBanen fundamenteel veranderd:
- Van ~6 uur naar 0 minuten per rapportagecyclus – alle data wordt automatisch opgehaald, opgeschoond en gevisualiseerd.
- 24× snellere data-verversing – van wekelijkse rapporten naar updates elke 15 minuten.
- Geen parseerfouten meer – automatische NL/EN-detectie en conversie.
- Consistente multi-portal verdeling – proportionele toewijzing gebeurt altijd correct en volledig geautomatiseerd.
- Directe, portaal-specifieke analyse – met één klik in plaats van uren Excel-werk.
LokaleBanen heeft nu voor het eerst een real-time, betrouwbaar overzicht van omzetprestaties per portaal. Het team ziet in één oogopslag:
- Welke portalen boven of onder target presteren
- Hoe de verhouding is tussen gegarandeerde en verwachte omzet
- Hoe de liquiditeit verdeeld is over verschillende facturatiefrequenties
Besluitvorming is verschoven van reactief naar proactief: het management stuurt nu op actuele cijfers in plaats van op achteraf gereconstrueerde spreadsheets.