# ChatGPT Ads bulk upload: the template, the limits and safe bulk edits

> How bulk upload works in OpenAI Ads Manager: the three tabs, character and row limits, JSON context hints, image rules and the export-for-edit workflow.

Published: 2026-09-28 · ChatAdsAI · https://www.chatadsai.com/guides/chatgpt-ads-bulk-upload

> **Summary:** Bulk upload creates or edits many campaigns, ad groups and ads from one spreadsheet. The template has three tabs, named campaigns, ad groups and ads, with up to 5,000 rows each. Names must match exactly across tabs, context hints are written as a JSON list, and images need public URLs. To edit existing objects, start from **Export for edit**. Uploaded context hints replace the old list; they are not merged. Check row-level results after every upload.

## What is bulk upload in ChatGPT Ads Manager?

Bulk upload is the spreadsheet route into OpenAI Ads Manager Beta. You fill in a template that OpenAI calls the ad schema template, upload it, and Ads Manager creates or updates every campaign, ad group and ad in the file.

OpenAI states that Ads Manager Beta supports two campaign creation workflows: guided campaign creation, which is a step-by-step flow, and bulk upload. Both produce the same three-level structure.

| Level | What it defines |
|---|---|
| Campaign | Objective, budget, dates and targeting |
| Ad group | A theme or intent area, with its context hints |
| Ad | Title, copy, image and landing page |

You find the template inside Ads Manager. OpenAI's launch guide points to **Create**, then **Upload bulk**. If the account itself is not ready yet, start with our [Ads Manager account setup guide](https://www.chatadsai.com/guides/ads-manager-account-setup).

## When should you use bulk upload instead of guided creation?

Use bulk upload when you are launching several campaigns at once or changing many objects in one pass. OpenAI describes it as best for larger launches or multiple campaigns.

The reason it matters is creative volume. OpenAI recommends a high volume and diverse set of ads, with multiple title and copy variations per offering. Writing dozens of variations in a form is slow. In a spreadsheet it is far quicker.

For edits, OpenAI draws the line like this:

| Method | OpenAI's stated use |
|---|---|
| In-line edits | Quick changes: a budget, a line of ad copy, a pause |
| Bulk edits | Larger changes: context hints, ad copy or landing pages at scale |

