When you sell to EU businesses you are a processor acting on your customer's instructions, and they are the controller. Article 28 requires a written contract, and your customers will ask for one before signing. This page covers the register you must publish and the clauses you must be able to meet.

Your dual role

RelationshipYour roleTheir role
End user signing up directly (B2C)ControllerData subject
Business customer whose employees use your productProcessorController
You ↔ Supabase, Stripe, OpenRouter, AI model providersController (or processor)Subprocessor

Both roles apply simultaneously in a B2B deployment. The ROPA documents you as controller; this page covers you as processor.

Subprocessor register

Publish this list and keep it current. Article 28(2) requires informing controllers of intended changes so they can object — you cannot do that if you never published a baseline.

SubprocessorPurposeDataLocationRequired
SupabaseDatabase, auth, storageAll application dataPer project regionYes
StripePaymentsBilling identifiers, amountsEU/USIf billing enabled
Vercel (or your host)Application hostingRequest data in transitGlobal edgeYes
OpenRouter, Inc.LLM gateway, routing, embeddingsPrompts, documents, request metadataUS; downstream regions varyIf AI_LLM_TRANSPORT=openrouter
OpenAILLM inference, embeddingsPrompts, documentsEU/USIf OPENAI_API_KEY set
AnthropicLLM inferencePromptsEU/USIf ANTHROPIC_API_KEY set
GoogleLLM inferencePromptsEU/USIf GOOGLE_AI_API_KEY set
Brevo or MailjetTransactional + marketing emailEmail, name, message contentEUPer EMAIL_PROVIDER
UpstashRate limitingHashed identifiersConfigurableProduction
CloudflareTurnstile, optional CDNIP, request metadataGlobalIf enabled

The AI providers listed here must match AI_PROVIDER_DISCLOSURES in config/ai-act.ts and what /[locale]/ai-transparency renders. Three surfaces, one truth — if they disagree, the published notice is wrong somewhere.

Before launch, sign a DPA with each one you actually use. Most publish a standard DPA you accept in their dashboard; some require a signed copy. Accepting terms of service is not signing a DPA.

What customers will require

Art. 28(3) clauses

Your customer DPA must commit you to: process only on documented instructions; ensure personnel confidentiality; implement Art. 32 security measures; respect subprocessor rules; assist with data-subject requests; assist with Art. 32–36 obligations; delete or return data at contract end; and submit to audits.

The clauses that actually bite

ClauseWhat the boilerplate gives you
Data-subject request assistanceGET /api/user/export-data (Art. 15/20) and the 30-day deletion queue (Art. 17). Note the export is per user, not per customer-workspace — if a controller asks for everything about their whole organisation, you will assemble it manually.
Breach notification to controllerBreach runbook. Art. 33(2) says "without undue delay" — no 72-hour grace for processors, and your DPA probably sets 24 or 48 hours. Check what you signed.
Deletion at contract endprocess-account-deletions covers Storage objects and auth.users, not only rows. Billing records survive on a legal-obligation basis — say so in the DPA rather than promising deletion you will not perform.
Subprocessor change noticeNot automated. You need a mechanism (email list, changelog, status page) before you sign a contract requiring 30 days' notice.
Audit rightsUsually satisfied by a SOC 2 or ISO 27001 report. Without one, expect questionnaires.

The AI clause you will be asked about

Enterprise buyers now ask specifically: is our data used to train models? You must be able to answer definitively for every configured provider.

OpenRouter mode sends zdr: true and data_collection: "deny" on every chat and embedding request, and requires routes that accept the supplied parameters. That is an enforced routing preference, not a substitute for a DPA or an independent guarantee about every upstream model host. Verify OpenRouter's policy and the returned upstream provider for your account.

Direct mode cannot create contractual ZDR from application code. Direct OpenAI calls set store: false and the SDK ZDR flag, but OpenAI ZDR eligibility is an organization/project control. Anthropic and Google retention similarly depends on the API product, account settings, region, and agreement. Record the evidence for every enabled direct provider; "we believe so" fails a procurement review.

International transfers

Prompts and account data reach US-based subprocessors. Your lawful transfer mechanism is normally Standard Contractual Clauses and/or the provider's Data Privacy Framework certification, both of which sit inside their DPA.

Article 46 also expects a transfer impact assessment. For most SaaS this is a short document recording which providers are involved, which mechanism applies, and what supplementary measures exist (encryption in transit and at rest, access controls, retention limits). Short is fine; absent is not.

Maintenance

Review when you add or remove a provider, change EMAIL_PROVIDER, enable a new LLM provider, or change hosting region. Every change here means: update this page, update AI_PROVIDER_DISCLOSURES, notify controllers per your DPA, and bump PRIVACY_POLICY_VERSION in config/compliance.ts.