TD Nutrition Ltd (Companies House 11368487) - internal Amazon Selling Partner API systems ("TD Dashboards"). Version 1.0, effective 5 November 2026. Owner: the Director. Reviewed at least annually; the incident response plan (section 9) every six months.
Systems in scope. The TD Dashboards platform: data pipelines running on AWS Lambda (region eu-west-1), a Postgres warehouse and authentication service on Supabase, API functions on Supabase Edge Functions, static dashboards on Cloudflare Pages, source code on GitHub, error reporting on Sentry, and the laptops staff use to reach them. The platform reads Amazon Selling Partner API (SP-API) and Amazon Ads API data for TD Nutrition Ltd's own seller accounts only.
Amazon Information means any data obtained through Amazon APIs or Seller Central, as defined in Amazon's Acceptable Use Policy and Data Protection Policy. PII means information that identifies a natural person (for example a buyer's name, address, email or phone number).
| Role | Who | Responsibilities |
|---|---|---|
| Security Owner and Incident Management Point of Contact (IMPOC) | Konstantin Theodoridis, Director | Owns these policies, approves every production change, signs off the fortnightly log review, leads incident response, approves access. |
| Administrator | Named staff with the admin role in the dashboards | May create and edit operational records (purchase orders, support tickets, listings proposals). May not change infrastructure or code. |
| Viewer / Analyst | Named staff with the viewer role or the read-only database role | Read-only access to the dashboards or the warehouse. |
| Automated services | AWS Lambda functions, Edge Functions, GitHub Actions | Run with their own least-privilege credentials held in AWS Secrets Manager or the platform's secret store; never with a person's credentials. |
All staff with access confirm they have read these policies when access is granted and at each annual review.
| Control | Status | Evidence |
|---|---|---|
| Documented policies with processing records | Live | This page (version-controlled in the repository under policies/) |
| Encryption at rest with managed keys (AES-256) | Live | Supabase Postgres and storage (AES-256); AWS S3 (SSE-S3/AES-256); AWS Secrets Manager (AWS KMS) |
| Fine-grained access control | Live | Individual accounts; role tables; row-level security on every table with no public policies |
| Audit logs, 12-month retention, fortnightly review | Live | CloudTrail trail td-audit (400 days); security_audit_log; security_review sign-off records |
| Code scanning before every release | Live | GitHub Actions security-scan (gitleaks, pip-audit, bandit, semgrep) required on every pull request; Dependabot |
| Formal change management | Live | Branch protection on main: pull request required, five status checks required, force-push and deletion blocked, no bypass |
| Vulnerability scanning every 30 days | Live | Monthly scheduled security-scan run (full history); AWS Inspector continuous scanning of Lambda functions and code |
| Annual penetration test | Not performed | Automated scanning (every PR, monthly, continuous Inspector) is in place; an external penetration test is not currently commissioned. A scope brief is maintained in docs/security/pentest-brief.md should one be required |
| Automated credential rotation | Live | td-lwa-rotation stack; credential_rotation_log |
| Encrypted, geographically separate backups with tested restore | Live | Provider daily backups; nightly db-backup to S3 eu-central-1 (SSE-KMS) since 5 Nov 2026; quarterly db-restore-test; results in backup_log |
| Dedicated test environment before production | Live | Staging Supabase project td-staging refreshed weekly from backup; required staging check on every pull request (migrations, functions, dashboard previews); migrate-prod applies the same migrations on merge |
| Password policy (12+ characters, complexity), MFA, 365-day expiry and annual rotation | Live | Supabase Auth password rules; custom_access_token_hook refuses to issue or refresh a session after 365 days; console_credential_rotation register reviewed fortnightly; MFA on AWS, GitHub and Supabase accounts |
| Class | Examples | Handling |
|---|---|---|
| Public | Product listings, published policies | No restriction |
| Internal | Sales totals, advertising metrics, stock levels, costs | Signed-in staff only; encrypted at rest; not shared outside the company |
| Confidential | Credentials, API tokens, financial statements, support-case text | Stored only in secret vaults or access-controlled tables; never in code, chat or email |
| Restricted (PII) | Buyer names, addresses, emails, phone numbers | Not stored. See 3.3. |
We collect Amazon Information only for our own seller accounts, through the SP-API and Amazon Ads API, for these purposes: sales and profit reporting, inventory and supply planning, advertising management, listing quality, account health monitoring, VAT and EPR compliance, and support-case tracking. Data is not used for any other purpose, is not sold, and is not used to build profiles of buyers.
Data is stored in Supabase (Postgres, hosted on AWS eu-west-1, Ireland) and AWS (eu-west-1, Ireland). Both encrypt data at rest with AES-256 and in transit with TLS 1.2 or higher. Backups are encrypted. No Amazon Information is stored on laptops, removable media or personal devices.
Amazon Information is not shared with third parties, not disclosed to other developers, and not transferred to other Amazon developer applications. The following providers host or process it on our behalf under their standard data processing terms:
| Provider | Purpose | Location |
|---|---|---|
| Amazon Web Services | Pipelines, secrets, audit logs, queues | eu-west-1 (Ireland); backups eu-central-1 (Frankfurt) |
| Supabase | Database, authentication, API functions, file storage | eu-west-1 (Ireland), on AWS |
| Cloudflare | Hosting of the static dashboard pages (no Amazon data stored) | Global edge; content is static code only |
| GitHub | Source code and CI (no Amazon data stored) | United States |
| Sentry | Error reports (no Amazon data in payloads) | European Union |
| Google Workspace | Company email, including Amazon support correspondence | European Union / United States under Google's terms |
TD Nutrition Ltd complies with the UK GDPR and the EU GDPR. Requests from individuals are sent to contact@tdnutrition.eu and answered within one month. Because buyer PII is not stored by these systems, such requests are normally fulfilled through Amazon's own processes.
| Processing activity | Data categories | Data subjects | Lawful basis | Recipients | Retention |
|---|---|---|---|---|---|
| Sales and profit reporting | Order IDs, amounts, fees, SKUs, marketplace (no buyer identity) | None identifiable | Legitimate interest (running the business) | Staff; AWS; Supabase | 7 years |
| VAT and EPR compliance | Tax amounts, countries, quantities, packaging weights | None identifiable (buyer columns discarded) | Legal obligation | Staff; accountants; tax authorities | 7 years |
| Advertising management | Campaign metrics, keywords, spend | None | Legitimate interest | Staff; AWS; Supabase | 7 years |
| Inventory, purchasing, suppliers | Stock levels, purchase orders, supplier contact details | Supplier staff (business contacts) | Contract; legitimate interest | Staff; suppliers; forwarders | 7 years |
| Seller support case tracking | Case IDs, our correspondence with Amazon, attachments | Amazon support staff names (incidental) | Legitimate interest | Staff; Supabase | Case closure + 30 days (PII), 7 years (case summary) |
| Staff access and audit | Staff email, role, sign-in times, IP address, actions taken | Employees and contractors | Legitimate interest (security); legal obligation | Director; Supabase; AWS | 12 to 25 months |
main branch of the repository. Direct pushes, force pushes and branch deletion are blocked by branch protection with no bypass.tests/. Database changes are written as versioned migration files; the staging check applies them to the staging project when the pull request is opened, and migrate-prod applies the same files to production after the merge, each in one transaction.main. The merge is the approval record (author, reviewer, time, checks). Merging triggers deployment of dashboards and API functions; AWS stacks are deployed by the Director with CloudFormation change sets that are confirmed interactively.| Activity | Frequency | Tool |
|---|---|---|
| Secret scan, dependency audit, static analysis of the repository | Every pull request and push; plus the 1st of every month over the full history | GitHub Actions security-scan |
| Dependency update proposals and security advisories | Weekly, and immediately on a new advisory | Dependabot |
| Runtime vulnerability scanning of all Lambda functions and their code | Continuous | AWS Inspector |
| Managed platform patching (database, authentication, edge runtime, hosting) | Continuous, by the provider | Supabase, Cloudflare, AWS |
| External penetration test of the dashboards and API functions | Not currently performed; to be commissioned if required by a partner or after a major architectural change | Independent provider (brief prepared) |
| Laptop operating system and browser updates | Automatic updates on; applied within 14 days | macOS / Chrome |
docs/security/exceptions.md with the reason, the compensating control, the owner and an expiry date, and is re-raised at every fortnightly review until closed.| Source | Content | Retention |
|---|---|---|
| AWS CloudTrail (all regions, global services) | Every AWS API call: console sign-ins, IAM, secrets, Lambda, S3, queues; tamper-evident digests | 400 days (S3, encrypted, versioned, no public access) |
| Dashboard API audit log | Every request: user, function, action, IP address, user agent, allowed or denied | At least 12 months (pruned at 25) |
| Authentication log | Sign-ins, sign-ups, password and MFA changes, recovery requests | Kept with the database |
| Credential rotation log | Each rotation step and its outcome | Indefinite |
| Pipeline run log and error reporting | Every scheduled run with outcome; exceptions with stack traces (no Amazon data) | 12 months (database); 90 days (Sentry) |
| Function execution logs | CloudWatch logs per Lambda | 30 to 400 days |
Every 14 days an automated job compiles the review: notable AWS events (console sign-ins, root use, IAM, secret, Lambda and logging changes), IAM users and key ages, authentication events and new accounts, dashboard actions per user, rejected requests per IP address, new user and IP combinations, credential rotations and secret ages, and pipeline failures. It lists the items that need a human decision. The Director reads the report in Operations > Security and signs it off; the sign-off (who, when, notes) is stored permanently in security_review. Items needing action become a ticket or a pull request. A review that is not signed off within 7 days is shown in red on the dashboard.
Roles. Incident Manager: the Director (Konstantin Theodoridis, contact@tdnutrition.eu), who declares the incident, leads containment and makes all external notifications, including to Amazon. Technical responder: the Director or the engineer on duty, who executes containment and recovery steps and preserves evidence. Communications with Amazon, regulators and affected individuals: the Director.
| Level | Example | Response start |
|---|---|---|
| Critical | Confirmed unauthorised access to the database or AWS account; leaked credential in use; data exfiltration | Immediately |
| High | Credential leaked but no evidence of use; malware on a staff laptop; repeated unauthorised access attempts | Within 4 hours |
| Medium | Policy breach without data exposure; vulnerability with no exploitation | Within 1 working day |
docs/security/incidents/ and review it at the next fortnightly review.The plan is reviewed every six months (May and November) by the Director, walked through at least once a year as a tabletop exercise (scenario: leaked database credential), and reviewed again after any real incident. Each review is recorded in the fortnightly security review in the dashboard.
infra/stacks/backup/README.md): create a new database or project, restore the latest dump with pg_restore, update the connection secret, run the data-coverage report to confirm freshness, redeploy functions. The procedure is tested quarterly by restoring into a scratch project, and the test is recorded in the fortnightly review.td-lwa-rotation function, which distributes the new secret to every store that needs it and verifies it works. Each step is logged.Incident Management Point of Contact (IMPOC): Konstantin Theodoridis, Director, contact@tdnutrition.eu.
Privacy enquiries: contact@tdnutrition.eu.
Registered office: TD Nutrition Ltd, 20-22 Wenlock Road, London N1 7GU, United Kingdom.