Structured Data for FFL Dealers: What Google Still Reads
Somewhere on your shop's site there is a block of JSON-LD. A developer pasted it in during 2019, or the theme shipped it, or an SEO plugin generated it on install. It is not hurting anything. It is also, in most cases, doing almost nothing: it announces a "LocalBusiness" in the vaguest possible terms, leaves out the fields that matter, and occasionally still carries the address you moved out of two years ago.
Structured data is not a ranking trick. It is the machine-readable version of the sign on your door — name, address, hours, phone — written in a format a search engine can read without guessing. Here is the version of it that is worth maintaining in 2026, and the parts you can stop paying anyone to do.
What it does, and what it does not
It will not lift you into the map pack on its own. Nothing in this article replaces the fundamentals: a complete Business Profile, reviews from real customers, and a page that answers the transfer question.
What it does is remove ambiguity. It tells Google, in a form that cannot be misread, the legal name of the business, the customer-facing address, the phone number, and the hours. When your site markup, your Business Profile, and the directory pages that list you all agree, a customer's phone returns one clean answer. When they disagree, the customer gets a stale address at 4:55 on a Saturday and calls the next shop on the list. That is the entire job.
There is no "GunStore" type — pick the closest real one
Every few months a dealer asks why schema.org/GunStore isn't validating. It isn't validating because it does not exist — that URL has always returned a 404. schema.org's retail hierarchy is generic: SportingGoodsStore, Store, LocalBusiness. Google's instruction is to use the most specific subtype that is genuinely accurate, so for most gun shops that is SportingGoodsStore, with Store or LocalBusiness as the fallback when a plugin will not cooperate.
Getting the type slightly generic is survivable. Omitting the required properties is not: Google's LocalBusiness documentation lists exactly two — name and address. A block missing either one cannot be used at all, which is the usual reason a shop's markup has been inert for six years.
The fields worth shipping
This is a complete, valid starting point for a single-location shop. Paste it into the page template for your storefront or contact page, replace the values with your own, and leave the keys alone.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SportingGoodsStore",
"name": "Example Gun Shop LLC",
"url": "https://www.examplegunshop.com/transfers",
"telephone": "+1-512-555-0147",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "1200 Example Rd, Suite B",
"addressLocality": "Austin",
"addressRegion": "TX",
"postalCode": "78704",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 30.2451,
"longitude": -97.7632
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "10:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "10:00",
"closes": "14:00"
}
]
}
</script>
Four rules govern the values, and they are all about honesty rather than technique:
The name is the name on the licence and the sign. Not "Austin's Cheapest FFL Transfers & Gun Shop". Keyword-stuffed names read like lead-generation pages, and they are one of the fastest ways to get a Business Profile suspended.
The address is the customer-facing one. A UPS box, a virtual office, or a home-based licence the public cannot visit is not a storefront address, and dressing it up as one is exactly what Google's representation guidelines are written to catch.
The hours are the hours you actually keep. If you are appointment-only, say so in the visible page copy and keep the markup to the hours your counter is staffed. A wrong-hours visit generates the most damaging review a dealer can get.
One node per physical location. A second store needs its own page and its own markup, not a list inside the first.
Three habits that earn nothing in 2026
FAQ markup. Google deprecated the FAQ rich result: it stopped appearing in Search on May 7, 2026, and the documentation was removed the following month. If a plugin is still injecting FAQPage structured data into every post, it is inert. Keep the visible questions and answers — they still help a customer and they still read well — but stop treating the markup as the reason to write them.
HowTo markup. Deprecated in September 2023 and gone from desktop as well. Same story: the visible instructions are worth writing, the markup is not worth maintaining.
Star ratings you host about yourself. Google's review snippet guidelines make pages ineligible for the star feature when the entity being reviewed controls the reviews about itself — which includes a widget pulling your Google reviews onto your own homepage. Your stars belong in the map pack, sourced from Google reviews. Reproducing them in markup does nothing except create a false expectation.
Do not mark your inventory as Product
Product and Offer markup exist to feed shopping surfaces, and Google's Shopping policies list weapons and ammunition among prohibited content. There is no compliant configuration that routes a firearm into that surface, and no amount of availability: InStock changes the policy. Marking up a wall of inventory earns no rich result; it simply turns your site into a price list at the moment a customer is trying to work out whether you will accept a transfer from an online retailer.
What the customer's lookup actually looks like
Worth keeping in view while you edit the template. A first-time buyer types ffl dealer near me or ffl transfer near me, gets three map results, taps one, and looks for hours. A buyer who already purchased a gun online behaves differently: they search a place, not a shop — FFL dealers in Texas, FFL dealers in Florida, FFL dealers in Ohio — and scan a list of licensees with addresses and phone numbers.
On that list, three data points decide whether they call you: whether you accept transfers at all, what you charge, and when they can come in. The licence check happens after that, and it is the step where a buyer verifies the name and number against the ATF's own lookup, because a name that does not match the licence reads as a scam. If your site says one thing, your listing says another, and your markup says a third, the careful customer — the one who reads — moves on. Consistency across the three surfaces is worth more than any keyword work you can do this month.
Test it in ten minutes
Run the shop page through Google's Rich Results Test and confirm the tool sees the node you think it sees. Then open Search Console, use URL Inspection on the same page, and check the rendered HTML for the block — markup injected client-side after a cookie banner loads is markup that may never be parsed. Finally, look at the structured-data section of Search Console for errors across the site; one broken template produces the same error on every page it touches, which makes the fix cheap once you find it.
The part only you can fix
Markup can tell Google where you are and when you are open. It cannot tell a customer what you charge for a transfer, because that is not a structured-data field — it has to exist as a plain sentence on a page a human can read. If your listing is missing hours or a fee, add your transfer fee and hours to your free listing; that listing is what a share of searchers see before they ever reach your site, and it is the version of your shop that has to be right when your site is down, slow, or three clicks deep.
None of this is a growth hack. It is the digital equivalent of making sure the sign is lit and the hours are posted — unglamorous, cheap, and the reason the right customer walks in instead of driving past.