What your IT team will ask, answered.
DemandRadar is an early product, built and tested so far on synthetic data. This page says what is in place today and what is not, so nothing surprises you in a security review.
Where does it run?
In your cloud or ours. It is the same software either way.
What data does it handle?
Weekly totals by store and category. DemandRadar does not need or store customer, shopper, payment or employee HR data.
| Data | Sensitivity |
|---|---|
| Weekly sales and plan by store and category | Confidential business data. Totals only: no transactions, baskets or SKUs required. |
| In-stock rates and promotions | Confidential business data. |
| Store list with coordinates | Low. |
| User email, display name and role | Personal data (business contact), supplied by your identity provider. |
| Commentary, cause labels and weekly pulse answers | Confidential. |
How do people sign in?
Through your own identity provider, using OpenID Connect. Microsoft Entra ID, Okta, Auth0 and Ping are supported.
- Your provider, registered to your tenant. Every sign-in token is verified against your provider's own signing keys: signature, issuer, audience and expiry. A token from an issuer nobody registered is refused.
- No passwords are stored. Multi-factor sign-in and conditional access are enforced by your identity provider.
- Four roles: viewer, planner, analyst and admin. Permissions are checked on every API route, not only hidden in the screen.
- Roles assigned in your identity provider are the source of truth. A change takes effect on the user's next request. By default, a token that carries no DemandRadar role is refused even if the account exists, so removing the role removes access.
- Deactivating an account in Admin always wins, whatever the token says.
- No single sign-on of your own? A shared provider can serve several customers. There the signed tenant claim in the token selects the customer, and a token without it is refused.
How is our data kept apart from other customers?
In two layers, both covered by automated tests.
- In the application. Every query is filtered to your tenant, and a write aimed at another tenant raises an error.
- In the database. PostgreSQL row-level security is forced on every tenant table, and a test fails if a tenant table is added without it. It depends on the application connecting as an unprivileged role, and the supplied deployment files create one.
- The tenant comes from the verified token. An identity provider can be registered to one customer only, so a token from one customer's provider cannot be steered into another customer's data. No request header or unsigned value chooses a tenant.
- Background work follows the same rules. Scheduled runs and the retention purge each work inside one tenant, under both layers.
What is logged?
Every change made through the application writes an audit event: who, what, which record, when, and the request id. For settings, the before and after values are kept. Accounts created or given a new role at sign-in are logged too, as are identity provider changes and every retention purge. Admins read the log in the app.
Two limits to know about. The application only ever adds audit rows, but the database does not yet stop an administrator with direct database access from altering them. The operator commands that create a tenant or add a user are not audited.
How is AI used?
It is optional. The built-in writer needs no outside service and is the default.
- Off until you turn it on. One of your admins must enable an AI writer and choose the provider.
- Aggregates only. The model receives the week's summarized facts. No raw rows and no user data.
- Every number checked. A draft containing a figure that does not match your data is discarded and the built-in writer is used instead.
- Azure OpenAI is supported, so inference can stay inside your own Azure tenant.
- No training on your data. DemandRadar does not use customer data to train any model. Your planners' confirmations and corrections stay in your tenant and you can export them.
How is it built and operated?
- Locked-down containers. The API and scheduler run as a non-root user with a read-only filesystem.
- Encrypted in transit. TLS terminates at the ingress or load balancer in front of the app.
- Encryption at rest and backups come from the PostgreSQL service you choose, for example Azure Database for PostgreSQL or Amazon RDS.
- Secrets stay out of the database and the logs. They come from environment variables or your secret manager.
- Quiet logs. Structured, with no request bodies and no sales figures.
- Uploads are data, never code. Files are size-limited, parsed as CSV or Excel and never executed. A file with more than 20% bad rows is rejected so a bad export cannot overwrite good data.
- Rate limits in the API. Per signed-in user, per address for requests without valid credentials, and a tighter limit for uploads and run triggers. A refused request gets a 429 response.
- Retention is enforced daily. Sales data and the reviews built on it are deleted once older than the retention period you set (730 days by default, 30 at minimum). Audit events are kept for seven years by default.
- No third parties in the browser. The web app serves its own fonts and scripts and calls no outside origins.
What is not in place yet?
Stated plainly, so there are no surprises in review.
- No SOC 2 report and no third-party penetration test yet.
- Identity providers are registered by a DemandRadar operator. There is no self-service screen for your admin yet.
- Accounts are matched by email. The email claim must come from an attribute your users cannot edit themselves.
- Tokens are not checked for revocation. Each token is verified on every request, but one already issued stays usable until it expires. Keep access token lifetimes to an hour or less.
- The email-verified claim is not checked. On a shared provider that lets people sign up with an address they do not own, restrict who can receive the tenant claim.
- Rate limits are counted per API process, not shared across replicas. A refused token is counted after it has been checked, so the limit caps how often a caller is refused, not the work of checking. Keep volumetric protection at your ingress or web application firewall.
- A slow signing-key endpoint delays that customer's requests. Keys are fetched one provider at a time, for up to 5 seconds and at most once every 30 seconds, and requests from that provider wait meanwhile.
- A run interrupted by a restart is not resumed. It is marked failed after a timeout and has to be started again.
- The retention purge deletes rows, not backups. Backup retention is set on your PostgreSQL service.
- The number check covers numbers only. It does not check direction words such as above or below, names, or fractions written as words.
- No user provisioning through SCIM. Users come from your identity provider's role claims or are added by an admin.
- Uploaded files are not virus-scanned. They are parsed as CSV or Excel and discarded.
- Excel uploads are unpacked in memory, so a crafted file could expand far beyond its compressed size.
- Feed and signing-key addresses are checked before fetching, not pinned. Egress filtering at your network is still recommended.
Have a question this page does not answer, or a security questionnaire to send?
Email marc@demandradar.ai