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;

Ready to Get Started?

See it on your own site, or open the app and build the first form.

Need Help?

Setup problems, blocked domains and CRM push failures live in the Help Center.

Feature Requests?

Tell us what is missing. We would rather hear it than guess.

On this page