Yielde
Security
Auth, encryption, webhook signatures, LLM data path, per-tenant isolation, POPIA. Written for the operator doing diligence, not for an annual report.
Last updated
Authentication
Sign-in is passwordless. We use Supabase magic-link email auth, so no passwords are stored and there is no password-reuse risk. Session cookies are HTTP-only and refreshed on every request through middleware so a leaked session expires on its own cadence.
Admin access to the platform is gated by an explicit email allowlist held in environment configuration. There is no 'forgot password' email path because there is no password.
Where your data lives
Tenant workspaces run on AWS in Cape Town (af-south-1). That is where your n8n workflows execute, where your LLM gateway proxies requests, and where the per-tenant virtual key for LLM usage is held.
Account, billing, lifecycle, and form-submission records live in Supabase (managed Postgres), hosted in the EU at AWS eu-west-1 (Dublin, Ireland). That is a cross-border flow from South Africa to the EU, whose GDPR regime is treated as providing protection substantially similar to POPIA. Booking and admin tooling reads from the same project.
Static marketing assets and the application itself are served by Vercel's edge network.
Encryption in transit and at rest
Every public endpoint is HTTPS-only with TLS terminated at Vercel (marketing + portal) or at the per-tenant ingress on AWS (workspace traffic). HSTS is enforced.
Supabase storage is encrypted at rest. On the AWS side, volume-level encryption for workspace storage is not enabled yet; we would rather tell you that here than claim it early. This line changes the day it ships.
Secrets (Paystack keys, LiteLLM virtual keys, Supabase service-role keys, webhook signing secrets) live in Vercel and Infisical environments. Nothing sensitive is ever prefixed with `NEXT_PUBLIC_`.
Webhook signatures
Every inbound webhook is signature-verified before its payload is trusted:
- Paystack: HMAC-SHA512 against the body, using the live secret key.
- Documenso (DPA signing): HMAC per Documenso's spec, with our per-tenant secret.
- Portal-api ↔ site (provisioning + status): HMAC-SHA256 over `timestamp.method.path`, with `X-Yielde-Timestamp` and `X-Yielde-Signature`. The same scheme governs the Vercel ↔ n8n hop with `X-Yielde-Tenant`.
A failed signature check returns a flat 401 with a generic error and no echo of the submitted body or signature, so an attacker cannot probe their attempts against reflected content.
LLM data path
Every model call, whether from your workflows, your voice receptionist, your chatbot, or the new in-dashboard AI Chat, flows through LiteLLM, our self-hosted gateway, which routes to OpenRouter, which dispatches the request to the chosen upstream model. The completion streams straight back to you. No Yielde process calls OpenAI, Anthropic, or any provider directly, and the browser never sees an upstream API key.
That gives us four things at once: rotation control (one key change rotates a tenant's access), cost attribution per workflow, model-failover for the few customer-facing surfaces that need it, and a single redaction point if a provider ever changes its terms.
Customer prompts and completions are not used to train any model. Through OpenRouter we reach a range of leading models (the OpenAI GPT family, Anthropic Claude, and others), and AI Chat lets you pick the model per message. Our gateway logs metadata only (model, token counts, latency, cost), never the request or response content. Once the provider returns a completion and we hand it back to you, that is the end of that prompt's life in our system.
Per-tenant isolation
Each tenant gets a dedicated subdomain (`<slug>.yielde.dev`), a dedicated n8n container, a dedicated LiteLLM virtual key, and a dedicated webhook signing secret. There is no shared workflow runtime, so a noisy workflow in one tenant cannot starve another, and a credential leak in one tenant cannot read another's data.
Tenant boundaries are enforced server-side by `lifecycle_state` (the single source of truth for what a logged-in client can see) and by Supabase row-level security on every customer-facing table.
POPIA
Yielde is the operator of the platform; you remain the responsible party for your customer data. Every workspace requires a signed Data Processing Agreement before activation, signed through our self-hosted e-signature flow (Documenso, hosted in South Africa).
POPIA Section 19 obligations (integrity and confidentiality of personal information) inform every choice on this page: encryption, signed transport, per-tenant isolation, the LLM gateway, the lifecycle gate.
A small number of family-business pilots are exempted from the DPA gate; they are still required to pass the payment gate, and the carve-out is held in an explicit allowlist in environment configuration, not in code.
Subprocessors
The third parties that process customer data on our behalf:
- Supabase: managed Postgres, auth, storage (AWS eu-west-1, Dublin, Ireland, EU).
- Vercel: hosting and edge delivery.
- AWS (af-south-1, Cape Town): per-tenant workspace compute and storage.
- Paystack: payment processing.
- Documenso: DPA e-signing, self-hosted in South Africa.
- Retell: voice receptionist transport.
- OpenRouter: AI model router, reached only through our LiteLLM gateway; it dispatches each prompt to the chosen upstream model.
- OpenAI, Anthropic, and other model providers: LLM inference, reached through LiteLLM → OpenRouter.
- Cloudflare: DNS.
We update this list before introducing a new subprocessor and surface the change in /changelog.
What we don't have yet
Honesty matters more than a clean compliance badge. As of today Yielde does not hold SOC 2, ISO 27001, or any equivalent third-party audit attestation. We are a young company shipping fast; that is the right trade-off for our customers right now, and not the right trade-off for every customer. If a formal audit is a hard requirement for you, please tell us up front so we can be straight about timelines.
We also do not run a formal bug-bounty programme yet, although we read and respond to every report. See below.
Reporting a security issue
Email security@yielde.dev with a clear description and reproduction steps. Encrypt the message if you can (PGP key on request).
We acknowledge within 24 hours and aim to triage and respond within 72. We will not pursue legal action against good-faith research disclosed privately and given a reasonable window to remediate before publication.