7 min read

·

How I automated time tracking and invoicing so month-end takes ten minutes

I never filled in a timesheet, so my invoices were guesses, and now a passive tracker watches the work I already do and drafts the invoice for me.

I automated time tracking by capturing every window title on my laptop, classifying each one against the client it belongs to, and turning the result into an invoice with one click. The work I already do is the data. I enter nothing by hand. Month-end invoicing went from a guess I dreaded to about ten minutes of review.

This started from an honest admission, not a clever idea. I bill by the hour and by fixed price, and I have never reliably kept a timesheet in my life. So the tool had to be built around that fact rather than against it.

The timesheet was never going to get filled in

The reason my invoices were estimates is that the record they were built on did not exist. The standard answer to billing by the hour is a timesheet, and I had years of evidence that I would not keep one. At month-end I would reconstruct three weeks of work from memory and a calendar, round it to a number that felt fair, and send it. Sometimes I undercharged because I forgot a day. Sometimes a fixed-price job had quietly run a week over and I only noticed when I added it up. The arithmetic was never the problem. The truth to do the arithmetic on was missing.

So the tool started from the one thing I could rely on. I would not log my own time. Anything that depended on me remembering, in the moment, to start and stop a timer was going to fail the same way the timesheet failed. The capture had to be passive, or it was not worth building.

What the tracker actually does

The tracker watches what is on screen and works out who it was for. A standard activity logger runs on my laptop and records the title of whatever window is in front, plus the active browser tab, and nothing else. Every night a script reads the previous day block by block. Most blocks resolve from a plain list of rules: this client name, this project folder, and this session all map to this job. Only the genuinely ambiguous blocks go to Claude, which reads the window title and assigns it to the most likely job or marks it as not work. The result is a day split across clients with no input from me. From there, one button produces a Word invoice with a line for each working day and a short description of that day's work.

Why it reads the Claude windows, not just the browser

It reads the Claude windows because that is where a large part of my work now happens, and a tracker that only watched the browser would bill me for half a day when I had worked a full one. Most time trackers were built for a world where work is a browser tab and a desktop app. A lot of mine is a Claude Code session building a site, a Cowork session sorting files and content, or a Claude Desktop project thinking through a client problem. So the classifier treats a Claude Code folder path, a Cowork project name, and a Claude Desktop project name as signals in the same way it treats a Chrome tab or a Canva file. A session named for a client counts toward that client. It also reads my Google Calendar, so a meeting that never touched the laptop still lands on the right job. The test I set was simple. If I spend a day on one client, the day should show against that client whether I spent it in a browser, in a design tool, or inside a Claude window. It does.

A spreadsheet loses this race before it starts

A spreadsheet loses because it depends on the one thing I had already proven I would not do. To keep a spreadsheet honest you have to stop, remember which client you are on, and write it down, several times a day, every day. Miss an afternoon and the record is already wrong, and a record you cannot trust is worse than no record, because you act on it anyway. The tracker takes the discipline out of the equation. It captures whether I remember or not. It also gets sharper over time. Every time I correct a block, it offers to make a rule so that window title is never ambiguous again. After a few weeks most days resolve from the rules alone, and the only work left for the classifier is the genuinely new. The first week threw up a run of a dozen identical blocks from a day I had worked on a new job before I had added it to the system. I selected all of them, assigned them to the right client in one action, and accepted the offer to make a rule. Every block with that title since has gone straight to the right place without a model ever looking at it.

What a normal day looks like to it

A normal day arrives the next morning already sorted, and seeing it laid out is what convinced me to trust it. Say I spent yesterday on one client. The day view shows a block from nine to just before ten in Framer on that client's site, a shorter block in Canva on their brand colours, a three-minute gap where I flicked away and came back that the system quietly folds into the block around it, and a longer block in Gmail on a thread about their launch date. Each block carries the client, the source, and a confidence mark. The Framer and Canva blocks are high confidence and silent. The Gmail block is middle confidence and flagged for a glance, because a subject line is a weaker signal than a project folder. I can reassign any of it in one click, and most days I reassign nothing.

The invoice draft reads the same way. One line per working day, a few words describing what that day's windows suggest the work was, the hours, and the amount at the agreed rate. A day that ran across discovery, colour work, and a client email becomes a single dated line that says what happened, not a wall of timestamps. I read the descriptions, fix anything vague, and send. The first time I generated one and the total matched what I would have charged from memory, except it was defensible line by line instead of a round number I hoped was fair, was the moment the whole thing stopped being something I felt guilty about.

