All answers

Why does my Facebook bulk import sheet keep failing?

Almost every bulk import failure comes from one of five causes: a column header that no longer matches Meta's expected name, a creative referenced in the sheet that does not exist in the ad account yet, formatting characters inside a numeric cell, rows mixing campaign, ad set and ad levels incorrectly, or stale IDs from an exported file that has since changed. Re-export a fresh sheet from the account and edit that, rather than reusing an old template.

Last updated 2026-08-26

Renamed or reordered headers

The importer matches on header text, not position, and the match is exact. A header that reads Campaign name is not the same as Campaign Name in every locale, and a spreadsheet tool that helpfully trims or capitalises headers on save will break the file. The safest workflow is to export a sheet from the account you are importing into, edit only the cell values, and never touch row one. If you keep a reusable template, re-verify it against a fresh export whenever Meta ships changes, because the column set is not stable across years.

Creative that does not exist yet

The sheet references creative by an identifier in the ad account. It does not carry image or video bytes, so it cannot create new creative for you. If a row points at an image hash or video ID that has not been uploaded, the import fails on that row. Upload the media first, either through Ads Manager or the API, then reference it. This is the single most common reason a sheet that worked last month fails today: the campaign structure is fine, and the assets simply are not in the account.

Formatting inside numeric cells

Budget, bid and spend cap columns want a plain number. A currency symbol, a thousands separator, a trailing space or a value stored as text will be rejected. Spreadsheet applications add these automatically when a column is formatted as currency, so the file looks correct on screen and fails on upload. Set those columns to plain number or text format before editing, and check the raw value in the formula bar rather than trusting the displayed value. Dates behave the same way: use the exact format the exported file uses, not your locale's default.

Mixed levels and missing parent rows

The sheet encodes campaign, ad set and ad levels in the same file. A new ad row that references an ad set which is neither already in the account nor created by an earlier row in the same file has no parent, and the import fails. When creating a new structure from scratch, order the rows so parents come before children, and make sure the names used to link them match character for character, including trailing spaces that are invisible in a cell.

How to find the row that broke

When the error does not name a row, bisect. Import the first half of the rows, then the second half, and keep halving until you isolate the failure. It takes four or five imports on a thousand row sheet and beats reading the file line by line. If bisecting is not practical because publishing half the rows has real consequences, copy the sheet into a test ad account first. And if you are hitting this often, the sheet is the wrong tool for the job: a launcher that builds the combinations from your creatives and validates before publishing removes the format from the equation entirely.

A sheet that imports cleanly is not the same as a sheet that is correct. The importer validates format, not intent, so a wrong destination URL or a wrong optimisation event imports happily and then spends money. Review what the sheet will create before you import, not just whether it imports.

Launch your next test in one click.

Launch 100 ads with one click. Free for 7 days, no card required.

Start free trial →