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š

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.

  1. 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.

  2. 12:30Company A

    Lunch — marked free

    Flagged free rather than busy, so it stays put.

  3. 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.

  4. 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.

What crosses between two company calendars, and what stays on the original
DetailCrosses over?What that means
Start and end timeCrossesThe block covers exactly the hours the original does, so the clash is visible before you accept.
Event titleStays putReplaced with “Personal Commitment”. “Acme — pricing for the Contoso pitch” never reaches the other tenant.
Description and notesStays putCleared before the event is written.
Location or addressStays putCleared before the event is written.
Attendees and organiserStays putNeither client learns who the other one is meeting, or that they exist.
Video call linkStays putIt travels in the description, so it never leaves the original calendar.
Events marked freeStays putOnly busy events mirror, so a lunch flagged free stays put rather than holding time you do not need.
Reschedules and cancellationsCrossesSynced 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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