DeskFerry Logo

Bill the week without rebuilding it in a spreadsheet

Approved hours come out of the time system priced at the charge rate on that assignment, split across the right PO and cost centre, and land as draft invoices. What doesn't reconcile is held back with a reason rather than rounded into the total.

Week ending 7 Aug — ready to raise

4 clients · 1 held

Billable this run

£61,480

  • PO-44817

    Wexley Group

    £28,14012 contractors · ready
  • PO-9902

    Calder Rail

    £19,7608 contractors · ready
  • PO-3311

    Northgate Logistics

    £13,5806 contractors · ready
  • no PO

    Ellery Partners

    £4,2202 contractors · held

Ellery's PO ran out on Friday. Raise that invoice without one and it sits in their AP system for six weeks before anybody tells you why.

Works with

  • Harvest
  • Clockify
  • Xero
  • QuickBooks
  • Google Sheets
  • Gmail

It takes approved hours from the time system and drafts into Xero or QuickBooks. Neither accounting package publishes triggers, so the run happens on a schedule you choose — typically the morning after your approval deadline, which is when the numbers are finally stable.

The chore

How this goes right now

  1. The hours are in. Now somebody has to turn them into money, and that means opening the time export next to the rate card next to last month's invoices, and building it back up line by line. Twenty-eight contractors across four clients, each on their own charge rate, several of which changed at the last extension and only one of which got written down anywhere findable.

  2. Then the client-specific rules start. Wexley wants one invoice per cost centre, so their twelve contractors become three invoices. Calder Rail wants a single consolidated line but insists the PO number appears in the reference field, not the description, because their AP system reads it from there. Northgate needs the contractor's name on each line or their manager won't sign it off. None of this is written down as a process. It lives with whoever has done it longest.

  3. It takes a day, near enough, and the mistakes it produces are the expensive kind — quiet ones. An invoice raised at last quarter's rate isn't wrong enough for anyone to query, so it gets paid, and you've given away margin you'll never notice went. A missing PO doesn't bounce; it just sits in accounts payable until you chase it six weeks later and discover it was never going to be paid.

The difference

Same invoices, assembled from the record instead of from memory

The judgement stays with you. The rebuilding — rate lookup, PO matching, cost-centre splitting — stops being done by hand at the end of a long week.

Building invoices by hand
Assembled from the placement record
Most of a day, monthly or weekly, at the least forgiving moment
Draft invoices waiting in your accounting system, priced and split
Rate cards that live in three places and disagree in two of them
One rate per assignment, taken from the record that agreed it
Client formatting rules held in one person's head
Per-client formatting applied because it was set once, not remembered
Rate changes from an extension applied a cycle late, or never
Extensions and rate changes picked up from the date they took effect
Missing POs discovered by the client, six weeks after the fact
Anything without a valid PO held back before it's raised, not after

Try it

Walk through it yourself

This is the actual shape of the workflow — the same trigger, the same steps, the same draft waiting for your say-so. Click through it.

Invoice from approved timesheets

Scheduled checkHarvest

Billing run, Tuesday 09:00

Runs after your approval deadline has passed, on a schedule you set. It only ever picks up hours that are marked approved — unapproved time is left where it is and reported separately, because billing for hours a client hasn't signed off is how a relationship goes wrong.

What it does

  1. Pull approved hours only, for the period being billed

    1,946 approved hours across 28 contractors and 4 clients. 74 hours submitted but unapproved — excluded from this run and listed separately.

    Harvest
  2. Price each line from the assignment record

    Charge rate matched per contractor per assignment. Two rates changed mid-period at extension — hours before and after 1 Aug priced separately rather than averaged.

    Google Sheets
  3. Apply each client's billing shape and check the PO

    Wexley split into 3 invoices by cost centre. Calder consolidated with the PO in the reference field. Ellery held — their PO covered 400 hours and 438 were worked.

    Google Sheets
  4. Create the drafts and leave them unsent

    6 draft invoices created totalling £61,480. Nothing approved, nothing emailed. The Ellery lines exist as a draft too, marked held with the reason on it.

    Xero

Draft comparison — nothing has been sent

Draft invoices — week ending 7 Aug
ClientReferenceHoursValueStatus
Wexley Group — PlatformPO-44817 / CC-100412£12,360Draft ready
Wexley Group — DataPO-44817 / CC-140368£10,304Draft ready
Wexley Group — InfraPO-44817 / CC-155184£5,476Draft ready
Calder RailPO-9902622£19,760Draft ready
Northgate LogisticsPO-3311398£13,580Draft ready
Ellery PartnersPO expired438£4,220Held — PO exceeded

