Skip to main content

Campaigns

Campaigns

Lifecycle guide for creating, activating, pausing, and cloning campaign experiences.

Audience: Growth and lifecycle teams operating campaigns across one or more sites.

Critical: Campaign runtime exposure happens through /api/v1/public/sites/:siteKey/campaigns and only eligible active campaigns are returned.

Who This Page Is For

Use this page when you need an operational contract for campaign CRUD, publish lifecycle transitions, and metrics-aware campaign listing.

Quick Start (2-5 Minutes)

1

Create draft campaign

Create campaign with content, placement, and initial status controls.

POST /api/v1/campaigns
2

Review and publish

Move campaign from draft/scheduled to active delivery.

POST /api/v1/campaigns/:id/publish
3

Pause during incident window

Pause campaign instantly without deleting its history.

POST /api/v1/campaigns/:id/pause
4

Activate again

Re-enable a paused campaign after fixes or timing changes.

POST /api/v1/campaigns/:id/activate
5

Validate runtime delivery

Confirm expected campaigns are returned to storefront runtime.

GET /api/v1/public/sites/:siteKey/campaigns

Core endpoints

POST   /api/v1/campaigns
GET    /api/v1/campaigns
GET    /api/v1/campaigns/:id
PUT    /api/v1/campaigns/:id
POST   /api/v1/campaigns/:id/publish
POST   /api/v1/campaigns/:id/pause
POST   /api/v1/campaigns/:id/activate
POST   /api/v1/campaigns/:id/clone
DELETE /api/v1/campaigns/:id
GET    /api/v1/public/sites/:siteKey/campaigns

Required Fields / Minimum Payload

FieldRequiredTypeUsed by eventsDescription
nameRequiredstringCampaign create/updateCampaign display name for operations and reporting.
siteIdRequireduuidCampaign createSite scope for campaign delivery and analytics.
typeRequiredWidgetTypeCampaign renderingCampaign visual form (banner, popup, slide-in, etc.).
contentJson or contentOptionalobjectCampaign renderingRuntime copy and CTA content fields.
startDate / endDateOptionalISO stringSchedulingWindow where campaign can be considered eligible.
priorityOptionalintConflict resolutionHigher priority can win when placements overlap.
segmentTargetingMode + segmentIdsConditionalstring + uuid[]Audience gatingUse for include/exclude audience controls.

List with metrics

GET /api/v1/campaigns?siteId=SITE_ID&withMetrics=true&days=30

Event or Endpoint Decision Matrix

ScenarioUse ThisWhy
Create a campaign draftPOST /api/v1/campaignsInitial create with validation and audit trail.
Push campaign livePOST /api/v1/campaigns/:id/publishExplicit publish transition; avoids ambiguous status edits.
Temporary stopPOST /api/v1/campaigns/:id/pausePreserves campaign settings and historical metrics.
Re-run an existing campaignPOST /api/v1/campaigns/:id/activateRestores delivery without creating duplicate records.
Create a variant quicklyPOST /api/v1/campaigns/:id/cloneKeeps configuration baseline and reduces setup time.

Common Errors and Fixes

Campaign is active but not visible on storefront

Cause: Public guard checks failed (site verification, origin, or subscription) or targeting rules do not match page/user.

Fix: Validate site domain/origin, subscription state, page targeting, and segment filters.

Cannot publish campaign

Cause: User role lacks campaign publish permission.

Fix: Ensure account has campaign publish capability in RBAC settings.

Unexpected campaign ordering

Cause: Priority values conflict across multiple active campaigns.

Fix: Normalize priority strategy per placement zone.

Metrics list returns empty values

Cause: withMetrics requested without valid siteId filter.

Fix: Call list endpoint with both siteId and withMetrics=true.

Production Checklist

  • Campaign naming follows a stable convention (channel, objective, date).Required
  • Publish/pause workflows are used instead of ad hoc status mutation.Required
  • withMetrics queries are run with explicit siteId and days window.Required
  • Public campaign payload validated in production storefront context.Required
  • Retired campaigns are cloned only when intentional and traceable.Required

Email Campaign Audience Snapshot

Email campaign delivery uses send-time audience resolution and snapshot metrics.

  • Create/update endpoints: POST /api/v1/email/campaigns, PUT /api/v1/email/campaigns/:id
  • audienceConfig supports merged sources: manual_csv, newsletter, users
  • Segment filters are applied at send time via segmentTargetingMode + segmentIds
  • Snapshot fields are persisted on campaign: audienceSnapshotJson, audienceResolutionStatus, audienceResolvedAt
  • Contacts without segment identity are excluded from segment-filtered sends and counted in snapshot reasons
  • Backward compatibility: legacy recipients payload remains supported for manual/CSV workflows

Next Steps