Skip to content

Recording a checkout is a bigger promise than storing a chat log.

So this page says exactly what leaves the browser, what never does, where it lands and when it disappears. Including the certifications we do not have.

Recording

Inputs masked at source
Field values are replaced before the event leaves the browser. There is no configuration where raw keystrokes are uploaded.
Payment frames unreachable
Card entry lives in a cross-origin iframe belonging to your processor. Nothing in the recorder can read it.
Opt-out attribute
Mark any element and its subtree is skipped at capture time, not filtered afterwards.
Consent aware
Recording can be gated on your existing consent state, so one banner governs both.

Storage and retention

Encrypted in transit and at rest
TLS on every connection, server-side encryption on the object store.
Retention you set
Recordings age out on a policy per site and are deleted from the bucket, not just hidden.
Deletion means deletion
Removing a visitor removes their transcripts, recordings and analytics rows together.
Export on any plan
Conversations and contacts as JSON, recordings as raw rrweb events. Leaving is not a support ticket.

Access

Roles enforced server side
Owner, admin and agent permissions are checked on the API, not hidden in the interface.
Per-site scoping
An agent invited to one site cannot read another, including through search.
SSO on self-hosted
SAML or OIDC against your directory, with an append-only audit trail of operator actions.
Keys stay server side
Business API endpoints and tokens are never exposed to the model or to the browser.

Masking is not a setting you can get wrong.

Every input is masked by default. There is no switch that turns it off, because the only reason to want that switch is a reason we would rather not enable.

If a whole region of the page should never be recorded at all, mark it and the recorder skips the subtree before serialising anything.

product-page.html
<!-- excluded from capture entirely -->
<div data-hepo-mask>
  <input name="tax_id" />
</div>

What we have not done yet

Every vendor page lists what it has. This is the other half, so nothing surprises you during review.

No SOC 2 or ISO 27001

Neither is in progress. If your buyer requires one, the honest answer is that self-hosting is the path, or that we are the wrong vendor this year.

No single region choice on hosted plans

Hosted data lives in the EU. Region selection exists for self-hosted deployments only, where the region is wherever you put the machine.

No bug bounty programme

We answer researchers quickly and credit them, but there is no cash pool yet. Saying otherwise would waste your time and theirs.

What review boards ask

Are you SOC 2 certified?

Not today, and we will not imply otherwise. We are a small team selling to small merchants, and an audit that costs more than our first year of revenue would be theatre. If your procurement requires it, self-hosting removes the question instead of answering it.

Where is hosted data stored?

European Union by default, on encrypted object storage with a zero-egress provider. Ask before you sign if you need a different region and we will tell you honestly whether we can do it.

Do you train models on our conversations?

No. Conversation content is not used to train anything, ours or anyone else. Translation runs on a model we host, so message bodies are not sent to a third-party API on hosted plans either.

What is your sub-processor list?

Object storage and, for hosted plans, the model provider serving your chosen agent model. Both are named in the DPA. Self-hosted installs have no sub-processors at all.

How do I report a vulnerability?

Mail support@hepo.ai with the details. We answer within two working days, we do not threaten researchers, and we say so publicly unless you would rather we did not.

Send us the questionnaire.

If your buyer has a security review form, mail it over. We fill them in ourselves and we do not leave boxes optimistically ticked.

Vulnerability reports go to the same address and get answered first.