Marty Zigman Marty Zigman
Prolecto Labs Accelerator Templates

Best Practices for Automating NetSuite Invoice Generation

Accounting NetSuite Strategy



This article is relevant if you are looking for a solution to make NetSuite automatically generate invoices when producing shipments (item fulfillments) and you would like to solve for accounting mismatches.

Background

In every implementation that my firm is asked to lead, we first and foremost need to understand the primary business model: what set of offers (the products) are being made to our client’s customers and how are they being fulfilled? That is the fundamental opening question. Once we understand the business model, we then seek to understand the nature of how monies are exchanged for performance. With that information in hand, we can then begin to make informed assessments around the revenue recognition policy that is required so that we can produce good financial reporting.

Why am I bringing up revenue recognition? Before discussing automating invoicing, we should have an assessment related to revenue recognition. Yet, I need to go a bit further and ask you to consider the following: If you can trust your costing and pricing policies, why are you having trouble measuring margin? Please see my article, Learn how to Reliably Measure NetSuite Gross Profit and Margin.

I find that many of my prospective clients who already are using NetSuite come to us concerned with margin and reporting challenges. They less frequently ask me about automating invoicing.  As we learn about their margin challenges, we find that they have a revenue recognition problem. Much of this has to do with their early NetSuite implementation which did not carefully contemplate revenue recognition policies. A common breakdown has to do with the way NetSuite is being used — the current practices in place.  NetSuite does not really suggest the “Best Practice” — although it is possible to implement a best practice with intention. We should not fault NetSuite. Let’s remember that the NetSuite platform is flexible because it is a general purpose ERP financial system serving many industries and covering many accounting practices. The flexibility implies power — but we need to be responsible for that power.

Getting Revenue and Costs in the Right Period: the Matching Principle

To help make this more concrete, consider one of our clients who operates a drop ship business who came to us with a number of challenges:

  1. Late Costing: due to NetSuite’s dropship accounting, the costs were coming in too late: see my article, NetSuite Dropship Accruals.
  2. Early Revenue: due to the client’s item setups, revenue was being recognized too early.  As soon as the first billing was initiated, revenue was being recorded, but not earned — there were no shipments.  This was due to switches allowing invoicing in advance of fulfillment.

Thus, a key revenue recognition theme is to address the Matching Principle. We want to match our costs to our respective revenue and we want to recognize our revenue in the period for which was indeed earned. We earn revenue through the specific performance of the promise we made to transfer property rights to our customer. I mention the matching principle because many who think about automating invoices don’t stop to consider that the matching principle is important to produce good financial and operational reporting which will allow owners and managers make sound economic assessments.

Thus, when prospective clients come to us, it’s often because they are having trouble making sound economic assessments using the NetSuite platform. That’s not good.

NetSuite’s Basic Model for Revenue and Cost Matching

It’s important to understand the general mechanics of how NetSuite recognizes cost of goods sold and revenue. In the following, I will outline the basic mechanism for a product-centric company that ships goods to customers from their warehouse (the distribution industry model).

  1. Cost of Goods Sold: When you ship an item from a Sales Order, the related cost is recognized at the time the item fulfillment is marked shipped. In simplified terms, the cost is generally obtained from the item record information and depends on the item’s cost policy. If you are not using a Sales Order, then cost of goods sold is recognized on an invoice transaction. The cost of goods sold general ledger account is derived from the line item’s accounting reference which routes the debit to the income statement. Most people point this to a GL account to “Cost of Goods Sold”.
  2. Revenue: In general terms, when you invoice a transaction, the revenue is recognized. The revenue is derived from the general ledger credit reference on the line item record reference. Generally, most people point this to “Sales”.

When Sales Orders are in play, which generally is the case for most companies in the distribution industry, then cost-of-goods-sold-producing Item Fulfillment records and revenue-producing invoice transactions are in play; yet they are not bound together. NetSuite provides two out-of-the-box mechanisms to generate an invoice from Sales Orders:

  1. Single Shipments: if NetSuite detects something needs to be invoiced, it will produce a button menu option on the Sales Order or Item Fulfillment record. It can detect that something needs to be invoiced when any single Sales Order line item has a quantity shipped greater than a quantity invoiced.  See related article on the nuance for NetSuite mechanisms to generate invoices from sales orders.
  2. Bulk Invoice: the same algorithm used to detect single transactions need to be invoiced is used to present a list of sales orders that can be invoiced. NetSuite allows you to batch generate invoices in this state.  The tool works pretty quick and easy to use — but is not exposed to the API for scripting purposes.

Challenges with NetSuite’s Invoice Algorithms and Automated Billing

NetSuite’s algorithms effectively use the Sales Order line quantity counters to keep the situation under control. See my article, [cref how-to-produce-additional-transactional-financial-information-when-learned-late-in-process], which illustrates how the Sales Order is effectively a controller record and thus needs to be cared for to keep your operations and accounting trouble-free.

Since the Sales Order acts as a controller record where you record the promise made to your customer, NetSuite wants to help you deliver on your promise (the shipment) and help you request monies from customers for keeping your promise (the invoice). It’s trying to keep the world under control as it may take multiple attempts to deliver (ship) the goods.

For example, you may have a single sales order that has two different shipments (on different dates that may span an accounting period) and then you decide to invoice: A single invoice will be created for the two shipments that happened over two different efforts. NetSuite’s approach to move the records forward makes logical sense; but it does not respect revenue recognition concerns; we have revenue in one period but it was earned in another — let’s not fault it; it is not trying to organize around revenue recognition.

