Open source SOAR for SaaS companies: why a small team needs triage automation first
A small security team running cloud workloads for customers usually has more alerts than analysts, and the alerts come from several places at once: cloud control planes, identity providers, endpoints and the application itself. For this team, the usual open-source starting point is Shuffle, self-hosted on the company's own infrastructure, to automate triage, enrichment and response. Shuffle is a general purpose security automation (SOAR) platform licensed under AGPL-3.0, and its current release, v2.3.0, was published on September 28, 2026. According to Shuffle's open source documentation, all features are available in the open-source edition, while its paid tiers differ in feature limits, scaling and support.
SaaS differs from other sectors in three ways that shape the first playbooks. First, the company operates customer tenants, so a single alert may touch data belonging to many customers and the response must record which tenant was affected. Second, the cloud control plane is itself an attack surface: an API key, a role change or a new access policy can cause more damage than a compromised server. Third, the identity provider is usually the main target, so sign-in anomalies, MFA resets and privilege grants should be triaged first. Confirm with your own team which identity providers, cloud accounts and SaaS admin consoles produce the alerts that reach your analysts today.
Customer-facing notices are the part of the workflow most often left to manual judgment. A playbook that disables a user, revokes a token or isolates a workload changes what a customer may need to hear, so the notice should be drafted from the actions the workflow actually recorded, not from memory. Decide early which automated steps may run without approval, which need an analyst's sign-off, and who owns the wording of any customer message. Ask any implementation partner how the playbook records each executed action so that the incident timeline and customer communication draw on the same evidence.
Which requirements shape a SaaS SOAR build
This table maps the regulatory and contractual requirements most likely to reach a SaaS company's security automation into concrete build decisions. Read each row as a question to confirm with counsel and your auditor, then check what the requirement means for playbook design, evidence capture and data export.
| Requirement | Where it comes from | What it means for the build |
|---|---|---|
| SOC 2 security common criteria CC1 to CC9 | AICPA 2017 Trust Services Criteria, which apply to every SOC 2 examination | Playbooks must produce evidence that alert triage, escalation and access changes operate as designed. A Type 1 report tests design at a date, while a Type 2 report tests operating effectiveness over a period, so keep automated run logs for the full observation window. |
| Processor contracts and security of processing for customer personal data | GDPR Article 28(3) and Article 32, where the SaaS company acts as processor | Enrichment steps that send customer data to third-party lookups need documented instructions and approved sub-processors. Confirm which playbook fields contain personal data and restrict them in case records and chat notifications. |
| Critical digital infrastructure duties for cloud providers | NIS2 Annex I, which places cloud computing providers in the digital infrastructure sector of high criticality | If in scope, incident handling and reporting timelines must be met by automation, so the build needs tested escalation paths and notification templates. Confirm applicability with counsel and check the technical measures in Commission Implementing Regulation (EU) 2024/2690. |
| Reporting duty for products with digital elements | Cyber Resilience Act Article 14, applicable to in-scope products placed on the market since 11 September 2026 | Companies that ship software need a separate reporting workflow for actively exploited vulnerabilities and severe incidents in their products. Keep this path distinct from internal SOC playbooks so product vulnerability records are not mixed with tenant alerts. |
| Switching rights and exit from data processing services | EU Data Act, Regulation (EU) 2023/2854, Articles 23, 25 and 50 | Customers may require export of their data and switching to another provider or on-premises infrastructure. Store playbooks as versioned, exportable configuration and keep case history in open formats so the platform can be moved. |
| Limits on switching charges | EU Data Act Article 29, with no switching charges permitted from 12 January 2027 | Contract terms and export tooling must reflect these charge limits. Confirm with counsel how any export or migration support is priced in customer agreements and the internal cost model. |
Which open source SOAR and SaaS security tools fit a small team
A small security team running cloud workloads usually needs four things: an automation engine, alert sources, enrichment feeds and identity and secrets services that the automation can trust. The cards below cover one component each, with the role it plays in a triage playbook and one point to confirm in your own environment before you commit.
Shuffle as the automation engine
Shuffle is the SOAR layer that runs triage and response playbooks. It is licensed under AGPL-3.0, and v2.3.0 was published on September 28, 2026. Apps are built from OpenAPI specifications or written in Python with the Shuffle app SDK, and each app runs as a versioned Docker container, so a connector update is a version change you can test. Shuffle's SSO history includes SAML support from version 0.9.16 and OpenID Connect from 1.0.0. Confirm the AGPL-3.0 obligations with your legal team before you modify the code and offer it to users outside your company.
Wazuh for host and cloud telemetry
Wazuh is an open source XDR and SIEM platform licensed under GPL-2.0. In a SaaS playbook it supplies host, container and cloud-workload alerts that start triage, such as a file integrity change on a production server or a suspicious login on a cloud instance. Its alerts reach Shuffle as the trigger for enrichment and containment steps. Check which cloud log sources your provider exports and whether each one has a decoder and rule set that matches your workloads.
Suricata and Zeek for network sources
Suricata is an intrusion detection and prevention engine licensed under GPL-2.0, and Zeek is a network analysis framework under a BSD-style license. Both produce network alerts and metadata that a playbook can enrich with asset ownership and recent connections. They only add value if you run sensors that see the traffic you care about, which in a cloud VPC means mirrored traffic or flow logs. Confirm where sensors can be placed in your cloud network and what the provider allows. Suricata is at 8.0.7 and Zeek at 9.0.0.
MISP and OpenCTI for enrichment
MISP is a threat intelligence platform licensed under AGPL-3.0, and OpenCTI is licensed under Apache 2.0 for its Community Edition. A playbook can query either one to check an indicator from an alert against shared feeds before it opens a ticket or blocks anything. Both are self-hosted, so you decide which external feeds reach your network. Confirm which OpenCTI features your team needs, since some capabilities sit in the Enterprise Edition under a separate license.
Keycloak, authentik or ZITADEL for workforce login
Shuffle, your cloud consoles and your ticketing tools all need one workforce identity provider. Keycloak (Apache-2.0, 26.8.1) supports OpenID Connect, SAML 2.0 and LDAP or Active Directory federation. authentik (MIT except the authentik/enterprise directory, 2026.8.4) and ZITADEL (AGPL-3.0, v4.19.5) are alternatives with passkey and SCIM support. A playbook that disables an account depends on this provider, so confirm that it can revoke sessions and enforce MFA for every admin path before you rely on it.
OpenBao or Infisical for app credentials
Playbooks call cloud and SaaS APIs with credentials, and those credentials must not sit in plain text in the workflow. OpenBao (MPL-2.0, v2.7.1) and Infisical (MIT except ee directories, v0.166.8) store and distribute secrets, and either can supply the keys that Shuffle apps use. HashiCorp Vault 1.15.0 and later uses the Business Source License 1.1, which is not OSI-approved, so treat it as a different licensing decision. Confirm who holds the encryption key for the secrets store, because losing it or rotating it carelessly breaks every saved connector.
Deployment patterns for SaaS cloud workloads
Shuffle documents four deployment architectures, and the right one depends on where your team already operates infrastructure and where your workers can reach cloud and identity provider APIs. Each option carries the same two obligations: a highly available backend with a clustered OpenSearch store, and a protected SHUFFLE_ENCRYPTION_MODIFIER value that must never be lost.
Single server with Docker Compose
The simplest starting point: the frontend, Go backend API on port 5001, OpenSearch and Orborus run on one host through Docker Compose. It suits a small team with one cloud account and a pilot playbook set, but it is a single point of failure. Confirm whether the host can be rebuilt from backups within your recovery targets, and treat this pattern as a stepping stone rather than a production end state for critical alert triage. Recovery depends on preserving the encryption modifier alongside the OpenSearch data.
Distributed Docker Swarm
Spreads the Shuffle services across several hosts managed by Docker Swarm. It fits teams that already run Swarm or want container orchestration without operating Kubernetes. High availability needs an OpenSearch cluster, backend and frontend scaled across all servers, NFS for shared files when several backends run, and more than one Orborus node so workflows continue if one fails. Ask who owns the NFS layer and its backup, since it becomes a shared dependency.
Hybrid with Shuffle Cloud
Runs a local Orborus worker in your environment while the management interface runs in Shuffle Cloud. The local worker needs no inbound firewall ports, which helps when the security team cannot open ingress to the SOC network. Confirm where workers can reach cloud provider APIs, identity provider endpoints and ticketing systems, and where your data and credentials are stored, since the control plane sits outside your environment. Plan for a second Orborus node in the local network for resilience.
Kubernetes with Helm charts
Deploys Shuffle through Helm charts on a cluster your platform team already operates. It fits SaaS companies that run production workloads on Kubernetes and want the SOAR platform managed with the same pipelines, policies and node pools. Confirm the cluster can run OpenSearch with persistent volumes, that worker pods can reach cloud and identity APIs through egress rules, and that the platform team owns upgrades. Shared-cluster placement should respect the separation between SOC tooling and production tenants.
Encryption modifier continuity
Shuffle encrypts saved app credentials and API keys in OpenSearch with AES-256 using the SHUFFLE_ENCRYPTION_MODIFIER secret. Losing or changing it breaks all saved app authentications, so every connector to your cloud and identity tools would need reconfiguration during an incident. Store the value in a secrets manager separate from the Shuffle host, back it up under the same access controls as OpenSearch snapshots, and rehearse restoring it in a test environment before go-live.
Worker reachability checklist
Before choosing a pattern, map where each worker must run and which endpoints it must reach: cloud provider control planes, identity provider token and admin endpoints, EDR consoles and ticketing systems. Pick the placement that gives workers those routes without widening inbound exposure. Confirm egress allow-lists, proxy requirements and certificate trust with your network team, and test each connector from the worker location, not from a laptop.
How customer-facing incident communication fits into the playbook
A SaaS SOAR playbook has a second output besides containment: notices to customers whose tenants or data were affected. Automation can prepare that work well. From the case record in your case management tool, a Shuffle workflow can pull the affected tenant list from the SIEM or application logs, assemble a timeline of detection, containment and scoping steps with timestamps, and populate draft notice fields such as tenant identifier, data categories involved, and status of the investigation. The workflow should mark every field with its source and leave unknowns blank rather than guessing. What automation must not decide is whether an event is notifiable, when a contractual clock starts, or what the notice says about cause and impact.
Those decisions belong to named people who approve each step. Legal review checks the wording and the contractual notice periods in each customer agreement, which often differ between enterprise and standard plans. Regulator notices are a separate track: if the company is in scope of NIS2 or the Cyber Resilience Act, the team must confirm its role, the authority to notify and the deadlines before any workflow sends anything outside the company. Build the approval gate as a required step in the playbook with a recorded approver, and keep draft notices out of any channel that can send email to customers automatically. Confirm with counsel which deadlines apply to each customer contract before you configure timers.
Enrichment is where data protection obligations bite. Under GDPR Article 28(3), your processor contracts with customers and vendors define what you may do with customer data, including transfers, and require security measures under Article 32. If a playbook sends tenant identifiers, log excerpts or IP addresses to an external threat intelligence or lookup service, confirm that the processing is covered by a documented instruction or a sub-processor arrangement before the workflow goes live. A self-hosted enrichment path, with API keys stored under the Shuffle encryption settings and reviewed by the data protection lead, keeps that question smaller. Record the basis for each external call in the playbook documentation so the evidence exists when a customer asks.
Evidence a SOC 2 or customer audit asks for from SOAR
This table maps the evidence a SOC 2 examination or a customer security review typically asks for from an automation platform to the Shuffle or supporting component that produces it. Read each row as a question an auditor or customer will put to you, then confirm the artifact exists and is retained for the full audit period. DeployOpen prepares these artifacts, but independent auditors issue any report.
| Evidence | What auditors or customers ask | Which component produces it |
|---|---|---|
| Documented incident response procedure mapped to playbooks | Is there a written procedure, and can each step be traced to an automated playbook or a manual task owned by a named role? | Procedure document in the wiki or Git repository, linked to Shuffle workflow names and the case management record |
| Execution logs of automated actions | What did automation do, when, and under which workflow version, with timestamps for every action taken on a customer or production system? | Shuffle workflow execution history, exported to the SIEM or retained object storage |
| Approval record for destructive steps | Who approved account disablement, host isolation or customer-facing notices, and was approval recorded before the action ran? | Shuffle approval step output combined with the case record in the incident management tool |
| Access control for the SOAR platform itself | Who can log in, which roles can edit or run playbooks, and is MFA enforced through the identity provider? | Shuffle OpenID Connect single sign-on with per-tenant enforcement, plus the identity provider's sign-in and admin audit logs |
| Encryption of stored app credentials | Where are API keys for connected cloud, identity and ticketing tools kept, how are they encrypted, and who can read them? | Shuffle AES-256 encryption of saved credentials using the modifier secret, with the secret held in OpenBao or Infisical |
| Change records for playbooks and apps | How are playbook edits reviewed and approved, and can you show what version was running during a given incident? | Git history for workflow exports and app code, plus versioned Docker images for each Shuffle app |
| Operating effectiveness over the audit period | For a SOC 2 Type 2 examination, can you show that triage and escalation controls worked consistently across the whole period, not just on the day of the review? | Samples of closed alerts and cases with timestamps, reviewer sign-off and linked automation runs, drawn from the full period |
What drives open source SOAR cost for SaaS teams
The main cost of open source SOAR for a SaaS team is rarely the license, because the Shuffle open-source edition makes all features available without a per-seat fee for the platform. The recurring spend comes from four places: infrastructure for the Shuffle server and the Orborus workers that run each workflow, the one-time build of playbooks and apps, the ongoing work to keep connectors working as cloud and identity provider APIs change, and the time your own engineers or a partner spend testing before anything touches production. Ask for each of these as a separate line, because they are paid to different people and recur on different schedules. Infrastructure and connector upkeep recur every month, while playbook build is largely one-time until new alert sources are added.
Shuffle prices its paid tiers on app runs, which the Shuffle pricing article defines as actions that actually execute in a workflow. Triggers, skipped actions, users, apps and workflows are not counted. For a SaaS team, run volume follows directly from alert volume multiplied by the number of enrichment actions each alert triggers. A cloud login alert that calls an identity provider lookup, a threat intelligence check, an asset query and a ticket update produces several runs, while an alert closed by a suppression rule may produce almost none. Before comparing a paid tier, run the pilot playbooks for several weeks against real alert feeds from your cloud, identity and endpoint tools, then count runs per alert type. Confirm with Shuffle which edition limits apply to your chosen version, since the open-source and enterprise limits are enforced from v2.1.1.
When you request a quote from a partner, separate the one-time build scope from the recurring maintenance scope. The build scope should list each playbook, the connectors and apps it needs, the credentials handling for each tool, and the testing approach. The maintenance scope should state which connectors are covered, how API changes from cloud and identity providers are detected and fixed, and who responds to a broken workflow overnight. Also ask for the assumptions behind run volume: the alert sources in scope, the expected alerts per day, the enrichment steps per alert type, and the growth you expect over the next year. A quote built on different volume assumptions is not comparable with another, and the difference will show up later as either an unexpected run bill or an undersized worker pool.
How a SaaS team rolls out Shuffle in phases
The sequence moves a small security team from an unranked alert queue to a tested, backed-up Shuffle instance, then to read-only enrichment, gated response and customer notice drafting, and ends with a rehearsed go-live. Each phase closes with a named output that the team and its partner can check before the next phase starts.
Inventory alert sources and rank alert types
Start by listing every tool that sends alerts into the team's queue, such as cloud security posture findings, identity provider sign-in alerts, endpoint and network detections, and customer-reported tickets. Pull a sample of recent alerts from each source and group them by type, then rank the types by volume and by customer impact, meaning which alerts could expose customer data or interrupt a customer's service. The output is a ranked list of the alert types to automate first, agreed by the security lead and the engineering owner of each cloud account. Confirm the agreed list before any playbook work begins.
Deploy Shuffle with SSO and secret storage
Choose one of the documented Shuffle architectures based on where the workers must run, then deploy the server and at least one Orborus runtime node in the team's own cloud account. Connect workforce sign-in through SAML or OpenID Connect, and set the SHUFFLE_ENCRYPTION_MODIFIER value, which encrypts saved app credentials in OpenSearch and must be stored in a secret manager and backed up because losing it breaks every saved app authentication. The output is a tested instance with a documented restore procedure, confirmed by restoring the backup into a separate environment.
Build read-only enrichment playbooks
Build playbooks that only read data. Typical enrichment steps query the identity provider for the user's recent sign-ins and group memberships, pull the cloud audit trail for the affected resource, check threat intelligence for the source address, and attach the results to the case. Use read-only API scopes for every connector and document each scope. Run the playbooks against historical and live alerts in parallel with analysts, and compare the execution logs with the analysts' triage notes to find missing context or false escalations. The output is a comparison report that shows where enrichment matched or improved the analyst decision.
Add approval gates for high-risk responses
For the highest-risk cases, such as disabling a user account, revoking active sessions for a production admin, or isolating a cloud workload, add response actions behind an explicit approval step. Each destructive action should name the approver, the required evidence, and the rollback steps. Put the playbook changes through the team's change control process, with a test workflow run in a non-production tenant before the change is promoted. The output is a set of signed-off playbooks, each with an owner, a version and a recorded approval history.
Draft customer notices with legal review
Build a notice-drafting step that pre-fills an incident summary, the affected services and the timestamps from the case record, then places a draft in front of the incident lead and legal counsel. The playbook must never send customer communication on its own. Legal counsel confirms the notice wording, the contractual notice terms in each customer agreement, and any regulatory notice duties that apply to the customer's sector. The output is a tested communication template with a version history and a list of the approvers who signed off on it. Ask the partner to show how the template handles incidents with several affected customers.
Rehearse an incident then go live
Before go-live, run a tabletop exercise or a simulated incident in which a realistic sample alert moves through triage, enrichment, approval, response and customer notice drafting. Record the timestamps, the decisions, the gaps found and the fixes made. Once the gaps are closed, publish a runbook that covers on-call escalation, how to pause workflows, how to recover the Shuffle backend and Orborus nodes, and how to rotate credentials. The output is a runbook and an evidence pack containing the exercise record, change approvals, backup test results and the playbook version history, ready for the next internal or external audit.
Questions to ask a SOAR implementation partner for a SaaS company
Start with the alert types the partner will automate first, and ask how it measures triage time before and after each playbook goes live. A credible answer names the sources, such as cloud audit logs, identity provider sign-in events and endpoint alerts from Wazuh, and ties each playbook to a baseline the team already tracks. Ask who records that baseline, how often the numbers are reviewed, and whether a playbook that does not reduce triage time is retired. Ask also how the partner writes and versions Shuffle apps built from OpenAPI specifications, and who owns those specs after handover. Your company should hold the source repository, the spec files and the version history, not only a running instance. Confirm that each app is pinned to a versioned Docker image so that a change to one connector cannot silently alter a live workflow.
Ask where cloud and identity provider credentials live and how they rotate. Shuffle encrypts saved app credentials in OpenSearch using the SHUFFLE_ENCRYPTION_MODIFIER secret, and the configuration docs warn that losing or changing that value breaks every saved authentication. Ask who holds that secret, how it is backed up, and whether the partner will store it in a dedicated secrets manager such as OpenBao. Then ask how tests are run. The partner should describe a non-production Shuffle instance, test tenants at each cloud and identity provider, and a written promotion step before any workflow touches a customer tenant. For the SSO layer, ask how the partner will handle the move from SAML to OpenID Connect on Shuffle, which the vendor documents as the direction of travel on Shuffle Cloud, and who approves the cutover.
Ask how the partner limits app-run volume. Shuffle licenses on app runs, meaning actions that execute in a workflow, so a noisy detection that triggers a loop can raise cost quickly. Request the partner's approach to filtering, deduplication and run caps, and ask how it reports run counts to you each month. Ask how it plans Orborus scaling, since the Shuffle high availability guidance recommends more than one Orborus node so workflows keep running if one fails. Ask for the expected behavior during an identity provider outage. Next, ask what evidence the partner hands over for a SOC 2 examination. Useful items include workflow inventories, change tickets for playbook releases, approval records for destructive actions and logs of automated actions. Confirm that the partner prepares this evidence but that your auditor decides what it proves. Finally, ask how customer data is handled during enrichment: which fields leave your environment, whether third-party lookups receive personal data, and how those flows are documented for your data processing terms. Ask how connectors are maintained when a provider changes its API, including who watches vendor changelogs, how breaking changes are tested, and what service level the partner commits to in writing.
What SaaS buyers ask before hiring help with open source SOAR
How much effort does a Shuffle build take for a small SaaS security team?
The effort depends mainly on how many alert sources feed the platform, how many playbooks are in scope, how complex the approval logic is, and how many customer notice steps must be built in. A build that starts with read-only enrichment from a few cloud and identity sources is far smaller than one that also isolates accounts, revokes sessions across tenants and drafts customer-facing notices. Each new connector adds an app to build or verify, and each approval gate adds routing, timeout and audit logic that must be tested. Ask any partner to break the estimate down by source, playbook and gate, and to state which items are included in the fixed scope and which are optional extensions.
How long does an open source SOAR implementation take?
Duration is set in the written scope, not by a general rule, because it follows from the same drivers as effort: sources, playbooks, approvals and notice steps, plus the state of your existing logging and ticketing. Your engineers' availability for access reviews and test sign-offs also affects the calendar more than many buyers expect. A sound scope names the phases, the playbooks in each phase, the test evidence expected at each milestone and the conditions that move a milestone. Treat any timeline that is not tied to a written list of deliverables as an unverified estimate.
What does our team need to provide before a SOAR engagement starts?
Three groups of access and people are usually required. Technically, the work needs administrator access or a delegated role in your cloud accounts and identity provider, sample alerts from each source with realistic field values, and a test tenant or staging environment where playbooks can run without touching customers. Organizationally, you need named decision-makers who can approve destructive actions such as disabling accounts or isolating workloads, and a clear owner for each approval gate. Legally, you need a contact who can confirm the wording and timing of customer notices, since those steps often depend on contract terms and regulatory duties.
Can a small security team build SOAR playbooks without outside help?
A small team can usually build read-only enrichment playbooks in-house, such as looking up an IP address, user or file hash in threat intelligence and identity records, and posting the results to a ticket. Response actions that change tenant state are harder. They need credential handling for each connected tool, tested rollback paths, approval routing and a record of every automated change, and a mistake can disrupt customers. Ask whether your team has time to maintain each app as vendors change their APIs, because that upkeep is the part most often underestimated.
Is the open-source edition of Shuffle enough for a SaaS company?
Shuffle says all features are available in its open-source edition, so the question is usually about limits, scaling and support rather than missing functions. Its configuration documentation notes that since version 2.1.1, limits between the open-source and enterprise editions are actively enforced, and its paid tiers differ in feature limits, scaling and support. Shuffle's pricing article describes licensing on app runs, meaning actions that actually execute in a workflow, while triggers and skipped actions are not counted and users, apps and workflows are unlimited. Confirm current limits with Shuffle before design, and model your expected run volume against them.
What costs recur after a SOAR platform goes live?
Recurring costs fall into three areas. Infrastructure is the first: the backend, frontend, OpenSearch document store and one or more Orborus runtime nodes need capacity, backups and patching, and high availability adds more nodes and shared components. Run volume is the second, since app-run based licensing and compute both grow with how many actions execute, so noisy alert sources raise cost directly. Connector upkeep is the third and often largest: each tool's API changes, credentials rotate and new fields appear, so someone must test and update apps on a schedule. Ask any partner to separate one-time build charges from these recurring items, and to state what happens to the playbooks if support lapses.
How DeployOpen scopes and supports SaaS SOAR work
DeployOpen plans, implements, integrates, documents and supports self-hosted open-source platforms inside the client's own cloud accounts or data centers. For SaaS security teams, that means Shuffle playbooks wired to cloud and identity provider APIs, tested before production, and handed over with runbooks the small team can maintain.
How we scope
- Inventory the alert sources, cloud accounts and identity providers the first playbooks will touch.
- Agree the first set of triage and enrichment playbooks, and the response actions that stay behind approval gates.
- Record the Shuffle deployment model, worker placement, app-run estimate inputs and support boundaries in a written, fixed scope.
How we build
- Build Shuffle workflows on the agreed cloud and identity connectors, using OpenAPI apps or Python apps where no connector exists.
- Store connector credentials in the platform's encrypted store and document the encryption secret's custody and recovery steps.
- Test each playbook against replayed or sample alerts in a non-production environment before any response action is enabled.
How we hand over
- Deliver workflow documentation, app inventory, deployment configuration and a list of connector owners for the client team.
- Walk the security team through each playbook, including how to pause a workflow and how to review what it did.
- Provide customer-facing incident communication templates that the client's legal and communications owners approve before use.
How we support
- Offer ongoing support, upgrades and maintenance of Shuffle and its connectors as a retainer, when the client wants it.
- Review connector breakage after vendor API changes and update apps and workflows under the agreed change process.
- Confirm with the client what their internal team owns after handover, and what the retainer covers, in writing.

