Skip to content

Scheduling and calendar

The second tab in the bottom bar, Schedule, is this page — its heading reads 📅 Schedule.

One thing to know up front: this calendar is merged. Every booking from all the stores you own, plus the jobs you personally took helping other stores (in purple), are drawn on the same timeline. Job cards carry a 🏬 store name so you know whose job it is, and if you run more than one store, adding a job gives you a Which store dropdown.

So this page really answers one question: am I free in that window or not.

Three views

Three buttons across the top:

  • Today — tapping it jumps back to today and switches to the day view.
  • This week — the next 7 days counting from today, not Monday to Sunday.
  • 📅 This month — whole-month occupancy; rentals and long-running work live here. For rentals there is also a separate month-by-month Rental calendar (days with something on rent are marked ●N); see Bundles, customers and the rental calendar — that page has no button leading to it yet, you type the address by hand.

Your choice is remembered (in the browser, for about six months); if you have never picked one it opens on 📅 This month. Day and month views both swipe left/right to page. To jump straight to a date, add ?date=2026-09-05 to the URL.

The top of the page also has ℹ️ Info, ⋯ More, 🚗 Drive mode, 💬 Quote and + Add job.

You can add your own fields to the + Add job form

Me → "Edit store" on the store's row → the Scheduling segment holds one card, "Job form fields": "What to record on a job besides the customer and time (for example address or home type). It starts from your business type and you can change it. Changes do not affect jobs already scheduled." It is edited the same way as the customer order form (field name / required / options / example hint); see Storefront. This form is the one you fill in when scheduling — customers never see it.

Out and about, the mini program is view-only

The 换换排活 WeChat mini program's Schedule page shows the same calendar by day / week / month, but you cannot add or move jobs there — the page says so itself: "Adding and rescheduling happen on the web; here you can look through each day." See WeChat mini program.

On a computer

With a wide enough screen, a fixed left column holds the "📅 This week" seven-day overview (tap a day to jump to it), "🤝 Invites to confirm" and "📌 Jobs to schedule"; the Today / This week / This month views sit on the right, and "🔗 Share" opens as a centred dialog. The 🚗 Drive mode button is hidden on a computer — it's meant for the phone in the van.

Customer order requests are a different page

Reviewing self-orders does not happen here. Go to ⋯ More → 📦 Customer orders · {name}, or read Taking and reviewing orders. The other item in that menu, 🤝 Job assignments · {name}, is where you subcontract work to helpers.

List or timeline

At the top right of Today / This week you can switch between ☰ List and ▦ Timeline. The default is ☰ List, and your choice is remembered (about six months); 📅 This month has no such toggle.

The timeline view is the Google-Calendar-style one. The app describes it itself: "Hours down the left; each block is a job, its height is how long it takes. Side by side = overlapping."

How to read the timeline

  • It draws 07:00–20:00 by default, stretching outward only if you have earlier or later jobs (clamped to 0–24).
  • The day view labels hours as 09:00 and adds a dashed half-hour guide line; the week view shows just the number, 9.
  • Jobs with only a morning / afternoon / evening slot are drawn as dashed blocks at 9–13 / 13–17 / 17–21, with a ~ after the time label.
  • A job with a start time but no end time is drawn as start + 2 hours.
  • Jobs with no time at all sit in the top row, labelled TBD.
  • Colour is assigned per store + vehicle/person pair, with a legend under the grid. Jobs for other stores are always purple (legend: Helping others); finished jobs turn grey (legend: Done) and get a ✓ in front of the title. The legend ends with a dashed swatch, AM/PM only.
  • The red line is the current time, and it moves every minute. It appears in the day view and in today's column inside This week — only when the current time falls inside the hours actually drawn.

Tap a block and its details open below (the page says so: "Tap a block → its details and actions show below"). Two kinds of blocks open two different things:

  • Tap a block from your own store → the full job card below, with subcontract / done / bill / edit / cancel.
  • Tap a purple Helping others block → the 🤝 Jobs you took (helping others) row instead: details/chat, 📅 Add to schedule, ✓ Mark done.

In the week view, tapping a block or a day drops you into that day. An empty day reads: 📅 No jobs this day — tap "+ Add job" above.

Clash protection

Book two jobs onto the same vehicle or the same person at overlapping times and you get a confirmation box:

This resource already has a job in that time slot. Force it anyway?

Confirm and the job goes on anyway — nothing is lost. This is not only for new jobs: editing the time or moving a job to another day runs the same check. To skip the prompt, tick ⚠ Force it (schedule even if the time clashes) in the form up front (the edit form calls it ⚠ Force it (move over even if it clashes)).

Once forced, the two jobs sit side by side with a red outline in the timeline, and the job card carries a yellow ⚠ Clash badge whose tooltip reads "Overlaps another job on the same resource (forced) — needs your attention".

