Catalog raises $3M to build the product data layer for AI commerce. Read the announcement.
All posts
Product Data

Schema drift in product feeds: How to detect and fix

Learn what schema drift means for product feeds, how to detect field and identifier changes, and how to quarantine, repair, and prevent broken listings.

A supplier feed can keep arriving on time while its contract quietly changes. colour becomes color. A numeric price arrives as a formatted string. A variant loses its parent ID. Your importer may show a green status, while a marketplace receives blank attributes or a new, duplicate product.

This is schema drift. It is an unplanned change to the structure or meaning of data that downstream systems expect to stay stable. In product operations, the fix is a governed path from source record to canonical catalog, mapped channel feed, and approved listing.

What schema drift means in a product feed

A product feed is a structured transfer of product records to another system. The receiving system has a contract for field names, types, requiredness, accepted values, identifiers, and relationships. A feed drifts when the producer or destination changes that contract without the integration changing with it.

The product-data path usually looks like this:

Supplier file or API → canonical product record → enrichment and mapping → channel feed → listing or offer

Drift can enter at any point. A supplier can rename a field. A catalog can change a variant model. A channel can add a required attribute. A mapping that once produced a valid output can then produce a partial or invalid one.

Microsoft describes schema drift in data flows as fields, columns, or types being added, removed, or changed on the fly. It also warns that hard-coded transformations are vulnerable to those upstream changes. The same pattern applies to ecommerce feeds, where field names and product relationships drive every downstream transformation. Microsoft’s schema drift guidance explains the general pipeline trade-off.

A simple feed example

Suppose a supplier’s contract starts with this record:

{
  "sku": "JKT-001-NV-M",
  "colour": "navy",
  "price": 148.00,
  "stock_status": "Y",
  "item_group_id": "JKT-001"
}

The next delivery changes the shape:

{
  "sku": "JKT-001-NV-M",
  "color": "navy",
  "price": "$148.00",
  "stock_status": "in_stock"
}

The product has not changed for a shopper. The feed contract has changed in three ways:

  • colour was renamed to color;
  • price changed from a number to a formatted string;
  • item_group_id disappeared;
  • stock_status changed from a source code to a destination-style value.

An importer that maps only the old names can drop color. A strict number parser can reject the price. A variant mapper can lose the parent relationship. A permissive mapper can pass the new value through and leave the destination to interpret it. Each outcome needs an explicit decision.

Why schema drift breaks listings

A feed can be syntactically valid and still be unusable. The failure depends on where the changed field is used.

Drift typeExampleDownstream effect
Added fieldmaterial appears for the first timeSafe if captured and ignored or mapped intentionally; unsafe if automatic mapping exposes unreviewed values
Removed fielditem_group_id is absentVariants can split, duplicate, or lose their parent relationship
Renamed fieldcolour becomes colorThe mapper stops populating the destination field unless the change is mapped
Retyped fieldprice: 148.00 becomes price: "$148.00"Parsing, comparison, or currency checks can fail
Changed requirednessA previously optional image becomes required for a categoryRecords that used to publish are rejected or suppressed
Changed allowed valueY becomes in_stockA channel may treat availability as unknown or invalid
Changed identifier or relationshipSKU or variant IDs are regeneratedExisting products can become duplicates or receive the wrong updates
Changed meaningwaterproof is used for water-resistant productsThe schema passes while product claims become unreliable

The last case is semantic drift. Field names and types can remain unchanged while the meaning of a value changes. That failure is often silent because a parser sees a valid string.

Destination rules add a second source of change. Google Merchant Center publishes typed product attributes, identifier rules, accepted values, and destination-specific requirements in its product data specification. The exact required fields vary by destination, category, country, and offer. A product feed should therefore preserve a stable internal model and generate an output for each channel, rather than treating one channel’s file as the master catalog.

The term gets mixed with several adjacent problems. Keeping them separate makes the response faster.

TermWhat changesHow to handle it
Schema driftAn unplanned change to fields, types, requiredness, relationships, or meaningDetect against a versioned contract, assess impact, then approve a mapping or rollback
Schema evolutionA planned, versioned contract change with a compatibility and rollout planPublish the new contract, update consumers, test fixtures, and migrate deliberately
Value driftValues move outside their normal range or pattern while the structure stays the sameMonitor freshness, ranges, distributions, and business rules
SEO product schema markupStructured markup on a page, such as product properties in HTML or JSON-LDValidate the page markup separately from feed and API contracts

