EN
Language · same page NLNederlands/tools-en-plugins/lokaal-schema/ ENEnglish (UK)/en/tools-and-plugins/local-business-schema/ ESEspañolnot translated yet We do not remember your choice and never redirect you automatically.
SRV · plugin · localbusiness schema reg. T.000 · wordpress · gplv2 or later

LocalBusiness schema with KVK and VAT number

Structured data for a local business is nothing new. Structured data that knows a Dutch business has a KVK number, a VAT identification number and customers who pay with iDEAL, is. This plugin publishes a complete and valid LocalBusiness node from what you fill in, and then reads your own site back to find the places where your phone number, your postcode or the spelling of your name does not match it.

Download the plugin ↓ Book a call theseo-lokaal-schema-1.0.0.zip · 47 KB · version 1.0.0 · GPLv2 or later · no account, no registration, no key
Gianluca, who builds the tools and plugins on this site
image · whoever built the tool also explains it
FIG.01: What comes out of your input fieldssheet 1/3

The node exactly as it ends up in your source code

This is not a summary of the node but the shape it actually takes. Note the three lines you do not get with an ordinary LocalBusiness plugin: the KVK number as an identifier with its own propertyID, the VAT number in the schema.org property vatID, and iDEAL among the payment methods. Empty fields are left out, because structured data with an empty property in it is worse than structured data without it.

JSON-LD in the head of your homepageexample · shortened
{ "@type": "Bakery", "name": "Bakkerij De Korenaar", "legalName": "De Korenaar Oisterwijk B.V.", "identifier": { "@type": "PropertyValue", "propertyID": "KVK", "value": "77834453" }, "vatID": "NL003245282B11", "address": { "@type": "PostalAddress", "streetAddress": "Dorpsstraat 12", "postalCode": "5061 HL", "addressLocality": "Oisterwijk", "addressCountry": "NL" }, "telephone": "+31135280000", "openingHoursSpecification": [ ... per day, up to three blocks ], "paymentAccepted": [ "iDEAL", "Bancontact", "Pin", "Op rekening" ], "areaServed": [ ... per town or per postcode area ] }
The legal form is published as additionalProperty, because schema.org has no dedicated field for it. Coordinates are only included if you fill in both, because half a coordinate is not a place. The full output is shown word for word on the settings screen, so you can read it before it is on your site.
DOC.01

Why a generic LocalBusiness plugin falls short for a Dutch business

These days almost every SEO plugin can do something with LocalBusiness. What they all have in common is that they are designed around an American business: name, address, phone, opening hours, done. A Dutch business carries three things that do not fit in there, and they are exactly the things a customer or a search engine looks at.

POINT 01

The KVK number

There is no standard field for it. The right place is an identifier with its own propertyID, and that is exactly what almost no plugin does.
POINT 02

The VAT identification number

Schema.org does have a property for it, vatID, and in practice it stays empty.
POINT 03

The payment methods

iDEAL does not appear on any American list, and it is exactly how your customers pay.

Then there is the second half, which is even more tedious. Structured data that is perfectly correct while your contact page still shows an old number is structured data that contradicts your own site. Nobody hunts for that difference by hand.

DOC.02
FIG.02: The consistency checksheet 2/3

Three patterns, three sources, and a list with the location added

This is the boring half of local SEO, and the half nobody does. On most sites an old mobile number is still lurking somewhere, and nobody knows where. The check reads your own site back and compares three things with what you filled in. It never changes anything in your content; it points things out.

checkreads back · changes nothing
where it looks

Three sources

Your published items, the text of your widgets, and your menus.

Everything a visitor can read and everything you typed yourself.

what it looks for

Three patterns

Every phone number that starts with 0, +31 or 0031 and has nine to eleven digits.

Every postcode written as four digits and two capital letters.

Every spelling of your business name that does not match letter for letter what you filled in.

what comes out

A list with the location

One line per difference with a link to where it sits, so you get there in two clicks.

The result is parked in a transient for an hour, because it is a snapshot and not an archive.

A long order number can end up in the list as a false alarm. That is the limit of reading text, and the screen says so itself, instead of pretending every match is an error.
DOC.04

How to install it, in four steps

No account is needed, no key and no registration. An ordinary WordPress site where you are an administrator is enough.

WordPress6.0 or higher. The plugin states tested up to and including 6.8.
PHP7.4 or higher. The code has been checked on 8.5.
RightsYou need manage_options, so an administrator account.
Screen languageDutch on a Dutch site, English otherwise.
Also available on Full source code on GitHub The zip above and the source code on GitHub are the same version. This plugin is not yet in the official WordPress plugin directory. It has been prepared for submission; until that is finalised, the download above is the only place to get it. Checked on 19 August 2026.
STEP 1 · GET IT

