Listing Quality Checker: Product Page Audit & Score avatar

Listing Quality Checker: Product Page Audit & Score

Pricing

from $4.00 / 1,000 page audits

Go to Apify Store
Listing Quality Checker: Product Page Audit & Score

Listing Quality Checker: Product Page Audit & Score

Audit any product page or Amazon listing: a 0–100 score and pass, warn or fail checks with a fix for each. Structured data (Product, Offer, GTIN), titles, images and alt text, attributes, shipping and returns, meta tags, canonical, page weight. Compare against competitors; watch for changes.

Pricing

from $4.00 / 1,000 page audits

Rating

0.0

(0)

Developer

CleanPull

CleanPull

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 hours ago

Last modified

Categories

Share

Give it product page URLs from any online shop or Amazon listings and get a score from 0 to 100 for each, with every check marked pass, warn or fail and a concrete fix. Store pages are checked against Google's product structured-data rules (Product and Offer, GTIN, availability, priceValidUntil, review markup, shipping and return policy), Merchant Center's product data specification (title, brand, colour, size, material) and on-page basics (title tag, meta description, canonical, image alt text, page weight). Amazon listings are checked against Amazon's own guidance: title length and rules, bullet points, images, A+ content, description and attributes. Add a competitor's page and get a comparison row: the score gap and the checks where they do better, with your fix. From $5.00 per 1,000 audits.

What you can do with it

  • "Why doesn't Google show my product with price and stars?" The structured-data checks name exactly what is missing from the Product and Offer markup, and what to add.
  • "Fix my listings before a launch or a theme change." Every failed check has its fix, and topFixes lists the five worth the most points.
  • "How does my page compare with the competitor that outranks me?" Give both URLs: the comparison row shows where they do better and what to change.
  • "Is my Amazon listing following Amazon's rules?" Title length and forbidden characters, repeated words, promotional wording, five bullets, images, A+ content.
  • "Are my keywords in my titles?" Give the search terms; each audit names the ones present and the ones missing.
  • "Tell me when a listing breaks." A weekly watchlist with Changes only returns a page only when a check moved (a theme update dropped the GTIN, a sale date expired) or a page was removed.
  • "Feed audits to an AI agent or a spreadsheet." Compact JSON with the same check ids on every page, a field picker and dataset views.

How a page is checked

Each URL is read once (an Amazon page served without its lower half gets one sections request and one more read). Store pages get 16 checks; Amazon listings 8. Each check has a weight; a pass earns its full weight, a warn half, a fail nothing. The total is the score (store weights and Amazon weights each add up to 100), with a grade from A (90+) to F (below 40).