Ellery's purchase order covered 400 hours and 438 were worked and approved. Raising this now creates a query, not a payment. The draft exists so you can send it the moment the PO is extended — but it won't go out on its own.

Approve the 5 ready invoices and leave Ellery held?

They're ordinary draft invoices in your own accounting system — edit a line, change a reference, split one further, or delete it entirely. Approving here only marks them ready for you to raise. It does not send anything to a client.

Once you approveXero

Six drafts in your ledger, none of them sent

They sit in Xero exactly as if someone had typed them, ready for whoever normally raises invoices to check and issue. The held one carries its reason, so the next person to look at it knows why without asking. A short summary goes to you with the billed total, the excluded hours and the one query that needs a human.

Drafts, not sends.

Everything lands in your accounting system as a draft. Raising it and sending it is still a decision somebody makes.

Start free

How it works

What it's actually doing

Assembly, not judgement. Every number traces to something you already agreed — an approved hour, a rate on an assignment, a PO on a client record.

  1. 1
    • HaHarvest
    • ClClockify

    Takes approved hours and nothing else

    Unapproved time is reported, never billed. If a client hasn't signed it off, it doesn't reach an invoice, and you get told how much is sitting there.

  2. 2
    • Google Sheets
    • ExExcel

    Prices from the assignment, not a spreadsheet copy

    The rate that applies is the one recorded against that assignment on that date. A mid-period change splits the line rather than averaging it away.

  3. 3
    • Google Sheets

    Applies each client's billing shape

    Split by cost centre, consolidated, one line per contractor, PO in the reference field. Set once per client, applied every cycle without anyone remembering it.

  4. 4
    • Xero
    • QuickBooks
    • Gmail

    Drafts into your ledger and holds what doesn't reconcile

    Drafts in Xero or QuickBooks, never sent. Anything missing a valid PO or exceeding one is held with the reason attached rather than raised hopefully.

You stay in control

It drafts invoices. It never sends one, and it never invents a number.

This is the task on the desk where an error is measured in cash and in client trust at the same time. So it holds the narrowest permission that lets it be useful: it can create a draft, and that is all. Raising, sending, crediting and chasing all stay with the person who does them today.

  1. Step one

    It drafts

  2. Step two — you

    You read it and approve

  3. Step three

    Only then does it send

Nothing is issued to a client

Drafts only. It has no ability to email an invoice or mark one as sent, and no setting turns that on. What reaches a client is what a person chose to raise.

No hour is billed without an approval behind it

Submitted-but-unapproved hours are excluded from every run and reported separately. Billing for time a client hasn't agreed to is the fastest way to lose an account.

It won't guess a rate

If an assignment has no recorded charge rate, or two records disagree, that line is held and surfaced. It will not pick the likelier of two numbers, because the likelier number is still a made-up one.

Held is a real state, not a warning you can scroll past

A missing or exceeded PO stops the line. The draft still gets built so it's ready the moment the PO is sorted, but it carries the reason and it doesn't quietly join the approved pile.

Setup

What setting this up involves

  1. 1

    Connect

    • Harvest or Clockify — wherever approved hours live
    • Xero or QuickBooks, where the drafts get created
    • Google Sheets or Excel, holding assignment rates and PO references
    • Gmail or Outlook, for the run summary
  2. 2

    Tell it how you work

    • Your charge rate per assignment, and the date any change took effect
    • How each client wants to be invoiced — split, consolidated, one line per contractor
    • Where each client needs the PO to appear, because their AP system is fussy about it
    • Which nominal codes and tax rates apply, so the drafts land coded correctly
    • What should hold a line rather than raise it — expired PO, missing rate, hours over the cap
  3. 3

    Then it runs

    About an hour, once

    Longer than the other tasks on this desk, because it's the one where the setup is the value. Most of the hour is writing down billing rules that currently live in one person's head — which is worth doing regardless of whether you automate anything.

Edge cases

Where it's careful, and what it won't do

