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.
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 and + Add job.
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:00and 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 · recruiting · 1/2 staff ›" — 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 you get "Done — can't change" / "Done — can't edit".
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. 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, and if the owner reschedules, yours 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.
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.
Next¶
- Taking and reviewing orders — how a customer self-order becomes a job on the calendar
- Ledger and invoices — where the money from 💰 Bill goes
- Private dispatch (your own helpers) — what to do with the jobs you can't fit