Perfex Cash & Capacity documentation
Perfex Cash & Capacity shows which projects and customers make you money, chases unpaid invoices for you, plans who works on what in the weeks ahead and grades every customer from A to D. It works from the timesheets, expenses, invoices and payments you already keep in Perfex CRM. Nothing has to be entered twice.
The module has four parts. Profit covers cost rates, project and customer margins, and budgets. Get Paid covers reminder sequences, promises to pay, disputes, AR ageing, DSO and the cash-in forecast. Capacity (new in 1.1.0) covers working hours, holidays and time off, bookings on a drag-and-drop schedule, conflicts, utilisation and the free-capacity forecast. The Client Value Score brings profit and payment together into one grade per customer.
Installation
Requirements
- Perfex CRM 3.0 or newer (tested on 3.4.1)
- PHP 8.0 or newer with cURL; MySQL 5.7+ or MariaDB 10.3+ (strict SQL modes supported)
- A working Perfex cron job. Reminders, budget alerts, scores and the nightly figures all run from it.
- For SMS steps: an SMS gateway active in Perfex (Setup › Settings › SMS)
- Optional: an API key from an AI provider, or Perfex Brain Pro with its AI Brain set up, for AI wording
- Optional: the Timesheets & Leave module (or HRM), whose approved leave and holidays Capacity reads
Steps
- In Perfex go to Setup › Modules, upload
perfex_cash_capacity-x.y.z.zipand click Install. - Click Activate. Tables, settings and three ready-made reminder sequences are created automatically.
- A new Cash & Capacity menu appears with Overview, Profitability, Capacity, Collections, Client Value and Settings.
First steps
- Settings › Profit: check the target margin (30% by default), what to do with hours that have no cost rate, and any overhead.
- Profitability › Cost Rates: enter what an hour of each person costs you, or a default rate per role. Margins are only as good as these rates.
- Collections › Sequences: read through the Standard sequence and adjust the wording to your voice.
- Settings › Get Paid: pick the send hour and weekdays, then switch on Send reminders. Nothing is sent to customers until an administrator turns this on. Before that, invoices are already tracked and every screen fills in, so you can look around safely.
- Decide whether the module should take over Perfex's own invoice reminders, so customers are not reminded twice.
- Settings › Capacity and Capacity › Time Off & Hours: check the default working hours and target, add company holidays (or import them), then book people on the Schedule. See Capacity.
The Overview page shows cards for margin this month, receivables (total, overdue and DSO), today's worklist count, the team's booked hours for the next four weeks and the Client Value grade split. Below them are a Needs Attention list (projects over or near budget, broken promises, disputes, over-allocated people, won work to confirm and customers to rethink) and the expected cash-in. A Client Value panel lists the customers to fix first. Staff see only the cards their permissions allow.
Permissions
The module adds five permission groups under Setup › Staff › Roles. Administrators pass every check.
| Group | Capabilities |
|---|---|
| Cash & Capacity: Profit and Margins | View (global): revenue, cost and margin of every project and customer. View own: only projects the staff member is a member of. Edit budgets: change project budgets and recalculate. |
| Cash & Capacity: Staff Cost Rates | View and Edit staff cost rates and salaries. This is a separate group because salaries are sensitive. Someone with only this permission gets a direct Cost Rates menu item. |
| Cash & Capacity: Capacity | View (global): everyone's schedule, utilisation, forecast and time off. View own: their own row and the bookings on projects they are a member of. Create: add bookings and their own time off. Edit: move, change and confirm bookings; with View (global) also time off, holidays, working hours, placeholders and people. Delete: delete bookings, time off, holidays and placeholders. Details in Capacity permissions. |
| Cash & Capacity: Collections | View (global): receivables, ageing, DSO and the worklist for everyone. View own: customers they manage (customer admin) or collect for, and invoices where they are the sale agent. Create: log calls, notes, promises and disputes, and send a reminder now. Edit: pause, resume and stop reminders, and edit sequences, templates and customer rules. Delete: delete sequences and templates. |
| Cash & Capacity: Settings | View and Edit the settings page. API keys and the take-over of Perfex reminders are for administrators only. |
Cost and margin figures are never sent to the browser for staff without Profit access, not even hidden in the page. This applies on the project tab, the customer tab, the invoice strip, the planned cost and margin on the Capacity screens, and the Brain Pro widgets. The Client Value page needs Profit view, because a score reveals margin. Its payment columns also need Collections view; without it they show a lock.
Profit
Profit turns logged time into cost. For every finished task timer, the module multiplies the hours by the cost rate of that person on the day the timer started, then adds the overhead you set. Expenses linked to the project are added at their amount without tax. Running timers count once they stop. Non-billable hours cost the same as billable hours, because you still pay for them.
Cost rates and rate history
Profitability › Cost Rates lists every staff member with today's rate, where it comes from and its history.
- Own rate: a cost per hour that applies from a date. A new rate applies to time logged from its date on; earlier time keeps the rate of its day. Entering a rate for a date that already has one replaces it. You can also enter a rate for a future date (shown as Upcoming).
- From monthly salary: enter the monthly salary and the rate is the salary divided by Working hours per month (160 by default, in Settings › Profit).
- Role default: one rate per Perfex role, used for anyone in the role without a rate of their own. Perfex keeps no role history, so the person's current role is used.
- Import from CSV: one line per rate with
staff email, rate per hour, date it applies from (YYYY-MM-DD), up to 1 MB. Lines with an unknown email, a bad rate or a bad date are skipped and counted.
Rates are in your base currency. Saving or deleting a rate recalculates project costs.
Hours without a cost rate (fallback)
For time logged by someone with no own rate and no role rate for that day, Settings › Profit › Hours without a cost rate decides what happens:
- Use the staff hourly rate (default): the hourly rate on the Perfex staff profile.
- Use the default cost rate: one rate you set in Settings.
- Leave uncosted: the hours cost nothing and are counted as uncosted.
The screens warn you whenever this matters. They show a chip such as "12.5 h uncosted" and notices like "hours used the fallback rate", so a margin that is too good to be true does not go unnoticed.
Overhead
Overhead on labour is a percentage added on top of every labour cost to cover rent, software and other running costs. For example, 20% turns a 50.00 hour into 60.00.
Revenue and margin
Perfex has three billing types. The module works out what the work is worth for each one:
| Figure | In plain words |
|---|---|
| Invoiced (net) | Project invoices without tax, leaving out drafts and cancelled invoices, minus the project's credit notes. |
| Collected | Payments received on those invoices. |
| Earned — Fixed Rate | Project cost × project progress (Perfex's own progress, capped at 100%). |
| Earned — Project Hours | Billable hours × the project's hourly rate. |
| Earned — Task Hours | Billable hours on each task × that task's hourly rate. |
| Unbilled value | Hour-based projects: billable hours not yet billed × the rate. Fixed Rate: what is earned but not invoiced yet. |
| Recognised | A finished project counts what was invoiced. Any other project counts whichever is higher, invoiced or earned. |
Then:
- Cost = labour cost + project expenses + costs from other modules (see below)
- Margin = revenue − cost; Margin % = margin ÷ revenue (empty while revenue is zero)
- Earned per hour = revenue ÷ hours logged, which is what an hour really earned
Settings › Profit › Revenue used for margin picks Work done or invoiced, whichever is higher (recognised, the default) or Invoiced only. Both figures are always shown on the project's Profit tab. Billable expenses that you invoiced appear as revenue through the invoice and as cost through the expense, so they cancel out.
Costs from other modules (1.1.4). Another SellMyCode module can add its own costs to these margins. Perfex Sales Growth adds approved and paid sales commission, by the customer and project of the invoice it was earned on. Pending commission is never counted. When a commission payout also created a Perfex expense, that expense is left out, so the same money is never counted twice. These costs are in the base currency and appear as Costs From Other Modules on the project's Profit tab and in the cost cards.
Project lists use stored figures. These refresh within 15 minutes of a change (time, expense, invoice or payment) and fully every night; Recalculate Now refreshes everything at once. The project's own Profit tab always calculates live.
Project Profit tab
Every project gets a Profitability tab. It holds the live profit and loss card, revenue broken down by the rules above, the budget with its burn bars, a revenue and cost by month chart, a margin trend, cost by staff member and by task, and warnings for uncosted hours, running timers and items in another currency. You can switch the tab off in Settings.
Budgets and alerts
- Each project has an hours budget and a cost budget (labour plus expenses). On Automatic, the hours budget is the project's estimated hours and the cost budget is the project cost less your target margin. For example, a 10,000 project at a 30% target gets a 7,000 cost budget. Staff with Edit budgets can set either by hand.
- Hours burn = hours logged ÷ hours budget; cost burn = cost ÷ cost budget. Above 100% the project is marked Over budget.
- Cost at completion: from 10% progress on, the cost so far ÷ progress. Before that, the budget itself is shown.
- Alerts go out when a burn crosses a level on the way up: 75, 90 and 100% by default. You can set up to five levels between 1 and 999, globally or per project, and mute alerts per project. Each level is sent once per budget; saving a new budget starts the alerts again from zero.
- Who and how (Settings › Budgets and Alerts): project members who may see profit figures and/or administrators, by Perfex notification, email and, with Brain Pro installed, Brain Pro's Slack, Microsoft Teams and Telegram channels.
Customer and team views
- Profitability › Projects: summary cards and a sortable table with hours, revenue, cost, margin, margin %, hours and cost burn, and status chips, with filters for period, status, customer, currency and billing type. Includes CSV export.
- Profitability › Customers: per customer for the period, revenue (invoices dated in the period, net of tax, less credit notes, including invoices with no project), labour and expenses, margin, margin % and grade. Losing customers are listed first. Time logged on tasks linked directly to a customer counts as "Not in a project".
- Profitability › Team: per person, hours, billable %, cost, billable value (billable hours at the project or task rate) and contribution (billable value − labour cost).
- Periods: this or last month, quarter or year, the last 12 months, all time or a custom range.
Get Paid
Every invoice with a due date that is Unpaid, Partially paid or Overdue is picked up automatically. Drafts, customers you exclude and balances below the sequence's minimum are not. The invoice then follows a sequence of reminders timed around its due date. It stops by itself when the invoice is paid, cancelled or deleted, and starts again if a payment is deleted or a cancellation is undone. Partially paid invoices keep being chased for the remaining balance.
An invoice's collections status is one of Chasing, Paused, Promised, Disputed, Paid or Stopped. Reminders that were already due when an invoice was picked up are skipped, except the latest one, so a customer never gets several reminders on the same day.
Where you see it
- Invoice page: a collections strip showing status, next reminder, last contact, promise, dispute, expected payment, link opens and the customer's grade, with Send Now, Pause, Resume and Restart. A Reminders tab lists every message sent and its clicks.
- Customer profile: a Cash & Value tab with the score, profitability, open invoices with their status, average days late, on-time share, promises kept, disputes, the timeline and the customer's collection rules. The grade also appears next to the customer's name.
- Collections: the Worklist, Receivables, Sequences, Promises & Disputes and Activity tabs.
Customer collection rules
For each customer you can choose their own sequence, a collector, a pause until a date, which channels are allowed (email, SMS, WhatsApp), or Never send reminders with a reason for your team. A step on a channel that is not allowed becomes a call on the worklist. Whole customer groups can be excluded in Settings › Get Paid.
The collector of an invoice is chosen in this order: the customer's collector, the invoice's sale agent, the first customer admin, the default collector from Settings, and finally the first active administrator.
Sequences
A sequence is a list of steps. Each step runs a number of days before or after the due date, on a channel, in a tone (friendly, neutral, firm or final). Email steps can attach the invoice PDF and copy the sale agent. Any step can use AI wording. Per sequence you set a minimum balance worth chasing and whether weekend steps move to Monday. Exactly one sequence is the default for customers without their own. Three are installed and can be edited, duplicated or replaced:
| Sequence | Steps (day relative to the due date) |
|---|---|
| Standard (default) | −3 email, friendly · 0 email, neutral · +3 email, neutral · +10 SMS, firm · +21 call · +30 final email with the PDF, copied to the sale agent |
| Gentle (VIP) | −3 email, friendly · +7 email, friendly · +21 personal call |
| Strict | −5 email · 0 email with the PDF · +1 email, firm · +5 SMS, firm · +10 email with the PDF · +15 final email with the PDF, copied to the sale agent |
Reminders go out from the send hour (9:00 by default) on the weekdays you choose (Monday to Friday by default). Each cron run sends up to Reminders per cron run (50) to stay within your mail server's limits. Deleting a sequence moves its invoices to the default sequence. Changing an invoice's sequence continues from today, without sending steps whose date has passed.
Per invoice, staff can Send Now (with a preview and the option to edit the text), Skip Next Step, Pause (until a date, or until resumed), Resume, Stop Reminders and Restart Reminders.
Channels
| Channel | How it is sent |
|---|---|
| Through Perfex's own email settings (company SMTP, email header and footer) to the invoice's contacts that receive invoice emails, or else the primary contact. The PDF is attached from memory when the step asks for it. | |
| SMS | Through the SMS gateway active in Perfex: Twilio, Clickatell, MSG91 or any SMS gateway module that registers with Perfex's SMS feature. The number is the contact's phone, or else the customer's. With no active gateway, the step becomes a call on the worklist. |
Sent automatically through WhatsBot or the WhatsApp Cloud API Business Integration module (both sold separately) with a template Meta has approved, picked for the step. Otherwise the step becomes a worklist task with a ready-made wa.me chat link holding the reminder text: a staff member clicks Open WhatsApp and presses send. See WhatsApp. | |
| Call | A worklist task for the collector with the call notes from the template. |
A step that cannot be delivered, for example because no contact has an email address, no phone number is on file or the channel is switched off for the customer, becomes a worklist task. The task says why. Failed sends are listed on the worklist, where you can resend or dismiss them. Sends are never retried blindly, so a customer is not reminded twice.
WhatsApp only lets a business start a conversation with a message template that Meta has approved. The module therefore sends WhatsApp steps automatically only through a WhatsApp module that holds your WhatsApp Business account and its approved templates:
| Module | What it needs |
|---|---|
| WhatsBot (Corbital) | Active, with your WhatsApp Business account connected and the templates loaded in WhatsBot. |
| WhatsApp Cloud API Business Integration | Active, with the phone number ID and access token filled in and the templates synced in that module. |
Both modules are sold separately. Cash & Capacity uses the credentials and templates they store and sends each message itself, straight to Meta's WhatsApp Cloud API (graph.facebook.com). The access token stays on your server and is never shown in the browser or written to a log.
Settings › Get Paid › WhatsApp (administrators): Automatic uses WhatsBot, or else the WhatsApp Cloud API module, whichever is connected; you can also name one of them, choose Chat link task to never send automatically, or Off. The same section lists the WhatsApp modules found, whether they are connected and how many approved templates they have. Default country code is added to phone numbers saved without one (a leading 0 is dropped), so 020 7946 0958 with 44 becomes +44 20 7946 0958.
In the sequence editor, a WhatsApp step shows Approved WhatsApp template: pick a template (name and language; only approved ones are listed) and choose a merge field for each variable of its header and text, {{1}}, {{2}} or named ones, such as the contact's name, the invoice number, the balance, the due date, days overdue, the pay link, the response link or your company name. If the template has a button with a variable link, choose what fills it, usually {pay_link}: set the button's URL in Meta to your CRM address followed by {{1}} (for example https://crm.example.com/{{1}}), and the rest of the pay link is filled in. Preview shows the template as the customer reads it. Templates with an image, video or document header, and one-time-password, copy-code or flow buttons, are listed but cannot be picked. AI wording does not apply to WhatsApp templates.
The step's own subject and text are still kept: they are used for the chat-link task when the template cannot be sent. That happens, with the reason on the task, when no WhatsApp module is connected, no template is picked, the number is not a valid international number, the wording was edited in Send Now, or WhatsApp refuses the message (template not approved or paused, invalid number, expired access token, a WhatsApp error). The message id Meta returns and any error code are kept with the message in Collections › Activity. Sending hours, the daily limit, the customer's allowed channels, stopping when paid and the one-send-per-step rule all apply as for email and SMS.
Templates and merge fields
Each step has a text per language: email steps take HTML, SMS and WhatsApp steps take plain text and calls take notes. A customer gets the text in their contact's language, then the customer's language, then the default text. The editor has a merge-field picker and a preview filled in from a real invoice. All Perfex invoice and customer merge fields work too, plus:
| Merge field | Value |
|---|---|
{pay_link} | Tracked link to the invoice's own Perfex payment page (see below) |
{respond_link} | The customer response page: promise a date or report a problem |
{invoice_number} {invoice_total} {invoice_balance} {invoice_due_date} | The invoice; the balance is what is left to pay |
{days_overdue} {days_until_due} | Days past or until the due date |
{statement_total} | The customer's total open balance in the invoice currency |
{client_company} {contact_firstname} {contact_lastname} | The customer and contact |
{company_name} {staff_name} {staff_email} | Your company and the invoice's sale agent |
{promise_date} {promise_amount} | Filled in after a promise to pay |
Templates for the three ready-made sequences are installed in English and in each of the module's other eight languages that your Perfex has. Other languages can be added in the editor with Save … Version.
Pay link and customer response page
{pay_link}records the click on the message and the invoice, then opens the invoice's own Perfex page. There the customer pays with the payment gateways you already have, so the module contains no payment code. With Track pay link clicks off it is the plain invoice link. With Use short links on, Perfex's Bitly short link is used as the destination when one is set up.{respond_link}opens a small page in the customer's language. It shows the invoice number, dates, total and balance, with three choices: Pay Now, I will pay on… (a date up to Latest promise date ahead, 30 days by default, an optional partial amount and a note) and Something is wrong (a reason, details, name and email). If the response page is switched off, the link falls back to the pay link.- Links contain a signed token that opens only that one invoice. Only a hash of the token is stored. The page shows nothing beyond that invoice, is kept out of search engines and referrers, and uses CSRF protection, a hidden honeypot field and a limit of 10 replies per hour. Paid or cancelled invoices show "nothing to do".
- A payment within 7 days of a link being opened is counted as paid after the link.
Promises to pay and disputes
- A promise comes from the customer on the response page, or is logged by staff after a call. Reminders pause until the promised date, the collector is notified and the promise is written to the invoice's activity log.
- The promise is kept when the balance (or the promised part) is paid. It is broken when nothing has arrived by the promised date plus the grace days (2 by default). Reminders then start again, and a "Promise broken" call appears on the worklist for the collector.
- A dispute (wrong amount, not received, not happy with the work, already paid, something else) stops the reminders. It notifies the collector and the staff chosen under Tell about new disputes, and is written to the invoice's activity log. Staff close it as Resolved or Rejected, with a resolution, and can restart the reminders.
- Collections › Promises & Disputes lists both with filters and shows the share of promises kept.
Taking over Perfex's own reminders
Perfex can send its own due and overdue reminders. To make sure customers are never reminded twice, an administrator can switch on Settings › Get Paid › Take over Perfex invoice reminders (a confirmation is asked).
- Every invoice the module chases gets Perfex's own per-invoice setting Prevent sending overdue reminders ticked. You can see it on the invoice, and no Perfex option is changed. Perfex skips both its due and overdue notices for such invoices.
- The module first remembers each invoice's original setting. It gives that setting back when you switch take-over off, when the invoice stops being chased (paid, cancelled, excluded customer) and when the module is uninstalled.
- Settings shows how many open invoices are chased by the module and how many still get Perfex's reminders.
With take-over off, both systems can send reminders. Then either switch off Perfex's reminders or leave invoices to one of the two.
Worklist
Collections › Worklist is the daily to-do list, shown as Mine or Everyone and filtered by currency. Items are grouped:
- Calls and Messages: calls, WhatsApp chat-link tasks and reminders that need a person
- AI Wording to Approve: reworded reminders waiting for a go-ahead
- Broken Promises, Disputes and Promises Due (check that the payment arrived)
- No Contact for 14 Days: overdue invoices nobody has been in touch about, largest first
- Failed Sends: reminders that did not go out
Each item shows the customer, invoice, balance, days late, last contact and grade. Actions: Done, Log Call (outcome and note), Add Promise, Log Dispute, Pause, Send Now, Snooze (hide from the worklist until a date while reminders keep running), Resend or Dismiss, and Open Invoice.
AR ageing, DSO and the cash-in forecast
- AR ageing: open balances (after payments and applied credits) by days past due: Not due, 1–30, 31–60, 61–90 and 90+ days. Shown per currency, per customer and expandable to the invoices, with the collections status, next reminder and expected payment. Ageing and invoice lists export to CSV.
- DSO (days sales outstanding) uses the count-back method by default. It takes today's receivables and walks back month by month, subtracting each month's invoiced total until the receivables are used up. The days covered are the DSO. The Simple method is receivables ÷ invoiced in the last 90 days × 90. A 12-month DSO trend is shown with it.
- Expected payment date per open invoice: the promised date when there is a promise. Otherwise it is the due date plus the customer's usual delay, which is the amount-weighted median days late of their last 10 paid invoices (at least 3 are needed), or the company-wide median for newer customers. It is recalculated every night.
- Cash-in forecast: the expected payments over the next 8 weeks, by week, on the Overview and Receivables pages. Amounts already past their expected date, and those later than 8 weeks, are shown separately.
AI wording (optional)
AI can reword a reminder for the customer's situation and language. Switch it on in Settings › AI Wording, then choose the account:
- Use Brain Pro's AI settings, when Perfex Brain Pro is installed with a key; or
- Use the settings below: OpenAI, Anthropic, Google Gemini or any OpenAI-compatible server (https, or http only to a model on the same server), a model and an API key. The key is stored encrypted, never shown again and removed if you change the provider or server address.
Turn on AI wording on the sequence steps you want reworded. With Draft for approval (the default), the reworded text waits on the worklist under AI Wording to Approve; Approve and Send sends it, Discard drops it. With Send automatically it goes out directly. Rewrite with AI is also available in the template editor and when sending by hand. Who to Chase First on the worklist suggests an order for today's list, cached for the day. A daily limit (50 requests by default) keeps costs predictable. When the limit is reached, or the provider fails, the plain template is sent: AI never blocks a reminder.
{placeholders}, the tone, how late the invoice is, the balance and a summary of how the customer usually pays. It never receives names, email addresses, phone numbers, links or invoice lines. The merge fields are filled in afterwards on your server. A reply that drops {pay_link} or {respond_link} is refused and the template is used instead. For "Who to Chase First", only invoice numbers, amounts, days late and payment history are shared.Capacity
Capacity plans who works on what in the weeks ahead and compares it with the hours people really have. You book people (or placeholder roles) on projects, or tentatively on work you have not won yet, on a weekly schedule. The module then shows who is over-allocated, who is free, planned against actual utilisation and, for staff who may see profit, the planned cost, revenue and margin. It lives under Cash & Capacity › Capacity with five tabs: Schedule, Projects, Utilisation, Forecast & Who's Free and Time Off & Hours.
All figures are measured against available hours: working hours minus company holidays minus time off. Leave therefore never lowers anyone's utilisation.
Working hours and holidays
- Default working hours (Settings › Capacity): hours per weekday for everyone, 8 hours Monday to Friday out of the box. The same section sets the billable utilisation target (75% by default), the day weeks start on, how many weeks the schedule opens with, whether tentative work counts in the week colours, and roles kept off the board (for example drivers or external accounts).
- Working hours per person (Capacity › Time Off & Hours): hours for each weekday from a date on, such as a four-day week. A change applies from its date until the next one, so the history is kept.
- People on the Board: switch off people who should never be planned, add skills for the Who's Free finder, and give someone their own target instead of the company one.
- Company holidays: a whole day or part of a day (hours off), for everyone or for one department. Import them from a CSV file (
date,namewith the date as YYYY-MM-DD, optionally a third column with hours off) or an iCalendar file (.ics) exported from a holiday calendar; all-day events are read and multi-day events become one holiday per day. Days that already have a holiday are skipped. Files can be up to 1 MB.
Time off and the Timesheets & Leave module
- Time off entered in the module has a type (vacation, sick leave, personal, training or other) and covers full days or some hours a day. Staff with Create can enter their own; entering time off for others needs Edit with View (global).
- If the Timesheets & Leave module is installed, its approved leave requests and its holidays are read automatically. With the HRM module, its holidays and paid leave hours are read too. Imported entries are shown with their source and are read only: nothing is ever written back. Each source can be switched off under Settings › Capacity; a source whose module is not active is simply skipped.
- Time off wins: a day without available hours (a holiday or a full day of leave) gets no booked hours. A booking that crosses such days is flagged with the hours it lost. A part day (a half-day holiday, four hours of leave) keeps the booking's hours, so it shows up as over-allocation instead.
Bookings and placeholders
- A booking puts one person or placeholder on one piece of work for a date range (up to 366 days), as hours per day (0.25–24) or total hours (0.25–5,000) spread evenly over the days the person is available.
- The work is a project (not started, in progress or on hold), or tentative work: an estimate, a proposal, a lead or any name you type. Each booking is Confirmed or Tentative and billable or not, with an optional note. Tentative bookings are hatched on the board and counted apart everywhere.
- Placeholders such as "Unassigned Designer" book work for someone you have not picked or hired yet. They have a role, a department, skills and a cost per hour (empty uses the role's default cost rate). They follow the default working hours and company holidays. A placeholder that still has bookings is archived instead of deleted, so its bookings stay on the board.
- Won Work to Confirm: when an estimate with tentative bookings is accepted or becomes a project, a proposal is accepted, or a lead becomes a customer, the schedule and the Projects tab suggest confirming those bookings. The person who booked tentative work on an estimate or proposal also gets a Perfex notification when it is accepted. Nothing is confirmed automatically; Confirm does it in one click.
Schedule board
The Schedule tab shows one row per person (placeholders at the bottom), grouped by department or role, with one column per week. Each bar is a booking with its hours per day.
- Drag a bar to move it, pull its edges to resize it, or drop it on another person to reassign it. Click an empty spot to add a booking there, or click a bar to edit every field in a side panel. Bars are buttons, so the panel also opens from the keyboard.
- Each person-week is coloured by booked hours against available hours: below the target, at or above the target, or over-allocated. By default only confirmed work colours a week (Settings › Capacity can add tentative work). Holidays and leave are shaded, and a line marks today.
- Toolbar: previous, today and next; 4, 8, 12 or 26 weeks; Weeks or Days zoom (Days shows up to 8 weeks at a time); search people or skills; filters for department, role, customer and project; grouping; and show or hide tentative work.
- Summary cards above the board give available, booked, free and tentative hours and the hours on placeholders. A totals row gives utilisation per week. Planned revenue, cost and margin appear only for staff who may see them (see Planned margin).
- On phones, and with the List button, the board becomes a read-only list per person and week.
- Two people can plan at the same time safely: each change is checked against the version it was made on. If someone else changed the booking a moment earlier, the board puts the bar back where it really is and says so, instead of overwriting their change.
Conflicts
Overlapping bookings are allowed and flagged, never refused. The Conflicts list under the board names each one:
| Conflict | When |
|---|---|
| Over-allocated | Confirmed work in a week is more than the person's available hours. |
| Over-allocated with tentative work | Confirmed work fits, but confirmed plus tentative work does not. |
| On time off | A booking overlaps the person's leave or a holiday; the hours it lost are shown. |
| Not on the board | A booking belongs to someone who is no longer planned (inactive, switched off or in an excluded role). |
Over-allocated person-weeks also appear in the Overview's Needs Attention list. On the Projects tab, a project is marked Plan over budget when the hours logged so far plus the confirmed hours ahead exceed its budget hours from Profitability.
Utilisation
- Planned = confirmed bookings; actual = finished task timers (the same hours Profit uses). Both are shown as a share of the available hours, with planned billable % and actual billable % (timers on billable tasks) against each person's target.
- Pick a period and group by person, department or role. Columns: available, time off, planned, planned %, planned billable %, actual, actual %, actual billable %, target and the difference between actual and planned. Export to CSV. While a period is still running, actual is compared with what was available and planned up to today.
- Projects tab: per project, budget hours, hours logged, confirmed hours ahead, hours at completion against the budget, tentative hours and people, plus the tentative pipeline of estimates, proposals, leads and named work.
- The project's own Capacity section sits inside its Profitability tab: budget hours, confirmed hours ahead, hours at completion, planned margin, a planned against actual chart by week (8 weeks back, 12 ahead) and the people on it. Staff with Capacity but no Profit access see the same tab named Capacity with only this section.
- The Overview gets a card with the team's planned utilisation for the next four weeks and the hours still free (your own figures with View own).
Forecast and Who's Free
- The forecast shows free hours (available minus confirmed bookings) per person and week for the next 4, 8 or 12 weeks, with department or role subtotals and a company row. Tick Count tentative work as booked to subtract tentative work as well.
- Who Is Free? takes a date range, the hours the work needs and optionally a role, department and skill. People with enough free hours come first, with their free hours per week. Book opens the schedule with the booking filled in.
Planned cost, revenue and margin
- Planned cost = booked hours × the person's cost rate on that day × (1 + overhead), from the same cost rates Profit uses. Placeholders use their own cost per hour or the role's default rate.
- Planned revenue uses the project's billing: the project hourly rate (Project Hours), the average rate of its billable tasks (Task Hours), or the project cost spread over its budget or booked hours (Fixed Rate). For tentative work, the estimate or proposal subtotal or the lead value is spread over the hours booked on it; typed work has no rate. Tentative money is shown apart, and only the base currency is used.
- These figures follow the Profit permission per project: staff without it never receive them. Totals across projects need Profit View (global).
Capacity permissions
| Capability | Grants |
|---|---|
| View (global) | Everyone's schedule, utilisation, forecast and time off. |
| View own | Their own row (with week colours and time off) and the bookings on projects they are a member of; their own utilisation and forecast; the Capacity section of their projects. |
| Create | Add bookings (with only View own: for themselves or on their own projects) and their own time off. |
| Edit | Move, resize, reassign, edit and confirm bookings. Together with View (global): others' time off, holidays, working hours, placeholders and people settings. |
| Delete | Delete bookings, time off, holidays and placeholders. |
Only staff with View (global) can book placeholders.
Client Value Score
Every night each customer with an invoice in the last 12 months (History used for the score) gets a score from 0 to 100 and a grade. The score is built from four components, each scored 0–100:
| Component | Default weight | How it is scored |
|---|---|---|
| Margin | 35 | 100 at your target margin + 10 points or more, 0 at 0% or below, in a straight line between. Left out when the customer has no time or expenses recorded, is not billed in the base currency, or has more than half of their hours without a cost rate. |
| Payment | 30 | Average days late, weighted by amount, over invoices paid in the window plus open overdue invoices counted to today. 0 days scores 100, 45 days or more scores 0. Needs at least 2 such invoices. |
| Revenue | 20 | Where the customer's revenue in the window ranks among your base-currency customers (percentile). |
| Reliability | 15 | 100 − 25 per broken promise − 30 per open dispute − 15 per rejected dispute, never below 0. |
The score is the weighted average of the components that have enough data; a missing component's weight is shared by the others. A customer needs at least two of margin, payment and revenue to get a score, so reliability alone never makes one. The default weights are 35 / 30 / 20 / 15. Change them under Settings › Client Value Score › Score weights: four whole numbers from 0 to 100 that add up to 100. After new score settings are saved, the next cron run scores every customer again.
Grades: A from 80 (profitable and pays on time), B from 65, C from 50, D below 50.
Quadrants: Grow, Fix or Fire
Customers with both margin and payment data are placed on a chart of margin % against average days late. Bubble size shows revenue; click a bubble to open the customer. The dashed lines are your target margin and Still a good payer up to (7 days late by default).
| Quadrant | Meaning | Recommendation |
|---|---|---|
| Grow | Good margin, pays on time | Offer more work, a retainer or a bigger package. |
| Fix Price | Pays on time, low margin | Raise prices by the amount shown to reach your target, or cut scope and unbilled hours. |
| Fix Payment | Good margin, pays late | Ask for a 30–50% deposit on new work, shorten payment terms, use stricter reminders. |
| Fire | Low margin and pays late | Reprice with payment up front, or plan to wind the work down. |
The Client Value page shows the grade split, the chart and a table with grade, score, last month's score, quadrant, components, margin %, revenue, average days late, on-time %, DSO, broken promises and disputes. You can search, filter, sort and export it. Each customer has a "What To Do" line with buttons such as New Proposal, Project Margins, Collection Rules and Use Strict Reminders. The last one moves the customer and their open invoices to the Strict sequence. Scores are kept by month for the trend. Recalculate scores everyone at once.
Perfex Brain Pro integration
Perfex Brain Pro is our dashboards and analytics module. It is sold separately and not required. When it is installed, Cash & Capacity adds a Cash & Capacity provider with 25 widgets. They respect the same permissions and support drill-down:
- Profit: Gross Margin, Margin %, Revenue vs Cost, Margin by Customer, Project P&L, Budgets at Risk
- Get Paid: Receivables, Receivables Ageing, Days Sales Outstanding, DSO Trend, Expected Cash-In (next 8 weeks), Promises Kept, Open Promises to Pay, Open Disputes, Collections To Do, Collections Worklist
- Capacity: Team Utilisation, Planned vs Actual; Booked, Next 4 Weeks; Free Capacity Ahead; Over-allocated People; Booked Hours by Project; Tentative Pipeline Hours
- Client Value: Customers by Grade, Grow, Fix or Fire, Customers to Rethink
It also adds two ready dashboard templates, Cash & Capacity for owners, finance and project managers and Team Capacity for resource managers and team leads, and four record types for Brain Pro's Custom Metrics: Payment Reminders, Promises to Pay, Invoice Disputes and Client Value Scores. The Capacity widgets need the Capacity permission, show hours only (never cost), and My data narrows them to the viewer's own row and projects. Budget alerts can go to Brain Pro's Slack, Teams and Telegram channels, AI wording can reuse Brain Pro's AI settings, and both modules share the same light or dark theme.
Cron
The module runs on the standard Perfex cron (Setup › Settings › Cron Job). Every run keeps invoice tracking in sync, checks promises, sends due reminders (only when Send reminders is on and within the send hours), refreshes changed project figures and checks budget alerts. Once a night it also recalculates every project, the scores, expected payment dates and DSO, and prunes the run log (90 days). A lock stops two overlapping runs, and each job runs on its own, so one failing job never stops the others. Settings › General shows when the cron last ran.
Capacity needs no cron job: the schedule, utilisation, forecast and conflicts are worked out when a page opens, and the notification for won work goes out when the estimate or proposal is accepted.
Languages and theme
The interface ships in English, Spanish, Portuguese (Brazil), French, German, Italian, Dutch, Turkish and Russian, and follows each staff member's Perfex language. To add another language, copy language/english/ inside the module to a folder named like the Perfex language and translate the values. The ready-made reminder templates are installed in English plus a translated version for each of these languages your Perfex has, so customers get reminders in their contact's language. Other languages can be added per step in the sequence editor with Save … Version. Light, dark and follow-the-device themes are available (Settings › General). With Brain Pro installed, the theme follows Brain Pro's.
Multi-tenant (Perfex SaaS)
- All tables and settings live in each tenant's own database or table prefix. The module installs and upgrades itself per tenant on its first admin page.
- Each tenant gets its own secret for customer links, and links use the tenant's own address.
- No files are written: PDFs are attached from memory and CSV exports are streamed.
- Reminders, alerts and scores run from each tenant's own Perfex cron, with a lock per tenant.
One setup is not supported: a SaaS option that keeps all tenants in one shared database while Perfex still uses the master table prefix. Inside such tenants the module switches itself off and its pages explain why. Use one database (or prefix) per tenant instead.
Uninstalling
Uninstalling always gives every invoice its own Perfex reminder setting back. By default your cost rates, budgets, sequences, bookings, time off and history are kept for a reinstall, and links already sent to customers keep working. To remove everything, switch on Settings › General › Delete all data on uninstall first.
Troubleshooting
| Problem | What to do |
|---|---|
| No reminders are sent | Check that Send reminders is on, the cron runs (Settings › General), and the current hour and weekday are within the send window. Look at Collections › Activity and the worklist's Failed Sends. |
| Customers get two reminders | Perfex's own reminders are still on. Switch on take-over, or turn off Perfex's reminders. |
| WhatsApp steps become chat-link tasks | Check Settings › Get Paid › WhatsApp: a WhatsApp module must be listed as connected and the step needs an approved template. The task says why it was not sent; an expired access token is renewed in the WhatsApp module. |
| SMS steps turn into calls | No SMS gateway is active in Perfex, or the contact and customer have no phone number. |
| Margins look too high | Look for the "uncosted hours" chip and the fallback notice. Add cost rates for the people concerned, or set the fallback in Settings › Profit. |
| A project has no margin | It is billed in a currency other than the base currency. See the currency rule. |
| A customer has no score | A score needs two of margin, payment and revenue in the window. The customer's line says which data is missing. |
| Figures look out of date | Lists refresh within 15 minutes and every night. Use Recalculate Now on Profitability or Recalculate on Client Value. |
| Someone is missing from the schedule | Inactive staff, staff marked Not Staff Member, people switched off under Capacity › Time Off & Hours › People on the Board and roles in Roles kept off the board (Settings › Capacity) are not planned. Staff with only View own see their own row and their projects' bookings. |
| Leave from Timesheets & Leave does not show | Only approved leave requests are read. Check that the module is active and that Read approved leave from Timesheets & Leave is on in Settings › Capacity; Time Off & Hours shows each source as used, switched off or not installed. |
| A booking shows fewer hours than entered | Time off wins: days with a holiday or a full day of leave get no hours, and the bar is flagged with the hours it lost. A total-hours booking is spread over the days the person is available. |
| "Someone else changed this booking" | Another user changed or moved the same booking first. The board shows it where it really is now; make your change again. |
| No planned cost, revenue or margin on the schedule | These need the Profit permission for that project (totals need Profit View global). Revenue needs a bill rate: a project hourly rate, task rates, a fixed project cost, or an estimate, proposal or lead value; projects in another currency show cost only. |
| Anything else | Open a request on the support page. Include your Perfex and PHP versions and a screenshot of Settings › General. |