AnalyticsIntermediate7 min read

Sales Pipeline Bijhouden in Google Sheets (2026)

Bouw een sales-pipeline tracker in Google Sheets voor 10k–40k rijen CRM-data. Met funnelweergave, wekelijkse trend en een directie-dashboard.

Met deze gids bouw je een volledig werkende sales-pipeline tracker in Google Sheets: van ruwe CRM-export tot een directie-dashboard met funnelweergave, gewogen pipeline-waarde en wekelijkse trendlijn — bruikbaar bij 10k tot 40k rijen dealdata. In 7 stappen, inclusief de formules die de troep overleven die echte exports altijd meebrengen.

What You'll Need

  • Google Sheets met toegang tot QUERY, ARRAYFORMULA en IFERROR
  • Een CRM-export in CSV-formaat (HubSpot, Salesforce, Pipedrive of vergelijkbaar)
  • Basiskennis van INDEX/MATCH en pivot-tabellen
  • Optioneel: IMPORTRANGE als je data uit meerdere regio's samenvoegt

Step-by-Step Guide

1

Stap 1: Stel je kolomstructuur in als fundament

Voordat je ook maar één formule schrijft, moet je kolomstructuur stabiel zijn. CRM-exports breken dashboards omdat kolomvolgorde verandert zodra iemand een veld toevoegt in Salesforce of HubSpot. De oplossing: werk altijd met benoemde kolomreferenties via een aparte configuratierij, niet met hardcoded kolomletters.

Gebruik deze standaardkolommen voor je pipeline-tabblad (RAW_DATA):

KolomNaamTypeOpmerking
Adeal_idtekstUnieke sleutel voor joins
Bdeal_naamtekst
CfasetekstExact uit CRM overnemen
Dwaarde_eurgetalRuwe dealwaarde
EsluitdatumdatumGemengde formaten verwacht
FeigenaartekstRep-naam of ID
Gkans_pctgetal0–100 vanuit CRM of handmatig
Hrecord_datumdatumDatum van de export zelf
  • Voeg boven rij 1 een bevroren configuratierij toe met kolomindexnummers, zodat INDEX-formules kunnen verwijzen naar $A$1 in plaats van naar de letter zelf.
  • Bescherm het RAW_DATA-tabblad tegen handmatige bewerkingen — alle berekeningen verlopen via aparte tabbladen.
  • Reserveer kolom I voor een berekende gewogen_waarde (= D × G / 100); dit voorkomt dat je deze logica overal opnieuw moet dupliceren.

Pro Tip

Zet een validatieregel op kolom C die alleen bekende fasewaarden accepteert. Eén typfout ("Proposal " met spatie) breekt je funnelweergave en je merkt het pas als je cijfers niet kloppen in de wekelijkse standup.
2

Stap 2: Importeer en ruim CRM-data op

Een jaar salesdata uit HubSpot of Salesforce levert tussen de 8.000 en 35.000 rijen op, afhankelijk van je teamgrootte en historische activiteiten. Die export is nooit schoon. Datumkolommen combineren "2024-01-15", "15-1-2024" en "Jan 15, 2024" in dezelfde kolom — letterlijk, omdat drie vertegenwoordigers drie verschillende regio-instellingen gebruiken.

Normaliseer datums met een null-veilige kolom naast je ruwe data:

=ARRAYFORMULA(
  IFERROR(
    IF(ISNUMBER(E2:E), E2:E,
      IFERROR(DATEVALUE(E2:E),
        IFERROR(DATEVALUE(SUBSTITUTE(E2:E,"-","/")),
          ""))),
  "")
)
  • Draai deze formule in kolom I van een apart CLEAN-tabblad dat verwijst naar RAW_DATA — nooit rechtstreeks in de ruwe import.
  • Behandel lege cellen en "N/A"-strings apart: =IF(OR(E2="",E2="N/A","n/a"),"",...) voorkomt dat DATEVALUE crasht.
  • Controleer de kans-kolom op waarden buiten 0–100 met =COUNTIF(G:G,">"&100) in een validatiecel; alles boven 100 wijst op een exportfout.
  • Bij 50k+ rijen begint ARRAYFORMULA te haperen op datum-parsing. Switch dan naar QUERY met FORMAT of verwerk de datumconversie vooraf in Apps Script.

