Agentic Tenacity
Agentic Tenacity is an extension to Guavadialer that intelligently reaches out to contacts across multiple channels before calling them. Rather than placing blind cold calls, the system warms contacts with pre-call alerts and responds to inbound messages to reschedule, answer questions, or mark contacts as do-not-call.
Current status: SMS is the only supported outreach modality. Email, WhatsApp, and RCS/iMessage support is planned. Only pre-call messages are supported — post-call follow-ups are not yet implemented.
How it works
When you upload contacts with outreach modalities enabled, Guava sends a pre-call message before each call attempt. For example: "Hi! This is a message from Harper Valley. We are doing a political opinion survey, and you should receive a call from us in the next 10–30 minutes. If that is not a good time, please reply with a time that works better for you."
The system automatically handles inbound replies — rescheduling calls, answering general questions about the campaign, or marking contacts as DNC.
Setup
1. Apply for SMS permissions — contact the Guava team to enable SMS for your account. This is currently a manual process via a Google Form.
2. Provide a campaign description — the description parameter in get_or_create_campaign() is required when using Agentic Tenacity. The agent uses it to respond to messages about who is calling and what the campaign is about.
Setting outreach modalities
Modalities can be set in two places. Per-contact settings take priority over global settings.
Per contact: Add an outreach_modalities field to individual contact objects. This controls which modalities are used for that specific contact.
Global shortcut: Pass outreach_modalities to campaign.upload_contacts() to apply the same modalities to all contacts in that batch (unless a contact has its own setting).
If neither is set, no pre-call messages are sent and the campaign behaves as a standard Guavadialer campaign.
Example
import os
import guava
from guava import Field, Say
from guava.campaigns import get_or_create_campaign, Contact
from guava.types import OutreachModality
# 1. Create a campaign with a description (required for Agentic Tenacity)
campaign = get_or_create_campaign(
"political-poll-q2-2026",
origin_phone_numbers=[os.environ["GUAVA_AGENT_NUMBER"]],
calling_windows=[
{"day": day, "start_time": "09:00", "end_time": "17:00"}
for day in ["monday", "tuesday", "wednesday", "thursday", "friday"]
],
start_date="2026-04-01",
max_concurrency=3,
max_attempts=2,
description="Non-partisan political opinion poll for Q2 2026",
)
# 2. Upload contacts with outreach modalities
campaign.upload_contacts(
[
Contact(
phone_number="+15551234567",
data={"first_name": "Alice", "district": "District 5"},
outreach_modalities=["sms"],
),
Contact(
phone_number="+15559876543",
data={"first_name": "Bob", "district": "District 12"},
outreach_modalities=["sms"],
),
],
accepted_terms_of_service=True,
)
# Or apply outreach modalities globally to all contacts:
campaign.upload_contacts(
[
Contact(phone_number="+15551234567", data={"first_name": "Alice"}),
Contact(phone_number="+15559876543", data={"first_name": "Bob"}),
],
accepted_terms_of_service=True,
outreach_modalities=["sms"], # applied to all contacts
)Questions? hi@goguava.ai
import os
import guava
from guava import Field, Say
from guava.campaigns import get_or_create_campaign, Contact
from guava.types import OutreachModality
# 1. Create a campaign with a description (required for Agentic Tenacity)
campaign = get_or_create_campaign(
"political-poll-q2-2026",
origin_phone_numbers=[os.environ["GUAVA_AGENT_NUMBER"]],
calling_windows=[
{"day": day, "start_time": "09:00", "end_time": "17:00"}
for day in ["monday", "tuesday", "wednesday", "thursday", "friday"]
],
start_date="2026-04-01",
max_concurrency=3,
max_attempts=2,
description="Non-partisan political opinion poll for Q2 2026",
)
# 2. Upload contacts with outreach modalities
campaign.upload_contacts(
[
Contact(
phone_number="+15551234567",
data={"first_name": "Alice", "district": "District 5"},
outreach_modalities=["sms"],
),
Contact(
phone_number="+15559876543",
data={"first_name": "Bob", "district": "District 12"},
outreach_modalities=["sms"],
),
],
accepted_terms_of_service=True,
)
# Or apply outreach modalities globally to all contacts:
campaign.upload_contacts(
[
Contact(phone_number="+15551234567", data={"first_name": "Alice"}),
Contact(phone_number="+15559876543", data={"first_name": "Bob"}),
],
accepted_terms_of_service=True,
outreach_modalities=["sms"], # applied to all contacts
)