Rank Your Business in AI Call for a Free SEO Consultation: (929) 592-4984

Local SEO

The Schema Gap in Tampa Bay: Not One Agency Ranking Here Uses FAQ or Review Markup

An audit of the structured data on the five sites currently ranking for Tampa and St. Pete SEO terms, what each one is missing or has broken, and how a local business claims the markup they left on the table.

8 min read

Developer reviewing JSON-LD structured data in a browser inspector on a laptop in a St. Petersburg office

What we found auditing the five sites that rank for Tampa and St. Pete SEO terms

Structured data is the rare technical lever where you can inspect your competitors’ work directly. It sits in the page source. There is nothing to infer and nothing to buy a tool for.

So we looked. We took the queries a Tampa Bay business actually types when it goes looking for help — variations on SEO company Tampa, SEO St. Petersburg, digital marketing agency Tampa Bay — pulled the top five organic results, and read the structured data on each site’s home page and its strongest-ranking service page.

The pattern was consistent enough to write down:

  • All five shipped some form of Organization or WebSite markup, generally whatever their CMS emits by default.
  • Four described themselves as a LocalBusiness or one of its subtypes. Three of those left out fields that are required or strongly recommended for the type they had chosen.
  • None of the five shipped FAQPage markup, despite four of them having pages built entirely as question-and-answer blocks.
  • None of the five shipped Review or AggregateRating markup, despite every one of them displaying client testimonials.
  • Two carried an error serious enough that the node failed validation outright, which means the markup was doing nothing whatsoever.

Run the same check yourself before you take our word for it — markup changes, and the point of this article is the method, not the scoreboard. View source on any competitor, search for application/ld+json, and paste what you find into a validator. It takes about ninety seconds per site.

What matters is that the gap is real and it is unusually wide for something this cheap to close.

LocalBusiness schema: the fields most Tampa Bay businesses leave empty

The default LocalBusiness block generated by a theme or plugin is usually a name, a URL and a logo. That is an identity card, not a description of a business.

The fields that carry actual information, and that were routinely missing:

  • address as a structured PostalAddress, not a single string. Street, locality, region, postal code and country as separate properties. A concatenated address is a piece of text; a PostalAddress is data.
  • geo with latitude and longitude. Cheap to add, and it disambiguates you from every similarly named business in the metro.
  • areaServed naming the cities and counties you actually cover. Almost nobody fills this in, and for a service-area business it is the single most useful property on the node.
  • openingHoursSpecification in the structured form, rather than a line of prose in your footer.
  • sameAs pointing to your Google Business Profile, your verified social accounts and any authoritative directory listing. This is how you tell a machine that the entity on your site is the same entity in those other places.
  • hasOfferCatalog or makesOffer listing your services. Without it, a parser knows you exist but not what you sell.
  • @id — a stable, absolute URL identifier for your business entity, reused everywhere you reference it.

One rule underneath all of it: only mark up what a human can see on the page. Schema describes visible content. Inventing it is a policy violation, and it is the reason a lot of technically valid markup gets ignored.

Why FAQPage markup is still unclaimed in this market

There is an honest reason nobody in this market ships FAQ markup, and it is not laziness. Google narrowed FAQ rich results to a small set of authoritative government and health sites. If you add FAQPage markup to a St. Petersburg law firm’s page hoping for expandable questions under your listing, you will wait forever.

That is the caveat, and it should be stated plainly before anybody spends a morning on this.

The reason to ship it anyway is different. FAQPage markup takes a block of prose and declares, unambiguously, that this string is a question and this specific string is its answer. It turns a wall of copy into labelled, self-contained passages. Systems that quote your page — whether that is an AI answer, an aggregator or an internal search index — work in passages, and a passage that arrives pre-labelled with the question it answers is easier to lift correctly than one that has to be inferred from surrounding text.

It also imposes useful discipline on the writing. An answer that has to stand alone inside a JSON string cannot begin with “as mentioned above” or trail off into a second paragraph of context. That constraint tends to improve the visible page as much as the markup.

