Guides ChatGPT ads for the UAE

How do I bulk upload campaigns into OpenAI Ads Manager

gptads.ae / by / updated 21 September 2026

The three tab bulk upload schema for OpenAI Ads Manager, every required column, the formatting rules that cause silent failures and how to fix a rejected file.

On this page
  1. The short version
  2. When to use bulk upload instead of the guided flow
  3. The three tabs and what belongs in each
  4. A worked example: three rows across three tabs
  5. Formatting rules that cause silent failures
  6. Before you upload: the validation pass
  7. New object or an update to an existing one
  8. When the upload comes back with errors
  9. Common mistakes
  10. Bulk upload versus the guided flow
  11. What UAE teams should prepare before a bulk launch
  12. A note on version control
  13. Quick answers

The short version

Bulk upload is a three tab spreadsheet: campaigns, ad groups, ads. Every row needs the right fields filled in, campaign and ad group names have to match exactly across tabs, and context hints need to be written as a JSON array. Most rejected files fail on one of those three things. This guide is the checklist to run before you upload, taken directly from OpenAI's own schema checklist.

OpenAI Ads Manager Bulk uploads dialog with a template download step and an Excel upload step
Bulk uploads: download the template, fill it in, upload the .xlsx file. The type menu also offers campaign, ad group or ad sheets. OpenAI Ads Manager, captured 21 September 2026 from our own account

When to use bulk upload instead of the guided flow

Bulk upload suits a launch of several campaigns at once, or a structural change across many ad groups, such as rewriting context hints everywhere at the same time. A single campaign with a handful of ad groups is usually faster to build in the guided workflow described in our Ads Manager guide. One hard limit either way: bulk upload does not currently support creating product feed campaigns. Feed based campaigns are always built through the guided flow in our product feed guide.

The three tabs and what belongs in each

Tabs must stay named campaigns, ad groups and ads. Column headers must not be renamed. Both break validation even if every value in the row is correct.

Campaigns tab

Column Requirement
Campaign name Unique across the account. No duplicates anywhere in the file
Objective Either Views or Clicks in this tab
Budget Completed, matching your chosen budget type
Start and end dates YYYY-MM-DD format, valid calendar dates
Country Completed and written in JSON format

Row limit: no more than 5,000 campaigns in one ad account.

Ad groups tab

Column Requirement
Ad group name Unique. No duplicates
Campaign name Must match the campaigns tab exactly, character for character
Max bid A maximum CPM bid for Views campaigns, or a maximum CPC bid for Clicks campaigns
Context hints A JSON array, written like ["hint1", "hint2"]

Row limit: no more than 5,000 ad groups in one ad account.

Ads tab

Column Requirement
Ad group name Must match the ad groups tab exactly
Ad title 16 to 24 characters recommended, 50 maximum
Ad copy 32 to 48 characters recommended, 100 maximum
Landing page URL Valid, reachable, not blocked by OpenAI's crawlers
Image URL PNG or JPG, square, no larger than 1200 by 1200 pixels, publicly accessible, opens directly to the image

Row limit: no more than 5,000 ads in one ad account. OpenAI names three accepted image hosting patterns: public Google Drive links, AWS hosted links such as S3 or CloudFront, or self hosted links on your own domain or CDN.

OpenAI Ads Manager campaigns screen with the Create campaign menu open showing Create campaign and Upload bulk
Two ways to start: build a campaign in the interface, or upload in bulk. OpenAI Ads Manager, captured 21 September 2026 from our own account

A worked example: three rows across three tabs

Seeing the three tabs linked together makes the naming rule concrete. Here is one campaign, one ad group and one ad, written as they would appear in each tab.

