Scheduling with Availability Collection

Scheduling with Hiring Manager Availability Collection

Overview

A common scheduling scenario is when the hiring manager (or interviewer) does not have their calendar connected to Popp. Instead of requiring them to connect a calendar or manually providing time slots, Popp can automatically collect availability from the hiring manager via email.

There are two approaches depending on your workflow:

  1. Screening + Scheduling — Screen candidates first with questions, then schedule a meeting once they pass
  2. Broadcast Booking URL — Skip screening and send candidates a booking link directly

Both approaches use the same mechanism: a meeting template with autoCollectAvailability: true on the hiring manager participant.

Note: If your hiring manager already has their calendar connected to Popp, you don't need this guide.


When to Use This Guide

ScenarioApproach
Screen candidates with questions first, then schedule a meetingFlow 1: Screening Campaign
Send booking links directly to candidates (no screening)Flow 2: SCHEDULING Campaign

How Auto-Collect Availability Works

When a meeting template includes a participant with autoCollectAvailability: true, the following happens:

  1. Virtual calendar created — Popp creates a virtual calendar for the participant (since they have no connected calendar)
  2. Email sent to participant — Popp emails the hiring manager requesting their available times
  3. Participant replies — The hiring manager responds with their availability
  4. Availability parsed — Popp parses the response and stores the available time slots
  5. Booking URL sent — All pending candidates automatically receive a booking URL with the collected availability

Important Constraints:

  • Only one participant per meeting template can have autoCollectAvailability: true
  • The participant must have isCalendarConnected: false

Flow 1: Screening Campaign with Scheduling

Use a regular campaign with screening questions and closingMethod: CALENDAR_MEETING_INTEGRATION. The candidate goes through screening first. Once the candidate passes all screening questions, Popp emails the hiring manager to collect their availability. Once the hiring manager responds, the candidate receives the booking URL.

┌──────────────────────────────────────────────────────────────────┐
│                        SEQUENTIAL FLOW                           │
│                                                                  │
│  ┌───────────────────────────┐                                   │
│  │ Candidate receives        │                                   │
│  │ screening questions       │                                   │
│  └─────────────┬─────────────┘                                   │
│                │                                                 │
│  ┌─────────────▼─────────────┐                                   │
│  │ Candidate answers         │                                   │
│  │ questions and passes      │                                   │
│  └─────────────┬─────────────┘                                   │
│                │                                                 │
│  ┌─────────────▼─────────────┐                                   │
│  │ Popp emails HM to         │                                   │
│  │ collect availability      │                                   │
│  └─────────────┬─────────────┘                                   │
│                │                                                 │
│  ┌─────────────▼─────────────┐                                   │
│  │ HM replies with           │                                   │
│  │ available times           │                                   │
│  └─────────────┬─────────────┘                                   │
│                │                                                 │
│  ┌─────────────▼─────────────┐                                   │
│  │ Candidate receives        │                                   │
│  │ booking URL               │                                   │
│  └─────────────┬─────────────┘                                   │
│                │                                                 │
│  ┌─────────────▼─────────────┐                                   │
│  │ Candidate selects a time  │                                   │
│  │ → Meeting scheduled       │                                   │
│  └───────────────────────────┘                                   │
└──────────────────────────────────────────────────────────────────┘

Step 1: Create a Meeting Template

Create a meeting template with the hiring manager as a participant with autoCollectAvailability: true:

curl -X POST "https://api.joinpopp.com/v1/meeting-templates" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "x-organization-id: YOUR_ORGANIZATION_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Interview Call",
    "description": "30-minute screening interview",
    "duration": 30,
    "timezone": "Europe/London",
    "videoConferencing": true,
    "videoConferencingProvider": "Google Meet",
    "openHours": [
      {
        "days": [1, 2, 3, 4, 5],
        "start": "09:00",
        "end": "17:00"
      }
    ],
    "meetingParticipants": [
      {
        "name": "Jane Smith",
        "email": "[email protected]",
        "isOrganizer": true,
        "isCalendarConnected": false,
        "autoCollectAvailability": true
      }
    ]
  }'

