July 20, 2026

Working async across timezones when the team is one person

Listen to the summary
0:00 / 0:00
Working async across timezones, cover graphic for erkshitiz.com.np

Most of the clients I’ve worked with as a freelance developer from Nepal are somewhere between eight and thirteen hours removed from my working day, which means the overlap window where we’re both awake and online is often a couple of hours or none at all. I’ve written before about what that’s actually like from the client’s side of the arrangement. This is the narrower, more practical half of it: what genuinely changes about how you write a message when there’s no synchronous fallback sitting behind it, and what I got wrong before I understood that properly.

The message that cost someone a full day

Early on, a client messaged me asking whether a particular integration was ready to test. I replied “almost, just finishing a couple things, will update soon,” sent at the end of my working day, which happened to be roughly the start of theirs. That message felt complete to me when I wrote it. From their side, it answered nothing they could act on: not which couple of things, not what “soon” meant in hours, not whether they should wait around or plan their day assuming it wasn’t ready yet. They messaged back a clarifying question, which landed in my inbox after I’d gone to sleep, and by the time I answered it, an entire day had passed on their end for a delay that should have taken minutes to resolve if the first message had just answered the obvious follow-up itself.

That one exchange is the whole lesson, in miniature. In a synchronous setting, a vague status update costs almost nothing, because the natural next question gets asked and answered within the same minute, in the same conversation. Across a twelve-hour gap with no overlap, the cost of vagueness isn’t measured in minutes, it’s measured in however many hours separate you from your counterpart’s next waking period, which in practice usually means a full calendar day lost to a question that a slightly more complete message would have answered before it was even asked.

What actually changed

The concrete shift was treating every async message as if it were the only shot I’d get to unblock someone for the next twelve to twenty-four hours, because functionally, it often is. That means writing the message to answer the likely follow-up before it’s asked, not just stating status. Instead of “almost done, will update soon,” something closer to: “integration is functionally complete, I’m finishing error handling for the timeout case, expect it pushed and ready to test by end of your day tomorrow; if you want to test the happy path before then, it’s already on the feature/integration branch.” That’s a longer message to write, and it costs me a couple of extra minutes at the end of a working day when I’d rather just send the short version and move on. But the short version’s real cost isn’t the minutes I saved, it’s the day someone else loses waiting on a question I could have answered upfront.

The second change was being explicit and generous about expected response time instead of leaving it implicit. “I’ll be offline for the next eight hours, next time I can respond is around 9am my time, which should be your evening” is a strange sentence to have to write out loud, it feels almost unnecessary between adults who both presumably understand timezones exist. But leaving it unsaid means the other person is guessing, and a guess that’s even slightly wrong, expecting a same-day reply that’s actually a next-day reply, turns a normal delay into something that reads as unresponsiveness, when it was never a responsiveness problem at all, just an unstated latency.

Async doesn’t lower the bar on communication, it raises it

The instinct that took the longest to unlearn was the assumption that async communication could afford to be looser than synchronous conversation, since there’s no live back-and-forth pressure forcing precision in the moment. It’s the opposite. A synchronous conversation has a built-in repair mechanism, you can ask “wait, what did you mean by that” immediately and get an answer in seconds. Async has no such repair loop, or at best a repair loop with a twelve-hour latency baked into every round trip. That means the actual bar for how complete and specific a message needs to be is higher, not lower, than it would be in a room with someone, because the message doesn’t get a second chance to be clarified quickly if it comes up short the first time.

None of this is exotic advice, and I don’t think any single piece of it would surprise a client who’s worked with remote teams before. What surprised me was how much of it I only genuinely internalized after watching a vague message cost someone else a full day of waiting on a question I could have just answered up front.