This article is relevant if you use NetSuite and you want to amortize cost based on revenue recognition.
Background
NetSuite’s revenue recognition capacities are strong. Revenue recognition is a concern when your service or product delivery is over a long period; yet your invoice invoice billing is up-front and / or independent of how revenue is earned. We have clients in the software business and many have revenue recognition concerns. We recently helped a client get off QuickBooks to take care of their revenue recognition management. Our client offers a service that includes a pricey hardware component; that drives the need to use NetSuite item fulfillment structures to relieve inventory.
We accountants learned early on about the “matching principle“. We want to match our costs to our revenues in the period for which they are earned. In this respect, NetSuite’s cost management for general ledger entries is not connected to the revenue recognition structure. So they aren’t “matched”.
When Accountants are Technologists

We think we offer a unique capacity in NetSuite community in that our core competency is both accounting and computer science. Two members of our team served this client and each have degrees in accounting but also develop software. We love the NetSuite platform because if the system does not meet our client’s requirements, we can invent a solution. Indeed, with this client, we invented an automated mechanism to match costs to revenue earned. Here is what we did.
Link Cost Amortization to Revenue Recognition
Under typical processing, NetSuite will book the costs of a transaction during the an item fulfillment. The typical entry looks like the following:
- Dr: Cost of Goods Sold
- Cr: Inventory
Normally, this is not a problem. But when you want to match costs to revenues that are going to be spread out over time, this doesn’t work.
We created a custom mass update to look for invoices and sales orders connected to revenue recognition templates. From those sales orders, we captured the start and end date of the recognition period. We then looked for related item fulfillments to get the associated cost information.

Once we had the cost information, we created a custom linked journal entry to the item fulfillment record. The journal entry effectively reversed out the original entry in this fashion:
- Dr: Deferred Expense: Unearned Prepaid Inventory Cost
- Cr: Cost of Goods Sold
The journal entry was then connected to an Amortization Template using the dates of the service period. Once the journal entry was linked to the template, NetSuite could work its magic to automatically allocate expense to the income statement each period to consume the prepaid inventory asset.
This is how the basic algorithm works. It becomes more complex when you consider changes to the item fulfillment after it has already been saved and when there may be possible returns or cancellations.

Why Custom Mass Update vs. User Event Trigger?
You might be asking yourself why we didn’t create a SuiteScript User Event trigger to build the automatic journal entry when the item fulfillment record was saved? This was our initial design. However, we discovered something peculiar during our development.
The client is using lot controlled inventory. Each lot has its own cost. We noticed that when the item fulfillment record was saved, the cost information was coming in at average cost. We didn’t expect this. In very short order, NetSuite appears to be modifying the cost from average to the correct lot cost. This tells us that there are some background routines that “true up” costs independent of the save event. As I like to say to clients, “with NetSuite, we all are always learning!”.
No worries. Given the nature of these transactions, a nightly custom mass update works quite well (in fact, we like custom mass updates as it allows us to create something similar to a “batch process” in the environment).
Summary
Don’t let NetSuite’s out-of-the-box processing limit your business practices or information capture. The platform was meant to be adapted and in the hands of powerful actors, it really sings. If you want to produce innovations with your NetSuite system,
contact us.
Hi Marty,
With the release of NetSuite’s Custom GL Lines Plugin, could this now be achieved by CR COGS and DR Deferred Expenses as additional lines on the fulfillment record’s GL impact, followed by applying an amortisation template to the transaction per this article?
I.E. is it possible to utilise the amortisation feature as part of a custom GL line?
Hi Jarrod,
I do believe the SuiteGL approach with an amortization template makes sense. We have been using our GL Reclasser tool with much success in client situations.
Marty