It tells me a fixed-price job is bleeding while I can still fix it

The tracker flags work drifting out of scope within a day of it happening, which is the difference between a variation and a loss. On a fixed-price job the danger is not the hours you agreed to. It is the quiet extra hour, then the extra day, that nobody decided to spend. The dashboard runs a simple bar for each fixed-price job and marks it at three-quarters and nine-tenths of the estimate. Work that belongs to a client but matches nothing I agreed to deliver gets held aside and shown to me, not buried in the total. So when a job is heading past its number I see it while there is still a conversation to have, instead of finding out at the end, when the only choices are to absorb it or to argue about it after the fact.

What it does not do, on purpose

The tracker does not capture what is inside any window, does not send anything, and does not change a number that affects a bill without me. It records window titles and tab titles, never the contents of a document or a message. It produces the invoice as a draft, and I read every line and email it myself. Nothing about billing moves on its own. There is a six-minute floor on a billable block and a rule that folds tiny gaps back into the work around them, because nobody should be billed for ninety seconds of a tab being open. These are not missing features. They are the point. The machine does the part I am bad at, which is remembering and recording. I keep the part that should never be handed over, which is the decision about what a client actually owes.

The pattern matters more than the tool

The time tracker is one example of a pattern I use for any job I keep avoiding. Find the task you dread and never do properly. Work out what data you already generate just by doing the work. Let plain rules handle everything obvious, let Claude handle the judgement on the rest, and keep a person in front of anything that touches money or goes to a client. The timesheet failed because it asked me to make new data through discipline I do not have. The tracker works because it reads data I was producing anyway and only asks me to check the result. That is the core move in any business automation worth building, and it carries across to reporting, content, and the semi-automated client onboarding I use for new agency clients with very little changed.

If this is your situation, run your idea through the free assessment at ortopylot.com/assess. It takes four minutes and gives you a straight commercial read on whether the idea is worth building.

Common Questions

How Do You Automate Time Tracking For Client Invoicing?

You automate it by capturing your activity passively and classifying it against clients, rather than relying on a timer you have to start and stop. A background logger records the window and tab titles you already produce by working, a nightly process assigns each block to the right client using rules first and AI for the ambiguous ones, and the result becomes a draft invoice you review. The input you have to remember to give is zero.

Can AI Classify Which Client I Am Working On From My Activity?

Yes, when most of the work is resolved by plain rules and AI only handles what is genuinely ambiguous. Client names, project folders, and session names map to jobs directly, so only the unclear window titles get sent to a model. Each correction you make becomes a new rule, so the same title is never ambiguous twice and the share of work the AI has to judge shrinks over time.

Does An Automated Time Tracker Capture Work Done Inside Claude Code Or Cowork?

It does if it is built to read those windows as signals. A tracker that only watches the browser will miss the hours spent in a Claude Code session, a Cowork session, or a Claude Desktop project, which for many people is now a large part of the day. Treating the folder path, the project name, and the session name as identifiers lets that time land on the correct client instead of going uncounted.

Is Automated Time Tracking Better Than A Spreadsheet?

For anyone who does not reliably fill in a spreadsheet, yes, because the failure point of a spreadsheet is the discipline it requires. Passive capture records your time whether you remember to or not, so the record is complete instead of full of gaps you patch from memory at month-end. A record you can trust is the thing a manual timesheet almost never becomes.

How Does An Automated Time Tracker Handle Fixed-Price Jobs?

It tracks the hours against the agreed estimate and flags drift early. A progress bar against the estimate, marked at three-quarters and nine-tenths, shows a fixed-price job approaching its limit, and work that does not match any agreed deliverable is held aside for review rather than hidden in the total. That turns scope creep into a variation conversation you can have in time, instead of a loss you discover at the end.

Does Passive Time Tracking Record What Is On My Screen?

A well-scoped one does not. The version I built records only window titles and browser tab titles, never the contents of a document, an email, or a message, and it takes no screenshots. The titles are enough to identify which client a block of work belongs to, which is all the system needs to do its job.

How Long Does Month-End Invoicing Take Once It Is Automated?

About ten minutes, because the work is review rather than reconstruction. The hours are already captured and classified, the invoice is generated as a draft with a line per working day, and the only task left is to read the descriptions, correct anything that needs it, and send the email. The hour-long exercise of rebuilding three weeks from memory disappears.

Read the post. Now check if your idea holds up.

The assessment takes four minutes. Free. No email required.

Try the Assessment