Security & Data Handling

Last updated: 1 November 2026

Everything below describes what the product does today, with each limit stated next to the mechanism it belongs to. If you find a claim here that Overdesk does not honour, email security@overdesk.io and we will fix the page or fix the code. If you want the detail behind any of it, the security implementation notes go a layer deeper.

1. The short version

2. What leaves our system, and under whose account

DestinationWhat we sendWhose accountWhen
AnthropicConversation text, pseudonymised (Section 3). When you connect a code repository, also its file listing and the contents of the files the model chooses to open while answering. When Overdesk drafts a reply, and only then, also the pictures and log files attached to that conversation and the readable text of pages your customers linked to: up to four pictures, two text files and three pages, and only pictures in the formats the model reads. A log file and a linked page are pseudonymised like any other text; a picture is not, and cannot be (Section 3). A PDF a customer attaches is read the way a picture is: one per draft, up to ten pages. When Overdesk tries the issue on a test site, the screenshots it takes of that test site go tooYours (your API key)Every draft, triage, report commentary, and analysis, and every question asked of Ask Overdesk. Pictures and attachments go only with a draft, never with the rest
Voyage AIConversation, document, and saved-reply text for embeddings, pseudonymised with the stricter storage profile; and your search queries, which when Overdesk drafts include the customer's latest message (Section 3)Overdesk (an Overdesk-owned Voyage account, not a key you supply)Knowledge-base sync, and every search
Your helpdeskThe finished draft, written back unsent (an internal note, or on Help Scout an unsent draft reply if you turn that on), with the real customer details restoredYours (Help Scout, Zendesk, Intercom, or FreeScout)Every draft
Your store, billing, or licensing systemYour end customer's email address, sent as the key to look them up. What comes back, their orders, plan, invoices, or licence keys, and from a licence system the sites they installed your product on with the versions each reported, goes into the draft prompt above. After a churn or frustration analysis, the customers its findings name are looked up in a licence system or billing account the same way, and what they hold and have paid is kept with the finding (Section 6); that goes to no modelYours (WooCommerce, Shopify, Stripe, or Freemius)Every draft, once you connect one; and after a churn or frustration analysis, for at most 25 of the customers it names
SlackThe reports and alerts you schedule, and the answer Ask Overdesk writes when somebody asks it a question about your queue. All three have your customers' names replaced with "(customer)", and their email addresses and phone numbers (international and North American) left as tokens. Ask Overdesk answers from a copy of your report that was stored with the names already replaced, so they are gone before the question is asked. A report archived before we started keeping that second copy cannot be read this way at all, and Ask Overdesk says so rather than falling back to the copy in your dashboard. Two records reach you as written, both explained in Section 3: a name that is really a mailbox or a company, because it names no person, and a name your helpdesk holds as only one or two letters, because substituting something that short would corrupt ordinary words around it. The copy kept in your Overdesk dashboard restores the names, because that copy does not leave your accountYours (your workspace)On your report schedule, when an alert fires, and whenever somebody asks
ClickUpThe reports you schedule and the alerts Overdesk raises. It is the same copy Overdesk sends to Slack, on the same terms, including both exceptions above. An answer from Ask Overdesk goes to Slack only, and never to ClickUpYours (your workspace)On your report schedule, and whenever an alert fires
GitHub / Linear / JiraThe title and description of an issue one of your team opens from a conversation, with email addresses, card numbers and phone numbers (international and North American) removedYours (your repository, team, or project)Only when a member of your team writes one and confirms it
NeonEverything Overdesk storesOverdeskContinuously
Fly.ioApplication hosting; your data in transit; and the test copies of WordPress, which receive only the pseudonymised steps the model takes on them (Section 3)OverdeskContinuously, and a test site only while a draft uses it
Stripe, as our own accountYour billing details for your Overdesk subscription. We never see or store card numbers. This is separate from a Stripe account you may connect above, which is yours and which we only readOverdeskOn subscribe
ResendYour team's email addresses, for login links and notificationsOverdeskOn send

One thing happens in your browser rather than on our servers: choosing which Google documents to index opens Google's own file picker, which means your browser loads a script from Google and Google sees the request. It runs only when somebody on your team opens that picker, it is the only third-party script the product loads, and none of your support content passes through it.

