Three fields on every enquiry
- Service line
- Engagement type
- Estimated start
Engagement type is a dropdown of fixed-scope project, retainer, and time and materials, which is the distinction the rest of your billing hangs on.
Enquiry, proposal, delivery and billing on one record, with the hours you bill for landing on the invoice rather than in a spreadsheet. Applying the professional services pack puts your own words on the navigation and adds the three fields your billing turns on.
No per-consultant fee, unlimited users, self-hosted. The pack applies from Settings in a click.
The number you quoted is the number on the invoice, because it is the same set of line items moved forward rather than a second document somebody types out again.
A referral, a call, or the form you embed on your own site lands as an enquiry with its source recorded against it, and the list filters by that source.
Set the expected value, pick the service line and whether it is fixed-scope, a retainer or time and materials, and hand it to an owner.
Send a line-item estimate. The client opens a private link and accepts it without an account, and the acceptance records who accepted and when.
Convert the accepted estimate and the invoice comes out the other side with the same lines, the same client and nothing retyped.
The work becomes tasks against the engagement, in a list, on a board or on a calendar. Client questions become tickets with a response clock.
Push billable hours onto a draft invoice, record part payments as they land, and put the retainer on a schedule that raises itself overnight.
The professional services pack is a file in the repository, so this list is exactly what you get. Every item is an ordinary record you can rename, reprice or delete afterwards.
Engagement type is a dropdown of fixed-scope project, retainer, and time and materials, which is the distinction the rest of your billing hangs on.
Enough to separate a referral from a cold enquiry and a renewal from a rebid, without inventing a taxonomy in week one.
Fixed-fee engagements, monthly retainers, hourly advisory and a day rate, ready to drop onto an estimate. Change the prices to yours before you send one.
Optionally the pack also seeds sample clients, engagements and tickets so you can see the shape of it. Every seeded row is tagged, so you can delete the lot in one action when you are done.
Each one is checked against the source rather than written from a feature list, and where a capability is on one client and not the other, it says so. The next section is the other half of that promise.
Your navigation reads Enquiries and Engagements on the web app, and the Enquiries pages carry the word throughout. Other page headings keep the stock label and the phone app does not read the map at all, so it still says Leads. The record underneath is unchanged either way.
Service line, engagement type (fixed-scope, retainer, or time and materials) and estimated start, on every enquiry. They render on both clients, filter in list views, and come back through the API.
An itemised proposal opened through a tokenised URL with no login. Acceptance stores the name, the email and the time, so an agreed number has a record behind it.
One action converts it. Same line items, same client, and the estimate keeps a link to the invoice it produced, so nothing gets quoted twice.
Start a timer, mark the entry billable at a rate snapshotted on the day, then push the unbilled ones onto a draft invoice. Minutes become hours to two decimals and the rate rides along. The timer runs on both clients; the invoice step is on the web app.
A monthly or quarterly schedule with an end date, generating its invoice on a nightly job rather than when somebody remembers. Stop it by switching the schedule off.
Record money as it arrives, several times against the same invoice, and the balance follows. Overdue is marked by a scheduled check rather than by eye.
A first-response target and a resolution target on every client ticket, counted against your business calendar and holidays, and paused while you are waiting on the client rather than punishing you for their delay.
A task hangs off an account, an engagement or a ticket, with an owner and a due date, in a list, a board or a calendar. It is the same task in all three.
Revenue goals by period for a person or a team, ranked, with a notification at half, at ninety percent and at the line. On the web app and the phone.
Django and PostgreSQL, deployed where you choose, with tenant isolation enforced by row-level security in the database rather than by application code. The data never has to leave your infrastructure.
Add associates, subcontractors and account managers without a seat fee. In a trade where headcount moves with the pipeline, a per-user price charges you for the peak.
Several of these are the ones a professional services CRM is usually sold on. If your week turns on one of them, this is the wrong tool today, and knowing that now is worth more than a demo that steers around the subject.
A timer starts on a ticket and only on a ticket. The billing chain after that is complete, so firms bill hours by opening a ticket for the piece of work. If you want hours to roll up per engagement without that step, it is not here.
The three numbers a practice-management tool is bought for are all absent: no billable utilisation per person, no cost versus revenue per engagement, and no project expenses passing through to the client invoice. The one report that ships is accounts-receivable aging, in buckets. A cost you want to recharge is a line you add by hand.
Engagements move through six fixed stages: Prospecting, Qualification, Proposal, Negotiation, Closed Won and Closed Lost. You cannot rename them or add your own.
The pack defines a six-stage new-business pipeline, from New enquiry through Proposal sent to Won. Those rows are really created and the API serves them, and neither client has a screen that draws them, so an enquiry carries a status rather than sitting in a column.
Nothing rates or ranks an enquiry for you. You set an expected value, a service line and an owner, and deciding what is worth chasing stays a judgement somebody makes.
The website form you build in Settings is a flat list of questions. Showing one only when another was answered a certain way, or splitting a long enquiry across pages, is not built.
Files attach to enquiries, contacts, tasks and tickets. The phone shows files and comments on an engagement too; the web app does not, where the engagement page carries the money, the stage and the people and nothing else.
The importer is written and tested on the backend, with per-row error reporting, and neither client can reach it. Moving an existing book of clients in means the API, not a file upload in the interface.
The estimate model, the time-entry billing helper and the professional services pack are all in the open repository.
The core CRM is open source and free to self-host, with no per-user fee and no seat cap. You run it on your own server and the bill is your infrastructure.
Yes. It is a Django and PostgreSQL application you deploy yourself, which is the reason firms handling client-confidential work pick it over a hosted product. Tenant isolation is enforced by row-level security in the database.
Yes, and the pack has a field for it. A fixed-scope project is an ordinary invoice; a retainer goes on a recurring schedule that raises its own invoice monthly or quarterly until you stop it or its end date passes.
Yes. An estimate can be shared as a private tokenised link the client opens and accepts with no signup. The acceptance records who accepted it and when, so the agreement has a trail.
Yes, with one constraint worth knowing before you commit. Time is logged against a support ticket, billable entries carry the rate they were logged at, and unbilled ones can be pushed onto a draft invoice from the web app. What does not exist is logging time directly against an engagement, so hours for a project get recorded on a ticket raised for that work.
Yes. Self-hosted means the database is yours, there is no export fee and no lock-in. The API is documented and the schema is in the open repository, so getting your data back out is a query rather than a support request.
Apply the professional services pack, put the whole firm on it, and pay nothing per head. Self-host it and your clients' work never leaves your server.