Click the download button above. You get theseo-lokaal-schema-1.0.0.zip, 47 KB. Do not unpack it: WordPress wants the zip itself.

STEP 2 · UPLOAD

In your WordPress: Plugins, Add New Plugin, Upload Plugin. Choose the file and click Install Now.

STEP 3 · ACTIVATE

Click Activate Plugin. A new item appears in your admin menu. Your site does not change yet at this point.

STEP 4 · SET UP

Open the settings screen and go through the toggles. Everything that touches your public site stays off until you turn it on yourself.

DOC.03

Where the node ends up

Three choices, and the first is the default.

Only on the homepage

The default, and the right one for most sites. A search engine expects the business node on the homepage, not scattered twenty times across the site.

On every page

Possible, and sometimes useful on a site where the homepage is not the main entry point.

On the pages you choose yourself

For a site with several branches, or with a separate contact page that serves as the business page.

Whatever you choose, the full output is shown word for word on the settings screen. You read what will be published before it is published, and you can paste it into Google's Rich Results Test without touching your site.

FIG.03: What the plugin deliberately does not dosheet 3/3

Four things it does, and four it refuses to do

With structured data, the biggest damage is not a missing field but two plugins publishing the same thing at once. Google then gets two LocalBusiness nodes that contradict each other and picks one itself. That is why this plugin first checks whether someone else is already speaking.

limitswhat it does · what it does not
it does
  • Publish a complete and valid LocalBusiness node, on the homepage only by default
  • Stay silent as soon as Yoast Local SEO is active, or Rank Math with a local business type set, and say on screen which of the two it found
  • Check the format of the KVK number: eight digits
  • Check the format of the VAT number: NL, nine digits, the letter B, two digits
it does not
  • Check your KVK number against the trade register
  • Verify the VAT number with a check digit
  • Change your content if the consistency check finds something
  • Send any request outward
The VAT identification number of a Dutch sole trader has been randomly drawn since 2020. There is no check digit left to verify, so only the format is checked, and the plugin claims no more than that. Developers can override the conflict check with the filter theseo_lokaal_schema_conflict and adjust the finished node with theseo_lokaal_schema_node.
DOC.05

Privacy: what is recorded and what is not

This plugin is about your business details, not about your visitors. That keeps the paragraph short, but it can still be checked.

POINT 01

No outgoing request at all

Search the unpacked zip for wp_remote_, curl_init and file_get_contents. Zero matches. No register is queried, there is no key and there is no service behind it.
POINT 02

No visitor data

No cookie, no browser storage, no IP address, no counter. The plugin looks at your own content.
POINT 03

Everything sits in one option row

What you fill in sits in your own database, in a single option row. The result of the consistency check is parked in a transient for an hour because it is a snapshot.
POINT 04

Uninstalling cleans up

The option and the transient are removed. Deactivating leaves them in place.
POINT 05

Mind what you publish

This is the one point where you make the choice yourself: a KVK number and a VAT identification number are public business details, but for a sole trader working from home, the visiting address is your home address. That is not an objection from the plugin but a judgement call for you, and it is stated here because otherwise it only becomes obvious once it is already sitting in the source code.
DOC.06

Frequently asked questions

Does it check my KVK number against the trade register? No. It checks the format, eight digits, and nothing else. Checking against the register means calling an external service, and this plugin does not do that.

Why is the VAT number not verified?

Because the VAT identification number of a Dutch sole trader has been randomly drawn since 2020. There is no check digit left to verify. The format is still checked.

I use Yoast or Rank Math.

Will I get two blocks? No. The plugin checks for Yoast Local SEO and for Rank Math with a local business type set, and stays silent as soon as it finds one of the two. The admin screen says which. That check is on by default and you can switch it off.

Can I adjust the node from my theme?

Yes, with the filter theseo_lokaal_schema_node on the finished node. You override the conflict check with theseo_lokaal_schema_conflict.

Does the consistency check work on a large site?

It reads your published items, your widgets and your menus. On a site with thousands of posts that takes noticeably longer, which is why the result is kept for an hour instead of being recalculated on every screen view.

Multiple branches?

This version publishes one business node. For multiple branches, you choose the pages where it appears and fill in the details per site or per subsite.

DOC.07 · Next step

What it gives you in the first week

The fastest route is to fill it in, read the output on screen, and then run the consistency check. On almost every site that has existed for a few years, that last step turns up at least one old phone number. If you want to know how your business is doing in Google itself, the local visibility checker is the place, and the local SEO checklist explains the rest of the work. If you want to talk it through, book a call.

Section · Next stepreachable 24/7 · sales@theseo.nl
Book a call ↗
Written by GianlucaFounder of TheSEO. Has been building findability for Dutch businesses since 2017, in Google and in AI answers. More about the institute.