Skip to main content
Security in a commerce platform is a shared responsibility. Galactic Core secures the infrastructure, the data boundaries, and the money path; your integration secures its keys and its own request handling. The platform’s boundaries are enforced below the application, in the infrastructure, so a bug in application code cannot cross them. Where each responsibility sits is set out below and summarized in the table at the end.

Tenant isolation

Every merchant’s data is isolated, and the isolation never depends on application code remembering to filter. On the shared platform, row-level security in the database scopes every read and write to a single store, so a query cannot reach another store’s data even on a shared table. Tenants who need physical separation rather than a logical one — a marketplace operator, an enterprise client — run on a dedicated deployment: a separate database and API layer whose incident cannot affect another tenant. Both are covered in depth in Data Model & Multi-tenancy. A merchant’s own automation — a custom extension, or an AI-generated one such as an ad-optimization rule — does not get direct database access when it needs to read the store’s data. It reads a governed set of business concepts (revenue and margin by product, stock at risk, campaign performance, active promotions, and the like) exposed as a fixed, read-only interface. Every concept is scoped to the automation’s own store and returns computed business facts rather than raw records, so an automation can act on detailed signals without being able to reach another tenant’s data or a table it was not meant to see. Which store a row belongs to and which staff member may act on it are separate questions, and both are answered in the database. Each staff member’s role determines which tables they may read and write — resolved on the server for every request and applied as a database policy per operation, so reading a record and changing it can require different permissions. A cashier can complete a sale without being able to open the general ledger or alter a customer record, and that holds regardless of what the interface offers, because the boundary is enforced beneath the application rather than inside it. Roles are per store and fully customizable: a store defines the roles it needs, and the permissions attached to each are what the database enforces.

Authentication and access

Access to the API is by key, and the key type determines what it can do.

Publishable keys

For the storefront — safe to ship in a browser or mobile bundle. A publishable key reads catalog and other non-sensitive data, and can make the writes a shopper performs on their own behalf: adding to a cart or wishlist, submitting a review, sending a message, lodging a return, updating their own profile. It cannot place or modify orders, take payments, sign customers in, or touch store-wide or other customers’ data.

Secret keys

Full read/write access, for server-side use only. Orders, payments, customer sign-in, and any store-management write require a secret key — which must never reach the browser.
Writes a publishable key makes that act on a specific shopper’s data — their wishlist, reviews, returns, messages, and profile — additionally require that shopper’s own session token, so one shopper’s key can never act for another. Cart updates, stock reservations, newsletter sign-up, and anonymous analytics events are accepted without a session, because that is how a storefront works before a shopper logs in. Keys are stored only as a one-way hash — the platform keeps a fingerprint of each key, never the key itself, so a key is shown to you exactly once, at creation, and cannot be recovered afterward. Each request is authenticated and resolves to exactly one store before any data is touched. Keys also carry scopes: an integration authorized through Login with GC receives only the specific permissions the merchant approved, and a request outside those permissions is refused. Full details of the key model, environments, and request signing are in Authentication.

Data in transit and at rest

All API traffic is served over HTTPS/TLS; there is no plaintext endpoint. Sensitive values a merchant stores with the platform — payment-processor credentials, integration tokens — are encrypted at rest in a managed secrets vault, not in an ordinary table column, and the plaintext is never returned to the browser after it is entered. What the merchant sees afterward is a masked reference; the secret itself is used only server-side, to talk to the provider it belongs to.

Payment integrity

The payment path is designed so that the platform never holds funds and never sees raw card details.
1

Card details go straight to the processor

Card entry happens on the payment processor’s hosted checkout, not on a Galactic Core page. Card numbers never reach the platform’s servers or database — the platform stores only a payment reference, never a card number.
2

The processor holds the money

For marketplace payments, funds are captured by the processor and paid out to each merchant’s own connected account. The platform never custodies money; it only directs the split. This is what keeps marketplace operators outside money-transmitter territory.
3

Amounts are recomputed server-side

Prices, tax, shipping, discounts, and the order total are re-derived from the authoritative catalog when an order is placed. A client that submits a tampered price or total is rejected — the amount the customer is charged is the platform’s figure, never the client’s.
4

Payment confirmations are verified at the source

When a payment is confirmed, the platform re-checks the transaction directly with the processor and reads the amount and status from the processor’s own response. Provider webhooks are cryptographically signature-verified, and a notification that fails verification — or arrives without a signature — is rejected before it can affect an order.
The most sensitive server-to-server writes — placing or updating an order, initializing a payment, and pushing a catalog into the platform — additionally require a request signature, so a request that isn’t signed with the store’s secret is rejected even if it carries a valid key. Order placement also requires an idempotency key, so a retried request can never become a duplicate order. See Authentication for how to sign requests and Custom Integrations for handling payment webhooks in your own code.

Running your own code safely

Custom integrations let a merchant’s own code participate in the platform’s flows, which means the platform treats that code as untrusted and bounds what it can reach and how long it can run.
1