What it handles

  • A rate that changed mid-period

    Hours either side of the effective date are priced separately and shown as two lines. Averaging the week would be tidier and would also quietly cost you the difference.

  • A purchase order that runs out mid-cycle

    Hours up to the PO limit are billable and the overage is held. You get both numbers, so the conversation with the client is about 38 hours rather than about the whole invoice.

  • One client, several cost centres

    Twelve contractors become three invoices split the way that client's finance team requires, with each contractor mapped to their centre from the assignment record.

  • Expenses and per-diems sitting alongside hours

    Picked up where they're recorded against the assignment, kept as separate lines, and never rolled into the hourly total where a client can't see what they paid for.

What it does not do

  • Send an invoice

    It creates drafts in your ledger. Issuing them is a person's decision, made in the accounting system they already use.

  • Bill unapproved hours

    Approval is the precondition, not a nice-to-have. Unapproved time is excluded and listed so you can chase it, which is a different job entirely.

  • Raise credit notes or handle disputes

    When a client queries an invoice, that's a negotiation. It has no part in it and doesn't attempt to adjust or reissue anything on its own.

  • Calculate what the contractor gets paid

    This is the client-facing side only. Pay, margin, umbrella deductions and tax stay with your payroll provider, where the liability sits.

Time back

A day a cycle, and the margin you were quietly losing

Time back
~1 day a cycle
Spent on
Selling, not reconciling
What it costs
$49 / monthGrowthplan — see what’s included

How that’s worked out: Based on a desk billing 25–35 contractors across four or five clients, where building the invoice run by hand reliably takes six to eight hours. The harder number to put a figure on is the second one: an assignment billed at a superseded rate for two cycles is margin gone that nobody ever notices, because a slightly-low invoice never gets queried.

Fair questions

The questions finance asks first

Our billing rules are genuinely complicated. Can it really handle ours?

Some of them, and it's worth knowing which upfront. Splits by cost centre, consolidation, per-contractor lines, PO placement, separate expense lines and mid-period rate changes are all handled because they're structural. What it won't handle is a rule that requires judgement — a client you discount when the month has been difficult, or a line you present differently because of a conversation last week. Those it holds for you rather than guessing at, and if most of your run is judgement calls, this will save you less than it saves a more standardised desk.

What stops it billing something wrong and us not noticing?

Three things, in order. It bills only approved hours, so a client has already agreed the time existed. It refuses to guess a missing or contradictory rate, holding the line instead. And nothing it produces is ever issued — every invoice is a draft that a person opens, checks and raises. The failure mode available to it is a draft you delete, not an invoice a client receives.

We already use our accounting system's own timesheet-to-invoice feature.

Then you may not need this, and that's a reasonable place to land. Those features work well when the hours are recorded in the same system that does the billing. The reason contract desks end up doing it by hand is that the hours are in the client's tracker or a standalone one, the rates are in a placement sheet, and the PO is in an email — and nothing joins them up. If your data already sits in one system, use the feature you're paying for.

FAQ

Questions worth answering properly

Does it actually send invoices to clients?

No. It creates drafts in Xero or QuickBooks and stops. Raising and issuing stays a human action in your own accounting system — partly because that's where the accountability sits, and partly because an invoice arriving at a client is a moment you want a person to have chosen.

Where do the charge rates come from?

From your assignment record — the sheet or system where you note what each placement is billed at and from when. It never carries a rate forward from a previous invoice, because that's how a superseded rate survives three cycles. If a rate is missing or two records disagree, the line is held rather than priced.

What happens if a purchase order is exceeded?

The hours within the PO are treated as billable and the overage is held, with both figures shown. That turns an awkward conversation about a rejected invoice into a specific one about the hours beyond the cap, which is a much easier email to write.

Can it invoice hours that haven't been approved yet?

It won't. Approved hours are the only input to a billing run. Anything submitted but not signed off is excluded and reported separately so you can chase the approver — a separate task, and one worth keeping separate.

Does it work out contractor pay and margin as well?

No. This covers the client-facing invoice only. What the contractor is paid, what comes off for umbrella or PAYE and what margin remains are your payroll provider's territory, and duplicating those calculations here would only create a second set of numbers to reconcile.

What if a client wants their invoices formatted a particular way?

That's the normal case, and it's set once per client — how to split, whether to consolidate, whether contractor names appear on lines, and where the PO reference has to sit for their AP system to read it. After that it applies every cycle without anyone needing to remember which client is which.

Bill the week in the time it takes to read it

Connect your time system and your ledger, and tell it how each client wants invoicing. The next run drafts itself and waits for you.

Start free