How we run the service

Security Overview

DKT Digital, St Peter Port, Guernsey GY1 · info@dktdigital.co.uk

Draft

DRAFT — pending legal review, not binding. This document has not been reviewed by a solicitor. It is published so you can read our terms before you talk to us, and so we can be held to what it says — but it is a working draft, not a vetted contract, and nothing here is legal advice. A binding version will be issued for signature only once it has been through legal review. If you are relying on any part of it, ask us and we will tell you where it stands.

Where your data physically lives, what is encrypted and what is not, every outside company that can process it, and how backups and access control work. Measured against the running system rather than described from intention.

*Last updated: 2026-08-02 (§6: the former-client purge is now switched on at 90 days. Hosting, encryption and backup sections re-measured against the live system after the VPS migration on 2026-08-01). Owner: Daniel Thomas, DKT Digital (Guernsey).*


1. Where your data is hosted

Measured 2026-08-01, not assumed. The automation engine and the database run on a dedicated virtual server operated by Hetzner Online GmbH in Falkenstein, Saxony, Germany (EU). The public website, client portal, and edge security are served through Cloudflare. Nothing client-facing runs on the owner's own hardware any more; the earlier "Guernsey hardware" statement in this document described the pre-migration setup and was replaced once the move was verified.

So, in one sentence: **your data lives in Germany (EU), reached only through Cloudflare, and DKT Digital — the business you contract with — is established in Guernsey.**

What that means for the law that applies:


2. Encryption

In transit: all traffic is over TLS/HTTPS. The website, client portal, form submissions, and every API call to a third party use encrypted connections. Public endpoints sit behind Cloudflare with modern TLS.

At rest:


3. Sub-processors — who else touches client data

We use third-party services to deliver the automations. Below is the **full list of sub-processors that can process client personal data**, enumerated from the live automations (not guessed). The client remains the data controller for their own customers' data; DKT Digital and these providers are processors/sub-processors.

Sub-processorWhat it does with client dataPrimary region
Hetzner Online GmbHHosts the server the automation engine and the client database run on — every piece of client data at rest sits on this machineGermany (Falkenstein)
CloudflareWebsite/portal hosting, CDN, tunnel, access control (Zero Trust), bot protection (Turnstile), encrypted off-site backup storage (R2) — all client-facing traffic passes through itGlobal edge
ResendSends transactional client emails (welcome, reminders, reports, invoice chases)US
BrevoEmail delivery/transactional (secondary email path)EU (France)
Google (Workspace / Cloud, via service account)Calendar events for bookings (client name/email), optional Sheets sync, Search ConsoleUS / EU
GoCardlessDirect Debit mandates and recurring retainer collection (client billing details)UK
StripeCard payments / one-off chargesUS / Ireland (EU)
TrueLayerOpen-banking bank-feed verification for accounting audits (client bank data)UK
XeroThe client's own accounting data, accessed under the client's per-client authorisationNZ / global
TwilioSMS reminders/notifications (client phone numbers). Not live — listed because it is wired and would become a sub-processor the moment SMS is switched on for a client, not because it is processing anything today.US
CalendlyMeeting booking (client/prospect name, email)US
CrispWebsite live-chat (visitor/lead messages, email)EU (France)
Hunter.ioEmail-address verification for cold/nurture outreach only (never transactional client sends)EU / US
ApolloProspect/lead sourcing for outreach (marketing contacts, not existing-client data)US
TelegramOperational alerts to the owner — client identifiers (names/emails) can appear inside alert messagesGlobal (Telegram FZ-LLC)
AI inference — Groq, Cerebras, Google Gemini, OpenRouterLLM processing where a feature needs it (e.g. drafting a reply, summarising). See §4 on what is and isn't sent.US

Not sub-processors of client personal data (listed for completeness — these handle market data, the agency's own content/research, or internal ops, and do not receive client customers' personal data): Alpaca, Nasdaq, Yahoo Finance, Finnhub, CNN, SEC/EDGAR, arXiv, Hacker News, Reddit, TechCrunch, VentureBeat, Wikipedia (market/trading & research sources); Beehiiv (the agency's own newsletter, with its own subscribers); Dev.to, LinkedIn (the agency's own content publishing — Buffer was removed on 2026-08-02: its legacy REST API no longer accepts our class of token and retires in Feb 2027, so the integration was dropped and the three workflows referencing it deleted); Tavily, Exa, Firecrawl (web research); Dub.co (link shortening); GitHub (private code/workflow backup — secrets are held in the environment, not in the backed-up files); Notion, Slack (internal operations).

The solicitor should decide which of these belong in the contractual sub-processor schedule of the DPA. The table above is the honest engineering enumeration to work from.


4. AI / model use — your data is never used to train models


5. Backups and recovery

*Re-measured 2026-08-01 against the live backup log, because the previous version of this section described the pre-migration Mac setup and reported the off-site leg as broken. It is not broken any more, and saying so is as much a correction as reporting a failure would be.*


6. Data retention (per table)