So: implement it for structure, not for ornament. If you would remove it when the accordions fail to appear, do not add it in the first place.

Review and AggregateRating: the markup nobody here ships despite having the testimonials

Every site in the audit displayed testimonials. Not one described them in structured data.

Here the caveat is even sharper. Reviews you collect about your own business and publish on your own site are self-serving reviews under Google’s policy, and they are not eligible for review rich results. Marking up your testimonials page will not put stars in the search results, and a good deal of the advice you will find online is quietly wrong about this.

What AggregateRating still does is state your rating and review count in a form no parser has to guess at, and keep that claim consistent with what your Google Business Profile and third-party platforms say. Consistency across sources is the whole game in entity understanding, and a testimonials page that says one thing while your profile says another is a small, unnecessary contradiction.

The hard rules, which matter more than the implementation:

  • The rating and count must match what is genuinely visible on the page.
  • Never aggregate reviews you cannot display.
  • Never mark up a rating you invented, rounded up, or pulled from a platform you no longer use.

Fabricated ratings are a spam violation with real consequences and no upside. If your testimonials are thin, the fix is collecting more of them, which is a conversation about operations rather than code — we covered the mechanics of that in how local SEO actually drives phone calls.

Three real schema bugs we found, and how to check for them on your own site

These are the specific failures from the audit, all of which are checkable in a couple of minutes.

1. JSON-LD injected by JavaScript that never rendered. The markup existed in a script bundle and appeared correctly in the browser inspector, so it looked fine to whoever built it. It did not appear in the rendered HTML the crawler received. Check: use Search Console’s URL Inspection tool, open the rendered HTML, and search for ld+json. If it is absent there, the markup does not exist as far as search is concerned.

2. Two conflicting LocalBusiness nodes on the same page. One from the theme, one from an SEO plugin, with different names and different addresses. A parser given two contradictory descriptions of the same entity has no way to resolve them. Check: view source and count how many application/ld+json blocks the page contains. More than one is fine — more than one describing the same business is not.

3. Relative image URLs inside the markup. /images/logo.png rather than the full absolute URL. Structured data requires absolute URLs, so the property resolves to nothing and the image silently fails to associate. Check: every URL inside your JSON-LD should start with https://. No exceptions.

None of these three produce a visible symptom on the page. That is precisely why they survive for years on sites that are otherwise well maintained, and why a technical SEO pass finds them so reliably.

Multi-location and service-area markup for Pinellas and Hillsborough businesses

If you operate from more than one address, the mistake is stacking every location into the home page markup. The correct structure is one LocalBusiness node per location, on that location’s own page, each with its own @id matching that page’s URL and its own address, phone number, hours and geo coordinates. The pages are what get indexed and what get returned; the markup should live where the content does.

Service-area businesses without a public storefront have a different problem. LocalBusiness expects an address, but a mobile business does not want a home address in search results. The workable approach is to keep a real postal address in the markup where you have one, and lean on areaServed to describe coverage — either as a list of named places, or as a GeoCircle with a centre point and radius in metres.

For a Pinellas or Hillsborough business this is where you can be genuinely specific: name the municipalities you cover rather than writing “Tampa Bay area”. Clearwater, Largo, Seminole and Pinellas Park are distinct places to a parser, and to the people searching from them. The same specificity that makes a St. Petersburg service page worth reading makes the markup underneath it worth parsing.

What schema does and does not do for AI-generated answers

Be careful here, because the claims made about structured data and AI search have outrun the evidence considerably.

What is not established: that adding schema causes an AI system to cite you, or that any of the major answer engines weight structured data as a ranking input. Large language models read rendered text. They do not require JSON-LD to understand a page, and plenty of heavily cited pages carry no markup at all.

What is reasonable: structured data resolves ambiguity cheaply. When a system needs to know which of three similarly named firms in the metro your page describes, where you operate, and what you sell, an explicit @id, a structured address and a populated areaServed answer those questions without inference. Passage-labelled content is easier to quote accurately than undifferentiated prose. And consistency between your markup, your visible page and your third-party profiles is a signal that survives whatever changes at the retrieval layer.

