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.
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.
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.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.
The KVK number
There is no standard field for it. The right place is anidentifier with its own propertyID, and that is exactly what almost no plugin does.The VAT identification number
Schema.org does have a property for it,vatID, and in practice it stays empty.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.
Everything the node can hold
The fields the plugin knows, and what happens with an empty field.
- Business name, plus the registered legal name when it differs
- Legal form, published as
additionalProperty - KVK number as
identifierwithpropertyIDKVK - VAT identification number in
vatID - Street, postcode, town and country
- Phone number and email address
- Coordinates, only when you fill in both
- Price range
- Opening hours, up to three blocks a day for a lunch break
- Exceptional days, with Dutch public holidays addable in one click
- Service area, per town or per postcode area
- Payment methods, including iDEAL, Bancontact, debit card and on account
- One of 39 schema.org business types, each a genuine subtype of LocalBusiness
What you leave empty does not go in
That sounds obvious, and it is not: many plugins publish an empty string, and an empty property is an error to a validator.
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.
Three sources
Your published items, the text of your widgets, and your menus.
Everything a visitor can read and everything you typed yourself.
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.
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.
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.
manage_options, so an administrator account.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.
In your WordPress: Plugins, Add New Plugin, Upload Plugin. Choose the file and click Install Now.
Click Activate Plugin. A new item appears in your admin menu. Your site does not change yet at this point.
Open the settings screen and go through the toggles. Everything that touches your public site stays off until you turn it on yourself.
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.
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.
- 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
- 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
theseo_lokaal_schema_conflict and adjust the finished node with theseo_lokaal_schema_node.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.
No outgoing request at all
Search the unpacked zip forwp_remote_, curl_init and file_get_contents. Zero matches. No register is queried, there is no key and there is no service behind it.No visitor data
No cookie, no browser storage, no IP address, no counter. The plugin looks at your own content.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.Uninstalling cleans up
The option and the transient are removed. Deactivating leaves them in place.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.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.
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.