The last post ended with a promise: a real write-up of the Perfex rollout. Not a feature tour. Not “ten reasons to switch.” How I actually use it to run OneBigPro — what I configured, what I had to bend, the mistakes I made moving clients over, and what I’d do differently if I were starting today.

If you want the origin story — twenty tabs, a spreadsheet I kept forgetting to update, the moment I caught myself doing a system’s job worse than a system would — that’s the previous post, 80 lvl doesn’t exist. This one starts after I bought the license.

I didn’t need a CRM. I needed one place where the numbers couldn’t hide.Why Perfex, not another board

Why not another tool

I already had tools. Trello, then Asana. Email. Messengers. A spreadsheet for invoices. A third place for who was owed what. The history of talking to the client lived in my head.

Each piece was fine. Together they were a lie I kept telling myself was “a workflow.”

The big CRMs were the other trap. HubSpot, Salesforce, the whole subscription stack — either bloated for a shop my size, or priced like I was already a department. I didn’t need a marketing automation platform with a CRM bolted on. I needed customers, projects, tasks, invoices, and contractor costs in the same object graph, on a server I control, without a meter running on every extra seat.

Perfex showed up on CodeCanyon as a one-time purchase. PHP, self-hosted, client portal, projects you can invoice from, timesheets, expenses, staff roles. Ugly in the way working software is ugly. That was a feature.

I bought it, put it on my own server, and started moving clients. One, then another, then a third. The interesting part wasn’t the install. It was what became visible once the data stopped living in four rooms.

What Perfex actually is

Perfex is not “project management with invoices.” It’s a small-agency operating system pretending to be a CRM. The objects that matter for how I work:

  • Customers and contacts
  • Projects, with a billing type
  • Tasks and timesheets
  • Invoices, estimates, recurring invoices
  • Expenses
  • Staff, roles, and a client portal

There’s more in the box — leads, goals, knowledge base, tickets, contracts, proposals. Some of that I use. Most of it I left off on purpose. A CRM with every module turned on is just a new mess with better typography.

CUSTOMER the only source of truth PROJECTS delivery / retain INVOICES one-off and recurring TASKS + TIME who did what, how long EXPENSES payouts, licenses, hosting
Diagram · everything hangs off the customer, or it doesn’t count

The map I use

The mistake most people make — the one I made — is treating Perfex like a nicer Trello. You copy boards over, you feel organized for a week, and then you still can’t answer what a client is worth.

The unit of work is not a task. The unit is a customer. Everything else hangs off that card, or it doesn’t exist.

Two kinds of project, always

Almost every client in this agency is two commercial relationships pretending to be one. There’s the build — a site, a redesign, a launch. And there’s the retain — the monthly package that keeps the thing alive. SEO, small fixes, incident response, the boring work that actually pays.

In Perfex that’s two projects on the same customer.

Table · how a client is split

What it’s forProject
Launch, redesign, a scoped piece of workDelivery
Monthly package, keep-alive, small fixesRetain
Work that blew past the packagea task on Retain, billed extra
A contractor owed money for that clientan expense on that project

If you dump it all into one project called “ClientName,” you will never know whether the retainer is healthy or the launch is eating it. I learned that by doing it wrong.

Billing type is a decision, not a dropdown

Perfex lets a project be fixed cost, billed by project hours, or billed by task hours. I don’t mix them for fun.

  • Delivery is usually fixed. Scope, price, invoice from the project when we hit the milestone.
  • Retain is a recurring invoice on a monthly cycle. The project still exists so tasks and time have a home.
  • Overflow — a rebuild in the middle of a retain month, a rush, something that isn’t in the package — is task hours, invoiced from the work that actually happened.

That mapping is the whole system. The software will not invent it for you.

What I configured

Day one I wanted to turn everything on. That’s how you get a CRM nobody opens. What I actually configured, in order:

01 customers contacts, not names 02 items what you actually sell 03 staff roles before access 04 projects + money then tasks, not before
Diagram · tasks come last. Money comes first.

Customers, not a contact dump

A customer is the company. Contacts are people with permissions. I used to paste a Telegram handle into a note and call it a day. Then someone new wrote from a different email and I had no idea who they were.

Now: one customer card, named contacts, who can see invoices in the portal, who is the billing person, who is allowed to request work. If that sounds bureaucratic for a five-person shop — it isn’t. It’s how you stop answering “did we talk about this?” with a half hour of archaeology.

Invoice items are the product catalog

Before Perfex, “what we sell” lived in my head and in whatever I typed into the last invoice. That’s how you accidentally invent a new price every month.

I made items for the things that actually repeat:

  • Monthly support retainer
  • Front-end hour
  • Content / SEO hour
  • A small set of fixed packages — landing, catalog, the jobs we know how to repeat