Current reality: while you are a client, the operational database keeps your records for the life of the engagement and nothing of yours is deleted automatically. One narrow exception now exists and is switched on: once a client has left, the customer data they brought us is purged 90 days later. That rule is set out in full below — it covers two tables, it does not touch billing or payment records, and it is reversible for 30 days. The automation engine's own execution logs are pruned automatically. **Re-measured on the live container 2026-08-02: 72 hours / max 2,000 runs** (EXECUTIONS_DATA_MAX_AGE=72, EXECUTIONS_DATA_PRUNE_MAX_COUNT=2000) — this document previously said 240 hours / 5,000 runs, which was a figure nobody had checked against the box since the migration. Shorter, not longer, so nothing was over-retained; it is corrected here because a security document that is wrong in the safe direction is still wrong.

Tables that hold client personal data today (with the honest current retention):

TableHoldsCurrent retentionProposed retention (for solicitor)
clients, saas_clientsClient profile, onboarding answers, data-source declarationsLife of engagementDuration + 6 years (financial records) or as agreed
client_integrationsEncrypted Xero/bank OAuth tokensUntil disconnectedDeleted on offboarding / disconnect
leads, outbound_queueProspect/lead contacts, outreach queueIndefinite24 months from last contact, then purge
invoices, invoice_chases, payment_eventsBilling/payment recordsIndefinite6 years (tax)
meetingsBookings (name/email/time)Indefinite24 months
client_reports, client_roi, savings_logOutcome/reporting dataIndefiniteDuration + 12 months
client_tasksSetup/data-migration tasksIndefiniteDuration + 12 months
feedbackClient feedbackIndefiniteDuration + 12 months
email_delivery_logDelivery events (recipient email, status)Indefinite12 months
sms_logSMS attempts (phone, status)Indefinite12 months

The former-client purge is SWITCHED ON — 90 days, decided 2026-08-02. This paragraph said the opposite until that date, and the change is deliberate: retention_days_after_offboard is now 90 and quarantine_grace_days is 30. What that means precisely, because a retention promise is only worth the exactness of its scope:

  • Who it applies to. Only a client who has left — status cancelled or cancelling and a recorded cancellation date more than 90 days ago. A client with no recorded leaving date is never in scope, because an unknown date must not be read as "left long ago".
  • What it deletes. Exactly two tables: leads (only rows belonging to a client — their ingested customer list) and customer_replies (replies from their customers). The set is a declared allow-list in retention_scope, so widening it is a visible, reviewable change and not an edit to a query.
  • What it does NOT touch, by construction. Billing and payment records — invoices, invoice_chases, payment_events — are not in that allow-list and cannot be reached by the purge at all. They are kept for the statutory period; the exact figure is the open solicitor question immediately below, and this change does not pre-empt it. Opt-out records (customer_suppression) are refused by a database constraint rather than by convention, because deleting an opt-out would restart the messaging the person asked to stop.
  • It is reversible for 30 days. Nothing is deleted outright. The first pass copies the row verbatim into purge_quarantine and removes it from the live table; a second pass hard-deletes only after the 30-day grace, and a restore puts the row back in the meantime.
  • What it deletes today: nothing. No client has left, so no row is eligible. The rule is armed for the future rather than acting now, and the monthly report states the eligible count.

The "Proposed retention" column above remains a proposal, and outside the two tables named here nothing in it is enforced by a job. No document in this set should be read as promising automatic deletion of anything else.

RULED 2026-09-02: 6 YEARS — AND THE START POINT WAS ALSO WRONG. The Privacy Policy said client data is kept 7 years from the end of the contract, citing Guernsey financial record-keeping. Both halves of that sentence were wrong. The States of Guernsey record-keeping requirements under the Income Tax Law name 6 years for companies and legal entities, and the period runs from the end of the year in which the return is submitted, not from the end of the contract. 7 is not a Guernsey number — it is the UK convention, and the Privacy Policy cited Guernsey for it, which the source does not support. Under data protection the direction of the error also matters: holding personal data a year beyond the statutory period is an extra year of exposure with no justification, so longer is not safer. The Privacy Policy, the table above and DPA §7.2 now all read 6 years.

[SOLICITOR] — WHAT IS STILL OPEN, AND IT IS NOT THE NUMBER. A sole trader does not sit cleanly inside either bracket of that source: 6 years applies to companies and legal entities, and a separate 2-year period applies to individuals. Which one binds a Guernsey sole trader serving UK clients is a legal judgement and is deliberately not resolved here. **Publishing 6 while that is open is defensible; publishing 7 with a citation the source does not support was not.** Tracked as LEGAL-RETENTION-6-VS-7-YEARS.


7. Access control


8. Deletion / your rights

On request, and always on offboarding, a client's data is exported in standard formats and then deleted from the operational database and from future backups (older encrypted backups age out under the backup retention window). See Offboarding for the process and the rehearsed handover.


*Related: Service Level Agreement · Offboarding · our how-it-works notes · our internal incident runbook. The binding privacy policy and DPA are separate solicitor-drafted documents; this overview must be reconciled with them.*