Pro Tip

Maak een klein "data-kwaliteitsblok" bovenaan je CLEAN-tabblad: aantal lege sluitdata, aantal onbekende fases, aantal deals met kans = 0 maar nog open. Dat blok redt je elke maandagmorgen.
3

Stap 3: Bereken gewogen pipeline-waarde per fase

Gewogen pipeline is de enige waarde die een directeur daadwerkelijk wil zien. "€2,4M in de pijplijn" betekent niets als 80% in de prospectfase zit met een sluitkans van 5%. Reken dit uit per fase, niet alleen als totaal.

=QUERY(CLEAN!A:I,
  "SELECT C, COUNT(A), SUM(D), SUM(I)
   WHERE C IS NOT NULL AND D IS NOT NULL
   GROUP BY C
   ORDER BY SUM(I) DESC
   LABEL C 'Fase', COUNT(A) 'Deals', SUM(D) 'Bruto €', SUM(I) 'Gewogen €'",
1)
  • Kolom I in CLEAN is je vooraf berekende gewogen waarde (= dealwaarde × kans / 100).
  • Voeg een kolom toe met =IFERROR(SUM(I)/SUM(D),"–") voor de gemiddelde wegingsfactor per fase — dit signaleert onrealistische kansen ("Proposal" met gemiddeld 90% wijst op een data-probleem).
  • Bereken ook het aantal deals dat de komende 30 en 60 dagen sluit per fase: =COUNTIFS(CLEAN!C:C,A2,CLEAN!E_CLEAN:E_CLEAN,"<="&TODAY()+30).
  • Historisch gezien sluit 15–20% van de deals in de "Proposal"-fase daadwerkelijk binnen de geplande periode; gebruik dat als benchmark om je pipeline-gezondheid te beoordelen.
4

Stap 4: Bouw een sales-pipeline funnelweergave met QUERY

Een funnelweergave laat zien hoeveel deals en euro's er per fase in de pipeline zitten, zodat je in één oogopslag ziet waar deals vastlopen. De meeste teams missen dit overzicht omdat hun Sheets-pivot geen vaste fase-volgorde respecteert — QUERY wel, als je hem goed opzet.

Maak een tabblad FUNNEL en bouw de weergave in 2 delen. Eerst de volgordelijst:

A2:A7  →  Prospecting
           Qualified
           Proposal
           Negotiation
           Closed Won
           Closed Lost

Dan de QUERY die daaraan koppelt:

=ARRAYFORMULA(
  IFERROR(
    VLOOKUP(A2:A7,
      QUERY(CLEAN!A:I,
        "SELECT C, COUNT(A), SUM(D), SUM(I)
         WHERE C IS NOT NULL
         GROUP BY C",1),
    {2,3,4},0),
  0)
)
  • De vaste lijst in A2:A7 zorgt dat fases altijd in de goede volgorde staan, ook als de QUERY-uitvoer anders sorteert.
  • Voeg een conversieratiokolomm toe: =IFERROR(B3/B2,"–") geeft de stap-voor-stap doorstroom van Prospecting naar Qualified enzovoort.
  • Highlight fases met minder dan 3 actieve deals in rood via voorwaardelijke opmaak — dat is je vroege waarschuwing dat een fase leegloopt.
  • Ververs de QUERY-bron dagelijks via een geplande import; handmatige verversing is de reden dat dit soort dashboards na 2 weken worden opgegeven.

Pro Tip

Voeg een minigrafiekje toe naast elke fase (SPARKLINE op de weektrend per fase) zodat de richting van de beweging zichtbaar is zonder dat je naar een apart tabblad hoeft te navigeren.
5

Stap 5: Maak een wekelijkse trendweergave

Een momentopname van de pipeline is leuk. Een trendlijn is wat je directeur vraagt. "Groeit onze pipeline of slinkt hij?" — dat antwoord zit niet in één QUERY, maar in een reeks wekelijkse snapshots.

De eenvoudigste aanpak: een apart tabblad WEEKTREND dat je elke vrijdag handmatig of automatisch bijwerkt.

WeekTotaal dealsBruto €Gewogen €Deals gesloten
2026-W13142€3,1M€820k8
2026-W14151€3,4M€910k11
2026-W15138€3,0M€780k6
  • Gebruik =TEXT(TODAY(),"YYYY-WW") als weeksleutel zodat rijen consistent sorteren.
  • Voeg een kolom toe voor pipeline_velocity: gewogen waarde gedeeld door gemiddelde doorlooptijd in dagen. Dat getal vertelt meer over verkoopgezondheid dan ruwe dealaantallen.
  • Een SPARKLINE over de gewogen €-kolom geeft in 45 seconden het beeld dat een handmatige grafiek 4 minuten kost: =SPARKLINE(C2:C,{"charttype","line";"color","#1a73e8"}).
  • Bij 50k+ deals in je historische dataset: gebruik QUERY in plaats van SUMIFS voor de wekelijkse aggregaties. ARRAYFORMULA over 50k rijen met meerdere criteria begint meetbaar te haperen.
6

Stap 6: Automatiseer data-verversing vanuit je CRM

De pipeline-tracker die elke vrijdag handmatig ververst wordt, is de tracker die na zes weken niet meer wordt ververst. Automatisering is hier geen luxe — het is de reden dat het systeem blijft werken.

De standaardopties, gerangschikt van minste naar meeste onderhoud:

  • IMPORTDATA / IMPORTRANGE**: werkt voor gedeelde Sheets-bronnen of publieke CSV-URLs; ververst elke 30–60 minuten automatisch maar biedt geen transformatielaag.
  • Apps Script tijdtrigger**: haal de CRM-export op via API, schrijf naar RAW_DATA, stuur een e-mail als het fout gaat. Kost ongeveer 30 minuten om op te zetten, werkt betrouwbaar bij 10k–40k rijen.
  • ModelMonkey**: als je liever in gewone taal beschrijft wat er moet gebeuren ("haal elke werkdag om 7:00 de HubSpot-export op en zet hem in RAW_DATA"), dan zet ModelMonkey dat om naar de benodigde Apps Script-logica zonder dat je zelf de API-documentatie hoeft door te spitten.
  • Voeg altijd een LAST_REFRESH-cel toe op het dashboard: =MAX(CLEAN!H:H) geeft de datum van de meest recente importregel, zodat je in één oogopslag ziet of de verversing is misgelopen.

Pro Tip

Bouw een eenvoudige failsafe: als LAST_REFRESH ouder is dan 2 werkdagen, kleurt een cel rood via voorwaardelijke opmaak. Stale data is erger dan geen data, want niemand weet dat het oud is.
7

Stap 7: Zet je sales-pipeline dashboard samen voor directie

Een directeur wil 3 dingen weten: hoe groot is de pipeline nu, wat is de trend, en waar lopen deals vast. Alles wat je in stappen 1–6 hebt gebouwd, komt hier samen in één tabblad.

Bouw het DASHBOARD-tabblad op in 3 blokken:

Blok 1 — KPI-strip bovenaan (rij 1–4):

MetricFormuleDoel
Totale gewogen pipeline=SUM(CLEAN!I:I)Huidige stand
Deals sluitend deze maand=COUNTIFS(CLEAN!E_CLEAN:E_CLEAN,"<="&EOMONTH(TODAY(),0),CLEAN!C:C,"<>"&"Closed Lost")Urgentie
Win rate (YTD)=COUNTIF(CLEAN!C:C,"Closed Won")/COUNTA(CLEAN!A2:A)Gezondheid
Wekelijkse pipeline-groei=INDEX(WEEKTREND!C:C,COUNTA(WEEKTREND!C:C))/INDEX(WEEKTREND!C:C,COUNTA(WEEKTREND!C:C)-1)-1Richting

Blok 2 — Funnelweergave (verwijzing naar FUNNEL-tabblad): Kopieer de funneltabel inclusief de conversieratio's. Voeg conditionele opmaak toe: rood als deals in een fase meer dan 14 dagen geen activiteit hebben gehad (te berekenen als MAX(CLEAN!H:H) minus laatste updatecolumn).

Blok 3 — Top-10 deals op gewogen waarde:

=QUERY(CLEAN!A:I,
  "SELECT B, C, D, I, F, E
   WHERE C <> 'Closed Lost' AND C <> 'Closed Won'
   ORDER BY I DESC
   LIMIT 10
   LABEL B 'Deal', C 'Fase', D 'Bruto €', I 'Gewogen €', F 'Eigenaar', E 'Sluitdatum'",
1)
  • Bevries rij 1–4 zodat de KPI-strip altijd zichtbaar blijft bij het scrollen.
  • Gebruik geen grafieken met handmatige databronnen — koppel alles via formules zodat het dashboard zichzelf bijwerkt.
  • Plan een maandelijkse review om de fasebenamingen in de validatielijst te synchroniseren met wat het CRM-team heeft aangepast; die 30 minuten opzet voorkomt een kapot dashboard op de kwartaalreview.
8

Conclusie

Met deze 7 stappen heb je een pipeline-tracker die werkt op echte CRM-exports: gemengde datumformats worden genormaliseerd, de funnelweergave respecteert je eigen faselogica, en het directie-dashboard vertelt in één oogopslag of de pipeline groeit of krimpt. Het is geen perfect systeem — schema-wijzigingen in je CRM breken de kolomreferenties vroeg of laat — maar met de configuratierij uit stap 1 zijn die reparaties een kwestie van minuten, niet uren.


    Wrapping Up

    Frequently Asked Questions

    Hoe vaak moet ik mijn pipeline-data verversen in Google Sheets?

    Dagelijkse verversing is voor de meeste teams voldoende; real-time is zelden nodig en voegt calculatielast toe. Bij actieve deals met korte sluitdatums (binnen 7 dagen) is een ochtendverversing om 07:00 via een Apps Script-trigger de standaard aanpak. Stel altijd een `LAST_REFRESH`-cel in zodat je direct ziet als een verversing is misgelopen.

    Werkt deze aanpak nog bij 50.000+ rijen dealhistorie?

    QUERY schaalt beter dan ARRAYFORMULA bij die volumes — boven de 50k rijen begin je merkbaar verschil te zien in laadtijd. Splits je data in een actief tabblad (open deals + deals van de afgelopen 90 dagen) en een archief-tabblad (alles ouder), en verwijs je dashboardformules alleen naar het actieve blad. Dat houdt de berekeningen onder de 10 seconden.

    Hoe ga ik om met fasebenamingen die per CRM-export anders gespeld zijn?

    Bouw een vertaaltabel op een apart tabblad (`FASE_MAP`) met twee kolommen: ruwe CRM-waarde en genormaliseerde naam. Wrap je funnelformules met een VLOOKUP naar die tabel zodat "Proposal ", "proposal" en "PROPOSAL" allemaal als dezelfde fase worden geteld. Voeg een COUNTIF toe die elke onbekende fasewaarde signaleert — zo ontdek je nieuwe typos binnen een dag.

    Kan ik meerdere regio's of teams samenvoegen in één pipeline-dashboard?

    Ja, via IMPORTRANGE: maak per regio een eigen RAW_DATA-tabblad en consolideer ze met een QUERY over een gecombineerde range. Let op dat je een teamkolom toevoegt vóór de import, anders verlies je de herkomst. Bij meer dan 3 regiosheets overweeg je Apps Script als aggregatielaag — IMPORTRANGE-ketens boven de 4 sheets worden onbetrouwbaar qua ververstiming.

    Wat doe ik als mijn CRM geen kanspercentage exporteert?

    Definieer zelf een standaard kansmatrix per fase en vul die in via een VLOOKUP op de fasekolom: Prospecting = 10%, Qualified = 25%, Proposal = 40%, Negotiation = 70%, enzovoort. Dit is een aanname, geen meetgegeven — wees daar transparant over in het dashboard, bijvoorbeeld met een voetnoot "kansen gebaseerd op fasenorm, niet op individuele rep-inschatting". Historische win rates per fase (uit gesloten deals) zijn een betere bron als je die kunt berekenen.