Those items go on invoices. They also force a conversation I used to dodge: if it isn’t an item, maybe we shouldn’t be selling it yet.

Staff are contractors with a smaller key

Perfex doesn’t have a “contractor” object. Staff is the object. That’s fine. The work is in roles.

A contractor gets a staff account, assigned only to the projects they touch. They see tasks, they log time, they comment, they attach files. They do not see other clients. They do not see invoices. They do not see what the client is paying. That last one is not ideology. It’s how you keep a freelancer from pricing themselves against your invoice.

I did this backwards at first. I gave people too much access because it was faster than thinking. Then I had to walk it back, which is always worse than doing it on day one.

Custom fields, not custom PHP

This is the part people skip, then later claim they need a rewrite.

I added a handful of custom fields: service type, retain vs delivery, language, whether the client is on a package. Enough to filter a list. Not enough to turn Perfex into a second product.

The custom work was not a fork. It was deciding what a project is, what an invoice line is, and who is allowed to see money. Perfex already had the objects. I had to stop pretending Trello columns were a business model.

The custom work wasn’t PHP. It was deciding what a project is.

The daily loop

I don’t live in Perfex all day. I open it for the questions that used to cost attention.

In the morning: what’s unpaid, what’s due this week, which tasks are overdue, which retain clients haven’t had a touch in too long. That’s a dashboard, not a feeling.

When work comes in: it becomes a task on the right project, assigned to a person, with a due date. If it isn’t on a project, it isn’t work. It’s a chat that will vanish.

When a contractor is done: time is logged on the task. Not in a Telegram voice note. Not “it was about three hours.” The timesheet is the only version I trust when I invoice overflow or when I ask, later, whether the retainer still covers the month.

When I bill: I invoice from the project, not from a blank document. Perfex will pull the billable tasks and the logged time if you set it up that way. I still review the line items. The software is not the accountant. It’s the memory I used to fake.

request chat, email, portal task on the right project time logged, not guessed invoice from the project
Diagram · if it isn’t on a project, it isn’t work

How the money works

This was the whole point. Not kanban. The question I couldn’t answer: how much do I actually make on this client — after contractor payouts and the hours I put in.

Perfex doesn’t print “profit” in a cute widget the way a pitch deck wants. It gives you the three numbers you can subtract if you have the discipline to record them.

INVOICED what they paid and what’s still hanging EXPENSES payouts, tools tied to the project TIME COST hours × internal rate including my own
Diagram · what’s left is the only number that matters

Invoices are what went out. Recurring invoices cover retainers so I don’t rebuild the same PDF every month. Status is not a vibe: draft, sent, paid, overdue. If it’s overdue, it’s on the dashboard. If I have to remember it, the system failed.

Expenses are what went out the other way. Contractor payouts, licenses, hosting, the ad-hoc costs that used to live in a chat. If an expense isn’t on a project, I will forget it, then wonder why a “profitable” client feels poor.

Timesheets are the third leg. My hours count. If I skip them because “I’m the owner, I don’t bill myself,” the retain looks healthier than it is. That’s how you keep a client who is quietly expensive.

The first month the data was complete, a client I thought of as the big one came out average. A smaller retain I kept meaning to drop was the steadiest thing I had. I wrote about that in the last post. I’ll say it again because it is the whole argument for doing this: gut feel is not a report.

Gut feel is not a report.After the first honest month in Perfex

How the team uses it

Before Perfex, onboarding a contractor meant: create a chat, talk for twenty minutes, paste a Google Drive link, hope the context survived until Thursday.

Now it means: staff account, role, assign to the project. The project already has the brief, the files, the task list, the comments from last month, the invoices the client can see. I still have a call. I don’t have to be the hard drive.

The client portal is the other half. Clients log in and see invoices, files, and — when I want them to — project progress. I don’t use it as a social network. I use it so “can you resend the invoice” dies as a genre of message.

Tickets I use lightly. For retain clients who send work in a messy stream, a ticket is better than a Telegram pile. For everyone else, a task on the retain project is enough. If you open tickets and Telegram and email as three equal inboxes, you have built a new mess tax.

What I ignore on purpose

Perfex will let you run a whole company in it. That doesn’t mean you should.

Table · on vs off

WhyModule
The spine of the agencyCustomers, projects, tasks, invoices, expenses
Retainers without rebuilding the PDFRecurring invoices
Profit you can defendTimesheets
Clients stop asking for PDFsClient portal
Sometimes. Not a second helpdesk.Tickets, contracts
Turned off. That’s a different job.Leads, goals, knowledge base

Leads I don’t run here. If a lead isn’t a customer yet, it can live in a notebook. The day I start stuffing a pipeline into the same database as paying retainers, the dashboard stops meaning “what’s unpaid” and starts meaning “what’s imaginary.”

