Post Featured Image

2019: End of Year Review

As NetSuite Commerce's 2019 draws to a close, let's refresh ourselves about all of the new features that came this year, all the enhancements that were made, and all the helpful supporting resources that accompanied them. Remember, this a list of highlights aimed at developers and implementers who work on NetSuite Commerce applications like SuiteCommerce and SuiteCommerce Advanced, and so won't cover every change made this year.

Commerce Extension Framework

This year, it was no surprise that we made the commerce extension framework the engine of change for NetSuite Commerce. Broadly speaking, it encompasses a number of key technologies that make customization so much easier and smoother. It also enables the SuiteCommerce standalone product, which we introduced last year and continued to develop this year.

Improvements to the Extensibility API

The extensibility API is the JavaScript API that runs through the SuiteCommerce and SuiteCommerce Advanced codebase since the Aconcagua release. As new versions are released, new components, methods and events are added. This year, we were proud to release a number of new, super useful components.

In the 2019.1 release we added four new components:

  1. MyAccountMenu — adds items and item groups to the left navigation menu in My Account
  2. LoginRegisterPage — aids add custom fields to the login and registration forms; listen to form submit events to validate, and cancel if need be
  3. UserProfile — reads data about the current shopper, such as their name and address, as well as get meta-information, such as whether they are logged in or recognized
  4. PageType — part of a larger bit of functionality, but lets you add new types of pages to the site management tools (akin to the landing and enhanced pages) and also enables the new layout selector functionality

Each of these were added as a result of the feedback we have gotten from developers in our customer, partner and professional services communities. We now have a scenario where our coverage of a SuiteCommerce site is now growing increasingly comprehensive, and we can focus on expanding each of the areas. For example, in a tutorial I wrote, we looked at how we can capture a custom field on the registration form, and then surface that in the customer's account area, and include a new link to the page in the side navigation. Very cool.

In 2019.2, we made further changes to the extensibility API by introducing the showMessage() method, which is available through the visual component and all components that extend it (eg the layout, PDP, and PLP components). This smoothed over the process of surfacing messages to the user, particularly useful when you are introducing validation through cancelable events.

Improvements to Activation

Of course, once you've written your customization, it doesn't just stop there: you also need to apply those changes to your site. We improved the interface of the activation manager, as well as the code that runs in the backend.

Server-Side Activation

I think the biggest change we made is that we moved activation from your browser to our servers. What this means is that you no longer need to keep your browser on the activation status page for it to do the activation work. It also means that it now takes advantage of the power of our computers rather than yours, in particular using the map/reduce scripts available through SuiteScript 2.x, which lets us run a number of processes in parallel.

Version Targeting

