Platform · Agency operations
Service checkout, a branded client portal, delivery tracking, helpdesk and billing for an agency that sells productized services.
Introduction
Agencies that sell productized services — link building, SEO, content, editing — tend to run on a patchwork: a form here, an invoice there, status updates by email, and a spreadsheet holding it together. ClientDesk replaces the patchwork with one platform. Clients order from service pages that are also the checkout, track delivery and approve work in a branded portal, and pay through subscriptions with automatic dunning; the agency runs orders, helpdesk and reporting from a role-gated admin, with margin visible to the agency and never to the client.
Details
The console an agency runs its orders, clients and money from, rebuilt here in code from its own screens. Pick a page, or click the sidebar.
The ops dashboard is put together panel by panel from the viewer’s role: the month’s revenue and margin, whose move each open order is waiting on, what is past its promise, and how loaded each person on the team is.
Recreated from the admin’s interface. Labels, columns and statuses are ClientDesk’s own; the agency, clients, people, orders and figures are samples.
The workings behind the admin and the portal, at full size.
Order flow
Nobody sets an order’s status by hand. The brief, Start order, a hand-over, the client’s answer and Cancel move it, and the agency can rename and recolour each one.
Time
Each order counts down to its due date and splits the time spent with the team from the time spent waiting on the client.
Helpdesk
The first reply is due within a set number of hours, and the clock stops while a ticket is pending on the client.
Client portal
In the portal the client approves a hand-over or asks for a revision. One nobody answers is approved automatically after seven days.
Messages
Staff price a custom bundle inside a conversation; accepting it raises the invoice and paying it places the order.
Roles
Each role is a set of grants the sidebar and the server both read, so the menu and the door never disagree. Agencies can add their own.
Store
Pricing model and billing cycle are two separate choices, so a service can be tiered and one-time, or fixed and monthly.
Service pages with packages, add-ons, volume pricing and coupons, priced on the server, with the brief collected in the portal once the order is paid.
Six order statuses that follow the work, client approval or a revision request on each hand-over, and a helpdesk whose response clock pauses while waiting on the client.
Recurring invoices charged to a saved card with automatic retries, invoices in the portal, and margin reporting that never exposes cost to clients.
The running parts
The hard parts
Every request opens a transaction that names its tenant, and row-level security filters on it; with no tenant set, a query returns nothing. The API connects as a role that cannot bypass the policies, and refuses to start in production as one that can.
Responses are built against a whitelist of fields, and the version with cost in it is chosen only for staff allowed to see finance. Portal queries never select cost, and a test walks every response looking for anything named cost or margin.
When a ticket is waiting on the client, the clock stops. When it resumes, the due time moves by exactly the length of the pause — or by the open time left, when business hours are on.
The platform keeps its own renewal clock and raises one invoice per cycle, which the database enforces. The saved card is charged with a key unique to that invoice and attempt; a failed charge is retried on days one, three and five before the plan is paused.
A single function applies base price, add-ons, volume discount, promo and credit in that order, for the checkout and the server alike. Payment can be confirmed by the return page, a webhook or a reconcile job, and a row lock makes sure it counts once.
Start here
Tell us what is slow, manual or missing. You will hear back within one working day — then get a written scope and a fixed quote, or an honest no.