Legal

Subprocessors

The outside services that can hold or see personal data 1Stop processes, listed against a direct read of the code that is actually deployed.

Draft pending legal review

No lawyer has reviewed this document. It was drafted in-house so counsel has something concrete to mark up, and it is published here for that purpose. It is not legal advice, and 1Stop does not represent that it is enforceable as written. Nothing on this page should be relied on until a licensed attorney has signed off on it.

Version
0.1
Drafted
7 October 2026
Status
Draft, not in force

1What this page is

These are the third parties that can hold or see the personal data 1Stop processes, listed so a Client can check them before signing. Personal data here means names, work emails, phone numbers, property and unit addresses, job start and end coordinates, photographs of the interiors of private residences, IP addresses and user agents recorded on signatures and audit rows, and invoice amounts.

This is a factual inventory taken directly from the code as it stands. It is not a legal representation, it does not assert compliance with any law, and it is a draft that has not been reviewed by a licensed attorney.

2The list

Five companies currently receive data because the deployed code sends it to them.

ServiceWhat it doesWhat it receivesStatus
Hetzner Online GmbHHosts the application, the Postgres database and the web serverEvery piece of personal data 1Stop processes, because it sits on Hetzner's disksIn use
Amazon Web Services, Inc.Amazon S3 object storage, in the us-west-2 regionUploaded photographs, compliance documents, vendor logos and generated PDFsOnly when configured
Amazon Web Services, Inc.Amazon SES, which delivers outbound email, including sign-in passcodesThe recipient's email address and the contents of the messageOnly when configured
Cloudflare, Inc.Turnstile, which checks that a person is submitting a public formThe visitor's IP address and information about their browser, on pages with a public formOnly when configured
Stripe, Inc.Payment processing: invoices Clients, takes their payments and pays vendors outClient billing names and emails, invoice lines and amounts, vendor business names and emails, payout amounts, and the payment and bank details people enter on Stripe's own pagesOnly when configured
Anthropic, PBCAI drafting: fills in a service request from one sentence, and drafts email replies for HQ staff to editThe sentence a property manager types, with their saved property names, addresses and units; the text, names and email addresses of a mail conversation a staff member asks to draft fromOnly when configured
2.1

Hetzner, hosting. The whole application, the Postgres database and the web server run on a single Hetzner server, so Hetzner holds the disks that every piece of personal data 1Stop processes sits on.

2.2

Amazon Web Services, object storage. The storage adapter signs its own requests and sends them to whichever S3 endpoint it is configured with; the production deployment points it at Amazon S3 at https://s3.us-west-2.amazonaws.com, in the bucket 1stop-prod-uploads. What it receives is every uploaded file: before and after photographs of unit interiors, uploaded compliance documents such as certificates of insurance and W-9s, vendor logos, and generated PDF documents. This path is only active when the four STORAGE_S3_* environment variables are set. When they are not set, files are written to local disk on the Hetzner server instead and nothing reaches Amazon. The us-west-2 region is in the United States, so this is the point at which uploaded files leave Hetzner infrastructure.

Source: src/lib/storage/s3.ts and src/lib/storage/index.ts.

2.3

Amazon Web Services, email delivery. Outbound email is sent through Amazon SES in the us-west-2 region, from noreply@1stopservicepro.com. That includes the one-time passcode a provider or crew member signs in with. What it receives is the recipient's email address and the contents of the message. This path is only live when SES_REGION, SES_FROM_ADDRESS, SES_ACCESS_KEY_ID and SES_SECRET_ACCESS_KEY are all set. When they are not set, the message is written to the server log instead and no data leaves the server.

Source: src/lib/env.ts, where the SES configuration is declared.

2.4

Cloudflare, bot protection. The sign-in pages, the crew passcode request, the forgot and reset password forms, and the service request and vendor application forms load Cloudflare Turnstile from https://challenges.cloudflare.com. Turnstile checks that a person, and not a script, is filling in the form, and it usually does so without showing the visitor anything. For that check the browser sends Cloudflare information about itself, and Cloudflare sees the visitor's IP address because the browser connects to Cloudflare's servers. When the form is submitted, the application sends Cloudflare the one-time token the check produced and the visitor's IP address, and Cloudflare answers whether the check passed. Nothing typed into the form goes to Cloudflare, and pages without one of these forms do not load Turnstile. This path is only live when TURNSTILE_SITE_KEY and TURNSTILE_SECRET_KEY are both set. When they are not set, no page loads Turnstile and nothing reaches Cloudflare.

Source: src/components/bot/BotCheck.tsx and src/lib/bot/turnstile.ts.

