Making a booking path machine-readable
A booking or ordering form is just an HTML form: nothing about it tells a search engine that the page offers something you can act on. Describing it as a ReserveAction or OrderAction with a typed EntryPoint is what turns a form into a declared capability, which is the vocabulary assistants use when deciding whether a business can actually take a booking.
A form says nothing about itself
You can have a perfectly good reservation form on a page and every machine reading that page will
see a <form> element. There is nothing in HTML that says “this restaurant takes bookings” in a
way anything can act on.
Schema.org has vocabulary for exactly this, and almost nobody uses it. potentialAction attaches
an action to an entity and says what the entity can do.
ReserveAction
{
"@context": "https://schema.org",
"@type": "Restaurant",
"@id": "https://example.com/#restaurant",
"name": "Example Kitchen",
"potentialAction": {
"@type": "ReserveAction",
"target": {
"@type": "EntryPoint",
"urlTemplate": "https://example.com/book/",
"inLanguage": "en-US",
"actionPlatform": [
"https://schema.org/DesktopWebPlatform",
"https://schema.org/MobileWebPlatform"
]
},
"result": {
"@type": "FoodEstablishmentReservation",
"name": "Table reservation"
}
}
}
The three parts each do a job. target says where the action happens. actionPlatform says
where it works. result says what you get if you complete it - and FoodEstablishmentReservation
is a far more specific statement than “a form was submitted”.
For hotels the result type is LodgingReservation; the structure is otherwise identical.
OrderAction
Ordering uses the same pattern with a different action and a deliveryMethod:
{
"@type": "OrderAction",
"target": {
"@type": "EntryPoint",
"urlTemplate": "https://example.com/order/",
"actionPlatform": "https://schema.org/MobileWebPlatform"
},
"deliveryMethod": "https://schema.org/OnSitePickup"
}
Use OnSitePickup for collection and ParcelService or OwnFleet for delivery, and declare both
as separate actions if you offer both. Declaring delivery you do not do is the fastest way to
collect bad reviews from people who waited.
Be honest about what this buys you
It will not place a reserve button in a Google result. Those features run largely through partner programmes, and correct markup does not enrol you in one. Anybody telling you otherwise is selling.
What it does is make the capability legible to everything reading the page, which now includes assistants answering “can I book a table at X” directly. That audience is growing considerably faster than the one clicking reserve buttons in search results, and the markup costs an hour.
Keep it attached to the right entity
The action belongs on the business, not on the page. A common error is declaring the
ReserveAction inside a WebPage node, which says the page can be reserved. Attach it to the
Restaurant or LodgingBusiness by @id so the statement is about the business.
Enos Restaurant runs this in production, with the reservation handled by its own API rather than a marketplace taking a cut of each cover.
Running in production
Every technique on this page is live on a client site, not a demonstration written for the article.

Restaurant
Enos Restaurant
Restaurant bookings usually arrive through a marketplace that charges per cover and owns the diner relationship. The restaurant…
Read the case study
Cafe
Villas Cafe
Most cafe sites publish the menu as a picture or a PDF, which means no search engine can read a single dish or a single price…
Read the case studyQuestions we get asked
Will this put a Reserve button in Google?
Not on its own. Google’s booking features largely run through partner integrations rather than open markup, and no amount of correct JSON-LD enrols you in one. What the markup does is make the capability legible to everything else that reads the page - assistants included - and that audience is growing faster than the one looking at reserve buttons.
What is an EntryPoint and do I need one?
An EntryPoint describes how the action is actually performed: the URL template, the HTTP method, and the platforms it works on. Without it you have said a booking exists but not where it happens, which is only half the statement. It is a few lines and it is the part that makes the action usable rather than decorative.
Does this work for a third-party booking widget?
Yes, and you should point the urlTemplate at wherever the booking genuinely happens, including a third-party page. Describing a booking path you do not control is still accurate. What you must not do is describe a booking capability you do not have.
Tell us what you need built.
A short call, a straight answer on scope and cost, and a fixed quote. No retainer, no monthly fee, no commission on your orders.