Contracting across two companies
Calendar sync across two companies. Without double bookings or leaks.
Two companies, one you. Hold accounts at two organisations and each calendar is blind to the other — until you accept two meetings at ten o’clock on the same Tuesday. CalendarPipe mirrors busy time between them and strips it back to “Personal Commitment”, so the clash is visible and the client work is not.

Jakub Beneš
Founder, CalendarPipe · Updated August 14, 2026
Free forever plan · 14-day Pro trial · no card to start
A day, end to end
One Tuesday, the same rule running both ways.
- 09:00
09:00Company A
Acme — Q3 roadmap review
An hour, marked busy, with a Zoom link and six attendees.
Company B
Personal Commitment
The hour is taken. The client, the attendees and the link do not travel with it.
- 12:30
12:30Company A
Lunch — marked free
Flagged free rather than busy, so it stays put.
- 14:00
14:00Company B
Contoso — incident review
Marked busy, and nobody at Acme needs to know it happened.
Company A
Personal Commitment
The same rule, pointed the other way. Neither organisation learns anything about the other.
- All day
All dayCompany B
Contoso — offsite
All-day and busy.
Company A
Personal Commitment
The whole day reads as spoken for, so nobody schedules into it.
The glowing blocks are the ones a rule wrote. Nobody typed them, and nobody has to keep them up to date — if the original moves, they move.
Why the two calendars drift apart
- Both calendars think they own your Tuesday
- Neither organisation can see the other’s schedule, so nothing warns you. The first signal is two meetings starting at once and a message asking whether you are joining.
- Mirroring the real events is a leak
- Copying meetings across verbatim puts titles like “Acme — pricing for the Contoso pitch” into another company’s calendar. The description, the address and the video link travel with it.
- Manual placeholder blocks fail quietly
- Blocking out “busy” by hand works until something moves. The original shifts, the placeholder does not, and now you are holding time you do not need while the time you do need looks free.
- You may not be allowed to install anything
- Corporate IT often blocks third-party calendar apps at the consent screen, and an integration needing admin approval on both tenants is a non-starter. Invitation-based delivery gets through anyway, because it is just email.
The rule
The calendar sync rules that do this, in full
Small enough to read in one sitting.
Busy Events as "Personal Commitment"
In the app: Only sync events marked as busy and strip identifying details — title becomes "Personal Commitment", description and location are cleared. Ideal for sharing availability across work and personal calendars without leaking meeting topics, notes, addresses, or video links.
Company ACompany B
Busy time crosses as a generic block. Title, description and location are cleared before the event is written.
Company BCompany A
The same rule mirrored, so the protection is symmetrical rather than one client subsidising the other.
function gate(event: GateEvent): GateResult | boolean {
if ((event.showAs === "busy")) {
return { pass: true, transform: { title: "Personal Commitment", description: "", location: "" } };
}
return { pass: false };
}What moves
What crosses between the two companies, and what stays
The mirror is deliberately thin: one company learns that an hour is taken, and nothing else about who took it. Field by field, in both directions.
| Detail | Crosses over? | What that means |
|---|---|---|
| Start and end time | Crosses | The block covers exactly the hours the original does, so the clash is visible before you accept. |
| Event title | Stays put | Replaced with “Personal Commitment”. “Acme — pricing for the Contoso pitch” never reaches the other tenant. |
| Description and notes | Stays put | Cleared before the event is written. |
| Location or address | Stays put | Cleared before the event is written. |
| Attendees and organiser | Stays put | Neither client learns who the other one is meeting, or that they exist. |
| Video call link | Stays put | It travels in the description, so it never leaves the original calendar. |
| Events marked free | Stays put | Only busy events mirror, so a lunch flagged free stays put rather than holding time you do not need. |
| Reschedules and cancellations | Crosses | Synced events are tracked, so the mirrored block moves or disappears with the original. |
How to set up this calendar sync
About two minutes, most of which is the provider's consent screen.
- 01
Connect both accounts
Google Calendar, Outlook and Microsoft 365, or Apple Calendar over CalDAV. They do not have to be the same provider, and the two organisations never talk to each other.
- 02
Create a pipe in each direction
One from company A to company B, one back the other way. Each has its own rule, so you can be stricter in one direction than the other.
- 03
Apply the busy → Personal Commitment rule
Only events marked busy pass. Each is written to the other calendar with the description and location cleared before it leaves.
- 04
Or deliver by invitation
If IT blocks third-party calendar access on one side, send the mirrored blocks there as ordinary calendar invitations instead. No consent screen, no admin approval.
Common questions
Does the other company see who I am meeting?
No. The rule replaces the title with “Personal Commitment” and clears the description and location before anything is written, and the original attendee list is not copied. What crosses is a block of busy time with a generic label.
What if my employer blocks third-party calendar apps?
Use invitation-based delivery for that side. Mirrored blocks arrive as normal calendar invitations you accept, which needs no consent screen and no admin approval — it is email. You can also read from a published ICS feed where that is all you are given.
Do I need a paid plan for this?
Two calendar connections and one rule fit the free plan, enough to mirror in one direction — syncing every 15 minutes, 14 days ahead. Mirroring both ways is a second rule, so it needs Pro, which also syncs every 5 minutes and looks 90 days ahead: $4/month, or $40 a year, with a 14-day free trial. For contract work booked a quarter out, the 90-day window is usually the part that matters.
Can I keep some events out of the mirror entirely?
Yes. The rule is a small function, so anything you can express in code you can enforce: skip a particular calendar, drop all-day events, ignore anything you have not accepted, or stop at a certain hour. The visual and AI builders cover the common cases without writing any.
Will this create duplicates on my own calendars?
No. Synced events are tracked, so an update to the original updates the mirrored copy rather than adding a second one, and deleting the original removes it.
Is this the same as sharing free/busy between accounts?
It achieves the same visibility between two organisations that will not federate with each other, which is the situation most contractors are actually in. It also lets you decide what crosses, rather than accepting whatever the two tenants agree to expose.
Start with this setup
Connect the calendars, pick the rule, and stop thinking about it. Free forever plan, no card. Pro is free for 14 days.
Keep reading
- Calendar sync when your company blocks OAuth
The full version of the invitation-based route, for when IT will not approve a third-party app.
- Block personal time on a work calendar automatically
The same mirroring, pointed at a personal calendar instead of a second employer.
- Connect Microsoft 365 and Outlook
What each account type needs, including work and school tenants.
- The rule templates this page uses
Every shipped template, with the code each one runs.
Sources
What the calendar providers and the underlying specifications actually say.
- Sharing between Microsoft 365 tenants runs on organization relationships an administrator configures
Microsoft
- How much calendar detail is visible outside a Google Workspace organisation is an admin setting
Google
- Calendar sharing in Microsoft 365 and its permission levels
Microsoft
- RFC 5545 — iCalendar, which defines busy and free time
IETF