Open product methodology
Know exactly what the result means.
FeedGuardrail exposes its release identity, deterministic rule coverage, processing boundaries, and evidence format so a result can be inspected instead of taken on faith.
Processing model
From file to actionable report
1
Read locally
Your selected feed is read in browser memory. The file is not sent to FeedGuardrail.
2
Normalize safely
Headers and supported CSV, TSV, RSS/XML, and Atom/XML records are converted into a consistent local model.
3
Run versioned rules
The google-merchant-online-product-data-2026-09-09.1 ruleset evaluates product rows and cross-feed relationships deterministically.
4
Test declared intent
Actual changed fields and product counts are compared with the portable change contract selected for the release.
5
Gate and export
The contract and safety policy decide pass, review, or block; separate evidence and operator-ledger exports preserve the decision and normalized field changes.
Supported inputs: CSV, TSV, RSS/XML, Atom/XML · up to 100,000 product rows, 500 columns, and 25 MB per selected file. A desktop-class device is recommended for large catalogs; practical capacity varies with file width, browser, and available memory.
build_to_order receives a contextual review warning rather than a false unsupported-value error.Intent and safety controls as data
A decision you can inspect, edit, save, and rerun.
FeedGuardrail 1.3.0 separates what the release is intended to change from what must remain safe. Both controls can be edited or loaded as strict JSON, then travel with evidence format v3 so another person can rerun the exact decision.
Strict production
Zero removals, large price changes, warnings, or in-stock drops.
Balanced operations
Small bounded changes are allowed; material integrity risks still block.
Observe broad changes
Wider planned refreshes are allowed while core blockers stay active.
Declared change contract
Content correction, price or promotion, availability sync, and broad-refresh profiles define allowed fields and maximum changed, added, and removed products. A contract can name every supported feed column—up to 500 fields—or use * alone for a genuinely unrestricted refresh. Unexpected scope can require review or block the release even when every changed value is individually valid.
Rule catalog
49 sourced deterministic checks
Every rule names its platform basis, local detection coverage, applicability, primary source, and known limitation. This separates Google’s published requirements from FeedGuardrail’s operational judgment.
required-id
Missing product ID
- Field and scope
- id · product row
- Applies when
- Every in-scope online product.
- Local detector
- Products without a stable identifier.
Primary source:G-ID · ID [id]
id-limit
Product ID exceeds 50 characters
- Field and scope
- id · product row
- Applies when
- Every submitted id.
- Local detector
- Product identifiers beyond Google’s supported length.
Primary source:G-ID · ID [id]
id-characters
Product ID contains unsupported characters
- Field and scope
- id · product row
- Applies when
- Every submitted id.
- Local detector
- Unicode control, format, private-use, surrogate, or unassigned characters that can make product identity unstable.
- Known limitation
- Local Unicode-category screening cannot prove how every downstream source normalizes or preserves the identifier.
Primary source:G-ID · ID [id]
required-title
Missing title
- Field and scope
- title / structured_title · product row
- Applies when
- Every product; either title or structured_title satisfies presence.
- Local detector
- Products without either a plain or structured title.
- Known limitation
- Structured-title subattributes and digital-source declarations are not semantically validated.
Primary sources:G-TITLE · Title [title] and structured title [structured_title]G-PDS · Product data specification
title-limit
Title exceeds 150 characters
- Field and scope
- title · product row
- Applies when
- A plain title is submitted.
- Local detector
- Plain titles beyond the supported length.
- Known limitation
- Structured-title content length is not independently parsed.
Primary source:G-TITLE · Title [title] and structured title [structured_title]
title-front-load
Title may hide important details
- Field and scope
- title · product row
- Applies when
- A plain title exceeds 70 characters.
- Local detector
- Long titles whose useful attributes may be truncated in placements.
- Known limitation
- Length alone cannot establish whether decisive attributes are actually hidden.
Primary source:G-TITLE · Title [title] and structured title [structured_title]
title-editorial
Title may violate editorial guidance
- Field and scope
- title · product row
- Applies when
- A plain title is submitted.
- Local detector
- Heavy capitalization or a limited set of common promotional phrases.
- Known limitation
- The phrase list and capitalization ratio can miss violations or flag legitimate acronym-heavy titles.
Primary source:G-TITLE · Title [title] and structured title [structured_title]
required-description
Missing description
- Field and scope
- description / structured_description · product row
- Applies when
- Every product; either description or structured_description satisfies presence.
- Local detector
- Products without either a plain or structured description.
- Known limitation
- The local warning reflects Google’s documented limited-performance consequence; structured subattributes are not semantically validated.
Primary sources:G-DESC · Description [description] and structured description [structured_description]G-PDS · Product data specification
description-limit
Description exceeds 5,000 characters
- Field and scope
- description · product row
- Applies when
- A plain description is submitted.
- Local detector
- Plain descriptions beyond the supported length.
- Known limitation
- Structured-description content is not independently parsed.
Primary source:G-DESC · Description [description] and structured description [structured_description]
required-link
Missing landing-page link
- Field and scope
- link · product row
- Applies when
- Every product.
- Local detector
- Products without a destination URL.
Primary source:G-LINK · Link [link]
invalid-link
Invalid landing-page URL
- Field and scope
- link · product row
- Applies when
- A link is submitted.
- Local detector
- Destination values that are not complete HTTP or HTTPS URLs.
- Known limitation
- A local parser cannot prove domain ownership, crawlability, redirect behavior, page usability, or product consistency.
Primary source:G-LINK · Link [link]
link-format-limit
Landing-page URL exceeds channel format limits
- Field and scope
- link · product row
- Applies when
- A link is submitted.
- Local detector
- Product links with non-ASCII URL characters or more than 2,000 characters.
- Known limitation
- ASCII and length are checked; raw RFC 3986 compliance and downstream normalization are not fully proven.
Primary source:G-LINK · Link [link]
required-image
Missing primary image link
- Field and scope
- image_link · product row
- Applies when
- Every product.
- Local detector
- Products without a primary image URL.
Primary source:G-IMAGE · Image link [image_link]
invalid-image
Invalid image URL
- Field and scope
- image_link · product row
- Applies when
- An image_link is submitted.
- Local detector
- Image values that are not complete HTTP or HTTPS URLs.
- Known limitation
- The target is not fetched, so media type, crawlability, stability, dimensions, and policy compliance remain unknown.
Primary source:G-IMAGE · Image link [image_link]
image-format-limit
Image URL exceeds channel format limits
- Field and scope
- image_link · product row
- Applies when
- An image_link is submitted.
- Local detector
- Primary image links with non-ASCII URL characters or more than 2,000 characters.
- Known limitation
- This is a local URL-envelope check only.
Primary source:G-IMAGE · Image link [image_link]
mobile-link-format
Invalid mobile landing-page URL
- Field and scope
- mobile_link · product row
- Applies when
- Optional mobile_link is present.
- Local detector
- Submitted mobile destinations outside the supported URL and length envelope.
- Known limitation
- The mobile page is not fetched or compared with the product.
Primary source:G-MOBILE · Mobile link [mobile_link]
additional-image-format
Invalid additional image list
- Field and scope
- additional_image_link · product row
- Applies when
- Optional additional_image_link is present.
- Local detector
- Malformed additional-image URLs or lists containing more than ten values.
- Known limitation
- URLs are checked locally; image contents, crawlability, and all repeated-field encoding cases are not proven.
Primary source:G-ADDIMAGE · Additional image link [additional_image_link]
video-link-format
Invalid product video URL list
- Field and scope
- video_link · product row
- Applies when
- Optional video_link is present.
- Local detector
- Malformed video URLs or lists containing more than ten values.
- Known limitation
- URLs and count are checked, but format, direct-file behavior, crawlability, duration, size, resolution, and aspect ratio are not.
Primary source:G-VIDEO · Video link [video_link]
availability-enum
Missing or unsupported availability
- Field and scope
- availability · product row
- Applies when
- Standard online products.
- Local detector
- Standard online-product availability outside the documented vocabulary.
- Known limitation
- Product-program context is not inferred; Vehicle ads build_to_order is handled as a separate review warning.
Primary source:G-AVAIL · Availability [availability]
vehicle-availability-context
Vehicle-only availability needs review
- Field and scope
- availability · product row
- Applies when
- availability is build_to_order.
- Local detector
- build_to_order values whose Vehicle ads context cannot be established locally.
- Known limitation
- The file alone cannot establish enrollment in or eligibility for Vehicle ads.
Primary source:G-AVAIL · Availability [availability]
availability-date-required
Missing availability date
- Field and scope
- availability_date · product row
- Applies when
- availability is preorder or backorder.
- Local detector
- Preorder or backorder products without an availability date.
Primary sources:G-AVAIL · Availability [availability]G-AVAILDATE · Availability date [availability_date]
availability-date-format
Invalid availability date
- Field and scope
- availability_date · product row
- Applies when
- availability_date is present.
- Local detector
- Availability dates outside the supported ISO 8601 envelope.
- Known limitation
- Syntax is checked, but landing-page visibility and the maximum future horizon are not.
Primary sources:G-AVAILDATE · Availability date [availability_date]G-DATE · Format date and time
price-format
Missing or invalid price
- Field and scope
- price · product row
- Applies when
- Every product.
- Local detector
- Prices without a non-negative number and recognized ISO 4217 currency code.
- Known limitation
- Syntax and a versioned recognized-currency set are checked; target-country support, page equality, checkout equality, and program context are not.
Primary sources:G-PRICE · Price [price]G-CURRENCY · Supported languages and currencies
price-rounding
Price precision will be rounded
- Field and scope
- price / sale_price · product row
- Applies when
- price or sale_price has more than two decimal places.
- Local detector
- Price values carrying more than two decimal places.
- Known limitation
- FeedGuardrail warns before Google’s documented rounding; it does not predict the displayed rounded value in every currency context.
Primary sources:G-PRICE · Price [price]G-SALE · Sale price [sale_price]
zero-price-context
Zero price needs program review
- Field and scope
- price / sale_price · product row
- Applies when
- price or sale_price equals zero.
- Local detector
- Zero prices whose documented contract or subscription exception cannot be established locally.
- Known limitation
- The local file cannot establish a qualifying device-contract or physical-subscription program.
Primary sources:G-PRICE · Price [price]G-SALE · Sale price [sale_price]
sale-price
Invalid sale price
- Field and scope
- sale_price · product row
- Applies when
- Optional sale_price is present.
- Local detector
- Sale prices with invalid syntax, mismatched currency, or an amount not below regular price.
- Known limitation
- The local check cannot prove promotion timing, landing-page display, checkout price, or program-specific zero-price eligibility.
Primary sources:G-SALE · Sale price [sale_price]G-PRICE · Price [price]
sale-date-format
Invalid sale price effective date
- Field and scope
- sale_price_effective_date · product row
- Applies when
- Optional sale_price_effective_date is present.
- Local detector
- Sale windows without two ordered ISO 8601 dates or date-times.
- Known limitation
- The ordered ISO envelope is checked; promotion eligibility and live behavior are not.
Primary sources:G-SALEDATE · Sale price effective date [sale_price_effective_date]G-DATE · Format date and time
expiration-date-format
Invalid expiration date
- Field and scope
- expiration_date · product row
- Applies when
- Optional expiration_date is present.
- Local detector
- Expiration values outside supported ISO 8601 date formats.
- Known limitation
- Syntax is checked; the maximum future horizon is not evaluated to preserve rerun determinism.
Primary sources:G-EXPIRY · Expiration date [expiration_date]G-DATE · Format date and time
condition-enum
Unsupported condition
- Field and scope
- condition · product row
- Applies when
- condition is supplied; it is contextually required for used or refurbished products.
- Local detector
- Submitted conditions outside the general online-product vocabulary.
- Known limitation
- Missing condition and Vehicle-ad-specific context cannot be inferred from arbitrary feeds.
Primary source:G-CONDITION · Condition [condition]
adult-boolean
Invalid adult-content flag
- Field and scope
- adult · product row
- Applies when
- adult is supplied.
- Local detector
- Adult flags outside yes, true, no, or false.
- Known limitation
- The tool cannot determine whether an unlabeled product contains adult content.
Primary source:G-ADULT · Adult [adult]
bundle-boolean
Invalid bundle flag
- Field and scope
- is_bundle · product row
- Applies when
- is_bundle is supplied.
- Local detector
- Bundle flags outside yes, true, no, or false.
- Known limitation
- The tool cannot determine whether an unlabeled offer is a merchant-defined bundle.
Primary source:G-BUNDLE · Bundle [is_bundle]
multipack-format
Invalid multipack quantity
- Field and scope
- multipack · product row
- Applies when
- multipack is supplied for a retailer-defined multipack.
- Local detector
- Multipack quantities that are not positive whole numbers.
- Known limitation
- The tool cannot distinguish retailer-defined from manufacturer-defined packs or detect every missing attribute.
Primary source:G-MULTIPACK · Multipack [multipack]
age-group-enum
Unsupported age group
- Field and scope
- age_group · product row
- Applies when
- age_group is supplied; requiredness varies by product and target country.
- Local detector
- Submitted age-group values outside Google’s vocabulary.
Primary source:G-AGE · Age group [age_group]
gender-enum
Unsupported gender value
- Field and scope
- gender · product row
- Applies when
- gender is supplied; requiredness varies by product and target country.
- Local detector
- Submitted gender values outside Google’s vocabulary.
Primary source:G-GENDER · Gender [gender]
size-system-enum
Unsupported size system
- Field and scope
- size_system · product row
- Applies when
- Optional apparel size_system is supplied.
- Local detector
- Submitted size systems outside Google’s country and region codes.
Primary source:G-SIZESYSTEM · Size system [size_system]
size-type-enum
Unsupported size type
- Field and scope
- size_type · product row
- Applies when
- Optional apparel size_type is supplied.
- Local detector
- Size-type values or repetitions outside Google’s vocabulary.
Primary source:G-SIZETYPE · Size type [size_type]
product-type-limit
Product type exceeds repetition or length limits
- Field and scope
- product_type · product row
- Applies when
- Optional product_type is supplied.
- Local detector
- More than five merchant hierarchies or any hierarchy beyond 750 characters.
- Known limitation
- Common comma-separated repetitions are checked; every possible quoted repeated-field encoding is not reconstructed.
Primary source:G-PRODUCTTYPE · Product type [product_type]
custom-label-limit
Custom label exceeds 100 characters
- Field and scope
- custom_label_0 … custom_label_4 · product row
- Applies when
- A custom_label_0 through custom_label_4 value is supplied.
- Local detector
- Campaign-segmentation labels beyond the supported length.
- Known limitation
- The account-wide unique-value limit cannot be established from one selected file.
Primary source:G-CUSTOMLABEL · Custom label 0–4 [custom_label_0–4]
shipping-weight-format
Invalid shipping weight
- Field and scope
- shipping_weight · product row
- Applies when
- Optional shipping_weight is supplied.
- Local detector
- Shipping weights outside documented units or upper bounds.
- Known limitation
- Syntax and published upper bounds are checked; carrier configuration and contextual requiredness are not.
Primary source:G-SHIPWEIGHT · Shipping weight [shipping_weight]
identifier-boolean
Unrecognized identifier_exists value
- Field and scope
- identifier_exists · product row
- Applies when
- Optional identifier_exists is supplied.
- Local detector
- Identifier flags outside yes, true, no, or false.
Primary source:G-IDEXISTS · Identifier exists [identifier_exists]
identifier-incomplete
Product identifiers look incomplete
- Field and scope
- gtin / brand / mpn · product row
- Applies when
- The product is not explicitly marked as having no assigned identifiers.
- Local detector
- Products that may be missing the identifier combination expected for their context.
- Known limitation
- Expected combinations depend on category, condition, manufacturer status, and whether identifiers were assigned.
Primary sources:G-UPI · About unique product identifiersG-IDEXISTS · Identifier exists [identifier_exists]G-GTIN · GTIN [gtin]G-PDS · Product data specification
invalid-gtin
Malformed GTIN
- Field and scope
- gtin · product row
- Applies when
- One or more GTIN values are supplied.
- Local detector
- GTINs with an unsupported length or failed check digit.
- Known limitation
- Length and check digit are checked; restricted prefixes, coupon ranges, allocation status, and packaging-level restrictions are not.
Primary sources:G-GTIN · GTIN [gtin]G-UPI · About unique product identifiers
duplicate-id
Duplicate product ID
- Field and scope
- id · whole feed
- Applies when
- Distinct rows in the selected file.
- Local detector
- A product ID used by more than one row in the selected file.
- Known limitation
- Uniqueness across other active sources and historical ID reuse are outside a local-file check.
Primary source:G-ID · ID [id]
case-variant-id
Product IDs differ only by casing
- Field and scope
- id · whole feed
- Applies when
- IDs in the selected file differ only by casing.
- Local detector
- IDs that become ambiguous when case is ignored.
Primary source:G-ID · ID [id]
mixed-currency
Multiple currencies in one feed
- Field and scope
- price · whole feed
- Applies when
- The selected file contains more than one parsed currency.
- Local detector
- Catalogs that may contain accidentally combined regional prices.
- Known limitation
- Google does not prohibit every mixed-currency feed; legitimate multi-country and conversion workflows exist.
Primary sources:G-CURRENCY · Supported languages and currenciesG-MULTICOUNTRY · Shopping ads and free listings in multiple countriesG-PRICE · Price [price]
single-variant-group
Variant group contains one product
- Field and scope
- item_group_id · whole feed
- Applies when
- An item_group_id appears once in the selected file.
- Local detector
- A group represented by only one row in the selected file.
- Known limitation
- Sibling variants may be inactive, filtered, or supplied through another source.
Primary source:G-ITEMGROUP · Item group ID [item_group_id]
item-group-limit
Item group ID exceeds 50 characters
- Field and scope
- item_group_id · product row
- Applies when
- item_group_id is supplied.
- Local detector
- Variant-group identifiers beyond the supported length.
Primary source:G-ITEMGROUP · Item group ID [item_group_id]
item-group-self
Product ID equals item group ID
- Field and scope
- id / item_group_id · product row
- Applies when
- id equals item_group_id.
- Local detector
- A child offer identifier reused as its shared group identifier.
- Known limitation
- Equality is a strong semantic warning, not a separately documented syntax rejection.
Primary source:G-ITEMGROUP · Item group ID [item_group_id]
duplicate-variant
Duplicate variant attributes
- Field and scope
- item_group_id / color / size / material / pattern / age_group / gender / variant_option · whole feed
- Applies when
- Multiple rows share item_group_id and populated standard or structured variant dimensions.
- Local detector
- Products in one group that share the same populated standard or structured variant dimensions.
- Known limitation
- The signature covers color, size, material, pattern, age_group, gender, and raw variant_option; it cannot prove every custom dimension or landing-page choice.
Primary sources:G-DUPVARIANT · How to fix: Duplicate variantG-ITEMGROUP · Item group ID [item_group_id]G-VARIANTOPTION · Variant option [variant_option]
Reproducible evidence
A comparison record another person can rerun.
Release Gate evidence v3 records the exact input-file SHA-256 hashes, declared change contract, ruleset, safety policy, pass/review/block checks, issue outcomes, field drift, price and availability movement, identity risk, and inventory/schema changes. A recipient can load that evidence with both exact files and reproduce the decision locally.
Exact inputs
Two SHA-256 hashes bind the record to the baseline and candidate file bytes.
Stable decision logic
The evidence names the versioned ruleset and embeds the exact validated change contract and safety policy.
Privacy minimized
Filenames and product IDs are excluded by default; no feed rows or raw row-level values are embedded.
Unsigned evidence: hashes prove a byte-for-byte match to recorded inputs, and the local rerun checks reproducibility. The versioned evidence-v3 HTML is checked against its canonical embedded record, but the pack is not a digital signature, certification, authorship proof, proof of prior authorization, proof that it is the original export, or guarantee of Google approval. Its timestamp and optional filename labels are self-reported metadata. Someone holding both feeds can generate a different internally consistent pack with different controls.
Separate operator change ledger
A local CSV lists normalized before/after values for uniquely matched product-field changes, product membership changes, and explicit comparison-ambiguity records with critical, review, or informational risk. It is spreadsheet-formula protected and deliberately separate from privacy-minimized shareable evidence.
Primary specification sources
Each rule above links directly to the official Google page used for its classification and records the review date. Google can change its specifications; a dated source review is stronger than an unsourced claim but does not make FeedGuardrail affiliated with Google or guarantee channel approval. FeedGuardrail’s release contracts and safety thresholds remain its own operational controls.
Honest boundaries
What local checks cannot prove
- Landing-page price or availability parity
- Live image crawlability or image-content policy
- Merchant Center account, policy, or diagnostics state
- Approval, traffic, revenue, or advertising performance
Inspect it, then use it.
Run the built-in samples before selecting a real feed. No account or ad-platform connection is required.