2.5

Stripe, payments and payouts. When HQ sends a Client an invoice, the application gives Stripe the Client organization's name and billing email, and each invoice line with its amount and description, which can carry a work order reference. Stripe emails the invoice, and the Client pays on Stripe's hosted invoice page, so card and bank details go to Stripe and never pass through 1Stop's server. When a vendor sets up payouts, the application opens a Stripe Express account with the vendor's business name and email, and the vendor gives Stripe their bank and identity details on Stripe's own onboarding pages. Paying a vendor sends Stripe the amount and the payout reference, and Stripe reports what happened back through a signed webhook. Stripe is in the United States. This path is only live when STRIPE_SECRET_KEY is set. When it is not set, nothing reaches Stripe.

Source: src/lib/payments/invoices.ts, src/lib/payments/payouts.ts and src/app/api/stripe/webhook/route.ts.

2.6

Anthropic, AI drafting. Two features send text to Anthropic's Claude models, and only when someone uses them. On the new request form, a property manager can describe a job in one sentence and have the form filled in. That sentence goes to Anthropic, with the names, addresses and unit labels of the manager's saved properties, so the model can tell which one is meant. In HQ's mail client, a staff member can ask for a draft reply to an email. The text of that conversation goes to Anthropic, with the names and email addresses in it. The draft comes back to the staff member, who edits it and sends it, and the model never sends anything itself. Anthropic is in the United States. This path is only live when ANTHROPIC_API_KEY is set. When it is not set, nothing reaches Anthropic.

Source: src/lib/ai/intake/claude.ts and src/lib/ai/mail-draft/.

3Declared but not connected

One environment variable exists in the project's example configuration file without any code path that uses it. A variable existing in an example configuration file is not the same as a service being used, and it receives nothing today.

3.1

A map tile provider. A MAP_TILE_URL variable exists in .env.example, but it is never read anywhere in the code, and no mapping library is installed. No tile provider receives anything, and no map request carries a property address or a coordinate to a third party today.

4Not subprocessors

Three components are worth naming here so nobody assumes they are third parties receiving data.

4.1

Postgres. The database runs in a container on the same Hetzner server that runs the application. It is not a managed third-party database service, and no data leaves the server to reach it.

4.2

Google Fonts. Typefaces are loaded through Next.js next/font/google, which downloads the font files at build time and serves them from 1Stop's own domain. A visitor's browser makes no request to Google, and Google receives no visitor IP address.

4.3

GlitchTip, error tracking. When error tracking is switched on and the application or a visitor's browser hits an error, a report of it goes to a GlitchTip instance running in a container on the same Hetzner server, with its data in the same Postgres. GlitchTip is open-source software that 1Stop runs itself rather than a hosted service, so the reports stay on the server. A browser sends its reports to 1Stop's own domain, which passes them on. Before a report is stored, the application removes cookies, request bodies, passwords, tokens, passcodes, email addresses and phone numbers from it. Nothing records a visitor's session.

Source: src/lib/observability/scrub.ts and the glitchtip service in docker/compose.prod.yml.

5What is not here

The absences below matter as much as the entries above. Each one is a category of service that many comparable platforms use, and that this deployment does not.

  • No analytics or product-analytics service of any kind. No Google Analytics, no Plausible, no PostHog, no Segment, no Mixpanel.
  • No third-party error monitoring or crash reporting service. No Sentry, no Datadog. Error reports stay on 1Stop's own server, in the GlitchTip instance described in 4.3.
  • No advertising or marketing pixel, and no tag manager.
  • No payment processor other than Stripe, described in 2.5.
  • No third-party electronic signature vendor. Signing happens in the application itself.
  • No third-party identity provider. Sign-in is by email and password or by a passcode sent by email, so no Google, Microsoft or Apple sign-in, and no identity provider receives anything.
  • No content delivery network. The only third-party script and iframe is the Cloudflare Turnstile check described in 2.4, and it loads only on pages with a public form, once Turnstile is configured. On every other page a visitor's browser contacts 1Stop's own domain and nothing else.
  • No artificial intelligence or machine learning service other than Anthropic, described in 2.6. No other model provider receives anything.

6Changes to this list

This list describes the code as it stands and the services it is wired to call. Whether the object storage, email, payment, AI and error tracking variables are actually set in the production environment is a deployment question, separate from what the code contains, so this page will be republished if that changes.

If a new subprocessor is added, this page will be updated and Clients will be given [a change-notice period for adding a subprocessor to be set with counsel] before the new subprocessor begins processing data.

See also the Privacy Policy and the contact page for questions about this list.