--- title: Campaigns description: Send one-time email broadcasts --- ## What are campaigns Campaigns are one-time email broadcasts sent to your audience. Use them for: - Product announcements - Newsletter distributions - Seasonal promotions - Feature launches Unlike workflows (automated sequences), campaigns send once to a snapshot of your audience. ## Creating campaigns ### In the dashboard 1. Go to **Campaigns** 2. Click **Create Campaign** 3. Name your campaign 4. Choose your audience 5. Select a template or compose inline 6. Preview and test 7. Send or schedule ### Via API ```bash curl -X POST {{API_URL}}/campaigns \ -H "Authorization: Bearer sk_your_secret_key" \ -H "Content-Type: application/json" \ -d '{ "name": "March Newsletter", "subject": "New features this month", "body": "

What'\''s new

Check out our latest updates...

", "from": "newsletter@example.com", "fromName": "Acme Inc", "audienceType": "ALL", "status": "DRAFT" }' ``` ## Choosing your audience ### All contacts Sends to everyone in your project: ```json { "audienceType": "ALL" } ``` ### Specific segment Sends to contacts in a saved segment: ```json { "audienceType": "SEGMENT", "segmentId": "premium-users" } ``` ### Custom filters Sends to contacts matching conditions: ```json { "audienceType": "FILTERED", "audienceFilter": { "operator": "AND", "conditions": [ { "field": "data.plan", "operator": "equals", "value": "pro" }, { "field": "data.lastLoginAt", "operator": "greaterThan", "value": "2024-01-01" } ] } } ``` ## Subscription handling Campaign delivery respects your **template type**: **Marketing templates** (default) - Only sends to subscribed contacts - Unsubscribed contacts are skipped automatically - Includes unsubscribe link **Transactional templates** - Sends to all contacts, even if unsubscribed - Use only for critical business emails - No unsubscribe link Choose template type based on content, not audience size. ## Campaign states **DRAFT** — Being created, can edit freely **SCHEDULED** — Queued for future send, can cancel **SENDING** — Currently delivering, cannot stop **SENT** — Completed successfully **CANCELLED** — Scheduled campaign was cancelled ## Sending campaigns ### Send immediately ```bash curl -X POST {{API_URL}}/campaigns/campaign_id/send \ -H "Authorization: Bearer sk_your_secret_key" ``` Status changes to SENDING, emails deliver within minutes. ### Schedule for later ```bash curl -X POST {{API_URL}}/campaigns/campaign_id/send \ -H "Authorization: Bearer sk_your_secret_key" \ -H "Content-Type: application/json" \ -d '{ "scheduledAt": "2024-03-20T10:00:00Z" }' ``` Status changes to SCHEDULED. Campaign sends at the specified time. ### Cancel scheduled campaign ```bash curl -X POST {{API_URL}}/campaigns/campaign_id/cancel \ -H "Authorization: Bearer sk_your_secret_key" ``` Only works if status is SCHEDULED. ## Testing campaigns Send a test email before broadcasting: ```bash curl -X POST {{API_URL}}/campaigns/campaign_id/test \ -H "Authorization: Bearer sk_your_secret_key" \ -H "Content-Type: application/json" \ -d '{ "email": "test@example.com" }' ``` This sends to the test email without affecting campaign status. ## Campaign analytics View campaign performance: ```bash curl -X GET {{API_URL}}/campaigns/campaign_id/stats \ -H "Authorization: Bearer sk_your_secret_key" ``` Returns: ```json { "totalRecipients": 5000, "sentCount": 5000, "deliveredCount": 4980, "openedCount": 2100, "clickedCount": 450, "bouncedCount": 20, "openRate": 0.42, "clickRate": 0.09 } ``` Metrics update in real-time as recipients engage. ## Managing campaigns ### List campaigns ```bash curl -X GET {{API_URL}}/campaigns \ -H "Authorization: Bearer sk_your_secret_key" ``` Filter by status: ```bash curl -X GET "{{API_URL}}/campaigns?status=SENT" \ -H "Authorization: Bearer sk_your_secret_key" ``` ### Get campaign details ```bash curl -X GET {{API_URL}}/campaigns/campaign_id \ -H "Authorization: Bearer sk_your_secret_key" ``` ### Update draft campaign ```bash curl -X PATCH {{API_URL}}/campaigns/campaign_id \ -H "Authorization: Bearer sk_your_secret_key" \ -H "Content-Type: application/json" \ -d '{ "name": "Updated name", "subject": "New subject line" }' ``` Only works for DRAFT campaigns. ### Duplicate campaign ```bash curl -X POST {{API_URL}}/campaigns/campaign_id/duplicate \ -H "Authorization: Bearer sk_your_secret_key" ``` Creates a new draft campaign with the same content. ### Delete campaign ```bash curl -X DELETE {{API_URL}}/campaigns/campaign_id \ -H "Authorization: Bearer sk_your_secret_key" ``` Can only delete DRAFT or CANCELLED campaigns. ## Next Steps - [Build automated workflows](/guides/workflows) - [Create dynamic segments](/guides/segments) - [Track campaign analytics](/guides/analytics) - [Set up custom domains](/guides/custom-domains)