Revenue recognition is the main accounting principle affecting an organization’s financial statements. There are various rules and regulations governing this aspect and meeting those is necessary from both a legal point of view and a logical point of view. Learn about special International Financial Reporting Standards (IFRS) requirements for revenue recognition and how they can be integrated with standard SAP result analysis setup.
Key Concept
The International Accounting Standards Board (IASB) and Financial Accounting Standards Board (FASB) issued IFRS 15 “Revenues from contract with customers” on May 28, 2014. This is an outcome of years of deliberation by regulatory bodies toward getting a convergent financial standard as guidance for the financial statement preparers. The new standard was initially scheduled to be applicable for all annual periods beginning on or after January, 1, 2017, for IFRS preparers. However, on September 11, 2015, the IASB deferred the effective date by a year to January 1, 2018. (Earlier application of this IFRS is also permitted.) IFRS 15 is a principle-based approach used to ensure that an organization recognizes revenue in its financial statements to depict the transfer of goods and services to the customers at an amount that reflects the consideration to which the organization expects to be entitled in exchange for them.
Result analysis functionality of ERP Financials is used for revenue recognition. SAP provides certain predefined methods for calculating revenue and cost. However, you may have some specific business needs to meet for determining the revenue recognition based on the principles defined in International Financial Reporting Standards (IFRS). For example, an organization is doing the work for a client for a month, but the billing is done in the next month, so the matching of revenue and cost for the same period is important.
I cover a few examples of special requirements for revenue recognition and how they can be integrated with a standard SAP result analysis setup.
Understanding IFRS 15 Requirements for Revenue Recognition
The IFRS 15 standard prescribes five core principles that an organization has to apply for the purpose of determining the amount and timing of revenue recognition. Figure 1 diagrams the five-step framework of IFRS 15.

