{ "hubspot" :

HubSpot-bedrijven verrijken met KVK-data

Kort antwoord

HubSpot heeft geen KVK-veld en verrijkt Nederlandse bedrijfsdata niet uit het Handelsregister. Je maakt zelf custom properties op het Company-object en vult ze via een workflow met een webhook-actie, een coded action of een private app die op CRM-webhooks luistert. Wij leveren geen HubSpot-app: je roept onze REST API aan vanuit die middleware.

HubSpot API
# verrijking terugschrijven
PATCH "/crm/v3/objects/companies/512"

{
  "properties": {
    "name": "Acme B.V.",
    "kvk_number": "68750110",
    "sbi_code": "6201",
    "vat_valid": "true"
  }
}

Welke properties je aanmaakt

HubSpot heeft name, domain, city en numberofemployees. Die zijn gevuld met wat sales heeft ingetypt of wat HubSpot uit een e-maildomein afleidde. Registerdata hoort daar niet doorheen. Maak eigen properties aan, met een duidelijke herkomst.

PropertyTypeUit de API
kvk_numbersingle-line textkvkNumber
statutory_namesingle-line textstatutoryName
legal_formdropdownlegalForm
sbi_codesingle-line textactivities[].sbiCode waar isMain
vat_numbersingle-line textvat.number
vat_validbooleanvat.valid
company_activebooleanisActive
enriched_atdate pickertijdstip van de call

enriched_at lijkt overbodig tot het moment dat iemand vraagt hoe oud die data is. Zonder timestamp kun je niet selectief opnieuw verrijken en verrijk je dus elke maand alles, wat recht in je quota loopt.

Het integratiepunt: workflow, coded action of private app

Er zijn drie plekken waar de call vandaan kan komen, en ze verschillen in wat ze kosten en wat ze aankunnen.

Workflow met webhook-actie. Enroll bedrijven waar kvk_number bekend is en enriched_at leeg. HubSpot POST’t naar jouw endpoint, jij doet de lookup en schrijft terug via de CRM API. Simpel, en je logica staat in je eigen code.

Coded action. Draait in HubSpot zelf, geen eigen server nodig. Vraagt Operations Hub Professional, en je zit vast aan de uitvoeringslimieten van die runtime. Prima voor één lookup per record, niet voor een backfill.

Private app op CRM-webhooks. Je abonneert op company.propertyChange voor kvk_number. Dan gebeurt de verrijking op het moment dat het nummer verandert, ongeacht welk abonnement je hebt. De payload is een array van events:

[
  {
    "subscriptionType": "company.propertyChange",
    "objectId": 512,
    "propertyName": "kvk_number",
    "propertyValue": "68750110",
    "occurredAt": 1755820800000
  }
]

Verwerk die array asynchroon. HubSpot bundelt events en verwacht snel een 2xx: een handler die synchroon op onze API wacht, loopt in een piek tegen timeouts aan en HubSpot stuurt hetzelfde event dan opnieuw.

Terugschrijven doe je gebundeld, niet per record:

POST /crm/v3/objects/companies/batch/update

met maximaal honderd records per aanroep. Aan onze kant hoort daar POST /v1/lookup/batch bij, met { "kvkNumbers": [...], "enrich": true }. Zo blijven beide kanten binnen hun limiet.

Waar de invoer vandaan komt

Het KVK-nummer moet ergens binnenkomen. Twee routes:

  • Je eigen formulier, met onze widget aan het inputveld. De bezoeker zoekt op naam, kiest een bedrijf, jij submit het KVK-nummer mee naar de HubSpot Forms API.
  • Handmatig door sales, in het bedrijfsrecord. Dan is een validatie achteraf nodig, want een handmatig ingetypt nummer is precies zo betrouwbaar als het overtypen suggereert.

Wat niet werkt: de widget aan een ingesloten HubSpot-formulier hangen dat in een iframe rendert. Je script komt niet bij dat inputveld. Controleer eerst hoe jouw embed rendert voordat je autocomplete op een HubSpot-formulier belooft. Rendert het als iframe, dan bouw je het formulier zelf en verstuur je naar de Forms API.

Schrijf het nummer in beide gevallen naar een property die alleen jouw integratie aanraakt. Een veld dat zowel sales als een sync bewerkt, wordt een discussie over welke waarde klopt, en het register verliest die discussie altijd van wie het laatst heeft getypt.

Wat er in productie stukgaat

Domeindeduplicatie voegt je groepsstructuur samen. HubSpot gebruikt het domein als sleutel voor automatische koppeling. Een holding, een werkmaatschappij en een franchise-vestiging delen vaak één website. HubSpot houdt daar één bedrijf aan over, terwijl je er drie KVK-nummers voor hebt. Sleutel je eigen dedupe op kvk_number, niet op domein, en accepteer dat je in HubSpot soms twee records met hetzelfde domein wilt.

De workflow triggert zichzelf. Enrolt op “kvk_number is bekend” en schrijft daarna properties terug op hetzelfde record? Dan re-enrollt hij bij de volgende wijziging. Zet re-enrollment expliciet uit en filter op enriched_at is unknown.

Een bedrijf geeft 404. Uitgeschreven inschrijvingen verdwijnen uit het register. Behandel NOT_FOUND niet als fout maar als informatie: zet company_active op false en enriched_at op nu, anders probeert je workflow het elke run opnieuw.

De eerste backfill eet je maandquota op. Vijfduizend bedrijven verrijken is vijfduizend lookups. Filter eerst op de records waar het daadwerkelijk iets oplevert, en spreid de rest. HubSpot rekent zijn eigen limiet per tien seconden af, dus een batch van honderd records per call houdt beide kanten kalm.

Voor de bredere aanpak van CRM-verrijking staat er een uitgebreider stuk in CRM company data enrichment.

Veelgestelde vragen

Hebben jullie een HubSpot-app in de marketplace?
Nee. Wij leveren een REST API. De koppeling maak je met een private app of een workflow-webhook naar je eigen endpoint. Dat is een klein stuk middleware dat onze lookup doet en het resultaat via de CRM API terugschrijft.
Welk HubSpot-abonnement heb ik nodig?
De webhook-actie in workflows zit vanaf Professional, de coded action vraagt Operations Hub Professional. Heb je Starter, dan luister je met een private app op CRM-webhooks of je draait een periodieke sync die zelf de lijst met te verrijken bedrijven ophaalt.
Op welk veld sleutel ik?
Op het KVK-nummer, in een eigen property. Niet op bedrijfsnaam, want handelsnaam en statutaire naam verschillen bijna altijd en fuzzy matching levert het verkeerde bedrijf op. Zonder KVK-nummer heb je eerst een zoekstap nodig via het search-endpoint.
Overschrijft de verrijking wat sales heeft ingetypt?
Alleen als je dat zo bouwt. Schrijf registerdata naar eigen properties zoals statutory_name en laat de vrije velden met rust. Zo blijft zichtbaar wat uit het register komt en wat iemand zelf heeft ingevuld.

Bijgewerkt:

Eén call geeft je het hele bedrijf

KVK-data, het afgeleide BTW-nummer en een live VIES-controle in één request. Het gratis plan geeft je 50 lookups per maand, zonder creditcard.

50
gratis lookups per maand
1
request in plaats van drie
0
creditcards, contracten of salesgesprekken