A planned addition to a product model is schema evolution. An unexpected removal in a supplier file is schema drift. A price changing from 148 to 1,480 is value drift if its type and field remain the same. A missing Product JSON-LD property is a structured-data problem, even if the same product also appears in a feed.

How to detect schema drift before publishing

Detection starts with a baseline. Store the expected contract and compare every incoming batch with it before enrichment, mapping, or delivery. A useful baseline records field paths, types, requiredness, cardinality, allowed values, identifier rules, relationship rules, and freshness expectations.

Use four checks for every source and destination.

1. Compare the shape

Diff the incoming sample against the previous accepted version. Look for added, removed, renamed, nested, or reordered fields. Check arrays and objects as well as flat columns. A new field is a signal, even when it is harmless. A missing required field or a changed path should block the affected output until someone owns the decision.

2. Validate types, values, and requiredness

Check more than field names:

  • prices are numeric amounts paired with an explicit currency;
  • availability uses the values the destination accepts;
  • URLs resolve and belong to the expected product or image;
  • IDs are present, unique, stable, and correctly formatted;
  • dimensions and weights include the expected units;
  • category attributes follow the allowed vocabulary;
  • required fields are present for the product’s category and destination.

Catalog’s data validation guide covers the rule layer that catches missing, malformed, stale, and inconsistent product records. Schema checks tell you that a field changed. Validation tells you whether the resulting product can be used.

3. Check identity and relationships

Compare product IDs, variant IDs, parent IDs, item-group IDs, bundle components, and replacement relationships. Then reconcile counts: total products, variants per parent, products with images, and products with current price and availability.

Matching is a contract of its own. Google Merchant Center documents supplemental data sources joined to a primary source by an ID or another selected attribute in its custom matching guidance. If that match key changes from SKU to a regenerated internal ID, the supplemental attributes can attach to the wrong products or to none at all.

4. Test the mapped output

Run representative products through the same mapping used in production. Include a parent with several variants, a product with optional fields, a new category, an out-of-stock item, a bundle, and a record with non-ASCII text. Validate the final channel object, not only the source file.

Google’s attribute rules support draft changes and a test step before applying them to product data. That pattern is useful in any feed workflow: preview the transformation, inspect the affected records, and apply it only after review. Google’s attribute-rules documentation describes the draft and test flow.

A green ingestion job is not proof that the listing is ready. Check the destination’s processing report, acceptance state, warnings, and product-level eligibility after delivery.

Give every drift event an owner

A schema alert without ownership becomes another queue item. Assign the response across the path:

OwnerResponsibility during an event
Source ownerConfirm what changed, when it changed, and whether the new contract is intentional
Catalog or data ownerProtect the canonical model, update normalization and mapping rules, and assess affected records
Channel ownerConfirm destination requirements, listing impact, and replay or resubmission rules
Incident leadSet the publish decision, coordinate communication, and record the contract version that was accepted

Every alert should include the source and feed name, first-seen time, old and new field definitions, affected product and variant counts, downstream destinations, the last known-good run, and a link to the diff. An alert that says “schema changed” forces a manual investigation. An alert that names item_group_id, 18,204 affected variants, and Google Merchant Center as a destination supports a decision.

Classify the change by risk. An optional additive field can usually be captured and reviewed while unaffected fields continue. A missing required field, changed price type, changed identifier, or broken variant relationship deserves quarantine until the owner approves a compatible mapping.

How to recover from active schema drift