That is every party that receives your data. Overdesk also reads, and reading is a different thing from sending: nobody on the other end is given your customers' data. It reads from the places you connect as knowledge — your public documentation or forum, and your Notion, Google Docs, GitHub, Jira, or Linear — with the access you granted. And since 14 September 2026 it also opens addresses your CUSTOMERS write, when one of them links to a page in a ticket and Overdesk reads that page while drafting a reply. That last one is worth stating plainly because it is the only outbound request this product makes to somewhere neither you nor we chose: the site's operator learns that the address was opened and sees the request arrive from our servers, and the address itself is whatever your customer typed. No credential of yours, no account detail and no other part of the conversation travel with it, and it is not a sub-processor because we send it nothing to process. You can switch it off on the Customize AI page. Section 3 has the detail. The app runs no analytics, advertising, or third-party tracking. Our websites count visits with Cloudflare Web Analytics, which sets no cookie; Section 7 of the Privacy Policy also names the one security cookie Cloudflare sets there.

Four of the systems you connect run under an Overdesk-owned credential rather than under one of yours, and we would rather say so than have you find out. Semantic-search embeddings run under an Overdesk-owned Voyage account: Overdesk provides them for every workspace and does not ask you to supply a Voyage key. The Google Docs connection is authorised through Overdesk's own Google application, so Google records that Overdesk opened the file, though the access is the one you granted and reaches only the documents you picked. And the Slack app your team installs is Overdesk's Slack application, so what it can do in your workspace is what you approved at install. A Help Scout connection can be authorised through Overdesk's own Help Scout app, so Help Scout lists Overdesk as the app with access, though the access is the one your admin approved; one made with an app of your own runs under that app. Every other system you connect, including every language-model request, runs under your own account and your own key.

The four rows above that name Overdesk are our own infrastructure and suppliers rather than anything you connect: the database, the hosting, the payment processor for your Overdesk subscription, and the service that sends your team's login emails.

3. Pseudonymisation: what it catches, and what it misses

Before a prompt reaches a language model, Overdesk runs the conversation text through a pattern-based pseudonymiser. Matches become deterministic tokens, and when the model replies the tokens turn back into the real values, so your agent reads a usable draft and the model never received the raw details from the text. (The token format is in the implementation notes.)

Tokenised before the model sees them:

Four kinds of weak identifier are deliberately left intact on the way to the model: URLs, IP addresses, postcodes, and street addresses with no lead-in. Each one's pattern collides with ordinary support text (a version number, a ticket number, a plain English word), so redacting it reliably would corrupt the very ticket the model has to read; the implementation notes show the collisions case by case. The consequence, said plainly: a password-reset or invite link pasted into a ticket reaches the model intact. The same four are left intact in the copy we store and embed, for the same reason: a stored article is quoted back to the model as the source of its answer, so a version number lost to an IP pattern is an answer lost, and a link lost to a URL pattern is a citation the reply cannot point at. A credential carried inside a link is a separate matter, and it is replaced on both paths whenever it is long enough for the API-key and licence-key patterns to claim it: a long random run, a UUID, a signed-URL signature. Short link ids, and tokens broken up by dashes or dots, are not long enough for those patterns and are retained with the link; a query parameter that names itself a credential (?token=, ?key=, ?secret=) is replaced when its value mixes letters and digits, but one named nothing in particular is not. Treat a reset or invite link pasted into a ticket as retained.

The knowledge base is redacted before it is written. When Overdesk indexes a conversation, its subject, body, and resolution pass through the pseudonymiser on a slightly stricter profile than the model gets: every pattern above, plus two shapes the model path deliberately declines because in a live ticket they are more often order numbers: a card-length digit run that fails the card checksum, and a phone-length digit run written with no separators. The customer's email address is replaced with a deterministic stand-in, the same one each time, so the record still groups by customer without holding the real address.

Two limits on that. The structured name substitution does not run at rest, because it needs the contact field from a live draft; so in the indexed copy a name written into the ticket text, the requester's included, stays as written. And this covers the knowledge base, not every row in our database: two stores hold real details on purpose, the draft written back to your helpdesk (your teammate has to read a usable reply) and the raw webhook event (which sits in the job queue until it is processed and cleaned up). Both age out under Section 6, and neither is what reaches the model.

Your saved replies are indexed the same way. The templates and macros you keep in your help desk are pseudonymised on this stricter profile and indexed alongside your other content, so Overdesk can find the right one. That means their text is embedded through the Voyage account named in Section 2, exactly as your documentation and past conversations already are. These are wording your team wrote rather than a customer's message, so there is usually nothing personal in them; the redaction runs anyway, because a template written from a real ticket can carry a real detail.

