On a fixed-price job, the payment schedule is set upfront and you invoice against milestones — the whole route is mapped before the trip starts. Cost-plus runs more like a meter: you track what you’re actually spending as the job unfolds, then bill the client for those costs — plus your markup — as you go.
Eano supports this workflow. The short version is: log expenses throughout the job, then pull them into invoices when it’s time to bill. Here’s how it fits together.
Step 1: Log Your Expenses as You Go
The foundation of cost-plus billing is good expense tracking. Every material purchase, labor cost, or subcontractor payment you log becomes something you can bill against later.
You have a few ways to get expenses into Eano:
Manually, from the field or the office: Head to the Finance tab of your project, open the Expenses sub-tab, and hit + Add Expense. Fill in the vendor, amount, category, and date. If you’ve got a receipt, upload it — Eano will read the amount and date off it automatically.
From your phone: Field workers can tap the camera button in the bottom-right corner of the Projects screen, choose New Expense, and snap a photo of a receipt on the spot. It goes straight into the project’s expense log.
From QuickBooks: If you’re connected to QuickBooks, you can sync your QB expenses directly into Eano. Purchases you’ve already recorded in QuickBooks show up in the project without re-entry.
One habit that pays off later: mark an expense as Paid once you’ve actually paid it. The one-click billing tools in Step 2 only pull in expenses that are paid, so keeping that status current is what lets them work like magic. (QuickBooks expenses are treated as paid automatically.)
The more consistently you log expenses as they happen, the easier billing becomes — you won’t be reconstructing costs from memory at invoice time.
Step 2: Build an Invoice from Your Expenses
When you’re ready to send a bill, go to the Finance tab and create a new invoice. As you add line items, you can pull in the expenses you’ve logged: start typing in the description field, and Eano suggests matching expenses from what’s on record for the project. Each suggestion shows the amount, vendor, and date so you can pick the right one. Select an expense and it becomes a line item on the invoice, with the description and amount filled in and linked back to the original expense.
Add a Whole Batch in One Click
Picking expenses one at a time works, but if you’re billing a stack of them there’s a faster way. Clear the description field (so nothing’s typed in the search) and the suggestion list shows two “magic” options at the bottom, each marked with a 🪄:
🪄 All non-invoiced expenses — adds every paid project expense you haven’t billed to the client yet, all at once. No more hunting down which costs still need to go out.
🪄 Non-invoiced expenses by date — the same idea, but limited to a date range. Pick a start and end date (they default to the last 30 days, and both ends are included), and Eano pulls in just the unbilled paid expenses that were paid within that window.
A few things these options are careful about, so you get exactly what you’d expect:
They only pull paid expenses. Anything still marked Open sits this one out until you’ve actually paid it. For a partially paid expense, what counts is the Paid/Open status you set — not whether the payments happen to add up.
They only pull this project’s expenses — including any QuickBooks expenses linked to the project, but never stray QuickBooks entries that aren’t tied to it.
They skip anything you’ve already billed. That’s the whole point: an expense that’s already on an invoice won’t come through again. (One nice side effect — an expense you invoiced but the client hasn’t paid yet is treated as already billed, so it won’t double up while that invoice is still outstanding.)
By-date uses the payment date — the day the expense was paid, not the day it was logged or last edited. An expense with no recorded payment date gets skipped by the date option.
From there, you can add your markup, adjust any amounts, and add any additional line items that aren’t tied to logged expenses (a management fee, for example, or a line for labor calculated separately). Markup is still added line by line, using the same markup field you’d use on any invoice item.
Cleaner Descriptions on Linked Lines
When an expense doesn’t have its own description, a linked line used to come across blank or as a dash — not something you’d want a client to see. Now Eano fills in a sensible label for you:
If the expense has a vendor or subcontractor but no description, the line reads “Work performed by [vendor name].”
If it has neither, it falls back to who logged it and when — “Expense paid [date] by [name].”
For QuickBooks expenses, it uses the QuickBooks description if there is one, otherwise the QuickBooks account (“Accounting logged expense for [account name]”), and failing that, the payment date.
You can always click into the description and edit it before sending — these are just smart starting points so no line ever goes out looking empty.
Step 3: Finalize and Send
Once the invoice looks right, finalize it and send it to the client. They’ll receive it the same way they’d receive a milestone invoice — via email and SMS, with a link to pay online if you’ve got Stripe connected.
Keeping Track of What You’ve Billed
The hardest part of cost-plus billing usually isn’t sending the invoice — it’s remembering which costs you’ve already billed and which are still waiting. Eano keeps that straight for you.
On the Expenses list, there’s a Client Invoice column. For any expense you’ve billed to your client, it shows the invoice number right there in the row — click it to jump straight to that invoice. A green checkmark next to the number means the client has paid it; no checkmark means the invoice has gone out but isn’t paid yet. If the cell is blank, that expense hasn’t been billed to anyone — a quick visual list of what’s still owed to you.
Open an expense and you’ll see the same link with a little more detail: the invoice’s status plus its payment date if it’s paid, or its due date if it’s still outstanding. (If an expense somehow ended up on more than one invoice, Eano shows the first one it was billed on.)
This column is available on Pro plans and up. Eano quietly records the billing link no matter what plan you’re on, though — so if you upgrade later, your whole billing history is already there waiting, past invoices included.
Guardrails Against Double-Billing
Because nothing stops you from billing an expense twice if you really mean to, Eano puts up a couple of friendly flags so you don’t do it by accident:
In the suggestion list, an expense you’ve already billed carries a small amber “Billed” badge, so you can see at a glance that it’s been sent to the client before.
On the invoice itself, if a line is tied to an already-billed expense, a warning icon appears with the note: “This expense was billed to a client in a previous invoice.” That message is for your eyes only — it’s an internal reminder and never shows up on what the client receives.
Tracking Where You Stand
The Finance tab summary shows your estimated expenses against your actual expenses in real time, so you always know how the job is tracking. As costs come in and you log them, the actuals update — you don’t have to wait until invoicing to see where your margin is.
A Few Things Worth Knowing
Expenses don’t disappear once you invoice them. They stay in the expense log for your own records even after you’ve billed for them — now with the Client Invoice link right beside them showing where they went.
Mark expenses Paid to unlock the one-click billing. The All non-invoiced expenses and by date options only sweep in expenses you’ve marked Paid, so keeping that status current is what makes them useful.
QuickBooks users: expenses sync with QuickBooks in both directions. See the QuickBooks sync articles for the details on how that works.
You’re not locked into one approach. There’s nothing stopping you from using milestones for some payments (a deposit, say) and expense-based invoices for the rest. Many contractors do both on the same job.