When a changed batch is already in the pipeline, optimize for containment and traceability.

  1. Quarantine the unsafe batch. Stop the changed records from overwriting the last known-good output. Keep the raw payload, source version, fetch time, and validation errors.
  2. Measure the blast radius. Identify affected products, variants, categories, locales, and destinations. Compare the new contract with the accepted baseline and find the first run that changed.
  3. Choose a compatibility action. Add an explicit alias, cast a type with a defined currency rule, restore a required source field, or update the contract and mapping as a planned change. Do not map unknown fields by position or guess at identifier relationships.
  4. Backfill and revalidate. Repair the canonical records, then run shape, value, identity, freshness, and destination checks. Keep rejected records with their reason and owner.
  5. Replay deliberately. Replay the corrected batch using the destination’s full-feed or incremental-update semantics. Confirm product-level acceptance, warnings, and page-to-feed consistency after processing.
  6. Close the loop. Record the contract version, source decision, mapping change, affected outputs, and rollback point. Add a fixture so the same drift fails in testing next time.

Preserving the last good output matters. It gives shoppers a stable offer while the team determines whether the new source contract is safe. It also makes rollback possible if the first repair creates a second problem.

Prevent schema drift with contracts and change controls

Prevention is a set of small controls around every integration.

ControlWhat it prevents
Versioned source and destination contractsA change arriving without a known baseline
Field-level ownershipTwo systems silently competing to write price, stock, or attributes
Schema diff on every batchRenames, removals, type changes, and unexpected additions reaching the mapper
Sample-feed fixtures in CIA mapping working for the happy path while failing on variants, bundles, or optional fields
Strict output validationA permissive importer passing an invalid value to a channel
Change notices and a deprecation windowConsumers learning about a breaking change from a failed listing
Quarantine and last-known-good snapshotsBad data overwriting a usable channel output
Reconciliation and freshness checksMissed deletions, stale prices, and partial updates going unnoticed

Permissive ingestion can help a pipeline receive new fields. It also moves type and requiredness decisions later in the flow. Azure’s documentation describes this as a trade-off between flexible, late-bound data and early knowledge of columns and types. Accept unknown fields only when you capture and flag them. Keep downstream writes explicit.

Treat destination changes as contract changes too. Google’s annual specification updates add attributes and change validation or quality requirements over time. Subscribe to the destinations you rely on, keep adapters versioned, and test their outputs before changing production mappings. Google’s 2026 specification update is one current example of why a destination schema needs an owner.

Where Catalog fits

Catalog sits between the systems that hold product facts and the destinations that need structured records. We help teams structure product data, normalize identifiers and variants, map attributes, validate channel readiness, keep live records synchronized, and publish machine-readable product context to AI shopping surfaces.

That makes schema drift a product-data operations problem, not only an integration alert. A field rename can affect a feed, an AI-facing product object, and a marketplace listing at the same time. Catalog’s product data integration guide covers the broader source-to-destination workflow. Its guide to product data syndication covers channel-specific distribution.

Catalog does not replace the source system that owns price or inventory, and it does not override a channel’s current specification. We keep the canonical product data layer and destination mappings visible so a changed contract can be isolated, reviewed, and corrected before it spreads.

Frequently asked questions

What is the difference between schema drift and schema evolution?

Schema evolution is a planned change with a version, compatibility rules, communication, tests, and a rollout path. Schema drift is an unplanned change that reaches a consumer before the consumer has adapted. The same field addition can be evolution in one integration and drift in another, depending on whether the change was governed.

How do you detect schema drift in a product feed?

Compare every incoming feed with a versioned baseline. Check field names and paths, types, requiredness, cardinality, allowed values, identifiers, parent-child relationships, product counts, and freshness. Then run representative records through the destination mapping and inspect processing results before publishing the batch.

What should happen when a required feed attribute disappears?

Quarantine the affected batch or records, preserve the last known-good output, identify the source and first affected run, and alert the source, catalog, and channel owners. Restore the field or approve an explicit replacement in the contract and mapping. Backfill, revalidate, and replay only after the destination output passes its checks.

Is schema drift the same as data drift?

No. Schema drift changes the structure or meaning of a contract. Data drift changes the values or their distribution while the structure stays the same. A price field changing from a number to a string is schema drift. A numeric price moving outside its normal range is data drift. A feed can have both at once.

Keep schema changes from becoming listing failures

A feed integration is ready for change when it can show what changed, who owns the decision, which products are affected, and what will reach each destination. Catalog gives teams a live, normalized product data layer for that work, with validation and channel-ready mappings alongside the source systems they already use.

Book a Catalog discovery call to see how Catalog can keep product data trustworthy as feeds and destinations evolve.