One company, one space
Each customer has its own subdomain and its own data. No query crosses the company boundary.
This page explains what bFocus does to protect your data and your customer’s — no invented badges and no promise we cannot keep today.
Each customer has its own subdomain and its own data. No query crosses the company boundary.
Access by a code sent over email or WhatsApp, with a 30-day session. A password nobody stores is a password nobody leaks.
Five roles and per-department visibility define who sees the whole queue, who sees only their own and who administers. In Mesa, the area puts each person's work first without hiding the rest.
Approving or rejecting a request takes a code sent at that moment, and a single rejection is enough to block it.
Ticket, task and approval events are stored with author and timestamp.
Sensitive content only appears after the person confirms with a code, even when already signed in.
The sign-in screen shows the Cloudflare badge before it asks for the access code. The answer is the same with an account or without one, down to how long it takes: nobody finds out by trial which addresses get into your company.
This is the mechanism that keeps customer A from seeing customer B’s ticket in the widget, in the native app and in the SDKs. Simple to implement and hard to fool.
The verified identity guide shows how to calculate the v2 signature in Node, Python, PHP and other languages, with an example ready to copy.
The publishable key sits in your site’s HTML. These locks hold even when the session arrives without a signature.
An unsigned session shows the tickets and chats that browser opened, and nothing else. For the person’s whole list, turn verified identity on.
What the page sends creates the customer and the person when they do not exist yet. It does not rename an existing record or move the person to another company.
A ticket accepts the file the widget itself uploaded, from the same company and the same user. The name, the type and the address come from what we stored.
Opening a ticket, commenting, chatting, uploading and getting an AI answer are capped per user, per IP and per company. Inventing a new user on every call does not get past it.
The browser reports the page address, so the widget only opens on the domains you register. Register the root domain and the subdomains come with it: https://customer.com already allows app.customer.com and shop.customer.com. The scheme has to match — https does not cover http — and so does the port, when you declare one.
The integration API is server to server and checks no domain: a server call carries no origin to check. The secret key never goes to the browser. When your front end needs the data, your company’s backend is the one that calls the API.
The widget that answers at your site’s front door runs a Cloudflare challenge (Turnstile) the visitor does not see — the little box only shows up if Cloudflare gets suspicious. Whoever passes gets a short session, tied to your company and capped in uses, so nobody solves one challenge and reuses it in a bot. Whoever does not present the proof is refused with a 403 — and if Cloudflare is down, the request passes on purpose, so a third party cannot take your login down.
A domain refused at the widget, or an address refused on an API key, becomes a line under Company › Integrations › Authorizations: the address exactly as it arrived, how many attempts and when the last one was. Releasing it is one click, with no typing — no more registering www instead of the apex. Only an administrator releases it, and the screen warns that the address showed up on its own, recommending none of them.
Backups are easy to promise and hard to verify. Here is what runs today, with the date of the last rehearsal.
Once a day, a pg_dump of the database goes out encrypted with AES-256-GCM, streaming straight into S3-compatible storage at another provider. Copies are kept for 30 days. The managed database backup lives in the same account as the database; this copy is what is left if that account goes down.
With no encryption key, nothing is uploaded — and a failed run raises an alert for the people who run the platform. The decryption script is versioned alongside the code, and the restore rehearsal was done on 21 September 2026: the file was decrypted and read by pg_restore.
SLA, WhatsApp, AI, reports and the database copy run in a process separate from the API. If a heavy routine blows the memory, that process goes down and comes back up — not the API with every chat open.
Errors go to Sentry with no request body, no personal data and none of the code’s local variables: what arrives is the exception, the stack and the route. And a deep check answers with an error when the routine process stops beating.
Under the LGPD, Brazil’s data protection law, the company that subscribes is the controller of its customers’ data; bFocus is the processor. What we offer so you can play your part:
DigitalOcean infrastructure in the United States (San Francisco region), with a managed database, backups and encrypted connections. The international transfer is covered in the contract, as the LGPD requires.
bFocus does not supply AI. Text sent to the model travels under the contract your company has with its own provider.
We train no model on your data, and we never use one company’s content to answer another.
The limits in reais are checked before the call. When the cap is reached, support carries on with people.
Every AI call runs on your company key: the conversation, the summary, the classification and the vectors behind search by meaning over the base. bFocus does not supply AI, with no asterisk. Without a key that generates vectors, the base carries on with text search.
Only when you ask for help and authorize it, to investigate a specific problem. There is no content scanning.
Not yet. We would rather spell that out than display a badge we do not hold. What exists today is described on this page, and the page changes when reality does.
Yes. When you close it, the account is deactivated and the data is deleted on request. Before that, you can pull reports and take the data out through the API.
It uses no tracking cookies. It keeps the conversation session in the local storage of your customer’s browser, and that only serves to keep them from losing the history when the page reloads.
If your technology team needs details, we answer at whatever technical level they ask for.