Guide
Product feed hygiene
Product feed hygiene is the routine of checking catalog data for the faults channels punish: empty required fields, titles over the limit, mixed languages, the same color spelled four ways, typos hiding in uniform columns, and broken links. Textfinity profiles a catalog with six checkers, each aimed at one of those faults, so you see the problem as a column-level number before Google or Meta turns it into disapprovals.
We connect your store, build the feed and keep it in sync. Updated 2026-10-27.
At a glance
- Field completeness: the share of products with a value in each column, so an empty gtin or brand shows up as a percentage, not a surprise.
- Length distribution: values over channel limits, such as Google's 150-character title.
- Language consistency: mixed languages inside a text field. Value consistency: spelling variants of one value (Navy, navy , NAVY).
- Outlier detection: rare values in otherwise uniform columns. URL validation: malformed links and image URLs.
- On the feeds we have profiled, 18 of 20 had at least one critical data issue, and the average title used about 20 of Google's 150 characters.
Why product feed hygiene comes before optimization
Title rewrites and custom labels only help products that are eligible to show. A feed with a 60% filled GTIN column, links missing https:// or a color column with eleven spellings of black loses visibility before any optimization starts, and the channel reports it per product, after the fact. A hygiene check reports it per column, before the feed is fetched.
Hygiene is also the part of product data quality in ecommerce that does not need judgment. Whether a title is persuasive is a matter of taste; whether 312 titles are empty is not. Automating the measurable part leaves your time for the part that needs a person.
The six hygiene checks, with before and after
| Checker | What it catches | Before | After (fixed by) |
|---|---|---|---|
| Field completeness | Share of products with a value per column | gtin filled on 58% of products | gtin 97%: merged source of supplier EANs joined on SKU |
| Length distribution | Values over channel limits or suspiciously short | title 6 to 212 chars, avg 22 | title 48 to 148: combine brand, type, color, size; AI title for stubs |
| Language consistency | Mixed languages in a text field | description: 81% German, rest English | 100% German: AI config translates the English rows |
| Value consistency | Spelling variants of one value | color: Navy / navy / NAVY / Navy Blue | color: Navy: replace from google sheet lookup |
| Outlier detection | Rare values in a uniform column | condition: new x 2,394, nwe x 3 | condition: new: add static value |
| URL validation | Malformed links and image URLs | image_link: //cdn.shop.com/vase.jpg | https://cdn.shop.com/vase.jpg: replace from regexp ^// with https:// |
Rows are illustrative of what each checker reports; the fixes are Textfinity mapping transforms.
Reading a hygiene report
Start with completeness on the columns your channel requires: id, title, description, link, image_link, price, availability, and the identifiers. A required column under 100% is the shortest route to disapprovals. Then read length: Google truncates titles over 150 characters, and Meta allows 200 but shows far fewer in most placements, so very short titles are a missed opportunity as much as long ones are a fault.
Value consistency and outliers usually point at the same root cause: free-text fields typed by hand. Fix them with a lookup that normalizes the variants, not by editing products one at a time, so the next import is normalized too. Language consistency matters only for feeds that promise one language, which in Merchant Center is all of them.
What a hygiene check is not
- It is not Merchant Center diagnostics. Textfinity does not import Google's disapprovals; hygiene finds the data faults behind many of them, before submission.
- It is not a policy review. Restricted products, landing page problems and image overlays are outside what a data profile can see.
- It does not change data on its own. Every fix is a mapping rule or filter you choose, applied on the next rebuild.
- It is not a one-off audit. Run it again after each import or supplier change, because new products bring new faults.
Examples
Worked examples, by situation
Four catalogs, four different hygiene findings, four fixes.
Eleven spellings of one color
Before
color: Black, black, BLACK, Blk, Black , Jet Black, Noir ...
After
color: Black (Jet Black kept as a separate shade)
How we set it up
Value consistency lists the variants with counts. We map color with replace from google sheet, with each variant in column A and the canonical color in column B. Column A is matched as a substring, so list whole variants (BLACK, Blk, Noir) and leave Jet Black out of the sheet. The same sheet catches new variants as merchandisers add them.
GTIN column 58% complete
Before
gtin: (empty) on 588 products supplier file: SKU;EAN for 560 of them
After
gtin filled on 1,372 of 1,400 28 products: identifier_exists = no
How we set it up
Field completeness flags gtin. We join the supplier file as a merged source on SKU and map gtin as a rename of the merged column, with a conditional rule keeping the store's own barcode first. The 28 own-brand items get identifier_exists no.
English descriptions inside a German catalog
Before
description (DE feed): Wasserdichte Jacke mit ... description: Waterproof shell with taped seams ...
After
description: Wasserdichte Hardshell-Jacke mit getapten Nähten ...
How we set it up
Language consistency shows 19% English rows in description. We set up an AI config that translates description into German, and map description with replace from AI config, the original as fallback until generations are accepted.
Relative image paths and a typo in condition
Before
image_link: /wp-content/uploads/vase-1.jpg condition: nwe
After
image_link: https://shop.example/wp-content/uploads/vase-1.jpg condition: new
How we set it up
URL validation flags the relative paths; outlier detection flags nwe among 257 new. We map image_link with add prefix https://shop.example and set condition as a static value new, since the store sells only new goods.
Copy this plan
Plan: a product feed hygiene routine
Run it once now, then after every import that changes many products.
01
Connect the source
Shopify natively, or a CSV or Google Shopping-shaped XML export by URL or SFTP, or a Google Sheet. The catalog is profiled once it is processed.
What we set up: We connect your source and let Textfinity profile the catalog once it is processed.02
Run the first hygiene check
Read the six checkers in order: completeness, length, language, value consistency, outliers, URLs.
What we set up: We run the first hygiene check and walk you through the findings, required columns first.03
Fix required columns first
Anything a channel requires and that is under 100% complete. Join missing data from a merged source or map it from another column.
What we set up: We fill each gap with rename, combine or a static value, or join the missing data from a merged source.04
Normalize variants with a lookup
One Google Sheet per messy column (color, material, gender) beats per-product edits. Each column A value is replaced wherever it appears inside the value, so keep the entries specific.
What we set up: We map each messy column with replace from google sheet, from a lookup sheet your team can keep editing.05
Guard what cannot be fixed yet
Exclude products with no image or no title until the data exists.
What we set up: We add exclude filters with is blank and is shorter than on the source image and title columns (filters read the source, not the mapped feed).06
Re-run and compare
Run a new check after the next sync and compare it with the first one, column by column.
What we set up: We re-run the hygiene check after the next sync and send you what changed.
Customization tips
Make it yours
Fix in the feed, report upstream
A mapping rule fixes the channel today; the store or supplier data stays dirty. Send the variant list to whoever owns the source as well, or the sheet keeps growing.
Not every outlier is an error
A rare value in a uniform column is a signal, not a verdict: refurbished among thousands of new may be correct. Check the samples before writing a rule that overwrites them.
Short titles are a hygiene problem too
Most profiled titles use a fraction of Google's 150 characters. A length check that only looks for overflow misses the bigger loss: titles too thin to match the searches people make.
Profile the feed, not only the store
Rules can introduce faults: a combine with an empty field leaves a trailing comma, a prefix doubles https://. Check the feed output as well as the source.
FAQ
Questions about product feed hygiene
What is product feed hygiene?
The routine of checking product data for measurable faults before a channel sees it: missing values, values over length limits, mixed languages, inconsistent spellings, rare outlier values and malformed URLs. It is the automatable part of product data quality.
How do I check the data quality of an ecommerce product feed?
Profile each column: the share filled, the length range against channel limits, the languages used, the distinct values and their variants, and whether URLs are well formed. Textfinity runs these six checks on a connected catalog and reports them per column.
Does a hygiene check replace Merchant Center diagnostics?
No. Merchant Center reports what Google rejected, per product, after submission. A hygiene check finds data faults per column before submission. Textfinity does not import Merchant Center diagnostics, so use both.
How often should I run a product feed audit?
After every import that changes many products, after a supplier changes its file, and before launching a new channel or market. New products bring new faults even when old ones are fixed.
Set up for you
We'll find your catalog's data faults before Google does.
Send us your store URL. We run the six hygiene checks on your catalog, go through the findings with you and fix each one with a mapping rule that applies on every rebuild.
Tell us your store and channels. We reply within 24 hours.