Separate reimbursable and non-billable costs

The billable flag decides whether a cost can be rebilled. An expense with no client is stored non-billable by default; it only counts as billable if it was logged with billable: true explicitly. update_expense moves a cost between the two sides by setting the client and the flag together.

Written and reviewed by the Billr team. Published , last reviewed .

Who this is for
Studios and freelancers whose expense book mixes client costs with their own software, travel and office spending.
Billr capabilities used
update_expenselist_expenseslog_expense

What you need first

  • Expenses already logged, either from an agent or the dashboard.
  • A key with the Read and draft profile.
  • A view on which costs are the client business and which are your own overhead.

Step by step

  1. 01Split the two sides

    list_expenses with billable: true returns costs that can be rebilled, and billable: false returns overhead. Adding billed: "unbilled" narrows to what has not reached an invoice.

    Example
    list_expenses  {
      "billable": false,
      "from": "2026-09-01",
      "to": "2026-09-30"
    }
  2. 02Move a cost to the client side

    Reassignment and the billable flag belong together: without a client, a cost cannot be attached to a client invoice even if the flag is true.

    Example
    update_expense  {
      "expense_id": "d41b8e93-2a70-4c15-9b6f-5e8a1c3d7f08",
      "client_name": "Harbor & Lane",
      "billable": true,
      "vendor": "Cafe Meridian"
    }
  3. 03Take a cost back off the client side

    Set billable: false when the business is absorbing the cost after all. The expense stays in the book for your own reporting and stops being eligible for a client invoice.

  4. 04Read the totals by currency

    list_expenses returns totals_by_currency, so a month that spans two currencies reports two honest totals instead of one meaningless number.

Worked example

Fictional account, field names as returned by the server

You say

The Cafe Meridian lunch is on us, not on Harbor & Lane.

Your agent calls

  • update_expense { "expense_id": "d41b8e93-2a70-4c15-9b6f-5e8a1c3d7f08", "billable": false }

Expected response, abridged

Example
{
  "summary": "Updated expense: $47.50 on 2026-09-29",
  "expense": {
    "id": "d41b8e93-2a70-4c15-9b6f-5e8a1c3d7f08",
    "description": "Client lunch",
    "amount": 47.5,
    "is_billable": false,
    "is_billed": false
  }
}

Limits and gotchas

  • An expense already attached to an invoice cannot change sides; correct the draft invoice instead.
  • Billability is per expense, not per category, so two meals can sit on opposite sides.
  • Expenses never appear in revenue totals; they belong to cost tracking, not income.
  • There is no client-facing expense report in the product today.

Troubleshooting

A non-billable cost showed up on an invoice
Check whether it was attached before the flag changed. Attached lines stay on the document, and only a draft can be corrected.
list_expenses returns nothing for a month
Confirm the date range and the billable or billed filter. The defaults are permissive, but a narrow filter with no matches looks exactly like an empty book.
Totals look wrong across currencies
Read totals_by_currency rather than adding the numbers yourself; the server refuses to blend currencies.

Sources

Reviewed 2026-09-20 against Billr's own tool implementations and the client documentation linked above.

Expenses stay out of revenue entirely: only invoices are money in, which is why the expense book never distorts the revenue summary.

Review revenue