# Campaigns: one-time, recurring and API-triggered

> In Campaigns → New Campaign, pick the Schedule Type (One-time, Recurring or API Trigger), a channel (Email, with up to 3 webhooks, or WhatsApp), the segments and the Lead Re-entry Window. Test with a real contact, activate and track processed, delivered, opens, clicks, opt-outs and errors.

Fonte: https://wiki.bip.marketing/en-us/campaigns · Atualizado: 2026-10-08

<UseCaseMeta effort="nocode" channel="email,whatsapp,webhook" plan="free" />

Send the right message to the right people at the right time: just once, every Monday at 9 a.m., or the second someone abandons their cart. A campaign brings together the when (schedule), the how (email, WhatsApp or webhooks) and the who (segments).

<Checklist items="A BIP account (the free plan works)|A saved segment, for One-time and Recurring campaigns|A ready email template, or an approved WhatsApp template and a connected number (paid plans)|For API Trigger: an API key with the campaigns:trigger scope" />

## What you'll get

- A single send right now or at a set date and time, in the time zone you choose.
- Recurring sends every day, on a day of the month or on specific weekdays, with the segment recalculated on every run.
- API triggers for one contact at a time, immediately or with a delay, with cancellation before the send.
- Webhooks to your CRM or system for every contact in the campaign, alongside the email or instead of it.
- Live stats: deliveries, opens, clicks, opt-outs, errors, top clicked links and each recipient's history.

## How it works

<Steps items="Choose the schedule type: One-time, Recurring or API Trigger|Set the channel and the message: email, WhatsApp or webhooks|Activate and track the stats" />

On every send, BIP:

- recalculates the segments with the data at that moment;
- sends once per contact, even if they're in more than one of the campaign's segments;
- skips anyone who unsubscribed from the channel or from all communications;
- applies the **Lead Re-entry Window**, which decides whether someone who already got the campaign can get it again;
- on BIP Lite, including the free plan, checks the month's send balance before starting. If the balance doesn't cover every contact, the send doesn't start: nobody gets part of the campaign.

Each campaign uses one channel: **Email** or **WhatsApp**. To reach the same audience on both, create one campaign per channel.

## Step by step

### 1. Create the campaign

1. In the menu, click **Campaigns**. The list shows each campaign with its **Type**, **Performance**, **Status** and **Updated** date, organized by group.
2. Click **New Campaign**. BIP creates a campaign in **Draft**, named **[untitled]** followed by the date and time, and opens the edit screen.

<Shot src="/img/campanhas/1-en-us.png" alt="Campaign list with the New Campaign button" url="dash.bip.marketing/…/campaigns" />

### 2. Fill in the details

In **Campaign Details**:

1. Type the **Campaign Name** and, next to it, pick an emoji to spot it in the list.
2. In **Group**, choose where it goes in the list. Groups are created in **Settings** → **Groups** → **Campaigns Groups**.
3. In **Description**, write down the goal so your team knows what it's about.

<Shot src="/img/campanhas/2-en-us.png" alt="Campaign Details with name, emoji, group and description" url="dash.bip.marketing/…/campaigns/…" />

### 3. Choose when to send

In **Schedule Type**, pick a tab:

- **One-time**: leave **Start Date** blank to send as soon as you activate, or pick the date, the **Time** and the **Timezone**.
- **Recurring**: choose the **Frequency** (**Daily**, **Monthly** or **Custom**), the **Time** and the **Timezone**. Below, BIP spells out the schedule, like _Every day at 09:00_.
- **API Trigger**: choose the **Trigger Mode**, **Immediate** or **Delay**. Your system calls BIP for each contact.

All the options are in the Reference section below.

<Shot src="/img/campanhas/3-en-us.png" alt="Schedule Type with the One-time, Recurring and API Trigger tabs" url="dash.bip.marketing/…/campaigns/…" />

### 4. Set re-entry

In **Lead Re-entry Window**, decide whether the same person can get this campaign more than once:

1. With **Allow Lead Re-entry** off (the default), each contact gets the campaign only once.
2. With it on, enter the **Cooldown Period (Days)**: the minimum number of days between two sends to the same person. With `0`, there's no limit.

For recurring campaigns that should reach people on every run, like a weekly newsletter, turn re-entry on.

<Shot src="/img/campanhas/4-en-us.png" alt="Lead Re-entry Window with Allow Lead Re-entry on and the Cooldown Period in days" url="dash.bip.marketing/…/campaigns/…" />

### 5. Choose the channel and the message

In **Channel**, click **Email** or **WhatsApp**.

With **Email**:

1. In **From Name**, type the name that shows in the inbox. Leave it empty to use the account's name.
2. In **From Email**, keep **Account Default** or, if you have a verified domain, pick the domain and type the part before the @.
3. In **Email Template**, turn on the campaign's template. Search finds templates by name.
4. In **Webhooks**, turn on up to 3 webhooks to receive each contact's data in your system.

An email campaign can send webhooks only: leave **Email Template** unselected and turn on at least one webhook.

With **WhatsApp** (paid plans, with a connected number), fill in the **WhatsApp Template** section: the approved **Template**, the sending **Phone Number**, the header media if the template has any, and the **Variable mappings**.

<Shot src="/img/campanhas/5-en-us.png" alt="Email channel with sender, email template and webhooks" url="dash.bip.marketing/…/campaigns/…" />

### 6. Select the segments

In **Segments**, turn on one or more segments. Search finds segments by name. Anyone in more than one segment gets the campaign only once.

**API Trigger** campaigns don't have this section: the contact comes in with the API call.

<Shot src="/img/campanhas/6-en-us.png" alt="Segments section with two segments turned on" url="dash.bip.marketing/…/campaigns/…" />

### 7. Test with a real contact

1. Click **Save** → **Save Draft**. The test uses the saved version.
2. Click **Test Campaign**.
3. Type the email, phone, ID or tracker of a contact who's already in BIP, ideally yourself.
4. Click **Send Test**.

The test sends for real: the email, the WhatsApp message and the webhooks go out to that contact exactly as they will to everyone. BIP opens **Campaign Stats**, where the test shows up with the `[test]` prefix. Tests don't use sends from your balance.

<Shot src="/img/campanhas/7-en-us.png" alt="Test Campaign window with the contact field and the Send Test button" url="dash.bip.marketing/…/campaigns/…" />

### 8. Activate

1. Click **Save** and pick the option for your schedule type:
    - **Save and Send** (One-time with no date);
    - **Save and Schedule** (One-time with a date);
    - **Save and Activate** (Recurring and API Trigger).
2. Review the confirmation window and click **Send Campaign Now**, **Schedule Campaign**, **Activate Recurring Campaign** or **Activate API Trigger**. To go back and review, click **Review Again**.
3. BIP opens **Campaign Stats**.

<Callout type="warning">
A **One-time** campaign sent now goes out to every recipient immediately and can't be undone. Test first.
</Callout>

<Shot src="/img/campanhas/8-en-us.png" alt="Ready to Launch Your Campaign? confirmation window" url="dash.bip.marketing/…/campaigns/…" />

## Reference

### Schedule types

| Type | Options | When it goes out |
| --- | --- | --- |
| **One-time** | **Start Date** (blank = immediately), **Time** and **Timezone** | Once, on activation or on the set date |
| **Recurring** | **Frequency**, days, **Time** and **Timezone** | On every date in the schedule, until you pause it |
| **API Trigger** | **Trigger Mode**: **Immediate** or **Delay**, with **Delay (Seconds)** | One contact at a time, when your system calls the API |

In the campaign list, the **Type** column shows **One-time**, **Scheduled** (One-time with a date), **Recurring** or **API Trigger**.

### One-time

| Option | What it does |
| --- | --- |
| **Start Date** | The send date. Leave it blank and the campaign goes out as soon as you activate it. The date must be in the future |
| **Time** | Hour and minute, in 5-minute steps. Appears after you pick the date and starts at 09:00 |
| **Timezone** | The time zone of the chosen time. Defaults to the account's time zone; for Brasília, **BRT (Sao Paulo) (-03:00)** |