Tab Key columns and values
Campaigns Campaign name: UAE Villa Renovation. Objective: Clicks. Budget: AED 300 daily. Start: 2026-10-01. End: 2026-10-31. Country: ["AE"]
Ad groups Ad group name: Kitchen Renovation. Campaign name: UAE Villa Renovation. Max bid: AED 15. Context hints: ["Villa kitchen renovation in Dubai with a fixed price contract", "For owners who have just bought an older villa and want the kitchen finished before moving in"]
Ads Ad group name: Kitchen Renovation. Ad title: Villa kitchen renovation, fixed price. Ad copy: Permits handled, named project manager, fixed timeline. Landing page URL: https://example.ae/kitchen-renovation. Image URL: https://example.ae/images/kitchen.jpg

Notice the campaign name "UAE Villa Renovation" appears character for character in the ad groups tab, and the ad group name "Kitchen Renovation" appears character for character in the ads tab. That repetition, row after row, is what the validator is actually checking.

Formatting rules that cause silent failures

Keep the header rowYou can add note rows above it and remove sample or instruction rows below it. Ads Manager ignores template instruction and sample rows during validation, but the header row itself must stay.
No merged cellsA merged cell breaks row by row parsing.
One row per objectEach row in every tab represents one campaign, ad group or ad. No duplicate object rows.
Names match everywhereCampaign names in the ad groups tab, and ad group names in the ads tab, must be identical to how they appear in the parent tab. A trailing space or a different capitalisation breaks the match.
How an account is structured. Settings made at the top cannot be overridden lower down. Illustration by gptads.ae

Before you upload: the validation pass

  1. Check every required field

    Blank required fields are the most common rejection cause across all three tabs.

  2. Check context hints are valid JSON

    A comma separated string without brackets and quotation marks will not parse as an array.

  3. Check character limits on title and copy

    16 to 24 characters recommended for titles, 50 maximum. 32 to 48 characters recommended for copy, 100 maximum.

  4. Open every landing page and image URL directly

    Confirm the landing page loads without a sign in wall and the image URL returns the image itself, not a preview page or a redirect.

  5. Re-check names across tabs

    Every campaign name referenced in ad groups, and every ad group name referenced in ads, exists and matches exactly.

New object or an update to an existing one

The bulk upload file doubles as the editing tool for existing campaigns, ad groups and ads, and the same file structure decides which behaviour you get.

You want to Do this
Update an existing object Keep its existing ID in the row
Create a new ad group inside an existing campaign Put the existing campaign's ID in the row, leave the new ad group's ID blank
Create a new ad inside an existing ad group Put the existing ad group's ID in the row, leave the new ad's ID blank

OpenAI's recommended starting point for any edit is Export for edit inside Ads Manager, which downloads a fresh file with current IDs and values. Starting from an old file risks overwriting a change someone else made since you last exported. Full detail on in-line versus bulk edits is in our Ads Manager guide.

Context hints follow a replace rule, not an add rule. When you bulk update an ad group, the context hints in that row become the complete list for the ad group after upload. If you only want to add one hint, export the current list first, add to it, and upload the full set back.

When the upload comes back with errors

Ads Manager shows a specific error message identifying the row and the issue. Work through it in this order.

  1. Read the exact error, not just that it failed

    OpenAI's error messages typically name the row and the specific problem, which is faster to fix than re-checking the whole file.

  2. Confirm what already succeeded

    Processing can complete even when some rows failed. Check the row level results before assuming nothing was created.

  3. Reconcile before you re-upload

    Confirm each ad_group_id in the file points to the object you intended, and that image links return image data rather than a preview page.

  4. Never replay a succeeded row with a blank ID

    A row that already created an ad, uploaded again with the ad ID left blank, creates a second, duplicate ad rather than updating the first one.

  5. Fix, validate, then re-upload only the rows that need it

    Correct the specific formatting or field issue in the template, run through the checklist above again, and upload only the rows you intend to create or change.

If an error is unclear or persists, OpenAI's support channel for this is reachable through the support widget inside Ads Manager. Have your file and the exact error details ready before you contact them.

