Here's how you would do this:
Have a wrapper for
https://schema.org/ProfessionalService for the Tour Guide Company.
ProfessionalService is a child of
LocalBusiness, you can inherit all of the relevant business properties details or simply use
mainEntityOfPage to reference the Tour Company page on your website.
Then, use the
makesOffer item property - the expected type for this is an
Offer found at
Each offer would contain your pricing, location, ratings and reviews. Here is the list:
- Pricing: The
price item property of itemtype
Offer. The expected type is either plain
- Location: The
availableAtOrFrom item property of itemtype
Offer. The expected itemtype is
Place, meaning you can use any of it's children such as
LocalBusiness or even grandchildren like
- Reviews and Ratings: The
review item property of itemtype
Review. Straight forward, the
reviewRating item property of
Review will be used for reviews.
reviewRating is of
Rating itemtype, use the child
aggregatedRating for a collation of reviews.
- Dates and Flexibility:
availabilityEnds cover you for this one. These both return the
DateTime - this is where the flixibility of time comes in.
DateTime contains a whole lot of properties, including
availabilityEnds - which can be either a
Demand or an
Some other notes:
https://schema.org/AggregateOffer is a child of
Offer and can be used to replace the expected itemtype of
Offer for the
makesOffer item property of
ProfessionalService. This can be useful if you have different versions of tours (such as a premium package) or if you have a list view page containing all tours from a single company.
You can also inverse this, by having a
AggregatedOffer for just the location, and list all of the
ProfessionalServices and their
Offers if multiple Tour Companies work at the same location and the same date etc.
As a general tip, pay attention to the
expected type column on
schema.org to figure out how best to tackle a problem.
LocalBusiness + children being used with
Offer is a very common data design pattern and would probably be one of most use in practical rich snippet design.
You can also use
additionalType to marry two or more Schema Item Types.
* Notice an inception theme? Good. This can be used to create a
recursive schema, meaning that you can have an offer within an offer. Pay attention to expected types to see if you can jump back up the hierarchy and find an appropriate child item type if you are ever in a jam.
** Notice that this can also create a recursive schema, so you can have and offer within an offer.