### Recurring

| Option | What it does |
| --- | --- |
| **Frequency** → **Daily** | Every day, at the chosen time |
| **Frequency** → **Monthly** | Once a month, on the chosen **Day of Month** (1st to 31st) |
| **Frequency** → **Custom** | On the **Days of Week** you check. Hover over each letter to see the day's name |
| **Time** | Hour and minute, in 5-minute steps |
| **Timezone** | The schedule's time zone. Defaults to the account's time zone |

The schedule is spelled out below the options: _Every day at 09:00_, _Weekends at 10:00_, _Monday, Wednesday and Friday at 18:30_ or _1st day of every month at 09:00_.

On every run, BIP recalculates the segments. Anyone who joined the segment since the last run gets it; anyone who left doesn't. The **Lead Re-entry Window** decides whether someone who already got it gets it again.

### API Trigger

| Option | What it does |
| --- | --- |
| **Immediate** | The campaign goes out to the contact as soon as BIP receives the call |
| **Delay** | BIP waits for the **Delay (Seconds)** before sending. If another call arrives for the same contact, the timer restarts from zero |
| **API Integration** | Panel with ready-made commands that already include the campaign ID: `POST` and `GET` on `/api/campaigns/trigger` and, in **Delay** mode, on `/api/campaigns/cancel` |

- The API key needs the `campaigns:trigger` scope, sent in the `x-bip-api-key` header or the `?api-key=` parameter.
- In `lead`, send the email, phone, ID or tracker of an existing contact. Or send an object with the contact's data: BIP creates or updates the contact and triggers the campaign in the same call. For that, the key also needs the `leads:write` scope.
- In **Delay** mode, `/api/campaigns/cancel` cancels that contact's pending send. A canceled send doesn't go out and doesn't count against your balance.
- The campaign only accepts triggers while its status is **Active**.

### Lead Re-entry Window

| Setting | Who gets it |
| --- | --- |
| **Allow Lead Re-entry** off | Each contact gets the campaign only once. In a recurring campaign, each run includes only people who haven't received it yet |
| On, **Cooldown Period (Days)** = `0` | No limit: the contact gets it every time they're in the audience or are triggered |
| On, **Cooldown Period (Days)** = _N_ | The contact gets it again only _N_ days after the previous send |

With `0`, BIP warns that the same person may get it several times on the same day. In a recurring campaign, use a period shorter than the interval between runs: for a weekly campaign, `6` days. In the stats, anyone the window held back shows up as **Rejected**, with the reason **Lead has already received this campaign** or **Lead is within the re-entry window**.

### Email channel

| Option | What it does |
| --- | --- |
| **From Name** | The name that shows in the inbox. Empty, the account's name is used |
| **From Email** | **Account Default** or an address on a domain verified in **Settings** → **Email Domains** |
| **Email Template** | The email's content. One template per campaign |
| **Webhooks** | Up to 3 webhooks fired for each contact in the campaign |

An email campaign needs an **Email Template**, at least one webhook, or both.

### WhatsApp channel

The **WhatsApp** tab becomes available once you connect a number (paid plans). In the **WhatsApp Template** section:

| Option | What it does |
| --- | --- |
| **Template** | An approved template, marketing or utility |
| **Phone Number** | The sending number. **Use account default phone number** uses the number marked as default |
| **Header image** / **Header media URL** | Appears when the template has header media. Empty, the template's own media is used |
| **Variable mappings** | Links each template variable to a piece of contact data. Every variable needs a value |

### Segments

- You can turn on several segments. Each contact gets one message per send.
- Only saved segments appear in the list; those in **Draft** don't.
- **API Trigger** campaigns don't use segments.

### Status

| Status | What it means |
| --- | --- |
| **Draft** | Being edited. Nothing goes out |
| **Scheduled** | One-time with a set date, waiting for the time |
| **Active** | Recurring and waiting for the next run, or API Trigger ready to receive calls |
| **Queued** | Waiting to be processed |
| **Sending** | The send is in progress |
| **Completed** | The One-time send is done |
| **Paused** | Stopped by you. Can be edited and activated again |

