Finance

Subcon and project billing handoff for Singapore SMEs: from approved hours to the client invoice pack

Subcon and project billing handoff for Singapore SMEs: from approved hours to the client invoice pack

Subcon and project billing handoff for Singapore SMEs: from approved hours to the client invoice pack

Tuesday 10:40. The Sheet finally shows Hours approved for job `ACME-04` — last week’s site OT signed, payroll-ready already pushed upstream. Someone pastes “bill the client pls” into the ops Telegram with a screenshot of the hours tab. The named PM who must sign the billable pack — which lines are client-chargeable, which stay internal, which OT was for us not them — is on MC. By Thursday finance has already raised INV-2201 from the full hours column, including OT the client never agreed to, and a second PM is about to double-bill the same milestone from a WhatsApp photo of an older Sheet. Cash leaves the wrong way: too much, too soon, or twice — trail still a Telegram scrollback.

That is the subcon / project billing handoff problem for a Singapore SME. Not a missing PSA “auto-invoice from timesheet” feature. Not a twin of the timesheet / OT approval chapter (upstream hours gate before payroll). A lived queue — approved hours or milestone ready → extract billable lines → route exceptions → named human signs the billable pack → tracker hands off to finance for the client invoice — that stalls or misfires the week one signer is away, and that still lives in chat.

This guide is the operator version of project billing and subcon timesheet-to-invoice handoff for Singapore SMEs. Named runbook: trigger, extract, route, human gate, tracker. Automation files, flags, and chases. A named PM or ops still signs the billable pack. Finance still issues the client invoice. Nobody silent-raises a client tax invoice because a Sheet said “Hours approved,” and nobody collapses payroll OT into the client bill. Upstream: timesheet / OT approval — link it; do not rehash. Light AP contrast: invoice workflow is supplier-pay; this chapter is the client-bill pack after hours are signed. Wider frame: workflow automation services. Visitor induction stays parked.

What this guide covers

  • What “subcon / project billing handoff automation” means here — billable pack → client invoice, not a payroll twin
  • Why Singapore SME agency / construction / IT-services billing culture matters without a news roundup
  • A named hours-approved / milestone → extract → route → BILLABLE PACK → AR invoice handoff runbook you can print and mark up
  • Who signs the billable pack vs who issues the client invoice vs who owns write-offs
  • Trail: timesheet/OT approve → billable pack → client invoice (link siblings; light AP contrast)
  • When Sheets, Gmail/Drive, and Telegram are enough — and when they are not
  • Steal-this-build DIY that stops before judgement (no silent auto-invoice; no OT payroll into client bill)
  • Failure modes, consult → build → train, and checklists for this week

What subcon / project billing handoff automation means here

Search “project billing automation singapore” or “subcon timesheet to invoice SME” and you will mostly get global PSA demos, “auto-invoice from timesheets” pitches, or thin local posts that jump to a tool list and a funding footnote. Useful as a sketch. Thin as an operating manual for an agency, construction / fit-out, IT services, or professional-services firm that already lives in Gmail, Drive, Sheets, Telegram, and a ledger — with one named PM still holding client-billable hours this cycle.

For an SME operator, subcon / project billing handoff automation is simpler to name:

Automation files approved hours and milestone packs, extracts billable lines, flags non-billable / OT-not-agreed / duplicate / over-scope rows, and chases incomplete packs. A named PM or ops owner still signs the billable pack. Finance still issues the client invoice. Nobody auto-invoices the client because a Sheet said “Hours approved,” a Telegram said “bill pls,” or payroll OT and client billable hours looked like the same column.

Anything that raises INV from every approved timesheet row, marks OT client-billable because it was payable to staff, or invents a milestone invoice from a blurry WhatsApp photo is not a productivity win. It is a control failure with a notification sound — credit note or angry client call already queued.