Note the key fields on the participant:

  • isCalendarConnected: false — the HM does not have a connected calendar
  • autoCollectAvailability: true — Popp will email the HM to collect availability

Save the returned id for the next step.

Step 2: Create the Campaign

Create a regular campaign with screening questions and the meeting template attached:

curl -X POST "https://api.joinpopp.com/v1/campaigns" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "x-organization-id: YOUR_ORGANIZATION_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "campaignType": "APPLICANT_OUTREACH",
    "channel": "SMS",
    "campaignTitle": "Software Engineer Screening",
    "campaignDescription": "Screen and schedule interviews for SE candidates",
    "company": "Acme Corp",
    "location": "London, UK",
    "closingMethod": "CALENDAR_MEETING_INTEGRATION",
    "calendarMeetingTemplateId": "MEETING_TEMPLATE_ID_FROM_STEP_1",
    "closingMessage": "No problem! If you have any questions, feel free to visit our careers page at https://acme.com/careers.",
    "rejectionMessage": "Thank you for your time. Unfortunately, we won'\''t be moving forward at this stage.",
    "questions": [
      {
        "questionType": "TEXT",
        "isMandatory": true,
        "content": "Are you currently authorized to work in the UK?"
      },
      {
        "questionType": "TEXT",
        "isMandatory": true,
        "content": "Do you have at least 3 years of experience with TypeScript?"
      }
    ],
    "customTemplatedMessage": "Hi {{CANDIDATE_FIRST_NAME}}, {{AGENT_NAME}} here from {{EMPLOYER_NAME}}. We have a {{JOB_TITLE}} role in {{LOCATION}} that could be a great fit. Are you open to a quick chat? Reply STOP to opt out.",
    "agentName": "Alex",
    "agentTone": "FRIENDLY"
  }'

Key fields:

  • closingMethod: "CALENDAR_MEETING_INTEGRATION" — enables scheduling at the end of the conversation
  • calendarMeetingTemplateId — links the meeting template from Step 1
  • questions — screening questions the candidate must answer before receiving a booking URL

Step 3: Create Conversations

Create conversations for your candidates using the standard endpoint:

curl -X POST "https://api.joinpopp.com/v1/conversations" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "x-organization-id: YOUR_ORGANIZATION_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "campaignId": "CAMPAIGN_ID_FROM_STEP_2",
    "phoneNumber": "+447700900001",
    "firstName": "John",
    "lastName": "Doe"
  }'

What Happens Next

  1. The candidate receives the screening questions via SMS
  2. Once the candidate passes screening, Popp emails the hiring manager ([email protected]) to collect their availability
  3. Once the hiring manager provides availability, the candidate receives a booking URL
  4. The candidate selects a time and the meeting is scheduled
  5. A CALENDAR_MEETING_SCHEDULED webhook event fires with meeting details

Flow 2: SCHEDULING Campaign (Broadcast Booking URL)

Use a SCHEDULING campaign to send booking links directly to candidates — no screening questions. Popp collects the hiring manager's availability first, then sends the booking URL to all pending candidates.

┌──────────────────────────────────────────────────────────────────┐
│                                                                  │
│  ┌────────────────────────┐                                      │
│  │ Popp emails HM to      │                                      │
│  │ collect availability   │                                      │
│  └───────────┬────────────┘                                      │
│              │                                                   │
│  ┌───────────▼────────────┐                                      │
│  │ HM replies with        │                                      │
│  │ available times        │                                      │
│  └───────────┬────────────┘                                      │
│              │                                                   │
│  ┌───────────▼──────────────────────┐                            │
│  │ All pending candidates           │                            │
│  │ automatically receive booking URL│                            │
│  └───────────┬──────────────────────┘                            │
│              │                                                   │
│  ┌───────────▼────────────┐                                      │
│  │ Candidates book their  │                                      │
│  │ meetings               │                                      │
│  └────────────────────────┘                                      │
└──────────────────────────────────────────────────────────────────┘

