I ripped out our third-party timesheet system and rebuilt it natively in Salesforce.
Three months ago, I did something that most sensible people would probably avoid.
I ripped out a third-party timesheet system that technically worked…
and rebuilt the entire thing natively in Salesforce.
Thanks for reading Phil's Substack! Subscribe for free to receive new posts and support my work.
Not because the old system had failed.
Not because it was “bad”.
It did what it said on the tin.
But it forced us into someone else’s idea of how timesheets, invoicing, and payments should work — not how they actually work inside a veterinary locum agency.
And over time, that gap mattered.
“It works” isn’t the same as “it fits”
Our previous system handled the basics:
locums submitted timesheets
practices approved them
invoices were generated
But everything around that core flow felt fragile.
Exceptions were awkward.
Corrections were painful.
Edge cases required manual intervention.
And the system never really understood the relationships between:
locums
placements
rates
timesheets
invoices
and payments
That’s tolerable if timesheets are a small part of your business.
They aren’t for us.
Timesheets sit right at the intersection of compliance, payroll, invoicing, cash flow, and trust. Errors aren’t just annoying — they’re expensive, reputationally damaging, and time-consuming to unwind.
So eventually, I stopped asking “How do we work around this?” and started asking:
Why don’t we just build the thing we actually need?
Building it properly meant building it from scratch
I didn’t clone an existing system.
I didn’t follow a reference architecture.
I didn’t try to “replicate” what we already had.
I started from first principles:
What actually happens in the real world?
Who should be able to do what — and when?
Where do mistakes usually occur?
What should be impossible, not just discouraged?
And then I built around that.
The result:
a fully Salesforce-native timesheet system
tightly integrated with placements, rates, invoices, and suppliers
designed specifically for locum recruitment
with financial controls baked in from day one
The biggest lesson: simplicity is deceptive
From the outside, the system looks intentionally boring.
For locums:
submit timesheets
For practices:
approve timesheets
For internal users:
process invoices
That’s it.
No instructions.
No training guides.
No “please email us if something goes wrong”.
But that simplicity comes at a cost.
Because making something simple for users makes the backend brutally complex.
Behind the scenes, that meant:
heavy validation rules
status-driven field locking
guardrails everywhere
structured, opinionated flows
duplicate prevention
correction handling
edge-case logic you hope never triggers… but know eventually will
The system doesn’t rely on people “doing the right thing”.
It makes the wrong thing hard — or impossible.
Automation wasn’t optional
One rule I set early on:
if a process relies on instructions, it’s already broken.
So automation wasn’t a “nice to have”.
We built:
automatic submission reminders
automatic approval reminders
clear status progression
process-led internal handling
The outcome surprised even me.
Internally, anyone can now manage timesheets and invoicing after a few hours of training.
No tribal knowledge.
No “only Sarah knows how this works”.
No quiet workarounds.
The system leads the process.
The unexpected pain point: PDFs
I assumed PDF generation would be trivial.
It wasn’t.
Some vendors quoted £17,000 per year, with usage-based pricing and wildly over-engineered solutions for what we actually needed.
After far too much time looking at options, I eventually found a solution that:
took under two hours to configure
does exactly what we need
costs £60 per user per year
No bells.
No whistles.
Just reliable document generation.
That contrast alone was eye-opening.
Licensing nearly derailed the whole thing
This was the part I didn’t see coming.
Salesforce Enterprise orgs include 20,000 free External App logins — but not Experience Cloud customer licences, which cost around £4 per user per month.
For a locum business, that adds up quickly.
With careful design, strict permissioning, and a lot of testing, I managed to:
use the free External App licences
maintain proper security and privacy
avoid exposing anything users shouldn’t see
and save thousands per year in licence costs
It wasn’t trivial — but it was worth it.
We tried to break it before it broke us
We ran the new system in parallel with the old one for over a month.
Deliberately.
And aggressively.
We:
stress-tested edge cases
forced corrections
pushed invalid states
tried to break flows
tried to confuse users
Only when it consistently behaved as expected did we switch it on fully.
It’s now been live for over a month — and it’s running exactly as intended.
Still iterating — but proud of this one
It’s not “finished”.
It never will be.
Next up is consolidating self-billing invoices and tightening a few financial loops.
But this has been one of the most satisfying builds I’ve done — not because it’s flashy, but because it disappears. It just works.
The real takeaway
Build for your real-world process — not someone else’s generic one.
Off-the-shelf systems are great until they aren’t.
And when your business sits in the gaps between “standard” workflows, those gaps become painful very quickly.
Happy to share lessons learned — or scars 😅
If you’re building anything similar, you’ll probably earn a few of your own.