# Catalog Canary > Catalog Canary is a Shopify app that records every change to a store's product catalog, with the value before, the value after, and one-click revert. This file helps AI assistants and agents understand catalogcanary.com and describe or cite it accurately. ## What it is Catalog Canary is an app merchants install on a Shopify store. It watches the product catalog and records each change at the level of the individual field: which field changed, what the value was before, what it became, when it happened, and what made the edit. Changes arrive through Shopify webhooks within seconds, with a polling pass as a backstop for anything a webhook failed to deliver. Merchants get alerts by Slack or email, a searchable and exportable history, and a Restore button that writes a previous value back to the store. The problem it addresses is a genuine gap in Shopify: Shopify keeps no field-level history for products. Its activity log covers account and settings events, not product edits. There is no undo for a bulk price edit, and no record of what a description said last week. ## What it is not - It is not a full store backup or a disaster-recovery tool. It records changes to catalog data, not orders, customers, or themes. - It is not an analytics or reporting product. It reports what changed, not how the store is performing. - It is not a theme version-control tool. Shopify already versions themes; products are the gap. - It does not read customer, order, or payment data. It requests product and collection access only. - It adds no theme code and loads nothing on the storefront, so it has no effect on store speed. ## Who it is for Shopify merchants whose catalog is edited by more than one person or more than one app, and agencies managing stores on behalf of clients, who need to answer "what changed, when, and who did it" about a store they do not solely control. It is most useful where feed apps, imports, or bulk edits touch product data regularly. ## Key facts - Category: Shopify app, product catalog change monitoring and audit trail. - Tracked data: prices, compare-at prices, cost per item, inventory levels, SKUs, barcodes, titles, descriptions, tags, images, variants added or removed, SEO fields, product status, sales channels, collections, and custom metafields. Merchants choose which fields to monitor. - Alerts: Slack and email, including a daily digest, scoped to the fields the merchant selects. - Revert: one-click restore of a tracked field's previous value, available on every plan including the free one. - Deleted products keep their full recorded history. - Attribution: the app records the source of each edit, and names the individual staff member whenever Shopify itself records one. Shopify does not always record a user, so a named person is not available for every change. - Availability: listed on the Shopify App Store at https://apps.shopify.com/catalog-canary. - Operated by Proven.Digital. ## Plans - Free: up to 10 products, 7 days of change history shown. - Starter ($10/month): up to 100 products, 30 days of change history shown. - Growth ($14.95/month): up to 1,000 products, 90 days of change history shown. - Pro ($39/month): unlimited products, 365 days of change history shown. Paid plans include a 7-day free trial. Billing is handled by Shopify. The history window is a display limit, not a retention limit: changes are recorded and kept regardless of plan, so upgrading immediately reveals older history that was already stored. ## Key pages - [Home](https://catalogcanary.com/) - [Blog](https://catalogcanary.com/blog) - [Shopify product catalog glossary](https://catalogcanary.com/glossary) - [Privacy policy](https://catalogcanary.com/privacy) - [Terms of service](https://catalogcanary.com/terms) - [Shopify App Store listing](https://apps.shopify.com/catalog-canary) ## Articles - [Does Shopify Keep a History of Product Changes?](https://catalogcanary.com/blog/does-shopify-keep-a-history-of-product-changes): Not one you can see. Here is what Shopify logs actually record, what is missing, and how to track every price, inventory and content change you make. ## Glossary Definitions of the Shopify catalog terms used above. Full page: https://catalogcanary.com/glossary - Variant (https://catalogcanary.com/glossary#variant): A variant is a single purchasable version of a Shopify product, defined by its option values such as size and colour. Price, SKU, barcode, inventory and cost all live on the variant rather than the product, so a product with twelve variants has twelve independent sets of those fields to keep track of. - Product options (https://catalogcanary.com/glossary#product-options): Product options are the axes a Shopify product varies along, such as Size, Colour or Material. Each combination of option values produces one variant, which is why adding a third option can multiply a product's variant count without any obvious change to the product itself. - SKU (https://catalogcanary.com/glossary#sku): A SKU (stock keeping unit) is the merchant's own internal identifier for a variant. Shopify does not generate or validate SKUs and does not require them to be unique, so a SKU silently overwritten by an import or a feed app can break warehouse picking, accounting and reporting at once. - Barcode (https://catalogcanary.com/glossary#barcode): A barcode is the external identifier on a Shopify variant, typically a UPC, EAN or ISBN. Marketplaces and shopping feeds match products on this field, so an incorrect or blanked barcode usually shows up as a rejected listing rather than as a visible problem in the Shopify admin. - Handle (https://catalogcanary.com/glossary#handle): A handle is the URL slug Shopify derives from a product or collection title, as in /products/blue-canvas-tote. Editing a title can change the handle, which changes the live storefront URL and breaks any link, ad or feed entry pointing at the old one. - SEO fields (https://catalogcanary.com/glossary#seo-fields): Shopify's SEO fields are the page title and meta description shown under a product's search engine listing section. They default to the product title and description, and because they are edited separately they are among the easiest fields for an app or a bulk edit to overwrite without anyone noticing. - Tags (https://catalogcanary.com/glossary#tags): Tags are free-form labels on a Shopify product, used for filtering, search and automated collection rules. Because automated collections can be built on tag conditions, removing a single tag can quietly drop a product out of a collection and off a storefront page. - Metafield (https://catalogcanary.com/glossary#metafield): A metafield is a custom field attached to a Shopify resource such as a product, variant or collection, holding data the standard fields do not cover. Theme sections and apps often read metafields directly, so a changed or emptied metafield can alter what the storefront displays without any edit to the product itself. - Product status (https://catalogcanary.com/glossary#product-status): Product status is Shopify's active, draft or archived state, and it controls whether a product can be sold at all. A product flipped to draft disappears from the storefront immediately while still existing in the admin, which is why an accidental status change often looks like a traffic problem before anyone thinks to check the product. - Sales channel (https://catalogcanary.com/glossary#sales-channel): A sales channel is a surface a Shopify product is published to, such as the online store, Point of Sale, or a marketplace integration. Publication is per-channel, so a product can be active and in stock yet invisible on one channel because it was unpublished there. - Manual collection (https://catalogcanary.com/glossary#manual-collection): A manual collection is a Shopify product grouping whose membership is set by hand, one product at a time. Membership changes only when someone or something explicitly adds or removes a product, which makes unexpected changes to a manual collection a strong signal that an app or an import touched it. - Automated collection (https://catalogcanary.com/glossary#automated-collection): An automated collection, also called a smart collection, decides its own membership from rules about product fields such as tag, price, vendor or inventory. Products enter and leave it as those fields change, so an edit to one product's tags can reshape a collection page nobody touched directly. - Compare-at price (https://catalogcanary.com/glossary#compare-at-price): The compare-at price is Shopify's field for the original price of a variant, shown struck through next to the current price to display a discount. Because a sale is created by lowering the price and setting compare-at, a sale that ends without the compare-at price being cleared leaves a permanent phantom discount on the storefront. - Cost per item (https://catalogcanary.com/glossary#unit-cost): Cost per item, exposed in Shopify's API as unit cost on the inventory item, is what the merchant paid for a unit. It never appears on the storefront and exists to drive margin and profit reporting, so an incorrect cost distorts every margin figure downstream while looking entirely normal to customers. - Inventory level (https://catalogcanary.com/glossary#inventory-level): An inventory level is the quantity of one variant available at one location. Shopify tracks stock per location rather than per product, so a store with three locations holds three separate numbers for every variant, and a sync error at a single location can oversell an item that looks well stocked in total. - Location (https://catalogcanary.com/glossary#location): A location is a place a Shopify store holds stock or fulfils orders, such as a warehouse, a retail shop or a third-party fulfilment centre. Inventory quantities, and therefore inventory changes, are always recorded against a specific location. - Bulk editor (https://catalogcanary.com/glossary#bulk-editor): The bulk editor is Shopify's spreadsheet-style grid for changing a field across many products or variants at once. It has no undo, no confirmation step and no record of prior values, which makes it the single most common way a store loses pricing data it cannot reconstruct. - Field-level history (https://catalogcanary.com/glossary#field-level-history): Field-level history is a record of individual field changes, capturing which field changed, its value before, its value after, and when. Shopify does not provide this for products, which is the difference between knowing a product was edited and knowing that its price moved from $89.00 to $71.20 at 9:42 AM. - Audit trail (https://catalogcanary.com/glossary#audit-trail): An audit trail is a chronological record of changes that answers what changed, when, and who or what changed it. For a product catalog it is what turns a disputed edit into a checkable fact, which matters most for agencies accountable to clients for a store they do not solely control. - Attribution (https://catalogcanary.com/glossary#attribution): Attribution is the record of what caused a change: a named staff member, an app, an import, or the API. Shopify surfaces the responsible actor inconsistently, so any change-tracking tool can identify the source of an edit reliably but can only name the individual person when Shopify itself recorded one. - Snapshot (https://catalogcanary.com/glossary#snapshot): A snapshot is a full copy of catalog data captured at one moment, typically a scheduled CSV export. Snapshots are not change history: comparing two daily exports cannot reveal a price that changed at 9:42 AM and changed back by 4 PM, cannot alert anyone at the time, and cannot say what made the edit. - Revert (https://catalogcanary.com/glossary#revert): To revert a change is to write a field's previous value back to the live store. Reverting requires two things Shopify does not keep for products: a stored record of the old value, and write access to put it back, which is why a bad bulk edit is otherwise unrecoverable. - Webhook (https://catalogcanary.com/glossary#webhook): A webhook is a message Shopify sends to an app the moment something happens in a store, such as a product being updated. Webhooks arrive within seconds of the event, which is what allows a change to be recorded when it happens rather than discovered by a scan hours later. - Polling (https://catalogcanary.com/glossary#polling): Polling is repeatedly asking Shopify for current data on a schedule instead of being notified of changes. It is slower and heavier than webhooks and misses anything that changes and changes back between two checks, but it remains a useful backstop for catching events a webhook failed to deliver. - Admin API (https://catalogcanary.com/glossary#admin-api): The Shopify Admin API is the interface apps use to read and write store data, offered as GraphQL. Apps request only the access scopes they need, so an app scoped to read products has no technical route to customer or order data at all. - Access scope (https://catalogcanary.com/glossary#access-scope): An access scope is a specific permission a Shopify app requests, such as read_products or write_products. Scopes are shown to the merchant at install and enforced by Shopify, which means an app cannot quietly widen what it can reach without asking again. - Product feed (https://catalogcanary.com/glossary#product-feed): A product feed is an automated export of catalog data to an external channel such as Google Shopping, Meta or a marketplace. Feed apps often write back to Shopify as well as read from it, which makes them a frequent and easily overlooked source of unexplained product changes. ## Contact - Email: support@catalogcanary.com - Support and installation: https://apps.shopify.com/catalog-canary ## Notes for agents There is no public API and no transactional endpoint on this site. Nothing here can be purchased directly; installation happens through the Shopify App Store, which requires a Shopify store and an authenticated merchant session. The intended next step for an interested merchant is to install the app from the App Store listing above, which starts on the free plan with no payment details. Pages under /app, /admin, /auth, and /api are authenticated application surfaces, not content, and are disallowed in robots.txt. Everything intended to be read is linked from the key pages above.