Skip to main content
Broadcasts allow you to send messages to multiple recipients in a single campaign.

Create Broadcast

result, err := client.Broadcasts.Create(context.TODO(), zavudev.BroadcastCreateParams{
	Name:    zavudev.String("Black Friday Sale"),
	Channel: zavudev.String("sms"),
	Text:    zavudev.String("Hi {{name}}, check out our Black Friday deals! Use code FRIDAY20 for 20% off."),
})
if err != nil {
	panic(err)
}

fmt.Println(result.Broadcast.ID)     // brd_xxx
fmt.Println(result.Broadcast.Status) // draft

WhatsApp Template Broadcast

result, err := client.Broadcasts.Create(context.TODO(), zavudev.BroadcastCreateParams{
	Name:        zavudev.String("Order Confirmation Campaign"),
	Channel:     zavudev.String("whatsapp"),
	MessageType: zavudev.String("template"),
	Content: &zavudev.BroadcastContent{
		TemplateID: zavudev.String("tpl_abc123"),
	},
})

Email Broadcast

result, err := client.Broadcasts.Create(context.TODO(), zavudev.BroadcastCreateParams{
	Name:         zavudev.String("Newsletter"),
	Channel:      zavudev.String("email"),
	EmailSubject: zavudev.String("Your Weekly Update"),
	Text:         zavudev.String("Hi {{name}}, here's what's new this week..."),
})

Get Broadcast

result, err := client.Broadcasts.Get(context.TODO(), "brd_abc123")
if err != nil {
	panic(err)
}

fmt.Println(result.Broadcast.Name)
fmt.Println(result.Broadcast.Status)
fmt.Println(result.Broadcast.TotalContacts)

List Broadcasts

result, err := client.Broadcasts.List(context.TODO(), zavudev.BroadcastListParams{})
if err != nil {
	panic(err)
}

for _, broadcast := range result.Items {
	fmt.Println(broadcast.ID, broadcast.Name, broadcast.Status)
}

// Filter by status
result, err := client.Broadcasts.List(context.TODO(), zavudev.BroadcastListParams{
	Status: zavudev.String("completed"),
	Limit:  zavudev.Int(50),
})

Update Broadcast

Update a broadcast in draft status:
result, err := client.Broadcasts.Update(context.TODO(), "brd_abc123", zavudev.BroadcastUpdateParams{
	Name: zavudev.String("Updated Campaign Name"),
	Text: zavudev.String("New message content with {{name}}"),
})

Add Contacts

Add contacts to a broadcast (max 1000 per request):
result, err := client.Broadcasts.Contacts.Add(context.TODO(), "brd_abc123", zavudev.BroadcastContactsAddParams{
	Contacts: []zavudev.BroadcastContactInput{
		{
			Recipient: "+14155551234",
			TemplateVariables: map[string]string{
				"name":     "John",
				"order_id": "ORD-001",
			},
		},
		{
			Recipient: "+14155555678",
			TemplateVariables: map[string]string{
				"name":     "Jane",
				"order_id": "ORD-002",
			},
		},
	},
})
if err != nil {
	panic(err)
}

fmt.Println(result.Added)      // 2
fmt.Println(result.Duplicates) // 0
fmt.Println(result.Invalid)    // 0

List Broadcast Contacts

result, err := client.Broadcasts.Contacts.List(context.TODO(), "brd_abc123", zavudev.BroadcastContactsListParams{
	Status: zavudev.String("pending"),
	Limit:  zavudev.Int(100),
})
if err != nil {
	panic(err)
}

for _, contact := range result.Items {
	fmt.Println(contact.Recipient, contact.Status)
}

Remove Contact

err := client.Broadcasts.Contacts.Remove(context.TODO(), "brd_abc123", "bcon_xyz789")
if err != nil {
	panic(err)
}

Send Broadcast

Start sending immediately:
result, err := client.Broadcasts.Send(context.TODO(), "brd_abc123", zavudev.BroadcastSendParams{})
if err != nil {
	panic(err)
}

fmt.Println(result.Broadcast.Status) // sending
Schedule for later:
result, err := client.Broadcasts.Send(context.TODO(), "brd_abc123", zavudev.BroadcastSendParams{
	ScheduledAt: zavudev.String("2024-01-15T10:00:00Z"),
})
if err != nil {
	panic(err)
}

fmt.Println(result.Broadcast.Status) // scheduled

Reschedule Broadcast

Change the scheduled time for a broadcast in scheduled status:
result, err := client.Broadcasts.Reschedule(context.TODO(), "brd_abc123", zavudev.BroadcastRescheduleParams{
	ScheduledAt: zavudev.String("2024-01-16T14:00:00Z"),
})
if err != nil {
	panic(err)
}

fmt.Println(result.Broadcast.ScheduledAt) // 2024-01-16T14:00:00.000Z
You can only reschedule broadcasts that are in scheduled status. The new time must be in the future.

Get Progress

Monitor broadcast progress in real-time:
result, err := client.Broadcasts.Progress(context.TODO(), "brd_abc123")
if err != nil {
	panic(err)
}

fmt.Println(result.Status)               // sending
fmt.Println(result.Total)                // 5000
fmt.Println(result.Delivered)            // 2350
fmt.Println(result.Failed)              // 50
fmt.Println(result.PercentComplete)      // 48.0
fmt.Println(result.EstimatedCompletionAt)

Cancel Broadcast

result, err := client.Broadcasts.Cancel(context.TODO(), "brd_abc123")
if err != nil {
	panic(err)
}

fmt.Println(result.Broadcast.Status) // cancelled
Cancelling a broadcast will skip pending contacts, but messages already queued may still be delivered.

Delete Broadcast

Delete a broadcast in draft status:
err := client.Broadcasts.Delete(context.TODO(), "brd_abc123")
if err != nil {
	panic(err)
}