A team spread across Seoul, London and New York does not have a scheduling problem. It has nine hours of offset, and every meeting that ignores that number quietly taxes somebody's evening. The fix is not a smarter calendar app. It is a short list of written conventions that anyone can apply without thinking.
Most advice about distributed teams starts with tools: pick a scheduler, share your calendar, try asynchronous video. Tools help, but they only automate a decision you have already made. If the team never agreed on which hours are shared, a scheduler will happily book a 3 a.m. call and call it a match.
This guide is the decision layer. It covers how to count a team's real overlap, how to spend it, how to share the pain fairly, and the calendar conventions that keep a recurring meeting from drifting an hour when one country changes its clocks.
Start by counting hours, not people
Convert everything to UTC once and the shape of the problem becomes obvious. In November, after Europe and North America have left daylight saving time, the three cities in our example sit at UTC+9, UTC±0 and UTC−5. A normal 09:00–18:00 workday in each place covers:
| City | Local workday | In UTC |
|---|---|---|
| Seoul | 09:00–18:00 | 00:00–09:00 |
| London | 09:00–18:00 | 09:00–18:00 |
| New York | 09:00–18:00 | 14:00–23:00 |
Seoul's window ends at exactly the minute London's begins, and New York starts five hours into London's day. The three windows touch at 09:00 UTC and nowhere else. That is not a scheduling inconvenience. It is arithmetic, and no tool will change it.
Two consequences follow, and both are worth writing down:
- A three-way meeting is always outside someone's workday. Pick the hour and you pick the person who pays for it.
- Pairwise overlap is generous. Seoul and London share an early-morning window; London and New York share a long afternoon; Seoul and New York share almost nothing except Seoul's late evening and New York's early morning — and only in the winter. Design for pairs, not for the group.
Give the team one reference clock
Before any scheduling, agree on how times are written. Two rules cover almost everything:
- Never write a bare time. “Let's sync at 3” is a bug report waiting to be filed. Write
15:00 Seoulor, better,2026-11-10T15:00+09:00. - Use IANA zone names, not abbreviations.
Asia/Seoulmeans one thing.KSTcould be Korea Standard Time, andCSTcould be China, Central US, Cuba or Australia's Central time depending on who is reading. Abbreviations are a compression scheme with a collision problem.
For machines, store UTC and convert at the edge. For humans, render in the reader's local zone. Both directions matter: a database that stores local times will be wrong for one hour twice a year, and a document that shows only UTC forces everyone to do mental arithmetic on every line.
Tip
Keep a TIMEZONES.md at the root of the repo or wiki with four lines: each member's IANA zone, their usual working hours, the hours they are reliably unreachable, and the current overlap windows. When someone new joins, they read it once and stop guessing.
Treat overlap as a budget, not a right
The instinct is to declare “core hours” — say 15:00–17:00 UTC — and schedule everything inside them. That works until you notice the same two people are always in the good slot and the same one person is always awake at midnight. Core hours are a fixed cost assigned to a fixed person.
A more useful model separates work by how much synchrony it truly needs:
| Work type | Needs | Where it goes |
|---|---|---|
| Decisions with disagreement | Live, two-way, 30–45 min | Shared window, agenda sent 24 h ahead |
| Reviews, pairing, onboarding | Live, one-way with questions | Shared window, recorded for the third zone |
| Status, planning recaps | Written | Thread or doc, no meeting |
| Deep work | Long, uninterrupted | Outside the shared window, by default |
If a meeting cannot be defended in the first two rows, it should not consume the overlap. Teams that adopt this rule usually find their shared hours were mostly spent reading updates aloud.
Rotate the bad slot
Once you accept that somebody is always outside their workday, fairness becomes a schedule instead of a sentiment. Two mechanisms work well in practice.
Rotate the hour
For a weekly three-way meeting, alternate between the two least-bad slots every other week. Everyone is inconvenienced half the time, which is a known and bounded cost, instead of one person being inconvenienced every week, which is a resignation letter with a long fuse.
Rotate the chair
The person who runs the meeting also owns the follow-up notes. If the chair rotates, the bad slot follows the chair. This has a second benefit: everyone learns how the meeting is produced, and meetings that do not need to exist become obvious to the person who has to write them up.
Note
If you want a scoring rule instead of a rotation, penalise squared distance from 09:00–18:00 local. A slot that puts someone at 22:00 is far worse than three slots that put everyone at 08:00, and a squared penalty captures that; a simple count of people outside the workday does not.
Make asynchronous the default, with a real handoff
“Async first” fails when it means “nobody knows what happened.” It works when every handoff is a short, predictable artifact. Five lines are enough:
Shipped: the export job now retries on 429 (PR #418, deployed 14:20 UTC)
Blocked: none
Next: backfill for October, starting 09:00 UTC
Needs a call: keep the 7-day TTL or move to 30? (my lean: 30, no cost impact)
Read: PR #418, the runbook section "retry policy"
Post it where the next timezone wakes up, not in a chat thread that will be buried under six hours of chatter. A single “standup” channel where every person posts this format at the end of their day turns a 24-hour cycle into three visible passes of work, and it removes the need for the meeting that used to exist to discover the same information.
For decisions, add a deadline and an explicit fallback:
“If nobody objects by Thursday 09:00 UTC, we ship the 30-day TTL.”
Silence-as-consent is only fair when the window is long enough for every zone to see it in working hours — a 24-hour window with a stated time is usually the minimum — and when the person who proposed it has written down what happens if they are wrong. Without both, it is just a way to decide things while the other hemisphere sleeps.
Calendar conventions that survive contact with reality
These are small habits with outsized returns, because they fix the failure modes that repeat every single week.
Put the zones in the title
Design review — 17:00 Seoul / 08:00 London / 03:00 New York looks clumsy the first time and indispensable the second. Participants scan the title, not the event's time widget, and the title survives screenshots in chat.
Pin the reference zone in the description
Calendar clients display times in the viewer's local zone, which is correct and also invisible. Add a line to the description: This meeting is defined in Asia/Seoul. If your local time looks wrong, check your device's timezone. It resolves a surprising share of “is this meeting at 8 or 9?” messages.
Expect the two-week daylight saving gap
Europe and North America do not change clocks on the same date. In autumn the EU switches on the last Sunday of October and the US on the first Sunday of November; in spring the order reverses. For one or two weeks a year the transatlantic offset is four hours instead of five, and every recurring meeting silently moves for the people on one side.
Watch out
A recurring event stored against a fixed UTC hour stays put while local workdays shift around it. A recurring event stored in the organizer's local time moves with the organizer's clock but can drift for everyone else. Neither is universally right: for meetings tied to a team's working day, anchor to that team's zone; for a global standup tied to a handoff, anchor to UTC and announce the shift.
Never assume the hour ends in :00
India is UTC+5:30, Nepal UTC+5:45, Chatham Islands UTC+12:45, Lord Howe Island UTC+10:30 in winter. A team with one member in Bengaluru and one in Kathmandu has a 15-minute offset between them; schedule at “the top of the hour” and someone is permanently joining at :15 or :45. Half-hour offsets are common enough that a scheduling template should never hard-code minute zero.
A worked example: finding the least-bad hour
Take a Tuesday in November and evaluate the candidate slots for a 45-minute review. Local times, with the workday 09:00–18:00:
| UTC | Seoul | London | New York | Verdict |
|---|---|---|---|---|
| 07:00 | 16:00 | 07:00 | 02:00 | New York is asleep |
| 08:00 | 17:00 | 08:00 | 03:00 | Only Seoul is inside its day |
| 09:00 | 18:00 | 09:00 | 04:00 | The single touching point |
| 14:00 | 23:00 | 14:00 | 09:00 | Seoul pays in sleep |
| 15:00 | 00:00 | 15:00 | 10:00 | Seoul pays more |
| 22:00 | 07:00 | 22:00 | 17:00 | London pays in sleep |
There is no good answer, and that is the useful finding. The correct response is not to pick the least-bad row and rotate it forever; it is to split the meeting. A 25-minute Seoul–London call at 08:00 UTC plus a 25-minute London–New York call at 15:00 UTC keeps every participant inside their working day, costs 50 minutes of calendar instead of 45, and produces better decisions because nobody is half present.
When you do need everyone together — a quarterly kickoff, an incident review — spend the shared budget deliberately: publish the slot a week early, record it, and give the person in the worst zone the next morning free of meetings.
The ten-minute setup
You do not need a spreadsheet to do the arithmetic above. Pikkola Time is a browser-based planner that compares city working hours, scores candidate slots against each participant's day, and exports the winner as an .ics file you can drop into any calendar. Nothing is uploaded and no account is required.
A workflow that works:
- Add every participant's city and their real working hours — not the contractual ones.
- Mark the people who cannot take calls before 10:00 local; the default score assumes a standard day.
- Read the top three suggestions, then apply the rotation rule: whichever slot is worst for someone becomes next month's slot for someone else.
- Export the
.icsand put the three-zone times in the title before you send it.
A checklist you can paste into your repo
- Every recurring meeting has three-zone times in its title.
- One reference clock is named in the docs, and every written time carries a zone.
- The team knows its real overlap windows in UTC, and they are written down.
- The bad slot rotates; so does the meeting chair.
- Handoffs use a five-line format posted where the next zone will read it.
- Daylight saving is reviewed twice a year, in the last week of March and October.
- No scheduling template assumes minute :00.
None of this is exotic. It is the difference between a team that happens to work across timezones and a team that has decided how it will do so, in writing, once — so that no one has to negotiate their own evening every week.