Skip to main content

Bulk vs Transactional vs Direct

Transformify supports three sending patterns: bulk (promotional), transactional, and direct send.

Bulk / Promotional

Bulk sends deliver messages to many recipients at once. Use for:

  • Marketing campaigns
  • Announcements
  • Promotional offers
  • Newsletters

How It Works

  1. Call the bulk endpoint with a template and recipients — returns 202 immediately
  2. A campaign is created with Queuing status while messages are prepared in the background
  3. Poll GET /api/v1/campaigns/{id} until status reaches Ready
  4. Call POST /api/v1/campaigns/{id}/start to begin delivery
  5. Campaign moves to InProgress and completes when all messages are processed

SMS Promotional

curl -X POST https://api.transformify.mk/api/v1/sms/promotional \
-H "X-API-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"templateId": "template-id",
"recipients": [
{
"phoneNumber": "38970111111",
"placeholders": { "name": "John", "promoCode": "JOHN20" }
},
{
"phoneNumber": "38970222222",
"placeholders": { "name": "Jane", "promoCode": "JANE20" }
},
{
"phoneNumber": "38970333333",
"placeholders": { "name": "Bob", "promoCode": "BOB20" }
}
]
}'

Viber Bulk

curl -X POST https://api.transformify.mk/api/v1/viber/send \
-H "X-API-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"templateId": "viber-template-id",
"recipients": [
{
"phoneNumber": "38970111111",
"placeholders": { "name": "John" }
},
{
"phoneNumber": "38970222222",
"placeholders": { "name": "Jane" }
}
]
}'

Characteristics

FeatureBulk
RecipientsMany at once
ChannelsSMS (/sms/promotional) or Viber (/viber/send)
PlaceholdersPer-recipient (with optional request-level fallback)
LifecycleQueuingReady → start manually → InProgressCompleted
Use caseMarketing, announcements, batch notifications

Transactional

Transactional campaigns send individual messages in real-time via SMS or Viber. Use for:

  • OTP codes
  • Order confirmations
  • Delivery updates
  • Appointment reminders
  • Any event-triggered message

How It Works

  1. Create a campaign with POST /api/v1/sms/campaigns or POST /api/v1/viber/campaigns
  2. Campaign stays open (InProgress status)
  3. Add messages one at a time with POST /api/v1/{channel}/campaigns/{id}/messages
  4. Each message is processed immediately

SMS Example

Step 1: Create Campaign (once)

curl -X POST https://api.transformify.mk/api/v1/sms/campaigns \
-H "X-API-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"name": "Order Notifications",
"description": "Transactional campaign for order status updates",
"templateId": "sms-template-id"
}'

Step 2: Add Messages (on each event)

curl -X POST https://api.transformify.mk/api/v1/sms/campaigns/{campaignId}/messages \
-H "X-API-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"phoneNumber": "38970123456",
"externalUserId": "order_12345",
"placeholders": {
"orderId": "ORD-12345",
"status": "shipped",
"trackingNumber": "1Z999AA10123456784"
}
}'

Viber Example

Step 1: Create Campaign (once)

curl -X POST https://api.transformify.mk/api/v1/viber/campaigns \
-H "X-API-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"name": "Appointment Reminders",
"templateId": "viber-template-id"
}'

Step 2: Add Messages (on each event)

curl -X POST https://api.transformify.mk/api/v1/viber/campaigns/{campaignId}/messages \
-H "X-API-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"phoneNumber": "38970123456",
"externalUserId": "appointment_789",
"placeholders": {
"name": "John",
"appointmentDate": "2024-01-20"
}
}'

Characteristics

FeatureTransactional
RecipientsOne at a time
ChannelsSMS (/sms/campaigns) and Viber (/viber/campaigns)
PlaceholdersUnique per message
LifecycleCampaign stays open indefinitely
Use caseEvent-driven notifications


Direct Send

Direct send lets you fire off messages without creating templates or managing campaigns. Just provide message content, a sender/service ID, and recipients.

How It Works

  1. Call POST /api/v1/sms/send or POST /api/v1/viber/send-text with raw message content and recipients
  2. Messages are queued for immediate processing

SMS Example

curl -X POST https://api.transformify.mk/api/v1/sms/send \
-H "X-API-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"messageContent": "Your order #12345 has been shipped!",
"smsSenderId": 1,
"recipients": [
{ "phoneNumber": "38970123456" },
{ "phoneNumber": "38970123457" }
]
}'

Viber Example

curl -X POST https://api.transformify.mk/api/v1/viber/send-text \
-H "X-API-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"messageContent": "Your appointment is confirmed for tomorrow at 10:00 AM.",
"viberServiceId": 1,
"recipients": [
{ "phoneNumber": "38970123456" },
{ "phoneNumber": "38970123457" }
]
}'

Characteristics

FeatureDirect Send
RecipientsMultiple per request
ChannelsSMS (/sms/send) and Viber (/viber/send-text)
TemplatesNot required — raw message content
PlaceholdersNot supported
Campaign managementAutomatic (hidden)
Use caseQuick sends, simple notifications

Comparison

AspectBulk / PromotionalTransactionalDirect Send
APIPOST /sms/promotional or POST /viber/sendPOST /sms/campaigns + messages, POST /viber/campaigns + messagesPOST /sms/send or POST /viber/send-text
ChannelsSMS and ViberSMS and ViberSMS and Viber
RecipientsMany at onceOne per requestMultiple per request
TemplateRequiredRequiredNot needed
PersonalizationPer-recipient placeholdersUnique per messageNone (same content for all)
TimingAsync — poll for Ready, then startImmediateImmediate
Campaign lifecycleQueuing → Ready → start → CompletedStays openAutomatic (hidden)
Best forMarketing, batch notificationsEvent-driven notificationsQuick sends, simple notifications

When to Use Each

Use Bulk When:

  • Sending messages to many people at once
  • Running a marketing campaign
  • Making an announcement
  • You have all recipient data available upfront
  • Sending via either SMS or Viber

Use Transactional When:

  • Messages are triggered by events (orders, signups, etc.)
  • Each message needs unique content via template placeholders
  • Real-time delivery is important
  • You need to send messages over an extended period
  • Sending via SMS or Viber

Use Direct Send When:

  • You want the simplest integration — no template setup required
  • Sending the same message to a batch of recipients
  • Quick notifications that don't need placeholder personalization
  • Sending via SMS or Viber (simple text only for Viber)