The Incomplete Automated Billing Approach

If the previous outline makes sense, you might say: “let’s automate the creation of the invoice by creating a custom workflow that will trigger the generation of an invoice at the time we ship the item fulfillment!”. Well, your first instinct is good to couple these events. However, there are deeper challenges lurking that may not be addressed.

  1. Transform Sales Order to Invoice: the mechanism to generate an invoice is to call a Transform method against the sales order. How convenient! NetSuite does all the work to create the invoice just like when you click the button. Yet, it may not really reflect the shipment — it likely does — but it may have more elements on the invoice than anticipated due to system processing lags or item setups that allow invoice in advance of fulfillment.  Be careful.
  2. Reporting on Item Sale Margin: NetSuite does not offer a clean way, in Sales Order processing, to associate an invoice sale event with an item fulfillment line event. This becomes especially evident in kitted item operations where the revenue is on the line item but the fulfillment is connected to the kitted item’s member (child) items; thus costs are on component items via the item fulfillment. NetSuite’s doesn’t really offer a reference (a key) to connect the item fulfillment and invoice lines together so that you can see the item margin by comparing sales to costs of goods sold. On the overall Sales Order level, you should be okay. But not necessarily the line level — where you may really need it.
  3. Modifications to Item Fulfillments: although less frequent, it is possible that you mistakenly mark an item fulfillment shipped and then you need to modify it for some reason. NetSuite is indifferent about the invoice that may have been automatically generated from your custom workflow or script.  They are autonomous.
  4. Invoice Business Logic Events not Firing: When you fire a transform on item fulfillment from a user event, the related invoice user events may not fire. This is done by design so that cascading user events don’t get caught in an endless loop.  But perhaps you need your special customizations to trigger when the invoice is created?

Solving NetSuite Automated Billing in a Scalable Fashion

After seeing the number of issues in our client environments, and too many times writing the same algorithms over and over again to solve it, we decided to address the situation squarely by creating a bundle that we give to our clients free of charge that we think takes care of the concerns outlined above. The key to making this work well is to tightly couple the item fulfillment lines to the invoice lines. When we couple this way, we get strong reporting and we ensure we get a consistent measurement of information. Here is what to consider in an automated invoice routine:

  1. Scheduled Invoice Generation on Item Fulfillments: to scale any process in NetSuite, it’s important to avoid the AfterSubmit event. Yet, the AfterSubmit is the trigger event that allows us to have a stable item fulfillment record to reference. Instead, we want a scheduled process to check that one or more of our item fulfillment records need to be invoiced. With a scheduled process performing the Sales Order transformation, any customizations on the invoice will also be triggered.  We also keep the performance of the system better for our end users.
  2. Link the Date and Accounting Period: we make sure that our invoice date and accounting period are matched to the respective item fulfillment date and accounting period. We must avoid accounting period mismatches. Don’t close the books for the previous accounting period until you know that all invoices have been generated against their respective item fulfillments.
  3. Link Invoice Quantities to Item Fulfillment Quantities: The Sales Order transformation is good but we need to do more work to line up the item fulfillment quantities to the invoice quantities. How do you do that?  You transform the Sales order and then walk the lines to match them to the item fulfillment. Once those are lined up, we can see the revenue on the invoice line with the costs on the item fulfillment line.
  4. Link Item Fulfillment and Invoices: We take the item fulfillment and the invoice and we crosslink them because we logically coupled them together for both date and line quantities. Now, with a cross-reference link between the two records, Saved Search and other reports have the ability to use these links as reference keys to help drive margin reporting. With these links in place, we can also easily detect if there are any concerns with missing links between records helping us to build detective controls, dashboards, and alerts.

Automate Your NetSuite Invoicing to Solve your Gross Margin and Financial Reporting

The key to producing the best practice is to have conversations between people responsible for fulfillment operations and those responsible for accounting. With the parties talking to each other, they each gain an appreciation for the other party’s concerns. Then, once their concerns are understood, automation becomes a real possibility because meaningful requirements emerge.

Since we see this pattern so often, we created this Best Practice algorithm in a NetSuite bundle so that it is easier to give to our clients. However, as convenient as it seems because the bundle is easy to install, we would be doing a disservice to just “set it and forget it”. It’s important to listen carefully to what our clients need and then assess if the existing algorithms work as-is.  The good news is that we are not constrained. We can refine the algorithms to adapt the logic where required.

If you found this article meaningful, sign up to get notifications of new articles. If you have a specific situation where it is time to address your invoice automation and margin requirements, let’s have a conversation.

Marty Zigman

Holding all three official certifications, Marty is regarded as the top NetSuite expert and leads a team of senior professionals at Prolecto Resources, Inc. He is a former Deloitte & Touche CPA and has held CTO roles. For over 30 years, Marty has produced leadership in ERP, CRM and eCommerce business systems. Contact Marty to set up a conversation.

More Posts - Website - Twitter - Facebook - LinkedIn - YouTube

About Marty Zigman

Marty Zigman

Holding all three official certifications, Marty is regarded as the top NetSuite expert and leads a team of senior professionals at Prolecto Resources, Inc. He is a former Deloitte & Touche CPA and has held CTO roles. For over 30 years, Marty has produced leadership in ERP, CRM and eCommerce business systems. Contact Marty to set up a conversation.

Biography • Website • X (Twitter) • Facebook • LinkedIn • YouTube

Leave a Reply

Your email address will not be published. Required fields are marked *