Figure 1
IFRS 15 framework for revenue recognition
To help you further appreciate the framework shown in Figure 1, consider this example:
On April 1, 2015, a drilling equipment manufacturing company entered into a contract for providing and installing a drilling machine for a construction company for $90 million. The vendor agreed to provide and install the drilling machine within one month and after that to do maintenance in accordance with an annual maintenance contract (AMC) for the machine for the next three years (i.e., from May 2015 to April 2018). The vendor also was given the contract for the drilling work for three years (i.e., from May 2015 to April 2018) for $30 million.
Note that this manufacturer sells the drilling machine standalone (with installation) for $40 million and a similar drilling machine is available from other manufacturers at the same cost. Other vendors in the market also have annual maintenance contracts (AMCs) to provide annual maintenance for such machines separately at the price of $1 million per month and drilling work at the price of $2 million per month. This manufacturer might have received various contracts by charging less in one contract and higher in another and providing overall end-to-end service. To determine the transaction price for each obligation, you need to determine the standalone price as shown in Table 1.
Serial no |
Peformance obligation |
Standalone price ($) |
%
|
Allocation of transaction price
|
1 |
Sale and installation of drilling machine |
40 million |
27 |
32.40 million
|
2 |
Annual maintenance contract (AMC) support for machine
|
36 million (1 million * 36 months) |
24 |
28.80 million
|
3 |
Drilling work |
72 million (2 million * 36 months) |
49 |
58.80 million
|
Total |
|
148 million |
|
120 million
|
Table 1
Allocation of the transaction price to performance obligations
Note
In Table 1, the total standalone price is allocated to various obligations based on the individual standalone price percentage of the total standalone price.
Note also that only the drilling machine manufacturer has the capability to install its own machine and no other vendor can do this installation work.
Now I explain how to apply the IFRS 15 framework to the above example using five steps:
- Identify the contracts with the customer
- Identify the performance obligations in the contract
- Determine the transaction price
- Allocate the transaction price to the performance obligation in the contract
- Recognize revenue when (or as) the entity satisfies a performance obligation
Identify the Contracts with the Customer
In the above example, there are two contracts entered separately:
- A contract for providing, installing, and maintaining the drilling machine
- A contract for drilling work
These contracts may be due to legal or taxation requirements, but they are related to each other and therefore can be bundled and treated as a single contract.
Identify the Performance Obligations in the Contract
In my example, the following events take place in the transaction:
- Sale of a drilling machine
- Installation of a drilling machine
- Maintenance of a drilling machine for three years
- Drilling work for three years
Out of these four events, sale of a drilling machine and installation of a drilling machine are related. Only the manufacturer can do the installation, and therefore, the machine cannot be treated as sold until the installation is completed. The other two activities are independent and continuous in nature.
Determine the Transaction Price
Because you are treating the two contracts as a single contract, the total transaction price is $120 million (i.e., $90 million and $30 million).
Allocate the Transaction Price to the Performance Obligation in the Contract
There are various performance obligations, and you have a total transaction price, so the transaction price needs to be allocated between different performance obligations. The allocation needs to be based on the price of such an obligation as standalone. Table 1 lists how the transaction price is allocated to obligations. For example, for the first obligation, the allocated transaction price is $32.40 million (27 percent of the total allocated transaction price of $120 million. This 27 percent is calculated as the standalone price of the first obligation ($40 million) divided by the total standalone price of all obligations ($148 million).
Recognize Revenue When (or as) the Entity Satisfies a Performance Obligation
Now you can start recognizing the related revenue as and when the performance obligation is fulfilled. For the sale and installation of the drilling machine, the allocated revenue of $32.40 million can be recognized as soon as the installation is confirmed. For maintenance and drilling work, the revenue is recognized on a monthly basis.
Overview of SAP-Provided Methods for Revenue Recognition
Table 2 provides a snapshot of various result analysis methods that SAP pre-delivers.

Table 2
Overview of various result analysis methods pre-delivered by SAP
When the object gets a status of TECO (technically completed), then the actual revenue becomes revenue affecting net income (RANI), and the actual cost becomes cost of sales (COS). All earlier accrual, deferral, work in process (WIP), and cost provisions are reversed.
Handling Special Needs for Determining Revenue Not Met by Standard SAP Functionality
SAP has provided various enhancement points in the result analysis functionality. Table 3 provides an overview of such enhancement points available and their use.

Table 3
Overview of various SAP-provided enhancement points
Now I walk you through a few business scenarios in which standard SAP preconfigured result analysis methods do not provide the functionality to meet the requirements of these scenarios. I also explain how you can use an enhancement option or configuration changes to meet these requirements for these scenarios.
Scenario 1: Enhancing the Completed Contract Method
The Completed Contract Method (number 09 in Table 2) enables the use of conservative accounting practices because revenues and profits are only realized when the order is completed. However, there might be situations in which the billing plans have some milestones to be billed even after the contract is marked as completed (e.g., the customer withholds some revenue for two months after contract completion).
To achieve this, use Exit 3 (EXIT_SAPLKKAG_003) listed in Table 3 and for detailed understanding of this exit’s working, read SAP Note 67423.
A standard SAP system passes the planned revenue (instead of actual revenue) to RANI on contract completion under method 09 as listed in Table 2. In this exit, you need to make changes to replace the value of actual revenue (for the purpose of revenue recognition calculation only) from planned revenue so that the system determines the RANI automatically as planned revenue and calculates accrued revenue as the difference between actual revenue and RANI.
Note
After explaining various scenarios, I have also given an example procedure with code on how to implement scenario 1. (See the “Example Implementation for Scenario 1” section.)
The process for creation of a Business Add-In (BAdI) remains similar in all scenarios listed in the article; however, the code logic may change based on an organization’s specific setup. For example, the organization may be using a special result analysis key or different line IDs. Therefore, the logic should be checked and adopted to best meet your organization’s needs.
Scenario 2: Enhancing the Cost-Based Percentage of Completion (POC) Method
When a business follows the cost-based POC method, sometimes the actual cost may overrun the planned cost, and thus the POC calculated is more than 100 percent. In such a scenario, the system calculates RANI as planned revenue * POC percent, and thus can go beyond planned revenue. However, you can’t bill extra to the customer beyond the contracted price, so the standard SAP calculation for RANI is wrong.
To correct the situation, use Exit 2 (EXIT_SAPLKKAG_002) listed in Table 3 and for detailed understanding of this exit’s working, read SAP Note 26957.
In this exit, you can compare actual cost with planned cost, and if actual cost is more than planned cost, then replace planned cost with actual cost. In this way, the system calculates the POC as 100 percent and thus the subsequent calculation of RANI or COS is done automatically based on this POC percentage.
Scenario 3: The POC Method on Basis of Revenue Planned by Period
Under this method, the standard SAP system calculates the RANI as planned revenue until the result analysis period and calculates the COS as planned cost * POC percent. (Details for this method are listed in Table 2.)
However, there might be scenarios in which the business is performing some work in a month and then doing the billing for that month’s work in a subsequent month. Therefore, it is important that the revenue be matched to the corresponding costs only.
To achieve this, use Exit 1 (EXIT_SAPLKKAG_001) listed in Table 3 and for detailed understanding of this exit’s working, read SAP Note 26002.
In this exit, build the logic for the following steps to determine the related cost and revenue:
- Determine the latest period in which the revenue was billed
- Sum up the revenue billed until that period and that will make the RANI for result analysis calculation
- Sum up the cost booked until the period prior to the period determined in step 1 and that will make the COS for result analysis calculation
- Based on the above revised RANI and COS, calculate the other figures of deferred or accrued revenue and WIP or cost provision.
Note
For the resource-related billing scenario, you can directly use method 08, 14, or 15 (as applicable) mentioned in Table 2 earlier.
Scenario 4: Handling the Exchange Rate Impact on RANI
In today’s global environment, cross-border contracts are common, and thus involve the revenue coming in as foreign currency. The planned revenue in such situations is recorded at the time of sales order booking at an exchange rate that is applicable on sales order creation. However, the actual billing may happen at a different exchange rate, which can result in the total actual revenue being different from the planned revenue. The standard SAP system then calculates the accrual or deferral revenue even after all revenue has been billed (unless the contract status is in TECO). At month end, the foreign currency revenue also needs to be calculated considering the month-end rate for unbilled revenue.
To handle this calculation, use Exit 2 (EXIT_SAPLKKAG_002) listed in Table 3 and for detailed understanding of this exit’s working, read SAP Note 26957 (Cust.enhancemt 2 of results analysis, doc.enhancemt).
In this exit, recalculate the planned revenue figure as follows:
- For billed revenue, convert the amount using the exchange rate used in actual billing
- For unbilled revenue, convert the amount using the month end exchange rate
By using this logic, you can calculate the RANI correctly. Until the revenue is fully billed, the RANI is always less than the planned revenue due to the unbilled part. Once revenue is fully billed, RANI is equal to the actual revenue.
Scenario 5: Differentiating of Revenue in Excess of Billing (Deferred Revenue) and Revenue Surplus (Accrued Revenue) Postings Based on the Nature of the Transaction
A business may have various processes resulting in revenue generation and thus may follow different result analysis methods (e.g., sale to customers via CRM using a linear approach, sale to customers via CRM using the POC approach, or sales by way of projects for a make-to-order [MTO] scenario). Therefore, you may need the deferred or accrued revenue posted in different G/L accounts for reporting purposes.
To achieve this, you can use the methodology provided in SAP Note 38070 and perform the customization mentioned in that SAP Note. This SAP Note uses Exit 1 (EXIT_SAPLKKAG_001) listed in Table 3 and for detailed understanding of this exit’s working, read SAP Note 26002. The line ID creation part is similar to what is explained in Kedar Muzumdar’s Financial Expert article Use Result Analysis Functionality to Meet IFRS Requirements of Revenue Recognition.
In Table 4, you can see an example structure of line IDs in the example mentioned above.
Original revenue line IDs
|
Apportioned deferred or accrued revenue line IDs |
E00 Revenues — CRM linear
|
W00 Revenues — CRM linear |
E01 Revenues — CRM POC
|
W01 Revenues — CRM POC |
E02
Revenues — CS linear
|
W02 Revenues — CS linear |
E03
Revenues — CS POC
|
W03 Revenues — CS POC |
E05
Revenues — External projects
|
W05 Revenues — External projects
|
E06 Revenues — Internal projects
|
W06 Revenues — Internal projects |
Table 4
Illustrative line ID setup
My examples are illustrative business scenarios, and there may be many other scenarios your organization faces during the revenue recognition process.
Example Implementation for Scenario 1: Enhancing the Completed Contract Method
For achieving the enhancement of CCM method to book accrued revenue in case there is some billing pending even if the contract status is complete, follow these steps.
Execute transaction code SE37 or follow menu path Tools > ABAP Workbench > Development > SE37 - Function Builder. In the screen shown in Figure 2, enter the function module relevant for the exit 3 (i.e., EXIT_SAPLKKAG_003 [Table 3], and click the Display button.

Figure 2
Enter the function module for exit 3
In the next screen (Figure 3), double-click the include ZXKAGU03.

Figure 3
Select the include for exit activation
A message appears as shown in Figure 4. Press Enter to ignore this message.

Figure 4
Warning message received while activating the exit
In the pop-up screen that appears (Figure 5), click the Yes button to create the exit.

Figure 5
The pop-up screen to confirm creation of the exit
In the next screen (Figure 6), enter the package used in your organization and click the save icon.

Figure 6
Enter package details for the creation of the new exit
This action opens the screen shown in Figure 7. In this screen, enter the code logic shown in Figure 8, click the save icon, and then click the activate icon. This makes your exit start working.

Figure 7
Enter logic in the exit and activate it
The source code shown in Figure 8 is written to replace the actual revenue (for the purpose of revenue recognition calculations only) from planned revenue so that the system determines the RANI automatically as planned revenue and thus calculates the accrued revenue as the difference between original actual revenue and RANI. This logic can be further modified based on the organization’s specific need.
Figure 8 shows the source code for the exit.
*&---------------------------------------------------------------------*
*& Include ZXKAGU03
*&---------------------------------------------------------------------*
**** Data Declaration
DATA : lv_amt TYPE wtgxxx,lv_amt
lv_amt1 TYPE wtgxxx,
lv_amt2 TYPE wtgxxx,
lv_field(8),
lv_cnt(3) TYPE n.
DATA : ls_prps TYPE prps,
lt_jest TYPE TABLE OF jest,ls_jest TYPE jest,
lt_tkkas TYPE TABLE OF tkkas,
ls_tkkas TYPE tkkas.
**** Field Symbol
FIELD-SYMBOLS : <value> TYPE any.
CLEAR : lv_amt, lv_amt1, lv_field, lv_amt2, lv_cnt.
IF objektnummer EQ import_cospa-objnr AND import_cospa-vrgng = 'SDOR'. "SDOR if object for sales order flow related to WBS element in PS system
**** Checking the RA Key has been Completed Status
SELECT * INTO TABLE lt_tkkas FROM tkkas
WHERE kokrs = kokrs
AND versa = abgrenzungs_version
AND abgsl = abgrenzungs_schluessel
AND istat = 'XXXX' . "Here you can enter status instead of XXXX where the logic should apply.
IF sy-subrc = 0.
**** Checking Project has been completed status
SELECT SINGLE * INTO ls_prps FROM prps
WHERE posid = prps_posid
AND fakkz = 'X' .
IF sy-subrc = 0.
***** Get the Project Status value from JEST table
SELECT * INTO TABLE lt_jest FROM jest
WHERE objnr = ls_prps-objnr AND stat = 'XXXX' AND inact = space. "Here you can enter status instead of XXXX where the logic should apply.
IF sy-subrc = 0.
*******************************************************************
*******Changing values in controlling area currency (WKG*)*********
*******************************************************************
**** Sum the All the Amt for the field start with WKG
DO 16 TIMES VARYING lv_amt
FROM import_cospa-wkg001
NEXT import_cospa-wkg002.
lv_amt1 = lv_amt1 + lv_amt.
ENDDO.
*** get the Value for the Input Period
CONCATENATE 'WKG' bearbeitungs_pmonat INTO lv_field.
ASSIGN COMPONENT lv_field OF STRUCTURE import_cospa TO <value>.
IF <value> IS ASSIGNED.
lv_amt2 = <value>.
UNASSIGN <value>.
ENDIF.
*** Check the Sum amount and amount for Input period is same or not
IF lv_amt2 NE lv_amt1.
**** Move all the value to export_cospa
MOVE-CORRESPONDING import_cospa TO export_cospa.
**** clear all the value for the field start with WKG otherwise Planed Revenue value also will change
DO 16 TIMES.
lv_cnt = lv_cnt + 1.
CONCATENATE 'WKG' lv_cnt INTO lv_field.
ASSIGN COMPONENT lv_field OF STRUCTURE export_cospa TO <value>.
IF <value> IS ASSIGNED.
CLEAR <value>.
UNASSIGN <value>.
ENDIF.
ENDDO.
**** Pass the Sum value to input period
CONCATENATE 'WKG' bearbeitungs_pmonat INTO lv_field.
ASSIGN COMPONENT lv_field OF STRUCTURE export_cospa TO <value>.
IF <value> IS ASSIGNED.
<value> = lv_amt1.
ENDIF.
**** the input year is different from COSPA year change as Input year
IF export_cospa-gjahr NE bearbeitungs_gjahr.
export_cospa-gjahr = bearbeitungs_gjahr.
ENDIF.
APPEND export_cospa.
ENDIF.
UNASSIGN <value>.
*******************************************************************
**********Changing values in object Currency (WOG*)****************
*******************************************************************
CLEAR : lv_amt, lv_amt1, lv_field, lv_amt2, lv_cnt.
**** Sum the All the Amt for the field start with WOG
DO 16 TIMES VARYING lv_amt
FROM import_cospa-wog001
NEXT import_cospa-wog002.
lv_amt1 = lv_amt1 + lv_amt.
ENDDO.
*** get the Vlaue for the Input Period
CONCATENATE 'WOG' bearbeitungs_pmonat INTO lv_field.
ASSIGN COMPONENT lv_field OF STRUCTURE import_cospa TO <value>.
IF <value> IS ASSIGNED.
lv_amt2 = <value>.
UNASSIGN <value>.
ENDIF.
*** Check the Sum amount and amount for Input period is same or not
IF lv_amt2 NE lv_amt1.
**** Move all the value to export_cospa
MOVE-CORRESPONDING import_cospa TO export_cospa.
**** clear all the value for the field start with WOG otherwise Planed Revenue value also will change
DO 16 TIMES.
lv_cnt = lv_cnt + 1.
CONCATENATE 'WOG' lv_cnt INTO lv_field.
ASSIGN COMPONENT lv_field OF STRUCTURE export_cospa TO <value>.
IF <value> IS ASSIGNED.
CLEAR <value>.
UNASSIGN <value>.
ENDIF.
ENDDO.
**** Pass the Sum value to input period
CONCATENATE 'WOG' bearbeitungs_pmonat INTO lv_field.
ASSIGN COMPONENT lv_field OF STRUCTURE export_cospa TO <value>.
IF <value> IS ASSIGNED.
<value> = lv_amt1.
ENDIF.
**** the input year is different from COSPA year change as Input year
IF export_cospa-gjahr NE bearbeitungs_gjahr.
export_cospa-gjahr = bearbeitungs_gjahr.
ENDIF.
MODIFY export_cospa INDEX 1.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
Figure 8
Source code for the exit
Gaurav Agarwal
Gaurav Aggarwal is SAP S/4HANA lead consultant at Infosys Limited. He has more than 14 years of experience, including 11 years in SAP Finance. He has expertise in both SAP FI and Controlling (CO) with integration to other modules in manufacturing and process industries. He is a chartered accountant and SAP Certified Financial Consultant. He holds a bachelor’s degree in commerce and is a techno-functional expert with thorough knowledge of the necessary ABAP for functional experts. He is a veteran in G/L, AR, AP, banking, FA, Travel Management, and closing cockpit and has handled greenfield implementation, upgrades and conversions, rollouts, and support projects.
You may contact the author at gka2707@gmail.com.
If you have comments about this article or publication, or would like to submit an article idea, please contact the editor.