Social Commerce

Facebook Catalog Feed Errors: What Each One Means and How to Fix It

Facebook catalog feed errors explained: fatal vs warning, fixes for price, availability, image and duplicate ID errors, plus a pre-upload validator script.

Photo de profil de Long Nguyen

Long Nguyen

Développeur fullstack · Ingénieur IA · Chercheur

• • 4 min de lecture •

Fatal vs warning: which Facebook catalog feed errors block your products

Meta's API sorts every upload error into one of two severities. A fatal error means the affected item is not created. A warning means the item is created anyway and the error is informational.

The detail most people miss: fatal errors are handled per row. According to Meta's product feed upload errors reference, the products in the same file that have no errors are still created even when other rows are fatal.

That has a practical consequence. If a handful of products are missing, look for row-level fatal errors. If every product is missing, you almost certainly have a systematic problem, such as a wrong column name or a column mapped to the wrong attribute, which makes every row fatal at once.

A warning does not mean the item is correct. It only means the item exists. I treat price warnings as blockers anyway, because a live product with a misread price does more damage in an ad than a missing product does.

Where to find Facebook catalog feed errors

In Commerce Manager, start with the catalog's Issues tab for item-level problems and the data source's upload history for the result of each feed run. That is enough for a small catalog. For anything larger, the API gives you exact rows and columns.

What you need Call What comes back
Recent upload sessions GET /{feed-id}/uploads Upload session IDs
Errors for one upload GET /{upload-id}/errors summary, description, severity, row_number, column_number, id, plus a total count
Only the blocking errors error_priority=HIGH on the same call Fatal errors only. MEDIUM and LOW return the warnings
A downloadable list POST /{upload-id}/error_report A CSV once the status reaches WRITE_FINISHED. Reports older than 30 days show ERROR_REPORT_OUTDATED
Suggested fixes GET /{error-id}/suggested_rules Automated rule recommendations for that error
curl -G "https://graph.facebook.com/v26.0/UPLOAD_ID/errors" \
  -d "error_priority=HIGH" \
  -d "access_token=YOUR_TOKEN"

Use whatever Graph API version is current when you run it. The docs example at the time of writing used v26.0. The value of row_number and column_number is that you can go straight to the cell instead of hunting for the bad product by eye.

The most common feed errors and how to fix each one

Most feed errors trace back to a small set of required fields. The formats below come from Meta's catalog field reference.

Symptom Usual cause Fix
Price Without Currency (warning) Price exported as 9.99 or 45$ Number, a space, then a 3-letter ISO code: 9.99 USD. Use a period as the decimal separator, never a comma
Invalid availability value Platform exports InStock, in_stock or a translated word Use exactly in stock or out of stock. Out-of-stock items are valid and show as sold out in shops
Invalid condition value Blank, or a localized word such as Neu Use new, refurbished or used
Duplicate ID Parent product ID used on every variant, or the same SKU listed twice Each content ID must appear once in the catalog, max 100 characters. Use the variant SKU, not the parent
Image rejected or not updating Wrong format, too small, too large, or the file was replaced at the same URL JPEG or PNG, at least 500 x 500 pixels, under 8 MB. A changed image must use a new URL
Invalid link Missing protocol, a redirect to a Facebook domain, or a staging URL Start with http:// or https:// and point to the real product page on your own domain
Description problems HTML tags, all capital letters, or links inside the text Plain text only, up to 9,999 characters, no links, no shouting
Title problems Title longer than 200 characters, or identical to the description Keep it specific and different from the description. Meta recommends 65 characters or fewer
Missing size (fatal for Shop) Apparel or shoes exported without size Size is conditional: it is required for Shop sales in categories like clothing and shoes. Write it with spaces, for example US 12
Group Mismatch for Property (fatal) Meta lists it as a fatal error; the docs page names it without explaining it In my reading it points to variants grouped together with inconsistent property data. Check how item_group_id groups your variants

Two of these hide in plain sight. Price and availability errors are almost always a formatting problem in the export, not in the store data. Fix the export template once and the whole class of error disappears. Duplicate IDs are the opposite: they come from how the store models variants, so patching the file only hides the problem until the next sync.

How to fix feed errors in bulk with data feed rules

When you cannot change the source, Commerce Manager can rewrite values during ingestion. Meta's feed troubleshooting documentation describes three rule types.

  • Mapping rules correct an attribute name, for example a misspelled column that Meta reads as a different field.
  • Value mapping rules translate unrecognized values: InStock to in stock, 45$ to 45.00 USD, Neu to new.
  • Letter case rules normalize text, for example turning an all-caps title into capitalized text.

The API path is to read the errors for an upload, then call the suggested-rules endpoint for an error ID to get a recommended rule.

My rule of thumb: fix at the source whenever you control the feed generator, and use feed rules when the feed comes from a plugin or platform you cannot modify. Rules work, but they are invisible logic. Six months later nobody remembers that a rule is rewriting availability, and the day the source changes format the rule quietly stops matching. If you run several feeds across channels, this is exactly the sort of drift that product feed management is meant to remove: one clean feed template, then per-channel output.

