Fix homepage structured data: add review, correct brand type, add validFrom - #120
Conversation
Search Console reports two non-critical Product snippet issues on sbomify.com: missing "review" and missing "aggregateRating". Adds `review` using the Atsign testimonial that is already rendered in the "Trusted By" section of the homepage. Structured data has to reflect what a visitor can actually see, and this markup sits on the homepage, so the reviewBody matches that blockquote verbatim — asserted at build time rather than assumed. Deliberately NOT added: - `reviewRating` — no rating was ever given. A Review is valid without one, and attaching a number nobody chose would be fabricated data. - `aggregateRating` — that summarises multiple ratings, and none have been collected. This one stays reported until a real review programme exists. Google's review policy requires structured-data reviews to reflect genuine sentiment, so the remaining warning is the honest outcome rather than something to engineer away. Verified: all three homepage JSON-LD blocks parse, reviewBody matches the visible blockquote exactly, and no rating fields are present.
Search Console reports four non-critical Merchant listing issues. Two are real defects and are fixed here; two are retail concepts that do not apply to a SaaS and are deliberately left alone. Fixed: - "Invalid object type for field brand" — brand was typed Organization. Google's merchant listing spec expects Brand. Genuine markup bug. - "Missing field validFrom (in offers)" — added to both offers. The site rebuilds nightly, so "valid from this build" is an accurate statement rather than an invented date, and it mirrors the priceValidUntil that was already generated the same way. priceValidUntil now covers the Community offer too, which it previously omitted. Not fixed, on purpose: - "Missing field shippingDetails (in offers)" — nothing is shipped. There is no honest value. - "Missing field hasMerchantReturnPolicy (in offers)" — a real refund policy exists in terms.md, but MerchantReturnPolicy wants machine-readable return windows, fees and methods. Those would have to be invented, and publishing invented return commitments is a legal statement, not a markup detail. Both remaining warnings stem from Product + offers causing Google to evaluate the page as an e-commerce listing. A B2B SaaS will not qualify for merchant listings regardless, so they are permanent unless the page stops modelling itself as a Product. Verified in the built output: brand is Brand, both offers carry validFrom and priceValidUntil, all JSON-LD parses.
|
Extended to cover the second Search Console email (Merchant listings, 4 non-critical issues) as well as the Product snippets one. Fixed
Verified in the built output: Deliberately not fixed
The pattern worth noticingAll four merchant-listing warnings exist because So this class of warning is permanent unless the page stops modelling itself as a |
|
@cpswan — looping you in because this PR uses your Atsign testimonial as schema.org Nothing new is being said: the quote is the one already rendered in the "Trusted By" section, reproduced verbatim (the build asserts the markup matches the visible text). No rating is attached — you gave prose, not a score, so inventing a number would have been fabricated data. "review": {
"@type": "Review",
"author": { "@type": "Person", "name": "Chris Swan",
"affiliation": { "@type": "Organization", "name": "Atsign" } },
"datePublished": "2024-11-22",
"reviewBody": "Using sbomify has hugely accelerated our work on NTIA compliance. …",
"url": "https://sbomify.com/case-studies/atsign/"
}Two things worth your eye:
If either gives you pause, say so and I will drop the (Requested by @vpetersson. I could not add you as a formal reviewer — this account only has read access on this repo.) |
Search Console reported two non-critical Product snippet issues on sbomify.com: missing
reviewand missingaggregateRating.What this adds
reviewon the homepageProductentity, using the Atsign testimonial that is already rendered in the "Trusted By" section of that same page:Structured data must reflect content the visitor can actually see, and this markup sits on the homepage — so
reviewBodymatches the visible blockquote verbatim. I asserted that at build time rather than eyeballing it:What this deliberately does not add
No
reviewRating. Chris never gave a score — the testimonial is prose. AReviewis valid schema without one, and attaching a number nobody chose would be fabricated data.No
aggregateRating. That property summarises multiple ratings, and none have been collected. This warning will therefore remain reported, which is the honest outcome: Google's review policy requires structured-data reviews to reflect genuine sentiment, so the fix for that one is a real review programme (G2, Capterra, or on-site ratings), not markup.So this closes one of the two issues properly and leaves the other visible rather than papering over it.
One thing worth your judgement
Chris Swan is described in
data/authors.ymlas "an sbomify advisor" as well as an engineer at Atsign. The testimonial is genuine and already published, but Google's review policy discourages reviews carrying a conflict of interest. I do not think an advisor-cum-customer quote crosses the line — he is speaking as Atsign, a real user — but you are better placed to judge that than I am, and it is easy to revert if you would rather not attach his name to review markup specifically.Verification
reviewBodymatches the rendered blockquote exactlyreviewRating/aggregateRatingpresent, asserted