B2B E-commerce in the Netherlands: Business Validation at Registration
KVKBase Team

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.

b2becommercevalidation

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:

  1. Verify that your customer has a valid VAT number
  2. Validate the VAT number via VIES
  3. 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.