Automations I didn’t start with. I use n8n elsewhere. Wiring it into a CRM that isn’t true yet just makes the mess faster. When a customer, a project, and an invoice already agree with each other, then a webhook is useful. Not before.

Mistakes moving clients over

I moved people too fast and too literally. Here’s what that cost.

I cloned Trello instead of modeling the business. Columns became task statuses. Boards became projects. I still couldn’t see money. A board is not a client.

I put delivery and retain in one project. For three months the numbers were soup. The launch looked like it was carrying the year. The retain was doing the actual carrying. I couldn’t see it because I’d mixed the two.

I migrated history I didn’t need. Old closed work, half-written tasks, screenshots from 2019. The CRM felt heavy on day one and I stopped opening it. Active clients only. If an old project matters, it can come back later as a file on the customer, not as two hundred stale tasks.

I didn’t log time for the first weeks. “We’ll start next Monday.” Next Monday the invoices were already going out on vibes. Incomplete timesheets are worse than none — they look like data.

I gave contractors admin because setup was annoying. Then I had a conversation I didn’t want about what a client was paying. Roles first. Access second. Always.

I invoiced from a blank invoice instead of from the project. Perfex will let you. It will also disconnect the invoice from the work, and then you’re back in spreadsheet land with nicer PDFs.

Table · migration, short version

What I didDo this instead
Copy every old boardActive clients only
One project per client nameDelivery and retain, split
Tasks firstCustomers, items, staff, then money
Time “later”Time from the first billable hour
Blank invoicesInvoice from the project
Admin for everyoneRoles before the first login

If I were starting today

Same software. Different first week.

  1. Install it. Don’t theme it. Don’t hunt modules. Empty is fine.
  2. Create invoice items that match what you actually sell. If you can’t name five, you don’t have a catalog yet — you have gigs.
  3. Create staff roles before you invite anyone. Especially if “anyone” is you plus one freelancer.
  4. Pick the clients who are alive right now. Customer card, two projects if they have a retain, one if they don’t.
  5. Turn on recurring invoices for every retain. Manual monthly invoicing is how you forget a client and then pretend it was “a relationship.”
  6. Log time for a month even if the numbers embarrass you. That’s the point.
  7. Add tasks only after the money objects are true. A beautiful kanban on top of a fake invoice is decoration.

I would not start with n8n. I would not start with a custom module. I would not migrate five years of Trello. I would make the next invoice come from Perfex, and I would make the next contractor log time in Perfex, and I would let that be the whole rollout until both habits stuck.

A beautiful kanban on top of a fake invoice is decoration.

Where it doesn’t fit

Perfex is not pretty. The UI is admin-panel PHP. Clients who want a Notion-looking portal will not get one. I don’t care. They want the invoice to be correct and the work to show up.

It is not a marketing CRM. If you need scoring, sequences, and a content calendar, this is the wrong box. I run an agency. I need operations.

It will not make you log time. It will not make you split delivery from retain. It will not stop you from giving a contractor admin. Those are habits. The software only stores the result.

Self-hosted means you own backups, SSL, updates, the PHP version. That’s the price of not renting your books from a SaaS. If that sentence scares you, pay HubSpot and stop reading.

For a shop like mine — retainers, a small bench of contractors, projects you can show with numbers instead of “we built a website” — it still wins. One purchase. One server. One graph where a customer, a task, an invoice, and an expense have to admit they belong to each other.

What’s next

I still catch myself answering a client from memory. That’s the old tax. The test is simple: if I got hit by a bus on Tuesday, could someone else open the project and know what we owe, what they owe, and what’s in flight. If the answer is no, it isn’t in Perfex yet. It’s in my head. And my head is not a system.

If you’re on twenty tabs and a spreadsheet you reconcile by hand, you don’t need a better board. You need the objects to connect. Perfex is the thing I used. The mapping is the part that actually mattered.

FAQ

Is this a Perfex review?+

No. It’s how I run OneBigPro in it. Feature lists go stale. The mapping — customer, delivery vs retain, invoices, expenses, time — is the part that still matters if the software changes.

Why not HubSpot, Pipedrive, or Notion?+

I didn’t need a pipeline toy or another docs app. I needed projects, invoices, expenses, and contractor time on one self-hosted graph, without a seat meter. Perfex is ugly and it does that.

Do I need to write custom code?+

I didn’t, not for the spine. Custom fields, roles, invoice items, recurring retainers. The hard part is deciding what a project is. Forking the PHP is how you postpone that decision.

Should I migrate all my old Trello boards?+

No. Active clients only. Split delivery and retain. Log time from the first billable hour. Invoice from the project. Roles before the first contractor login. I did the opposite and paid for it in soup numbers.

Where does n8n come in?+

Later. After a customer, a project, and an invoice already agree. Automations on a messy CRM just make the mess faster.

Links