The Schema Markup That Actually Gets a Service Business Cited
Structured data is how you stop making machines guess. A human reads "Call us for a free roof inspection" and understands service, price, and call to action. A crawler sees a sentence. Schema.org JSON-LD tells it, in a format it was built to read: this is a business, this is a service it offers, this is what it costs, this is the person who wrote this page.
Almost every site we audit falls into one of two buckets. Either there is no structured data at all, or a WordPress SEO plugin has stamped a generic WebPage and Organization block on every URL that says nothing a crawler couldn't already guess. Neither one earns a citation.
The Four Blocks a Service Business Needs
First, one ProfessionalService or LocalBusiness node (pick the subtype that matches what you are, not the one that sounds impressive) with a stable @id, your exact legal and trading names, address, phone, hours, service area, founder, and a sameAs array pointing at your Google Business Profile, LinkedIn, and every directory where you're listed. This is your entity. Every other block should reference it by @id rather than restating it.
Second, a Service node per service page, with provider pointing back at that @id, a plain-language description, and offers where you're willing to publish pricing. Engines answer "how much does X cost" constantly. If you're the only business in your area with a machine-readable price, you're the one that gets quoted.
Third, FAQPage on any page where you genuinely answer questions. Question text as the prospect would ask it, answer text that stands alone without the rest of the page.
Fourth, BlogPosting on articles with an author of type Person, not Organization. Engines weight content with a named, consistent human author, and "Admin" is not a human.
The Four Mistakes That Make It Worthless
The schema disagrees with the page. If the JSON-LD says $1,500 and the visible page says $1,200, you've just taught the engine that your data can't be trusted. Generate schema from the same source as the visible content. On our own site the pricing cards and the JSON-LD offers are rendered from one PHP array, so they cannot drift.
Prices as numbers instead of strings. Schema.org expects "price": "1500", not "price": 1500. Validators pass it, some parsers silently drop it.
Restating the organization on every page with no @id. Ten slightly different copies of your business node is ten chances to introduce an inconsistency. One node, one identifier, referenced everywhere.
Marking up things that aren't there. A Review block with no visible reviews, an FAQPage on a page with no questions, an AggregateRating you made up. This is the fastest way to lose rich results in Google and it does nothing for you in AI engines either.
How to Check Yours
View source on your homepage and search for application/ld+json. Paste what you find into Google's Rich Results Test and the Schema.org validator. Then ask the harder question: does it say anything a crawler couldn't have figured out from the visible page? If not, it's decoration. The whole point is to be the site that leaves nothing to interpretation.