Template
Product feed audit template
None of the pages ranking for this query gives you something to fill in. This one does: a 24-point product data quality checklist grouped into six checks, each with a pass threshold and the way to run it across thousands of rows rather than by eye, plus a tracker CSV to record the result per feed. Where a check can be automated, it says which Textfinity feed hygiene checker does it.
We connect your store, build the feed and keep it in sync. Updated 2026-10-27.
At a glance
- Six check groups: completeness, length, language consistency, value consistency, outliers and URLs. Then three manual groups: identifiers, price and availability, landing pages.
- Thresholds from Google's spec: title 150 characters, description 5,000, id 50, brand 70, custom labels 100; availability in_stock / out_of_stock / preorder / backorder.
- Of 20 feeds Textfinity has profiled, 18 had at least one critical issue, and titles used about 20 of Google's 150 characters on average. Expect findings.
- Audit the output feed, not the store export: the mapping rules are where most problems are introduced or fixed.
The product feed audit template, check by check
Score each check as pass, warn or fail against the threshold, and write the affected row count. The 'How to run it' column says whether a feed hygiene checker does the work or you need a filter or a manual sample.
| # | Check | Pass threshold | How to run it |
|---|---|---|---|
| 1 | Required attributes present | 100% of rows have id, title, description, link, image_link, availability, price | Completeness checker: per-column % filled |
| 2 | Brand present | 100% for new products in categories that need it | Completeness checker |
| 3 | GTIN present or identifier_exists = no | 100% of rows | Completeness checker on gtin; filter: the source barcode column is empty (those rows need identifier_exists = no) |
| 4 | Category present | google_product_category on 95%+ of rows | Completeness checker |
| 5 | Variant attributes on apparel | color, size, gender, age_group, item_group_id on 100% of apparel rows | Completeness checker, filtered to apparel |
| 6 | Title length | 0 rows over 150 characters; fewer than 10% under 30 | Length distribution checker on the output; filter: the source title is shorter than 30 |
| 7 | Description length | 0 rows over 5,000; fewer than 10% under 100 | Length distribution checker |
| 8 | Field length limits | id ≤ 50, brand ≤ 70, custom_label ≤ 100, product_type ≤ 750 | Length distribution checker |
| 9 | One language per feed | 0 rows with mixed-language title or description | Language consistency checker |
| 10 | Consistent value spellings | One spelling per color, size, brand, condition value | Value consistency checker ('Navy', 'navy ', 'NAVY') |
| 11 | Enumerated values valid | availability and condition only use Google's allowed values | Product explorer sample of the mapped values; filter only if the source column already holds Google's values |
| 12 | No outlier values | No rare values in columns that should be uniform (currency, condition, age_group) | Outlier detection checker |
| 13 | Link URLs well formed | 100% start with https and resolve to a product page | URL validation checker; manual sample of 20 |
| 14 | Image URLs well formed | 100% start with https; no placeholder images | URL validation checker; manual sample of 20 |
| 15 | Price format | Number with currency, e.g. 129.99 USD, on 100% of rows | Product explorer sample of the mapped price; filter: the source price does not match regexp ^[0-9]+(\.[0-9]+)?$ |
| 16 | Sale price lower than price | 0 rows where sale_price ≥ price | Filter: compare in a merged check column or sample manually |
| 17 | Availability matches stock | Out-of-stock rows excluded or marked out_of_stock | Filter: the source stock column is equal to 0 (variant.inventoryQuantity on Shopify) |
| 18 | Duplicate ids | 0 duplicate id values | Product explorer search; export and count |
| 19 | Variants grouped | item_group_id shared by all variants of a product | Manual sample of 10 products with variants |
| 20 | Titles carry brand and key attribute | 90%+ of titles start with brand and include type or model | Manual sample of the mapped titles in the product explorer |
| 21 | Descriptions free of promo text and HTML | 0 rows with prices, shipping claims or tags in description | Filter on the source description: matches regexp <[^>]+>|free shipping|% off counts the rows the description rule must clean |
| 22 | Landing page matches feed | Price and availability on page equal the feed in a 20-row sample | Manual sample |
| 23 | Feed freshness | Feed rebuilt after the last source change; channel fetch within 24 hours | Feed sync log; channel fetch time |
| 24 | Channel-specific columns | Required columns for Meta, TikTok Shop, Pinterest present where used | Completeness checker on each channel feed |
Character limits and allowed values from Google's product data specification, checked 2026-10-27. Percent thresholds are working targets, not Google policy.
Why the audit runs on the output feed
A product data quality checklist applied to the store export tells you what the store has. Applied to the feed a channel fetches, it tells you what the channel sees, which is the thing that gets disapproved. The difference is the mapping layer: a combine rule that produced a 190-character title, a currency suffix that was never added, a category lookup with 30 unmatched paths. Audit the feed, trace each failure back to the rule or the source column, and fix it at the source only when it is a source problem.
Textfinity's feed hygiene profile runs the six automated groups (completeness, length distribution, language consistency, value consistency, outlier detection, URL validation) over the whole catalog on each build. The remaining checks are filters you add to a scratch feed, or samples you take in the product explorer. Textfinity does not import Merchant Center diagnostics, so disapprovals still get read in Merchant Center; the audit is what you run before they happen.
Turning a failed check into a fix
Most failures map to one of four fixes. Missing values: a static default (condition = new), a derived value (identifier_exists from gtin), or a merged source for data the store lacks (GTINs, brand). Over-length or thin text: a combine or AI config for titles, remove from regexp for HTML, an AI description (500 to 1,000 characters, accepted in review) for thin descriptions. Inconsistent values: replace from regexp for case and whitespace, replace from Google Sheet for a controlled vocabulary. Bad rows: a filter rule that excludes them until the source is fixed.
Three fixes from the checklist as Textfinity rules
#10 value consistency: color → replace from regexp (?i)^\s*navy\s*$ → Navy
#17 availability: exclude filter: [stock] is equal to "0"
#21 promo in description: description → remove from regexp (?i)free shipping[^.]*\.How often to audit, and what to track
Run the full 24 checks when a feed is created, when the source platform or a mapping rule changes, and before a seasonal campaign. Run the six automated groups on every build, which is what the hygiene profile does by default. The tracker CSV records one row per check per feed with the date, the affected row count and the fix owner, so the second audit shows movement rather than a fresh list.
Two numbers are worth watching between audits: average title length (the profiled average of about 20 characters means most feeds are leaving 130 characters of search matching unused) and the completeness percentage of the three attributes that drive matching, gtin, google_product_category and brand.
Examples
Worked examples, by situation
Three audits, three different failure patterns, and the rule that cleared each.
Color spelled seven ways and titles missing size
Before
color: Navy | navy | NAVY | Navy Blue | navy-blue | Blue Navy | nvy title: Crew Tee (12 characters)
After
color: Navy title: Fieldnote Organic Crew Tee Navy M (34 characters)
How we set it up
Value consistency flagged the seven spellings; we mapped color with replace from google sheet on a 40-row color vocabulary; it replaces substrings row by row, so longer variants (navy-blue, Navy Blue) go above the short ones. Length distribution flagged 1,900 titles under 30 characters; we mapped title as a combine of product.vendor, product.title, the color option and the size option. The title reads the raw color, so it carries the store's spelling until the store itself is cleaned.
Relative image paths and HTML in descriptions
Before
image_link: /wp-content/uploads/vase-01.jpg description: <p>Ceramic vase. <a href="/shipping">Free shipping!</a></p>
After
image_link: https://shop.example/wp-content/uploads/vase-01.jpg description: Ceramic vase.
How we set it up
URL validation flagged 800 relative paths; we gave image_link the prefix https://shop.example. Filter check 21 found 310 descriptions with HTML and promo text; we mapped description with remove from regexp <[^>]+>|Free shipping!.
Empty GTINs, a lowercase 'In Stock' and sold-out rows
Before
gtin: (empty on 1,200 rows) availability: In Stock | in_stock | available stock: 0 on 340 rows marked in_stock
After
identifier_exists: no (on the 1,200 rows) availability: in_stock 340 rows excluded until restocked
How we set it up
Completeness showed gtin at 76%; we wrote identifier_exists as an advanced rule: if [gtin] is empty then "no" else "yes". Outlier detection flagged 'In Stock' and 'available'; availability became replace from regexp (?i)^(in stock|available)$ → in_stock, and an exclude filter drops rows where [stock] is equal to 0.
Copy this plan
Run the audit in an hour
Steps two to five are in Textfinity, where we run them for you; step six is wherever the fix belongs.
01
Download the tracker and pick the feed to audit
One tracker per feed. Audit the feed with the most spend first; the Google Shopping feed for most stores.
02
Connect the source and build the feed
If the feed already exists in Textfinity, skip to step three. Otherwise connect the store and start from the channel template so the column names match the checklist.
What we set up: We connect your store and build the feed from the matching channel template.03
Read the feed hygiene profile
It covers checks 1 to 14 and 24: completeness per column, length distribution against channel limits, language and value consistency, outliers and URL validation. Record the affected counts in the tracker.
What we set up: We run the feed hygiene profile and fill the tracker's counts for you.04
Add filters for the rule-based checks
Checks 3, 6, 15, 17 and 21 use filter rules on source columns; 11 and 20 are samples of the mapped output. Add each as an include rule on a scratch copy of the feed to count matching rows, then delete it. Filters read the source columns, not the mapped output, so point them at the column each rule reads, and check mapped values in the product explorer.
What we set up: We count each check with temporary include filters (is not in list, does not match regexp, is longer than) on a scratch copy of the feed.05
Sample the manual checks in the product explorer
Checks 16, 18, 19 and 22: open ten products with variants and twenty at random, compare the mapped output with the landing page.
What we set up: We pull the sample in the product explorer and compare it with your landing pages.06
Fix in the right place and re-run
Mapping rule for derived problems, merged source for missing data, store edit for genuine source errors. Rebuild and read the hygiene profile again; the tracker now shows the delta.
What we set up: We fix derived problems with mapping rules and missing data with a merged source, and list the store edits for you.
Customization tips
Make it yours
Fix the rule, not the row
A failed check on 300 rows is almost always one rule or one source column. Editing rows in the store feels productive and leaves the rule to fail again on the next import.
Set thresholds you can defend
100% is right for required attributes and URL format. For title length and category coverage, pick the percentage you will actually act on this month and raise it next audit.
Audit every channel feed, not only Google
Meta, TikTok Shop and Pinterest have their own required columns and their own spelling of availability. The same six checker groups run on each feed; check 24 exists so you do not assume Google-clean means channel-clean.
Keep the previous tracker
The value of the second audit is the comparison. Store the CSV with the date in the filename and diff the affected counts.
Downloads
Take the files
FAQ
Questions about product feed audit template
What is a product feed audit?
A structured check of the product data a channel receives: whether required attributes are present, within length limits and using allowed values, whether identifiers and categories are filled, whether prices and availability match the landing page, and whether URLs resolve. The output is a list of failed checks with affected row counts and a fix for each.
What should a product data quality checklist include?
At minimum: completeness of required attributes, length limits (Google: title 150, description 5,000), allowed values for availability and condition, consistent spellings of colors, sizes and brands, valid link and image URLs, price format with currency, GTIN or identifier_exists, variant grouping, and a sample comparison against the landing page.
How often should I audit a product feed?
Fully when the feed is created, when a mapping rule or source platform changes, and before seasonal campaigns. The automated checks (completeness, length, consistency, URLs) should run on every rebuild; Textfinity's feed hygiene profile does that by default.
Can a feed audit replace Merchant Center diagnostics?
No. The audit catches data problems before upload; Merchant Center diagnostics report what Google actually disapproved, including policy issues no data check can predict. Use both. Textfinity does not import Merchant Center diagnostics, so read them in Merchant Center after each fetch.
Set up for you
Have the 24 checks run on your own feed.
Send us your store or feed URL. We build the feed from the channel template, run the audit and fix what the rules can fix; the completeness, length, consistency and URL checks then run on every build.
Tell us your store and channels. We reply within 24 hours.