Searching your knowledge base sends a search query out too. To find the right article, Overdesk searches on the ticket's subject plus the first part of the customer's latest message, so that text reaches the Voyage account above. It is pseudonymised on the same stricter profile as the knowledge base, with one difference: the structured name substitution described above needs a live contact field, so it does not run on a search query. This happens while the ticket is still open, not only after it closes.

Our own search log keeps the subject line only. The part taken from the customer's message is used to run the search and is not stored, so it is not sitting in a table here waiting to age out. What is kept is the subject, the number of results, and how the search ran, for 90 days (Section 6).

Pictures are sent as your customer sent them, and this is the one limit that no pass can close. When somebody attaches a screenshot to a ticket, or pastes one into their email, Overdesk sends that picture to the model along with the text while it drafts a reply. Up to four pictures per draft, each under four megabytes, and only in the formats the model can actually read (JPEG, PNG, GIF and WebP), so a photo straight from an iPhone in Apple's HEIC format is not sent at all. Two text attachments come too, and those are pseudonymised like any other text. The pseudonymiser above reads text; there is no version of it that can read inside an image without destroying the thing the picture was sent to show. So an email address in a browser tab, a licence key in a console, an order in a dashboard, a face in a video call, all reach the model as they appear. We chose this deliberately rather than blurring it: a screenshot with the evidence obscured cannot answer the question, and a reply written from an unreadable picture is worse for your customer than no reply at all. Log files and other text attachments are different and do go through the pass, exactly like the message they came with. If you would rather Overdesk did not read pictures at all, you can switch it off yourself on the Customize AI page in your dashboard, and drafts are then written from the words alone. Text attachments are a separate matter and are not affected by that switch, because they go through the pass above like any other text.

Overdesk opens pages your customers link to, and this is an outbound request rather than a limit of the pass. When a customer's message links to a page, Overdesk opens that address while the draft is being written and gives the model the readable text it finds, so the reply can answer what the page says instead of guessing from the address. Up to three pages per draft, at most half a megabyte read from each, and nothing is stored. The text is pseudonymised like any other text. Four things are worth knowing before you leave this on. The request goes to a third-party website that your customer chose, so its operator learns the address was opened, and the address itself is whatever your customer wrote: no credential of yours, no account detail and no other part of the conversation travel with it, but if somebody pasted a link with something personal in the address then that part does. The text that comes back is written by whoever controls that address, not by your team and not by us, so the model is told to treat it as something to read rather than as instructions, and to say where a fact came from when it uses one. Only links in your customers' own messages are opened, never links your team wrote. And if a customer links to a picture instead of attaching one, it is read as a picture under the rules above, so switching pictures off switches that off too. There is a separate switch for this on the Customize AI page, and turning it off means no address a customer sends is ever opened. When the page is a WordPress site, the model is also told the WordPress, plugin and theme versions the page's code shows, read from the same page and never from a second request.

Overdesk can try the issue on a private test copy of WordPress, and the contact details the pass replaces never reach it. Once your team lists its products on the Sandbox settings page, Overdesk can start a copy of WordPress with those products, plus any public WordPress.org plugin or theme the customer mentions, and try what the customer describes before the reply is written. It runs on a separate machine at Fly.io with no route to the internet, to our application, to our database or to any other test site, and the machine is destroyed when the reply is done. The model decides what to do there, and the placeholders above stay placeholders in everything it types, so a command it runs never carries a contact detail the pass replaced. What it sees back (the page, a screenshot, command output) is pseudonymised before it is stored, and that record is kept with the reply for 180 days. A zip file of your own product that your team adds is stored with your workspace until you remove it, and only your own test sites install it. A reply that says something was tested, with no finished test behind it, is held for a person instead of being sent.

The limit that matters most: names of other people written in free text are not detected. Overdesk runs no named-entity model. If your customer writes "my colleague Dave Harrison can't log in either", that name reaches the model. The name of anyone on your customer's side who wrote one of the messages is masked, because your helpdesk hands each of those to us as a field; a name mentioned in passing has no field to read and no pattern to match. That masking is not particular to drafts. Every use of a model that reads the messages on a ticket registers the same names, so a colleague who signed their own message is masked when Overdesk writes a draft, when it classifies a ticket, when it nudges a customer who has gone quiet, when it fills in a new issue on a tracker you have connected, and in the summaries behind your reports and analyses. Where one of those reads only a ticket's subject and the opening snippet your help desk shows in a list, rather than the messages themselves, there is no author field to read and it sends the requester's name masked as it always did. That includes Ask Overdesk: when it answers a question about a report you already have, it reads a copy of that report stored with the names already replaced, and not the copy kept in your dashboard.

