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:
- 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 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
| 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 interviewer requesting their available times
- Participant replies — The interviewer 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:
- 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.
isOrganizerdefaults tofalse, so attendees can omit it. - Sources can be mixed. Auto-collect, connected calendars, and pre-defined
availability.timeSlotscan 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 — seerequiredHoursis 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_AVAILABILITYavailability 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 calendarautoCollectAvailability: 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 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 interviewer ([email protected]) to collect their availability
- Once they provide 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 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 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: 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
- Conversations are created in a pending state awaiting the interviewer's availability
- Popp emails the interviewer to collect their available times
- Once they respond, 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 availability received | After 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
- 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 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 1 day ago
