Invoicing Manual
Treantly

Invoicing Manual

Generating, sending, and tracking client invoices — for Accounting
Covers: Client Billing Setup · Generate · Send · Void · Track Payments · Client Balances · Export to QuickBooks

From Payroll to a Client Invoice

flowchart TD
    A["Payroll finalized
for a pay period"] --> B["Set up each employee's
Client Rate or Billing Type
(one-time, on the Salary form)"]
    B --> C["Invoices page:
pick Client + Month + Year"]
    C --> D["Preview
line items pulled from payroll"]
    D --> E{"Looks right?"}
    E -- No --> F["Fix rates or wait for
the missing period to finalize"]
    F --> C
    E -- Yes --> G["Type Invoice Number,
Date, Due Date -> Generate"]
    G --> H["Send to client
(billing_emails)"]
    H --> I{"Mistake found later?"}
    I -- Yes --> J["Void
(number stays reserved)"]
    I -- No --> K["Done"]
    

1Getting Started

Invoices live under Accounting → Invoices in the sidebar. An invoice always covers one client for one calendar month — it combines both of that month's semi-monthly pay periods (1st–15th and 16th–end) into a single bill, matching how clients are actually billed.

💡

An invoice can only include pay periods that have already been finalized in Payroll. If a period hasn't been finalized yet, its hours simply won't appear — nothing guesses or estimates on your behalf.

A stat-card row sits above the Invoices / Client Balances tabs, always reflecting every non-voided invoice across every client — not scoped to whatever Month/Year filter is currently selected below it.

Total Invoices, Total Invoiced, Total Paid, and Outstanding — global totals, always visible.

2Setting Up Client Billing

Before generating an invoice, make sure each employee's Salary record (on their Employee form) has the right Billing selected. This one dropdown decides how their worked hours get priced on the invoice — separately from what they're actually paid — and the field next to it changes meaning depending on what you pick.

BillingHow the invoice line is priced
Hour / Day / Week / Month / Quarter / Year
Default: Hour
Hours × Client Rate — a rate you set separately from the employee's own pay rate (VA Rate), so it can include your margin. Billed at whichever frequency you picked.
VA Rate + Flat Fee Hours × VA Rate (the employee's own pay rate, no markup) plus a flat fee amount added once per invoice — for clients on a cost-plus arrangement instead of a per-hour markup.
💡

Right next to Client Rate is Client Currency — the currency the invoice gets billed in. It's independent of the employee's own Staff Currency, since a client can be billed in a different currency than the one the employee is actually paid in. Whatever's selected there is what shows on the generated invoice — check it's right before generating, especially for any client billed outside USD.

Employee form Salary and Bank Details section showing Client Rate, Billing set to Hour, VA Rate, Currency, Frequency, and Effective Date
Client Rate (markup): the field is labeled "Client Rate," and Billing shows the frequency it's charged at.

Switch Billing to VA Rate + Flat Fee and the same field relabels itself to Flat Fee (per invoice) — it's one field serving two purposes, not two separate fields:

Same Salary and Bank Details section after switching Billing to VA Rate + Flat Fee, showing the same field now labeled Flat Fee (per invoice)
VA Rate + Flat Fee: the same field now means the flat fee amount, not a client rate.
⚠️

Because it's the same underlying field, whatever number was there before stays there when you switch — it doesn't clear itself. If you switch an employee to VA Rate + Flat Fee, double-check the number in that field is actually the flat fee you want, not their old hourly rate left over from markup billing.

💡

On-call pay and the on-call stipend are always billed at cost — the same amount the employee was actually paid — regardless of which Billing option is selected. Only the regular worked-hours line changes.

3Generating an Invoice

  1. 1Open Accounting → Invoices.
  2. 2Type the client's name in the Client box, and pick the Month and Year.
  3. 3Leave Bill For on Full Month unless you specifically need just one pay period (see the callout below).
  4. 4Click Preview.
Type the client's name — it resolves once it matches an exact client on file.
⚠️

Client is a type-ahead search, not a dropdown — you have to click an exact match from the suggestion list to actually select one. Typing a name that shows up in the box but was never clicked leaves no client selected: Preview and Generate Invoice stay disabled, and a small warning appears under the field — "No client selected — pick one from the list, typing alone doesn't select it." If Preview won't enable and everything else looks filled in, this is almost always why.

Preview builds a full line-item breakdown straight from that client's already-finalized payroll — nothing is recalculated from scratch, so an invoice can never disagree with what an employee was actually paid. Each employee gets one line for worked hours, plus a separate line for on-call pay, the on-call stipend, or a manual adjustment, if any of those apply that period (see Manual Adjustments on Invoices below).

Preview — every line traces back to a specific employee, period, and payroll figure.

Manual Adjustments on Invoices

A manual Payroll Adjustment entered for an employee — a one-off bonus, a reimbursement, or anything else added by hand rather than computed from the timesheet — can flow through to the client's invoice too, not just that employee's own pay. It only does this when the adjustment is not a deduction: a non-deduction adjustment is an extra cost Treantly covered on the client's behalf (e.g. a "Performance bonus" or "Travel reimbursement"), so it's billed to the client at cost — the same amount paid out, no markup added. A deduction-type adjustment never appears on an invoice, since it reduces what the employee was paid rather than adding an extra expense for the client to cover.

💡

When it applies, the adjustment shows up as its own line item for that employee, right after their worked hours line (and after any on-call pay or stipend lines for that same employee) — labeled with whatever description was typed into the adjustment itself, such as "Performance bonus," rather than a generic "adjustment" label.

⚠️

An adjustment only reaches an invoice for a period that's already finalized — it's pulled from that period's locked payroll figures, same as every other line item, so an adjustment added after a period is finalized won't retroactively appear until payroll for that period is recomputed.

Just below that row, an Invoice Number field, an Invoice Date, a Due Date, and a Generate Invoice button are always there too — Generate Invoice just stays disabled (with a reminder underneath explaining why) until Preview has actually returned something to bill.

💡

Invoice Number is one global sequence, shared by every client — not a separate count per client. The field is always a plain, editable input, pre-filled live with the next number in that shared sequence (the highest invoice number on file, plus one), no matter which client is currently selected. You can still type over the suggestion by hand if you genuinely need to — it's a starting suggestion, not a lock.

⚠️

Invoice numbers are unique across every client, enforced at the database level — Generate is rejected outright if that exact number has already been used by anyone, not just the client you're currently invoicing. This is deliberate: these numbers get imported into QuickBooks Online, which never reuses a number across customers either, so this system doesn't either.

Generating for Every Client at Once

Next to Preview, a Generate All Clients — [Month Year] button runs the same generation logic across every client at once, for whichever Month, Year, and Bill For period is currently selected — no need to search for and generate clients one at a time. It automatically skips anyone whose payroll isn't finalized yet, who has nothing to bill for that period, or who's already been invoiced for it.

  1. 1Click Generate All Clients — [Month Year].
  2. 2Confirm or edit the pre-filled Starting Invoice Number, plus an Invoice Date and Due Date shared by every invoice this run creates.
  3. 3Click Generate All. Each client actually invoiced gets the next number in the same global sequence described above — the first client billed gets the starting number, the next gets it plus one, and so on.

A results screen then lists exactly what happened:

ResultMeaning
Created Client, the invoice number it received, and its total — one row per invoice actually generated.
Skipped Client and a reason — e.g. "nothing to bill for this client/period" or that this client was already invoiced for it.
💡

This coexists with generating one client at a time above — it doesn't replace it. Reach for the single-client flow instead when you need to review a breakdown before committing (Preview first), or to split one client's 1st–15th and 16th–end into two separate invoices, such as when their engagement ends mid-month.

Fixing a Wrong Starting Number

If Starting Invoice Number was wrong when a batch got generated — a typo, or someone else generated a batch in between so the pre-filled suggestion was already stale — the whole run comes out with a run of wrong, already-saved numbers. On the Invoices tab, check the box next to each wrong invoice (the same checkboxes used for Export to QuickBooks), then click Renumber Selected.

  1. 1Check the box for every invoice that needs correcting.
  2. 2Click Renumber Selected (the button shows how many are checked).
  3. 3Enter the correct starting number and confirm. Every selected invoice keeps its position relative to the others (by current number, not the order you checked them in) and gets reassigned a new consecutive run from there.
Two invoices checked — Renumber Selected (2) and Export to QuickBooks (2) both update live with the count.
Renumber 2 Invoice(s) — enter the corrected starting number and confirm.
⚠️

An invoice already sent to the client, or already exported to QuickBooks, can never be renumbered — by then the number is a real external reference (on a PDF the client has, or a QuickBooks record), not an internal draft detail. Selecting one blocks the whole action outright and lists which invoice(s) need to be deselected first — there's no "renumber anyway" override, unlike re-exporting to QuickBooks above.

💡

If the new starting number would land on a number another (unselected) invoice already has, the whole action is rejected and names the conflicting number — nothing is changed. Pick a different starting number and try again.

⚠️

Generate Invoice recomputes the breakdown at that exact moment rather than reusing the Preview — if payroll changes between previewing and generating (a late correction, for example), re-run Preview first so what you're about to save matches what you last reviewed.

💡

An invoice doesn't need the whole month finalized first. Left on Full Month, Preview/Generate automatically uses whichever periods are finalized and tells you if one was skipped — e.g. "16-end of 2/2026 is not finalized yet — excluded from this invoice." To close out just one period on purpose (rather than waiting), set Bill For to 1st–15th only or 16th–end only instead — useful for a final partial period when an engagement is ending, so that period's invoice can go out immediately instead of trickling into next month's. Either way, a follow-up invoice automatically leaves out whatever a prior one already billed — so this can never bill the client twice for the same period's work. Note that a cost-plus-fee employee's flat fee bills once per period, not once a month — if both halves of the month are invoiced, the flat fee appears on each one.

✋

If the selected client's engagement has already ended, Preview shows a warning — "This client's engagement ended on [date] — confirm this invoice covers everything through that date before sending." This exists because of a real dispute: a client's final charges were split across two invoices without anyone flagging it, so a second invoice arrived the following month after the client already considered the account closed, and they refused to pay it. When this warning appears, use Bill For to check both periods individually if needed, and make sure everything through the end date goes out as one invoice — not one now and a surprise one later.

If a non-voided invoice already exists for that exact client and month, Generate Invoice stops and asks first instead of silently billing the client twice for the same work:

Invoice Already Exists for This Period dialog, showing the existing invoice number and total, with Cancel and Generate Anyway buttons
This only blocks by accident — if a supplemental invoice for the same period is genuinely intended, "Generate Anyway" still lets it through.

The Generated Invoices list below the form paginates once a client/month combination has more than a page's worth of invoices — a page-size selector and page numbers appear automatically when needed.

4Sending an Invoice

Every generated invoice appears in the list below the form, with View, Download, Send, and Void actions. View/Download produce the actual PDF — letterhead, itemized breakdown, and payment instructions, same as what the client receives.

Click Send to open a confirmation with the invoice's client, period, and balance due, plus an editable Send to field — pre-filled from the client's Billing Email(s) (set on the Client form; separate multiple addresses with commas).

Send confirmation — shown here re-sending an already-sent invoice, with a clear warning before it goes out again.
✋

Sending is a real email to the client — it can't be recalled. Double-check the Send to address before confirming, especially the first time you send to a new client.

Once sent, the invoice's Sent column shows the date — hover it to see exactly who it went to. The button then reads Resend instead of Send for that invoice going forward.

5Voiding an Invoice

Void marks an invoice as cancelled without deleting it — you'll be asked for an optional reason. The record, its line items, and its invoice number all stay exactly as they were; the row just greys out and its Status badge switches to Voided.

6Tracking Payments

Every invoice tracks how much of it has actually been paid, separately from whether it's been sent or voided. The Status column shows one of three color-coded badges: Unpaid, Partially Paid, or — based on how the amount paid compares to the invoice total. A Payment status filter above the list narrows it down to just one of these (plus Voided) when there are a lot of invoices to scan.

This is tracked as a running dollar amount, not by which specific pay period was paid — so if a client pays for only half of an invoice, it simply shows Partially Paid with a small "$X of $Y" line underneath, no matter which period that payment happened to cover.

💡

Payments are entered by hand — there's no bank or payment-processor integration. Whoever in Accounting confirms a wire, check, or transfer came in is the one who records it here.

  1. 1Find the invoice in the Generated Invoices list and click Record Payment (hidden once an invoice is already fully paid).
  2. 2Enter the Amount and Date Paid, plus an optional Reference (wire ref, check number) and Note.
  3. 3Click Record Payment to save it. The badge and running total update immediately.
⚠️

The amount can't exceed what's still owed — the field is capped at the current Balance Due, shown right above it in the same modal. This keeps an invoice from ever showing more paid than it was billed for.

Reopening Record Payment on an invoice that already has one or more payments shows a Payment History list underneath the form. Each entry has a Delete link, for correcting a payment logged by mistake — deleting one reduces the running total and can move the badge back from to Partially Paid, or from Partially Paid back to Unpaid.

💡

Voiding an invoice doesn't touch its payment status — voiding isn't a refund. A voided invoice keeps whatever Unpaid / Partially Paid / status it had; the row just also shows Voided and greys out.

7Client Balances

A second tab next to Invoices, labeled Client Balances, rolls payments up across a client's entire invoice history instead of one invoice at a time — useful for answering "who actually owes us money right now" without paging through every invoice by hand.

It shows one row per client:

ColumnWhat it shows
Employees How many currently-Hired employees this client has on file right now — not scoped to any period.
Total Invoiced The sum of every non-voided invoice ever generated for that client, across all periods.
Total Paid The sum of every payment recorded against those invoices.
Balance Total Invoiced minus Total Paid — what's still outstanding.
Last Invoice The most recent invoice date on file for that client — useful for spotting who hasn't been billed in a while.

A Client search filters by name or code, and a Status dropdown narrows the list to just Outstanding (a real balance) or Fully Paid. Both apply instantly to what's on screen — click any column header to sort, same as before; the sort order and filters work together rather than resetting each other.

Client Balances: name/status filters, the new Employees and Last Invoice columns, and Import Balances.

Rows sort by Balance, highest outstanding first, by default — click any column header to re-sort by that column instead (click again to reverse direction). When every client in the list happens to share one currency, a Total row also appears at the bottom summing all three columns; it's hidden the moment more than one currency is involved, rather than adding unlike currencies together.

⚠️

Voided invoices are excluded entirely from every figure on this tab — Total Invoiced, Total Paid, and Balance. A voided invoice never represented real money owed, so it's left out rather than netted against payments.

Each row has a View Invoices button that jumps straight to the Invoices tab, filtered to that client — but showing every invoice they've ever been sent, across every period, not just whatever Month/Year happens to be selected there. A blue banner appears above the list explaining this and offering a Back to [Month Year] button to return to normal period-filtered browsing — the same thing happens automatically the moment you change Month or Year by hand.

Importing a Payment Statement

The Import Balances button on this tab bulk-records real payments against a client's invoices from an external statement (your accounting system's export, for example) — one row per client payment, not one row per invoice. Click Download template first for the exact column layout: Client Code, Amount Paid, Paid Date, Reference, and Note (the last two optional).

Each row's amount is applied automatically across that client's open invoices (not fully paid yet), oldest invoice date first, until the amount runs out or there's nothing left to apply it to — the same effect as recording a payment on each invoice by hand, just done in bulk.

💡

This is meant to be run repeatedly against a recurring statement. Give a row a Reference and a re-uploaded file recognizes a payment it already applied and skips it, rather than recording it twice. Without a reference, it falls back to matching the exact amount and date instead — a real reference is the more reliable choice for anything you expect to re-import later.

After uploading, a result summary shows exactly what happened, plus a downloadable report (.xlsx) with one tab per outcome:

ResultMeaning
AppliedThe row's full amount was allocated across one or more invoices.
Partially AppliedSome of the amount was applied, but the client ran out of open invoices before it was used up — the leftover is named so it isn't silently lost.
UnallocatedThe client has no open invoices at all right now.
No Matching ClientThe Client Code on that row doesn't match anyone on file.
Multiple CurrenciesThat client has open invoices in more than one currency — skipped rather than guessing which one the payment is in.
Duplicate SkippedAlready applied from an earlier upload of this statement.

8Exporting to QuickBooks

Real bookkeeping — the actual accounts receivable ledger — lives in QuickBooks Online, not here. This app's job is to generate the invoice from payroll data and hand it off; QuickBooks is the source of truth for what accounting officially bills and collects.

Invoices are handed off as a CSV file, imported into QuickBooks through the SaasAnt Transactions app (QuickBooks doesn't accept a bulk invoice-with-line-items import on its own). The QuickBooks column on the invoice list shows whether an invoice has been exported yet, and a QuickBooks export filter narrows the list to Not Exported or Exported only.

  1. 1Tick the checkbox on each invoice to send (the header checkbox selects every visible, non-voided invoice at once).
  2. 2Click Export to QuickBooks (N). A CSV downloads immediately, and every invoice included is marked Exported right away.
  3. 3In QuickBooks Online, open the SaasAnt Transactions app and import that CSV as invoices.
💡

Each line item becomes its own row in the CSV, all sharing the same invoice number — QuickBooks adds them up itself to get the invoice total, the same itemized detail as the PDF (per employee, per pay period, per line type). Nothing here writes a separate "total" figure that could ever disagree with the line items.

⚠️

Exporting an invoice a second time is allowed but warned against — a confirmation appears explaining that re-importing it into QuickBooks will likely create a duplicate there unless the earlier one is removed first. A voided invoice can't be exported at all; its checkbox is disabled.

Payments are still tracked here manually (see Tracking Payments above) — exporting to QuickBooks only moves the invoice itself, not payment status. Whoever confirms a payment in QuickBooks records it here separately, the same as before.


9Tips & Troubleshooting

SituationWhat to check
Preview shows no line items, or fewer employees than expected Confirm both of that month's pay periods have been finalized in Payroll — Preview shows a warning naming exactly which period is missing rather than silently guessing.
An employee is missing from the invoice entirely Check their Salary record has a Client Rate set (for the default Billing Type) or a VA Rate (for VA Rate + Flat Fee) — Preview excludes and names anyone missing the rate their Billing Type needs.
Generate Invoice is disabled You need a non-empty Preview first, plus an Invoice Number, Invoice Date, and Due Date all filled in.
Send fails with "No email on file" The client has no Billing Email(s) and no Primary Contact email either — type one directly into the Send confirmation, or add it to the Client record first.
The invoice total looks mixed-currency or wrong If a client's employees have different Client Currency settings (not to be confused with their own Staff Currency — see Setting Up Client Billing), only the majority currency counts toward the total — Preview's warnings list which lines were excluded.
Record Payment rejects an amount The amount entered is more than the invoice's remaining Balance Due — check that figure in the modal and enter that much or less. Once an invoice is fully paid, the Record Payment button disappears from its row entirely.
Invoice Number field is empty Only happens before this system has ever generated a single invoice — type a starting number by hand. Every invoice after that pre-fills live from the shared sequence (highest number on file, plus one), the same field regardless of which client is selected.
Generate rejects the invoice number That exact number has already been used — by any client, not just this one. Numbering is one global sequence shared across every client and enforced unique at the database level, so it can never be reused for anyone. Use the auto-suggested number, or check the invoice list for who already has it.
Preview / Generate Invoice stay disabled even though the Client box shows a name Typing alone doesn't select a client — click an exact match from the suggestion list. A small warning appears under the field when this happens: "No client selected — pick one from the list, typing alone doesn't select it."
An invoice's checkbox is disabled and it can't be selected for export It's voided. Voided invoices are never eligible for QuickBooks export.
QuickBooks import shows an unrecognized item or customer The CSV's Item(Product/Service) and Customer values must match names that already exist in QuickBooks (or be ones SaasAnt is set to auto-create) — check spelling against your QuickBooks Products/Services and Customers lists.