Bulk Launch overview — grid interface
Bulk Launch at /launch — spreadsheet grid for many campaigns at once. Async via SQS worker. Status polling. Multi-account + multi-platform.
Written By Salvatore Sinigaglia
Last updated About 1 hour ago
Bulk Launch at /launch — spreadsheet grid for many campaigns at once. Async via SQS worker. Status polling. Multi-account + multi-platform.
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). The grid is scoped to one active platform at a time (Meta, Google, TikTok, Taboola, Snapchat, or Outbrain) — switching platform hides the other platform's rows while keeping their drafts. All rows publish in parallel via SQS workers. Batch status is polled at
POST /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
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:
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. All rows in the grid belong to the currently active platform; to launch on another platform, switch the active platform (each platform keeps its own set of rows). Rows within a platform are independent — one can succeed while another fails.
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
- Delete selected rows (select rows via checkbox, then use the toolbar action)
- 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 payload - Returns
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 batchPOST /api/v1/bulk-launch/status/batch— status for a set of 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:
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 (required fields, budget minimum, pixel for conversion objectives, DSA for EU, bid strategy, ad category)
- 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 (one platform at a time)
- Fill and publish the grid for the active platform (e.g. Meta), then switch the active platform (e.g. Google) and fill/publish that platform's rows
- Each platform keeps its own set of rows and drafts; same campaign concept, platform-specific specs
- See cc-123 multi-platform launch
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.
FAQ
What is Bulk Launch in Wevion?
Wevion's Bulk Launch is a spreadsheet-grid at /launch where each row is one campaign and the columns are the fields you'd otherwise fill in Express or Pro (account, pixel, name, budget, audience, creative). The grid is scoped to one active platform at a time (Meta, Google, TikTok, Taboola, Snapchat, or Outbrain). All rows publish in parallel via SQS workers, and you track batch status via POST /bulk-launch/status/batch. It's built for launching many campaigns at once.
When should I use Bulk Launch instead of Express or Pro?
Use Bulk Launch when you have three or more similar campaigns to launch; for one or two, Express or Pro is faster. Wevion treats three to nine campaigns as a time-saver — fill once, customize variants — and ten-plus as essential, since doing them manually would take hours. Pair it with a campaign template for repeatable patterns.
How does Wevion publish bulk campaigns?
When you click Publish all, Wevion sends the grid to POST /api/v1/bulk-launch, which returns a workerRunId immediately and queues per-row jobs to SQS workers that publish each row to its ad platform. The UI polls every few seconds and updates each row's badge from Pending to In progress to Success or Failed.
Can I retry only the rows that failed?
Yes. In Wevion's Bulk Launch each row is an independent campaign spec, so you can retry failed rows individually without redoing the rest. Failed rows are highlighted red with the error message visible in the right panel — common causes include a missing pixel_id for a Sales objective or missing DSA fields for EU geo.
When are DSA fields required in Bulk Launch?
Wevion requires the DSA fields when target_country is in the EU, or when target_countries includes an EU country. Both dsa_beneficiary (who benefits from the ad) and dsa_payor (who pays for it) become mandatory, and Bulk Launch enforces them at validation — errors block publish. See cc-120 EU compliance for full DSA context.