Loading Actuals…
Actuals — connect your data
actuals Setup
{{ headerAccount }} Skip to product →
Before step 1

Create your account.

Setup is per-account: your export, your figures, your reports. Nothing on the four steps below can be saved until we know whose account to save it to. This takes one email address.

{{ authSwitchLead }}
Sign-in unavailable
{{ authError }}
Signing in creates the account record and nothing else. No data is read, no scan is queued, and no agreement is accepted until you do it explicitly further down.
Step 1 of 4

Connect your data, read-only.

Pick whichever is less work for you. If your support runs on Zendesk, your admin creates a read-only token — a long password that only permits reading — and pastes it below; we then read the tickets ourselves, on a schedule, with no further effort from you. If your support runs on anything else, you send one export of your tickets and our importer takes it from there. Neither route gives us permission to change, close, tag, or reply to anything.

For your Zendesk admin · about ten minutes
01
In Admin Center → People → Roles, duplicate the Light Agent role and remove every ticket edit permission. Name it Actuals (read-only).
02
Invite audit@actuals.co as a light agent with that role. Light agents do not consume a paid seat.
03
In Apps and integrations → APIs → Zendesk API, add an API token. Copy it once; Zendesk will not show it again.
Concierge for now — we run this for you
There is no place to paste a token yet: this account does not store helpdesk credentials, so a box here would be theatre. Do the three admin steps above, then email the subdomain and token to {{ contactEmail }} — or simply say when you are ready and we will walk it with you. We connect it on our side, queue the read, and it appears in your dashboard like any other run.
If you would rather not send a credential at all, use File import above. That path is wired end to end in this account right now, and the answer comes out the same.
Nothing has been connected. This card claims no credential and stores none.
.zendesk.com
{{ tokenMsg }} {{ tokenCount }}
What happens next: we test the token by reading exactly one ticket to prove it works, then stop. The full twelve-month read does not start until you finish step four.
What the export needs to contain
01
Claims — one row per piece of work the vendor counted as delivered: a stable id, the moment it was closed, and what closed it. Without the closing actor we cannot separate the vendor's work from your team's, and the whole measurement rests on that column.
02
Truths — one row per thing that happened afterwards: a reopen, a fresh request about the same issue, an escalation to a person. Each needs an id, a timestamp, and the requester or reference it belongs to.
03
Identity and references — whatever links the two: requester email or account id, plus any order, invoice, error or ticket references carried in the row. A failed join makes us undercount, which is the exact failure we accuse vendors of.
04
Public text — the request and the reply. It is what the matcher reads. It is never used to train a model, ours or anyone's.
One flat export of the work itself is also fine — created and closed timestamps, requester identity, closing actor, public text — and the importer derives claims and truths from it. CSV or JSON, UTF-8, one file per table or one file for the lot. Your column names are mapped in your tenant configuration, so they do not have to match ours: send the headers you already have and we will map them with you on the call.
Prototype · nothing is uploaded here
{{ exportMsg }}
What happens next: we read a small sample of your export, agree with you which column means what, and only then run the full import. You are never asked to rename a column yourself.
Required before real data moves · {{ dpaVersion }}
The short form of the agreement, in full:
{{ d.num }}
{{ d.title }} — {{ d.body }}
We record the revision string and the moment you accepted it, against your account. Nothing else.
{{ provLabel }}
{{ chosenName }}
{{ uploadMsg }}
{{ uploadStageLabel }}{{ uploadBytesLabel }}
The file goes straight from this browser to private storage — the presigned URL is issued to your account and expires. It is never public and it is never used to train a model.
{{ step1ErrorTitle }}
{{ step1ErrorBody }}
{{ uploadDoneCopy }}
Step 2 of 4

Your economics.

Two minutes of typing. Every currency figure in your report is your own number multiplied by our count — we never supply a benchmark cost and never estimate on your behalf. A rough range is fine; the report carries the range through to the exposure figure instead of pretending to a precision you did not give it. None of this changes the count itself, only what the money column says beside it.

$
TO
$
Agent time, tooling, and QA. Not marketing-adjusted.
Vendor charges per resolution
If your contract is metered, we can show what you paid for resolutions that did not hold.
$
Vendor contract
These two fields drive the Renewal surface: the countdown, the notice deadline, and what the durable number looks like against the bill.
$
What is saved to your account
The cost range and the currency (USD — the currency these fields are entered in), the per-resolution fee if your contract is metered, and the annual contract value. The renewal date stays in this browser for now: the account has nowhere to put it yet, and we would rather say so than imply a save that did not happen.
Your scan will not start without the range and the currency. A measured report prices exposure from your own figures and falls back to nothing.
{{ economicsStatus }}
What happens next: one screen of permissions, and then the reading starts. You can change any of these figures later in Settings.
Step 3 of 4

Confirm what we may do.

Four statements. Each one is a limit on us, not a permission you are granting away.

This is the last thing we need from you. Confirm all four and the twelve-month read is queued straight away.
{{ step3ErrorTitle }}
{{ step3ErrorBody }}
Step 4 of 4

{{ scanTitle }}

{{ scanStateLabel }} {{ scanProvLabel }} {{ scanClock }}

{{ scanNote }}

{{ scanReadLabel }}{{ scanMatchLabel }}
Source
{{ sourceLabel }}
Period
12 months
Access
read-only
{{ step4ErrorTitle }}
{{ step4ErrorBody }}
Your report is ready and waiting in your dashboard. Read the named limitations before you send anything to your vendor — they are the first thing they will look for.
{{ openReportCta }}
{{ scanPendingCopy }}
{{ subOfferLine }}
{{ subTestMark }}
{{ subErrorTitle }}
{{ subErrorBody }}
Prototype · preview scan state