Amazon Ads bulk: the ghost Campaign Id placeholder
If you create a new campaign in Amazon Ads via bulk (with its ad groups, product ads, and keywords in the same CSV), you have to put the same text placeholder Campaign Id in every row of the tree. Something like CAMP_HARVEST_TOP4 in the Campaign row, and repeated in each child row.
If you omit it, Amazon returns the “Missing parent ID” / “Invalid ID” error on the child rows. Fair enough.
The real trap comes after. If the child rows fail but the Campaign row passes the first check, Amazon creates a shell campaign with that name in the account. You upload the corrected bulk again and it tells you “Campaign with name=X already exists!”. Pausing it doesn’t free the name. The only exit is to archive the shell from the UI before re-uploading.
Four rules I now always apply:
- Validate the bulk locally (a dumb script that checks each child row references a Campaign Id present as a Campaign row).
- Use English column headers. They’re parsed more reliably than translated ones.
- To reference existing entities (negatives in active campaigns, bid updates), use the actual numeric ID extracted from a bulk export — not the Name.
- If anything smells like an empty shell, archive before retrying.
Tools that accept partial errors are worse than tools that fail in one block.
I learned this building a Harvest EXACT from winning PHRASE/BROAD terms. First attempt: 29 errors and one empty shell. Second: 13 of 29 processed, 16 blocked by duplicate name. Third, after archiving: 16 of 16 OK.