Bulk Launch overview — grid interface
Last updated: May 19, 2026
Bulk Launch overview — grid interface
Bulk Launch at /launch is a spreadsheet-grid for launching many campaigns at once. Each row = one campaign. Columns = the fields you'd fill in Express/Pro (account, pixel, name, budget, audience, creative). All rows publish in parallel via SQS workers. Status tracked per row at /bulk-launch/status/batch.
Who is this for
Mediabuyers operating at scale:
Agencies launching same template across 10+ client accounts
Multi-country brands launching localized campaigns simultaneously
Wave-based launches (Black Friday, Christmas, product launch)
Repeatable weekly/monthly launch cycles
When to use Bulk Launch vs Express/Pro
Scenario | Use |
|---|---|
1-2 campaigns to launch now | |
3-9 similar campaigns | Bulk Launch saves time (fill once, customize variants) |
10+ campaigns | Bulk Launch essential (manual would take hours) |
Repeatable pattern across launches | Template (cc-118) + Bulk Launch |
The grid interface
Open at /launch. The page shows:
Toolbar (top): import template, paste rows, validate all, publish all
Grid (center): one row per campaign + columns for each field
Right panel: details on the currently-selected row (with full validation feedback)
Status bar (bottom): N rows, M errors, K warnings — Publish button enabled when no errors
Grid columns
Verified vs apps/backend/src/dto/request/bulk-launch.request.dto.ts:
Column | Required? | Type |
|---|---|---|
| Yes | Standard / Multilanguage / Catalog / App Install |
| Yes | Meta Ad Account ID (or per-platform equivalent) |
| Yes (Meta) | Meta Fan Page ID |
| Yes (conversion objectives) | Pixel ID |
| Yes | Campaign name |
| Yes | CBO / BID CAP / COST CAP / MIN ROAS / ABO |
| Yes | Daily budget in cents |
| Yes | Array of ad set names |
| Conditional | Per-adset bid (required for ABO + non-CBO bid strategies) |
| Optional | Array with key + radius (10-80km) + distance_unit |
| Yes (default) | Country code (e.g. IT) |
| Optional | Multi-country array |
| Optional | Sub-national regions |
| Yes (EU geo) | DSA beneficiary |
| Yes (EU geo) | DSA payor |
| Yes | Minimum age targeting |
| Yes | Maximum age targeting |
| Yes | All / Male / Female |
... | ... | (Many more fields per |
For a complete column list see the request DTO. Each platform may surface different columns dynamically.
How rows work
Each row is a complete campaign spec — fill it in and it'll publish standalone. Rows are independent: row 1 can be Meta, row 2 can be Google, row 3 can be TikTok.
The grid supports:
Bulk paste from spreadsheet (Excel / Google Sheets)
Per-row inline editing
Per-row validation (red border on cell with error)
Copy/paste cell values
Duplicate row (right-click → duplicate)
Delete row (right-click → delete)
Import from template (apply template + customize per row)
Async publish workflow
When you click Publish all:
Backend receives
POST /api/v1/bulk-launchwith the grid as payloadReturns
workerRunIdimmediately (async accepted)Queues per-row jobs to SQS worker
Worker publishes each row to the respective ad platform
Per-row status tracked in DB
Status polling endpoints (verified):
GET /api/v1/bulk-launch/status/:workerRunId— overall progress of one batchGET /api/v1/bulk-launch/status/batch— list all recent batchesPOST /api/v1/bulk-launch/nested— nested batch publish (campaign → adsets → ads at scale)
UI polls every few seconds and updates row status badges: Pending → In progress → Success / Failed.
Per-row status
Each row has:
Status | Meaning |
|---|---|
Draft | Editing, not yet validated |
Validated | All required fields present, no errors |
Queued | In SQS queue, waiting for worker |
In progress | Worker publishing to platform |
Success | Published successfully (with campaign ID) |
Failed | Publish failed (error message visible in right panel) |
You can retry failed rows individually without redoing the rest.
DSA fields for EU campaigns
If target_country is in EU (or target_countries includes EU), the DSA fields become required:
dsa_beneficiary(who benefits from the ad)dsa_payor(who pays for it)
Wevion enforces at validation. See cc-120 EU compliance for full DSA context.
Validation
Pre-publish validation per row + cross-row:
Per row: same rules as Express/Pro (audience size, budget min, required fields)
Cross-row: detect duplicate campaign names, conflicting bid amounts on same account
ValidationIssue structure (verified apps/backend/src/types/campaigns/validation.types.ts): code + fieldPath + severity. Errors block publish; warnings allow with confirm.
Templates + Bulk Launch
Common workflow:
Configure a campaign template (cc-118)
Open Bulk Launch
Import from template (top toolbar)
Template fields auto-fill all rows
Customize per-row variants (different ad account, different audience tweak)
Publish
Repeatable wave launches become a 5-min task.
Common workflows
Workflow A: 10 clients, same campaign
Template: "Q4 evergreen template"
Bulk Launch: 10 rows, each with different
account_id(one per client)Same audience template + each row tweaks geo
Publish → 10 campaigns live in 2 min
Workflow B: Multi-country localized campaigns
Template per country: same product, localized creative + copy + country
Bulk Launch: 5 rows (UK, FR, DE, IT, ES) with localized values
Publish → 5 country-localized campaigns simultaneously
Workflow C: Multi-platform parallel
Per-row platform: row 1 Meta, row 2 Google, row 3 TikTok
Same campaign concept, platform-specific specs
What you'll see
Bulk Launch in action:
Grid populated with N rows
Validation summary at bottom: "N rows, M errors, K warnings"
Publish all button enabled when no errors
After publish: row-status badges update in real-time
Failed rows highlighted red with error message visible
Common issues
Pasting from Excel: special chars break: Excel sometimes adds smart quotes or hidden chars. Paste as plain text or clean values.
Row stuck "In progress" > 5 min: SQS worker may be backed up. Check
/bulk-launch/status/:workerRunId.Validation error on a row: select row → right panel shows full error detail. Common: missing
pixel_idfor Sales objective, missing DSA fields for EU.Bulk Launch grid won't load: large workspaces with 100+ ad accounts may take time. Wait + refresh.
Half rows succeeded, half failed: each row is independent. Fix failed rows + retry just those.
Related
Bulk Launch across multiple ad accounts — multi-account specifics
Launch across multiple ad platforms at once — cross-platform pattern
Campaign Creator overview — when to choose Bulk vs Express/Pro