Why warn instead of block

An early version silently dropped the second job on a clash, so a confirmed order never appeared on the calendar. Now it asks first and then does what you said — and keeps nagging with the red outline and the badge, because this is a call only you can make: shift the time, subcontract it, or run both because they are genuinely on the way.

What's on a job card

Open a job from one of your own stores and the buttons run left to right:

Button What it does
🤝 Subcontract Dispatch this job to a helper. Once dispatched, this slot becomes a chip — "🤝 Subcontract · open · 1/2 staff ›" (before v3.1.9 it said "recruiting") — that opens the dispatch
✓ Done Mark it finished; the button then becomes ↩ Reopen
💰 Bill Opens the small billing panel (below)
📋 Confirm text Copies a "booking confirmed" message to send the customer
📤 Share Copies a hand-off message to paste into WeChat
✏️ Edit / Cancel Change the job / cancel the job

Done means locked

Once you tap ✓ Done, the ✏️ Edit and Cancel buttons disappear and the bottom of the card reads:

🔒 Done — can't edit or cancel. Reopen first if you need changes

To change something, tap ↩ Reopen first, then mark it done again. The server backs this up too: bypass the interface and it refuses with a message that is Chinese-only for now — 「已完成的活不能修改,先「重新打开」」 ("a finished job can't be edited — reopen it first"; the cancel version says 不能取消, "can't be cancelled").

Cancelling asks "Cancel this booking?" first. If the job has already been billed, the wording changes to "This booking is billed (linked to a deal). Cancelling removes only the booking — the deal record stays." In other words, cancelling a booking never deletes the money.

The billing loop

💰 Bill opens a panel with three fields only: Amount, Deposit (optional), and Payment method (cash / transfer / card / other). Tap Confirm billing and you get "Recorded ✓".

The line under the panel spells out what happens: "This job is marked done and creates a sale (into the ledger) + a review link." So 💰 Bill does three things at once — records the money, marks the job done (which puts it into the locked state above), and generates the review link.

After billing, the button becomes a coral chip Recorded #{id} that opens the "Deal recorded" page — the review link lives there: tap to copy, send it to the customer; see Reviews and reputation. Billing is not affected by the done-lock — you can mark a job done first and come back to bill it later.

Invites and jobs to schedule

Two purple-bordered cards may appear at the top of the page. These are your helper side:

  • 🤝 Invites to confirm (N) — jobs other stores dispatched to you, with Decline and ✓ Accept.
  • 📌 Jobs to schedule (N) — "Jobs you took that have no time yet. Plan one and it lands on your calendar." Tap 📅 Add to schedule to give yourself a slot; jobs you planned yourself show a (your plan) tag in the lists.

Jobs where the other store already set a time need nothing from you — they land on your calendar at the store's time. If the owner reschedules you get a 🔔 "📅 … updated a job you took", and your calendar follows on your next refresh.

Sharing your schedule

🔗 Share at the top right of Today / This week opens a panel titled "🔗 Share schedule timeline · {name}". It covers the store you are currently managing. You decide who can open it — three levels:

Level Who can open it They see They never see
Off Nobody — Opening it shows "This link has expired or sharing was turned off"
Public Anyone with the link Time blocks + vehicle / person Customer, address, phone, price
Helpers only Logged-in accounts that are helpers of this store Customer name, address, notes; their own jobs marked ★ Phone, WeChat, price

The app's own wording under each level:

  • Off: "Link is off — nobody can open it." This is where an unconfigured store sits, and the panel does not even show you a link at this level.
  • Public: "Anyone with the link sees busy blocks and van/person only — no customer, address, phone or price. Good for showing customers when you're free." When no vehicle/person name comes through, the block just says Booked.
  • Helpers only: "Only accounts that are logged in as a helper of this store can open it: shows customer name, address and notes; no phone, WeChat or price. Their own jobs are marked ★."

Set to anything other than Off, the panel shows the link plus three buttons: Copy link (toast: "Link copied — paste it into WeChat"), Preview, and New link. The last one asks "A new link makes the old one stop working for everyone you sent it to. Continue?" — the old link dies immediately.

The link you send looks like app.huanhuan.com.au/sched/your-share-code. The page that opens is titled Schedule timeline. It is timeline-only (no list toggle), with Day / Week and a Today button on top; an empty range reads "Nothing scheduled in this range — all free". The link takes parameters to open a specific day / week: ?d=2026-09-05&v=week (v only accepts week; d must be YYYY-MM-DD or it falls back to today).

Someone not logged in who opens a helpers-only link is stopped with "This schedule link is only open to helpers of {org} — please log in"; Log in to view sends them back afterwards. Someone logged in but not a helper of that store is told "your account isn't a helper there", with no login button.