Another cool thing we did was add in the ability to target specific versions. This feature is particularly useful for developers who work on SuiteCommerce Advanced sites, where it is common to not keep up-to-date with the latest version of the code. You see, if you write an extension that you know depends on a certain version of code (eg you've used one of the new components/methods mentioned above), then you want to avoid the scenario where those extensions could be activated on sites that won't be able to support them.

Version targeting lets you specify some JSON in your manifest file so that developers can say explicitly which versions are supported. Given the available syntax, you can be quite specific. You can say things like "only this version", "only this version and newer", or "only this specific minor version".

Improved Feedback

This year we also made more improvements to the feedback that the activation manager gives you when an activation goes wrong. Again, this was a request we've listened to from our developer community. While we hope that you have a seamless, error-free activation, we know that this isn't always the case. Now, if things do go wrong, you should get more specific feedback about what went wrong so that you can go and make changes to correct the issue.

Support for the SuiteCloud Development Framework (SDF)

I know I haven't talked about it much, and I hope to be providing a tutorial on it next year, but this year we really ramped up our push for supporting SDF.

If you're not already familiar with SDF, then it is what we consider "a developer's nirvana" for writing customizations on NetSuite. Our platform team has put a lot of work into getting some great tools to speed up development, as well as features built into the NetSuite product so that everything fits together nicely.

In terms of NetSuite Commerce, what this means is that you can now start developing commerce extensions using SDF. The plan is to encourage you to start looking at these customizations as if they were SuiteApps, like so many NetSuite customizations already are.

But this isn't the only reason. I think the biggest supplementary reason for doing this is that it enables to take advantage of a number of features SDF offers. In summary, these could be captured under the umbrella of 'completeness'. If you've ever written a customization that requires NetSuite objects (such as custom records or fields, or perhaps checking whether a feature is available) then SuiteApps can do all of that for you. Rather than, say, include documentation on how to create the necessary custom fields, you can simply include creation of those fields as XML objects in the installation script. You can also hide and lock file cabinet files that are included with your customization to help prevent unauthorized access. Neat.

New and Updated Extensions Built By NetSuite

One of our commitments to the commerce extension framework is that we would deliver our own new features and customizations through the same framework that we encourage customers to use. In 2019, we delivered on that promise and I'm pleased to look back on all of the new stuff available for implementers, administrators, and developers.

Remember, there are a number of reasons for doing this, which I hope you will appreciate:

  1. Optional Features — by keeping things separate, site administrators and implementers can decide for themselves which features they want installed on their account and available on their sites
  2. Separate Release Cycle — our extensions team can work on their time, releasing updates and new extensions outside of the release cycle for the SuiteCommerce and SuiteCommerce Bundles. This means that they can get them to you quicker and with fewer overheads.
  3. Let Us Do the Work — there have been quite a few times that someone has asked me how to implement a particular customization, only for me to turn around and say that we've already done the hard work for them. Our extensions are built after communication and consideration with our customers and their needs, so we often have anticipated their needs before you have had the chance!
  4. Inspiration for Your Own Extensions — a common opening to questions I get is, "Is it possible to do [x] in an extension?" and so I like to point to what the extensions team have been doing as a way of inspiring you to get customizing.

In particular to that last point, you might be interested to read about some of the 'extension spotlight' pieces I have written this year. For example, if you want to know about infinite scroll or grid order functionality, I'd suggest taking a look.

Anyway, I'm not going to list every extension the team has produced or updated this year as there have so many! You should instead keep an eye on: Commerce Extensions, which has all of the extensions the team has released; and the Commerce Extensions Release Notes page, which lists all of the updates and changes. Some are custom content types (CCTs), which are super useful for business users to make their own content/design choices a reality. (Don't forget that as a developer, you can customize any of the templates and Sass we provide with these extensions.) Others are fully-fleshed features for displaying inventory stock information, for example, or perhaps for product comparison. And then there are some, like the Google Tag Manager editor that are SuiteApps.

Take a look!

Important New Features

Outside of the extension framework, there are plenty of other new features worth highlighting.

Page Types and Page Layouts

These got a brief mention above because they're enabled through a new API component, but it's worth diving it more detail about them now.

A common request from business users is that they want to be able to change a page's layout without having to engage a developer each and every time; the page layout selector is our answer to that.

In the codebase, starting with 19.1, we have redefined common areas of the site as page types. This new classification lets you, as developers, target these areas with sets of templates. To give an example, all product detail pages (PDPs) are now classified as a particular page type; as part of an extension, you can now include a customized parent PDP template with accompanying Sass to style it. You can swap the location of the image, maybe add some new predefined CMS areas, or whatever you want. After activation, those new layouts will be available in the site management tools for a business user to select. You can of course use this functionality with your own customizations, classifying new areas of a site as page types.

Furthermore, as part of an enhancement in 19.2, we added the ability to set one of these customized templates as the site default. What this means is that by default, for example, your site's PDP pages will use the template as defined by your site's theme. But you can also override individual PDPs to use one of your custom templates. Now, however, you can now change the default template so that all PDPs use your custom template unless they've been individually overridden to use a different one. Again, once a developer has done the initial work, a business user can make all of these changes themselves in the site management tools, without further developer intervention.