Your own team's names are not masked, and that is a decision rather than an oversight. When one of your agents writes on a ticket, whether or not the customer sees it, their name goes to the model as written. The drafting request runs on your own Anthropic account rather than ours, so this is your staff reaching a supplier you already chose. The model uses the name to follow who said what on a ticket several colleagues have answered, and it writes a worse reply without that. It is not signed off with, either: the instructions ban a name and a signature block at the end of a reply, because your help desk adds the real sender's signature when the message goes out. The one place a colleague's name can appear in the reply is when the draft says one of your agents is standing in for another, and only when the ticket already names them. Your customers' names are treated differently throughout, because your customer never chose any of this.

A connected store or billing account is a second source of the customer's name, and it is masked too. The masking above works from the contact field your helpdesk supplies. When you connect WooCommerce, Shopify, Stripe or Freemius, that system returns its own record of the customer, and the two spellings often differ: a billing contact rather than the writer, a company name, a middle initial. Overdesk registers the store's spelling as well before it builds the block, so that name is replaced on the way to the model and put back in the draft your agent reads, exactly as the helpdesk's spelling is. The other facts in that block are left readable on purpose: an order number, an amount, and the items on the order, so the model can see what they actually bought; the state each order, payment or subscription is in, which covers a refund, an unpaid invoice, a payment past due and a cancellation; a plan name and the dates it renews or ends; the day they first bought from you; how many orders they have placed and what they have spent with you; which products they are licensed for and on how many sites; and the last four characters of a licence key. A draft that quotes a tokenised order number answers nothing, which is the reason, but it means this block is an exception to the rest of this section rather than an instance of it.

4. Bring your own key

Drafting, triage, report commentary, and analysis all run on your Anthropic API key, encrypted at rest (Section 8). Your conversations are processed under your own commercial agreement with Anthropic, not proxied through an Overdesk-owned AI account and not pooled with another customer's traffic.

We do not train models on your data. There is no shared Overdesk model to train.

5. Who sends a reply

Unless your workspace turns sending on, Overdesk places its drafts into your helpdesk unsent. By default a draft arrives as an internal note; on Help Scout, if your team turns on draft delivery, it arrives as an unsent draft reply in the composer instead. Neither is visible to your customer, and neither is sent by Overdesk. A person on your team reads the draft, edits it if they want, and sends it. Overdesk cannot place an unsent draft on Zendesk, Intercom or FreeScout, so there it stays an internal note, whichever way your team chose to receive drafts.

FreeScout gets an internal note, never a draft reply, and we would rather say why than leave you to wonder. FreeScout is self-hosted, so the version running is yours to choose, and its API and Webhooks module has no way to report that version to us. We read the vendor's own source to establish what happens when a module is too old to recognise an unsent draft reply: FreeScout treats a reply whose state it does not recognise as one to publish, so on an older module a draft could reach your customer unread. We cannot tell which module you run, so Overdesk does not write a draft reply to FreeScout at all. Every reply Overdesk holds back there, and every follow-up nudge Overdesk does not send, arrives as an internal note, never a draft reply, on any module version, with sending on or off. A note never reaches your customer.

Sending replies

A workspace can have Overdesk send replies itself, and it is off unless two keys turn. The Overdesk team enables sending for your workspace, and then an admin of your workspace chooses Send replies automatically under Send mode in Guardrails. A workspace we have not enabled cannot turn it on: the database refuses to store that setting without the first key. Either side can turn it off at any time.

Help deskSends onStatus after a reply, your choiceA hand-over reply leaves it
Help ScoutEmailPending (the default), Active, Closed, Leave as isActive
ZendeskEmail and API ticketsOpen, Pending (the default), Leave as isOpen
IntercomMessenger and email conversationsClose (the default), Leave as isOpen
FreeScoutEmailActive, Pending (the default), Closed, Leave as isActive

Intercom closes the conversation as a second step after the reply, and a reply from the customer reopens it.

Every draft is stored with the model that wrote it and the tokens it cost.

6. Retention and deletion

Content ages out automatically. Generated reports follow your plan's retention — 90 days (Trial), 90 days (Assist), 365 days (Pro), and unlimited (Scale), and so do findings, with the licences, subscriptions and totals kept on a churn or frustration finding's conversations (never an email address, name or licence key, only a stand-in for the address); drafts, triage, alerts, the redacted guardrail decision log and the pseudonymised record of each test site are kept 180 days; draft feedback (each draft paired with the reply your team sent, and what changed) is kept 180 days from its last update, after which a draft your team discarded with no reply keeps only a marker with no text, so its conversation stays out of search; a zip file of your own product is kept until you remove it; search-query logs 90 days; your indexed knowledge base lives for the life of the workspace. For each reply Overdesk sends it also keeps a record that Overdesk sent a reply, holding the conversation and message it went to and a fingerprint of the reply, never its text, as long as the workspace exists, so the reply is still recognised as Overdesk's after its draft is deleted. The implementation notes carry the full schedule.

