Shopify Variant Listing Drift Audit
Pricing
from $20.00 / 1,000 drift audit completeds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Security
Limited permissionsShare
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
| Area | Findings |
|---|---|
| Product title | title_changed (whitespace noise ignored) |
| Barcode completeness | barcode_added, barcode_removed, barcode_changed, plus completeness percentage per snapshot |
| Size and color options | option_names_changed, option_value_changed (labelled size: / color: / other:) |
| Published flags | published_changed (variant published if present, otherwise the product published_at); availability_changed is reported separately as stock status |
| Structure | product_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.jsonformat. 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.jsonfeed). - 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.jsonfeed may hide products, omit barcodes or reflect market-specific data. It has no per-variant publication field, so variant publication falls back to the productpublished_atunless you supply apublishedvalue. - 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.