### Actions

| Action | What it does |
| --- | --- |
| **Save Draft** | Saves changes without activating |
| **Save and Send** / **Save and Schedule** / **Save and Activate** | Saves and activates, after confirmation |
| **Test Campaign** | Sends the saved campaign to a contact in BIP |
| **Campaign Stats** | Opens the campaign's numbers |
| **Pause Campaign to Edit** | Appears on **Active** and **Scheduled** campaigns. Pauses sending and unlocks editing. To resume, save and activate again |
| **Duplicate** (in the list) | Creates a copy in **Draft**, with _(Clone)_ added to the name and the same settings, except **Start Date**, which comes back blank |
| Trash can (in the list) | Deletes **Draft**, **Paused** or **Completed** campaigns |

**Scheduled**, **Active**, **Queued**, **Sending** and **Completed** campaigns are locked for editing. To repeat a completed campaign, use **Duplicate**.

### Send balance

On BIP Lite, including the free plan, BIP adds up the contacts in the segments before each send and checks the month's balance. If there isn't enough balance for everyone, the campaign doesn't start and no contact receives it. Adjust your volume in **Settings** → **Billing** or use a smaller segment, then activate again. With **API Trigger**, each trigger that goes out uses one send from the balance.

## Ready to copy

### Schedules

| Campaign | Schedule Type | Frequency | Time and time zone | Lead Re-entry Window |
| --- | --- | --- | --- | --- |
| Today's birthdays | Recurring | Daily | 09:00, BRT (Sao Paulo) (-03:00) | On, `300` days |
| Weekly newsletter | Recurring | Custom: Monday | 09:00, BRT (Sao Paulo) (-03:00) | On, `6` days |
| Monthly recap | Recurring | Monthly: 1st | 10:00, BRT (Sao Paulo) (-03:00) | On, `25` days |
| Welcome for newcomers | Recurring | Daily | 10:00, BRT (Sao Paulo) (-03:00) | Off: each contact gets it once |
| Deal of the week | One-time | Start Date: the promotion date | 08:00, BRT (Sao Paulo) (-03:00) | Off |
| Abandoned cart | API Trigger | Delay: `3600` seconds | — | On, `1` day |

For "Welcome for newcomers", use a segment like **Creation Date** → **Equals** → Relative `-1` Days: people who joined BIP yesterday. That way each daily run counts only the previous day's contacts, and send balance isn't reserved again for people already included in past runs. See more rules in [Segments](/en-us/segments).

### Name and description

<Copy label="Campaign name and description">
🎂 Today's birthdays — Padaria Aurora
Birthday wishes with a coupon for everyone whose birthday is today. Recurring, daily at 09:00; each person gets it once a year.
</Copy>

### Trigger via API

Replace `YOUR_API_KEY` with your key and `CAMPAIGN_ID` with the ID shown in the **API Integration** panel.

<Copy label="Trigger for an existing contact (POST)" code>
curl -X POST https://api.bip.marketing/api/campaigns/trigger \
  -H "Content-Type: application/json" \
  -H "x-bip-api-key: YOUR_API_KEY" \
  -d '{"campaignId": "CAMPAIGN_ID", "lead": "marina.alves@exemplo.com"}'
</Copy>

<Copy label="Create or update the contact and trigger (POST)" code>
curl -X POST https://api.bip.marketing/api/campaigns/trigger \
  -H "Content-Type: application/json" \
  -H "x-bip-api-key: YOUR_API_KEY" \
  -d '{"campaignId": "CAMPAIGN_ID", "lead": {"name": "Marina Alves", "email": "marina.alves@exemplo.com", "phone": "+5541998765432", "tags": ["cart"]}}'
</Copy>

<Copy label="Trigger with GET" code>
curl "https://api.bip.marketing/api/campaigns/trigger?campaignId=CAMPAIGN_ID&lead=marina.alves@exemplo.com&api-key=YOUR_API_KEY"
</Copy>