Merchant code never shares an isolate with platform code

A hosted handler runs in its own sandbox with no platform credentials, no database connection, and no access to another store’s data. Its provider secrets are held in an encrypted vault and injected for the duration of a single invocation.
2

Outbound requests cannot reach internal addresses

Any URL a function calls — and any endpoint registered for remote execution — is checked before the request is made. Loopback, private, link-local, and cloud-metadata addresses are refused, so a function cannot be used to probe infrastructure from the inside.
3

Nothing runs unbounded

Every invocation has a hard timeout, a cap on outbound calls and response size, and a per-store monthly ceiling. A function that repeatedly fails is disabled automatically, and one that is slow or errors on a checkout path is bypassed rather than allowed to block a sale.
4

What a function returns is not taken on trust

A returned payment status, tax figure, or shipping amount is revalidated against the platform’s own authoritative data before it affects an order. A custom provider cannot mark an order paid, discount a total, or alter an amount by asserting it.

Inbound provider callbacks

An extension can be given a URL for providers that report results asynchronously. Because that URL is publicly reachable and triggers merchant code, it carries its own controls. The URL embeds a 32-byte random secret held only as a hash, so it cannot be derived from a database read and cannot be guessed. On top of that, each extension declares how a caller proves its identity: a verified signature where the provider signs its callbacks, or an allow-list of the provider’s source addresses where it does not. A request that fails any of these checks — including one that simply omits a required signature — is refused, and every refusal is recorded in the extension’s run log so a misconfiguration is visible rather than silent. Failures are answered identically to an unknown URL, so the endpoint cannot be used to discover which extensions exist. The payload itself is treated strictly as input. The store, environment, and extension are resolved from the URL, never from a field in the body, so a callback cannot name a different store, select a different extension, or raise an amount. Callbacks are rate-limited per extension and size-bounded, and a lost or leaked URL is revoked by generating a replacement, which invalidates the previous one immediately.

Environment separation

Test and live data never mix. The key prefix chooses the environment — tybrite_sk_test_ / tybrite_pk_test_ operate on isolated sandbox data, …_live_ on production — and the two are stored under a separate environment marker so a test order can never appear in live reporting. Sandbox data is purged on a schedule, so test runs don’t accumulate. Because the environment is fixed by the key, there is no way for a live key to read sandbox data or the reverse.

Data protection and privacy

The data in a store belongs to the merchant, and the tools to exercise GDPR and CCPA data-subject rights over it are self-service: the merchant runs them directly, from their own dashboard, without going through us. A store’s data is never shared with anyone else; we would only step in to help produce an export if a merchant were unable to run one themselves.

Access and portability

A merchant can export a complete copy of their own store’s data — customers, orders, catalog, accounting, and the rest — as a portable archive of spreadsheets, from Settings → Data Export, with sensitive credentials excluded. They can also produce the data held about an individual customer to satisfy a request that customer makes to them.

Erasure

A merchant can delete an individual customer’s personal data, and can request deletion of their entire store. Erasure removes the personal data across the stores where it lives.
Beyond those operations, the platform minimizes and ages out the personal data it holds: personal details in payment transaction logs are automatically redacted after 90 days (the financial audit trail — reference, amount, status — is kept) and the records deleted entirely after a year, abandoned and test data are purged on a schedule, and each merchant’s data stays walled off in its own tenant. The database is backed up continuously with point-in-time recovery — see Scaling & Reliability.

Stores on an operated platform

A store can belong to a platform run by an agency rather than directly to Galactic Core. Everything on this page still applies to it unchanged — the isolation, the payment integrity, the environment separation are properties of the platform, not of who sold the store. What that arrangement adds is an operator layer with controls of its own: the agency holds its own registrations for the outside tools its merchants connect, a merchant’s own account credentials remain scoped to that merchant’s store, and the agency’s consequential settings — pricing, billing credentials, integration credentials — require a fresh confirmation code rather than a live session. Those controls are described for operators in Running your own platform.

Shared responsibility

The platform secures the infrastructure and the boundaries; you secure how your integration uses it. The split:
Found a security issue? We appreciate responsible disclosure — email security@tybritelabs.com and we will work with you on it. Please give us a chance to address it before any public disclosure.

Authentication

Key types, scopes, environments, and request signing in detail.

Data Model & Multi-tenancy

How row-level security and dedicated deployments keep tenants separate.

What the platform refuses to do

Security decides who can reach what. A separate set of rules decides what Galactic Core declines to do even for a caller who is fully authorized: selling below cost, taking a live payment through a test processor, letting an automation run unattended indefinitely. Those are covered in Guardrails. The same page covers the business schema the in-app assistant reads through, which is a question of what the platform declines to expose rather than of who is authenticated: a fixed, named layer of business concepts stands between the assistant and your data, the store is bound before any concept is read, and margin arrives already computed rather than as the cost behind it.