Legal

Subprocessors

Last updated 21 August 2026 ยท Version 1

Last updated: 2026-08-21

We use the third-party providers below to deliver the service. We engage each under written terms with data-protection obligations equivalent to our own, and we remain responsible for their processing. We give at least 30 days' notice of additions or changes (see the DPA); to be notified, email privacy@fin-central.com.

Several rows are conditional: the service integrates with them only when the corresponding feature is configured, and with no key configured no data reaches that provider at all. The hosting and monitoring entries are set by the operator of this instance, because they are properties of the deployment rather than of the software; npm run check:legal --strict refuses to build a release while either is unstated.

SubprocessorPurposeLocationWhen used
OVHcloud (OVH SAS)Application & server hostingUnited Kingdom (London)Always
PostgreSQL, run inside this deploymentPrimary data storageSame as hosting, aboveAlways
Resend (Resend, Inc.)Transactional email โ€” sign-in, password reset, weekly digestUSOnly when an email API key is configured; with none set the app sends no email
Stripe Payments EuropeSubscription billing & card processingEU / UKOnly if billing is enabled
Xero, Intuit (QuickBooks), SageAccounting data sync via your OAuth consentUK / EU / USOnly if you connect that system
TrueLayerOpen-banking data (bank feeds)UK / EUOnly if you connect Open Banking
OpenRouter, Anthropic or OpenAI โ€” whichever the operator has configuredGenerating AI commentary & copilot answersUS, under the UK IDTA / SCCsOnly if AI features are enabled; with no key configured the assistant answers from the ledger alone and nothing is sent
Amazon Web Services (S3) or Cloudflare (R2)Uploaded evidence & attachment storageOperator-selected regionOnly if the file-storage driver is set to S3/R2; the default keeps files in the database above
Amazon Web Services (KMS) or Google Cloud KMSEnvelope encryption of connector credentialsOperator-selected regionOnly if managed KMS is configured; the default uses a local key
SerpAPI (SerpApi, LLC)Identifying the vendor behind an unrecognised bank-transaction description, for the recurring-payments and supplier featuresUS, under the UK IDTA / SCCsOnly if SERPAPI_API_KEY is set. With no key set, no search request is made and the feature falls back to a local dictionary
Microsoft (Bing Search API)Same purpose as the row above; the alternative search engineUS, under the UK IDTA / SCCsOnly if BING_SEARCH_API_KEY is set and no SerpAPI key is. With no key set, nothing is sent
NoneError/uptime monitoring and website analyticsSame as hosting, above unless stated otherwiseIf enabled by the operator

Accounting connectors and AI providers only receive the data necessary for the feature you enable. AI features can be turned off per organisation, in which case no data is sent to an AI provider.

On the search engines, precisely. When vendor enrichment is enabled, what leaves this deployment is the normalised description text of a bank transaction โ€” for example ADOBE * 800 LICENSE 4071 โ€” sent as a search query so the vendor behind it can be named. That text can contain a counterparty's name. It is sent with no account number, no amount, no date, no other transaction field and nothing identifying you or your organisation. If a key is set for one of these engines and AI features are also enabled, the top few search results are then passed to the AI provider named above to extract the vendor name. Enrichment is off unless the operator sets a search key; those two environment variables are the only switch, and with neither set the feature uses a built-in dictionary and makes no outbound request.

The database is not a separate third-party subprocessor: PostgreSQL runs as part of this deployment, on the hosting provider named in the first row.

On monitoring and analytics, precisely. The application bundles no error-reporting or product-analytics library โ€” there is no Sentry, Datadog, Bugsnag, Rollbar, LogRocket, PostHog, Segment or similar dependency, and no such code runs. It does include one optional, off-by-default loader for a privacy-first website analytics script (Plausible, or Google Analytics 4 as an alternative). That loader emits nothing at all unless the operator sets NEXT_PUBLIC_PLAUSIBLE_DOMAIN or NEXT_PUBLIC_GA_ID; with neither set, no third-party script is requested and no browser of yours contacts anyone but this deployment. If the operator has enabled it, the provider is named in the monitoring row above โ€” npm run check:legal --strict refuses to release a build that claims "None" while an analytics key is configured.