Scheduling with Availability Collection

Scheduling with Availability Collection

Overview

A common scheduling scenario is when an interviewer does not have their calendar connected to Popp. Instead of requiring them to connect a calendar, or supplying their time slots by hand, Popp can automatically collect availability from them by 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 interviewer's participant entry.

Note: If your interviewers already have their calendars 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 interviewer requesting their available times
  3. Participant replies — The interviewer 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:

  • The participant must have isCalendarConnected: false
  • There is no limit on how many participants can have autoCollectAvailability: true. Popp emails each of them and books a slot that works for the whole panel — see Collecting from several interviewers

Collecting from Several Interviewers

A meeting template can put any number of participants on autoCollectAvailability: true — the normal shape for a panel where none of the interviewers have a connected calendar.

The steps above then run once per participant: each gets their own request, and each reply is parsed on its own. Because the default availability method is COLLECTIVE, Popp intersects those replies (along with any connected calendars and pre-defined slots on the panel) and offers candidates only the slots where everyone is free.

{
  "meetingParticipants": [
    {
      "name": "Jane Smith",
      "email": "[email protected]",
      "isOrganizer": true,
      "isCalendarConnected": false,
      "autoCollectAvailability": true
    },
    {
      "name": "Raj Patel",
      "email": "[email protected]",
      "isCalendarConnected": false,
      "autoCollectAvailability": true
    },
    {
      "name": "Mia Chen",
      "email": "[email protected]",
      "isCalendarConnected": false,
      "autoCollectAvailability": true
    }
  ]
}
  • Exactly one organizer, however many participants auto-collect — and it can be one of them, as above. isOrganizer defaults to false, so attendees can omit it.
  • Sources can be mixed. Auto-collect, connected calendars, and pre-defined availability.timeSlots can all sit on one panel.
  • The panel moves at the pace of the slowest reply. An interviewer who hasn't replied has no availability on file, so the intersection stays empty and candidates get no slots until everyone has responded. Nudge each participant separately via Availability Outreach Settings.
  • A thin intersection still books. If the replies overlap for less than requiredHours, Popp books inside the overlap it has — see requiredHours is a target, not a gate.
  • Round robin is the alternative. If only one interviewer from a pool needs to take the meeting, use the ROUND_ROBIN_MAX_AVAILABILITY availability method instead.

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 interviewer to collect their availability. Once they respond, the candidate receives the booking URL.

┌──────────────────────────────────────────────────────────────────┐
│                        SEQUENTIAL FLOW                           │
│                                                                  │
│  ┌───────────────────────────┐                                   │
│  │ Candidate receives        │                                   │
│  │ screening questions       │                                   │
│  └─────────────┬─────────────┘                                   │
│                │                                                 │
│  ┌─────────────▼─────────────┐                                   │
│  │ Candidate answers         │                                   │
│  │ questions and passes      │                                   │
│  └─────────────┬─────────────┘                                   │
│                │                                                 │
│  ┌─────────────▼─────────────┐                                   │
│  │ Popp asks interviewers    │                                   │
│  │ for availability          │                                   │
│  └─────────────┬─────────────┘                                   │
│                │                                                 │
│  ┌─────────────▼─────────────┐                                   │
│  │ Interviewers reply 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 interviewer 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 interviewer has no connected calendar
  • autoCollectAvailability: true — Popp will email them to collect availability

Customizing the Availability Outreach

You can control what Popp asks the interviewer by adding availabilityOutreachSettings, either to the meeting template or directly on a participant. Add it to the request above — the rest of the payload is unchanged. See Availability Outreach Settings for the full field reference.

{
  "meetingParticipants": [
    {
      "name": "Jane Smith",
      "email": "[email protected]",
      "isOrganizer": true,
      "isCalendarConnected": false,
      "autoCollectAvailability": true,
      "availabilityOutreachSettings": {
        "requiredHours": 4,
        "periodDays": 7,
        "customTemplatedSubjectLine": "{{INTERVIEWER_NAME}}, availability needed",
        "customTemplatedMessage": "Hi {{INTERVIEWER_NAME}},\n\nWe're ready to book your candidate interviews.\n\n{{MEETING_AVAILABILITY_TEXT}}\n\nThanks,\n{{AGENT_NAME}}",
        "nudgeSettings": [{ "delayHours": 12 }, { "delayHours": 24 }],
        "additionalRecipients": ["[email protected]"]
      }
    }
  ]
}

This configures:

  • Custom email: The interviewer receives a personalized subject and message instead of the system default
  • Custom timing: The AI requests 4 hours over 7 days (instead of the default 6 hours over 14 days)
  • Custom nudges: If they don't reply, follow-up nudges are sent at 12h and 24h (instead of the default 3 nudges at 24h intervals)
  • CC recipients: [email protected] is CC'd on all outreach emails (initial, reply-backs, nudges, and cancellation)

These settings are accepted on create and update, and returned by get, so you can adjust the ask after creation and read back what is stored. availabilityOutreachSettings is merged on update, so you can send only the keys you want to change — see Updating a Meeting Template.

If the meeting isn't a candidate interview, also set the top-level guestLabel — the noun the email uses for whoever books the slot — to something like "recruiter". See The guestLabel Field.

⚠️

Keep {{MEETING_AVAILABILITY_TEXT}} in your message. It is the placeholder that expands into the concrete ask — hours, window, timezone — and it is optional and unvalidated, so omitting it silently sends an availability request with no specifics in it. See Supported Placeholders.

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 interviewer ([email protected]) to collect their availability
  3. Once they provide 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 interviewer's availability first, then sends the booking URL to all pending candidates.

┌──────────────────────────────────────────────────────────────────┐
│                                                                  │
│  ┌────────────────────────┐                                      │
│  │ Popp asks interviewers │                                      │
│  │ for availability       │                                      │
│  └───────────┬────────────┘                                      │
│              │                                                   │
│  ┌───────────▼────────────┐                                      │
│  │ Interviewers reply with│                                      │
│  │ available times        │                                      │
│  └───────────┬────────────┘                                      │
│              │                                                   │
│  ┌───────────▼──────────────────────┐                            │
│  │ All pending candidates           │                            │
│  │ automatically receive booking URL│                            │
│  └───────────┬──────────────────────┘                            │
│              │                                                   │
│  ┌───────────▼────────────┐                                      │
│  │ Candidates book their  │                                      │
│  │ meetings               │                                      │
│  └────────────────────────┘                                      │
└──────────────────────────────────────────────────────────────────┘

Step 1: Reuse the Meeting Template

This is the same as Flow 1, Step 1. Create a meeting template with autoCollectAvailability: true on the interviewer's participant entry. 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: Add Your Candidates

Create one conversation per candidate, exactly as in Flow 1, Step 3 — the request is identical, pointing at this campaign's ID.

What Happens Next in This Flow

  1. Conversations are created in a pending state awaiting the interviewer's availability
  2. Popp emails the interviewer to collect their available times
  3. Once they respond, 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 availability receivedAfter availability received
Auto-close defaultOrganization setting168 hours (1 week)
Message templateStandard campaign opening messageMust include {{MEETING_URL}} placeholder

Important Notes & Limitations

  • Several auto-collect participants are supported — any number of participants on a meeting template can have autoCollectAvailability: true, and they can sit alongside participants using connected calendars or pre-defined slots. See Collecting from several interviewers.
  • 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


Did this page help you?