Home Pricing Docs Blog Changelog About Log in Go to your tickets
← Back to the blog

Designing the waiting until feature

Freek Van der Herten
Freek Van der Herten
June 18, 2026 · 4 min read
Designing the waiting until feature

A little while ago, one of our users asked for snoozing: set a handled ticket aside and have it come back to the top of the inbox automatically at a time they pick. You reach for that constantly in support, whether you're checking back on a fix in a few days or following up on a sales question next week.

We liked it, so we built it. The feature is small, but the way you pick that time went through a few versions before it felt right, and that's the part worth sharing.

We started with a list of presets

The first version was the obvious one. A small menu with a handful of choices: later today, tomorrow, this weekend, next week, in a month. Anything else dropped you into a calendar.

A dropdown listing preset waiting times: later today, tomorrow, this weekend, next week and in a month

Plenty of tools ship exactly this, and it works. But using presets only cover the cases you thought of. The moment someone wants "next tuesday afternoon" or "the 23rd at noon", they fall through to the calendar, and now there are two completely different ways to pick a time in the same little menu.

Then we let you just type it

So we threw the hard coded list away and replaced it with a single text field. You write when you want the ticket back in plain language, "tomorrow at 9am" or "in 3 hours", and that's it.

A text field reading "tomorrow at 9am" with a preview underneath reading "Reopens Fri, Jun 19 at 09:00"

Parsing human dates yourself is a swamp you don't want to wade into. There's a library that already does it well, chrono-node, and it carries the whole feature. Here's the core of how we use it:

import * as chrono from 'chrono-node';

function parseWhen(text: string): Date | null {
    if (text.trim() === '') {
        return null;
    }

    return chrono.parseDate(text, new Date(), { forwardDate: true });
}

That's the entire parser. parseDate returns a Date or null, so a failed parse is trivial to handle. The forwardDate option is the detail that makes it feel right: when the input is ambiguous, chrono resolves it into the future. Type "9am" after nine in the morning and you get tomorrow at nine, not a time that already passed today. For a snooze, the future is almost always what you mean.

The risk with free text is that people don't trust it. They type something and wonder what the computer actually understood. So under the field we show the parsed result back, "Reopens Fri, Jun 19 at 09:00", and we update it as you type. We debounce that preview so it settles after you pause instead of flickering on every keystroke, and we only show a validation error once you actually try to submit, never while you're still typing.

Recents bring back the one-click speed

Typing is flexible, but we gave up something when we deleted the presets: the single tap. Clicking "tomorrow" was faster than typing it. We wanted that speed back without bringing the hardcoded list back.

The answer was to remember what you type. Every phrase you confirm gets saved, and the next time you open the field they're waiting there as one-click options.

The field with a recent list underneath showing in 3 hours, tomorrow and next week with their resolved times

A few decisions went into that list. We keep three, deduplicated, so it stays short and doesn't fill up with near-identical entries. We sort them by their resolved time, soonest at the top, rather than by how recently you typed them, because when you're scanning for "the soon one" versus "the far one" the time is what you're after. And we store the phrase you typed, not the date it resolved to, then re-parse it on click. That way "in 3 hours" still means three hours from now the next time you use it, instead of pointing at a moment that's long gone.

The nice part is that the list becomes yours. If you always snooze things to "monday 9am", that's what sits at the top, not a generic option we picked for everyone.

It's live, and it came from you

Waiting until is available now for every There There workspace. Open a ticket, set it to Waiting, and type when you want it back.

If you're using There There and there's something you wish it did, tell us. There's a decent chance you'll see it in a post like this one.

Give every customer a thoughtful answer

There There is an AI-powered helpdesk built by Spatie, the team behind Flare and Mailcoach, who do support every single day. AI surfaces context and drafts replies, so your team responds faster. Try it free.

Continue reading

A sidebar that gets out of the way

A sidebar that gets out of the way

The ticket view sidebar is one of the most important parts of our app. We've sweated the details to make it look really nice.

Freek Van der Herten
Freek Van der Herten · Jun 8, 2026 · 1 min read
A "Thank You" shouldn't reopen a ticket

A "Thank You" shouldn't reopen a ticket

A closed ticket gets a "thanks" and most helpdesks drag it back open. Here is the layered, fail-safe way There There decides to leave it closed.

Freek Van der Herten
Freek Van der Herten · May 30, 2026 · 4 min read