Skip to content

Ledger and invoices

Record the money once the job is done. Clean books are what keep repeat customers coming back — and what lets you settle up with helpers without arguing.

Open app.huanhuan.com.au. The Ledger tab at the bottom, and the 📊 Reports tile you get when you tap your store open on the Me page, are the two pages this chapter is about. The big "Net today" card at the top of Today also has a "Ledger ›" link in its top-right corner that goes straight there.

Three ways money gets recorded

Where the job came from Where you record it Button
A job on your schedule That job's card 💰 Bill
A deal that never went through Schedule (sold or served on the spot) Record a deal ✓ Record this deal
A cleaning job / repair ticket The ticket detail page 💰 Done & collect · record / 💰 Collect balance & book

Passing a self-order with ✓ Pass · record + schedule also books a deal — that path is covered in Taking and reviewing orders.

💰 Bill (a job on your schedule)

Open a job card and tap 💰 Bill. A small panel opens with three fields and nothing else:

  • Amount
  • Deposit (optional)
  • Payment method — Cash / Bank transfer / Card / Other

Tap Confirm billing and you get "Recorded ✓".

Billing does more than record money

The note under the panel reads: "This job is marked done and creates a sale (into the ledger) + a review link." So billing also marks the job done, and a done job locks — ✏️ Edit and Cancel disappear from the card, and you have to tap ↩ Reopen before you can change anything. The review link sits on the "Deal recorded" page described next; how to send it and what the customer sees is in Reviews and reputation.

Once billed, the 💰 Bill button is replaced by a chip Recorded #{id}. Tap it for the "Deal recorded" page: the deal's line items, your numbers (Net today / Total operating / Deposits held), a 📣 Ask the customer to review this deal card (tap the private link to copy it; a ready-made WeChat message sits underneath), plus Edit this deal, Record another and a collapsed "Add to calendar — for jobs needing a visit/delivery" section.

This page is the only place the review link appears. To get back to it later, tap the Recorded #id chip on the job card, the "Deal #id ›" link in the ledger, or All deals (by deal) ›.

⏱ Hourly / 💵 Flat is not a billing choice

The app does have a Pricing: ⏱ Hourly / 💵 Flat switch, but it lives in the add-a-job / edit-a-job form (the card then shows "💵 Flat $xxx") — it labels the job. The other place is helper pay when you subcontract. The billing panel has neither; it just asks for an Amount.

Record a deal (anything off-schedule)

Three steps: ① Customer → ② Items → ③ Money · confirm. Step three asks for Payment method / Deposit (0 if none) / Due-back date (for rentals), shows Net on this deal live at the bottom, and finishes with ✓ Record this deal.

  • Empty deals will not save. You need at least one line item or a deposit, otherwise the page says: "Nothing to save yet: add at least one line item, or take a deposit".
  • At the top of step ②, once you have saved a bundle, there is a dropdown "Bundle (one tap to load, still editable)" — pick one and its lines are appended to "This deal includes", each still editable. Building bundles is covered in Bundles, customers and rental calendar.
  • Step ③ has a tick box "Not paid yet (save as an open sale)", explained as: "An open sale is not posted to the ledger. Mark it transacted from the sale once you are paid." Tick it and the deal is saved as "Open (not paid)" — see the next section.
  • At the very bottom a collapsed "Sale form fields" section lets you add your own fields to the deal form (an address, say); changes do not affect deals already recorded.
  • Too busy to finish? Tap Save for later, driving now and it goes to Drafts ("Quick-saved on the go — tidy them up here later"). Note that Drafts is view and delete only: each entry has a single bin button ("Delete this draft?") and there is no "turn into a deal" — you paste the text back into the "Say it, we'll record it" box yourself. The only way into Drafts is the "N draft(s) waiting to be organized ›" line on the Record a deal page, which only shows while you have drafts.

Open sales, transacting and reopening

The "Edit deal #id" page (reached from Edit this deal on the "Deal recorded" page, or "Edit ›" on each row of "Recent deals" on Today) behaves in two ways:

  • An open sale: the line items can be edited directly. At the bottom sits Transaction done (post to ledger), with the small print "Uses the saved items. If you just changed them, save first." The confirmation reads "Mark $xx as transacted and post it to the ledger? Items and prices cannot be changed afterwards." → "Transaction recorded ✓".
  • A recorded sale: items and prices are locked and only listed, under the note "This sale is recorded, so its items and prices can no longer change. To correct a mistake, reopen it first." Tap Reopen to correct; the confirmation is "Reopen this sale? It is taken out of the ledger and becomes open again; mark it transacted again once corrected. Deposit records are left as they are." — fix it, then transact it again.

