Designing Outbound Campaign A/B Testing Frameworks for Script and Timing Optimization
What This Guide Covers
You are implementing an A/B testing framework for Genesys Cloud Outbound campaigns to scientifically determine which strategies yield the highest conversion rates. Instead of guessing whether a “Direct” or “Inquisitive” script works better, or whether calling on Tuesday morning is better than Thursday afternoon, you will use Contact List Splitting and Campaign Partitioning to run controlled experiments. When complete, you will have a data-driven dashboard that shows statistically significant differences in Hit Rate, Conversion Rate, and Revenue per Lead between your “Control” and “Test” groups.
Prerequisites, Roles & Licensing
- Genesys Cloud: CX 1, 2, or 3 with Outbound.
- Permissions:
Outbound > Contact List > Create/EditOutbound > Campaign > Create/Edit
- Mathematics: Basic understanding of statistical significance and p-values.
The Implementation Deep-Dive
1. The Experiment Design
A proper A/B test requires two identical campaigns running against two randomized, mutually exclusive subsets of the same data.
The Split Logic:
- Group A (Control): 50% of the list. Standard script, standard timing.
- Group B (Test): 50% of the list. Modified script (or different calling window).
2. Randomizing the Contact List
Do not split the list alphabetically (A-M / N-Z) as this can introduce bias (e.g., ethnic or geographic bias). Use a random hash of the Phone Number or External ID.
Python Split Script:
import pandas as pd
import hashlib
def split_list(csv_file):
df = pd.read_csv(csv_file)
# Create a hash for each record to ensure random but stable splitting
df['hash'] = df['phone_number'].apply(lambda x: int(hashlib.md5(str(x).encode()).hexdigest(), 16) % 100)
# Assign to Group A or B
df['group'] = df['hash'].apply(lambda x: 'A' if x < 50 else 'B')
df[df['group'] == 'A'].to_csv('list_a_control.csv', index=False)
df[df['group'] == 'B'].to_csv('list_b_test.csv', index=False)
split_list('master_leads.csv')
3. Campaign Configuration
- Upload the two separate contact lists.
- Create two identical campaigns (Campaign_A and Campaign_B).
- Variable Assignment:
- For Script Testing: Assign
Script_Standardto Campaign A andScript_Revisedto Campaign B. - For Timing Testing: Assign the same script to both, but give Campaign B a different
Callable Time Set(e.g., Late Afternoon only).
- For Script Testing: Assign
4. Tracking Conversions
Use a specific “Wrap-Up Code” or “Participant Data” attribute to flag successful conversions.
Architect Logic:
[Agent Selects Wrap-Up: "Sale Completed"]
|
v
[Set Participant Data: "Campaign_Group" = Task.CurrentCampaignGroup]
5. Analyzing Results (Statistical Significance)
After 1000+ dials per group, calculate the conversion rate difference.
Significance Check:
Use a Chi-Squared test to determine if the 2% lift in Group B is “Real” or just noise.
| Metric | Group A (Control) | Group B (Test) | Lift |
|---|---|---|---|
| Dials | 5,000 | 5,000 | - |
| Live Answers | 500 (10%) | 550 (11%) | +10% |
| Conversions | 50 (1.0%) | 75 (1.5%) | +50% |
Validation, Edge Cases & Troubleshooting
Edge Case 1: Agent Bias
If Group A is handled by your “A-Team” agents and Group B by “New Hires,” the results are invalid.
Solution: Ensure both campaigns use the same Agent Pool (Queue). Genesys Cloud will naturally distribute calls from both campaigns to the same agents, neutralizing individual agent performance bias.
Edge Case 2: Contact List Refreshing
If you add new leads to the master list mid-test, you must apply the same randomization logic to the new leads to ensure the 50/50 split remains balanced.
Solution: Automate the splitting logic using a Lambda function that triggers whenever a new contact is added to the “Master” list via API.
Edge Case 3: The “Winner” Take-All
Once Group B is proven to be 20% better, you want to shift 100% of the volume to the new strategy immediately.
Solution: Do not delete Campaign A. Instead, update the “Dialing Weight” of Campaign B to 100% and Campaign A to 0% within the campaign group to preserve the historical performance data for the experiment.