B2B E-commerce in the Netherlands: Business Validation at Registration
Why every Dutch B2B web shop needs KVK validation. Fraud prevention, invoicing accuracy, and improving customer registration.
B2B E-commerce in the Netherlands: Business Validation at Registration
In B2C e-commerce, a name and email address are often enough to let a customer place an order. In B2B, the requirements are fundamentally different. You sell on account, apply different VAT rules, and must send correct invoices to legally registered entities.
Without business validation at registration, you are building on sand. In this article we explain why KVK validation is essential for any Dutch B2B web shop and how to implement it.
Why business validation is crucial
1. Fraud prevention
B2B fraud in e-commerce is on the rise. A common pattern: someone registers as a company, orders on account, and disappears. Without validation, you have no idea whether the provided company actually exists.
By verifying the KVK number at registration, you check:
- Whether the company is actually registered with the KVK
- Whether the company is still active (not deregistered)
- Whether the provided company name matches the register
- Whether the address is correct
This eliminates the majority of fake registrations. A fraudster who enters a random KVK number is immediately caught when the name does not match.
2. Correct invoicing
An invoice to a business customer must contain certain details by law:
- The full legal name of the company
- The address
- The KVK number
- The VAT number (for VAT-liable transactions)
If any of these details are incorrect, the customer can reject the invoice. That leads to delays, manual corrections, and in the worst case, payment problems.
By fetching data from the trade register at registration, you ensure your invoices are correct from the first order.
3. VAT compliance
For B2B transactions within the Netherlands, you charge 21% VAT by default. But for intra-community supplies (ICS) — sales to companies in other EU countries — the reverse charge mechanism applies. For this you must:
- Verify that your customer has a valid VAT number
- Validate the VAT number via VIES
- Include the verified number on the invoice
Without valid verification, you remain liable for VAT on the transaction.
4. Improving customer experience
Validation may sound restrictive, but it actually improves the customer experience. Instead of manually filling in a form with ten fields, the customer enters a KVK number and the remaining fields are auto-filled.
The result: less typing, no errors, and a professional impression.
Implementation: step by step
Step 1: KVK number as a required field
Add the KVK number as a required field in your registration form. Validate the format client-side:
function validateKvkInput(input) {
const cleaned = input.replace(/\D/g, '');
if (cleaned.length !== 8) {
return { valid: false, message: 'A KVK number consists of 8 digits' };
}
return { valid: true, value: cleaned };
}
Step 2: Real-time lookup
As soon as the user enters a valid 8-digit number, perform a lookup via the API:
async function onKvkInput(kvkNumber) {
const validation = validateKvkInput(kvkNumber);
if (!validation.valid) {
showError(validation.message);
return;
}
showLoading('Fetching company details...');
try {
const response = await fetch(`/api/kvk/${validation.value}`);
const company = await response.json();
if (!company.isActive) {
showError('This company is no longer active at the KVK');
return;
}
fillFormFields(company);
showSuccess(`${company.tradeName} found`);
} catch {
showError('Could not fetch company details');
}
}
Step 3: Show data for confirmation
Display the retrieved data to the customer. This serves two purposes: the customer can verify that the right company was found, and you transparently show which data you are using.
<div id="company-details" class="company-card">
<h3 id="company-name">Voorbeeld BV</h3>
<dl>
<dt>KVK number</dt>
<dd id="kvk-display">12345678</dd>
<dt>Address</dt>
<dd id="address-display">Voorbeeldstraat 1, 1234AB Amsterdam</dd>
<dt>Legal form</dt>
<dd id="legal-form-display">Besloten Vennootschap</dd>
<dt>Status</dt>
<dd id="status-display">Active</dd>
</dl>
</div>
Step 4: Server-side verification
Never rely on client-side validation alone. Verify the KVK number again server-side before creating the account:
// Server-side (Node.js)
app.post('/api/register', async (req, res) => {
const { kvkNumber, email, contactName } = req.body;
// Verify KVK number
const company = await kvkbase.lookup(kvkNumber);
if (!company) {
return res.status(400).json({ error: 'KVK number not found' });
}
if (!company.isActive) {
return res.status(400).json({ error: 'Company is not active' });
}
// Check for duplicates
const existing = await db.companies.findByKvk(kvkNumber);
if (existing) {
return res.status(409).json({ error: 'This company is already registered' });
}
// Create account with verified data
const account = await db.companies.create({
kvkNumber: company.kvkNumber,
tradeName: company.tradeName,
legalForm: company.legalForm,
address: company.address,
vatNumber: company.vatNumber,
contactEmail: email,
contactName: contactName,
verifiedAt: new Date()
});
res.status(201).json({ accountId: account.id });
});
Step 5: The KVKBase Widget
The fastest way to implement this is with the KVKBase widget. One script tag and you have a fully working lookup in your registration form:
<script src="https://widget.kvkbase.nl/kvk-lookup.js"
data-api-key="YOUR_KEY"></script>
<kvk-lookup
id="registration-kvk"
placeholder="Enter your KVK number"
></kvk-lookup>
<script>
document.getElementById('registration-kvk')
.addEventListener('kvkbase:found', (e) => {
const c = e.detail;
document.getElementById('reg-name').value = c.tradeName;
document.getElementById('reg-address').value =
`${c.address.street} ${c.address.houseNumber}`;
document.getElementById('reg-city').value = c.address.city;
document.getElementById('reg-vat').value = c.vatNumber || '';
});
</script>
What if a customer does not have a KVK number?
Not every customer is a Dutch company. Consider these scenarios:
- Foreign companies: ask for a VAT number and validate via VIES
- Consumers: if you also sell to individuals, offer a separate registration path
- Government institutions: these are also in the trade register and have a KVK number
Results in practice
B2B web shops that implement KVK validation typically report:
- Significant reduction in fraudulent registrations
- Fewer credit notes due to correct billing data
- Faster customer onboarding through auto-fill
- Less manual correction work for the back-office team
The investment in proper KVK validation pays for itself quickly in lower operational costs and more reliable customer data.
Conclusion
Business validation at registration is not a luxury for a B2B web shop — it is a necessity. It protects you against fraud, guarantees correct invoicing, and at the same time improves the customer experience.
With KVKBase you can add validation via the embeddable widget (minutes of work) or via the REST API (more flexibility). In both cases, you get validated data straight from the trade register, ready to store and use throughout your business process.