Platform
Customers, projects and clients
See what your AI spend costs per customer and what margin each one leaves, and, for client work, run projects for clients, share progress with them through the client portal, and see each project's AI cost.
Token Meter has two related areas:
- Customers (
/customers) is for products that serve many end customers. It lists every customer your calls are tagged with, their AI cost, and the margin left after the revenue you enter. It is in team workspaces, for owners and admins. - Projects (
/projects) and Clients (/clients) are for client work: agencies, studios and freelancers who do projects for clients. Each project belongs to one client, can be shared with that client's contacts through the client portal, and can show the project's AI cost and margin. They are in solo workspaces and, where client work is switched on, in team workspaces.
Don't see Projects and Clients?
They appear in the sidebar only where client work is switched on for your workspace.Customers and margin
Where customers come from
A customer appears on /customers as soon as usage tagged with its customer_ref arrives for the month you are viewing. There is no list to create first. To tag calls with a customer, see Attribution; use an opaque id, not an email or a name. Usage without a customer still counts in every other total, but it is not listed here.
Until the first tagged call arrives the page shows No customer-tagged traffic yet with a snippet to copy.
The customer list
The page shows one month at a time; use the month arrows at the top to move between months.
| Tile | What it shows |
|---|---|
| Revenue (costed customers) | The revenue you entered for this month, summed over the listed customers that have revenue. The hint counts them. |
| Cost (all customers) | AI cost of every listed customer this month. The hint gives the part that belongs to customers with revenue. |
| Margin | Revenue minus cost for customers with revenue, labelled confirmed, a range, or not yet reconciled (see below). |
| Margin-negative | Customers whose cost this month is higher than their revenue. The hint counts customers without revenue. |
| Successful calls | Calls that succeeded, out of all calls, with the number that failed. |
| Unpriced events | Events Token Meter could not price, and events with partial usage. Their cost is not in the totals. |
The table lists Customer, Last seen, Events, Cost and Margin, and every column sorts. A customer without revenue for the month shows no revenue entered and an Add revenue link instead of a margin. The “confirmed through” label above the table is the last day whose figures are confirmed.
If your workspace is over its plan's usage limit and the grace period has ended, Customers shows the current month only.
Enter revenue
Revenue is one number per customer per month, in USD: what you charge the customer, not what they cost you. Token Meter does not read it from a billing system.
- One customer: open the customer and use Enter revenue (Month, Revenue (USD), Save).
- Many customers: on
/customerschoose Import revenue and paste rows ofcustomer_ref,month,revenue_usd, month asYYYY-MM:
customer_ref,month,revenue_usd
acme,2026-08,4200
nimbus-logistics,2026-08,5200The header row is optional. Rows with a bad month or amount are skipped, and the page reports how many were imported and skipped. Entering a month that already has revenue replaces it. The import is all or nothing: either every valid row is saved or none is.
A customer's page
Click a customer to open its page:
- Margin this month, with revenue, cost and one sentence on how sure the figure is. Without revenue for the current month it asks you to add it.
- Cost trend for the last 30, 90 or 180 days. Solid means provider-confirmed events; hatched (≈) is estimated.
- Requests: the newest 25 calls tagged with this customer, including today, with a link to the full list in Requests.
- Top actions: the 10 most expensive
actionnames for this customer, with events, traces, average cost per trace and errors. - Revenue history: the last 12 months of revenue you entered, with when it was last changed.
How customer margin works
Margin is revenue minus the customer's AI cost for the month. Providers don't say which of your customers an invoice line belongs to, so Token Meter checks your metered cost against your providers' bills for the month (see AI Bill) and labels the margin with one of three states:
| State | When | What is shown |
|---|---|---|
| confirmed | Billing was reconciled for the month and metered cost is within tolerance of the bill. | One figure. |
| range (coverage gap) | The bill is higher than metered cost by more than the tolerance. | A range. The high end assumes none of the unmetered spend is this customer's (revenue − cost). The low end assumes all of it is (revenue − cost ÷ coverage ratio). |
| not yet reconciled | No reconciliation has run for the month, or metered and billed totals are too far apart to compare. | One figure, revenue − cost, never labelled confirmed. |
The coverage ratio is one workspace-wide number (metered cost ÷ billed cost for the month), applied to every customer the same way.
Clients and contacts
A client is a person or company you do work for. Owners and admins manage clients on /clients.
- Choose Add client, enter the Client name and, optionally, a First project.
- On the client's page, add contacts under Contacts: Name, Email, and optionally Give access to a project with a Role on that project (Guest (can view) or Approver (can approve requests)). A contact added without a project receives no email.
Each contact shows where their invitation stands: No invitation yet, Queued, Retrying, Sent, Opened (with the date last viewed), Link expired, Not delivered, Not sent, Email bounced or Access ended.
- Archive a contact to end their access to every project at once. Adding the same address to the same client again brings them back as a new invite.
- Anonymise removes the contact's name and email. Their past comments and approvals stay, shown as “Former contact”.
- Archive client archives all its contacts and ends their access to every project.
An email address can belong to one contact in the workspace.
Projects
Every project belongs to one client. Nothing in a project is visible to the client until you publish it.
Create a project
On /projects choose New project, enter a Title, choose the Client and optionally a Target date. Without a client yet, the page asks you to add one first. Use Edit details on the project to change its title, description, target date, status (Draft, Active, On hold, Completed, Archived) and health (On track, Needs client input, At risk, Completed). These are shown to the client, so a project lead or an admin changes them.
The project list puts at-risk projects first and shows Active, At risk, Needs client and Drafts waiting counts.
The project tabs
- Delivery: Milestones (internal until you choose Show to client), Updates (saved as drafts; Publish to client when ready; a published update is read-only until you Unpublish it), and Deliverables (links to staging sites, designs, documents, pull requests and demos, each published separately; links must be https).
- Client: Client access (grant, resend or revoke), Requests and General discussion. Only people who can publish to the client see this tab.
- Integrations: linked GitHub repositories and the AI cost mapping rules (see below). Linking a repository reads only activity counts: no code, diffs or commit messages. With linked repositories you can draft an update from pull requests merged in the last 30 days; it is saved as a draft.
- Financials: quote, invoicing, expenses and margin. Only people with the owner, CTO or CFO billing role see it.
- Team and notes: internal notes (never shown to clients), the project team, and Archive project.
Requests
On the Client tab choose New request and pick what it is:
- Approval of something they can see: needs a published update, published link or client-visible milestone as its subject, and at least one contact with the Approver role.
- A decision I need from them, or Feedback: a subject is optional.
Approvers are emailed when the request is sent and get reminders while it stays pending. An approval is tied to the exact content it was sent with: if you edit, unpublish or hide that content, or archive the project, the pending request is withdrawn, and the client sees it as withdrawn. You can also Withdraw request yourself.
Your replies in a request or in General discussion are visible to the client, and the contacts concerned get an email saying there is a reply (at most one per contact per project per hour). The email carries no message text and no sign-in link. Client responses and comments reach you in a digest email.
Project members
Owners and admins open every project. In team workspaces, anyone else needs a role on the project, set by an admin on Team and notes with Add to project:
- Contributor edits the working content: internal milestones, update drafts, deliverable links and notes.
- Lead also publishes to the client, manages client access and requests, edits the project details and AI cost rules, and unlinks repositories.
Members without a role on a project don't see it in the list. Money is never part of a project role.
Live refresh
An open project page checks for changes every 20 seconds while the tab is visible and reloads its data when a client answers a request, writes a message or opens their invitation. Nothing reloads otherwise, so a form you are filling in is left alone.
Project AI cost and margin
Connect a project to your usage
On Integrations › AI cost mapping, choose Add rule:
| Rule type | Matches |
|---|---|
| Project tag | Usage sent with that project tag. |
| Customer reference | Usage sent with that customer_ref. |
See Attribution for how to set these tags. A tag or customer reference can belong to one project in the workspace, so the same usage is never counted twice. A linked GitHub repository adds an estimated cost: each person's vendor-reported daily spend spread over the repositories they committed to that day. It is a separate source from tagged usage, so spend that appears in both is counted in both.
Record the money
On Financials, under Quote, invoicing and labour: Currency, Quoted, Invoiced, Received, Exchange rate to USD (not needed for USD), Rate as of, Estimated hours, Hourly rate, and the AI usage from and to dates. Leave the dates blank to count AI cost from the day the project was created until today. Add expenses with a category, amount, kind (Measured, a real receipt, or Estimated), date and note. Every change is recorded with its before and after values, and removing an expense is recorded rather than deleted. The currency can't change while expenses are recorded in it.
How project margin is computed
- Revenue is the most reliable figure you recorded: received, else invoiced, else quoted, converted to USD with your exchange rate.
- Cost is the AI cost tagged to the project, plus the estimate from linked repositories, plus expenses, plus estimated labour (hours × hourly rate).
- Unattributed AI cost (usage in the window that no project's rule claims) is not in the figure. It is shown beside it and turns the figure into a range: at best none of it belongs to this project, at worst all of it does.
| Label | Meaning |
|---|---|
| Strong | Everything is measured: no repository estimate, no estimated expenses or labour, revenue is not just a quote on an unfinished project, the currency is USD, and nothing is unattributed. |
| Estimated | A figure, with the reasons it is not Strong listed underneath. |
| Incomplete | No figure. The panel lists what is missing: revenue, a rule (tag, customer reference or linked repository), or an exchange rate. |
The client portal
The client portal is a separate site at https://<your client portal address> where your client's contacts see what you have published. Clients don't need a Token Meter account or a password, and they are not seats.
Invite a client contact
- Add the contact on the client's page, or open the project's Client tab and choose Grant access.
- Pick the role: Guest can view; Approver can also answer requests.
- Token Meter emails an invitation with a single-use sign-in link that is valid for 72 hours. The contact's status moves from Queued to Sent, then to Opened once they view the project.
Changing a contact's role sends nothing. Resend invite sends a fresh link and cancels the earlier one. To send invitations your own account email must be verified, and each workspace has a daily invitation limit.
Signing in
The invitation link opens a page with a Continue button; the link is used only when the contact clicks it, so email scanners that open links don't use it up. Later, contacts sign in at the portal by entering their email and choosing Email me a link. That link works once and expires in 15 minutes. A session lasts up to 30 days, and ends after 7 days without a visit.
What the client sees
A contact with access to one project goes straight to it; with several, they get a list. For each project they see:
- the title, description, health and target date;
- milestones you chose to Show to client, with progress and what is next;
- published updates, newest first;
- published deliverable links;
- requests, which an Approver answers with Approve, Request changes or Decline (a note is required for the last two);
- comments on requests and a general discussion. Contacts can post up to 20 comments an hour and remove their own comment within 15 minutes.
The portal page also refreshes itself every 20 seconds while it is open, when something on the project changes.
What the client never sees
Internal milestones, update drafts and unpublished updates, unpublished links, internal notes, the project team, financials, AI cost, other clients and other projects. Viewing a project and clicking a deliverable link are recorded, and the view time is what you see as Last viewed.When your subscription lapses
The portal becomes read-only for a grace period: contacts can still read, but cannot answer requests or comment, and they see “Updates are paused for now”. After the grace period they can no longer sign in.
Who can do what
| Task | Who |
|---|---|
| Customers, revenue and customer margin | Owners and admins, in team workspaces |
| Add, archive and anonymise clients and contacts | Owners and admins |
| Create and archive projects; set project members | Owners and admins |
| Edit milestones, drafts, links and notes | Owners, admins, and project contributors and leads |
| Publish, grant client access, send requests, reply to clients | Owners, admins and project leads |
| Edit project details and AI cost rules | Owners, admins and project leads |
| Link GitHub repositories to a project | Owners and admins |
| See and edit project financials | People with the owner, CTO or CFO billing role |
Some plans cap the number of active projects (not completed or archived) and client contacts. Completed and archived projects don't count, and moving one back to an active status counts against the cap.
Troubleshooting
| Message or symptom | What to check |
|---|---|
| No customer-tagged traffic yet | No usage with a customer_ref this month. Tag calls with a customer (see Attribution). |
| A customer shows “no revenue entered” | Enter revenue for that customer and month, or import it. |
| Margin shows a range | Your providers' bills for the month are higher than the cost Token Meter metered, by more than the tolerance. Some spend is not reaching Token Meter. |
| Margin says “not yet reconciled” | No billing reconciliation has run for the month. Reconciliation needs your providers' billing data (see AI Bill). |
| You have reached the active project limit for your plan | Complete or archive a project, or change plan. |
| You have reached the client contact limit for your plan | Archive or anonymise a contact, or change plan. |
| That email already belongs to a contact | Each address is one contact in the workspace. Use the existing contact. |
| That email belongs to an archived contact of another client | The address was archived under a different client and can't be moved. |
| Verify your email address before inviting clients | Verify your own account email, then grant access again. |
| You have reached today's limit for client invitations | Try again tomorrow. |
| Contact added, but the invitation was not sent | The contact is saved; the reason follows. Fix it and use Resend invite on the project's Client tab. |
| Link expired | The contact didn't open the invitation within 72 hours. Use Resend invite. |
| Email bounced, or Not sent | The address doesn't accept mail, or bounced before. Add the contact again with a corrected address. |
| Publish it to the client first | A request can only be about something the client can see. Publish the update or link, or show the milestone. |
| Give a client contact the approver role on this project first | An approval needs at least one Approver. |
| Another project in this workspace already uses that tag (or customer reference) | Each tag and customer reference belongs to one project. Remove the rule from the other project first. |
| Project margin is Incomplete | Follow the list under the figure: record revenue, add a rule or link a repository, or enter an exchange rate. |
| The client says “That link is invalid or has expired” | Sign-in links work once and expire after 15 minutes. They can request a new one on the sign-in page. |
Security
- The portal is a separate application with its own database role. That role can read only the projects a contact currently has access to, only published content, and only non-financial columns; it cannot write anything except through narrow functions that check the contact's role.
- Every portal request checks the session against the database, so revoking access, archiving a contact, client or project, or a lapsed subscription takes effect on the contact's next request. Revoking and archiving also end the contact's sessions and unused links straight away.
- Invitation and sign-in links are single-use and stored only as hashes. Asking for a sign-in link gives the same answer, after the same delay, whether or not the address has access, so the page can't be used to find out who your clients are. Sign-in requests are rate-limited per address and per network address.
- Deliverable links must be https, and clicks go through the portal, which checks the link is published and shared with that contact before redirecting.
- Session cookies are HTTP-only and the portal sends a strict Content Security Policy.
- Client work changes (clients, contacts, access, publishing, project rules and financial edits) are recorded as audit events with who made them.