Text and call CampaignsPro
Message or call your whole list
Send templates or message sequences, or dial a list and route every answered call. Opt-outs, pacing and warm-up apply to each send from your Pro numbers.
- Rows in one audience import
- 100,000
- Call attempts per recipient
- 10
- Message campaign webhook events
- 17
- Numbers that can launch
- Pro
Text and calls
Two kinds of campaign, one workflow.
Both are drafted, scheduled, paused, resumed and stopped the same way, and both report a result for every recipient.
Answered calls
Decide what happens when someone picks up.
Each call campaign has one answer action, fixed at launch so later edits never change a running campaign.
Audiences
Your list, your variables.
Import a CSV into a reusable audience, add members inline, or retarget the people from an earlier campaign by what they did.
Built-in safety
Checks run on every send.
Campaigns is the only bulk sending path, so every bulk message and every campaign call passes the same checks.
Scheduling
Send at the right moment.
Pick the days and hours a campaign may send or call, then follow up once people have read the first message.
- Up to 4 time ranges a day
- Each recipient's zone, from a variable or their country code
- Recipients outside the window wait in the queue
- Up to 2 calling windows a day
- Up to 50 blackout dates
- Retries wait for the window to open
- One follow-up, from the number that sent the first
- Timed from delivery, or from the read when there is one
- A reply, an opt-out or a stop cancels it
- Send a draft to a number your team connected
- Up to 20 tests a team each hour
- Tests stay out of campaign stats and webhooks
Results
From delivered to converted.
Follow each recipient past the read receipt: the links they open, the replies they choose and the purchases you attribute.
In your code
Campaigns from your own data.
Create, schedule and follow message and call campaigns from the CRM or store you already run.
import { MessagingClient } from "@polymorfa/sdk";
const messaging = new MessagingClient({
credential: { type: "apiKey", value: process.env.POLYMORFA_KEY! },
});
const draft = await messaging.campaigns.create("acme", {
name: "Spring restock",
templateId,
recipients: [{ phone: "+15550001111", variables: { name: "Dana" } }],
sendWindow: {
days: ["monday", "tuesday", "wednesday", "thursday", "friday"],
hours: [{ start: "09:00", end: "18:00" }],
recipientTimeZone: true,
},
});API surface
The Campaigns API.
Campaigns live under a project. Audiences and opt-outs are team-wide on the Platform API.
Message campaigns
- POST
/Create a draftmessaging/ projects/ {project}/ campaigns - POST
/Send a testmessaging/ projects/ {project}/ campaigns/ {id}/ test-send - POST
/Launch now or latermessaging/ projects/ {project}/ campaigns/ {id}/ launch - POST
/Import a CSV audienceplatform/ audiences/ uploads - POST
/Report a conversionplatform/ campaigns/ {campaignId}/ conversions
Call campaigns
- POST
/Create a draftplatform/ voice/ campaigns - POST
/Import a dial listplatform/ voice/ campaigns/ {id}/ recipients/ import - POST
/Start dialingplatform/ voice/ campaigns/ {id}/ launch - GET
/Every dial and its resultplatform/ voice/ campaigns/ {id}/ attempts - GET
/Answer and listen ratesplatform/ voice/ campaigns/ {id}/ analytics
Message campaign events
- Event
campaign.launchedSending started - Event
campaign.recipient_readThe first read receipt - Event
campaign.recipient_repliedA reply within seven days - Event
campaign.recipient_link_openedThe first open of a tracked link - Event
campaign.cold_blockedA send held for a cold recipient
Call campaign events
- Event
voice_campaign.launchedDialing started - Event
voice_campaign.attempt_completedOne dial, its result and how much played - Event
voice_campaign.recipient_completedReached, unreached or skipped - Event
voice_campaign.pausedYou or a check paused it - Event
voice_campaign.completedEvery recipient settled
Start with a free number
Your first real number is free. Add more numbers on Pay-As-You-Go.