Erase one customer. An admin can erase a single end customer from Settings. Overdesk resolves their conversations, deletes the drafts, triage results, simulation results, and knowledge-base entries derived from them, and records that the request was honoured. Those conversation IDs go onto a suppression list, so the next sync with your helpdesk does not quietly re-import what you just erased. The address you erased goes on that list too, so a conversation of that customer that Overdesk had not imported yet, one still open in your help desk, gets no drafted reply, no follow-up nudge and nothing sent from Overdesk's own runs. The account facts a finding keeps about the customer are found by the stand-in for their address, including on a conversation that is still open, and are deleted with every finding's record of those conversations; those conversations join the suppression list, and no later analysis looks that address up again. Both the knowledge base's copy of the address and this stand-in are derived from our encryption key, so if that key were ever rotated, records written before the rotation could no longer be matched to an erasure request.

Delete the workspace. The owner can delete the whole workspace from Settings. The Stripe subscription is cancelled first, then the workspace and its contents are removed immediately, with no grace period and no soft delete. Two things survive by design: the record that you accepted the terms, and the record that the deletion happened.

Two limits worth knowing. Report and alert text is prose written by a model, so a customer named inside it has no key to search on and is removed by the age-based schedule above rather than by a targeted erasure. And deleting your workspace does not remove the webhook you registered inside your own helpdesk; delete that one yourself, though once the workspace is gone anything the webhook sends is rejected.

7. Sub-processors

The full list, with each sub-processor, its purpose, the data it receives, and where it runs, is the table in the Privacy Policy. We keep a single canonical copy so the two pages cannot drift apart.

8. Infrastructure and access

9. Compliance: what we can and cannot say

Overdesk holds no third-party security certifications. We are not SOC 2 audited, not ISO 27001 certified, and we do not offer a HIPAA BAA. If a certification is a hard requirement for you, we are not the right vendor yet, and we will tell you that now rather than during your review.

What is true:

10. Reporting a vulnerability

Email security@overdesk.io with what you found and how to reproduce it. We will acknowledge it, and we will not threaten you for reporting it.

We do not run a bug bounty. Please do not test against other people's workspaces or real customer data. If you need an account to test with, ask and we will make you one.

Changelog

One correction in the same breath, found while checking that the sentence above was true everywhere it is made. The Slack row in Section 2 said every one of the things Overdesk posts to your workspace has your customers' names replaced with "(customer)". That holds for a report and for an alert. It did not hold for an answer Ask Overdesk writes about an archived report, because that answer was built from the copy kept in your dashboard, which has the real names in it. The code has been changed to match the promise rather than the promise quietly narrowed: a report is now archived with a second copy that has the names already replaced, and that is the only one Ask Overdesk will read. A report archived before this change has no such copy and cannot be given one, because the substitution cannot be run again after the fact, so Ask Overdesk declines to read those and says why.

One further correction and one further disclosure, both in Section 3. The name masking used to work only from the ticket's requester, so anyone else on your customer's side who had written one of the messages, a colleague copied in or a second contact at the same company, reached the model under their real name; every one of those authors is masked now. And your own agents' names are not masked, which has always been true and is now explained rather than left for you to discover. Section 3 also states which of Overdesk's uses of a model this author masking covers, and that a name your helpdesk holds as only one or two letters is left as written.

Also newly written down, none of it new behaviour: the Slack row now names Ask Overdesk and alerts rather than only scheduled reports, and says that everything reaching your workspace has your customers' names replaced with "(customer)", correcting a sentence on the Privacy Policy that had this backwards and said the names were restored; opening the Google Docs picker loads a script from Google in your browser; the Google Docs connection is authorised through Overdesk's own Google application rather than one of yours, as is the Slack app your team installs; and the two Stripe rows are now labelled, since one is your own account that we read and one is ours that bills you. Section 5 states the FreeScout version question that decides whether a draft stays unsent, and explains why a current module does not send one. Two earlier changes reached this page with no entry here: on 28 August the Anthropic row began naming the repository code a connected GitHub account sends to the model, and on 29 August Section 3 began naming which credential-shaped query parameters are replaced inside a link. Retention is unchanged, and a person still sends every message.