hourslip

Bill clients for hours worked with Claude Code

Last updated . Claude Code docs checked 2026-10-08.

The short answer. To bill by the hour you need hours per client: the time you worked on their project in Claude Code, plus the time you spent on it away from Claude Code (a call, testing in a browser), which only you can note. The time Claude spent working falls inside the first number; it is not an extra amount on top. Show the client the hours per day and per ticket, mark what you added by hand, and say how the time was measured. This page gives no advice on rates, tax or contracts.

Which hours: what Claude Code counts

Claude Code reports three kinds of duration, all for one session and none tied to a client:

API time alone leaves out your own reading, reviewing and typing; wall time can include a lunch break. None of the three says which client the time was for, and work on the project away from Claude Code has to be added by you.

Billing without hourslip

Run /usage at the end of each session. Its Session block, from the costs page, starts like this:

Total cost:            $0.55
Total duration (API):  6m 20s
Total duration (wall): 6h 33m 10s

Note the duration before you start over: “These totals reset when /clear starts a new session”. Write it down per client, by which project folder the session was in, with the time you spent away from Claude Code on the same client. A spreadsheet with a row per day and client, the hours and your rate, gives the amount: hours times rate. A timer that you start and stop per client does the same job and also counts the calls.

The Total cost line is what the session's tokens cost, and “The figure is an estimate”. It says nothing about your hours.

Hours, rate and invoice: hourslip

hourslip is a Claude Code mod (a plugin of function hooks). It records when you send prompts and when Claude's turns start and end, with the folder and the git branch; the folder gives the client and the branch the ticket. How it counts a stretch of work is in the first guide. Every report it makes has three numbers:

Billable is measured time plus time added by hand. A rate is set per client, an amount and a three-letter currency: /hourslip client add acme "ACME Corp" --path "<folder>/**" --rate 40 USD, or "rate": { "amount": 40, "currency": "USD" } in rules.json.

/hourslip publish acme previews the report for a calendar month (the current one, or YYYY-MM) and sends nothing. When the client has a rate, the report carries an invoice:

A client without a rate gets the hours and no invoice.

Captured with claude -p in Claude Code 2.1.292 on Windows, 2026-10-08, with a sample client at 40 USD an hour and a local test server. The preview's file path line is left out, and the typed command is shown dim. One prompt measured 0h10, the call added 1h30, and 1h40 at 40 USD an hour is 66.67 USD. Claude shows 0h00 because the sample's only turn was a one-word reply.

What the client sees

The report is a page your client can read without hourslip: /hourslip export acme writes it as a local HTML file (“Print this page to save it as PDF.”), and /hourslip publish acme --confirm publishes it and gives you a link to send. It shows:

The same export writes two CSV files. The days file has the columns Measured hours, Claude hours, Manual hours and Total billable hours; the tickets file has one row per day and ticket, with your notes. See a sample report.

On a published report, whoever holds the link can type a name and confirm the hours. “hourslip does not verify who confirms: anyone with the link can.” The first two published reports are free, no card; unpublishing one does not give it back.

What hourslip does not do