Three purchases get confused under the same phrase:

  • Software — PSA / project billing module, time-to-invoice SaaS, Power Automate template. Fine when billable rules and rate cards are already written.
  • A service — maps *your* hours-approved / milestone → extract → route → BILLABLE PACK → client-invoice handoff in tools you already use, trains PM and finance, stays reachable on leave week.
  • A chat habit — paste hours Sheet into a group, finance raises INV from the full column, call it “project billing.” Dies on MC week — wrong hours, OT double-counted, or the same milestone twice.

Buy software if the process is clean. Leave it with a careful human if volume is tiny. Hire a service when the same fields wait every cycle, the work spans chat + Sheet + ledger, and a wrong pack moves client cash.

Not timesheet / OT twin — once. The timesheet / OT approval runbook is the *hours* gate before payroll. Open it when hours are unsigned or OT landed in payroll without a named yes. This chapter starts *after* hours (or a milestone) are approved: which lines are client-billable, who signs the pack, who issues the client invoice. Same five-word shape. Different queue. Link upstream — do not re-teach Approve hours / OT into payroll here.

Not supplier AP twin — once. The invoice workflow is AP: supplier PDF → named tap pay. This chapter is the *client* invoice pack on AR after billable work is signed. Same ledger possible; different gate. Supplier PDF pile → AP chapter. Wrong hours / OT / milestone on the client INV → here.

Why Singapore SME project / subcon billing context matters (without a news roundup)

You do not automate project billing handoff because a press release landed. You automate because “bill the client” lives as a Telegram habit, leave gaps turn approved hours into the wrong INV, and the person who “just knows” which OT was client-agreed is the same person who goes on MC.

Billable hours are a queue that touches client cash and trust. Hours approved for payroll are not automatically hours the client owes. A pack that sits until month-end with no named BILLABLE PACK signed is delayed AR or a rushed invoice from memory. OT payable to staff but never agreed as client-billable is how credit notes and scope fights start. One loop — hours/milestone ready → billable pack → client invoice — most SMEs notice only when INV already left.

Agencies, construction / fit-out, and IT services — light. Many SG SMEs bill T&M, milestone, or mixed packs off site hours, subcon timesheets, or sprint burn. You need job / WBS / milestone IDs; a named pack signer; and a finance handoff that does not invent lines. Sheets + Xero is enough for most 10–80 person firms — not a PSA migration sold as readiness.

WhatsApp and Telegram are the real billing desk. “Bill pls” with a screenshot, no owner, no SLA, and no backup on the pack queue is how wrong INV and double-bills are born — worse when the PM is offline and finance still cuts Friday.

Leave is not an edge case. In a 15–40 person firm, PM and ops on AL the same week is normal. If “what is billable” lives in their heads, you have people, not a process. Leave cover overlays the pack-signer gate — link it; do not re-teach here.

Labour and AI adoption (named surveys only). SBF 2024: manpower 66% (n=519). MOM AI (30 Apr 2026; 2,560 firms): 71.5% yet to adopt; 3.8% integrate AI into core processes. IMDA 2025: SME AI 14.5% (from 4.2%). Permission to stay practical: one trusted billable-pack handoff beats a PSA migration sold as readiness.

The named subcon / project billing handoff runbook

Print this. Write real names in the blanks. No owner on a step means you do not have a process yet.

Trigger

  • Hours (or a milestone pack) ready for client billing: Hours approved / milestone Complete for a job, period, or WBS — from the timesheet / OT tracker, a milestone form, or `billing@…` that writes one BillPackID.
  • Also: PM returns for missing billable reason; finance flags “ready to invoice?” before AR cut; ops flags duplicate milestone or over-scope vs SOW.
  • Rule: one intake path. “Telegram screenshot / invent INV from hours tab / second PM bills same milestone from WhatsApp” births wrong hours and ghost invoices.