<Copy label="Cancel a delayed send (POST)" code>
curl -X POST https://api.bip.marketing/api/campaigns/cancel \
  -H "Content-Type: application/json" \
  -H "x-bip-api-key: YOUR_API_KEY" \
  -d '{"campaignId": "CAMPAIGN_ID", "lead": "marina.alves@exemplo.com"}'
</Copy>

Responses:

<Copy label="Trigger response" code>
{"campaignId": "CAMPAIGN_ID", "leadId": "CONTACT_ID", "mode": "delay"}
</Copy>

<Copy label="Cancellation response" code>
{"campaignId": "CAMPAIGN_ID", "cancelled": true, "leadId": "CONTACT_ID"}
</Copy>

On cancellation, `"cancelled": false` means there was no pending send for that contact.

## How to measure

Open **Campaign Stats** (at the top of the campaign or with the chart icon in the list). The **Live** badge shows that the numbers update in real time, even during the send. At the top, **Edit Campaign** takes you back to editing and **Test Campaign** sends a new test.

For email campaigns:

| Metric | What it shows |
| --- | --- |
| **Processed** | Contacts BIP has processed. For One-time, it shows progress against the send's total. For Recurring and API Trigger, **Processed (_N_ runs)** adds up all runs |
| **Delivered** | Emails sent out of those processed |
| **Open Rate** | Unique opens out of emails sent |
| **Click Rate** | Unique clicks out of emails sent |
| **Click-to-Open Rate** | Clicks out of opens |
| **Opt Outs** | People who unsubscribed through this campaign. With **Opt Outs (prev: _N_)**, _N_ is the number of people who had already unsubscribed and didn't receive it |
| **Errors** | Emails that couldn't be sent, such as to contacts with no email |
| **Webhook Delivery** / **Webhook Errors** | Webhooks delivered and failed, when the campaign has webhooks |
| **Delivery Breakdown** | Chart splitting sent, opens, clicks, opt-outs and errors |
| **Top clicked links** | The 10 links with the most clicks |

For WhatsApp campaigns, the metrics are **Sent**, **Delivered**, **Read Rate**, **Reply Rate**, **Reply-to-Read Rate**, **Opt Outs**, **Errors**, **Rejected**, **Unsubscribed** and **Held**.

Below the numbers, **Recipient Interactions** lists each contact with date, type and status. Filter by status (for example **Clicked**, **Opened**, **Error** or **Rejected**), search by name or email and click **View Lead** to open the profile.

BIP ignores opens in the first 30 seconds after the send (they're automatic previews from some providers) and clicks from known bots. A click also counts as an open, even if the email client blocked images.

## Frequently asked questions

### Can I send email and WhatsApp in the same campaign?

No. Each campaign uses one channel. Create the email campaign, click **Duplicate** in the list and switch the copy's **Channel** to **WhatsApp**.

### How do I resend a campaign that's already completed?

In the campaign list, click **Duplicate**. The copy comes back as a **Draft**, with the same settings and a blank **Start Date**. Pick the new date before activating: with no date, the campaign goes out as soon as you click **Save and Send**.

### Does the test use up sends?

No. **Test Campaign** sends for real to the chosen contact, but doesn't count against your balance. The contact must be in BIP and can't have unsubscribed from the channel.

### My recurring campaign only sent the first time. Why?

With **Allow Lead Re-entry** off, each contact gets the campaign only once, and later runs reach only people who joined the segment afterward. To send on every run, pause the campaign, turn re-entry on with a **Cooldown Period (Days)** shorter than the schedule's interval, and activate it again.

## See also

- [Segments: the 10 criteria to filter contacts](/en-us/segments)
- [Email editor: blocks, variables and preview](/en-us/email-editor)
- [WhatsApp templates: create, sync and use](/en-us/whatsapp-templates)
- [Webhooks: push every send to your system](/en-us/webhooks)
- [BIP API: keys, contacts, events and triggers](/en-us/api)
- [Plans and limits: sends, capacity and pricing](/en-us/plans-and-limits)