Step 1: Create a Meeting Template

This is the same as Flow 1, Step 1. Create a meeting template with autoCollectAvailability: true on the hiring manager participant. You can reuse the same template across both flows.

Step 2: Create the SCHEDULING Campaign

Create a SCHEDULING campaign. Here's an example using SMS with a custom templated message:

curl -X POST "https://api.joinpopp.com/v1/campaigns" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "x-organization-id: YOUR_ORGANIZATION_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "campaignType": "SCHEDULING",
    "channel": "SMS",
    "campaignTitle": "Interview Scheduling",
    "campaignDescription": "Schedule interviews with engineering candidates",
    "calendarMeetingTemplateId": "MEETING_TEMPLATE_ID_FROM_STEP_1",
    "customTemplatedMessage": "Hi {{CANDIDATE_FIRST_NAME}}, we would love to schedule your interview! Please book a time here: {{MEETING_URL}}\n\nReply STOP to opt out.",
    "agentName": "Alex",
    "agentTone": "FRIENDLY"
  }'

Key differences from Flow 1:

  • campaignType: "SCHEDULING" — this is a scheduling-only campaign
  • customTemplatedMessage — must include {{MEETING_URL}} placeholder and STOP opt-out instruction
  • No questions, closingMethod, rejectionMessage, or closingMessage allowed
  • closingMethod is automatically set to CALENDAR_MEETING_INTEGRATION

For channel-specific rules on messaging (WhatsApp, SMS, Email), see Scheduling Campaigns.

Step 3: Create Conversations

Create conversations for your candidates:

curl -X POST "https://api.joinpopp.com/v1/conversations" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "x-organization-id: YOUR_ORGANIZATION_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "campaignId": "CAMPAIGN_ID_FROM_STEP_2",
    "phoneNumber": "+447700900001",
    "firstName": "John",
    "lastName": "Doe"
  }'

What Happens Next

  1. Conversations are created in a pending state awaiting the hiring manager's availability
  2. Popp emails the hiring manager to collect their available times
  3. Once the hiring manager responds, all pending candidates automatically receive the booking URL via the templated message
  4. Each candidate selects a time and their meeting is scheduled
  5. A CALENDAR_MEETING_SCHEDULED webhook event fires for each booking
  6. If no booking is made, the conversation auto-closes after 168 hours (1 week)

Comparing the Two Flows

FeatureFlow 1: Screening + SchedulingFlow 2: SCHEDULING Campaign
Campaign typeAny (e.g., standard outreach)SCHEDULING
Screening questionsYesNo
closingMethodSet to CALENDAR_MEETING_INTEGRATION explicitlyAutomatic
Candidate experienceScreening first, then booking URLBooking URL directly
When booking URL is sentAfter screening passed, then HM availability receivedAfter HM availability received
Auto-close defaultOrganization setting168 hours (1 week)
Message templateStandard campaign opening messageMust include {{MEETING_URL}} placeholder

Important Notes & Limitations

  • One auto-collect participant — Only one participant per meeting template can have autoCollectAvailability: true. Other participants must use connected calendars or pre-defined availability slots.
  • Resend Booking URLautoCollectAvailability is not supported when resending booking URLs. If a candidate requests more time (CALENDAR_MORE_TIME_REQUESTED event), you must provide availability directly or use connected calendars when calling the Resend Booking URL endpoint.
  • SCHEDULING message requirements — For SCHEDULING campaigns, the message template must include {{MEETING_URL}} and a STOP opt-out instruction. See Scheduling Campaigns for channel-specific rules.

Webhook Events

When using either flow, you'll receive these webhook events:

EventWhen
CALENDAR_MEETING_SCHEDULEDCandidate books a meeting
CALENDAR_MEETING_CANCELLEDA scheduled meeting is cancelled
CALENDAR_MEETING_RESCHEDULEDA meeting is moved to a new time
CALENDAR_MORE_TIME_REQUESTEDCandidate requests different availability options

See Scheduling Events for full payload details.


Related Guides

API Reference