Extract

  • Fields: client, job / WBS / milestone ID, period, staff or subcon line, hours approved (payroll), billable hours candidate, rate / fee if used, non-billable flag, OT-client-agreed?, exception tier, SOW / PO / timesheet link.
  • File to company Drive/SharePoint: `YYYY-MM-DD_client_job_BILLPACK`.
  • Flag: missing job ID, no billable split, OT with no client agreement, over-scope vs SOW, duplicate period / milestone, milestone Complete with no deliverable link, subcon line with no client PO / rate card.
  • Do not DIY “AI decides what the client owes” or invent GST from a photo. Flag; a named human judges the pack.

Route

  • Clean billable lines (within rate card / SOW band, no OT dispute, no duplicate) → named PM / ops queue with one-line summary + file link.
  • Exceptions → reason codes: NON_BILLABLE, OT_NOT_AGREED, OVER_SCOPE, DUPLICATE_MILESTONE, MISSING_JOB, NEEDS_INFO, HOLD_BILL.
  • Missing info → fixed reason code back to submitter / site lead — not “pls redo.”
  • Hard exceptions: related-party / owner hours to client, first invoice on a new rate card, milestone with no signed acceptance when policy requires it.

Human gate

  • Named PM or ops owner signs BILLABLE PACK (or HOLD BILL / reject / return). The Zap does not. A Telegram “bill pls” is not Pack signed.
  • Clean packs still need that tap for year one — write what “billable” means beside the Sheet (client-agreed hours / milestone only; payroll OT ≠ client billable unless written).
  • Finance issues the client invoice — separate handoff. Do not fold Pack signed and “raise INV in Xero” into one mute group. Finance receives Bill-ready packs only — human issue for year one.
  • Write-offs / credit / unbillable stay named (PM + finance, or director above a threshold). Automation may remind and escalate. It does not invent BILLABLE PACK, silent-raise client INV from timesheet rows, or collapse payroll OT into the client bill.

Tracker

  • Sheet, mailbox labels, or review screen the backup can open without the primary’s phone.
  • Columns: BillPackID, Client, JobID, PeriodOrMilestone, HoursApproved, BillableHours, Owner, Backup, SLADue, Exception, FileLink, PackSigned?, BillReady?, ClientInvIssued?, Notes.
  • Statuses: Hours ready / Needs info / Ready to pack / Exception / HOLD BILL / Pack signed / Bill ready / Client inv issued / On hold / Rejected / Duplicate / Written off (named sign only).

Worked example (one job, one Wednesday)

Job `ACME-04` week-ending 13 Sep shows Hours approved upstream — 44 hours, 4 OT on Thursday cutover (payable to staff on the timesheet / OT path). Workflow opens BillPack-19, flags OT_NOT_AGREED vs the signed SOW (client agreed T&M base hours only), status → HOLD BILL. PM Priya is on MC. Backup Wei opens the same queue — not Priya’s personal Telegram — same SLA before Friday’s AR cut. Wei marks 4 OT NON_BILLABLE, signs BILLABLE PACK for 40 hours under written backup limits (routine T&M yes; new rate / first milestone / related-party still need primary or director). Friday: finance issues client INV-2201 for 40 hours from Bill-ready only — human issue. Nobody treated “bill pls” as pack authority. Nobody auto-invoiced 44 because Hours approved said “ok.” Nobody collapsed payroll OT into the client bill.

That shape — trigger, extract, route, human gate, tracker — is what you buy as a service. If a partner cannot walk it in those five words, they are selling a stack.

Who signs the billable pack vs who issues the client invoice vs who owns write-offs

Write the names before anyone mentions models or Zaps.

  • Named PM / ops (BILLABLE PACK): opens Ready to pack / Needs info / Exception / HOLD BILL; taps Pack signed or return within SLA. Owns which lines are client-billable this cycle.
  • Finance / AR (client invoice): receives Bill-ready handoff; issues client INV in the ledger; does not invent lines from Telegram or the full hours tab. GST / InvoiceNow client-side stay on your ledger path — not this DIY.
  • Write-off / unbillable owner (PM + finance, or director above threshold — write which): owns NON_BILLABLE, over-scope waive, credit after wrong INV.
  • Site lead / subcon coordinator (optional): submits or validates field / subcon lines — not silent group consent to bill.
  • Automation: labels, files, flags, pings, escalates. Does not sign the pack, issue the client INV, or collapse OT payroll into billable.
  • “Ops group”: not a signer. Five people who “usually look” is how double-bills and OT-on-the-client-invoice become habit.