Check out my blog post on how to develop new page types, if you want to get some inspiration on how to do it yourself.

Personalized Catalog Views

This is a super cool feature that a lot of our B2B customers have been raving about. We talked about this back in March before releasing it as part of 2019.2. Essentially it lets you segment your customers and inventory items into different groups, and then map them together.

If you're unsure of what you could use this for, our documentation team have helpfully put together a number of useful examples that you can use on your web store. For example:

  1. Exclusive items for VIP customers — a subset of your items only visible to a select group of users (all other items are available to all users)
  2. Different catalogs for different locations — depending on where a customer is from, they will see a group of items specific to that location (no customer sees all items)
  3. Items available only to certified customers — customers gain access to certain product lines after they have provided the required documentation/licenses

We hope to be putting more work into this feature in the coming releases, which will really unleash its potential but, as-is, it still packs a punch. I like the idea of creating a product line that is just for VIPs. I like the idea that you can sell certain brands only to customers allowed to buy and re-sell those particular brands. I like the idea of restricting products only to customers who have verified their expertise/certification of those products. There are plenty of use cases.

B2B Cart

Under the umbrella of "shopping cart options for business customers", we have a feature known colloquially as B2B cart. In short, it used to be the case that a business who had access to place orders on your web store had to use the same shopping cart, regardless of which individual within that organization was placing the order. Sharing the cart like this was a bit awkward, particularly if there were multiple users using it at the same time or if there was some sort of approval process and you needed to know who was placing the order.

Now, carts can be assigned on the basis of contacts assigned to that customer. This allows for greater freedom and greater attribution.

From a developer point of view, there isn't a lot there for you; but, it is important if you're a partner or implementer because this was a common customization request that we have now standardized into a platform feature.

Website Deactivation

A small new feature I want to highlight is the ability to deactivate a website. This crucial change was made because of the difficulty of deleting a website record (because of its associated records) and because of the impact of leaving a dormant site 'active' had on an account, in particular to its limits on website setup records. Now, a site record can be marked as Inactive, which relinquishes the license as well as severing connections to other related records, making your NetSuite account easier to work with.

Take a look if that's something you might need.

Important Enhancements

In addition to some shiny new features, we also dropped some hot new enhancements to our existing functionality.


We continue to make strides in improving the promotions that you can offer shoppers who visit your sites. Remember, we're only making improvements to promotions via the SuitePromotions feature, so if you're still lagging on older versions of promotional functionality, we strongly recommend migrating (we even have videos on how to do it!).

Customer-Specific Promotions

While it's not uncommon to run a promotion so that everyone can take advantage of it, sometimes you want to target specific customers. Setting customer eligibility on SuitePromotions was a feature that was enhanced this year so that you have much more granular control over who qualifies for your web store's discounts.

Now it is possible to set the audience based on the following:

  • Whether they are specified in a marketing campaign
  • Whether they are a member of the specified customer category
  • Whether they are a member of the specified customer group
  • Whether they are a specific customer

This makes things very flexible. Keep in mind that some of these audiences can inject further flexibility as their constituents may be set dynamically. For example, if you set the audience to be based on a customer group, that customer group may be determined by the results of a saved search, which means the audience can be both dynamic and based on virtually any value of a customer record.

Qualifying Item Quantity

Another popular enhancement request was also delivered this year. It used to be the case that once an item-based promotion was triggered, that was it. Now it is possible to specify a particular quantity of an item to act as either a minimum quantity, or as a multiplier.

In the first case, this means that you no longer have to specify a quantity of 1 on your promotion for people to qualify for it — you could set it to 2, 5, 10, 100, whatever you want. In the second case, you can now set a quantity that will re-apply the promotion each time items of that multiple are added to the cart. Very cool.

System Email Templates