Common mistakes

  • Renaming a tab or a column header. Even a small rename, such as "Ad Groups" instead of "ad groups", can break the upload.
  • Typing the campaign name slightly differently in the ad groups tab. A missing space or different capitalisation is treated as a different campaign and the link silently fails to match.
  • Writing context hints as a plain sentence instead of a JSON array. It needs the brackets and quotation marks: ["hint one", "hint two"].
  • Assuming a completed upload means every row worked. Check row level outcomes every time, especially on a large file.
  • Re-uploading the whole file after fixing one error. This risks duplicating every row that already succeeded. Isolate and re-upload only the corrected rows.
  • Trying to bulk upload a product feed campaign. It is not supported. Build it in the guided flow instead.

Bulk upload versus the guided flow

Neither method is universally better. OpenAI supports both, and the right choice depends on the size and shape of the change you are making.

Situation Better fit
First campaign, still learning the platform Guided flow, so each field's effect is visible as you set it
Ten or more campaigns launching on the same date Bulk upload, built once in a spreadsheet
Rewriting context hints across many ad groups after a strategy change Bulk upload, since Export for edit gives you every ad group's current hints in one file to edit together
One ad group needs a single new ad added Guided flow, since the in-line Create, Create ad path is faster than exporting and re-uploading a file
A product feed campaign, at any scale Guided flow only, since bulk upload does not support this campaign type

What UAE teams should prepare before a bulk launch

  • Dates in YYYY-MM-DD format, and a clear view of which UAE public holidays or sale periods the campaign dates should span.
  • Country values in the JSON format the template expects, for example ["AE"] for UAE only, or a wider Gulf list if you are also live in Saudi Arabia, Qatar, Kuwait, Bahrain or Oman.
  • Landing pages that are already reachable by OpenAI's crawlers, OAI-AdsBot and OAI-SearchBot, which matters for sites still behind a staging password or a country level redirect.
  • A named person who owns the file, since a bulk file touching many campaigns at once is exactly the kind of change that benefits from one clear owner rather than several people editing in parallel.
  • Arabic text saved correctly in a UTF-8 file if any titles, copy or context hints use Arabic. A spreadsheet saved in the wrong encoding can silently turn Arabic characters into unreadable symbols, and that failure will not always show up as a validation error, only as broken text once the ad is live.

A note on version control

A bulk upload file is easy to lose track of once more than one person edits it. Our approach, which is our own practice rather than an OpenAI requirement: keep the most recent Export for edit in a shared folder with the export date in the filename, and treat any older copy as read only. Because a bulk edit replaces context hints outright rather than merging them, an out of date file re-uploaded by mistake can quietly delete hints someone else added last week. The cost of a naming convention is small next to the cost of untangling that after the fact.

For the full picture of how bulk upload fits inside the wider account and campaign structure, read our Ads Manager complete guide.

Quick answers

Can I bulk upload product feed campaigns?

No. OpenAI states bulk upload does not currently support creating product feed campaigns. Those are built through the guided workflow only.

What format do context hints need in the bulk upload file?

A JSON array inside the cell, written like ["hint1", "hint2"]. Plain text or a comma separated list will fail validation.

Does a bulk edit add to my existing context hints or replace them?

It replaces them. OpenAI says to treat the uploaded context hints list as the complete value you want live after upload, not as new hints added to the old list.

How many rows can one ad account have?

OpenAI's limits are 5,000 campaigns, 5,000 ad groups and 5,000 ads per ad account, and the checklist repeats the same ceiling for each tab of the bulk upload file.

What happens if my bulk upload has an error in one row?

Ads Manager can finish processing the file even when individual rows fail, so a completed upload does not mean every row succeeded. Check each row's outcome before deciding what to fix.

Is it safe to re-upload the same file after fixing an error?

Only after reconciling what already succeeded. OpenAI warns that re-uploading rows that already created an ad, with the ad ID left blank, can create a duplicate ad.