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 4 hours 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

ScenarioUse
1-2 campaigns to launch nowExpress or Pro
3-9 similar campaignsBulk Launch saves time (fill once, customize variants)
10+ campaignsBulk Launch essential (manual would take hours)
Repeatable pattern across launchesTemplate (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:

ColumnRequired?Type
ad_typeYesStandard / Multilanguage / Catalog / App Install
account_idYesMeta Ad Account ID (or per-platform equivalent)
fan_page_idYes (Meta)Meta Fan Page ID
pixel_idYes (conversion objectives)Pixel ID
campaign_nameYesCampaign name
budget_optimizationYesCBO / BID CAP / COST CAP / MIN ROAS / ABO
daily_budgetYesDaily budget in cents
adset_namesYesArray of ad set names
bid_amountsConditionalPer-adset bid (required for ABO + non-CBO bid strategies)
target_citiesOptionalArray with key + radius (10-80km) + distance_unit
target_countryYes (default)Country code (e.g. IT)
target_countriesOptionalMulti-country array
target_regionsOptionalSub-national regions
dsa_beneficiaryYes (EU geo)DSA beneficiary
dsa_payorYes (EU geo)DSA payor
min_ageYesMinimum age targeting
max_ageYesMaximum age targeting
genderYesAll / 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. 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:

  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
  • POST /api/v1/bulk-launch/status/batch — status for a set of 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:

StatusMeaning
DraftEditing, not yet validated
ValidatedAll required fields present, no errors
QueuedIn SQS queue, waiting for worker
In progressWorker publishing to platform
SuccessPublished successfully (with campaign ID)
FailedPublish 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 (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:

  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 (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_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.

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.