Conference networking meetings
Put the meeting in both attendees’ calendars. One API call per pairing.
A conference matchmaking app pairs two people who have never met and gives them twenty minutes at a numbered table. The pairing is the easy part. Getting it into two calendars at two different companies, and keeping it there when one side moves, is what usually ends in a PDF agenda. CalendarPipe gives your app a calendar of its own: post the meeting with both attendees, and each of them receives an ordinary calendar invitation they accept in one click, in whatever calendar they already use.

Jakub Beneš
Founder, CalendarPipe · Updated September 4, 2026
Pro plan · free for 14 days · no per-invitation charge
One meeting, end to end
One pairing, from matchmaking to the table.
Five calls, in order. Your app makes them; the attendees see none of it except an invitation that behaves.
- 01
Create one calendar for the edition
A hosted calendar has its own email address, an organiser name attendees will recognise, and the venue’s timezone. One per edition keeps each year’s meetings apart.
POST/api/v1/hosted-calendars{ "name": "Harbour Summit 2026", "timezone": "Europe/Lisbon", "organizerDisplayName": "Harbour Summit Meetings" }Response201 · calendarEmail: cal-…@in.calendarpipe.com
- 02
Post the pairing as a meeting
Two attendees, a twenty-minute slot, the table as the location. An idempotency key derived from your own meeting id makes a retry safe: the same key returns the same meeting and invites nobody twice.
POST/api/v1/calendars/hosted:{id}/eventsIdempotency-Key: pairing-4821 { "title": "Mira & Theo — Meeting", "start": { "dateTime": "2026-10-14T10:00:00+01:00", "timeZone": "Europe/Lisbon" }, "end": { "dateTime": "2026-10-14T10:20:00+01:00", "timeZone": "Europe/Lisbon" }, "location": "Table 14", "attendees": [ { "email": "mira@example.com" }, { "email": "theo@example.org" } ] }Response201 · id: evt_…, attendees[].status: NEEDS-ACTION
In the attendee's calendar
An invitation from “Harbour Summit Meetings” for Wednesday at 10:00, Table 14, with the other person named — in Google Calendar, Outlook or Apple Calendar, whichever they already open.
- 03
Read back who accepted
Every reply routes to the calendar’s own address and is recorded on the event. Your app reads a status per attendee, not a mailbox.
GET/api/v1/calendars/hosted:{id}/events?start=2026-10-14T00:00:00Z&end=2026-10-14T23:59:59ZResponse200 · attendees: [{ "email": "mira@…", "status": "ACCEPTED" }, { "email": "theo@…", "status": "NEEDS-ACTION" }]
In the attendee's calendar
One click on Yes. Nothing else is asked of them, and nothing tells them a third party was involved.
- 04
Reschedule, and the invitation follows
Change the slot or the table and an updated invitation goes out under the same identifier with a higher sequence number, so calendars replace the entry instead of showing two.
PATCH/api/v1/events/{eventId}{ "location": "Table 9" }Response200 · updated invitation sent to both
In the attendee's calendar
The event changes in place. No second entry, no stale one, no email asking them to delete the old one.
- 05
Cancel, and it leaves both calendars
Mark the meeting cancelled and each attendee receives a cancellation their calendar applies on its own. The record stays on your hosted calendar, marked as such.
PATCH/api/v1/events/{eventId}{ "status": "cancelled" }Response200 · cancellation sent to both
In the attendee's calendar
Gone from both calendars with a cancellation notice, rather than a meeting that quietly stops existing.
The tinted blocks are what the attendee sees. Nobody at their company connected anything, and nobody re-types a change — when the meeting moves, it moves for them too.
Why the schedule never reaches the calendar
- You cannot ask 300 attendees to connect a calendar
- Delegates come from hundreds of companies, each with an IT policy you will never see. A consent screen for your app is a request most of them will decline, and many are not allowed to approve. An invitation asks nothing of them but an inbox.
- An attachment is a snapshot
- An .ics file sent from your transactional mailer puts the meeting in the calendar once. Move the slot, swap the table, cancel the pairing — the file does not know, and the attendee turns up at the right time to the wrong table.
- Doing it properly is a protocol, not a template
- An invitation that updates and cancels cleanly is iTIP: a stable identifier, a sequence number that only goes up, an organiser address that can receive replies, and rendering that holds in Google, Outlook and Apple alike. It is more work than the matchmaking was.
- The app still needs to know who accepted
- Whether both sides said yes decides whether the table is booked. Replies arrive as email, in a shape every calendar client writes a little differently. Your app needs a status, not a mailbox to parse.
Who does what
What CalendarPipe handles, and what stays yours
The line is drawn at the calendar. Who meets whom is your application’s business; getting that into two calendars and keeping it true is ours.
| Detail | Owned by | What that means |
|---|---|---|
| Sending the invitation | CalendarPipe | Posted with attendees, the meeting goes out as a standard calendar invitation to each of them. There is no separate send step to forget. |
| Reschedules | CalendarPipe | An update re-sends under the same identifier with a higher sequence number, so calendars replace the entry rather than duplicating it. |
| Cancellations | CalendarPipe | Marking the meeting cancelled sends a cancellation to everyone on it. |
| Who accepted | CalendarPipe | Replies route to the calendar’s own address and land on the event as accepted, declined, tentative or still waiting. |
| Retries | CalendarPipe | An idempotency key on the create makes a repeat return the original meeting, with nothing sent twice. |
| Who meets whom, and when | Your app | Pairing, slots and tables are your matchmaking’s decision. CalendarPipe never moves a meeting on its own. |
| The organiser line | Your app | You choose the name attendees see. CalendarPipe supplies the address behind it, so replies have somewhere to go. |
| The public agenda | Your app | Sessions go on a second hosted calendar you fill; attendees subscribe to its feed from any calendar app. |
How to set this up
About ten minutes, most of it deciding what the key is allowed to do.
- 01
Start Pro and create a key
Hosted calendars and the API are Pro features, free for 14 days. Generate a key from the API page with the event and hosted-calendar scopes and nothing else, so a leaked key cannot touch anything it does not need.
- 02
Create a hosted calendar for the edition
Name it, set the venue timezone and an organiser name attendees will recognise. The response carries the calendar’s email address and the token for its feed.
- 03
Post a meeting for each pairing
Title, start, end, the table as the location, and both attendees. Send an idempotency key made from your own meeting id, so a timeout can be retried without inviting anyone twice.
- 04
Read the replies, forward the changes
Poll the calendar’s events and read each attendee’s status. When your matchmaking moves or cancels a pairing, update the meeting and the invitation follows on its own.
- 05
Publish the agenda alongside
Sessions go on a second hosted calendar. Attendees subscribe to its feed from any calendar app, and it refreshes on the app’s own schedule.
Common questions
Do attendees need a CalendarPipe account?
No. They receive a standard calendar invitation from the organiser name you set and accept it in whatever calendar they already use. Nothing to install and nothing to sign up for, on either side of the meeting.
What do attendees see as the sender?
The organiser name on the hosted calendar, sent from an address at in.calendarpipe.com that receives their replies. Set the name to something they will recognise, such as the conference’s own, and it reads as coming from you.
Which calendar apps does this work with?
Any that handles ordinary invitations: Google Calendar, Outlook and Microsoft 365, Apple Calendar and the rest. The invitation follows the same iCalendar transport standard every mainstream client implements, so there is no per-app integration to maintain.
How many meetings can I send?
A meeting can carry up to 500 attendees, and an account can send up to 500 invitations and cancellations an hour. A conference booking a few hundred pairings a day fits comfortably; a script creating them all in one burst does not, and is told so with a 429 until the hour passes. Space the writes out and neither limit comes into view.
What if a request times out?
Send an idempotency key with every create — your own meeting id is the right choice. A retry with the same key returns the meeting the first attempt made and sends nothing a second time, so the safe response to a timeout is simply to try again.
Can I publish the full agenda as well?
Yes. Put the sessions on a second hosted calendar and give attendees its feed URL, which any calendar app can subscribe to. Feeds refresh on the app’s own schedule, usually within the hour, so use invitations rather than the feed for anything that must arrive on time.
Do I need a paid plan?
Yes. Hosted calendars and the API are on Pro: $4/month, or $40 a year, with a 14-day free trial. There is no per-invitation charge, and a calendar that goes quiet between editions costs nothing extra.
Start with a hosted calendar
Create a calendar, mint a key, post the first pairing. Pro is free for 14 days, and nothing is charged per invitation.
Keep reading
- Hosted calendars
Creating the calendar your app posts to, and what its email address and feed are for.
- Invitations over the API
The full lifecycle: sending, cancelling, reading replies, limits and safe retries.
- API keys and scopes
Minting a key that can only do what your app needs.
- Subscribe to a hosted calendar’s feed
Publishing the agenda for attendees to add to their own calendars.
- Calendar sync when your company blocks OAuth
Why an invitation gets through where an app integration cannot.
Sources
What the calendar providers and the underlying specifications actually say.