Products still missing or not matching after a clean upload

An upload with no fatal errors can still leave you with a catalog that does not work in ads. The usual reason is an ID mismatch, not a formatting error.

Meta's guidance for missing catalog items comes down to three checks:

  1. The content IDs in your Pixel or app events match the IDs in the feed.
  2. The Pixel is associated with the catalog.
  3. The item actually exists in the feed.

The classic failure is a store that sends the parent product ID in Pixel events while the feed uses variant SKUs. Every event then points at an ID that does not exist in the catalog. Decide on one ID scheme, apply it to the feed and the events, and check it with a few real product pages before you trust any dynamic ad.

Validate your feed before Meta does

Catching errors before upload saves a failed run and the wait for the next scheduled fetch. This script checks a CSV feed against the rules from the field reference above. It has no dependencies.

import csv
import re
import sys
from collections import Counter

PRICE = re.compile(r'^\d+(\.\d+)?\s[A-Z]{3}$')
AVAILABILITY = {'in stock', 'out of stock'}
CONDITION = {'new', 'refurbished', 'used'}


def check(path):
    with open(path, newline='', encoding='utf-8') as f:
        rows = list(csv.DictReader(f))

    id_counts = Counter(r.get('id', '').strip() for r in rows)
    problems = []

    for line, r in enumerate(rows, start=2):  # line 1 is the header
        pid = r.get('id', '').strip()
        if not pid or len(pid) > 100:
            problems.append((line, 'id', 'missing or over 100 characters'))
        elif id_counts[pid] > 1:
            problems.append((line, 'id', 'duplicate id ' + pid))

        if not PRICE.match(r.get('price', '').strip()):
            problems.append((line, 'price', 'expected 9.99 USD format'))
        if r.get('availability', '').strip() not in AVAILABILITY:
            problems.append((line, 'availability', 'use in stock / out of stock'))
        if r.get('condition', '').strip() not in CONDITION:
            problems.append((line, 'condition', 'use new / refurbished / used'))
        if not r.get('link', '').startswith(('http://', 'https://')):
            problems.append((line, 'link', 'must start with http(s)://'))
        if not r.get('image_link', '').startswith(('http://', 'https://')):
            problems.append((line, 'image_link', 'must be a full URL'))
        title = r.get('title', '').strip()
        if not title or len(title) > 200:
            problems.append((line, 'title', 'empty or over 200 characters'))
        if title and title == r.get('description', '').strip():
            problems.append((line, 'title', 'identical to description'))

    for line, column, message in problems:
        print('row ' + str(line) + ' | ' + column + ' | ' + message)
    print(str(len(problems)) + ' problem(s) in ' + str(len(rows)) + ' rows')
    return len(problems)


if __name__ == '__main__':
    sys.exit(1 if check(sys.argv[1]) else 0)

Extend the AVAILABILITY set if your feed spec version accepts more values. The image check is deliberately shallow: it confirms the URL is present, not that the file is a JPEG or PNG of at least 500 x 500 pixels. Add a HEAD request if you want that verified.

When the same feed errors keep coming back

Recurring errors after you have fixed the file usually mean the problem sits upstream: an export template that reintroduces bad values on every sync, a variant model that generates duplicate IDs, or several channels fed from one unmaintained spreadsheet. Fixing rows one upload at a time will not stop that.

If you want someone to trace it and fix it at the source, send Netalith a free quote request with your feed URL or a sample of the errors you are seeing.

FAQ

Questions fréquentes

Why does my Facebook catalog show errors but my products still appear?

Meta separates errors into fatal and warning. Fatal errors stop the affected item from being created. Warnings, such as a price without a currency code, still create the item and are informational. Fatal errors also apply per row, so products without errors in the same file are still created.

What does 'Price Without Currency' mean and how do I fix it?

The price value has no currency code. Meta expects a number, a space and a three-letter ISO currency code, for example 9.99 USD, with a period as the decimal separator. Fix the export template so every price is written in that format.

How do I fix duplicate IDs in a Facebook product feed?

Each content ID must appear only once in the catalog, up to 100 characters. Use a unique value per sellable item, preferably the variant SKU, rather than repeating the parent product ID on every variant.

Can I fix feed errors without editing the source file?

Partly. Data feed rules in Commerce Manager can map attribute names, translate unrecognized values such as InStock to in stock, and change letter case. They are a patch for feeds you cannot modify, so fixing the source is still the more durable option.

How long can I download a feed upload error report?

You request the report through the upload's error_report endpoint and download the CSV once its status is WRITE_FINISHED. Reports older than 30 days are marked ERROR_REPORT_OUTDATED, so request a fresh one from a recent upload.

Are out-of-stock products a feed error?

No. Out of stock is a valid availability value. Those items stay in the catalog and display as sold out in shops.

Restez informé avec Netalith

Recevez des ressources de développement, des mises à jour produit et des offres spéciales directement dans votre boîte mail.