Segregation matters: the person who chased the missing job ID should not also be the only person who signs BILLABLE PACK and raises the client INV with no log. Tiny firms can dual-role — write the dual role, the backup, and the threshold for a second pair of eyes.

Leave cover lightly: when the pack signer is on MC, fill the leave-cover blanks — named backup, SLA before AR cut, queue not in the primary’s phone, one escalation then stop, backup limits written (routine T&M yes; new rate / first milestone / related-party / write-off need primary or director).

Trail: timesheet / OT approve → billable pack → client invoice

One hours-to-cash trail. Several chapters. This chapter is the client billing pack, not a collapse into one mute Telegram.

1. Hours / OT gate (upstream)timesheet / OT approval. Do not rehash Approve hours, OT into payroll, or CPF here. Payroll-ready ≠ client-billable.

2. Billable pack (this chapter) — hours/milestone ready → extract → route → BILLABLE PACK / HOLD BILL → Bill-ready.

3. Client invoice (AR handoff) — finance issues INV from Bill-ready packs only. If the loud problem is *supplier* AP tap pay, open invoice workflow — that page is AP; this page ends at the client-invoice handoff.

4. Wider frameworkflow automation services.

Optional adjacency (once): leave cover when the pack signer is away; expense claims when staff cash on the job is separate; sales-order fulfilment when the stall is pick/ship — do not twin. Cost-side three-way only if subcon labour on PO disagrees with GRN — three-way match on AP, not this pack.

Tight trail rules: every BillPackID carries JobID + period/milestone + Hours approved ref (or a reason code); Hours approved ≠ Pack signed; Pack signed ≠ Client inv issued; HOLD BILL blocks finance until a named PM releases; payroll OT and client-billable hours stay separate columns; “bill pls” and “invoice everything approved” are both failures.

Hours not signed yet → timesheet / OT first. Supplier PDF waiting to pay → invoice workflow. Hours signed, wrong client INV / OT on the bill / double milestone → you are here.

Sheets, Gmail/Drive, and Telegram vs dumping a new PSA suite

Most Singapore SMEs already have an inbox, a Sheet, a chat app, Drive, and a ledger. The failure mode is not “we lack project billing software.” It is “nobody can see which pack is waiting, whether billable was signed, who must HOLD BILL, and whether finance may issue.”

Stay on Sheets + Gmail/Drive + Telegram when: tens to low hundreds of packs a month; one PM can clear before AR cut; exceptions are the hard part; you can name primary/backup today; BILLABLE PACK and client INV stay human-gated; Bill-ready stays an explicit handoff.

Consider a PSA / project-billing layer when a consult shows Sheets cannot carry it — multi-entity rate cards at volume, productised audit trail, or WIP your Sheet cannot hold. Prefer a queue that feeds the ledger you trust over a rip-and-replace.

Partner vs dump. A partner maps your live path, builds the smallest true runbook, trains owners, stays reachable on leave week. A dump sells seats and leaves Telegram as the billing desk. Same discipline as timesheet / OT and invoice workflow. Platform tour first and process map “phase two” means you are buying a dump.

Steal-this-build DIY (stops before judgement)

Same shape in Zapier, Make, or n8n. Gmail + Sheets + Drive + Telegram is enough to start. These builds sort, file, flag, ping, and escalate. They do not auto-sign BILLABLE PACK, silent-raise a client INV from timesheet rows, collapse payroll OT into client-billable hours, or paste job Sheets into ChatGPT to “decide” what the client owes.

Do not DIY rate engines, GST on client INV, or InvoiceNow here. Flag NON_BILLABLE / OT_NOT_AGREED / DUPLICATE. Leave judgement and invoice authority for named humans.

