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

Express or Pro

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

ad_type

Yes

Standard / Multilanguage / Catalog / App Install

account_id

Yes

Meta Ad Account ID (or per-platform equivalent)

fan_page_id

Yes (Meta)

Meta Fan Page ID

pixel_id

Yes (conversion objectives)

Pixel ID

campaign_name

Yes

Campaign name

budget_optimization

Yes

CBO / BID CAP / COST CAP / MIN ROAS / ABO

daily_budget

Yes

Daily budget in cents

adset_names

Yes

Array of ad set names

bid_amounts

Conditional

Per-adset bid (required for ABO + non-CBO bid strategies)

target_cities

Optional

Array with key + radius (10-80km) + distance_unit

target_country

Yes (default)

Country code (e.g. IT)

target_countries

Optional

Multi-country array

target_regions

Optional

Sub-national regions

dsa_beneficiary

Yes (EU geo)

DSA beneficiary

dsa_payor

Yes (EU geo)

DSA payor

min_age

Yes

Minimum age targeting

max_age

Yes

Maximum age targeting

gender

Yes

All / Male / Female

...

...

(Many more fields per 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. 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:

  1. Backend receives POST /api/v1/bulk-launch with the grid as payload

  2. Returns workerRunId immediately (async accepted)

  3. Queues per-row jobs to SQS worker

  4. Worker publishes each row to the respective ad platform

  5. Per-row status tracked in DB

Status polling endpoints (verified):

  • GET /api/v1/bulk-launch/status/:workerRunId — overall progress of one batch

  • GET /api/v1/bulk-launch/status/batch — list all recent batches

  • POST /api/v1/bulk-launch/nested — nested batch publish (campaign → adsets → ads at scale)

UI polls every few seconds and updates row status badges: PendingIn progressSuccess / 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:

  1. Configure a campaign template (cc-118)

  2. Open Bulk Launch

  3. Import from template (top toolbar)

  4. Template fields auto-fill all rows

  5. Customize per-row variants (different ad account, different audience tweak)

  6. 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

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_id for 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