Shopify Variant Listing Drift Audit avatar

Shopify Variant Listing Drift Audit

Pricing

from $20.00 / 1,000 drift audit completeds

Go to Apify Store
Shopify Variant Listing Drift Audit

Shopify Variant Listing Drift Audit

Compare two dated Shopify variant catalogs for title, barcode, size-color option and published-flag drift, with a partial-coverage warning.

Pricing

from $20.00 / 1,000 drift audit completeds

Rating

0.0

(0)

Developer

Practical AI Lab

Practical AI Lab

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Security

Limited permissions

Share

Compare two dated Shopify catalog captures and get a row-by-row list of what drifted at product and variant level, plus a summary with a partial-coverage warning.

What it checks

AreaFindings
Product titletitle_changed (whitespace noise ignored)
Barcode completenessbarcode_added, barcode_removed, barcode_changed, plus completeness percentage per snapshot
Size and color optionsoption_names_changed, option_value_changed (labelled size: / color: / other:)
Published flagspublished_changed (variant published if present, otherwise the product published_at); availability_changed is reported separately as stock status
Structureproduct_added, product_removed, variant_added, variant_removed

Every run also writes one summary row (first in the dataset) and an OUTPUT record with coverage status, warnings, change counts, severity counts and barcode completeness before/after.

Input

  • baselineDate and baselineProducts: an earlier capture in Shopify products.json format. A past state cannot be fetched live, so the baseline is always supplied (for example saved from an earlier run or export).
  • currentProducts (pasted) or currentStoreUrl (public HTTPS store root, read from its public /products.json feed).
  • Limits: maxProducts, maxPages, requestDelaySeconds, maxChanges.

Copyable sample (the prefilled input in the Console works as is):

{
"baselineDate": "2026-10-01",
"baselineProducts": [
{"id": 1001, "handle": "city-tee", "title": "City Tee", "published_at": "2026-09-01T00:00:00Z",
"options": [{"name": "Size"}, {"name": "Color"}],
"variants": [{"id": 5001, "sku": "TEE-S-BLK", "barcode": "4006381333931", "option1": "S", "option2": "Black", "available": true}]}
],
"currentDate": "2026-11-01",
"currentProducts": [
{"id": 1001, "handle": "city-tee", "title": "City Tee - Organic Cotton", "published_at": null,
"options": [{"name": "Size"}, {"name": "Color"}],
"variants": [{"id": 5001, "sku": "TEE-S-BLK", "barcode": "", "option1": "S", "option2": "Black", "available": true}]}
]
}

This sample yields a title change, a removed barcode and a published-flag change.

Output example

{"recordType": "change", "changeType": "barcode_removed", "severity": "high",
"handle": "city-tee", "sku": "TEE-S-BLK", "field": "barcode",
"before": "4006381333931", "after": null, "possibleCoverageArtifact": false}

Partial-coverage warning

coverageStatus is partial when either snapshot was cut by a limit, or when fewer than 80% of products overlap between snapshots. In that case added/removed rows are flagged possibleCoverageArtifact because they may reflect different slices of the catalog rather than real changes. Even without a warning, completeness cannot be proven from the data alone.

Live fetching rules

Only a public HTTPS site root is accepted (no credentials, no custom port, no IP addresses, no private or local resolution). robots.txt is checked first and an unreadable or disallowing file stops the run. Requests are paged, delayed, size-capped and never follow redirects.

Pricing and errors

The code references one pay-per-event name, drift-audit-completed, emitted once after a successful audit. No payable plan is configured in this repository. Input errors, robots refusals and fetch failures end the run without charging.

Limitations

  • Results are only as good as the two inputs; the Actor cannot verify that a capture is complete or accurate.
  • Small catalogs (under 30 products) give indicative rates only; a warning is added.
  • The public products.json feed may hide products, omit barcodes or reflect market-specific data. It has no per-variant publication field, so variant publication falls back to the product published_at unless you supply a published value.
  • Live fetching resolves the host before connecting; it cannot fully exclude DNS changes between check and connection.
  • Products are matched by Shopify id (or handle if id is absent); re-created products appear as removed plus added.
  • It does not scrape marketplaces, collect personal data, or estimate revenue.