Build 1. Bill-pack intake labels (Gmail filters, S$0)

What it does / does not: Labels `bp-new`, `bp-needs-info`, `bp-hold-bill`, `bp-bill-ready`. Does not mark Pack signed or issue client INV.

1. Create the four labels.

2. Filters on `to:billing@` / subject keywords for bill pack, hold bill, bill ready, needs info.

3. Test one clean T&M pack, one “OT not agreed,” one bill-ready note.

Where it breaks: Telegram-only “bill pls” with no form or `billing@`. Chat is not intake.

Build 2. Bill packs land in company Drive

What it does / does not: Copy attachments into `Inbox-billpacks-2026` shared with backup. Does not OCR hours into a client INV.

1. Folder: `Inbox-billpacks-2026` (or per-job `YYYY-MM-DD_client_job`).

2. Zap: Gmail New Attachment on `bp-new` / `bp-hold-bill` → Drive Upload File.

3. Test one redacted pack; backup opens without the primary’s account. Share with owner + backup + finance for Bill-ready only.

Where it breaks: personal Drive; rate cards only in phone Photos.

Build 3. Sheet queue + reminder pings

What it does / does not: Every live bill pack has a row. Owner/backup get a ping near SLA / before AR cut. Does not tap Pack signed or issue INV.

Columns, row 1:

`BillPackID | Client | JobID | PeriodOrMilestone | HoursApproved | BillableHours | Owner | Backup | SLADue | Status | Exception | FileLink | PackSigned | BillReady | Notes`

Locked Status list. Real date cells. Hours as numbers. Keep HoursApproved and BillableHours separate — the anti-collapse rule in Sheet form.

Zap shape: morning schedule (Asia/Singapore) → Status in `Needs info` / `Ready to pack` / `Exception` / `HOLD BILL` with SLADue today or earlier (or ARCut − 1 day) → Telegram/Gmail to Owner with ID, client, job, HoursApproved, BillableHours, Status, SLA, Exception, FileLink.

Do not mark `Pack signed`, `Bill ready`, or `Client inv issued` because time passed. Lock Status — free-text (“chasing”) breaks it.

Build 4. Backup escalate once (then stop)

What it does / does not: Owner misses SLA → ping Backup once; optional Director once; then silence. Does not auto-sign the pack or raise client INV because Backup was mentioned.

Zap shape: Delay Until SLADue + 4 business hours (or next 09:00 SGT / ARCut − 4h) → still waiting → Backup once → optional Director → stop. No hourly nag loops.

Where these four stop

They change a shared inbox and a Sheet. They do not replace judgement. Stop when the next sentence is: decide if OT is “client enough,” auto-invoice under a threshold, silent-raise INV from every Hours approved row, collapse payroll OT into BillableHours, or treat OOO as consent to bill. That is the service. The sorter and the ping are not.

Failure modes worth designing against

Speed is not the same as control. Billing automation that only notifies can accelerate a wrong client INV.

Silent auto-invoice from timesheet rows. “If Hours approved and no reply in 48 hours, raise INV” — or “Telegram said bill pls so finance issued” — is how wrong hours leave without a human gate. Escalation pings a backup; it does not invent BILLABLE PACK.

Collapsing OT payroll into the client bill. Staff OT can be payable on the timesheet / OT path and still NON_BILLABLE to the client. Keep HoursApproved and BillableHours separate; OT_NOT_AGREED → HOLD BILL until a named PM clears it.

Group chat as system of record. Five people saw the screenshot. Nobody owned the BillPackID. A thumbs-up is not Pack signed. Audit answer is a name and timestamp — not “it was in the ops group.”

No backup. Primary on MC, queue in their phone, SLA “when they’re back,” finance still cuts Friday. Hope is not a process — someone will invoice from the full hours tab.

Double-bill / duplicate milestone. Same job period billed twice from two screenshots, or milestone Complete flipped twice. Near-duplicate on Client + JobID + PeriodOrMilestone before finance issue.

