# feedlab > feedlab is a Shopify feed engine: it syncs a store's catalogue, maps every field through a transformation rule engine, and publishes schema-perfect product feeds for Google Shopping, Meta, Microsoft, Pinterest, OpenAI and any other channel on a schedule. The feedlab knowledge base is a free reference for people who build and fix product feeds on Shopify. It documents the attributes a feed can carry, the specification of each sales channel, the errors channels return, and the vocabulary of feed work. Content is free to quote and cite with attribution to feedlab. - Full text of every page in one document: www.feedlab.io/llms-full.txt - Markdown version of any knowledge base page: append `.md` to its URL ## Feed attributes - [availability](https://www.feedlab.io/knowledge/attributes/availability): The availability attribute tells a channel whether an item can be bought right now, using a fixed vocabulary rather than a stock count. On Shopify it cannot be read from inventory quantity alone, because a variant that does not track inventory or that allows overselling is purchasable at zero quantity. - [brand](https://www.feedlab.io/knowledge/attributes/brand): The brand attribute is the name of the brand a product belongs to, and it is what makes a manufacturer part number meaningful and a listing eligible for brand-based matching. On Shopify it maps most often from the vendor field, which is unreliable because merchants commonly use vendor to record a supplier or distributor rather than the consumer-facing brand. - [condition](https://www.feedlab.io/knowledge/attributes/condition): The condition attribute declares whether an item is new, refurbished or used. Its requirement level is one of the sharpest differences between channels: Google only needs it when an item is not new, while Meta expects it on every item, so a feed built for one and pointed at the other fails on every row. - [custom_label_0](https://www.feedlab.io/knowledge/attributes/custom-label-0): The custom_label attributes are five free-text fields, numbered 0 to 4, that carry your own segmentation into a feed so campaigns can bid on groupings the channel knows nothing about. Nothing is shown to shoppers: their entire purpose is to let you subdivide a catalogue by margin, season, stock age, bestseller status or anything else you can compute. - [description](https://www.feedlab.io/knowledge/attributes/description): The description attribute is the prose a channel uses to understand and display what a product is. On Shopify it maps from body_html, which is rich text, so it needs its HTML stripped and its entities decoded before it can be submitted. - [google_product_category](https://www.feedlab.io/knowledge/attributes/google-product-category): The google_product_category attribute places an item in Google's own fixed product taxonomy, a tree of several thousand predefined categories. Google infers a category when the attribute is omitted, but the inference is often wrong for specialist catalogues, and certain categories such as alcohol and subscription hardware require it explicitly. - [gtin](https://www.feedlab.io/knowledge/attributes/gtin): The gtin attribute is the globally unique barcode number a manufacturer assigns to a product, covering UPC, EAN, JAN and ISBN formats. Channels use it to match an item against the same product sold elsewhere, and on Shopify it comes from the variant's barcode field, which is optional in the admin and therefore frequently empty. - [id](https://www.feedlab.io/knowledge/attributes/id): The id attribute is the unique, permanent identifier a sales channel uses to recognise one item across every feed update. In a Shopify feed it must identify a single variant rather than a product, and once a channel has seen an id it should never be reused for a different item. - [identifier_exists](https://www.feedlab.io/knowledge/attributes/identifier-exists): The identifier_exists attribute is an explicit declaration that a product has no manufacturer-assigned identifiers, set to no when a GTIN, MPN and brand genuinely do not exist for the item. It is a statement about the product, not a way to silence identifier warnings, and channels treat misuse as a data quality problem rather than a resolution. - [image_link](https://www.feedlab.io/knowledge/attributes/image-link): The image_link attribute is the URL of the single main image a channel shows for an item. On Shopify the correct source is the variant's own image where one is assigned, falling back to the product's featured image, because a feed that shows the wrong colour is worse than one that shows a generic shot. - [item_group_id](https://www.feedlab.io/knowledge/attributes/item-group-id): The item_group_id attribute groups the rows that are variants of the same product, so a channel can show one listing with a size or colour picker instead of several unrelated listings. On Shopify the natural source is the product ID, shared by every variant row generated from that product. - [link](https://www.feedlab.io/knowledge/attributes/link): The link attribute is the URL a shopper is sent to after clicking a listing, and the page the channel crawls to verify that the feed is telling the truth about price and availability. On a multi-market Shopify store it must point at the market-specific storefront URL, not the primary domain. - [mpn](https://www.feedlab.io/knowledge/attributes/mpn): The mpn attribute is the part number a manufacturer uses to identify a product in its own catalogue, and it serves as the fallback identifier when an item has no GTIN. Unlike a GTIN it is only unique within one manufacturer, so it is meaningless to a channel unless the brand attribute is supplied alongside it. - [price](https://www.feedlab.io/knowledge/attributes/price): The price attribute is the item's full price before any discount, submitted as a number followed by an ISO 4217 currency code. It must match what a shopper sees on the landing page in that market, including whether tax is included, which is why multi-market Shopify stores so often trip the price mismatch disapproval. - [sale_price](https://www.feedlab.io/knowledge/attributes/sale-price): The sale_price attribute is the temporarily reduced price of an item, submitted alongside the full price so a channel can show the reduction rather than simply a lower number. On Shopify the reliable source is the variant's compare-at price relationship, and discounts applied by code or automatic rule are not visible in the product record at all. - [title](https://www.feedlab.io/knowledge/attributes/title): The title attribute is the product name a channel shows in a listing and matches against search queries, which makes it the single highest-leverage field in a product feed. On Shopify it usually needs building from the product title plus the variant's options, because the raw product title alone does not describe an individual variant. ## Feed errors - [Duplicate product id](https://www.feedlab.io/knowledge/errors/duplicate-id): A duplicate id error means two or more rows in a feed claim the same identifier, so the channel cannot tell which one describes the item and keeps only the last it processed. On Shopify it usually means the feed was built per product rather than per variant, or that a SKU used as the id is blank or reused across variants. - [Image link cannot be crawled](https://www.feedlab.io/knowledge/errors/image-crawl-failure): An image crawl failure means the channel could not retrieve the file at image_link, or retrieved it and judged it unusable. On Shopify the URL itself is rarely wrong, so the cause is usually a rate limit hit during a first full crawl, a temporary CDN response, or an image whose content breaks policy rather than one that is genuinely missing. - [Invalid value: GTIN](https://www.feedlab.io/knowledge/errors/invalid-value-gtin): The "Invalid value: GTIN" error means the feed supplied a value in the gtin attribute that is not a structurally valid Global Trade Item Number. Unlike a missing GTIN this is usually a disapproval rather than a warning, because a wrong identifier matches the item to the wrong product rather than to none. - [Mismatched value: availability](https://www.feedlab.io/knowledge/errors/mismatched-value-availability): The availability mismatch error means the feed says an item is purchasable but the crawled landing page suggests otherwise, or the reverse. On Shopify it is usually a stale feed after a sell-out, or an availability value derived from inventory quantity alone without accounting for variants that do not track inventory or that allow overselling. - [Mismatched value: price](https://www.feedlab.io/knowledge/errors/mismatched-value-price): The price mismatch error means the price in the feed does not agree with the price the channel found when it crawled the landing page. On Shopify the three usual culprits are a feed that has not regenerated since a price change, a link pointing at the wrong market's storefront, and a tax convention difference between the feed and the displayed price. - [Missing value: brand](https://www.feedlab.io/knowledge/errors/missing-value-brand): The "Missing value: brand" issue means a channel expects a brand name for a product and the feed did not supply one, or supplied a placeholder it treats as empty. On Shopify it usually means the vendor field is blank, or holds a supplier or internal category rather than the brand a shopper would recognise. - [Missing value: GTIN](https://www.feedlab.io/knowledge/errors/missing-value-gtin): The "Missing value: GTIN" issue means a channel believes a product has a manufacturer-assigned barcode but the feed did not supply one. On Shopify it almost always traces back to the variant barcode field, which is optional in the admin and therefore left empty across large parts of most catalogues. ## Sales channels - [Google Shopping](https://www.feedlab.io/knowledge/channels/google-shopping): Google Shopping is the surface where Google displays product listings from a merchant's catalogue, fed by a product feed uploaded to Google Merchant Center. Google's product data specification is the most detailed of the major channels, and the one whose attribute names the other channels tend to borrow. - [Meta](https://www.feedlab.io/knowledge/channels/meta): Meta's product catalogue is the data source behind Facebook and Instagram Shops, Advantage+ catalogue ads and dynamic retargeting, populated by a product feed uploaded to Commerce Manager. Its attribute names largely mirror Google's, but its accepted values and its handling of variants differ enough to break a feed copied straight across. - [Microsoft Advertising](https://www.feedlab.io/knowledge/channels/microsoft-bing): Microsoft Advertising runs product ads across Bing, Yahoo and the Microsoft Audience Network from a catalogue uploaded to Microsoft Merchant Center. Its feed specification is closely modelled on Google's, which makes it the cheapest additional channel to launch once a Google Shopping feed already exists. - [OpenAI](https://www.feedlab.io/knowledge/channels/openai): OpenAI ingests a merchant product feed so ChatGPT can surface products in shopping answers and complete purchases through Instant Checkout. It is the one major channel that does not fetch a feed URL you host: you push full catalogue snapshots to an OpenAI SFTP endpoint, and the most recently processed snapshot is retained for up to 14 days. - [Pinterest](https://www.feedlab.io/knowledge/channels/pinterest): Pinterest turns an uploaded product feed into Product Pins, which are shoppable pins that carry live price and availability from the catalogue. Its feed specification borrows Google's attribute names, and its distinguishing requirement is that every item needs a genuinely usable image, because the image is the entire unit of discovery on Pinterest. ## Concepts - [Feed scheduling](https://www.feedlab.io/knowledge/concepts/feed-scheduling): Feed scheduling is the arrangement where a sales channel fetches a feed from a fixed URL on a repeating timetable instead of the merchant uploading a file. It matters because the interval between regenerations is the window in which a channel can be wrong about a price or a stock level, and most mismatch disapprovals are caused by that window being too wide rather than by a bad mapping. - [Product feed](https://www.feedlab.io/knowledge/concepts/product-feed): A product feed is a structured file listing every item a shop sells, with one row per purchasable item and one column per attribute the destination understands. Sales channels use it to build their own copy of a catalogue, which is why a feed is a translation of a shop's data into another system's schema rather than an export of it. - [Product identifiers](https://www.feedlab.io/knowledge/concepts/product-identifiers): Product identifiers are the values that let a sales channel recognise that your listing and someone else's describe the same physical product: a GTIN, or a manufacturer part number together with a brand. They matter because a channel that can identify a product can attach reviews, specifications and competing offers to it, and one that cannot has to treat your listing as an unknown object. - [Variant-level feed](https://www.feedlab.io/knowledge/concepts/variant-level-feed): A variant-level feed emits one row for each purchasable variant rather than one row per product, because sales channels treat every size, colour and material as a separately buyable item with its own price, stock and barcode. A Shopify product with four sizes in three colours is one product in the admin and twelve items to a channel. ## About feedlab - [feedlab](www.feedlab.io): A Shopify feed engine that syncs a catalogue over the bulk API, keeps it current with webhooks, maps every field through chainable transformation rules, and publishes CSV, XML or JSON feeds at a stable token-protected URL on a cron schedule. - [Request early access](www.feedlab.io/early-access): feedlab is onboarding Shopify merchants in early access.