System email templates are not new, relatively speaking, but they are now mandatory for web stores, and I strongly encourage you to brush up on your FreeMarker skills to take full advantage of them. There were, however, some enhancements to the feature this year that I want to highlight:

  1. Asynchronous Sending — after triggering an email, processes can be told to continue without first confirming the sending of the email, which is handy for performance
  2. Email Preview — while working on an email template, you can see what it looks like without having to go through the process that triggers it, which will certainly save you a lot of time when customizing them
  3. Shopping Domains Support — if you struggled to identify which shopping domain an order originated from, we now surface the value through a synthetic field, which is handy if the domain is not marked as the primary domain (eg if you run multiple store fronts)
  4. Item Availability — another synthetic field we added returns the available quantity of an item, taking into account those committed to orders and spread across your warehouses (this is super handy if you want to show/hide items that are in or out of stock, for example)

Code Architecture Changes

As we make progress with the commerce applications, it is sometimes necessary to revise how the code is structured. Accordingly, there were some changes to the architecture that can change how you interact with the core code. As the extensibility API matures, we continue to discourage interacting directly with the base classes and other NetSuite core code that make up the site. We do, however, recognize that it is sometimes necessary, particularly with SuiteCommerce Advanced customizations, and, accordingly, there are improvements being made in numerous areas.

SuiteScript 2.x

Our next generation version of SuiteScript is no secret to developers who also work on the wider NetSuite platform, but this year we have made strides to implement it in web stores.

There are a number of benefits to using the newer version of SuiteScript: modularity, performance, efficiency and the fact that it lives and breathes modern JavaScript syntax and style. As of 2019.2, a number of modules were migrated to use the new syntax and eagle-eyed SuiteCommerce Advanced developers are encouraged to compare the Case and OrderHistory modules to their 2019.1 versions to learn the newer syntax by example.

Next year we hope to migrate more modules over, as well as build out the N/commerce module namespace with cool new features.


The migration to TypeScript has been met by some in our developer community with excitement, and by skepticism by others. We think it is a profoundly good thing, as the superset JavaScript language makes developing core modules that much easier, safer, and faster. Furthermore, a lot of the benefits of using SuiteScript 2.x can also be conferred to TypeScript.

If you are still not up-to-speed with TypeScript, there are courses and tutorials all over the internet for it. We recommend SuiteCommerce Advanced users take the initiative to get a grounding in it by taking a course. If you're using SuiteCommerce (ie only develop via extensions) then it is not currently necessary to learn, but you may still find it useful (particularly if we do decide to roll it out to the extension framework).

Supplementary Articles

Of course, we don't just deliver value to you in the form of features, enhancements, tools and architectural changes, there are also plenty of resources in the form of documentation (just look at the What's New section for all the amazing updates our technical writers have made) and also in the form of articles on this site.


The articles I want to focus on in this section regard additional information on using SuiteCommerce and SuiteCommerce Advanced to its full potential:

Tutorial Customizations

While the above articles may contain sample code, there are some additional articles that focus more on the coding part; in particular when it comes to customization. I really want to inspire you to try out customizations as I think it's a great way to learn how the application and platform work.

Troubleshooting and Optimization

Other important areas we looked at are the general categories of troubleshooting and optimization. We do have documentation on these things, but as any developer knows — there's always more optimization to be done, and there's no way to document every possible bug or trap one might fall into.

Other Helpful Resources

Finally, there are some additional resources that were published this year that you might find useful.

Final Thoughts

I think it's been a great year. We've got a lot of great stuff up our sleeves for next year as well, and this'll come (as usual) not only in the form of changes to the application, platform and tools, but also in the form of changes to the resources we make available to you to aid your customizations.

I think some key themes next year will be a focus on B2B features and unlocking the suite. We do want to encourage you to try out other areas of the platform and consider how they interact with your web store. A lot of ERP features already do, but with an increased focus on SDF, for example, we'll learn how to work with those other areas as developers. We'll also be looking at how to expand commerce into other areas, and we can improve your customers' experiences with your web store and organization.

Personally, I'll also be looking at new ways of delivering content to you. The portal needs to change and next year will certainly bring that.

Happy 2020, commerce developers!