Store page checkWeightPasses whenBased on
Product structured data14a JSON-LD Product (or ProductGroup) with name, image and offers, in the HTML; every JSON-LD block parsesGoogle merchant listings
Offer price and currency10the Offer has a price above 0 and an ISO 4217 currency (an AggregateOffer warns: merchant listings need an Offer)Google merchant listings
GTIN8a GTIN-8/12/13/14 with a valid check digit (missing: warn, as it is required only for products that have one; a bad check digit fails)Merchant Center specification
Attributes8brand, plus colour, size or material (from markup or variant options)Merchant Center specification
Shipping and returns8shippingDetails and hasMerchantReturnPolicy are marked up (only mentioned in text: warn)Google return policy markup
Title length7the product name is 20 to 110 characters (a rule of thumb; over 150 fails: Merchant Center's limit)Merchant Center specification
Product images73 or more product images in the markupGoogle merchant listings
Availability6each offer has a schema.org availability (missing: warn; Google recommends it)Google merchant listings
Title keywords6your keywords are in the title or title tag; no word used more than twiceGoogle title links
Review markup5aggregateRating or review on the Product, or no rating shown on the page (a rating in the HTML without markup warns)Google product snippets
Image alt text580% of the product's image tags have descriptive alt textGoogle image SEO
Title tag415 to 70 characters, no repeated words (a rule of thumb: Google sets no limit and cuts to the screen)Google title links
Meta description450 to 320 characters (a rule of thumb: Google sets no limit and cuts as needed)Google snippets
Canonical3points to this page (the home page or noindex fails)Google canonical URLs
priceValidUntil3not set (it is optional), or set and in the future (a past date fails)Google merchant listings
Page weight2HTML under 2 MB and under 4,200 elements (product markup after the first 2 MB fails)Googlebot, Lighthouse DOM size
Amazon checkWeightPasses when
Title length1580 characters or fewer (Amazon: a 200-character limit and "we recommend no more than 60"; the warning above 80 is a rule of thumb; over 200 fails)
Title rules15no ! $ ? _ { } ^ ¬ ¦ outside the brand, no word more than twice, no promotional wording
Bullet points15five bullets, none over 500 characters
Images15six or more, a video counting as one (Amazon: "at least one image, and we recommend having at least six"); none fails
A+ content10A+ modules below the bullets
Title keywords10your keywords in the title (else in the bullets: warn); brand first when no keywords are given
Attributes10brand, plus at least two of colour, size, material in the details
Description10200 characters or more, or A+ content in its place

In a test of 27 product pages from 23 shops on 10 platforms and Amazon (US, UK, Germany), read from Apify's servers, all 27 were audited. A watchlist of 16 of them audited twice, minutes apart, reported no false changes.

What makes the audit right

  • Every finding names what was found. found says what the page has ("1 GTIN(s), e.g. 4009839334917", "0 of 4 product image tags have alt text"); fix says what to change; source names the guidance.
  • What Google reads, not what a browser draws. Checks read the page's HTML, as Google's shopping crawl does. Product markup that only a script writes after load is reported as such, since Google says it makes shopping crawls less reliable.
  • A product page, not just any page. A page is audited only when it has Product markup, an Offer or a price. A store that now redirects the address to a category or its home page has dropped the product: it is reported as removed on the second run in a row, and never charged as an audit.
  • A block is never a bad score. Each site gets its own proxy ladder (direct, then datacenter, then residential only for sites that block the others). A page that cannot be read is listed in the run summary with the reason and never charged.
  • Changes are real changes. Page weight moves with every theme deploy, so only reaching or leaving fail counts; scores that move by less than the threshold are ignored; a page is reported removed only after two runs without it.
  • Only public addresses are read. A URL or redirect pointing into a private network is never fetched.
  • Runs do not fail for one bad entry. An invalid URL is skipped with a warning; an empty input runs the form's example.

Input

FieldWhat it does
productUrlsYour product pages: any shop, or Amazon (amazon.<marketplace>/dp/ASIN), one per line
competitorUrlsCompetitors' pages: audited too, with one comparison row per page of yours
keywordsSearch terms the titles should carry
changesOnly, monitorName, minScoreChangeReturn a page only when a check or the score moved since the last run with the same watchlist name
maxRunCostUsdStop before this run's charges pass the amount (for scheduled runs)
fields, maxConcurrency, proxyConfiguration, startUrlsField selection, pace, your own proxy, and compatibility with other actors

Example inputs

Audit your page against a competitor's, with keywords:

{
"productUrls": ["https://www.allbirds.com/products/mens-tree-runners"],
"competitorUrls": ["https://www.amazon.com/dp/B0DTK7VDTH"],
"keywords": ["wool sneakers", "running shoes"]
}

Amazon listings in two marketplaces:

{ "productUrls": ["https://www.amazon.com/dp/B07C1YFV6D", "https://www.amazon.de/dp/B003B3RGLE"] }

A weekly listing watch, capped at 50 cents a run:

{
"productUrls": ["https://www.tentree.com/products/kessler-sweater-warm-oak-heather-fade"],
"changesOnly": true,
"monitorName": "my-listings",
"maxRunCostUsd": 0.5
}

Output

One audit row per page. A real row (two of its 16 checks shown):

{
"recordType": "audit",
"url": "https://www.zwilling.com/us/miyabi-evolution-5-inch-prep-knife-fine-edge--34025-133/34025-133-0.html",
"domain": "zwilling.com",
"role": "yours",
"pageType": "store",
"platform": "salesforce-commerce-cloud",
"title": "MIYABI Evolution 5-inch Prep Knife, Fine Edge",
"brand": "MIYABI",
"price": 129.99,
"currency": "USD",
"score": 96,
"grade": "A",
"passed": 15,
"warnings": 1,
"failed": 0,
"topFixes": [
"Shipping and returns: Add shippingDetails (OfferShippingDetails: shippingRate, shippingDestination, deliveryTime) and hasMerchantReturnPolicy (applicableCountry, returnPolicyCategory, merchantReturnDays), on the Offer or once on your Organization, so Google can show them with the listing."
],
"checks": [
{
"id": "gtin",
"group": "structured-data",
"label": "GTIN (barcode)",
"status": "pass",
"weight": 8,
"found": "1 GTIN(s), e.g. 4009839334917",
"fix": null,
"source": "Google Merchant Center: Product data specification (support.google.com/merchants/answer/7052112)"
},
{
"id": "shipping-returns",
"group": "attributes",
"label": "Shipping and returns",
"status": "warn",
"weight": 8,
"found": "shipping in page text only; returns in page text only",
"fix": "Add shippingDetails (…) and hasMerchantReturnPolicy (…), so Google can show them with the listing.",
"source": "Google Search Central: Merchant return policy structured data (developers.google.com/search/docs/appearance/structured-data/return-policy)"
}
],
"pageWeight": { "htmlKB": 220.5, "wireKB": 46.8, "wireEstimated": false, "domElements": 1272 },
"images": 3,
"structuredData": ["json-ld", "open-graph"],
"readThroughResidentialProxy": false,
"firstSeen": true,
"previousScore": null,
"scoreChange": null,
"changedChecks": [],
"auditedAt": "2026-10-15T01:10:34.930Z"
}

With competitors, one comparison row per page of yours:

{
"recordType": "comparison",
"url": "https://www.allbirds.com/products/mens-tree-runners",
"score": 86,
"competitors": [
{ "url": "https://www.zwilling.com/us/…", "domain": "zwilling.com", "score": 96, "grade": "A" }
],
"bestCompetitorScore": 96,
"scoreGap": -10,
"behindOn": [
{
"check": "gtin",
"label": "GTIN (barcode)",
"yours": "warn",
"theirs": "pass",
"theirFinding": "1 GTIN(s), e.g. 4009839334917",
"fix": "If the product has a GTIN (the barcode: EAN, UPC, ISBN), add it as gtin13, gtin12 or gtin14 to the Product or each variant; …"
}
],
"aheadOn": [],
"summary": "86 vs 96 (zwilling.com): behind on 3 check(s), ahead on 0."
}

A store page and an Amazon listing are compared on what they share: title length and keywords, images and attributes. On a watchlist, changedChecks lists each check that moved ({ "check": "gtin", "from": "pass", "to": "fail", "fix": "…" }); a page gone on two runs in a row gives one change row with "change": "removed", removedHow (not-found or redirected) and redirectedTo.

Amazon rows also have marketplace, asin, bullets and aplusModules. Amazon sometimes serves a listing without its lower half; the actor then asks for the page's sections (as Amazon Product Scraper does) and reads the page once more. If the lower half still is not there, the row has "partial": true and notChecked: the attributes, A+ and description checks are left out of the score (not failed), and a watchlist does not count them as changes on the next run. Dataset views: Scores, Fixes and Comparisons. RUN_SUMMARY in the key-value store gives the outcome (COMPLETE, PARTIAL, NO_CHANGES, EMPTY, FAILED), each page's score, charges, and every page that could not be audited, with the reason.

Pricing

EventFree and BronzeSilverGold and above
Audit (a delivered audit row)$5.00$4.50$4.00
Page checked, unchanged (Changes only), or confirmed removed$0.60$0.55$0.50
Page through residential addresses (add-on, only for sites that block the others)$7.00$7.00$7.00

Per 1,000 pages. Each run also has a $0.00005 start fee. Comparison rows are free. A page read through residential addresses may transfer at most 600 KB, compressed as sent, over all its attempts together (a larger one is not read or charged). A weekly watch of 100 product pages with Changes only is about 430 checks a month: $0.26, plus the pages that changed.

Guidance the checks follow

Limits

  • What the HTML holds. Markup and images that only scripts add after the page loads are not run; the checks say when that is the case.
  • Image sizes are not measured (that would take a request per image); counts and alt text are.
  • Some retailers are not read: Walmart, Target, Best Buy, REI, Hydro Flask and Patagonia block automated visitors or draw their pages with scripts only; they are skipped with a note and never charged.
  • Amazon: the listing is read as a signed-out shopper sees it; Seller Central data (search terms, suppressed attributes) is not visible.
  • The score is a guide, not a ranking promise. It weighs documented requirements and recommendations; search engines use many other signals.
  • Up to 200 pages a run.
  • Nothing found: when nothing could be read because it is not there (a page that answers 404, or input naming no page), the run still succeeds, with one free recordType: "unreadable" row per item giving the reason; nothing is charged. A run near its time limit stops starting pages, delivers what it read and lists the rest the same way.

Changelog

  • 0.1.x, reliability (2026-10-24): runs that find nothing (a page that answers 404, or input naming no page) end SUCCEEDED with a free unreadable row per item saying why, instead of FAILED; a run stops starting pages before its time limit and ends with what it read, never TIMED-OUT. A run where the site refused on every route for every page still fails. Prices and events unchanged.
  • 0.1 (October 2026): audits of store product pages (16 checks) and Amazon listings (8 checks) with a 0–100 score and a fix per check; keyword coverage; comparison rows against competitors; Changes only watchlists with removal confirmed on a second run; Max cost per run.