Back to Blog

ICS Files: Why Your Calendar Shows Duplicates

Llew Roberts
calendar-invitationsicsschedulingmanaged-service

The Problem

When most scheduling systems send appointment confirmations, they attach ICS files inside regular emails. When appointments change, they send new ICS files. But here's what actually happens: these create duplicate calendar entries instead of updating the existing ones.

Your calendar ends up showing both the old time and the new time, and you have no idea which one is correct.

This is how almost every major scheduling platform works today. SimplePractice, Mindbody, Vagaro, Square Appointments, Yelp Reservations — they all send ICS files. And when appointments change, they send another ICS file that creates another appointment on your calendar.

Why I Decided to Build ScheduCal

I first encountered this problem at scale while working at a company with a platform that hosted virtual conferences. Conference organizers would have four-day events with dozens of sessions each day. Attendees would register for multiple sessions, receiving an ICS file for each one. The organizers would shuffle the schedule each morning. Sessions moved. Times shifted. The platform would send updated ICS files.

By day three, attendees' calendars were disasters. Multiple entries for the same event. No way to tell which time was current. Support tickets flooding in from confused attendees.

I asked our CTO why we didn't fix it. He told me to figure out what it would take. After investigation, here's what we found: we'd need two developers for 3–4 months to build it. We'd need separate integrations for Google Calendar, Apple Calendar, and Exchange — each with their own quirks and maintenance requirements. When any of these platforms changed something, it would become an immediate crisis requiring a fix.

We looked at how other scheduling platforms operated. None of them had solved this either. Not one scheduling platform had actual calendar integration that updated entries. That told us something important: if companies with far more resources than us hadn't built this, there must be good reasons.

We made the same decision everyone else made: it's not worth the cost and risk.

The Pattern I Couldn't Ignore

But I kept thinking about it. This same conversation must have happened at SimplePractice, at Mindbody, at Vagaro. Product managers had scoped the same project. Engineering teams had given similar estimates. Everyone reached the same conclusion.

Meanwhile, healthcare loses $150 billion annually to no-shows. Restaurants lose billions more. Salons, fitness studios, professional services — they all deal with the confusion and lost revenue from appointment mix-ups.

Will better calendar integration eliminate all no-shows? Of course not. People skip appointments for lots of reasons. But when your calendar accurately shows your appointment time — and only shows the correct time — you're more likely to show up.

Why I Could Solve This

I had an unusual background for this problem. I was a program manager at Microsoft on the original Outlook team. I've been working with Exchange since 1995 and I've been thinking about calendars for a very long time. I've also spent time working on scheduling platforms.

Most developers approaching this problem start with email infrastructure and try to build calendar functionality on top. That's where I started — and that's the path that leads to the complexity everyone else discovered.

As I thought about the problem, I realized that Exchange and MS Graph were exceptionally flexible, and there was a straightforward solution that only needed to expose four operations:

  1. Create an appointment.
  2. Update an appointment.
  3. Cancel an appointment.
  4. Add someone to an appointment.

That's it. And because it uses Exchange's meeting request protocol — the same one that already works between Outlook, Gmail, and Apple Calendar — it works everywhere automatically.

What's Actually Broken: The RFC 5545 Problem

The deeper issue is that most ICS implementations skip the details that make updates work. RFC 5545 — the internet standard for calendar data — requires:

  • A persistent UID that stays the same across all sends for the same appointment
  • An incrementing SEQUENCE number so calendar clients know which version is newest
  • Correct VTIMEZONE blocks for timezone handling
  • A METHOD field (REQUEST, CANCEL) in the email MIME wrapper

When any of these are wrong or missing, calendar clients can't reconcile updates with existing events. They add a new entry instead. That's where the duplicates come from — it's not a bug in your calendar app, it's a bug in the implementation sending the invitation.

How ScheduCal Works

Instead of sending ICS file attachments, ScheduCal sends actual meeting invitations. These appear in your inbox and on your calendar as real appointments. When something changes, we send an update. Your calendar entry updates automatically. The old time disappears, the new time appears. No duplicates. No confusion.

When an appointment is cancelled, we send a cancellation. It's removed from your calendar. Clean and simple.

For scheduling platforms, integration is three API calls and one webhook. Wherever you currently generate an ICS file, you make a ScheduCal API call instead. We handle all the RFC 5545 complexity, the Exchange infrastructure, the Google Calendar and Apple Calendar edge cases. None of that is your problem anymore.

What ScheduCal Is and Isn't

ScheduCal extends scheduling systems. We don't compete with Calendly, Cal.com, or other booking platforms. We're not a replacement for Square Appointments, Acuity, SimplePractice, Vagaro, or Yelp Reservations. We make those systems better.

Scheduling systems are sophisticated tools built for specific industries and use cases — they handle availability, booking logic, customer management, payments, reminders. What they don't do well is put appointments seamlessly onto their customers' personal calendars. That's where ScheduCal comes in.

We're the layer between your scheduling system and your customers' calendars.

Not Sure If Your Implementation Is Correct?

Most platforms don't know they have a problem until customers complain about duplicate entries or missed cancellations. By then you've already paid the cost in no-shows and support tickets.

We offer a free ICS implementation audit. Send us your current calendar invitation output and we'll tell you exactly what's broken: missing UIDs, SEQUENCE tracking issues, VTIMEZONE errors, MIME structure problems, cancellation gaps. No obligation.

Email info@scheducal.com to request your free audit.

Or switch to ScheduCal and let us handle all of it. Three API calls. One webhook. No Azure AD setup. No Exchange infrastructure. Just appointments that work.