The purchase order that no one authorized (and that cost the quarterly budget)
It happens more often than companies admit: a buyer generates a purchase order for a significant amount without anyone reviewing it. A vendor offers an off-policy discount and the invoice goes out uncontrolled. Configure approvals in SAP Business One exists precisely to prevent these scenarios, but many companies are unaware of this functionality or consider it «red tape» until they suffer the consequences.
In this tutorial you will learn how to configure approval workflows in SAP Business One step by step: from module activation to the creation of multi-stage templates, amount thresholds, and tracking reports with queries for SQL Server and SAP HANA.
Which documents can you control with approvals in SAP Business One?
Purchase documents: Purchase requisitions, purchase orders, goods receipts, and vendor invoices. They directly control how money leaves the company. Consequently, they are the most critical to protect.
Sales documents: Quotes, sales orders, deliveries, and customer invoices. They are useful for controlling excessive discounts or conditions outside of commercial policy.
Payments: Vendor payments and checks. They represent the last line of defense before the money goes out. Therefore, they require a particularly rigorous level of control.
Manual seats: Direct journal entries that can have a significant impact on the financial statements. Furthermore, they are the most difficult to audit if they lack prior approval.
Step 1: Activate approval procedures in SAP Business One
Go Administration → System initialization → General authorizations. Enable the Approval Procedure checkbox at the general level. However, this activation only enables the functionality: you still need to create the templates that define the rules.
It is important to understand that activation is irreversible in production environments. Once activated, it cannot be deactivated without direct intervention in the database. Therefore, plan the templates before activating the module.
Step 2: Define the approval stages
Go Administration → Approval procedures → Approval stages. Each stage defines who can approve and how many approvers are needed.
Single approver: A single user authorizes the document. It is the simplest and most appropriate configuration for low amounts or lower-risk documents.
Sequential multiple approval: The document goes through several levels in order. In addition, each level sees the comments from the previous one, which facilitates traceability.
Parallel multiple approval: Multiple approvers can act simultaneously. The document is approved when everyone (or a defined minimum number) gives their approval. Consequently, the process is faster for documents that require multiple perspectives.
Step 3: Create approval templates
Templates are the heart of the system. Go to Administration → Approval procedures → Approval templates. Each template defines what type of document requires approval and under what conditions.
Conditions by amount: Define thresholds that trigger approval. For example, purchases under $1,000 do not require approval; those between $1,000 and $10,000 require one level of approval; and those over $10,000 require two levels of approval.
User conditions: Certain users may require approval regardless of the amount. It is useful for new employees or areas with a history of errors.
Discount conditions: Activate approval when the granted discount exceeds a defined percentage. Therefore, you protect the pricing policy without blocking normal sales.
Step 4: Manage approvals on a day-to-day basis
Documents pending approval appear in the approver's inbox at Administration → Approval procedures → Approval decision. The approver can approve, reject, or return the document with comments.
For the process to work correctly, configure the email alerts to notify the approver when they have pending documents. However, avoid sending too many notifications because they cause fatigue and approvers start approving without reviewing.
In addition, define maximum response time policies. A document that has been without approval for 48 hours should escalate to the next level or to the area manager.
Monitoring query: documents pending approval
This query shows all documents that are waiting for approval, who needs to approve them, and how long they have been pending. It is an essential tool for daily tracking.
SQL Server version
SELECT
T0.WddCode AS 'Approval ID',
CASE T0.ObjType
WHEN '22' THEN 'Purchase Order'
WHEN '23' THEN 'Purchase Offer'
WHEN '18' THEN 'Purchase Invoice'
WHEN '17' THEN 'Sales Order'
WHEN '13' THEN 'Sales Invoice'
WHEN '46' THEN 'Issued Payment'
WHEN '204' THEN 'Purchase Request'
ELSE T0.ObjType
END AS 'Document Type',
T0.DocEntry AS 'DocEntry',
T1.USER_CODE AS 'Requester',
T0.CreateDate AS 'Request Date',
DATEDIFF(DAY, T0.CreateDate, GETDATE()) AS 'Days Pending',
CASE T0.Status
WHEN 'W' THEN 'Pending'
WHEN 'Y' THEN 'Approved'
WHEN 'N' THEN 'Rejected'
END AS 'Status',
T0.Remarks AS 'Remarks'
FROM OWDD T0
INNER JOIN OUSR T1 ON T1.USERID = T0.UserSign
WHERE T0.Status = 'W'
ORDER BY T0.CreateDate ASCSAP HANA version
SELECT
T0."WddCode" AS "Approval ID",
CASE T0."ObjType"
WHEN '22' THEN 'Purchase Order'
WHEN '23' THEN 'Purchase Offer'
WHEN '18' THEN 'Purchase Invoice'
WHEN '17' THEN 'Sales Order'
WHEN '13' THEN 'Sales Invoice'
WHEN '46' THEN 'Payment Issued'
WHEN '204' THEN 'Purchase Request'
ELSE T0."ObjType"
END AS "Document Type",
T0."DocEntry" AS "DocEntry",
T1."USER_CODE" AS "Requester",
T0."CreateDate" AS "Request Date",
DAYS_BETWEEN(T0."CreateDate", CURRENT_DATE) AS "Days Pending",
CASE T0."Status"
WHEN 'W' THEN 'Pending'
WHEN 'Y' THEN 'Approved'
WHEN 'N' THEN 'Rejected'
END AS "Status",
T0."Remarks" AS "Remarks"
FROM "OWDD" T0
INNER JOIN "OUSR" T1 ON T1."USERID" = T0."UserSign"
WHERE T0."Status" = 'W'
ORDER BY T0."CreateDate" ASCIf the «Days Pending» column shows high values, you have a bottleneck in your approval process. In addition, you can filter by document type to identify which area is generating the most delays.
Advanced query: approver history and response times
This query analyzes approver behavior: how many approvals they have processed, their average response time, and their rejection rate. It is essential for optimizing the workflow.
SQL Server version
SELECT
T1.USER_CODE AS 'Approver',
COUNT(*) AS 'Total Decisions',
COUNT(CASE WHEN T0.Status = 'Y' THEN 1 END) AS 'Approved',
COUNT(CASE WHEN T0.Status = 'N' THEN 1 END) AS 'Rejected',
CAST(COUNT(CASE WHEN T0.Status = 'N' THEN 1 END) * 100.0
/ NULLIF(COUNT(*), 0) AS DECIMAL(5,2)) AS '% Rejection',
CAST(AVG(DATEDIFF(HOUR, T0.CreateDate, T0.UpdateDate))
AS DECIMAL(10,1)) AS 'Average Response Time (Hours)',
COUNT(CASE WHEN DATEDIFF(DAY, T0.CreateDate, T0.UpdateDate) > 2 THEN 1 END)
AS 'Late (+48h)'
FROM OWDD T0
INNER JOIN OUSR T1 ON T1.USERID = T0.UserSign
WHERE T0.Status IN ('Y', 'N')
AND T0.CreateDate >= DATEADD(MONTH, -3, GETDATE())
GROUP BY T1.USER_CODE
ORDER BY COUNT(*) DESCSAP HANA version
SELECT
T1."USER_CODE" AS "Approver",
COUNT(*) AS "Total Decisions",
COUNT(CASE WHEN T0."Status" = 'Y' THEN 1 END) AS "Approved",
COUNT(CASE WHEN T0."Status" = 'N' THEN 1 END) AS "Rejected",
CAST(COUNT(CASE WHEN T0."Status" = 'N' THEN 1 END) * 100.0
/ NULLIF(COUNT(*), 0) AS DECIMAL(5,2)) AS "% Rejection Rate",
CAST(AVG(SECONDS_BETWEEN(T0."CreateDate", T0."UpdateDate") / 3600.0)
AS DECIMAL(10,1)) AS "Average Response Time (Hours)",
COUNT(CASE WHEN DAYS_BETWEEN(T0."CreateDate", T0."UpdateDate") > 2 THEN 1 END)
AS "Late (+48h)"
FROM "OWDD" T0
INNER JOIN "OUSR" T1 ON T1."USERID" = T0."UserSign"
WHERE T0."Status" IN ('Y', 'N')
AND T0."CreateDate" >= ADD_MONTHS(CURRENT_DATE, -3)
GROUP BY T1."USER_CODE"
ORDER BY COUNT(*) DESCNote that in SAP HANA it is used SECONDS_BETWEEN divided by 3600 to get hours, since there is no direct equivalent of DATEDIFF(HOUR, ...). Furthermore, ADD_MONTHS replace DATEADD. Consequently, both versions deliver the exact same information.
Best practices for setting up approvals in SAP Business One
Do not over-control: If everything requires approval, nothing gets approved on time. Define reasonable thresholds that protect without paralyzing operations. Therefore, start with the documents with the highest financial impact.
Substitutes: Each approver must have a designated substitute to cover vacations and absences. However, the substitute must have the same level of authority and knowledge to approve.
Document the policies: Approval rules must be documented in a written policy, not just in the system. Furthermore, the team must understand why the approvals exist, not just how to use them.
Review the thresholds periodically: Amounts that were significant two years ago may not be today. Update the thresholds at least annually or when business conditions change.
Conclusion: control that protects without paralyzing
Configure approvals in SAP Business One correctly is finding the balance between control and agility. A well-designed approval system protects the company's resources without becoming an obstacle to daily operations.
The monitoring queries provided, available for both SQL Server and SAP HANA, give you visibility into bottlenecks and approver behavior. Consequently, you can continuously adjust the process based on real data rather than perceptions.
Does your company have active approval procedures, or does it still operate in «total trust» mode? If it is the latter, these steps are your starting point to build a control system that works.




