All writing

Scheduling · Enterprise

FullCalendar in Production: Lessons from Two Enterprise Rosters

What actually breaks when a calendar library meets real shift patterns, real permissions, and real edge cases — from healthcare and care-home rostering.

Jaymin Maheta 9 min read
Share:
Weekly calendar and scheduling view

The demo is never the hard part

FullCalendar's out-of-the-box month, week and day views are genuinely good, and the demos make roster building look close to free. What the demos don't show is what happens with 40 staff members, overlapping shifts, role-based visibility, and a resource-per-row view that has to stay legible on a laptop screen.

I've shipped FullCalendar into a healthcare provider platform and a UK care-home rostering product, and the two hit almost identical walls once real data showed up.

Where the customization effort actually goes

Resource views need real virtualization

A resource-timeline view with dozens of staff rows and a full week of shifts will visibly lag without care. Limit the rendered date range and lazily load resources outside the viewport.

Custom event content, not CSS overrides

Shift cards need role badges, status color, and overlap indicators. Use FullCalendar's `eventContent` render hooks to build real components there instead of fighting its default event markup with CSS.

Overlap detection is your problem, not the library's

FullCalendar renders overlapping events fine visually, but double-booking prevention, warnings and validation logic all have to be built in your own drop/resize handlers.

Print views are a separate render path

Managers print weekly rosters constantly. FullCalendar's screen layout doesn't translate to paper — build a dedicated print-optimized table view rather than relying on `@media print` on the live calendar.

Permission-aware event editing

Whether a shift is draggable or resizable needs to depend on the viewer's role, not a global calendar setting. Compute `editable`/`durationEditable` per event, not per calendar instance.

Timezone handling needs a decision, early

Decide once whether shifts are stored and displayed in facility-local time or the viewer's local time. Discovering this ambiguity after go-live, once staff span multiple sites, is expensive to unwind.

Try it

A live FullCalendar build

This is the same month/week/day toolbar pattern discussed above, built on FullCalendar 6 with custom event pills via eventContent. Switch views, page through months, and see how the toolbar and event rendering hold up.

Open the demo in a new tab ↗

Evaluate against your busiest real view, not the demo

Before committing to FullCalendar — or any calendar library — build the single densest view your product actually needs, with realistic data volume, in a spike before the real implementation starts. A 10-person, 5-shift demo tells you almost nothing about how the resource-timeline view performs at 50 staff and a full week of overlapping shifts.

That spike is also where you'll discover whether your customization needs (custom drag validation, print views, role-based editability) fit the library's extension points cleanly, or whether you're about to spend weeks fighting it.

The takeaway

FullCalendar is a strong foundation for enterprise scheduling, but resource-view performance, overlap validation, print layouts, permission-aware editing and timezone decisions are all yours to build. Spike against your densest real view before committing, and budget the customization time as real engineering work, not configuration.

Let's talk about your frontend