Segregation of Duties (SoD)
The principle that no single person should be able to complete a transaction that could defraud the company from start to finish. It is the foundation of internal control, and in ERP it becomes a concrete authorisation-design problem.
The principle
The four functions that must be separated:
AUTHORISE approve the transaction
RECORD enter it into the system
CUSTODY have physical or system control of the asset
RECONCILE verify and review
One person holding more than one of these can commit and conceal fraud.
The classic conflicts
| Conflict | The fraud it enables |
|---|---|
| Create vendor + approve invoice | Fictitious vendor, fake invoices, paid to your own account |
| Create vendor + release payment | Same, end to end |
| Approve PO + receive goods | Approve a purchase, falsely confirm receipt, split the proceeds with the supplier |
| Enter invoice + release payment | Fake invoice, pay it yourself |
| Maintain customer master + post credit memos | Write off a friend’s debt, or your own |
| Post journal + reconcile the account | Post a fraudulent entry and hide it in the reconciliation |
| Create employee + run payroll | Ghost employees |
| Change bank details + approve payment | Redirect a legitimate payment |
| Maintain inventory + perform stock counts | Steal stock, adjust the count to match |
| Develop code + deploy to production | Insert unauthorised logic |
| Administer users + transact | Grant yourself whatever access you need |
| Set prices + approve sales orders | Sell below cost to a related party |
Each of these has a real, documented fraud case behind it. SoD rules exist because these things happened.
The SoD matrix
Create Approve Goods Enter Release Post Maintain
Vendor PO Receipt Invoice Payment Journal Bank Det
Create Vendor — ⚠️ ⚠️ ❌ ❌ ⚠️ ❌
Approve PO ⚠️ — ❌ ⚠️ ❌ ⚠️ ⚠️
Goods Receipt ⚠️ ❌ — ❌ ❌ — —
Enter Invoice ❌ ⚠️ ❌ — ❌ ⚠️ ⚠️
Release Payment ❌ ❌ ❌ ❌ — ❌ ❌
Post Journal ⚠️ ⚠️ — ⚠️ ❌ — ⚠️
Maintain Bank Details ❌ ⚠️ — ⚠️ ❌ ⚠️ —
❌ = prohibited combination ⚠️ = requires a compensating control
A real matrix has 100–300 rule pairs. Vendors and audit firms publish standard rule sets; most companies start from one and adapt.
Analysis and remediation
1. Define the rule set (conflicting function pairs)
2. Map each function to the technical authorisations that enable it
3. Analyse: which users hold conflicting combinations?
4. For each conflict:
a. REMOVE — take away the unnecessary access (always try this first)
b. MITIGATE — implement a compensating control
c. ACCEPT — formally, with documented business justification and approval
5. Monitor continuously — new conflicts appear with every role change
6. Report to audit and the audit committee
Step 2 is where the work is. “Create vendor” is not one authorisation — it’s several transactions and objects, plus any custom program that can do the same thing. Custom code is a common blind spot: a bespoke “vendor quick create” utility that bypasses the standard authorisation object doesn’t appear in the analysis, and quietly reopens the conflict.
Compensating controls
Where separation is genuinely impossible — a five-person finance department cannot separate everything:
| Control | Example |
|---|---|
| Independent review | The CFO reviews all vendors created in the month, against supporting documents |
| Exception reporting | Automated alert when the same user creates a vendor and enters an invoice for it |
| Dual authorisation | Two people must release any payment |
| Detailed logging + review | All actions by the conflicted user reviewed monthly by someone independent |
| Rotation | Duties rotate periodically; mandatory holidays (a fraud often unravels while its operator is away) |
| Bank-side controls | Positive pay; the bank verifies payments against an approved list |
| External review | An external accountant reviews monthly |
A compensating control must be documented, performed, and evidenced. “The manager reviews it” with no record of the review is not a control — it’s an assertion, and auditors treat it as such.
Sensitive access
Distinct from SoD: some access is dangerous on its own, regardless of what else the user holds.
- Post directly to the GL
- Change configuration in production
- Table maintenance / direct data edit
- Debug with replace
- User administration
- Change posting periods
- Delete or archive data
- Run OS commands
- Superuser / all-access profiles
These need: minimal assignment, individual justification, logging of every use, and periodic review.
SoD and the developer
Two aspects.
Your access
❌ Developer with production write access
❌ Developer who can deploy their own code without review
❌ Developer with debug-with-replace in production
❌ Developer who can grant themselves authorisations
✅ Developer works in DEV
✅ Code reviewed by someone else
✅ Deployed by a separate function (Basis/DevOps)
✅ Production access is read-only, or firecall with approval
“Developers have production access” is one of the most common IT general controls findings in a SOX audit. It is worth pushing back on, even when it makes your day harder — because when a production incident happens and you had write access, you become part of the investigation.
The code you write
Every custom object can create or destroy an SoD control:
❌ A custom "quick vendor create" utility that skips the standard
authorisation object → invisible to SoD analysis, control bypassed
❌ A custom approval workflow where the requester can be their own approver
❌ A custom posting program that uses a technical service account
→ all postings attributed to "BATCHUSER", attribution lost
✅ Custom objects check the same authorisation objects as the standard
✅ Approval workflows enforce requester ≠ approver
✅ Postings carry the real user, not a technical account
When you build a custom transaction, tell the security team. They need to add it to the SoD rule mapping. A custom program that isn’t in the rule set is a hole in the analysis.
Tools
| Tool | Notes |
|---|---|
| SAP GRC Access Control | The market standard for SAP: risk analysis, access request workflow, emergency access, role management |
| Pathlock, Fastpath, SafePaaS, Onapsis | Cross-platform GRC and SoD |
| SailPoint, Saviynt, One Identity | Identity governance with SoD policy enforcement |
| Custom SQL analysis | Viable for smaller systems — a rule table plus queries over role assignments |
Preventive vs detective:
- Preventive — the access request is blocked at the point of assignment because it would create a conflict. Far better.
- Detective — periodic analysis finds conflicts after the fact. Necessary, but you’ve had the exposure in the meantime.
Aim for preventive on the critical conflicts and detective on everything else.
Small organisations
A 12-person company cannot separate all duties. The pragmatic approach:
1. Separate what you can — especially payment release from everything else
2. The owner/CFO performs the review controls personally
3. Use bank-side controls (dual authorisation at the bank, positive pay)
4. Automate exception reporting — the system does the monitoring
5. Mandatory holidays for finance staff
6. External accountant reviews monthly
7. Document that SoD is limited, with the compensating controls listed
Auditors accept limited SoD in small organisations if the compensating controls are real and documented. They do not accept “we trust everyone”, however true it may be.
Fraud reality
Occupational fraud research (the ACFE’s biennial studies are the standard reference) consistently finds:
- Median losses in the low hundreds of thousands, with a long tail into millions
- Median duration around 12–18 months before detection
- Tips are the most common detection method — more than all audits combined. Which is why whistleblower hotlines matter
- The most common perpetrator profile: a long-tenured, trusted employee with no prior record
- Lack of internal controls is the most cited contributing factor
Billing schemes (fictitious vendors) are the most common and among the costliest. Which is exactly why “create vendor + approve invoice” is the first conflict on every SoD matrix, and why vendor bank detail changes deserve dual control and callback verification.
Checklist
- An SoD rule set is defined and approved
- Rules are mapped to technical authorisations, including custom transactions
- Analysis runs at least quarterly, ideally continuously
- Conflicts are remediated or formally accepted with documented mitigation
- Compensating controls are performed and evidenced
- Preventive checks at the point of access request
- Sensitive access is minimally assigned, logged, and reviewed
- Developers have no production write access
- Emergency access is controlled, time-limited, logged, and reviewed
- Access recertification runs on a defined cycle
- New custom transactions are added to the rule mapping