Bulk uploading Facebook ads means creating many ads in one operation instead of one at a time in the Ads Manager form. You have three ways to do it. You can duplicate inside Ads Manager or import a spreadsheet through its Import ads in bulk feature. You can write to the Marketing API with a script. Or you can use a bulk tool with a spreadsheet editor built for ads. This post compares the three on setup, limits, creatives, review, and what happens when a row fails.
I launch on Meta every week and I build Adsap, which is the third method. The first two sections cover Meta's own tools, with Meta's help pages as sources. The third is my product, and I say so where it matters.
Why does one ad at a time cost so much?
Ads Manager creates one ad per pass through its form: campaign, ad set, ad, creative, copy, then Publish. A creative test of 10 images against the same copy is 10 passes. Meta's own help page says as much: "It can be time consuming to publish 100 ads, each with their own individual media file." At Adsap we put the same launch at roughly 3 hours in Ads Manager against about 10 minutes in a bulk sheet. That is our figure from our own launches, not an industry benchmark.
Method 1: duplicate or import inside Ads Manager
Meta ships two bulk features in Ads Manager, and both are free.
Duplication
Select campaigns, ad sets or ads in the table and click Duplicate. For an ad set or ad you choose the destination: the original campaign, an existing one, or a new one. You set the number of copies. A checkbox carries the existing reactions, comments and shares over to the new ads. Then you edit what needs to change and click Publish.
Copy and paste works too, with a catch. The clipboard holds one ad account in one browser window. It clears when you refresh the tab, switch accounts, or copy something else. You cannot paste across ad accounts.
Two things to know before you duplicate. Advantage+ campaigns come back with Advantage+ settings turned on, even when the original used manual settings. And every duplicate goes through ad review before it runs.
Duplication is the right tool when the new ads are variations of one you already have: same targeting with new creative, or same creative with a new audience.
The import spreadsheet
For a larger batch, Ads Manager can create campaigns, ad sets and ads from an Excel file. The workflow, from Meta's help pages:
- In Ads Manager, above the Campaigns, Ad sets or Ads tab, open More and choose Import ads in bulk.
- Download the Excel template, or export existing ads as a spreadsheet and edit that.
- Fill one row per ad. Images and videos can be bulk imported at the same step.
- Upload the file, or paste the text.
- Read the summary. Warnings let the import through; blocking errors stop the affected rows. View errors in Excel tells you what was wrong and how to fix it.
The limits are on the same pages. The file limit is about 2 MB. The feature works on a computer only. The template's column names do not match the field names in Ads Manager, and Meta keeps a separate page for the differences. The template has fewer columns than an export, because new ads have not run yet. Some advertising features are unsupported in import and export, and Meta lists those separately too.
This method fits a monthly batch of static ads where the copy lives in a spreadsheet anyway. It does not fit daily work: the round trip through Excel, the column naming, and the error file add up.
Method 2: the Marketing API or a script
The Marketing API is what every tool, including Ads Manager, uses underneath. You can call it yourself. Meta's get-started guide lists the prerequisites: an active ad account, a Meta developer account, an app in the App Dashboard, and an access token with the right permissions. Ad creation then follows the object chain: campaign, ad set, ad creative with an uploaded image hash or video ID, then the ad. Your code sets the status on each object.
Two limits shape this method. The first is rate limiting. On Standard Access, an app gets 300 calls per hour plus 40 per active ad in the account, per Meta's rate-limit page. A new account with few active ads has a small allowance, and error 80004 arrives when you cross it. The second is versioning. Meta retires API versions on a published schedule, so a script written against one version needs a check at every bump.
Who is this for? Teams with an engineer who can own the script, the token rotation, the retries and the version bumps. If that is you, the API gives you everything, including fields no spreadsheet exposes. If that is not you, the maintenance cost lands on the media buyer, and it shows up on the day of a launch.
Method 3: a bulk tool with a spreadsheet editor
The third method is a tool that sits on the Marketing API and shows you a sheet. Each row is one ad. Dropdowns fill the fields that must match an existing object: campaign, ad set, Page, call to action. Creative pickers show thumbnails of uploaded files. A launch button walks the rows, creates the ads through the API, and writes the result back into each row.
Adsap's version is called an Ad Sheet. From the Ad Sheets overview: a sheet is tied to one Meta ad account, and each row has 73 columns. The columns cover copy (up to 5 primary texts and 5 headlines), creatives by aspect ratio, Page and Instagram identity, format-specific data and launch tracking. The five formats are Single Image or Video, Carousel, Collection, Catalog and Flexible.
The workflow, from Using Ad Sheets:
- Connect Meta with OAuth (the Meta Ads integration docs cover it), create a sheet and pick the ad account.
- Fill rows, or paste values down a column. Apply a template to prefill the Page, copy defaults and enhancement toggles.
- Upload creatives from your computer, Google Drive or Dropbox; videos encode in the background.
- Click Review Ads, read the Review & Launch dialog, confirm.
- Watch the stage column move from Draft to Launched. A failed row stays at Draft with the error in its launch_error column, so you fix the row and launch again.
Every ad lands paused. Nothing spends until you switch it on in Ads Manager or from Adsap. The same sheets are reachable from the AI copilot in Claude, ChatGPT or Perplexity. The copilot can fill rows from a description and show a preview of a row before anything is created.
Preview the ad in row 1 of my Summer Sale sheet before creating it.
The trade-off is plain: it is a product with a Free plan and a paid plan, where Meta's two features cost nothing. The plans are on the pricing page.
How do the three methods compare?
| Ads Manager (duplicate or import) | Marketing API or script | Bulk tool with a sheet (Adsap) | |
|---|---|---|---|
| Setup | None, built into Ads Manager | Developer account, app, token, permissions | Connect Meta with OAuth, about 2 minutes |
| Where it runs | Import: computer only | Wherever you host the script | Web app and AI copilot |
| Batch limit | About 2 MB per import file; one account per clipboard | 300 calls an hour plus 40 per active ad on Standard Access | Rows in the sheet; on Free, 10 tasks a month |
| Creatives | Bulk image and video import at the same step | Upload by image hash or video ID, in your code | Computer, Google Drive or Dropbox pickers |
| Review before publish | Import summary, then Publish | Whatever you build | Review & Launch dialog; copilot preview per row |
| Errors | Error file in Excel | API error codes | launch_error per row; the row stays at Draft |
| Starts paused | You set the status in the editor before Publish | Your code sets the status | Yes, always |
| Cost | Free | Free API, your engineering time | Free plan, or $29/month plus tax |
Which method should you pick?
- Ten or fewer new ads that vary from one you already run: duplicate in Ads Manager.
- A monthly batch with the copy already in a spreadsheet: the import template, on a computer.
- An engineer on the team and a launch pattern that never changes: the API and a script.
- Weekly launches, several accounts, video, or a review step you want in front of every write: a bulk tool with a sheet.
If your question is the AI assistant route instead, Adsap vs Meta's official Ads AI connector covers what the free connector does and where it stops. Whichever method you choose, keep one rule: read every row before it goes live. The ad volume calculator shows how many ads advertisers at your budget launch each week, which is a fair check on the size of the batch.
Frequently asked questions
Yes. Ads Manager includes duplication and an Import ads in bulk feature that reads an Excel file of about 2 MB or less, on a computer. Both are free on every ad account.
Meta's help page says you can bulk import images and videos at the import step. Some advertising features are unsupported in import and export; Meta lists them on a separate help page.
In Adsap, always. Through the Marketing API your code sets the status on each object. In Ads Manager you set the status in the editor before you publish.
A sheet holds as many rows as you add, and Adsap processes each Draft row on its own, so a failed row never blocks the others. On the Free plan each launched ad counts as one of the 10 tasks a month; Early Access has no limit.
Sources
- Meta Business Help Center, How to duplicate ad campaigns in Meta Ads Manager. Destinations, number of copies, engagement checkbox, clipboard limits, Advantage+ note: https://www.facebook.com/business/help/209669919072999
- Meta Business Help Center, How to bulk upload and import ads in Meta Ads Manager. The 2 MB file limit, bulk image import, the 100-ads quote: https://www.facebook.com/business/help/122918328469908
- Meta Business Help Center, Import ads to Meta Ads Manager. Steps, the summary with warnings and blocking errors, computer only: https://www.facebook.com/business/help/232961787388181
- Meta Business Help Center, Download the import template for Meta Ads Manager (column names differ, fewer columns than an export): https://www.facebook.com/business/help/837176152970474
- Meta for Developers, Get Started with the Marketing API (ad account, developer account, app, access token): https://developers.facebook.com/docs/marketing-api/get-started
- Meta for Developers, Graph API rate limiting (Ads Management formula on Standard Access, error 80004): https://developers.facebook.com/docs/graph-api/overview/rate-limiting
- Meta for Developers, Graph API versioning schedule: https://developers.facebook.com/docs/graph-api/guides/versioning
- Adsap docs, Ad Sheets overview and Using Ad Sheets. 73 columns, five formats, Review Ads, paused by default, launch_error.
- The roughly 3 hours to about 10 minutes figure is Adsap's own stated estimate from its launches, as published on adsap.ai. The Free plan limits are on the pricing page.