One exception: bulk upload does not currently create [product-feed campaigns](https://www.chatadsai.com/guides/chatgpt-product-feed). Those are built in the guided flow.

In our judgment, a single campaign with a handful of ads is faster in the guided flow. The template pays off once you are past that. If you are still deciding how to structure an account, read [how to advertise on ChatGPT](https://www.chatadsai.com/guides/how-to-advertise-on-chatgpt) first.

## What is in the bulk upload template?

The template has three tabs, and each row in a tab is one object.

| Tab | One row is | Required fields |
|---|---|---|
| campaigns | A campaign | Campaign name, budget, start and end dates, objective, country |
| ad groups | An ad group | Campaign name, ad group name, max bid, context hints |
| ads | An ad | Ad group name, ad title, ad copy, landing page URL, image URL |

A few of these fields need explaining.

**Budget** is described by OpenAI as the max spend per campaign. How budgets pace is covered in our guide to [ChatGPT Ads cost](https://www.chatadsai.com/guides/chatgpt-ads-cost).

**Objective** is either Views or Clicks.

**Max bid** depends on the campaign. OpenAI states you enter a maximum CPM bid for Reach campaigns or a maximum CPC bid for Clicks campaigns. CPM is the price per thousand impressions and CPC is the price per click.

The tabs are linked by name. A campaign name must match exactly between the campaigns and ad groups tabs, and an ad group name must match exactly between the ad groups and ads tabs. A trailing space or a different capital letter breaks the link.

## What are the bulk upload limits?

OpenAI publishes these limits in its schema checklist and launch guide.

| Item | Limit |
|---|---|
| Rows | No more than 5,000 campaigns, 5,000 ad groups and 5,000 ads |
| Ad title | 16 to 24 characters recommended, 50 maximum |
| Ad copy | 32 to 48 characters recommended, 100 maximum |
| Images | PNG or JPG, square, no larger than 1200 x 1200 |

Dates are written as YYYY-MM-DD.

The 5,000 figure is also an account ceiling. OpenAI notes that each ad account can include up to 5,000 campaigns, 5,000 ad groups and 5,000 ads.

The recommended lengths are much shorter than the maximums. OpenAI's own pre-submit check lists the recommended ranges, not the maximums. For languages that run long, such as German, write to the recommended range and check the preview. Our guide to [writing ChatGPT ads](https://www.chatadsai.com/guides/writing-chatgpt-ads) covers the copy itself.

## How do you format context hints and country in the file?

Both fields are written in JSON format, not plain text, and both cause rejected files.

**Context hints** are a JSON list of strings, in the form `["hint one", "hint two"]`. That means straight double quotes, a comma between items and square brackets around the list. They are not separated by pipes or semicolons. Spreadsheet programs like to replace straight quotes with curly ones; turn that off first.

**Country** is completed in JSON format as well. The checklist does not print a sample value for this field, so copy the format from the sample rows in the template itself.

A context hint is an extra detail about your business that helps OpenAI's systems understand when an ad may be relevant. OpenAI asks for a clear, natural phrase focused on one idea, not a list of disconnected keywords. Hints inform relevance. OpenAI states they are not targeting rules and cannot enforce geographic limits, schedules or exclusions. What belongs inside them is covered in our [context hints guide](https://www.chatadsai.com/guides/context-hints).

## Which formatting mistakes get a file rejected?

OpenAI states that its system will reject any ad schema that does not exactly match its requirements. The checklist names these rules:

- Keep the row with the column names in every tab.
- Do not rename the tabs. They stay named campaigns, ad groups and ads.
- Do not rename the column headers.
- Do not merge cells.
- Each row must be a unique object. No duplicate rows and no duplicate names.
- Fill in every required field.

You do have some freedom. You may add note rows above the header row, and you may remove or move the template's instruction and sample rows. Ads Manager ignores instruction and sample rows during validation.

## What do image and landing page URLs need to pass validation?

Both must load for an anonymous visitor and for OpenAI's crawlers.

**Images.** The URL must be publicly accessible and open directly to the image in a browser. OpenAI lists supported hosting such as Google Drive links, AWS-hosted links such as S3 or CloudFront, and self-hosted links on your own domain or CDN. Upload validation or review may fail if the image requires sign-in, redirects to a preview page, blocks crawlers, or is blocked by a firewall or CDN rule.

**Landing pages.** OpenAI's test is that the URL loads without authentication, returns a successful response and can be reached by OpenAI crawlers.

| Crawler | Status for ads |
|---|---|
| `OAI-AdsBot` | Must be allowed |
| `OAI-SearchBot` | Recommended |

OpenAI states that its crawlers respect `robots.txt`, and that web protection services can mistakenly block them, often with a 403 Forbidden error. It also notes that `OAI-AdsBot` is officially verified and allowlisted by Cloudflare.

Bulk uploads add one specific risk. A large batch means many crawler visits in a short time, which can trigger rate limiting on your own server. OpenAI suggests asking your engineering team to look for 429 Too Many Requests responses, and to consider uploading ads over a longer period in smaller batches.

App-store links, deep links and pages behind a login may not provide enough crawlable content for review. Use a directly reachable web page. More causes are covered in [why ChatGPT ads are not serving](https://www.chatadsai.com/guides/chatgpt-ads-not-serving), and the rules for the page content are in our [ad policies guide](https://www.chatadsai.com/guides/chatgpt-ads-policies).

## How do you upload the file and fix errors?

In Ads Manager, click **Create**, then upload the completed template. If something fails during ingestion, Ads Manager displays a specific error message.

OpenAI's guidance for recovery has three parts:

1. **Fix the template.** Most issues come from formatting, required fields, links or naming mismatches.
2. **Review each row's outcome before retrying.** Completed processing does not mean every row succeeded.
3. **Contact support if errors persist.** Send the file and error details to `ads-support@openai.com`.

Step two deserves attention, because a careless retry creates duplicates. OpenAI warns against replaying rows that already succeeded with a blank `ad_id`, because doing so can create duplicate ads. Before you upload a corrected file:

- Reconcile the ads that were already created.
- Confirm that each `ad_group_id` points to the intended destination.
- Confirm that image links return image data and not a preview page.
- Upload only the rows you still intend to create.

After launch, check that campaigns, ad groups and ads are active. OpenAI states that impressions, clicks and CTR refresh approximately every 15 minutes, while spend insights may be delayed 7 to 8 hours. For a new campaign with no clear blocker, OpenAI asks you to allow at least 24 hours after launch before reporting a zero-delivery issue. Reading the numbers is covered in [ads reporting and privacy](https://www.chatadsai.com/guides/ads-reporting-and-privacy).

## How do you bulk edit existing campaigns safely?

Start from a fresh export, every time. The workflow OpenAI documents has five steps:

1. Select the campaigns, ad groups or ads you want to change.
2. Click **Export for edit**.
3. Make the changes in the exported file.
4. In Ads Manager, click **Create**, then **Bulk upload**.
5. Choose the object type, Campaign, Ad Group or Ad, and upload the file.

IDs decide what happens to each row.

| Row contains | Result |
|---|---|
| An existing object ID | That object is updated |
| A campaign ID and a blank ad group ID | A new ad group is created in that campaign |
| An ad group ID and a blank ad ID | A new ad is created in that ad group |

OpenAI explains why the export matters: it contains the current IDs and field values, which reduces accidental duplicate rows, stale IDs and overwrites. This matters most when other users may have changed the account since your last download. A stale file carries old values and uploads them over newer work.

If one upload adds more than one object type, a new child row must reference a parent that already exists or has already been created.

## Do uploaded context hints replace the old ones?

Yes. When you bulk update an ad group, the context hints in the row become the complete list for that ad group. OpenAI states the uploaded value is a replacement, not an additive merge.

This is the easiest mistake to make. As an example, if an ad group has ten hints and you upload a row with two new ones, the ad group now has two. Always include the full JSON list you want to keep.

## What can a bulk edit not change?

Some choices are fixed at creation. OpenAI names the campaign objective and the budget type as setup choices that are not intended to be changed after creation. If either is wrong, the fix is a new campaign with the right setup, not an edit.

## Spreadsheet or API: which bulk route fits?

The spreadsheet is for people working in Ads Manager. The Advertiser API is for developers who want to automate the same work. OpenAI documents a bulk mutation job that creates or updates many campaigns, ad groups and ads asynchronously.

| Point | Spreadsheet upload | API bulk job |
|---|---|---|
| Size limit | 5,000 rows per tab | Up to 1,000 operations, body up to 16 MiB |
| Dry run | Not documented | `validate_only` checks without applying |
| Links parents by | Name, or ID in an export | Idempotency keys, or resource ID |

Two API details are worth knowing. With `partial_failure` set to true, unrelated operations can continue after a failure, and OpenAI states that neither mode rolls back operations that already succeeded. Bulk job creation also has its own rate limit of 10 requests per 10 seconds for each ad account.

## A pre-upload checklist

Run through this before every upload. It follows OpenAI's checklist, in our order.

- All three tabs keep their names and their header rows.
- No tab has more than 5,000 rows.
- Campaign and ad group names are unique and match exactly across tabs.
- Dates are in YYYY-MM-DD.
- Objective is Views or Clicks.
- Country and context hints are valid JSON with straight quotes.
- Titles and copy are inside the character limits.
- Every image URL opens the image itself in a private browser window.
- Every landing page loads without a login and allows `OAI-AdsBot`.
- For edits, the file is a fresh export and every row you want updated keeps its ID.

## Frequently asked questions

**Does bulk upload work for product-feed campaigns?**

No. OpenAI states that bulk upload does not currently support creating product-feed campaigns.

**How many rows can one file hold?**

No more than 5,000 campaigns, 5,000 ad groups and 5,000 ads. The same numbers are the ceiling for an ad account.

**What separates context hints inside the cell?**

JSON syntax. The cell holds a list such as `["hint1", "hint2"]`, with each hint in straight double quotes and a comma between them.

**If one row fails, is the whole file rejected?**

Not necessarily. OpenAI states that processing can finish even when individual rows fail, so check the row-level results instead of assuming all or nothing.

**Why did my upload create duplicate ads?**

Most likely the file was uploaded again with rows that had already succeeded. A row with a blank `ad_id` creates a new ad each time it is uploaded.

**Can I host ad images on Google Drive?**

Yes, if the link is publicly available and opens the image directly. A link that opens a preview or sign-in page fails.

**Can I add UTM parameters in the landing page URL column?**

Yes. OpenAI states you can add tracking parameters directly to destination URLs, with your own UTM parameters for each creative. See our guide to [ChatGPT Ads URL parameters](https://www.chatadsai.com/guides/chatgpt-ads-url-parameters).

**Can I switch a campaign from Views to Clicks with a bulk edit?**

No. Objective is not intended to change after creation. Create a new campaign.

**Can OpenAI support bypass a failed landing page check?**

OpenAI says not to rely on a manual bypass. Fix crawler access, then re-upload or resubmit the affected ads if the status does not update on its own.

If you would rather hand the template to someone who fills it in every week, see our [services](https://www.chatadsai.com/services).

## Sources

- [OpenAI Help Center - Bulk Upload Campaign Schema Checklist](https://help.openai.com/en/articles/20001218-bulk-upload-campaign-schema-checklist)
- [OpenAI Help Center - Edit Campaigns](https://help.openai.com/en/articles/20001215-edit-campaigns)
- [OpenAI Help Center - Launch Campaigns](https://help.openai.com/en/articles/20001209-launch-campaigns)
- [OpenAI Help Center - Quickstart: Launch your first campaign](https://help.openai.com/en/articles/20001224-quickstart-launch-your-first-campaign)
- [OpenAI Help Center - Ads Manager Beta Overview](https://help.openai.com/en/articles/20001206-ads-manager-beta-overview)
- [OpenAI Help Center - Create Ads for ChatGPT Ads](https://help.openai.com/en/articles/20001212-create-ads-for-chatgpt-ads)
- [OpenAI Help Center - Write Context Hints for ChatGPT Ads](https://help.openai.com/en/articles/20001521-write-context-hints-for-chatgpt-ads)
- [OpenAI Help Center - Troubleshooting Common Issues](https://help.openai.com/en/articles/20001217-troubleshooting-common-issues)
- [OpenAI Help Center - Advertiser Guidance for Allowing OpenAI Web Crawlers](https://help.openai.com/en/articles/20001243-advertiser-guidance-for-allowing-openai-web-crawlers)
- [OpenAI Developers - Campaign Management](https://developers.openai.com/ads/campaign-management)
- [OpenAI Developers - Overview](https://developers.openai.com/ads/api-overview)
