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:
- Screening + Scheduling — Screen candidates first with questions, then schedule a meeting once they pass
- 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
| Scenario | Approach |
|---|---|
| Screen candidates with questions first, then schedule a meeting | Flow 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:
- Virtual calendar created — Popp creates a virtual calendar for the participant (since they have no connected calendar)
- Email sent to participant — Popp emails the hiring manager requesting their available times
- Participant replies — The hiring manager responds with their availability
- Availability parsed — Popp parses the response and stores the available time slots
- 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 calendarautoCollectAvailability: 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 conversationcalendarMeetingTemplateId— links the meeting template from Step 1questions— 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
- The candidate receives the screening questions via SMS
- Once the candidate passes screening, Popp emails the hiring manager ([email protected]) to collect their availability
- Once the hiring manager provides availability, the candidate receives a booking URL
- The candidate selects a time and the meeting is scheduled
- A
CALENDAR_MEETING_SCHEDULEDwebhook 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 campaigncustomTemplatedMessage— must include{{MEETING_URL}}placeholder and STOP opt-out instruction- No
questions,closingMethod,rejectionMessage, orclosingMessageallowed closingMethodis automatically set toCALENDAR_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
- Conversations are created in a pending state awaiting the hiring manager's availability
- Popp emails the hiring manager to collect their available times
- Once the hiring manager responds, all pending candidates automatically receive the booking URL via the templated message
- Each candidate selects a time and their meeting is scheduled
- A
CALENDAR_MEETING_SCHEDULEDwebhook event fires for each booking - If no booking is made, the conversation auto-closes after 168 hours (1 week)
Comparing the Two Flows
| Feature | Flow 1: Screening + Scheduling | Flow 2: SCHEDULING Campaign |
|---|---|---|
| Campaign type | Any (e.g., standard outreach) | SCHEDULING |
| Screening questions | Yes | No |
closingMethod | Set to CALENDAR_MEETING_INTEGRATION explicitly | Automatic |
| Candidate experience | Screening first, then booking URL | Booking URL directly |
| When booking URL is sent | After screening passed, then HM availability received | After HM availability received |
| Auto-close default | Organization setting | 168 hours (1 week) |
| Message template | Standard campaign opening message | Must 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 URL —
autoCollectAvailabilityis not supported when resending booking URLs. If a candidate requests more time (CALENDAR_MORE_TIME_REQUESTEDevent), 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:
| Event | When |
|---|---|
CALENDAR_MEETING_SCHEDULED | Candidate books a meeting |
CALENDAR_MEETING_CANCELLED | A scheduled meeting is cancelled |
CALENDAR_MEETING_RESCHEDULED | A meeting is moved to a new time |
CALENDAR_MORE_TIME_REQUESTED | Candidate requests different availability options |
See Scheduling Events for full payload details.
Related Guides
- Meeting Templates — Configure meeting duration, participants, and rules
- Scheduling Campaigns — SCHEDULING campaign type details and channel rules
- Auto-Schedule Conversations — Create conversations with inline meeting configuration
- Scheduling Events — Webhook payloads for meeting events
API Reference
Updated 2 days ago