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.

The Enos Restaurant website

Restaurant

Enos Restaurant

Restaurant bookings usually arrive through a marketplace that charges per cover and owns the diner relationship. The restaurant…

Location
Weybridge
Year
2025
Read the case study
The Villas Cafe website

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…

Location
Finsbury Park, London
Year
2025
Read the case study

Questions 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.

Email usGet a fixed quote

Privacy choices

This site measures which pages get read and which links get used, so we know what to write more of. It is anonymous: no advertising, no profiling, no data sold or shared, and nothing follows you to other sites.