The status dropdown has only three options: Completed / On rent / not returned / Returned; "Open (not paid)" is a fixed yellow chip you cannot pick by hand. Deals that are not open show Mark returned (refund deposit) at the bottom instead. More (the All deals filters, the rental calendar) in Bundles, customers and rental calendar.

Deposits sit in their own bucket

A deposit is not revenue. The Reports line spells it out: Deposits held (liability, not income) =. When you take one the hint reads "Take a booking deposit to lock the slot (booked as liability, deducted on completion)."

A deposit only ever ends up one of three ways: Applied / Refunded / Forfeited to income.

  • Closing a cleaning job with 💰 Done & collect · record asks "Mark done and record it? Deposit is auto-deducted."
  • Handing back a repair with 💰 Collect balance & book asks "Confirm handover and book it? Deposit is auto-deducted."
  • A rental comes back via ↩ Mark returned (refund deposit), which lands in the ledger as a Refund entry.

Which day does the money land on?

Every entry is a timestamped ledger record, and the timestamp is not yours to change. The Reports subtitle says so: "Daily / weekly / monthly at a glance. All figures come from timestamped ledger entries — they can't be changed." The Ledger page also carries a 📜 Audit trail (uneditable) block at the bottom.

Neither the billing panel nor Record a deal lets you choose which day an entry counts towards. So if you want your monthly numbers to match what actually happened, record it the day you finish the job. Billing is three fields; recording a deal is three short steps.

Deleting a deal deletes its ledger entries too

A deal can be deleted outright, and the confirmation is blunt: "Deleting removes this deal's ledger, lines and review invites for good. Delete?" Think before you tap.

Ledger and Reports

Ledger · Records has two ways in, covering different ground:

Way in What it shows
The Ledger tab at the bottom All the stores you own in one list, with the "🤝 Helper income (working for other stores)" block underneath
Me → tap a store open → Ledger Just that store — and on a phone, this is where "⬇ Export CSV (Excel)" lives

Both have:

  • Three figures on top: Net today / Operating total / Deposits held
  • Four filters: All · Income · Expense · Deposit, plus search by customer / note / date / #order
  • Entry kinds: Rent · Sale · Service · Buy-in · Stock use · Deposit · Refund · Expense · Repair · Delivery · Fee; an entry tied to a deal carries "Deal #{id} ›", which opens that deal
  • All deals (by deal) › if you would rather browse deal by deal: search customer / item / note / #id, three filters All / Unscheduled (N) / On rent / out, and any row opens that deal's "Deal recorded" page; "Export CSV (current filter)" exists on a computer only. Details in Bundles, customers and rental calendar

On a computer the ledger is a proper table (Date / Deal / Kind / Note / Amount / Method / Account, plus a Store column in the all-stores view) that sorts when you click a column header; "All deals" and "Export CSV" stay in the page header, and in the all-stores view the export is the table as shown (with the store column).