Helpers can open it inside the app

Helpers do not need to keep the link. Under Me → Stores I help, each store that has sharing on gets a 📅 Schedule button that opens the same timeline.

Away jobs take up time too

Jobs that you (or your people) took as a helper for another store occupy a purple block on the shared timeline, with a fixed title:

🤝 Away job

That block carries only a date and a time range — no customer, address, store name or amount from the other side. Public and Helpers-only see exactly the same thing here; there is no difference between the levels. Whenever a range contains away jobs, the legend gains a 🤝 Away job entry. The block does not open into details, and it turns grey once finished.

There is one reason for this: the timeline you share never claims you are free when you are not. A customer picking a slot off your link cannot pick the two hours you are already working somewhere else.

Same jobs, two names

On your own schedule page these jobs appear as Helping others in the legend, with the other store's name and address — that view is for you. Only on the shared timeline are they narrowed down to 🤝 Away job. What other people see is always the narrowed version.

Sync to your phone calendar

At the bottom of the page there is a collapsible card, 🔔 Sync to phone calendar (on-time reminders): "Once subscribed, scheduled jobs appear automatically in Apple / Google Calendar with a 1-hour reminder. Subscribe once, syncs automatically."

On iPhone tap 📲 One-tap subscribe (iPhone); elsewhere copy the subscribe address or use ⬇ Download .ics file. The card only appears once your store settings have a calendar token.

The 5 pm reminders

Besides the phone calendar's alarm, HuanHuan itself runs through tomorrow's jobs every evening around 5 pm (Sydney time):

  • if your store has jobs tomorrow you get one summary, "📅 {n} job(s) tomorrow: {store} · {date}"; tap it to jump straight to that day on the schedule. Jobs you do yourself and dispatches that are already fully staffed count too. One per store per day, not one per job. If it's too much, mute it under "Secondary activity" in your push settings.
  • A dispatch you sent out is on tomorrow and still short-handed → you get "⚠️ Tomorrow’s job is {n} short: … still time to invite or publish".
  • A job you accepted as a helper is on tomorrow → you get "📅 Job tomorrow: …".

All of these land in the 🔔, and on your phone if push is on; in the mini program, the first two are the "Tomorrow's jobs" kind under Me → WeChat reminders, delivered to WeChat Service Notifications. The full list is in Messages and reminders.

Drive mode

🚗 Drive mode at the top of the page is for the road: today's jobs in large type, "Job 2 / 5" across the top, then 🔊 Read again, 🧭 Navigate to this job (hands off to your phone's maps app), Next job →, ✓ Done and Back to schedule.

With nothing booked it says "Nothing scheduled today"; once you finish, "All done for today". It reads jobs out loud, and pops "📦 New order in!" when a new order arrives while you are driving.

The flows on this page are demonstrated in the short-video tutorial if you would rather see them moving: episode 6 "Schedule without clashes", episode 10 "Time blocks: clashes at a glance", episode 11 "Share your schedule, keep details private" and episode 13 "Quote in 10 seconds".

💬 Quote / script

In the button row on the schedule page (next to "+ Add job") there is 💬 Quote, moved over from the old web app in v3.1.2. The page is titled "💬 Quote / script": "Fill it in — the price and a ready-to-send message are worked out for you. Rates are editable (Sydney removalist defaults)."

It is built around moving work, in four parts:

  1. ① This job — crew (one person / two), estimated hours, flights of stairs (no lift), include 10% GST? (yes (transfer) / no).
  2. ② Rates (editable) — call-out fee for one / two, labour per hour for one / two, stair fee per flight per person, deposit. The rules sit underneath: "Rules: under an hour counts as one hour; after the first hour it is billed in half hours; no stair fee below the second floor."
  3. ③ Estimate — broken out line by line (🚗 call-out / 💪 labour / 🪜 stairs / subtotal / GST), ending in "Total (incl. GST)".
  4. ④ Message for the customer — those numbers assembled into a message you can send as is. The hint says "tap the box to copy"; tapping turns it into "Copied ✓ paste it into WeChat".

Done? "← Back to schedule".

Rates are stored on that device

The page says so: "Rates are saved on this device and filled in next time." Handy — set them once and they follow you — but a new phone, a different browser or a cleared cache means typing them again. "Reset to default rates" puts the factory numbers back.

This is arithmetic plus a message, not a quote the customer confirms

This page only does the sums and writes the message for you; it does not send anything to the customer — you copy the message and send it yourself on WeChat. Quotes that hang off a ticket and the customer accepts with one tap — repairs, cleaning, PC builds — are made inside each work order ("Save & quote" → the customer page's "Confirm repair · Accept this quote" / "Confirm booking · Accept this quote"); see Work orders: repair · cleaning · PC builds.

Next