Email Sequences with Customer.io and Calendly
Complete guide to running email sequences triggered by Surface form submissions, with automatic exit when leads book a meeting
Run email sequences in Customer.io when leads submit your Surface form, whether they complete it or drop off partway. The sequence exits automatically once a lead books a Calendly meeting, so nobody who has already scheduled a call keeps getting emails.
How It Works
Form submission
A lead submits your Surface form (partial or completed). Surface sends a webhook to the appropriate Customer.io URL based on the trigger.
Person & event
Two webhook-triggered campaigns in Customer.io (one for partial, one for completed) create or update the person and add the appropriate event.
Email sequence
An event-triggered campaign starts a customizable follow-up email sequence with delays between each email.
Meeting check
Before each follow-up (after the first), a webhook checks the Calendly API. If the lead has booked a meeting, the campaign exits. Otherwise, it continues.
Prerequisites
You need:
- A Surface account with a form that supports partial submissions (e.g., multi-step form with email capture)
- A Customer.io account with Campaigns and Journeys access
- A Calendly account with API access (Personal Access Token or OAuth)
- Your Calendly event type URI for the meeting type you want to check
Setup Steps
Step 1: Webhook Trigger Campaigns
Create two webhook-triggered campaigns in Customer.io, one for partial and one for completed, each with its own URL
Step 2: Configure Surface Workflow
Set up the Surface Workflow Builder to send form data to the correct Customer.io webhook URL based on trigger path (Dropped Off or Form Submission)
Step 3: Event-Based Email Campaigns
Create two event-triggered campaigns, one for partial submissions and one for completed, with your follow-up emails and delays
Step 4: Calendly Meeting Check
Add a webhook node before each follow-up (after the first) to check if the lead booked a meeting and exit the campaign if so
Campaign Flow Diagram
flowchart LR
%% Participants & Subgraphs
subgraph S [Surface]
direction TB
Lead([Lead])
Form[Form Submission]
end
subgraph C [Customer.io]
direction TB
Webhook[Webhook Trigger]
Campaign[Start Campaign]
Email1[Send Email 1]
Delay[Wait X Days]
Check[Check Meeting]
Decision{Booked?}
Exit[Exit Campaign]
Next[Send Follow-up]
end
subgraph K [Calendly]
direction TB
API[Calendly API]
end
%% Connections
Lead -->|Submits| Form
Form -->|Webhook Data| Webhook
Webhook --> Campaign
Campaign --> Email1
Email1 --> Delay
Delay --> Check
Check -.->|Query| API
API -.->|Status| Check
Check --> Decision
Decision -->|Yes| Exit
Decision -->|No| Next
Next --> Delay
%% Styling
classDef plain fill:#fff,stroke:#333,stroke-width:1px;
classDef check fill:#e6f7ff,stroke:#1890ff,stroke-width:2px;
class Lead,Form,Webhook,Campaign,Email1,Delay,Exit,Next plain;
class Check,Decision,API check;Step 5: Connect Surface Workflow
Set up a Surface workflow to send form submissions to your HubSpot form so leads get enrolled in your sequence
Step 1: Webhook Trigger Campaigns
Create two webhook-triggered campaigns in Customer.io, one for partial submissions and one for completed, each with its own URL