What a software security clause usually makes your agency promise
For non-technical customers reviewing a software agency contract, this guide explains what a typical security clause is actually asking the agency to promise in practice. You will learn which commitments are normal, which ones are expensive or risky, and how to judge whether the wording matches the system you are buying.
TL;DR — A security clause usually asks your software agency to promise a bundle of specific behaviors: protect data, limit access, encrypt traffic, patch systems, back up data, report incidents, and use reputable subprocessors. The key decision is not "do we want security?" but "are these promises specific, realistic, and matched to the actual system and budget?" Reading time: ~7 min
What it is and where it sits
A security clause is the part of a customer contract that says how the agency will protect your systems and data, and what the agency is willing to be legally responsible for if something goes wrong. It usually sits in one of three places:
- the main services agreement (the core contract)
- a data processing addendum or DPA (extra terms for personal data)
- a security exhibit or schedule (an attached list of controls)
Think of it as the contract layer that sits above the real technical stack. It does not replace the actual security controls in hosting, code, databases, or staff processes. It describes them in legal language and turns them into promises.
In a typical software project, the clause touches several parts of the request and data flow:
- the user-facing app or website
- the API (application programming interface, the part systems use to talk to each other)
- the database
- cloud hosting
- email, analytics, support, and other subprocessors (outside vendors used to deliver the service)
- the agency team who can access production systems
A common misunderstanding is that the clause is "just legal boilerplate." It is not. It is a map of what the agency must operationally do every week: who gets access, how backups run, how incidents are reported, and which vendors are allowed.
View as text
[User Browser] ---- 1. HTTPS request ----> [Web App]
[Web App] ---- 2. API call ----> [Application Server]
[Application Server] ---- 3. read/write ----> [Database]
[Application Server] ---- 4. logs/alerts ----> [Monitoring]
[Application Server] ---- 5. email/files ----> [Subprocessors]
|
| 6. admin access
v
[Agency Staff]The security clause usually covers promises about each of those arrows:
- traffic is encrypted in transit (moving over the network)
- data is protected at rest (stored on disk)
- only authorized staff can access production
- vendors are selected and managed responsibly
- incidents are detected and reported
- backups exist and can be restored
What it replaces: often, it replaces vague statements like "Agency will use industry-standard security." That phrase sounds comforting but is hard to enforce. Better clauses replace vagueness with concrete commitments such as "multi-factor authentication for administrative access" or "notify customer within 72 hours of confirmed unauthorized access to customer data."
How it actually works
The mechanism is simple: the contract lists security obligations, and the agency must translate them into repeatable operational actions. If the clause is well written, each legal sentence maps to a real control.
One realistic example
Imagine you hire an agency to build and host a customer portal. Users log in, upload documents, and view invoices. The portal stores names, email addresses, billing records, and attached files.
Your contract's security clause says the agency will:
- use HTTPS everywhere
- restrict production access to authorized personnel
- require multi-factor authentication for admin accounts
- apply security patches in a reasonable time
- back up customer data daily
- notify you promptly of a security incident
- use subprocessors only as needed to deliver the service
Here is what that means end to end.
Step 1: A user signs in
The user opens https://portal.example.com. The HTTPS part means TLS (Transport Layer Security, the standard that encrypts web traffic) is active. In practice, the agency has configured a certificate on the web server or hosting platform.
This satisfies the promise to encrypt data in transit.
Step 2: The app checks identity and permissions
The application server verifies the login and checks what the user is allowed to see. Separately, the agency team has admin accounts for maintenance, but those accounts are limited to named staff and protected with multi-factor authentication.
This satisfies the promises around access control and privileged access.
Step 3: The app stores and retrieves data
The portal writes records to a database and stores uploaded files in object storage or a file store. The hosting environment may provide encryption at rest by default, but the clause should not assume that silently. The agency should know exactly where that setting lives in the hosting dashboard and whether backups are included.
This satisfies the promise to protect stored customer data.
Step 4: The system is monitored
Logs and alerts are sent to a monitoring system. If repeated failed logins or unusual admin activity appears, the agency gets an alert.
This supports the incident detection promise.
Step 5: A vulnerability is found
A security update is released for a library used by the app. The agency reviews it, tests it, and deploys the patch. If the contract says "critical patches within 14 days," that becomes a real operational deadline.
This satisfies the patching promise.
Step 6: Something goes wrong
Suppose a staff account is compromised and an attacker accesses production data. The agency investigates, contains the incident, checks logs, rotates credentials (changes passwords, keys, or tokens), and restores affected data if needed from backups. Then it sends you the required notice within the contract's incident-reporting window.
This is where the clause matters most. Without a defined reporting promise, customers often learn too late, or receive only vague updates.
The important point: the clause is not one control. It is a chain of promises attached to the full lifecycle of your data.
When to use it (and when not to)
You should expect a meaningful security clause in almost every software services contract. The question is how detailed it needs to be.
| Scenario | Recommendation |
|---|---|
| Agency will host your production app and store customer data | Use a detailed security clause plus a DPA if personal data is involved |
| Agency only builds code, then hands it to your internal team to host | Use a narrower clause focused on secure development, code handling, and repository access |
| Marketing microsite with no login and no personal data beyond basic analytics | A short clause is usually enough |
| App handles health, finance, identity, or regulated data | Use a detailed clause, incident timeline, subprocessor rules, and audit rights if justified |
| One-off prototype with fake or anonymized data | Keep the clause lighter; do not buy enterprise obligations you do not need |
| You want the agency to promise compliance with every major standard | Usually do not do this unless they are actually certified and the project requires it |
You probably do not need heavy custom wording if:
- the system will not store sensitive or regulated data
- the agency will not host production
- you already control the cloud account, access management, and backups
- the project is short-lived and uses test data only
You probably do need tighter wording if:
- the agency hosts production in its own cloud account
- the app contains personal, financial, health, or confidential business data
- the agency uses several subprocessors to deliver the service
- you need a specific breach notification timeline
- your procurement or regulator requires named controls
Trade-offs
Every security promise has a cost. Good contract review means seeing both sides.
| Benefit | What it costs |
|---|---|
| Faster incident notification | More on-call process, monitoring, and legal coordination |
| Strict access controls | Slower admin workflows and more account management overhead |
| Multi-factor authentication everywhere | Better security, but more setup and occasional user friction |
| Frequent patch deadlines | More testing effort and higher chance of rushed changes causing regressions |
| Daily backups and restore testing | Storage cost, engineering time, and periodic maintenance windows |
| Approval rights over subprocessors | Better vendor visibility, but slower delivery when tools need to change |
| Audit rights | Reassurance for customers, but significant time burden for the agency |
| Broad indemnity or unlimited liability for security incidents | Stronger customer protection, but much higher contract price or refusal by the agency |
The biggest hidden trade-off is wording that sounds small but creates enterprise-grade obligations. For example, "Agency shall comply with all applicable security best practices" is open-ended. It can be read much more broadly than the project budget supports.
A better pattern is to ask for named, checkable promises:
- "Administrative access requires multi-factor authentication"
- "Customer data is encrypted in transit using TLS"
- "Backups run daily and are retained for 30 days"
- "Agency will notify Customer without undue delay after confirming unauthorized access to Customer Data"
In practice
Below are two examples of what contract language and implementation evidence can look like. You would adapt the wording with counsel, but these are realistic starting points.
security_commitments:
access_control:
production_access: "Limited to authorized personnel with a business need"
mfa_required: true
encryption:
in_transit: "TLS for web and API traffic"
at_rest: "Enabled where supported by hosting provider for databases and file storage"
vulnerability_management:
critical_patches: "Target deployment within 14 days of assessment"
backups:
frequency: "daily"
retention: "30 days"
incident_response:
notification: "without undue delay after confirmed unauthorized access to Customer Data"
subprocessors:
allowed: "Only as needed to provide the services"
list_provided_on_request: true
This is not a machine-enforced standard; it is a plain-language checklist you can align with the contract. The gotcha: avoid writing promises more specific than the actual system can support today, such as exact patch deadlines if the app has no staging environment for safe testing.
server {
listen 80;
server_name portal.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name portal.example.com;
ssl_certificate /etc/letsencrypt/live/portal.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/portal.example.com/privkey.pem;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_pass http://app:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
}
}
This nginx config redirects all HTTP traffic to HTTPS and serves the app over TLS, which supports the common contract promise to encrypt traffic in transit. The gotcha: do not enable the Strict-Transport-Security header for a domain until you are sure HTTPS works correctly on all needed subdomains, or you can lock browsers into a broken HTTPS path.
If you host the system yourself and want to verify backup settings, start in your provider dashboard. Look for paths like:
- your provider's dashboard → Database → Backups
- your provider's dashboard → Object Storage/Buckets → Versioning or Lifecycle
- your provider's dashboard → Identity/Users → Multi-factor authentication
If your team uses infrastructure as code (configuration files that define cloud resources), a backup retention setting may look like this:
{
"backup": {
"enabled": true,
"frequency": "daily",
"retention_days": 30,
"point_in_time_recovery": true
}
}
This shows the kind of concrete setting that can back up a contractual statement about daily backups and retention. The gotcha: a backup that exists is not the same as a backup you can restore; if the contract is important, ask whether restore testing happens and how often.
⚠️ Be careful with contract edits that promise absolute outcomes such as "prevent any unauthorized access" or "guarantee no security incidents." No agency can honestly promise that. Reasonable clauses promise controls, response, and diligence — not perfection.
Further reading
- NIST Cybersecurity Framework 2.0
- OWASP Application Security Verification Standard
- the "Transport Layer Security (TLS)" pages in the MDN Web Docs
- ISO/IEC 27001 overview materials
- the "Security of Processing" section of the GDPR text
This article was written by an AI system and published pending human review. Verify anything you intend to act on.
Have a project in mind?
Get an instant AI price estimate for it, or talk directly to our team.
One email a month on what we learn building with AI