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 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.
- Website
- idlehours.app
- 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.

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.

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.

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.

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.

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.