📊 Report (Me → tap your store open → 📊 Reports; also in the side nav's Store data block on a computer): Today · N orders / This week · N orders / This month · N orders, plus This month breakdown, Last 14 days (daily), Last 8 weeks (weekly) and Last 6 months (monthly). Two exports: Download deals CSV and Download ledger CSV ("CSV, opens straight in Excel / Numbers (incl. Chinese). Good for your accountant or reconciliation.").

Don't misread 🤝 Helper income — that's money you earned elsewhere

"Helper earned / Helper paid / Helper committed" on the Ledger page and 🤝 Helper income (working for other stores) on Reports both count what you earn as a helper on someone else's jobs. They are not what you pay your own helpers. That money is in the next section.

How subcontract money moves

Once you subcontract a job, the money splits across two sides. The full flow is in Private dispatch (your own helpers); here is just the money.

1. Set the pay when you dispatch. Two ways: Fixed price (one agreed total per person) or ⏱ Hourly — the live wording is "Pay per helper = base + rate × hours. Quoted on the estimate; settled on actual hours at completion."

2. The helper taps ✓ Mark done. For a fixed price that is a single confirmation. For hourly it opens ✓ Mark done · settle hours, where they enter Actual hours and see the settled figure computed on the spot as base + rate × actual hours.

3. You read the job's books. The subcontract detail page has a card only the owner can see, This job’s books:

Revenue booked − Subcontract cost = Net

If the source job has not been billed yet it reads "Net $xx (not booked yet, subcontract cost only)" — a reminder that the revenue half is still empty.

4. You can still fix the hours before you pay. On an hourly job, after the helper marks it complete and before you tap Mark paid, that row gets an input plus 🕐 Adjust hours. Enter the corrected Actual hours and the pay recalculates on the new figure. (The helper's own screen says as much: "The owner can adjust them with you before paying out.") Fixed-price jobs have no such control.

5. The actual payment happens outside the app. Cash, bank transfer, whatever you agreed — HuanHuan never touches the money. Once you have paid, come back and tap Mark paid; the row turns to ✓ Paid, and on the helper's side the same job flips from "Waiting for owner to settle" to ✓ Paid, with a notification: "💰 {store} marked ${amount} as paid — check it arrived".

If the helper finished 7 days ago and you still haven't tapped Mark paid, you each get an evening reminder — yours reads "💸 {helper} finished {n} days ago and is still unpaid (${amount})", theirs "⏳ {store}: finished {n} days ago, payment not marked yet — worth a nudge". Once per job. See Messages and reminders.

Helpers never see what the job sold for

Printed right under the dispatch button: "Helpers only see their own amount, not the price of the job itself."

This cost has no category in the Ledger list

The ledger's entry kinds (Rent / Sale / Service / Buy-in / Stock use / Deposit / Refund / Expense / Repair / Delivery / Fee) have nothing for subcontracting. To see what one job cost you in helper pay and what net was left, open that subcontract's This job’s books card.

Invoices and GST

Invoices are a completely separate module: on the Me page tap your store open → 🧾 Invoices, subtitled "Australian Tax Invoice (AUD, GST 10%). Issue, print/save PDF, track receivables."

  • + New invoice opens a blank invoice; you type the line items yourself. There is currently no way to raise an invoice from a recorded deal — invoices and deals are not linked.
  • Three states: Draft / Sent / Paid. "Owing $xx" only shows in the list while money is still outstanding and the state is not Paid.
  • The printed heading follows the GST tick: ticked prints TAX INVOICE, unticked prints INVOICE.
  • Your business details, ABN, address, email, theme colour, invoice logo, bank-transfer details and default terms all live in ⚙ Invoice settings and apply to new invoices automatically. That page also holds the switch "Include GST 10% on new invoices by default". the invoice logo, like every other image others can see, goes through a content safety check before it's saved; one that doesn't pass isn't stored. See Storefront · Content safety check.

The totals at the bottom of the invoice editor stack up like this:

Row How it is worked out
Subtotal Every line's Qty × Unit price, added up
Discount The discount amount you typed
GST 10% When GST is ticked = (Subtotal − Discount) × 10%; unticked, the row reads "GST (excl.)"
Total (AUD) (Subtotal − Discount) + GST
Paid The amount you typed as received
Balance due Total − Paid

The box says 'Include GST 10% (Tax Invoice)' — but the 10% is added on

Tick it and 10% is added on top of (Subtotal − Discount) — the total goes up by 10%; it is not backed out of a GST-inclusive figure.

That leads to one easy mistake: Paid has to be the GST-inclusive amount you actually received. Put the pre-GST figure in Paid and the balance will not clear — it will sit at exactly 10%. Check the Total and Paid rows against each other before you send.

Also note the print view does not round amounts to two decimals the way the editor does, so a long decimal tail can show up. Glance at the printed figures; if something looks off, go back to the editor and fix Paid.

There is also a no-login invoice generator (v3.1.2)

app.huanhuan.com.au/invoice-generator.html — no login, no shop needed. Open it and write an Australian Tax Invoice (ABN, GST 10%), then print it straight to PDF.

It runs entirely in your own browser and uploads nothing; drafts are kept on that device. Handy for a mate who hasn't opened a shop yet, or for a one-off invoice that has nothing to do with this shop. Your shop's real receivables still belong in "🧾 Invoices" above.

Next