Email Sequences with Customer.io and Calendly

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

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;

On this page