IdleHours

A marketplace for last-minute local appointments. Businesses post the openings they have just lost, people nearby find and request them, and payment stays between the two.

IdleHours offer page for a cut and blow-wave this afternoon, with a large salon photo, a verified business badge, the session time, a $65 price and the usual price of $85 struck through.

IdleHours is a marketplace for last-minute local services. We designed and built the platform end to end. Salons, groomers, mechanics, trainers and tutors post the appointments that have just come free, and people nearby find them by place, category, price and time, then send a request and message the business. IdleHours takes no commission and never handles the service payment. Businesses pay only if they choose a paid plan.

Product
Last-minute local services marketplace
Audience
Australian service businesses with a cancellation or a gap in the day, and the people nearby who can take it.
Work involved
  • Product design and strategy
  • Web application design and development
  • Server-rendered public pages and SEO
  • Calendar and booking system integrations
  • Stripe subscription billing
  • Hosting, operations and business onboarding

An empty chair is time you can still sell

Every appointment book has holes in it. Someone cancels at nine for a ten o'clock, a job finishes early, a regular goes on holiday. The business can post it on social media and hope the right person sees it in time, or let it go. IdleHours gives those openings one place to live. People search by suburb, category, date and price and see what is free today and tomorrow, sorted by soonest available.

IdleHours homepage, with the heading Find your next local opening above a search bar for service, suburb and date, and a grid of photographed service categories.
Search starts with what, where and when. Sixteen categories cover everything from haircuts to trades.

Every offer is a real appointment

A marketplace like this only works if people trust what they see, so we wrote the rules into the product. An offer is a specific time with a set number of places, and it closes on its own at the cutoff. Nothing is invented: no sample listings, no made-up reviews, no inflated demand counts. A business can show a usual price only if it records where that price comes from, and the discount has to be genuine for every session.

Openings near you: offer cards for a haircut, a remedial massage and a dog groom, each with a photo, start time, business, suburb and price.
Each card leads with when the opening starts, then who is offering it, where, and the price. The businesses shown are samples from a local build.

A request, not a reservation

Payment happens between the customer and the business, so IdleHours never confirms a booking by itself. A customer sends a request with a message. The business accepts or declines it, and accepting locks the offer and checks its capacity first. Until then both sides see that it is a request, not a confirmed booking. The two talk in a message thread that updates live, from a dock that stays open on whatever page they are on.

Business view of a booking request, with the customer's message, a reply box and Accept request and Decline request buttons beside the request details.
A request stays a request until the business accepts it, and both sides are told so in plain words.

Built for an owner between clients

Most of the people posting openings are doing the work themselves, so the business side has to be quick. The dashboard shows live offers, requests waiting for a reply and accepted bookings, and posting a new opening takes a few minutes. Pro and Business plans can connect Google Calendar, Square Appointments, Bookeo, Acuity Scheduling or Cliniko, so an appointment booked elsewhere pauses the clashing session on IdleHours instead of letting it be sold twice.

Business dashboard overview showing live offers, new enquiries and accepted requests, with the business's two live offers listed below.
The dashboard overview counts real offers and requests. A new business sees honest zeros, not sample numbers.

Designed for the phone first

Most people will find an opening on their phone, and most owners will post one from theirs. Search stacks into a single column, offer cards keep the start time on the photo, and the price and session picker sit straight under the heading. On a phone, the business dashboard puts its sections in tabs across the top. Messages open full screen with the booking pinned above the thread.

IdleHours homepage on a phone, with the search fields stacked under the heading and the service categories below. Openings near you on a phone, with filter and sort controls above a full-width offer card. Offer page on a phone, with the session picker and price in a panel under the heading. Business dashboard on a phone, with the section tabs across the top, the offer counts and the business's offers.
On a phone: the homepage, openings near you, an offer, and the business dashboard.

No commission, by design

IdleHours makes its money from optional business plans, not from a cut of each job. The free plan covers a profile and two new offers each month. Pro and Business add unlimited offers, scheduled publishing, analytics and calendar sync, and Business adds staff accounts, all billed through Stripe.

Build notes

  • Public listings check the clock and the business's standing on every query, so an expired or suspended offer is never shown, even if a background job runs late.
  • Accepting a request locks the business and the offer, then checks the session's remaining capacity, so the same appointment can't be accepted twice.
  • Calendar sync with Google Calendar, Square Appointments, Bookeo, Acuity Scheduling and Cliniko. A clash pauses the overlapping session and clearing it reopens it.
  • Live messaging over server-sent events, using PostgreSQL notifications so it works across several servers without another queue.
  • Stripe Checkout and the customer portal for business plans only. Signed webhooks update plan limits in the same transaction.
  • Aurelia 2 front end rendered on the server, a Fastify API, a separate worker for scheduled publishing, expiry and email, all on Railway.

Related services and reading