Learn how OdeCloud helped a client modernize their discount and promotion management by creating custom promotions in NetSuite.
Problem
The client had a custom homegrown system that offered a lot of flexibility, resulting in various tables with promotional data scattered throughout. It wasn’t a relational database or a pre-existing ERP system. Built and configured nearly 20 years ago, the client had been adding to it over the years, which made it increasingly complex.
Additionally, the promotional data lacked a centralized location, making it difficult to find and apply all promotional attributes to transactions. Initially, the client considered NetSuite SuitePromotions to manage their discounts; however, they faced thousands of scenarios that varied based on customer, quantity purchased, mix-and-match discounts, buy X get 1 for $X offers, and unique discounts from historical pricing and government contracts.
The task involved consolidating their discount tables into one centralized database, thereby enabling a single system to accurately calculate discounts based on the unique criteria and metrics for each customer. At first, we attempted to use SuitePromotions for discount configuration, but we encountered significant limitations. SuitePromotions allowed a maximum of 30 promotions, while we needed to manage thousands. Moreover, using the SuitePromotions module heavily would lead to performance issues, prompting us to seek an alternative solution regardless.
The client wanted the discounts to apply automatically based on the specified criteria, as long as we could define it in the backend with some logic. However, the SuitePromotions UI proved technical and not user-friendly for setting up and managing ongoing discounts and promotions. Additionally, it did not support CSV imports, which heightened the client’s concerns. This situation underscored the need to develop a custom solution that they could manage with minimal technical interference.
Clients Requirements:
- Ability to import promotions by CSV in batch
- Enable unlimited auto application of promotions (SuitePromotions has a maximum of 30)
- Allow various item eligibility rules (individual item, user-defined custom grouping, product class, min/max quantity)
- Facilitate discount % AND/OR $
- Provide volume pricing with GL Impact discounts
- Implement contract pricing with GL Impact discounts
- Require GL Impact on every discount applied
- Ability to configure a Promotional Term if the sales order is eligible (ie. if you buy X product you get a better Term for payment)
Types of Client Promotions
Standard Program
Basic program
Applies on Product groups
1 standard program per product group
Customer Program
Customer can belong to multiple Customer Programs (by Customer Group)
Priority based per Product
Customer Product Pricing
Specific amount discount by customer by product
SPA and Margin Enhancement same thing
Simplified Pricing
- 10 pieces +5%
- 25 pieces +7%
- 50 pieces +8%
- 100 pieces +9%
- Not combinable with bids and contracts
- Does not combine with Standard Program and Customer Program
Mix and Match
Any items on the list of items in the mix and match promotion will be eligible
Quantity required is based on total quantity of items on order matching the items on the promo list
Buy X get 1 for $
Applies individually by item
Not mixed and matched between list of items
Bids and Contracts (typically for government)
Organized by priority (lowest discount % applies)
Uses a contract $ (coupon code)
If used, not combinable with any other promotions
Bids and Contracts with Old Pricing (from contract)
Contract pricing can’t change
If price increases, we need to keep track of old agreed upon pricing
Bids and Contracts with Warranty
If you buy X item with warranty Y years you get % discount
Demo Promotion
If you qualify with quantity by item, 1 item splits in separate line and get Demo DFI applied to that line
Terms Promo
For customers and date eligible, set the term on the SO
Solution: Custom Promotions in NetSuite
Solution Architecture:
- Two custom records were created – parent/child records.
- Parent custom record is for the promo header level data.
- Child custom record is the promo definition by item/item grouping.
- Scripts to manage data extract, define customer/sales order/item eligibility and apply discounts automatically.
A custom record holds all the data and criteria applicable for client promotions. Specifically, it tracks values like location, subsidiary, currency, items, and quantities. Once a sales order is created for a customer eligible for a promotion, the system saves the transaction. Upon saving, a user event script runs to review and evaluate the client’s eligibility for promotions and check if all criteria are met for specific discounts. If the criteria match, the system automatically applies those discounts to the sales order as additional lines, thereby reflecting the appropriate General Ledger impact and updating the discounted sales order. Conversely, if the criteria do not match, the sales order proceeds unchanged.
Additionally, the client has the ability to override promotions and discounts if necessary. This feature allows for error resolution if a discount is not applied correctly or if they need to manually update an order urgently without waiting for a technical solution. By clicking a simple checkbox, the client can control whether to override the automation, provided the user has the appropriate permissions.
Ultimately, the final result is a solution that the client truly appreciates. It not only outperforms their legacy disparate systems, which lacked controls, but also enables them to create promotions without needing IT resources. This represents a significant improvement that the finance team greatly values.