That is a modest, defensible case. It is also enough justification for a day of work — which is roughly what this costs — without needing the inflated version.

A validation routine you can run in fifteen minutes

  1. Pick three URLs: your home page, your strongest service page, and one location page.
  2. Run each through the Rich Results Test. This tells you which Google features the page is eligible for. Note errors first, warnings second.
  3. Run the same three through validator.schema.org. This checks against the full vocabulary and will surface valid properties Google ignores but other consumers use.
  4. Check the rendered HTML for one of them via URL Inspection, confirming your JSON-LD survives rendering.
  5. Open Search Console’s structured data reports for the site-wide picture, including the unparsable structured data report, which is where silent syntax failures collect.
  6. Compare your markup against your Google Business Profile field by field — name, address, phone, hours, categories. Any mismatch is a contradiction you are volunteering.

Most sites finish that list with a short, unglamorous fix list: a missing areaServed, a relative image URL, a duplicate node. None of it is difficult. All of it is sitting unclaimed in a market where the sites currently ranking have not done it either.

If you would rather have someone else run it, our local SEO and technical audits start with exactly this pass, and we will send back the findings whether or not you go further with us. Get in touch and tell us your domain.

Frequently Asked Questions

Does local business schema markup improve rankings?

Not directly, and anyone promising otherwise is overselling it. Structured data is not a ranking factor in the way a link or a page of genuinely useful content is — it is a description of what is already on the page, written in a format machines parse without ambiguity. What it changes is eligibility and interpretation: certain result formats only appear for pages carrying the right markup, and correct LocalBusiness data removes the guesswork about which entity your site belongs to, where you operate and what you sell. The practical effect for most local businesses is not a jump in position but a clearer, better-formed listing and fewer cases of a search engine associating the wrong address or service area with your brand. Treat it as removing friction rather than adding force.

Will FAQPage markup still show rich results in Google?

For almost every business, no — and that is worth knowing before you spend a day implementing it. Google narrowed FAQ rich results to a small set of authoritative government and health sites, so a Tampa Bay contractor, law firm or agency adding FAQPage markup should not expect question accordions to appear under their listing. The markup is still valid, still parsed, and still worth shipping for a different reason: it labels each question and its answer as a discrete, self-contained passage, which is the unit that AI answer systems and other consumers of your page actually quote. The mistake is implementing it for the rich result and then removing it when the stars and accordions do not arrive. Ship it for the structure, not the ornament.

Can I add AggregateRating schema for my own client reviews?

You can add it, but you will not get star ratings in Google search from it, because reviews you collect and display about your own business on your own site fall under Google's self-serving review policy and are not eligible for review rich results. That restriction catches out a lot of local businesses who mark up their testimonials page, see nothing, and assume the code is broken. There are still two legitimate reasons to include it: it states your rating and review count unambiguously for any machine reading the page, and it keeps your on-site claims consistent with your Google Business Profile and other platforms. What you must not do is invent an aggregate, count reviews you cannot show, or mark up ratings that appear nowhere visible on the page — that is a spam violation with real consequences and no upside.

How do I check whether my site's schema is actually working?

Use two tools, because they answer different questions. Google's Rich Results Test tells you which Google features your page qualifies for and is the one to trust for eligibility, while the Schema Markup Validator at validator.schema.org checks your markup against the full vocabulary and will flag valid properties that Google simply ignores. Run both against your home page, one service page and one location page, then open Search Console's structured data reports to see what Google recorded across the whole site rather than the single URL you tested. The step most people skip is checking the rendered page rather than the source: if your markup is injected by JavaScript, use the URL Inspection tool's rendered HTML to confirm it survives, because JSON-LD that only exists after a script runs is the most common reason a technically correct implementation registers as nothing at all.

Keep reading

Related articles

The services behind this article

Modern office corridor with black-framed glass meeting rooms and pendant lights

Want this applied to your own numbers?

Send us your site and what is frustrating you. We will run the diagnosis described here against your actual data and send back what we find, whether or not you work with us.

We reply within one business day. No automated sales sequence, and we will tell you if we are not the right fit.