Policy-in-someone’s-head. Billable bands that change by “who was on the call.” Write SOW / rate-card rules beside the tracker. Automation flags OVER_SCOPE; a named human still decides — including the backup.

Wrong-chapter collapse. Rehashing Approve hours / OT into payroll here, or treating this as supplier AP. Link timesheet / OT and invoice workflow; keep this chapter on the client bill pack.

Scope creep. Billable pack → client invoice only. Visitor induction stays parked. Full PSA / WIP theatre stays parked. Three-way only if the *supplier* cost side is loud — link, do not twin.

Hard stops: no silent auto-invoice from timesheet rows, no collapsing OT payroll into client bill, no auto-sign because time passed or OOO, one escalation then stop, human pack gate, finance still issues INV, backup limits written, packs in company tenancy.

Consult → build → train (lightly)

You do not need a 40-slide methodology. Three honest phases:

Consult. Map one live hours-ready / milestone → extract → BILLABLE PACK → Bill-ready → client INV handoff. Count volume, OT-not-agreed frequency, who signs, who issues INV, leave cover, AR cut. Leave with a yes/no and a scoped runbook — not a PSA in search of a problem.

Build. One workflow in tools you already use. Parallel-run beside Telegram. Pack signed and Client inv issued stay behind named taps; Bill-ready stays an explicit handoff. HoursApproved and BillableHours stay separate from day one.

Train. Owners and backups explain every exception without the builder on the call. Smoke-test: primary offline; backup clears three real packs alone under written limits before AR cut. Expand after trust — leave cover as overlay, timesheet / OT if upstream hours are broken, expense claims if staff cash is louder. Stay off full PSA theatre.

That is partner work. It is not “we build AI agents” as a homepage line. The product is a runbook that still works when the PM is on MC — and the client INV still has a named billable pack before Friday.

Practical checklists

This week (no new software)

  • Draw trigger → extract → route → human gate → tracker for BILLABLE PACK and Bill-ready → client INV.
  • Write primary/backup, SLA before AR cut, billable vs non-billable / OT-client-agreed rules, backup limits.
  • One shared intake (`billing@` or form); company Drive + one-tab Sheet shared with backup.
  • Separate columns: HoursApproved vs BillableHours — no collapse.
  • Rule: no silent auto-invoice from timesheet rows; no OT payroll → client bill without a named yes.
  • Mark three recent painful invoices with the exception reason each would have carried.
  • Fill leave-cover blanks for this gate once.

Before you buy anything

  • Can they walk *your* billable-pack → client-invoice runbook without a product slide?
  • Where do packs live, and who opens BILLABLE PACK / HOLD BILL on leave week?
  • What is never auto-marked Pack signed and never silent-raised as client INV?
  • How are OT_NOT_AGREED, OVER_SCOPE, and DUPLICATE_MILESTONE held?
  • Gmail/Sheets/Drive first — or a new PSA suite? Who trains the backup?
  • First conversation: your queue — not a funding tour.

Red flags in a demo

  • “Touchless invoice from timesheets” / auto-bill every Hours approved row with no exception taxonomy.
  • No named pack signer; leave cover as a later toggle; group chat as system of record.
  • Silent client INV in week one; “AI decides what is billable” without a human gate.
  • One column collapsing payroll OT into client-billable hours.
  • DIY that pastes client job Sheets into a public model; confuses this with timesheet/OT payroll or supplier AP.
  • Parallel-run / smoke-test discouraged because it “slows go-live.”

Soft next step

If “bill the client” stalls in Telegram when the PM is on MC, or client invoices leave with the wrong hours / OT / milestone — bring one real week of that queue to a free consult. We will map the runbook, name who signs the billable pack and who issues the client invoice, keep Hours approved separate from BillableHours, and say whether Sheets and Drive can carry it. No platform tour first. No invented case-study numbers.

Book a free consult

Sources