[{"data":1,"prerenderedAt":5578},["ShallowReactive",2],{"blog-netsuite-ecommerce-integration-architecture-how-suitecommerce-works":3,"all-blog-posts":5382},{"id":4,"title":5,"author":6,"body":7,"categories":5362,"date":5366,"description":5367,"extension":5368,"heroImage":5369,"meta":5370,"navigation":306,"path":5371,"relatedArticles":5372,"seo":5373,"stem":5374,"tags":5375,"__hash__":5381},"content\u002Fblog\u002Fnetsuite-ecommerce-integration-architecture-how-suitecommerce-works.md","NetSuite E-commerce Integration Architecture: How SuiteCommerce Actually Works","Stenbase Team",{"type":8,"value":9,"toc":5302},"minimark",[10,14,27,30,33,38,45,48,53,64,67,71,78,84,90,96,99,103,109,112,116,122,125,129,132,137,140,276,279,284,287,411,414,417,419,423,426,430,433,436,440,446,668,674,1049,1055,1181,1185,1191,1194,1196,1200,1203,1207,1652,1656,1723,1727,1730,1849,1852,1854,1858,1861,1865,1868,1874,2115,2121,2581,2585,2588,2886,2890,2893,3137,3139,3143,3146,3150,3153,3348,3352,3355,3592,3596,3599,3756,3758,3762,3765,3769,3775,3781,3787,3793,3799,3805,3811,3817,3821,3824,3900,3904,3907,4168,4170,4174,4177,4181,4184,4309,4313,4316,4529,4533,4536,4638,4642,4645,4800,4802,4806,4809,4813,4820,4830,4834,4837,4842,4846,4849,4926,4930,4933,4938,4940,4944,4947,4951,5061,5065,5179,5183,5186,5208,5210,5214,5218,5221,5225,5228,5232,5235,5239,5242,5246,5253,5255,5259,5262,5289,5298],[11,12,5],"h1",{"id":13},"netsuite-e-commerce-integration-architecture-how-suitecommerce-actually-works",[15,16,17,18,22,23,26],"p",{},"Most SuiteCommerce documentation tells you ",[19,20,21],"em",{},"what"," to do. This guide explains ",[19,24,25],{},"why"," it works.",[15,28,29],{},"After implementing and optimizing dozens of SuiteCommerce stores, we've found that developers who understand the underlying architecture build better solutions, debug faster, and avoid the architectural mistakes that create performance nightmares.",[15,31,32],{},"This isn't a getting-started tutorial. It's a technical deep dive into how data flows between your storefront and NetSuite, what happens under the hood when a shopper clicks \"Add to Cart,\" and where the optimization opportunities hide.",[34,35,37],"h2",{"id":36},"the-architecture-at-30000-feet","The Architecture at 30,000 Feet",[15,39,40],{},[41,42],"img",{"alt":43,"src":44},"SuiteCommerce system architecture","\u002Fimages\u002Fblog\u002Fnetsuite-ecommerce-integration-architecture.webp",[15,46,47],{},"SuiteCommerce is a single-page application (SPA) that runs on NetSuite's infrastructure. Unlike platforms like Shopify or BigCommerce where the e-commerce platform is separate from the ERP, SuiteCommerce is native to NetSuite—your storefront literally runs on the same system as your inventory, orders, and financials.",[49,50,52],"h3",{"id":51},"the-four-layer-stack","The Four-Layer Stack",[54,55,60],"pre",{"className":56,"code":58,"language":59},[57],"language-text","┌─────────────────────────────────────────────────┐\n│  BROWSER (Frontend Application)                 │\n│  - Backbone.js SPA                              │\n│  - Templates (Handlebars)                       │\n│  - Frontend Models & Views                      │\n├─────────────────────────────────────────────────┤\n│  SSP APPLICATION (Server-Side Processing)       │\n│  - Service Controllers                          │\n│  - Backend Models                               │\n│  - SuiteScript 1.0\u002F2.x                          │\n├─────────────────────────────────────────────────┤\n│  NETSUITE PLATFORM                              │\n│  - Commerce API                                 │\n│  - SuiteScript API                              │\n│  - Record Types & Fields                        │\n├─────────────────────────────────────────────────┤\n│  NETSUITE DATABASE                              │\n│  - Customers, Items, Orders                     │\n│  - Custom Records & Fields                      │\n│  - Saved Searches                               │\n└─────────────────────────────────────────────────┘\n","text",[61,62,58],"code",{"__ignoreMap":63},"",[15,65,66],{},"This tight integration is both SuiteCommerce's greatest strength and its primary performance challenge. Real-time inventory? Native. Live pricing? Built-in. But every storefront request ultimately hits NetSuite's servers, which weren't designed with millisecond response times in mind.",[49,68,70],{"id":69},"key-components-explained","Key Components Explained",[15,72,73,77],{},[74,75,76],"strong",{},"Frontend Application",": The shopper-facing SPA built on Backbone.js. It handles routing, renders templates, manages state, and communicates with the backend via AJAX requests. All JavaScript runs in the browser after initial page load.",[15,79,80,83],{},[74,81,82],{},"SSP Application",": Server-side pages that run SuiteScript on NetSuite's infrastructure. These handle authenticated requests, business logic, and database operations. Think of them as the middleware between frontend and NetSuite.",[15,85,86,89],{},[74,87,88],{},"Service Controllers",": RESTful endpoints that process HTTP requests from the frontend. They handle GET, POST, PUT, and DELETE operations, translating frontend requests into SuiteScript operations.",[15,91,92,95],{},[74,93,94],{},"Backend Models",": SuiteScript modules that interact with NetSuite records. They contain the actual business logic—loading records, saving data, running searches, and transforming data for the frontend.",[97,98],"hr",{},[34,100,102],{"id":101},"data-flow-from-click-to-response","Data Flow: From Click to Response",[15,104,105],{},[41,106],{"alt":107,"src":108},"Data flow and integration","\u002Fimages\u002Fblog\u002Fnetsuite-ecommerce-integration-flow.webp",[15,110,111],{},"Understanding the data flow is critical for debugging and optimization. Let's trace what happens when a shopper adds a product to their cart.",[49,113,115],{"id":114},"the-complete-request-lifecycle","The Complete Request Lifecycle",[54,117,120],{"className":118,"code":119,"language":59},[57],"1. USER ACTION\n   Shopper clicks \"Add to Cart\"\n   \n2. FRONTEND VIEW\n   Cart.AddToCart.View handles click event\n   Triggers model.save() on LiveOrder model\n   \n3. FRONTEND MODEL\n   LiveOrder.Model constructs request payload\n   Sends POST to \u002Fservices\u002FLiveOrder.Service.ss\n   \n4. SERVICE CONTROLLER\n   LiveOrder.ServiceController receives request\n   Validates session, checks permissions\n   Calls backend model method\n   \n5. BACKEND MODEL\n   LiveOrder.Model.addLines() runs SuiteScript\n   Uses Commerce API to modify order\n   \n6. NETSUITE API\n   Commerce API updates Sales Order record\n   Recalculates totals, applies promotions\n   Checks inventory, updates reserved stock\n   \n7. RESPONSE CHAIN\n   Updated order data returns through each layer\n   Frontend model receives JSON response\n   View re-renders with new cart contents\n",[61,121,119],{"__ignoreMap":63},[15,123,124],{},"Each layer adds latency. A \"simple\" add-to-cart operation on a poorly optimized store can take 2-3 seconds. On a well-optimized store, it's under 500ms. The difference is understanding where time is spent and eliminating waste.",[49,126,128],{"id":127},"real-time-vs-scheduled-sync","Real-Time vs. Scheduled Sync",[15,130,131],{},"SuiteCommerce supports two synchronization patterns, and knowing when to use each is crucial for architecture decisions.",[15,133,134],{},[74,135,136],{},"Real-Time (Synchronous)",[15,138,139],{},"Used for: Cart operations, checkout, account updates, order placement",[54,141,145],{"className":142,"code":143,"language":144,"meta":63,"style":63},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F Real-time: Frontend waits for response\nvar cart = new LiveOrderModel();\ncart.addLine({\n    item: { internalid: '12345' },\n    quantity: 1\n}).done(function(response) {\n    \u002F\u002F Update UI with fresh data\n}).fail(function(error) {\n    \u002F\u002F Handle error immediately\n});\n","javascript",[61,146,147,156,180,192,205,215,239,245,264,270],{"__ignoreMap":63},[148,149,152],"span",{"class":150,"line":151},"line",1,[148,153,155],{"class":154},"sJ8bj","\u002F\u002F Real-time: Frontend waits for response\n",[148,157,159,163,167,170,173,177],{"class":150,"line":158},2,[148,160,162],{"class":161},"szBVR","var",[148,164,166],{"class":165},"sVt8B"," cart ",[148,168,169],{"class":161},"=",[148,171,172],{"class":161}," new",[148,174,176],{"class":175},"sScJk"," LiveOrderModel",[148,178,179],{"class":165},"();\n",[148,181,183,186,189],{"class":150,"line":182},3,[148,184,185],{"class":165},"cart.",[148,187,188],{"class":175},"addLine",[148,190,191],{"class":165},"({\n",[148,193,195,198,202],{"class":150,"line":194},4,[148,196,197],{"class":165},"    item: { internalid: ",[148,199,201],{"class":200},"sZZnC","'12345'",[148,203,204],{"class":165}," },\n",[148,206,208,211],{"class":150,"line":207},5,[148,209,210],{"class":165},"    quantity: ",[148,212,214],{"class":213},"sj4cs","1\n",[148,216,218,221,224,227,230,232,236],{"class":150,"line":217},6,[148,219,220],{"class":165},"}).",[148,222,223],{"class":175},"done",[148,225,226],{"class":165},"(",[148,228,229],{"class":161},"function",[148,231,226],{"class":165},[148,233,235],{"class":234},"s4XuR","response",[148,237,238],{"class":165},") {\n",[148,240,242],{"class":150,"line":241},7,[148,243,244],{"class":154},"    \u002F\u002F Update UI with fresh data\n",[148,246,248,250,253,255,257,259,262],{"class":150,"line":247},8,[148,249,220],{"class":165},[148,251,252],{"class":175},"fail",[148,254,226],{"class":165},[148,256,229],{"class":161},[148,258,226],{"class":165},[148,260,261],{"class":234},"error",[148,263,238],{"class":165},[148,265,267],{"class":150,"line":266},9,[148,268,269],{"class":154},"    \u002F\u002F Handle error immediately\n",[148,271,273],{"class":150,"line":272},10,[148,274,275],{"class":165},"});\n",[15,277,278],{},"Pros: Data accuracy, immediate feedback\nCons: User waits, affected by NetSuite performance",[15,280,281],{},[74,282,283],{},"Scheduled (Asynchronous)",[15,285,286],{},"Used for: Catalog sync, inventory levels, price updates, search indexing",[54,288,290],{"className":142,"code":289,"language":144,"meta":63,"style":63},"\u002F\u002F Scheduled: Data cached, refreshed periodically\n\u002F\u002F Configured in NetSuite under SuiteCommerce > Configuration\n\n{\n    \"cache\": {\n        \"item\": {\n            \"ttl\": 300,          \u002F\u002F 5 minutes\n            \"refreshAsync\": true\n        },\n        \"inventory\": {\n            \"ttl\": 60,           \u002F\u002F 1 minute\n            \"warmOnDeploy\": true\n        }\n    }\n}\n",[61,291,292,297,302,308,313,321,328,345,355,360,367,383,393,399,405],{"__ignoreMap":63},[148,293,294],{"class":150,"line":151},[148,295,296],{"class":154},"\u002F\u002F Scheduled: Data cached, refreshed periodically\n",[148,298,299],{"class":150,"line":158},[148,300,301],{"class":154},"\u002F\u002F Configured in NetSuite under SuiteCommerce > Configuration\n",[148,303,304],{"class":150,"line":182},[148,305,307],{"emptyLinePlaceholder":306},true,"\n",[148,309,310],{"class":150,"line":194},[148,311,312],{"class":165},"{\n",[148,314,315,318],{"class":150,"line":207},[148,316,317],{"class":200},"    \"cache\"",[148,319,320],{"class":165},": {\n",[148,322,323,326],{"class":150,"line":217},[148,324,325],{"class":200},"        \"item\"",[148,327,320],{"class":165},[148,329,330,333,336,339,342],{"class":150,"line":241},[148,331,332],{"class":200},"            \"ttl\"",[148,334,335],{"class":165},": ",[148,337,338],{"class":213},"300",[148,340,341],{"class":165},",          ",[148,343,344],{"class":154},"\u002F\u002F 5 minutes\n",[148,346,347,350,352],{"class":150,"line":247},[148,348,349],{"class":200},"            \"refreshAsync\"",[148,351,335],{"class":165},[148,353,354],{"class":213},"true\n",[148,356,357],{"class":150,"line":266},[148,358,359],{"class":165},"        },\n",[148,361,362,365],{"class":150,"line":272},[148,363,364],{"class":200},"        \"inventory\"",[148,366,320],{"class":165},[148,368,370,372,374,377,380],{"class":150,"line":369},11,[148,371,332],{"class":200},[148,373,335],{"class":165},[148,375,376],{"class":213},"60",[148,378,379],{"class":165},",           ",[148,381,382],{"class":154},"\u002F\u002F 1 minute\n",[148,384,386,389,391],{"class":150,"line":385},12,[148,387,388],{"class":200},"            \"warmOnDeploy\"",[148,390,335],{"class":165},[148,392,354],{"class":213},[148,394,396],{"class":150,"line":395},13,[148,397,398],{"class":165},"        }\n",[148,400,402],{"class":150,"line":401},14,[148,403,404],{"class":165},"    }\n",[148,406,408],{"class":150,"line":407},15,[148,409,410],{"class":165},"}\n",[15,412,413],{},"Pros: Fast page loads, reduced server load\nCons: Stale data possible, cache invalidation complexity",[15,415,416],{},"The art of SuiteCommerce performance is knowing which data needs real-time accuracy and which can be cached. Inventory on a product listing? Cache it. Inventory during checkout? Real-time check.",[97,418],{},[34,420,422],{"id":421},"the-backbonejs-architecture","The Backbone.js Architecture",[15,424,425],{},"SuiteCommerce uses Backbone.js as its frontend framework. While this might seem dated compared to React or Vue, it's important to understand why—and how to work with it effectively.",[49,427,429],{"id":428},"why-backbone","Why Backbone?",[15,431,432],{},"SuiteCommerce's architecture was established around 2012-2014 when Backbone was the leading SPA framework. Migrating to a modern framework would require rebuilding years of NetSuite-specific integration code. Oracle's approach has been to enhance the existing framework rather than replace it.",[15,434,435],{},"The silver lining: Backbone is extremely lightweight (8KB gzipped) compared to React (42KB) or Vue (33KB). For performance-critical e-commerce, this matters.",[49,437,439],{"id":438},"models-views-and-collections","Models, Views, and Collections",[15,441,442,445],{},[74,443,444],{},"Models"," handle data. In SuiteCommerce, you'll typically have paired models—one frontend, one backend.",[54,447,449],{"className":142,"code":448,"language":144,"meta":63,"style":63},"\u002F\u002F Frontend Model: modules\u002FCart\u002FJavaScript\u002FLiveOrder.Model.js\ndefine('LiveOrder.Model', [\n    'Backbone',\n    'underscore',\n    'Utils'\n], function(Backbone, _, Utils) {\n    'use strict';\n    \n    return Backbone.Model.extend({\n        urlRoot: Utils.getAbsoluteUrl('services\u002FLiveOrder.Service.ss'),\n        \n        \u002F\u002F Frontend models are thin wrappers\n        \u002F\u002F They define the API endpoint and any client-side transformations\n        \n        addLine: function(line) {\n            var lines = this.get('lines') || [];\n            lines.push(line);\n            return this.save({ lines: lines });\n        }\n    });\n});\n",[61,450,451,456,469,477,484,489,514,522,527,540,556,561,566,571,575,590,624,636,652,657,663],{"__ignoreMap":63},[148,452,453],{"class":150,"line":151},[148,454,455],{"class":154},"\u002F\u002F Frontend Model: modules\u002FCart\u002FJavaScript\u002FLiveOrder.Model.js\n",[148,457,458,461,463,466],{"class":150,"line":158},[148,459,460],{"class":175},"define",[148,462,226],{"class":165},[148,464,465],{"class":200},"'LiveOrder.Model'",[148,467,468],{"class":165},", [\n",[148,470,471,474],{"class":150,"line":182},[148,472,473],{"class":200},"    'Backbone'",[148,475,476],{"class":165},",\n",[148,478,479,482],{"class":150,"line":194},[148,480,481],{"class":200},"    'underscore'",[148,483,476],{"class":165},[148,485,486],{"class":150,"line":207},[148,487,488],{"class":200},"    'Utils'\n",[148,490,491,494,496,498,501,504,507,509,512],{"class":150,"line":217},[148,492,493],{"class":165},"], ",[148,495,229],{"class":161},[148,497,226],{"class":165},[148,499,500],{"class":234},"Backbone",[148,502,503],{"class":165},", ",[148,505,506],{"class":234},"_",[148,508,503],{"class":165},[148,510,511],{"class":234},"Utils",[148,513,238],{"class":165},[148,515,516,519],{"class":150,"line":241},[148,517,518],{"class":200},"    'use strict'",[148,520,521],{"class":165},";\n",[148,523,524],{"class":150,"line":247},[148,525,526],{"class":165},"    \n",[148,528,529,532,535,538],{"class":150,"line":266},[148,530,531],{"class":161},"    return",[148,533,534],{"class":165}," Backbone.Model.",[148,536,537],{"class":175},"extend",[148,539,191],{"class":165},[148,541,542,545,548,550,553],{"class":150,"line":272},[148,543,544],{"class":165},"        urlRoot: Utils.",[148,546,547],{"class":175},"getAbsoluteUrl",[148,549,226],{"class":165},[148,551,552],{"class":200},"'services\u002FLiveOrder.Service.ss'",[148,554,555],{"class":165},"),\n",[148,557,558],{"class":150,"line":369},[148,559,560],{"class":165},"        \n",[148,562,563],{"class":150,"line":385},[148,564,565],{"class":154},"        \u002F\u002F Frontend models are thin wrappers\n",[148,567,568],{"class":150,"line":395},[148,569,570],{"class":154},"        \u002F\u002F They define the API endpoint and any client-side transformations\n",[148,572,573],{"class":150,"line":401},[148,574,560],{"class":165},[148,576,577,580,582,584,586,588],{"class":150,"line":407},[148,578,579],{"class":175},"        addLine",[148,581,335],{"class":165},[148,583,229],{"class":161},[148,585,226],{"class":165},[148,587,150],{"class":234},[148,589,238],{"class":165},[148,591,593,596,599,601,604,607,610,612,615,618,621],{"class":150,"line":592},16,[148,594,595],{"class":161},"            var",[148,597,598],{"class":165}," lines ",[148,600,169],{"class":161},[148,602,603],{"class":213}," this",[148,605,606],{"class":165},".",[148,608,609],{"class":175},"get",[148,611,226],{"class":165},[148,613,614],{"class":200},"'lines'",[148,616,617],{"class":165},") ",[148,619,620],{"class":161},"||",[148,622,623],{"class":165}," [];\n",[148,625,627,630,633],{"class":150,"line":626},17,[148,628,629],{"class":165},"            lines.",[148,631,632],{"class":175},"push",[148,634,635],{"class":165},"(line);\n",[148,637,639,642,644,646,649],{"class":150,"line":638},18,[148,640,641],{"class":161},"            return",[148,643,603],{"class":213},[148,645,606],{"class":165},[148,647,648],{"class":175},"save",[148,650,651],{"class":165},"({ lines: lines });\n",[148,653,655],{"class":150,"line":654},19,[148,656,398],{"class":165},[148,658,660],{"class":150,"line":659},20,[148,661,662],{"class":165},"    });\n",[148,664,666],{"class":150,"line":665},21,[148,667,275],{"class":165},[15,669,670,673],{},[74,671,672],{},"Views"," handle presentation and user interaction.",[54,675,677],{"className":142,"code":676,"language":144,"meta":63,"style":63},"\u002F\u002F View: modules\u002FCart\u002FJavaScript\u002FCart.AddToCart.View.js\ndefine('Cart.AddToCart.View', [\n    'Backbone',\n    'cart_add_to_cart.tpl'\n], function(Backbone, template) {\n    'use strict';\n    \n    return Backbone.View.extend({\n        template: template,\n        \n        events: {\n            'click [data-action=\"add-to-cart\"]': 'addToCart'\n        },\n        \n        addToCart: function(e) {\n            e.preventDefault();\n            \n            var self = this;\n            var quantity = this.$('[name=\"quantity\"]').val();\n            \n            \u002F\u002F View calls model method\n            this.model.addLine({\n                item: this.model.get('item'),\n                quantity: parseInt(quantity, 10)\n            }).done(function() {\n                self.showConfirmation();\n            });\n        },\n        \n        getContext: function() {\n            return {\n                itemId: this.model.get('item').internalid,\n                itemName: this.model.get('item').displayname,\n                inStock: this.model.get('item').isinstock\n            };\n        }\n    });\n});\n",[61,678,679,684,695,701,706,723,729,733,744,749,753,758,768,772,776,792,802,807,820,849,853,858,871,891,909,924,935,941,946,951,963,971,990,1009,1028,1034,1039,1044],{"__ignoreMap":63},[148,680,681],{"class":150,"line":151},[148,682,683],{"class":154},"\u002F\u002F View: modules\u002FCart\u002FJavaScript\u002FCart.AddToCart.View.js\n",[148,685,686,688,690,693],{"class":150,"line":158},[148,687,460],{"class":175},[148,689,226],{"class":165},[148,691,692],{"class":200},"'Cart.AddToCart.View'",[148,694,468],{"class":165},[148,696,697,699],{"class":150,"line":182},[148,698,473],{"class":200},[148,700,476],{"class":165},[148,702,703],{"class":150,"line":194},[148,704,705],{"class":200},"    'cart_add_to_cart.tpl'\n",[148,707,708,710,712,714,716,718,721],{"class":150,"line":207},[148,709,493],{"class":165},[148,711,229],{"class":161},[148,713,226],{"class":165},[148,715,500],{"class":234},[148,717,503],{"class":165},[148,719,720],{"class":234},"template",[148,722,238],{"class":165},[148,724,725,727],{"class":150,"line":217},[148,726,518],{"class":200},[148,728,521],{"class":165},[148,730,731],{"class":150,"line":241},[148,732,526],{"class":165},[148,734,735,737,740,742],{"class":150,"line":247},[148,736,531],{"class":161},[148,738,739],{"class":165}," Backbone.View.",[148,741,537],{"class":175},[148,743,191],{"class":165},[148,745,746],{"class":150,"line":266},[148,747,748],{"class":165},"        template: template,\n",[148,750,751],{"class":150,"line":272},[148,752,560],{"class":165},[148,754,755],{"class":150,"line":369},[148,756,757],{"class":165},"        events: {\n",[148,759,760,763,765],{"class":150,"line":385},[148,761,762],{"class":200},"            'click [data-action=\"add-to-cart\"]'",[148,764,335],{"class":165},[148,766,767],{"class":200},"'addToCart'\n",[148,769,770],{"class":150,"line":395},[148,771,359],{"class":165},[148,773,774],{"class":150,"line":401},[148,775,560],{"class":165},[148,777,778,781,783,785,787,790],{"class":150,"line":407},[148,779,780],{"class":175},"        addToCart",[148,782,335],{"class":165},[148,784,229],{"class":161},[148,786,226],{"class":165},[148,788,789],{"class":234},"e",[148,791,238],{"class":165},[148,793,794,797,800],{"class":150,"line":592},[148,795,796],{"class":165},"            e.",[148,798,799],{"class":175},"preventDefault",[148,801,179],{"class":165},[148,803,804],{"class":150,"line":626},[148,805,806],{"class":165},"            \n",[148,808,809,811,814,816,818],{"class":150,"line":638},[148,810,595],{"class":161},[148,812,813],{"class":165}," self ",[148,815,169],{"class":161},[148,817,603],{"class":213},[148,819,521],{"class":165},[148,821,822,824,827,829,831,833,836,838,841,844,847],{"class":150,"line":654},[148,823,595],{"class":161},[148,825,826],{"class":165}," quantity ",[148,828,169],{"class":161},[148,830,603],{"class":213},[148,832,606],{"class":165},[148,834,835],{"class":175},"$",[148,837,226],{"class":165},[148,839,840],{"class":200},"'[name=\"quantity\"]'",[148,842,843],{"class":165},").",[148,845,846],{"class":175},"val",[148,848,179],{"class":165},[148,850,851],{"class":150,"line":659},[148,852,806],{"class":165},[148,854,855],{"class":150,"line":665},[148,856,857],{"class":154},"            \u002F\u002F View calls model method\n",[148,859,861,864,867,869],{"class":150,"line":860},22,[148,862,863],{"class":213},"            this",[148,865,866],{"class":165},".model.",[148,868,188],{"class":175},[148,870,191],{"class":165},[148,872,874,877,880,882,884,886,889],{"class":150,"line":873},23,[148,875,876],{"class":165},"                item: ",[148,878,879],{"class":213},"this",[148,881,866],{"class":165},[148,883,609],{"class":175},[148,885,226],{"class":165},[148,887,888],{"class":200},"'item'",[148,890,555],{"class":165},[148,892,894,897,900,903,906],{"class":150,"line":893},24,[148,895,896],{"class":165},"                quantity: ",[148,898,899],{"class":175},"parseInt",[148,901,902],{"class":165},"(quantity, ",[148,904,905],{"class":213},"10",[148,907,908],{"class":165},")\n",[148,910,912,915,917,919,921],{"class":150,"line":911},25,[148,913,914],{"class":165},"            }).",[148,916,223],{"class":175},[148,918,226],{"class":165},[148,920,229],{"class":161},[148,922,923],{"class":165},"() {\n",[148,925,927,930,933],{"class":150,"line":926},26,[148,928,929],{"class":165},"                self.",[148,931,932],{"class":175},"showConfirmation",[148,934,179],{"class":165},[148,936,938],{"class":150,"line":937},27,[148,939,940],{"class":165},"            });\n",[148,942,944],{"class":150,"line":943},28,[148,945,359],{"class":165},[148,947,949],{"class":150,"line":948},29,[148,950,560],{"class":165},[148,952,954,957,959,961],{"class":150,"line":953},30,[148,955,956],{"class":175},"        getContext",[148,958,335],{"class":165},[148,960,229],{"class":161},[148,962,923],{"class":165},[148,964,966,968],{"class":150,"line":965},31,[148,967,641],{"class":161},[148,969,970],{"class":165}," {\n",[148,972,974,977,979,981,983,985,987],{"class":150,"line":973},32,[148,975,976],{"class":165},"                itemId: ",[148,978,879],{"class":213},[148,980,866],{"class":165},[148,982,609],{"class":175},[148,984,226],{"class":165},[148,986,888],{"class":200},[148,988,989],{"class":165},").internalid,\n",[148,991,993,996,998,1000,1002,1004,1006],{"class":150,"line":992},33,[148,994,995],{"class":165},"                itemName: ",[148,997,879],{"class":213},[148,999,866],{"class":165},[148,1001,609],{"class":175},[148,1003,226],{"class":165},[148,1005,888],{"class":200},[148,1007,1008],{"class":165},").displayname,\n",[148,1010,1012,1015,1017,1019,1021,1023,1025],{"class":150,"line":1011},34,[148,1013,1014],{"class":165},"                inStock: ",[148,1016,879],{"class":213},[148,1018,866],{"class":165},[148,1020,609],{"class":175},[148,1022,226],{"class":165},[148,1024,888],{"class":200},[148,1026,1027],{"class":165},").isinstock\n",[148,1029,1031],{"class":150,"line":1030},35,[148,1032,1033],{"class":165},"            };\n",[148,1035,1037],{"class":150,"line":1036},36,[148,1038,398],{"class":165},[148,1040,1042],{"class":150,"line":1041},37,[148,1043,662],{"class":165},[148,1045,1047],{"class":150,"line":1046},38,[148,1048,275],{"class":165},[15,1050,1051,1054],{},[74,1052,1053],{},"Collections"," manage lists of models.",[54,1056,1058],{"className":142,"code":1057,"language":144,"meta":63,"style":63},"\u002F\u002F Collection for order history\ndefine('OrderHistory.Collection', [\n    'Backbone',\n    'OrderHistory.Model'\n], function(Backbone, Model) {\n    'use strict';\n    \n    return Backbone.Collection.extend({\n        model: Model,\n        url: '\u002Fapi\u002Fitems', \u002F\u002F Simplified endpoint\n        \n        parse: function(response) {\n            return response.records;\n        }\n    });\n});\n",[61,1059,1060,1065,1076,1082,1087,1104,1110,1114,1125,1130,1143,1147,1162,1169,1173,1177],{"__ignoreMap":63},[148,1061,1062],{"class":150,"line":151},[148,1063,1064],{"class":154},"\u002F\u002F Collection for order history\n",[148,1066,1067,1069,1071,1074],{"class":150,"line":158},[148,1068,460],{"class":175},[148,1070,226],{"class":165},[148,1072,1073],{"class":200},"'OrderHistory.Collection'",[148,1075,468],{"class":165},[148,1077,1078,1080],{"class":150,"line":182},[148,1079,473],{"class":200},[148,1081,476],{"class":165},[148,1083,1084],{"class":150,"line":194},[148,1085,1086],{"class":200},"    'OrderHistory.Model'\n",[148,1088,1089,1091,1093,1095,1097,1099,1102],{"class":150,"line":207},[148,1090,493],{"class":165},[148,1092,229],{"class":161},[148,1094,226],{"class":165},[148,1096,500],{"class":234},[148,1098,503],{"class":165},[148,1100,1101],{"class":234},"Model",[148,1103,238],{"class":165},[148,1105,1106,1108],{"class":150,"line":217},[148,1107,518],{"class":200},[148,1109,521],{"class":165},[148,1111,1112],{"class":150,"line":241},[148,1113,526],{"class":165},[148,1115,1116,1118,1121,1123],{"class":150,"line":247},[148,1117,531],{"class":161},[148,1119,1120],{"class":165}," Backbone.Collection.",[148,1122,537],{"class":175},[148,1124,191],{"class":165},[148,1126,1127],{"class":150,"line":266},[148,1128,1129],{"class":165},"        model: Model,\n",[148,1131,1132,1135,1138,1140],{"class":150,"line":272},[148,1133,1134],{"class":165},"        url: ",[148,1136,1137],{"class":200},"'\u002Fapi\u002Fitems'",[148,1139,503],{"class":165},[148,1141,1142],{"class":154},"\u002F\u002F Simplified endpoint\n",[148,1144,1145],{"class":150,"line":369},[148,1146,560],{"class":165},[148,1148,1149,1152,1154,1156,1158,1160],{"class":150,"line":385},[148,1150,1151],{"class":175},"        parse",[148,1153,335],{"class":165},[148,1155,229],{"class":161},[148,1157,226],{"class":165},[148,1159,235],{"class":234},[148,1161,238],{"class":165},[148,1163,1164,1166],{"class":150,"line":395},[148,1165,641],{"class":161},[148,1167,1168],{"class":165}," response.records;\n",[148,1170,1171],{"class":150,"line":401},[148,1172,398],{"class":165},[148,1174,1175],{"class":150,"line":407},[148,1176,662],{"class":165},[148,1178,1179],{"class":150,"line":592},[148,1180,275],{"class":165},[49,1182,1184],{"id":1183},"the-data-flow-within-backbone","The Data Flow Within Backbone",[54,1186,1189],{"className":1187,"code":1188,"language":59},[57],"Template → View → Model → Backend Service\n    ↑                           ↓\n    └───────── Response ────────┘\n",[61,1190,1188],{"__ignoreMap":63},[15,1192,1193],{},"Templates render HTML using Handlebars. Views handle events and pass data to templates. Models communicate with backend services. This separation makes it possible to modify presentation without touching business logic.",[97,1195],{},[34,1197,1199],{"id":1198},"service-controllers-and-restful-apis","Service Controllers and RESTful APIs",[15,1201,1202],{},"Service controllers are the gateway between frontend and backend. Introduced in the Vinson release, they standardized how HTTP requests map to SuiteScript operations.",[49,1204,1206],{"id":1205},"anatomy-of-a-service-controller","Anatomy of a Service Controller",[54,1208,1210],{"className":142,"code":1209,"language":144,"meta":63,"style":63},"\u002F\u002F SuiteScript\u002FProductList.ServiceController.js\ndefine('ProductList.ServiceController', [\n    'ServiceController',\n    'ProductList.Model'\n], function(ServiceController, ProductListModel) {\n    'use strict';\n    \n    return ServiceController.extend({\n        name: 'ProductList.ServiceController',\n        \n        \u002F\u002F Define allowed operations\n        options: {\n            common: {\n                requireLogin: true,\n                requirePermissions: {\n                    list: ['lists.listproducts.1']\n                }\n            }\n        },\n        \n        \u002F\u002F GET: Retrieve data\n        get: function() {\n            var id = this.request.getParameter('internalid');\n            \n            if (id) {\n                \u002F\u002F Get single record\n                return ProductListModel.get(id);\n            } else {\n                \u002F\u002F Get all records for user\n                return ProductListModel.list();\n            }\n        },\n        \n        \u002F\u002F POST: Create new record\n        post: function() {\n            var data = this.data;\n            return ProductListModel.create(data);\n        },\n        \n        \u002F\u002F PUT: Update existing record\n        put: function() {\n            var id = this.request.getParameter('internalid');\n            var data = this.data;\n            return ProductListModel.update(id, data);\n        },\n        \n        \u002F\u002F DELETE: Remove record\n        delete: function() {\n            var id = this.request.getParameter('internalid');\n            return ProductListModel.delete(id);\n        }\n    });\n});\n",[61,1211,1212,1217,1228,1235,1240,1258,1264,1268,1279,1288,1292,1297,1302,1307,1317,1322,1333,1338,1343,1347,1351,1356,1367,1392,1396,1404,1409,1422,1432,1437,1448,1452,1456,1460,1465,1476,1490,1502,1506,1511,1517,1529,1550,1563,1576,1581,1586,1592,1604,1625,1637,1642,1647],{"__ignoreMap":63},[148,1213,1214],{"class":150,"line":151},[148,1215,1216],{"class":154},"\u002F\u002F SuiteScript\u002FProductList.ServiceController.js\n",[148,1218,1219,1221,1223,1226],{"class":150,"line":158},[148,1220,460],{"class":175},[148,1222,226],{"class":165},[148,1224,1225],{"class":200},"'ProductList.ServiceController'",[148,1227,468],{"class":165},[148,1229,1230,1233],{"class":150,"line":182},[148,1231,1232],{"class":200},"    'ServiceController'",[148,1234,476],{"class":165},[148,1236,1237],{"class":150,"line":194},[148,1238,1239],{"class":200},"    'ProductList.Model'\n",[148,1241,1242,1244,1246,1248,1251,1253,1256],{"class":150,"line":207},[148,1243,493],{"class":165},[148,1245,229],{"class":161},[148,1247,226],{"class":165},[148,1249,1250],{"class":234},"ServiceController",[148,1252,503],{"class":165},[148,1254,1255],{"class":234},"ProductListModel",[148,1257,238],{"class":165},[148,1259,1260,1262],{"class":150,"line":217},[148,1261,518],{"class":200},[148,1263,521],{"class":165},[148,1265,1266],{"class":150,"line":241},[148,1267,526],{"class":165},[148,1269,1270,1272,1275,1277],{"class":150,"line":247},[148,1271,531],{"class":161},[148,1273,1274],{"class":165}," ServiceController.",[148,1276,537],{"class":175},[148,1278,191],{"class":165},[148,1280,1281,1284,1286],{"class":150,"line":266},[148,1282,1283],{"class":165},"        name: ",[148,1285,1225],{"class":200},[148,1287,476],{"class":165},[148,1289,1290],{"class":150,"line":272},[148,1291,560],{"class":165},[148,1293,1294],{"class":150,"line":369},[148,1295,1296],{"class":154},"        \u002F\u002F Define allowed operations\n",[148,1298,1299],{"class":150,"line":385},[148,1300,1301],{"class":165},"        options: {\n",[148,1303,1304],{"class":150,"line":395},[148,1305,1306],{"class":165},"            common: {\n",[148,1308,1309,1312,1315],{"class":150,"line":401},[148,1310,1311],{"class":165},"                requireLogin: ",[148,1313,1314],{"class":213},"true",[148,1316,476],{"class":165},[148,1318,1319],{"class":150,"line":407},[148,1320,1321],{"class":165},"                requirePermissions: {\n",[148,1323,1324,1327,1330],{"class":150,"line":592},[148,1325,1326],{"class":165},"                    list: [",[148,1328,1329],{"class":200},"'lists.listproducts.1'",[148,1331,1332],{"class":165},"]\n",[148,1334,1335],{"class":150,"line":626},[148,1336,1337],{"class":165},"                }\n",[148,1339,1340],{"class":150,"line":638},[148,1341,1342],{"class":165},"            }\n",[148,1344,1345],{"class":150,"line":654},[148,1346,359],{"class":165},[148,1348,1349],{"class":150,"line":659},[148,1350,560],{"class":165},[148,1352,1353],{"class":150,"line":665},[148,1354,1355],{"class":154},"        \u002F\u002F GET: Retrieve data\n",[148,1357,1358,1361,1363,1365],{"class":150,"line":860},[148,1359,1360],{"class":175},"        get",[148,1362,335],{"class":165},[148,1364,229],{"class":161},[148,1366,923],{"class":165},[148,1368,1369,1371,1374,1376,1378,1381,1384,1386,1389],{"class":150,"line":873},[148,1370,595],{"class":161},[148,1372,1373],{"class":165}," id ",[148,1375,169],{"class":161},[148,1377,603],{"class":213},[148,1379,1380],{"class":165},".request.",[148,1382,1383],{"class":175},"getParameter",[148,1385,226],{"class":165},[148,1387,1388],{"class":200},"'internalid'",[148,1390,1391],{"class":165},");\n",[148,1393,1394],{"class":150,"line":893},[148,1395,806],{"class":165},[148,1397,1398,1401],{"class":150,"line":911},[148,1399,1400],{"class":161},"            if",[148,1402,1403],{"class":165}," (id) {\n",[148,1405,1406],{"class":150,"line":926},[148,1407,1408],{"class":154},"                \u002F\u002F Get single record\n",[148,1410,1411,1414,1417,1419],{"class":150,"line":937},[148,1412,1413],{"class":161},"                return",[148,1415,1416],{"class":165}," ProductListModel.",[148,1418,609],{"class":175},[148,1420,1421],{"class":165},"(id);\n",[148,1423,1424,1427,1430],{"class":150,"line":943},[148,1425,1426],{"class":165},"            } ",[148,1428,1429],{"class":161},"else",[148,1431,970],{"class":165},[148,1433,1434],{"class":150,"line":948},[148,1435,1436],{"class":154},"                \u002F\u002F Get all records for user\n",[148,1438,1439,1441,1443,1446],{"class":150,"line":953},[148,1440,1413],{"class":161},[148,1442,1416],{"class":165},[148,1444,1445],{"class":175},"list",[148,1447,179],{"class":165},[148,1449,1450],{"class":150,"line":965},[148,1451,1342],{"class":165},[148,1453,1454],{"class":150,"line":973},[148,1455,359],{"class":165},[148,1457,1458],{"class":150,"line":992},[148,1459,560],{"class":165},[148,1461,1462],{"class":150,"line":1011},[148,1463,1464],{"class":154},"        \u002F\u002F POST: Create new record\n",[148,1466,1467,1470,1472,1474],{"class":150,"line":1030},[148,1468,1469],{"class":175},"        post",[148,1471,335],{"class":165},[148,1473,229],{"class":161},[148,1475,923],{"class":165},[148,1477,1478,1480,1483,1485,1487],{"class":150,"line":1036},[148,1479,595],{"class":161},[148,1481,1482],{"class":165}," data ",[148,1484,169],{"class":161},[148,1486,603],{"class":213},[148,1488,1489],{"class":165},".data;\n",[148,1491,1492,1494,1496,1499],{"class":150,"line":1041},[148,1493,641],{"class":161},[148,1495,1416],{"class":165},[148,1497,1498],{"class":175},"create",[148,1500,1501],{"class":165},"(data);\n",[148,1503,1504],{"class":150,"line":1046},[148,1505,359],{"class":165},[148,1507,1509],{"class":150,"line":1508},39,[148,1510,560],{"class":165},[148,1512,1514],{"class":150,"line":1513},40,[148,1515,1516],{"class":154},"        \u002F\u002F PUT: Update existing record\n",[148,1518,1520,1523,1525,1527],{"class":150,"line":1519},41,[148,1521,1522],{"class":175},"        put",[148,1524,335],{"class":165},[148,1526,229],{"class":161},[148,1528,923],{"class":165},[148,1530,1532,1534,1536,1538,1540,1542,1544,1546,1548],{"class":150,"line":1531},42,[148,1533,595],{"class":161},[148,1535,1373],{"class":165},[148,1537,169],{"class":161},[148,1539,603],{"class":213},[148,1541,1380],{"class":165},[148,1543,1383],{"class":175},[148,1545,226],{"class":165},[148,1547,1388],{"class":200},[148,1549,1391],{"class":165},[148,1551,1553,1555,1557,1559,1561],{"class":150,"line":1552},43,[148,1554,595],{"class":161},[148,1556,1482],{"class":165},[148,1558,169],{"class":161},[148,1560,603],{"class":213},[148,1562,1489],{"class":165},[148,1564,1566,1568,1570,1573],{"class":150,"line":1565},44,[148,1567,641],{"class":161},[148,1569,1416],{"class":165},[148,1571,1572],{"class":175},"update",[148,1574,1575],{"class":165},"(id, data);\n",[148,1577,1579],{"class":150,"line":1578},45,[148,1580,359],{"class":165},[148,1582,1584],{"class":150,"line":1583},46,[148,1585,560],{"class":165},[148,1587,1589],{"class":150,"line":1588},47,[148,1590,1591],{"class":154},"        \u002F\u002F DELETE: Remove record\n",[148,1593,1595,1598,1600,1602],{"class":150,"line":1594},48,[148,1596,1597],{"class":175},"        delete",[148,1599,335],{"class":165},[148,1601,229],{"class":161},[148,1603,923],{"class":165},[148,1605,1607,1609,1611,1613,1615,1617,1619,1621,1623],{"class":150,"line":1606},49,[148,1608,595],{"class":161},[148,1610,1373],{"class":165},[148,1612,169],{"class":161},[148,1614,603],{"class":213},[148,1616,1380],{"class":165},[148,1618,1383],{"class":175},[148,1620,226],{"class":165},[148,1622,1388],{"class":200},[148,1624,1391],{"class":165},[148,1626,1628,1630,1632,1635],{"class":150,"line":1627},50,[148,1629,641],{"class":161},[148,1631,1416],{"class":165},[148,1633,1634],{"class":175},"delete",[148,1636,1421],{"class":165},[148,1638,1640],{"class":150,"line":1639},51,[148,1641,398],{"class":165},[148,1643,1645],{"class":150,"line":1644},52,[148,1646,662],{"class":165},[148,1648,1650],{"class":150,"line":1649},53,[148,1651,275],{"class":165},[49,1653,1655],{"id":1654},"http-methods-and-their-purposes","HTTP Methods and Their Purposes",[1657,1658,1659,1675],"table",{},[1660,1661,1662],"thead",{},[1663,1664,1665,1669,1672],"tr",{},[1666,1667,1668],"th",{},"Method",[1666,1670,1671],{},"Purpose",[1666,1673,1674],{},"Typical Use Case",[1676,1677,1678,1690,1701,1712],"tbody",{},[1663,1679,1680,1684,1687],{},[1681,1682,1683],"td",{},"GET",[1681,1685,1686],{},"Retrieve data",[1681,1688,1689],{},"Loading product details, order history",[1663,1691,1692,1695,1698],{},[1681,1693,1694],{},"POST",[1681,1696,1697],{},"Create new record",[1681,1699,1700],{},"Adding to cart, creating wishlist",[1663,1702,1703,1706,1709],{},[1681,1704,1705],{},"PUT",[1681,1707,1708],{},"Update existing record",[1681,1710,1711],{},"Updating quantities, editing addresses",[1663,1713,1714,1717,1720],{},[1681,1715,1716],{},"DELETE",[1681,1718,1719],{},"Remove record",[1681,1721,1722],{},"Removing cart items, deleting saved lists",[49,1724,1726],{"id":1725},"security-and-permissions","Security and Permissions",[15,1728,1729],{},"Service controllers include built-in security features that are often overlooked:",[54,1731,1733],{"className":142,"code":1732,"language":144,"meta":63,"style":63},"options: {\n    common: {\n        \u002F\u002F Require logged-in user\n        requireLogin: true,\n        \n        \u002F\u002F Check NetSuite permissions\n        requirePermissions: {\n            list: ['lists.listAccess.1']\n        }\n    },\n    \n    \u002F\u002F Method-specific requirements\n    post: {\n        requirePermissions: {\n            create: ['transactions.tranSalesOrd.2']\n        }\n    }\n}\n",[61,1734,1735,1742,1749,1754,1765,1769,1774,1781,1794,1798,1803,1807,1812,1819,1825,1837,1841,1845],{"__ignoreMap":63},[148,1736,1737,1740],{"class":150,"line":151},[148,1738,1739],{"class":175},"options",[148,1741,320],{"class":165},[148,1743,1744,1747],{"class":150,"line":158},[148,1745,1746],{"class":175},"    common",[148,1748,320],{"class":165},[148,1750,1751],{"class":150,"line":182},[148,1752,1753],{"class":154},"        \u002F\u002F Require logged-in user\n",[148,1755,1756,1759,1761,1763],{"class":150,"line":194},[148,1757,1758],{"class":175},"        requireLogin",[148,1760,335],{"class":165},[148,1762,1314],{"class":213},[148,1764,476],{"class":165},[148,1766,1767],{"class":150,"line":207},[148,1768,560],{"class":165},[148,1770,1771],{"class":150,"line":217},[148,1772,1773],{"class":154},"        \u002F\u002F Check NetSuite permissions\n",[148,1775,1776,1779],{"class":150,"line":241},[148,1777,1778],{"class":175},"        requirePermissions",[148,1780,320],{"class":165},[148,1782,1783,1786,1789,1792],{"class":150,"line":247},[148,1784,1785],{"class":175},"            list",[148,1787,1788],{"class":165},": [",[148,1790,1791],{"class":200},"'lists.listAccess.1'",[148,1793,1332],{"class":165},[148,1795,1796],{"class":150,"line":266},[148,1797,398],{"class":165},[148,1799,1800],{"class":150,"line":272},[148,1801,1802],{"class":165},"    },\n",[148,1804,1805],{"class":150,"line":369},[148,1806,526],{"class":165},[148,1808,1809],{"class":150,"line":385},[148,1810,1811],{"class":154},"    \u002F\u002F Method-specific requirements\n",[148,1813,1814,1817],{"class":150,"line":395},[148,1815,1816],{"class":175},"    post",[148,1818,320],{"class":165},[148,1820,1821,1823],{"class":150,"line":401},[148,1822,1778],{"class":175},[148,1824,320],{"class":165},[148,1826,1827,1830,1832,1835],{"class":150,"line":407},[148,1828,1829],{"class":175},"            create",[148,1831,1788],{"class":165},[148,1833,1834],{"class":200},"'transactions.tranSalesOrd.2'",[148,1836,1332],{"class":165},[148,1838,1839],{"class":150,"line":592},[148,1840,398],{"class":165},[148,1842,1843],{"class":150,"line":626},[148,1844,404],{"class":165},[148,1846,1847],{"class":150,"line":638},[148,1848,410],{"class":165},[15,1850,1851],{},"Never skip these validations. A service controller without proper permission checks is a security vulnerability.",[97,1853],{},[34,1855,1857],{"id":1856},"backend-models-and-suitescript","Backend Models and SuiteScript",[15,1859,1860],{},"Backend models are where the real work happens. They run SuiteScript on NetSuite's servers to perform database operations.",[49,1862,1864],{"id":1863},"the-commerce-api-vs-native-suitescript","The Commerce API vs. Native SuiteScript",[15,1866,1867],{},"SuiteCommerce provides two ways to interact with NetSuite data:",[15,1869,1870,1873],{},[74,1871,1872],{},"Commerce API"," (Recommended for standard operations)",[54,1875,1877],{"className":142,"code":1876,"language":144,"meta":63,"style":63},"\u002F\u002F Using Commerce API for order operations\ndefine('Cart.Model', [\n    'Application',\n    'SC.Model'\n], function(Application, SCModel) {\n    'use strict';\n    \n    return SCModel.extend({\n        name: 'Cart',\n        \n        addLine: function(data) {\n            \u002F\u002F Commerce API handles complexity\n            var order = Application.getOrder();\n            \n            return order.addLine({\n                item: data.item.internalid,\n                quantity: data.quantity,\n                options: data.options || {}\n            });\n        },\n        \n        get: function() {\n            var order = Application.getOrder();\n            return order.getFieldValues([\n                'lines',\n                'summary',\n                'promocodes'\n            ]);\n        }\n    });\n});\n",[61,1878,1879,1884,1895,1902,1907,1925,1931,1935,1946,1955,1959,1974,1979,1996,2000,2011,2016,2021,2031,2035,2039,2043,2053,2067,2079,2086,2093,2098,2103,2107,2111],{"__ignoreMap":63},[148,1880,1881],{"class":150,"line":151},[148,1882,1883],{"class":154},"\u002F\u002F Using Commerce API for order operations\n",[148,1885,1886,1888,1890,1893],{"class":150,"line":158},[148,1887,460],{"class":175},[148,1889,226],{"class":165},[148,1891,1892],{"class":200},"'Cart.Model'",[148,1894,468],{"class":165},[148,1896,1897,1900],{"class":150,"line":182},[148,1898,1899],{"class":200},"    'Application'",[148,1901,476],{"class":165},[148,1903,1904],{"class":150,"line":194},[148,1905,1906],{"class":200},"    'SC.Model'\n",[148,1908,1909,1911,1913,1915,1918,1920,1923],{"class":150,"line":207},[148,1910,493],{"class":165},[148,1912,229],{"class":161},[148,1914,226],{"class":165},[148,1916,1917],{"class":234},"Application",[148,1919,503],{"class":165},[148,1921,1922],{"class":234},"SCModel",[148,1924,238],{"class":165},[148,1926,1927,1929],{"class":150,"line":217},[148,1928,518],{"class":200},[148,1930,521],{"class":165},[148,1932,1933],{"class":150,"line":241},[148,1934,526],{"class":165},[148,1936,1937,1939,1942,1944],{"class":150,"line":247},[148,1938,531],{"class":161},[148,1940,1941],{"class":165}," SCModel.",[148,1943,537],{"class":175},[148,1945,191],{"class":165},[148,1947,1948,1950,1953],{"class":150,"line":266},[148,1949,1283],{"class":165},[148,1951,1952],{"class":200},"'Cart'",[148,1954,476],{"class":165},[148,1956,1957],{"class":150,"line":272},[148,1958,560],{"class":165},[148,1960,1961,1963,1965,1967,1969,1972],{"class":150,"line":369},[148,1962,579],{"class":175},[148,1964,335],{"class":165},[148,1966,229],{"class":161},[148,1968,226],{"class":165},[148,1970,1971],{"class":234},"data",[148,1973,238],{"class":165},[148,1975,1976],{"class":150,"line":385},[148,1977,1978],{"class":154},"            \u002F\u002F Commerce API handles complexity\n",[148,1980,1981,1983,1986,1988,1991,1994],{"class":150,"line":395},[148,1982,595],{"class":161},[148,1984,1985],{"class":165}," order ",[148,1987,169],{"class":161},[148,1989,1990],{"class":165}," Application.",[148,1992,1993],{"class":175},"getOrder",[148,1995,179],{"class":165},[148,1997,1998],{"class":150,"line":401},[148,1999,806],{"class":165},[148,2001,2002,2004,2007,2009],{"class":150,"line":407},[148,2003,641],{"class":161},[148,2005,2006],{"class":165}," order.",[148,2008,188],{"class":175},[148,2010,191],{"class":165},[148,2012,2013],{"class":150,"line":592},[148,2014,2015],{"class":165},"                item: data.item.internalid,\n",[148,2017,2018],{"class":150,"line":626},[148,2019,2020],{"class":165},"                quantity: data.quantity,\n",[148,2022,2023,2026,2028],{"class":150,"line":638},[148,2024,2025],{"class":165},"                options: data.options ",[148,2027,620],{"class":161},[148,2029,2030],{"class":165}," {}\n",[148,2032,2033],{"class":150,"line":654},[148,2034,940],{"class":165},[148,2036,2037],{"class":150,"line":659},[148,2038,359],{"class":165},[148,2040,2041],{"class":150,"line":665},[148,2042,560],{"class":165},[148,2044,2045,2047,2049,2051],{"class":150,"line":860},[148,2046,1360],{"class":175},[148,2048,335],{"class":165},[148,2050,229],{"class":161},[148,2052,923],{"class":165},[148,2054,2055,2057,2059,2061,2063,2065],{"class":150,"line":873},[148,2056,595],{"class":161},[148,2058,1985],{"class":165},[148,2060,169],{"class":161},[148,2062,1990],{"class":165},[148,2064,1993],{"class":175},[148,2066,179],{"class":165},[148,2068,2069,2071,2073,2076],{"class":150,"line":893},[148,2070,641],{"class":161},[148,2072,2006],{"class":165},[148,2074,2075],{"class":175},"getFieldValues",[148,2077,2078],{"class":165},"([\n",[148,2080,2081,2084],{"class":150,"line":911},[148,2082,2083],{"class":200},"                'lines'",[148,2085,476],{"class":165},[148,2087,2088,2091],{"class":150,"line":926},[148,2089,2090],{"class":200},"                'summary'",[148,2092,476],{"class":165},[148,2094,2095],{"class":150,"line":937},[148,2096,2097],{"class":200},"                'promocodes'\n",[148,2099,2100],{"class":150,"line":943},[148,2101,2102],{"class":165},"            ]);\n",[148,2104,2105],{"class":150,"line":948},[148,2106,398],{"class":165},[148,2108,2109],{"class":150,"line":953},[148,2110,662],{"class":165},[148,2112,2113],{"class":150,"line":965},[148,2114,275],{"class":165},[15,2116,2117,2120],{},[74,2118,2119],{},"Native SuiteScript"," (For custom functionality)",[54,2122,2124],{"className":142,"code":2123,"language":144,"meta":63,"style":63},"\u002F\u002F Using SuiteScript for custom record operations\ndefine('CustomRecord.Model', [\n    'SC.Model',\n    'underscore'\n], function(SCModel, _) {\n    'use strict';\n    \n    return SCModel.extend({\n        name: 'CustomRecord',\n        \n        get: function(id) {\n            \u002F\u002F Load record using SuiteScript\n            var record = nlapiLoadRecord('customrecord_myrecord', id);\n            \n            return {\n                id: record.getId(),\n                name: record.getFieldValue('name'),\n                description: record.getFieldValue('custrecord_description'),\n                created: record.getFieldValue('created')\n            };\n        },\n        \n        list: function() {\n            var filters = [\n                new nlobjSearchFilter('isinactive', null, 'is', 'F'),\n                new nlobjSearchFilter('owner', null, 'is', nlapiGetUser())\n            ];\n            \n            var columns = [\n                new nlobjSearchColumn('internalid'),\n                new nlobjSearchColumn('name'),\n                new nlobjSearchColumn('created')\n            ];\n            \n            var results = nlapiSearchRecord('customrecord_myrecord', null, filters, columns);\n            \n            return _.map(results || [], function(result) {\n                return {\n                    id: result.getId(),\n                    name: result.getValue('name'),\n                    created: result.getValue('created')\n                };\n            });\n        }\n    });\n});\n",[61,2125,2126,2131,2142,2149,2154,2170,2176,2180,2190,2199,2203,2218,2223,2243,2247,2253,2264,2279,2293,2307,2311,2315,2319,2330,2342,2372,2399,2404,2408,2419,2432,2444,2456,2460,2464,2487,2491,2518,2524,2533,2547,2560,2565,2569,2573,2577],{"__ignoreMap":63},[148,2127,2128],{"class":150,"line":151},[148,2129,2130],{"class":154},"\u002F\u002F Using SuiteScript for custom record operations\n",[148,2132,2133,2135,2137,2140],{"class":150,"line":158},[148,2134,460],{"class":175},[148,2136,226],{"class":165},[148,2138,2139],{"class":200},"'CustomRecord.Model'",[148,2141,468],{"class":165},[148,2143,2144,2147],{"class":150,"line":182},[148,2145,2146],{"class":200},"    'SC.Model'",[148,2148,476],{"class":165},[148,2150,2151],{"class":150,"line":194},[148,2152,2153],{"class":200},"    'underscore'\n",[148,2155,2156,2158,2160,2162,2164,2166,2168],{"class":150,"line":207},[148,2157,493],{"class":165},[148,2159,229],{"class":161},[148,2161,226],{"class":165},[148,2163,1922],{"class":234},[148,2165,503],{"class":165},[148,2167,506],{"class":234},[148,2169,238],{"class":165},[148,2171,2172,2174],{"class":150,"line":217},[148,2173,518],{"class":200},[148,2175,521],{"class":165},[148,2177,2178],{"class":150,"line":241},[148,2179,526],{"class":165},[148,2181,2182,2184,2186,2188],{"class":150,"line":247},[148,2183,531],{"class":161},[148,2185,1941],{"class":165},[148,2187,537],{"class":175},[148,2189,191],{"class":165},[148,2191,2192,2194,2197],{"class":150,"line":266},[148,2193,1283],{"class":165},[148,2195,2196],{"class":200},"'CustomRecord'",[148,2198,476],{"class":165},[148,2200,2201],{"class":150,"line":272},[148,2202,560],{"class":165},[148,2204,2205,2207,2209,2211,2213,2216],{"class":150,"line":369},[148,2206,1360],{"class":175},[148,2208,335],{"class":165},[148,2210,229],{"class":161},[148,2212,226],{"class":165},[148,2214,2215],{"class":234},"id",[148,2217,238],{"class":165},[148,2219,2220],{"class":150,"line":385},[148,2221,2222],{"class":154},"            \u002F\u002F Load record using SuiteScript\n",[148,2224,2225,2227,2230,2232,2235,2237,2240],{"class":150,"line":395},[148,2226,595],{"class":161},[148,2228,2229],{"class":165}," record ",[148,2231,169],{"class":161},[148,2233,2234],{"class":175}," nlapiLoadRecord",[148,2236,226],{"class":165},[148,2238,2239],{"class":200},"'customrecord_myrecord'",[148,2241,2242],{"class":165},", id);\n",[148,2244,2245],{"class":150,"line":401},[148,2246,806],{"class":165},[148,2248,2249,2251],{"class":150,"line":407},[148,2250,641],{"class":161},[148,2252,970],{"class":165},[148,2254,2255,2258,2261],{"class":150,"line":592},[148,2256,2257],{"class":165},"                id: record.",[148,2259,2260],{"class":175},"getId",[148,2262,2263],{"class":165},"(),\n",[148,2265,2266,2269,2272,2274,2277],{"class":150,"line":626},[148,2267,2268],{"class":165},"                name: record.",[148,2270,2271],{"class":175},"getFieldValue",[148,2273,226],{"class":165},[148,2275,2276],{"class":200},"'name'",[148,2278,555],{"class":165},[148,2280,2281,2284,2286,2288,2291],{"class":150,"line":638},[148,2282,2283],{"class":165},"                description: record.",[148,2285,2271],{"class":175},[148,2287,226],{"class":165},[148,2289,2290],{"class":200},"'custrecord_description'",[148,2292,555],{"class":165},[148,2294,2295,2298,2300,2302,2305],{"class":150,"line":654},[148,2296,2297],{"class":165},"                created: record.",[148,2299,2271],{"class":175},[148,2301,226],{"class":165},[148,2303,2304],{"class":200},"'created'",[148,2306,908],{"class":165},[148,2308,2309],{"class":150,"line":659},[148,2310,1033],{"class":165},[148,2312,2313],{"class":150,"line":665},[148,2314,359],{"class":165},[148,2316,2317],{"class":150,"line":860},[148,2318,560],{"class":165},[148,2320,2321,2324,2326,2328],{"class":150,"line":873},[148,2322,2323],{"class":175},"        list",[148,2325,335],{"class":165},[148,2327,229],{"class":161},[148,2329,923],{"class":165},[148,2331,2332,2334,2337,2339],{"class":150,"line":893},[148,2333,595],{"class":161},[148,2335,2336],{"class":165}," filters ",[148,2338,169],{"class":161},[148,2340,2341],{"class":165}," [\n",[148,2343,2344,2347,2350,2352,2355,2357,2360,2362,2365,2367,2370],{"class":150,"line":911},[148,2345,2346],{"class":161},"                new",[148,2348,2349],{"class":175}," nlobjSearchFilter",[148,2351,226],{"class":165},[148,2353,2354],{"class":200},"'isinactive'",[148,2356,503],{"class":165},[148,2358,2359],{"class":213},"null",[148,2361,503],{"class":165},[148,2363,2364],{"class":200},"'is'",[148,2366,503],{"class":165},[148,2368,2369],{"class":200},"'F'",[148,2371,555],{"class":165},[148,2373,2374,2376,2378,2380,2383,2385,2387,2389,2391,2393,2396],{"class":150,"line":926},[148,2375,2346],{"class":161},[148,2377,2349],{"class":175},[148,2379,226],{"class":165},[148,2381,2382],{"class":200},"'owner'",[148,2384,503],{"class":165},[148,2386,2359],{"class":213},[148,2388,503],{"class":165},[148,2390,2364],{"class":200},[148,2392,503],{"class":165},[148,2394,2395],{"class":175},"nlapiGetUser",[148,2397,2398],{"class":165},"())\n",[148,2400,2401],{"class":150,"line":937},[148,2402,2403],{"class":165},"            ];\n",[148,2405,2406],{"class":150,"line":943},[148,2407,806],{"class":165},[148,2409,2410,2412,2415,2417],{"class":150,"line":948},[148,2411,595],{"class":161},[148,2413,2414],{"class":165}," columns ",[148,2416,169],{"class":161},[148,2418,2341],{"class":165},[148,2420,2421,2423,2426,2428,2430],{"class":150,"line":953},[148,2422,2346],{"class":161},[148,2424,2425],{"class":175}," nlobjSearchColumn",[148,2427,226],{"class":165},[148,2429,1388],{"class":200},[148,2431,555],{"class":165},[148,2433,2434,2436,2438,2440,2442],{"class":150,"line":965},[148,2435,2346],{"class":161},[148,2437,2425],{"class":175},[148,2439,226],{"class":165},[148,2441,2276],{"class":200},[148,2443,555],{"class":165},[148,2445,2446,2448,2450,2452,2454],{"class":150,"line":973},[148,2447,2346],{"class":161},[148,2449,2425],{"class":175},[148,2451,226],{"class":165},[148,2453,2304],{"class":200},[148,2455,908],{"class":165},[148,2457,2458],{"class":150,"line":992},[148,2459,2403],{"class":165},[148,2461,2462],{"class":150,"line":1011},[148,2463,806],{"class":165},[148,2465,2466,2468,2471,2473,2476,2478,2480,2482,2484],{"class":150,"line":1030},[148,2467,595],{"class":161},[148,2469,2470],{"class":165}," results ",[148,2472,169],{"class":161},[148,2474,2475],{"class":175}," nlapiSearchRecord",[148,2477,226],{"class":165},[148,2479,2239],{"class":200},[148,2481,503],{"class":165},[148,2483,2359],{"class":213},[148,2485,2486],{"class":165},", filters, columns);\n",[148,2488,2489],{"class":150,"line":1036},[148,2490,806],{"class":165},[148,2492,2493,2495,2498,2501,2504,2506,2509,2511,2513,2516],{"class":150,"line":1041},[148,2494,641],{"class":161},[148,2496,2497],{"class":165}," _.",[148,2499,2500],{"class":175},"map",[148,2502,2503],{"class":165},"(results ",[148,2505,620],{"class":161},[148,2507,2508],{"class":165}," [], ",[148,2510,229],{"class":161},[148,2512,226],{"class":165},[148,2514,2515],{"class":234},"result",[148,2517,238],{"class":165},[148,2519,2520,2522],{"class":150,"line":1046},[148,2521,1413],{"class":161},[148,2523,970],{"class":165},[148,2525,2526,2529,2531],{"class":150,"line":1508},[148,2527,2528],{"class":165},"                    id: result.",[148,2530,2260],{"class":175},[148,2532,2263],{"class":165},[148,2534,2535,2538,2541,2543,2545],{"class":150,"line":1513},[148,2536,2537],{"class":165},"                    name: result.",[148,2539,2540],{"class":175},"getValue",[148,2542,226],{"class":165},[148,2544,2276],{"class":200},[148,2546,555],{"class":165},[148,2548,2549,2552,2554,2556,2558],{"class":150,"line":1519},[148,2550,2551],{"class":165},"                    created: result.",[148,2553,2540],{"class":175},[148,2555,226],{"class":165},[148,2557,2304],{"class":200},[148,2559,908],{"class":165},[148,2561,2562],{"class":150,"line":1531},[148,2563,2564],{"class":165},"                };\n",[148,2566,2567],{"class":150,"line":1552},[148,2568,940],{"class":165},[148,2570,2571],{"class":150,"line":1565},[148,2572,398],{"class":165},[148,2574,2575],{"class":150,"line":1578},[148,2576,662],{"class":165},[148,2578,2579],{"class":150,"line":1583},[148,2580,275],{"class":165},[49,2582,2584],{"id":2583},"suitescript-10-vs-2x","SuiteScript 1.0 vs 2.x",[15,2586,2587],{},"SuiteCommerce's core uses SuiteScript 1.0, but you can use 2.x in your customizations:",[54,2589,2591],{"className":142,"code":2590,"language":144,"meta":63,"style":63},"\u002F\u002F SuiteScript 2.x syntax in extensions\n\u002F**\n * @NApiVersion 2.1\n * @NModuleScope Public\n *\u002F\ndefine(['N\u002Fsearch', 'N\u002Frecord'], function(search, record) {\n    \n    function getProducts(filters) {\n        const productSearch = search.create({\n            type: search.Type.INVENTORY_ITEM,\n            filters: filters,\n            columns: ['itemid', 'displayname', 'salesprice']\n        });\n        \n        const results = [];\n        productSearch.run().each(function(result) {\n            results.push({\n                id: result.id,\n                sku: result.getValue('itemid'),\n                name: result.getValue('displayname'),\n                price: result.getValue('salesprice')\n            });\n            return true;\n        });\n        \n        return results;\n    }\n    \n    return {\n        getProducts: getProducts\n    };\n});\n",[61,2592,2593,2598,2603,2614,2624,2629,2660,2664,2679,2697,2707,2712,2732,2737,2741,2752,2776,2785,2790,2803,2816,2829,2833,2842,2846,2850,2858,2862,2866,2872,2877,2882],{"__ignoreMap":63},[148,2594,2595],{"class":150,"line":151},[148,2596,2597],{"class":154},"\u002F\u002F SuiteScript 2.x syntax in extensions\n",[148,2599,2600],{"class":150,"line":158},[148,2601,2602],{"class":154},"\u002F**\n",[148,2604,2605,2608,2611],{"class":150,"line":182},[148,2606,2607],{"class":154}," * ",[148,2609,2610],{"class":161},"@NApiVersion",[148,2612,2613],{"class":154}," 2.1\n",[148,2615,2616,2618,2621],{"class":150,"line":194},[148,2617,2607],{"class":154},[148,2619,2620],{"class":161},"@NModuleScope",[148,2622,2623],{"class":154}," Public\n",[148,2625,2626],{"class":150,"line":207},[148,2627,2628],{"class":154}," *\u002F\n",[148,2630,2631,2633,2636,2639,2641,2644,2646,2648,2650,2653,2655,2658],{"class":150,"line":217},[148,2632,460],{"class":175},[148,2634,2635],{"class":165},"([",[148,2637,2638],{"class":200},"'N\u002Fsearch'",[148,2640,503],{"class":165},[148,2642,2643],{"class":200},"'N\u002Frecord'",[148,2645,493],{"class":165},[148,2647,229],{"class":161},[148,2649,226],{"class":165},[148,2651,2652],{"class":234},"search",[148,2654,503],{"class":165},[148,2656,2657],{"class":234},"record",[148,2659,238],{"class":165},[148,2661,2662],{"class":150,"line":241},[148,2663,526],{"class":165},[148,2665,2666,2669,2672,2674,2677],{"class":150,"line":247},[148,2667,2668],{"class":161},"    function",[148,2670,2671],{"class":175}," getProducts",[148,2673,226],{"class":165},[148,2675,2676],{"class":234},"filters",[148,2678,238],{"class":165},[148,2680,2681,2684,2687,2690,2693,2695],{"class":150,"line":266},[148,2682,2683],{"class":161},"        const",[148,2685,2686],{"class":213}," productSearch",[148,2688,2689],{"class":161}," =",[148,2691,2692],{"class":165}," search.",[148,2694,1498],{"class":175},[148,2696,191],{"class":165},[148,2698,2699,2702,2705],{"class":150,"line":272},[148,2700,2701],{"class":165},"            type: search.Type.",[148,2703,2704],{"class":213},"INVENTORY_ITEM",[148,2706,476],{"class":165},[148,2708,2709],{"class":150,"line":369},[148,2710,2711],{"class":165},"            filters: filters,\n",[148,2713,2714,2717,2720,2722,2725,2727,2730],{"class":150,"line":385},[148,2715,2716],{"class":165},"            columns: [",[148,2718,2719],{"class":200},"'itemid'",[148,2721,503],{"class":165},[148,2723,2724],{"class":200},"'displayname'",[148,2726,503],{"class":165},[148,2728,2729],{"class":200},"'salesprice'",[148,2731,1332],{"class":165},[148,2733,2734],{"class":150,"line":395},[148,2735,2736],{"class":165},"        });\n",[148,2738,2739],{"class":150,"line":401},[148,2740,560],{"class":165},[148,2742,2743,2745,2748,2750],{"class":150,"line":407},[148,2744,2683],{"class":161},[148,2746,2747],{"class":213}," results",[148,2749,2689],{"class":161},[148,2751,623],{"class":165},[148,2753,2754,2757,2760,2763,2766,2768,2770,2772,2774],{"class":150,"line":592},[148,2755,2756],{"class":165},"        productSearch.",[148,2758,2759],{"class":175},"run",[148,2761,2762],{"class":165},"().",[148,2764,2765],{"class":175},"each",[148,2767,226],{"class":165},[148,2769,229],{"class":161},[148,2771,226],{"class":165},[148,2773,2515],{"class":234},[148,2775,238],{"class":165},[148,2777,2778,2781,2783],{"class":150,"line":626},[148,2779,2780],{"class":165},"            results.",[148,2782,632],{"class":175},[148,2784,191],{"class":165},[148,2786,2787],{"class":150,"line":638},[148,2788,2789],{"class":165},"                id: result.id,\n",[148,2791,2792,2795,2797,2799,2801],{"class":150,"line":654},[148,2793,2794],{"class":165},"                sku: result.",[148,2796,2540],{"class":175},[148,2798,226],{"class":165},[148,2800,2719],{"class":200},[148,2802,555],{"class":165},[148,2804,2805,2808,2810,2812,2814],{"class":150,"line":659},[148,2806,2807],{"class":165},"                name: result.",[148,2809,2540],{"class":175},[148,2811,226],{"class":165},[148,2813,2724],{"class":200},[148,2815,555],{"class":165},[148,2817,2818,2821,2823,2825,2827],{"class":150,"line":665},[148,2819,2820],{"class":165},"                price: result.",[148,2822,2540],{"class":175},[148,2824,226],{"class":165},[148,2826,2729],{"class":200},[148,2828,908],{"class":165},[148,2830,2831],{"class":150,"line":860},[148,2832,940],{"class":165},[148,2834,2835,2837,2840],{"class":150,"line":873},[148,2836,641],{"class":161},[148,2838,2839],{"class":213}," true",[148,2841,521],{"class":165},[148,2843,2844],{"class":150,"line":893},[148,2845,2736],{"class":165},[148,2847,2848],{"class":150,"line":911},[148,2849,560],{"class":165},[148,2851,2852,2855],{"class":150,"line":926},[148,2853,2854],{"class":161},"        return",[148,2856,2857],{"class":165}," results;\n",[148,2859,2860],{"class":150,"line":937},[148,2861,404],{"class":165},[148,2863,2864],{"class":150,"line":943},[148,2865,526],{"class":165},[148,2867,2868,2870],{"class":150,"line":948},[148,2869,531],{"class":161},[148,2871,970],{"class":165},[148,2873,2874],{"class":150,"line":953},[148,2875,2876],{"class":165},"        getProducts: getProducts\n",[148,2878,2879],{"class":150,"line":965},[148,2880,2881],{"class":165},"    };\n",[148,2883,2884],{"class":150,"line":973},[148,2885,275],{"class":165},[49,2887,2889],{"id":2888},"governance-and-performance","Governance and Performance",[15,2891,2892],{},"Every SuiteScript operation consumes \"governance units.\" Exceed your limit, and the script fails. This is critical for performance.",[54,2894,2896],{"className":142,"code":2895,"language":144,"meta":63,"style":63},"\u002F\u002F Monitor governance usage\nvar remainingUsage = nlapiGetContext().getRemainingUsage();\n\nif (remainingUsage \u003C 100) {\n    \u002F\u002F Approaching limit - optimize or yield\n    nlapiLogExecution('WARNING', 'Low governance', remainingUsage);\n}\n\n\u002F\u002F Efficient pattern: batch operations\nvar records = nlapiSearchRecord('item', savedSearchId);\n\n\u002F\u002F BAD: Load each record individually (10 units each)\nrecords.forEach(function(result) {\n    var rec = nlapiLoadRecord('inventoryitem', result.getId()); \u002F\u002F 10 units\n});\n\n\u002F\u002F GOOD: Get data from search results (0-5 units total)\nvar data = records.map(function(result) {\n    return {\n        id: result.getId(),\n        name: result.getValue('displayname'),\n        price: result.getValue('price')\n    };\n});\n",[61,2897,2898,2903,2922,2926,2942,2947,2965,2969,2973,2978,2996,3000,3005,3023,3051,3055,3059,3064,3087,3093,3102,3115,3129,3133],{"__ignoreMap":63},[148,2899,2900],{"class":150,"line":151},[148,2901,2902],{"class":154},"\u002F\u002F Monitor governance usage\n",[148,2904,2905,2907,2910,2912,2915,2917,2920],{"class":150,"line":158},[148,2906,162],{"class":161},[148,2908,2909],{"class":165}," remainingUsage ",[148,2911,169],{"class":161},[148,2913,2914],{"class":175}," nlapiGetContext",[148,2916,2762],{"class":165},[148,2918,2919],{"class":175},"getRemainingUsage",[148,2921,179],{"class":165},[148,2923,2924],{"class":150,"line":182},[148,2925,307],{"emptyLinePlaceholder":306},[148,2927,2928,2931,2934,2937,2940],{"class":150,"line":194},[148,2929,2930],{"class":161},"if",[148,2932,2933],{"class":165}," (remainingUsage ",[148,2935,2936],{"class":161},"\u003C",[148,2938,2939],{"class":213}," 100",[148,2941,238],{"class":165},[148,2943,2944],{"class":150,"line":207},[148,2945,2946],{"class":154},"    \u002F\u002F Approaching limit - optimize or yield\n",[148,2948,2949,2952,2954,2957,2959,2962],{"class":150,"line":217},[148,2950,2951],{"class":175},"    nlapiLogExecution",[148,2953,226],{"class":165},[148,2955,2956],{"class":200},"'WARNING'",[148,2958,503],{"class":165},[148,2960,2961],{"class":200},"'Low governance'",[148,2963,2964],{"class":165},", remainingUsage);\n",[148,2966,2967],{"class":150,"line":241},[148,2968,410],{"class":165},[148,2970,2971],{"class":150,"line":247},[148,2972,307],{"emptyLinePlaceholder":306},[148,2974,2975],{"class":150,"line":266},[148,2976,2977],{"class":154},"\u002F\u002F Efficient pattern: batch operations\n",[148,2979,2980,2982,2985,2987,2989,2991,2993],{"class":150,"line":272},[148,2981,162],{"class":161},[148,2983,2984],{"class":165}," records ",[148,2986,169],{"class":161},[148,2988,2475],{"class":175},[148,2990,226],{"class":165},[148,2992,888],{"class":200},[148,2994,2995],{"class":165},", savedSearchId);\n",[148,2997,2998],{"class":150,"line":369},[148,2999,307],{"emptyLinePlaceholder":306},[148,3001,3002],{"class":150,"line":385},[148,3003,3004],{"class":154},"\u002F\u002F BAD: Load each record individually (10 units each)\n",[148,3006,3007,3010,3013,3015,3017,3019,3021],{"class":150,"line":395},[148,3008,3009],{"class":165},"records.",[148,3011,3012],{"class":175},"forEach",[148,3014,226],{"class":165},[148,3016,229],{"class":161},[148,3018,226],{"class":165},[148,3020,2515],{"class":234},[148,3022,238],{"class":165},[148,3024,3025,3028,3031,3033,3035,3037,3040,3043,3045,3048],{"class":150,"line":401},[148,3026,3027],{"class":161},"    var",[148,3029,3030],{"class":165}," rec ",[148,3032,169],{"class":161},[148,3034,2234],{"class":175},[148,3036,226],{"class":165},[148,3038,3039],{"class":200},"'inventoryitem'",[148,3041,3042],{"class":165},", result.",[148,3044,2260],{"class":175},[148,3046,3047],{"class":165},"()); ",[148,3049,3050],{"class":154},"\u002F\u002F 10 units\n",[148,3052,3053],{"class":150,"line":407},[148,3054,275],{"class":165},[148,3056,3057],{"class":150,"line":592},[148,3058,307],{"emptyLinePlaceholder":306},[148,3060,3061],{"class":150,"line":626},[148,3062,3063],{"class":154},"\u002F\u002F GOOD: Get data from search results (0-5 units total)\n",[148,3065,3066,3068,3070,3072,3075,3077,3079,3081,3083,3085],{"class":150,"line":638},[148,3067,162],{"class":161},[148,3069,1482],{"class":165},[148,3071,169],{"class":161},[148,3073,3074],{"class":165}," records.",[148,3076,2500],{"class":175},[148,3078,226],{"class":165},[148,3080,229],{"class":161},[148,3082,226],{"class":165},[148,3084,2515],{"class":234},[148,3086,238],{"class":165},[148,3088,3089,3091],{"class":150,"line":654},[148,3090,531],{"class":161},[148,3092,970],{"class":165},[148,3094,3095,3098,3100],{"class":150,"line":659},[148,3096,3097],{"class":165},"        id: result.",[148,3099,2260],{"class":175},[148,3101,2263],{"class":165},[148,3103,3104,3107,3109,3111,3113],{"class":150,"line":665},[148,3105,3106],{"class":165},"        name: result.",[148,3108,2540],{"class":175},[148,3110,226],{"class":165},[148,3112,2724],{"class":200},[148,3114,555],{"class":165},[148,3116,3117,3120,3122,3124,3127],{"class":150,"line":860},[148,3118,3119],{"class":165},"        price: result.",[148,3121,2540],{"class":175},[148,3123,226],{"class":165},[148,3125,3126],{"class":200},"'price'",[148,3128,908],{"class":165},[148,3130,3131],{"class":150,"line":873},[148,3132,2881],{"class":165},[148,3134,3135],{"class":150,"line":893},[148,3136,275],{"class":165},[97,3138],{},[34,3140,3142],{"id":3141},"the-extensibility-api","The Extensibility API",[15,3144,3145],{},"Oracle introduced the Extensibility API to allow customization without modifying core code. This is the recommended approach for all new development.",[49,3147,3149],{"id":3148},"architecture-of-extensions","Architecture of Extensions",[15,3151,3152],{},"Extensions are self-contained modules that hook into SuiteCommerce's event system:",[54,3154,3156],{"className":142,"code":3155,"language":144,"meta":63,"style":63},"\u002F\u002F modules\u002FMyExtension\u002FJavaScript\u002FMyExtension.js\ndefine('MyExtension', [\n    'MyExtension.View',\n    'ProductDetails.Full.View'\n], function(MyExtensionView, ProductDetailsView) {\n    'use strict';\n    \n    return {\n        mountToApp: function(container) {\n            \u002F\u002F Add child view to product page\n            ProductDetailsView.prototype.childViews = _.extend(\n                ProductDetailsView.prototype.childViews || {},\n                {\n                    'MyExtension.Placeholder': function() {\n                        return new MyExtensionView({\n                            model: this.model\n                        });\n                    }\n                }\n            );\n        }\n    };\n});\n",[61,3157,3158,3163,3174,3181,3186,3204,3210,3214,3220,3236,3241,3263,3279,3284,3295,3307,3317,3322,3327,3331,3336,3340,3344],{"__ignoreMap":63},[148,3159,3160],{"class":150,"line":151},[148,3161,3162],{"class":154},"\u002F\u002F modules\u002FMyExtension\u002FJavaScript\u002FMyExtension.js\n",[148,3164,3165,3167,3169,3172],{"class":150,"line":158},[148,3166,460],{"class":175},[148,3168,226],{"class":165},[148,3170,3171],{"class":200},"'MyExtension'",[148,3173,468],{"class":165},[148,3175,3176,3179],{"class":150,"line":182},[148,3177,3178],{"class":200},"    'MyExtension.View'",[148,3180,476],{"class":165},[148,3182,3183],{"class":150,"line":194},[148,3184,3185],{"class":200},"    'ProductDetails.Full.View'\n",[148,3187,3188,3190,3192,3194,3197,3199,3202],{"class":150,"line":207},[148,3189,493],{"class":165},[148,3191,229],{"class":161},[148,3193,226],{"class":165},[148,3195,3196],{"class":234},"MyExtensionView",[148,3198,503],{"class":165},[148,3200,3201],{"class":234},"ProductDetailsView",[148,3203,238],{"class":165},[148,3205,3206,3208],{"class":150,"line":217},[148,3207,518],{"class":200},[148,3209,521],{"class":165},[148,3211,3212],{"class":150,"line":241},[148,3213,526],{"class":165},[148,3215,3216,3218],{"class":150,"line":247},[148,3217,531],{"class":161},[148,3219,970],{"class":165},[148,3221,3222,3225,3227,3229,3231,3234],{"class":150,"line":266},[148,3223,3224],{"class":175},"        mountToApp",[148,3226,335],{"class":165},[148,3228,229],{"class":161},[148,3230,226],{"class":165},[148,3232,3233],{"class":234},"container",[148,3235,238],{"class":165},[148,3237,3238],{"class":150,"line":272},[148,3239,3240],{"class":154},"            \u002F\u002F Add child view to product page\n",[148,3242,3243,3246,3248,3251,3254,3256,3258,3260],{"class":150,"line":369},[148,3244,3245],{"class":213},"            ProductDetailsView",[148,3247,606],{"class":165},[148,3249,3250],{"class":213},"prototype",[148,3252,3253],{"class":165},".childViews ",[148,3255,169],{"class":161},[148,3257,2497],{"class":165},[148,3259,537],{"class":175},[148,3261,3262],{"class":165},"(\n",[148,3264,3265,3268,3270,3272,3274,3276],{"class":150,"line":385},[148,3266,3267],{"class":213},"                ProductDetailsView",[148,3269,606],{"class":165},[148,3271,3250],{"class":213},[148,3273,3253],{"class":165},[148,3275,620],{"class":161},[148,3277,3278],{"class":165}," {},\n",[148,3280,3281],{"class":150,"line":395},[148,3282,3283],{"class":165},"                {\n",[148,3285,3286,3289,3291,3293],{"class":150,"line":401},[148,3287,3288],{"class":200},"                    'MyExtension.Placeholder'",[148,3290,335],{"class":165},[148,3292,229],{"class":161},[148,3294,923],{"class":165},[148,3296,3297,3300,3302,3305],{"class":150,"line":407},[148,3298,3299],{"class":161},"                        return",[148,3301,172],{"class":161},[148,3303,3304],{"class":175}," MyExtensionView",[148,3306,191],{"class":165},[148,3308,3309,3312,3314],{"class":150,"line":592},[148,3310,3311],{"class":165},"                            model: ",[148,3313,879],{"class":213},[148,3315,3316],{"class":165},".model\n",[148,3318,3319],{"class":150,"line":626},[148,3320,3321],{"class":165},"                        });\n",[148,3323,3324],{"class":150,"line":638},[148,3325,3326],{"class":165},"                    }\n",[148,3328,3329],{"class":150,"line":654},[148,3330,1337],{"class":165},[148,3332,3333],{"class":150,"line":659},[148,3334,3335],{"class":165},"            );\n",[148,3337,3338],{"class":150,"line":665},[148,3339,398],{"class":165},[148,3341,3342],{"class":150,"line":860},[148,3343,2881],{"class":165},[148,3345,3346],{"class":150,"line":873},[148,3347,275],{"class":165},[49,3349,3351],{"id":3350},"frontend-extensibility","Frontend Extensibility",[15,3353,3354],{},"The frontend API provides hooks without modifying core views:",[54,3356,3358],{"className":142,"code":3357,"language":144,"meta":63,"style":63},"\u002F\u002F Using component-based extensibility\ndefine('MyExtension.Entry', [\n    'SC.ComponentContainer'\n], function(ComponentContainer) {\n    'use strict';\n    \n    return {\n        mountToApp: function(application) {\n            var PDP = ComponentContainer.getComponent('PDP');\n            \n            \u002F\u002F Listen for events\n            PDP.on('afterShowContent', function(view) {\n                console.log('Product page rendered:', view.model.get('itemid'));\n            });\n            \n            \u002F\u002F Modify data before render\n            PDP.on('beforeShowContent', function(view) {\n                var item = view.model;\n                item.set('customField', 'Custom Value');\n            });\n        }\n    };\n});\n",[61,3359,3360,3365,3376,3381,3394,3400,3404,3410,3425,3447,3451,3456,3482,3507,3511,3515,3520,3543,3556,3576,3580,3584,3588],{"__ignoreMap":63},[148,3361,3362],{"class":150,"line":151},[148,3363,3364],{"class":154},"\u002F\u002F Using component-based extensibility\n",[148,3366,3367,3369,3371,3374],{"class":150,"line":158},[148,3368,460],{"class":175},[148,3370,226],{"class":165},[148,3372,3373],{"class":200},"'MyExtension.Entry'",[148,3375,468],{"class":165},[148,3377,3378],{"class":150,"line":182},[148,3379,3380],{"class":200},"    'SC.ComponentContainer'\n",[148,3382,3383,3385,3387,3389,3392],{"class":150,"line":194},[148,3384,493],{"class":165},[148,3386,229],{"class":161},[148,3388,226],{"class":165},[148,3390,3391],{"class":234},"ComponentContainer",[148,3393,238],{"class":165},[148,3395,3396,3398],{"class":150,"line":207},[148,3397,518],{"class":200},[148,3399,521],{"class":165},[148,3401,3402],{"class":150,"line":217},[148,3403,526],{"class":165},[148,3405,3406,3408],{"class":150,"line":241},[148,3407,531],{"class":161},[148,3409,970],{"class":165},[148,3411,3412,3414,3416,3418,3420,3423],{"class":150,"line":247},[148,3413,3224],{"class":175},[148,3415,335],{"class":165},[148,3417,229],{"class":161},[148,3419,226],{"class":165},[148,3421,3422],{"class":234},"application",[148,3424,238],{"class":165},[148,3426,3427,3429,3432,3434,3437,3440,3442,3445],{"class":150,"line":266},[148,3428,595],{"class":161},[148,3430,3431],{"class":213}," PDP",[148,3433,2689],{"class":161},[148,3435,3436],{"class":165}," ComponentContainer.",[148,3438,3439],{"class":175},"getComponent",[148,3441,226],{"class":165},[148,3443,3444],{"class":200},"'PDP'",[148,3446,1391],{"class":165},[148,3448,3449],{"class":150,"line":272},[148,3450,806],{"class":165},[148,3452,3453],{"class":150,"line":369},[148,3454,3455],{"class":154},"            \u002F\u002F Listen for events\n",[148,3457,3458,3461,3463,3466,3468,3471,3473,3475,3477,3480],{"class":150,"line":385},[148,3459,3460],{"class":213},"            PDP",[148,3462,606],{"class":165},[148,3464,3465],{"class":175},"on",[148,3467,226],{"class":165},[148,3469,3470],{"class":200},"'afterShowContent'",[148,3472,503],{"class":165},[148,3474,229],{"class":161},[148,3476,226],{"class":165},[148,3478,3479],{"class":234},"view",[148,3481,238],{"class":165},[148,3483,3484,3487,3490,3492,3495,3498,3500,3502,3504],{"class":150,"line":395},[148,3485,3486],{"class":165},"                console.",[148,3488,3489],{"class":175},"log",[148,3491,226],{"class":165},[148,3493,3494],{"class":200},"'Product page rendered:'",[148,3496,3497],{"class":165},", view.model.",[148,3499,609],{"class":175},[148,3501,226],{"class":165},[148,3503,2719],{"class":200},[148,3505,3506],{"class":165},"));\n",[148,3508,3509],{"class":150,"line":401},[148,3510,940],{"class":165},[148,3512,3513],{"class":150,"line":407},[148,3514,806],{"class":165},[148,3516,3517],{"class":150,"line":592},[148,3518,3519],{"class":154},"            \u002F\u002F Modify data before render\n",[148,3521,3522,3524,3526,3528,3530,3533,3535,3537,3539,3541],{"class":150,"line":626},[148,3523,3460],{"class":213},[148,3525,606],{"class":165},[148,3527,3465],{"class":175},[148,3529,226],{"class":165},[148,3531,3532],{"class":200},"'beforeShowContent'",[148,3534,503],{"class":165},[148,3536,229],{"class":161},[148,3538,226],{"class":165},[148,3540,3479],{"class":234},[148,3542,238],{"class":165},[148,3544,3545,3548,3551,3553],{"class":150,"line":638},[148,3546,3547],{"class":161},"                var",[148,3549,3550],{"class":165}," item ",[148,3552,169],{"class":161},[148,3554,3555],{"class":165}," view.model;\n",[148,3557,3558,3561,3564,3566,3569,3571,3574],{"class":150,"line":654},[148,3559,3560],{"class":165},"                item.",[148,3562,3563],{"class":175},"set",[148,3565,226],{"class":165},[148,3567,3568],{"class":200},"'customField'",[148,3570,503],{"class":165},[148,3572,3573],{"class":200},"'Custom Value'",[148,3575,1391],{"class":165},[148,3577,3578],{"class":150,"line":659},[148,3579,940],{"class":165},[148,3581,3582],{"class":150,"line":665},[148,3583,398],{"class":165},[148,3585,3586],{"class":150,"line":860},[148,3587,2881],{"class":165},[148,3589,3590],{"class":150,"line":873},[148,3591,275],{"class":165},[49,3593,3595],{"id":3594},"backend-extensibility","Backend Extensibility",[15,3597,3598],{},"Service controllers can be extended or replaced:",[54,3600,3602],{"className":142,"code":3601,"language":144,"meta":63,"style":63},"\u002F\u002F Extend existing service controller\ndefine('ProductList.ServiceController.Ext', [\n    'ProductList.ServiceController'\n], function(ProductListServiceController) {\n    'use strict';\n    \n    return ProductListServiceController.extend({\n        \u002F\u002F Override GET to add custom logic\n        get: function() {\n            \u002F\u002F Call parent method\n            var result = ProductListServiceController.prototype.get.apply(this, arguments);\n            \n            \u002F\u002F Add custom processing\n            result.customField = 'Added by extension';\n            \n            return result;\n        }\n    });\n});\n",[61,3603,3604,3609,3620,3625,3638,3644,3648,3659,3664,3674,3679,3712,3716,3721,3733,3737,3744,3748,3752],{"__ignoreMap":63},[148,3605,3606],{"class":150,"line":151},[148,3607,3608],{"class":154},"\u002F\u002F Extend existing service controller\n",[148,3610,3611,3613,3615,3618],{"class":150,"line":158},[148,3612,460],{"class":175},[148,3614,226],{"class":165},[148,3616,3617],{"class":200},"'ProductList.ServiceController.Ext'",[148,3619,468],{"class":165},[148,3621,3622],{"class":150,"line":182},[148,3623,3624],{"class":200},"    'ProductList.ServiceController'\n",[148,3626,3627,3629,3631,3633,3636],{"class":150,"line":194},[148,3628,493],{"class":165},[148,3630,229],{"class":161},[148,3632,226],{"class":165},[148,3634,3635],{"class":234},"ProductListServiceController",[148,3637,238],{"class":165},[148,3639,3640,3642],{"class":150,"line":207},[148,3641,518],{"class":200},[148,3643,521],{"class":165},[148,3645,3646],{"class":150,"line":217},[148,3647,526],{"class":165},[148,3649,3650,3652,3655,3657],{"class":150,"line":241},[148,3651,531],{"class":161},[148,3653,3654],{"class":165}," ProductListServiceController.",[148,3656,537],{"class":175},[148,3658,191],{"class":165},[148,3660,3661],{"class":150,"line":247},[148,3662,3663],{"class":154},"        \u002F\u002F Override GET to add custom logic\n",[148,3665,3666,3668,3670,3672],{"class":150,"line":266},[148,3667,1360],{"class":175},[148,3669,335],{"class":165},[148,3671,229],{"class":161},[148,3673,923],{"class":165},[148,3675,3676],{"class":150,"line":272},[148,3677,3678],{"class":154},"            \u002F\u002F Call parent method\n",[148,3680,3681,3683,3686,3688,3691,3693,3695,3698,3701,3703,3705,3707,3710],{"class":150,"line":369},[148,3682,595],{"class":161},[148,3684,3685],{"class":165}," result ",[148,3687,169],{"class":161},[148,3689,3690],{"class":213}," ProductListServiceController",[148,3692,606],{"class":165},[148,3694,3250],{"class":213},[148,3696,3697],{"class":165},".get.",[148,3699,3700],{"class":175},"apply",[148,3702,226],{"class":165},[148,3704,879],{"class":213},[148,3706,503],{"class":165},[148,3708,3709],{"class":213},"arguments",[148,3711,1391],{"class":165},[148,3713,3714],{"class":150,"line":385},[148,3715,806],{"class":165},[148,3717,3718],{"class":150,"line":395},[148,3719,3720],{"class":154},"            \u002F\u002F Add custom processing\n",[148,3722,3723,3726,3728,3731],{"class":150,"line":401},[148,3724,3725],{"class":165},"            result.customField ",[148,3727,169],{"class":161},[148,3729,3730],{"class":200}," 'Added by extension'",[148,3732,521],{"class":165},[148,3734,3735],{"class":150,"line":407},[148,3736,806],{"class":165},[148,3738,3739,3741],{"class":150,"line":592},[148,3740,641],{"class":161},[148,3742,3743],{"class":165}," result;\n",[148,3745,3746],{"class":150,"line":626},[148,3747,398],{"class":165},[148,3749,3750],{"class":150,"line":638},[148,3751,662],{"class":165},[148,3753,3754],{"class":150,"line":654},[148,3755,275],{"class":165},[97,3757],{},[34,3759,3761],{"id":3760},"api-endpoints-and-integration-points","API Endpoints and Integration Points",[15,3763,3764],{},"Understanding available APIs helps you build integrations correctly.",[49,3766,3768],{"id":3767},"core-commerce-apis","Core Commerce APIs",[15,3770,3771,3774],{},[74,3772,3773],{},"Item API",": Product data and search",[54,3776,3779],{"className":3777,"code":3778,"language":59},[57],"GET \u002Fapi\u002Fitems?fieldset=search&limit=20&offset=0\nGET \u002Fapi\u002Fitems\u002F12345?fieldset=details\n",[61,3780,3778],{"__ignoreMap":63},[15,3782,3783,3786],{},[74,3784,3785],{},"Cart API",": Shopping cart operations",[54,3788,3791],{"className":3789,"code":3790,"language":59},[57],"GET \u002Fservices\u002FLiveOrder.Service.ss\nPOST \u002Fservices\u002FLiveOrder.Service.ss\nPUT \u002Fservices\u002FLiveOrder.Service.ss?internalid=123\n",[61,3792,3790],{"__ignoreMap":63},[15,3794,3795,3798],{},[74,3796,3797],{},"Order API",": Order history and details",[54,3800,3803],{"className":3801,"code":3802,"language":59},[57],"GET \u002Fservices\u002FOrderHistory.Service.ss\nGET \u002Fservices\u002FOrderHistory.Service.ss?internalid=456\n",[61,3804,3802],{"__ignoreMap":63},[15,3806,3807,3810],{},[74,3808,3809],{},"Customer API",": Account and address management",[54,3812,3815],{"className":3813,"code":3814,"language":59},[57],"GET \u002Fservices\u002FAccount.Service.ss\nPUT \u002Fservices\u002FAddress.Service.ss\n",[61,3816,3814],{"__ignoreMap":63},[49,3818,3820],{"id":3819},"custom-service-endpoints","Custom Service Endpoints",[15,3822,3823],{},"Create your own endpoints for custom functionality:",[54,3825,3827],{"className":142,"code":3826,"language":144,"meta":63,"style":63},"\u002F\u002F Register custom service in distro.json\n{\n    \"modules\": {\n        \"MyCustom.Service\": \"1.0.0\"\n    },\n    \"ssp-libraries\": {\n        \"dependencies\": [\"MyCustom.ServiceController\"]\n    }\n}\n\n\u002F\u002F Service available at:\n\u002F\u002F \u002Fservices\u002FMyCustom.Service.ss\n",[61,3828,3829,3834,3838,3845,3855,3859,3866,3878,3882,3886,3890,3895],{"__ignoreMap":63},[148,3830,3831],{"class":150,"line":151},[148,3832,3833],{"class":154},"\u002F\u002F Register custom service in distro.json\n",[148,3835,3836],{"class":150,"line":158},[148,3837,312],{"class":165},[148,3839,3840,3843],{"class":150,"line":182},[148,3841,3842],{"class":200},"    \"modules\"",[148,3844,320],{"class":165},[148,3846,3847,3850,3852],{"class":150,"line":194},[148,3848,3849],{"class":200},"        \"MyCustom.Service\"",[148,3851,335],{"class":165},[148,3853,3854],{"class":200},"\"1.0.0\"\n",[148,3856,3857],{"class":150,"line":207},[148,3858,1802],{"class":165},[148,3860,3861,3864],{"class":150,"line":217},[148,3862,3863],{"class":200},"    \"ssp-libraries\"",[148,3865,320],{"class":165},[148,3867,3868,3871,3873,3876],{"class":150,"line":241},[148,3869,3870],{"class":200},"        \"dependencies\"",[148,3872,1788],{"class":165},[148,3874,3875],{"class":200},"\"MyCustom.ServiceController\"",[148,3877,1332],{"class":165},[148,3879,3880],{"class":150,"line":247},[148,3881,404],{"class":165},[148,3883,3884],{"class":150,"line":266},[148,3885,410],{"class":165},[148,3887,3888],{"class":150,"line":272},[148,3889,307],{"emptyLinePlaceholder":306},[148,3891,3892],{"class":150,"line":369},[148,3893,3894],{"class":154},"\u002F\u002F Service available at:\n",[148,3896,3897],{"class":150,"line":385},[148,3898,3899],{"class":154},"\u002F\u002F \u002Fservices\u002FMyCustom.Service.ss\n",[49,3901,3903],{"id":3902},"third-party-integration-patterns","Third-Party Integration Patterns",[15,3905,3906],{},"For external system integration, use backend models as the integration layer:",[54,3908,3910],{"className":142,"code":3909,"language":144,"meta":63,"style":63},"\u002F\u002F Backend model calling external API\ndefine('ExternalService.Model', [\n    'SC.Model',\n    'https'\n], function(SCModel) {\n    'use strict';\n    \n    return SCModel.extend({\n        name: 'ExternalService',\n        \n        fetch: function(params) {\n            var response = nlapiRequestURL(\n                'https:\u002F\u002Fapi.external-service.com\u002Fdata',\n                null,\n                {\n                    'Authorization': 'Bearer ' + this.getApiKey(),\n                    'Content-Type': 'application\u002Fjson'\n                }\n            );\n            \n            return JSON.parse(response.getBody());\n        },\n        \n        getApiKey: function() {\n            \u002F\u002F Store credentials in NetSuite custom record\n            var config = nlapiLoadConfiguration('companyinformation');\n            return config.getFieldValue('custrecord_api_key');\n        }\n    });\n});\n",[61,3911,3912,3917,3928,3934,3939,3951,3957,3961,3971,3980,3984,4000,4014,4021,4028,4032,4054,4064,4068,4072,4076,4097,4101,4105,4116,4121,4140,4156,4160,4164],{"__ignoreMap":63},[148,3913,3914],{"class":150,"line":151},[148,3915,3916],{"class":154},"\u002F\u002F Backend model calling external API\n",[148,3918,3919,3921,3923,3926],{"class":150,"line":158},[148,3920,460],{"class":175},[148,3922,226],{"class":165},[148,3924,3925],{"class":200},"'ExternalService.Model'",[148,3927,468],{"class":165},[148,3929,3930,3932],{"class":150,"line":182},[148,3931,2146],{"class":200},[148,3933,476],{"class":165},[148,3935,3936],{"class":150,"line":194},[148,3937,3938],{"class":200},"    'https'\n",[148,3940,3941,3943,3945,3947,3949],{"class":150,"line":207},[148,3942,493],{"class":165},[148,3944,229],{"class":161},[148,3946,226],{"class":165},[148,3948,1922],{"class":234},[148,3950,238],{"class":165},[148,3952,3953,3955],{"class":150,"line":217},[148,3954,518],{"class":200},[148,3956,521],{"class":165},[148,3958,3959],{"class":150,"line":241},[148,3960,526],{"class":165},[148,3962,3963,3965,3967,3969],{"class":150,"line":247},[148,3964,531],{"class":161},[148,3966,1941],{"class":165},[148,3968,537],{"class":175},[148,3970,191],{"class":165},[148,3972,3973,3975,3978],{"class":150,"line":266},[148,3974,1283],{"class":165},[148,3976,3977],{"class":200},"'ExternalService'",[148,3979,476],{"class":165},[148,3981,3982],{"class":150,"line":272},[148,3983,560],{"class":165},[148,3985,3986,3989,3991,3993,3995,3998],{"class":150,"line":369},[148,3987,3988],{"class":175},"        fetch",[148,3990,335],{"class":165},[148,3992,229],{"class":161},[148,3994,226],{"class":165},[148,3996,3997],{"class":234},"params",[148,3999,238],{"class":165},[148,4001,4002,4004,4007,4009,4012],{"class":150,"line":385},[148,4003,595],{"class":161},[148,4005,4006],{"class":165}," response ",[148,4008,169],{"class":161},[148,4010,4011],{"class":175}," nlapiRequestURL",[148,4013,3262],{"class":165},[148,4015,4016,4019],{"class":150,"line":395},[148,4017,4018],{"class":200},"                'https:\u002F\u002Fapi.external-service.com\u002Fdata'",[148,4020,476],{"class":165},[148,4022,4023,4026],{"class":150,"line":401},[148,4024,4025],{"class":213},"                null",[148,4027,476],{"class":165},[148,4029,4030],{"class":150,"line":407},[148,4031,3283],{"class":165},[148,4033,4034,4037,4039,4042,4045,4047,4049,4052],{"class":150,"line":592},[148,4035,4036],{"class":200},"                    'Authorization'",[148,4038,335],{"class":165},[148,4040,4041],{"class":200},"'Bearer '",[148,4043,4044],{"class":161}," +",[148,4046,603],{"class":213},[148,4048,606],{"class":165},[148,4050,4051],{"class":175},"getApiKey",[148,4053,2263],{"class":165},[148,4055,4056,4059,4061],{"class":150,"line":626},[148,4057,4058],{"class":200},"                    'Content-Type'",[148,4060,335],{"class":165},[148,4062,4063],{"class":200},"'application\u002Fjson'\n",[148,4065,4066],{"class":150,"line":638},[148,4067,1337],{"class":165},[148,4069,4070],{"class":150,"line":654},[148,4071,3335],{"class":165},[148,4073,4074],{"class":150,"line":659},[148,4075,806],{"class":165},[148,4077,4078,4080,4083,4085,4088,4091,4094],{"class":150,"line":665},[148,4079,641],{"class":161},[148,4081,4082],{"class":213}," JSON",[148,4084,606],{"class":165},[148,4086,4087],{"class":175},"parse",[148,4089,4090],{"class":165},"(response.",[148,4092,4093],{"class":175},"getBody",[148,4095,4096],{"class":165},"());\n",[148,4098,4099],{"class":150,"line":860},[148,4100,359],{"class":165},[148,4102,4103],{"class":150,"line":873},[148,4104,560],{"class":165},[148,4106,4107,4110,4112,4114],{"class":150,"line":893},[148,4108,4109],{"class":175},"        getApiKey",[148,4111,335],{"class":165},[148,4113,229],{"class":161},[148,4115,923],{"class":165},[148,4117,4118],{"class":150,"line":911},[148,4119,4120],{"class":154},"            \u002F\u002F Store credentials in NetSuite custom record\n",[148,4122,4123,4125,4128,4130,4133,4135,4138],{"class":150,"line":926},[148,4124,595],{"class":161},[148,4126,4127],{"class":165}," config ",[148,4129,169],{"class":161},[148,4131,4132],{"class":175}," nlapiLoadConfiguration",[148,4134,226],{"class":165},[148,4136,4137],{"class":200},"'companyinformation'",[148,4139,1391],{"class":165},[148,4141,4142,4144,4147,4149,4151,4154],{"class":150,"line":937},[148,4143,641],{"class":161},[148,4145,4146],{"class":165}," config.",[148,4148,2271],{"class":175},[148,4150,226],{"class":165},[148,4152,4153],{"class":200},"'custrecord_api_key'",[148,4155,1391],{"class":165},[148,4157,4158],{"class":150,"line":943},[148,4159,398],{"class":165},[148,4161,4162],{"class":150,"line":948},[148,4163,662],{"class":165},[148,4165,4166],{"class":150,"line":953},[148,4167,275],{"class":165},[97,4169],{},[34,4171,4173],{"id":4172},"performance-optimization-at-the-architecture-level","Performance Optimization at the Architecture Level",[15,4175,4176],{},"Understanding architecture reveals optimization opportunities most developers miss.",[49,4178,4180],{"id":4179},"_1-reduce-round-trips","1. Reduce Round Trips",[15,4182,4183],{},"Each frontend→backend request adds latency. Batch operations where possible:",[54,4185,4187],{"className":142,"code":4186,"language":144,"meta":63,"style":63},"\u002F\u002F BAD: Multiple requests\nmodel.fetch('product').done(function() {\n    model.fetch('reviews').done(function() {\n        model.fetch('inventory');\n    });\n});\n\n\u002F\u002F GOOD: Single request with expanded fieldset\nmodel.fetch({\n    data: {\n        fieldset: 'details',\n        include: 'reviews,inventory'\n    }\n});\n",[61,4188,4189,4194,4217,4239,4253,4257,4261,4265,4270,4278,4283,4293,4301,4305],{"__ignoreMap":63},[148,4190,4191],{"class":150,"line":151},[148,4192,4193],{"class":154},"\u002F\u002F BAD: Multiple requests\n",[148,4195,4196,4199,4202,4204,4207,4209,4211,4213,4215],{"class":150,"line":158},[148,4197,4198],{"class":165},"model.",[148,4200,4201],{"class":175},"fetch",[148,4203,226],{"class":165},[148,4205,4206],{"class":200},"'product'",[148,4208,843],{"class":165},[148,4210,223],{"class":175},[148,4212,226],{"class":165},[148,4214,229],{"class":161},[148,4216,923],{"class":165},[148,4218,4219,4222,4224,4226,4229,4231,4233,4235,4237],{"class":150,"line":182},[148,4220,4221],{"class":165},"    model.",[148,4223,4201],{"class":175},[148,4225,226],{"class":165},[148,4227,4228],{"class":200},"'reviews'",[148,4230,843],{"class":165},[148,4232,223],{"class":175},[148,4234,226],{"class":165},[148,4236,229],{"class":161},[148,4238,923],{"class":165},[148,4240,4241,4244,4246,4248,4251],{"class":150,"line":194},[148,4242,4243],{"class":165},"        model.",[148,4245,4201],{"class":175},[148,4247,226],{"class":165},[148,4249,4250],{"class":200},"'inventory'",[148,4252,1391],{"class":165},[148,4254,4255],{"class":150,"line":207},[148,4256,662],{"class":165},[148,4258,4259],{"class":150,"line":217},[148,4260,275],{"class":165},[148,4262,4263],{"class":150,"line":241},[148,4264,307],{"emptyLinePlaceholder":306},[148,4266,4267],{"class":150,"line":247},[148,4268,4269],{"class":154},"\u002F\u002F GOOD: Single request with expanded fieldset\n",[148,4271,4272,4274,4276],{"class":150,"line":266},[148,4273,4198],{"class":165},[148,4275,4201],{"class":175},[148,4277,191],{"class":165},[148,4279,4280],{"class":150,"line":272},[148,4281,4282],{"class":165},"    data: {\n",[148,4284,4285,4288,4291],{"class":150,"line":369},[148,4286,4287],{"class":165},"        fieldset: ",[148,4289,4290],{"class":200},"'details'",[148,4292,476],{"class":165},[148,4294,4295,4298],{"class":150,"line":385},[148,4296,4297],{"class":165},"        include: ",[148,4299,4300],{"class":200},"'reviews,inventory'\n",[148,4302,4303],{"class":150,"line":395},[148,4304,404],{"class":165},[148,4306,4307],{"class":150,"line":401},[148,4308,275],{"class":165},[49,4310,4312],{"id":4311},"_2-strategic-caching","2. Strategic Caching",[15,4314,4315],{},"Cache at multiple layers:",[54,4317,4319],{"className":142,"code":4318,"language":144,"meta":63,"style":63},"\u002F\u002F CDN Layer: Cache static assets aggressively\n\u002F\u002F Application Layer: Cache API responses\n\ndefine('CachedData.Model', [], function() {\n    var cache = {};\n    \n    return {\n        get: function(key, fetcher, ttl) {\n            var cached = cache[key];\n            var now = Date.now();\n            \n            if (cached && (now - cached.timestamp) \u003C ttl) {\n                return cached.data;\n            }\n            \n            var data = fetcher();\n            cache[key] = {\n                data: data,\n                timestamp: now\n            };\n            \n            return data;\n        }\n    };\n});\n",[61,4320,4321,4326,4331,4335,4351,4363,4367,4373,4398,4410,4427,4431,4455,4462,4466,4470,4483,4492,4497,4502,4506,4510,4517,4521,4525],{"__ignoreMap":63},[148,4322,4323],{"class":150,"line":151},[148,4324,4325],{"class":154},"\u002F\u002F CDN Layer: Cache static assets aggressively\n",[148,4327,4328],{"class":150,"line":158},[148,4329,4330],{"class":154},"\u002F\u002F Application Layer: Cache API responses\n",[148,4332,4333],{"class":150,"line":182},[148,4334,307],{"emptyLinePlaceholder":306},[148,4336,4337,4339,4341,4344,4347,4349],{"class":150,"line":194},[148,4338,460],{"class":175},[148,4340,226],{"class":165},[148,4342,4343],{"class":200},"'CachedData.Model'",[148,4345,4346],{"class":165},", [], ",[148,4348,229],{"class":161},[148,4350,923],{"class":165},[148,4352,4353,4355,4358,4360],{"class":150,"line":207},[148,4354,3027],{"class":161},[148,4356,4357],{"class":165}," cache ",[148,4359,169],{"class":161},[148,4361,4362],{"class":165}," {};\n",[148,4364,4365],{"class":150,"line":217},[148,4366,526],{"class":165},[148,4368,4369,4371],{"class":150,"line":241},[148,4370,531],{"class":161},[148,4372,970],{"class":165},[148,4374,4375,4377,4379,4381,4383,4386,4388,4391,4393,4396],{"class":150,"line":247},[148,4376,1360],{"class":175},[148,4378,335],{"class":165},[148,4380,229],{"class":161},[148,4382,226],{"class":165},[148,4384,4385],{"class":234},"key",[148,4387,503],{"class":165},[148,4389,4390],{"class":234},"fetcher",[148,4392,503],{"class":165},[148,4394,4395],{"class":234},"ttl",[148,4397,238],{"class":165},[148,4399,4400,4402,4405,4407],{"class":150,"line":266},[148,4401,595],{"class":161},[148,4403,4404],{"class":165}," cached ",[148,4406,169],{"class":161},[148,4408,4409],{"class":165}," cache[key];\n",[148,4411,4412,4414,4417,4419,4422,4425],{"class":150,"line":272},[148,4413,595],{"class":161},[148,4415,4416],{"class":165}," now ",[148,4418,169],{"class":161},[148,4420,4421],{"class":165}," Date.",[148,4423,4424],{"class":175},"now",[148,4426,179],{"class":165},[148,4428,4429],{"class":150,"line":369},[148,4430,806],{"class":165},[148,4432,4433,4435,4438,4441,4444,4447,4450,4452],{"class":150,"line":385},[148,4434,1400],{"class":161},[148,4436,4437],{"class":165}," (cached ",[148,4439,4440],{"class":161},"&&",[148,4442,4443],{"class":165}," (now ",[148,4445,4446],{"class":161},"-",[148,4448,4449],{"class":165}," cached.timestamp) ",[148,4451,2936],{"class":161},[148,4453,4454],{"class":165}," ttl) {\n",[148,4456,4457,4459],{"class":150,"line":395},[148,4458,1413],{"class":161},[148,4460,4461],{"class":165}," cached.data;\n",[148,4463,4464],{"class":150,"line":401},[148,4465,1342],{"class":165},[148,4467,4468],{"class":150,"line":407},[148,4469,806],{"class":165},[148,4471,4472,4474,4476,4478,4481],{"class":150,"line":592},[148,4473,595],{"class":161},[148,4475,1482],{"class":165},[148,4477,169],{"class":161},[148,4479,4480],{"class":175}," fetcher",[148,4482,179],{"class":165},[148,4484,4485,4488,4490],{"class":150,"line":626},[148,4486,4487],{"class":165},"            cache[key] ",[148,4489,169],{"class":161},[148,4491,970],{"class":165},[148,4493,4494],{"class":150,"line":638},[148,4495,4496],{"class":165},"                data: data,\n",[148,4498,4499],{"class":150,"line":654},[148,4500,4501],{"class":165},"                timestamp: now\n",[148,4503,4504],{"class":150,"line":659},[148,4505,1033],{"class":165},[148,4507,4508],{"class":150,"line":665},[148,4509,806],{"class":165},[148,4511,4512,4514],{"class":150,"line":860},[148,4513,641],{"class":161},[148,4515,4516],{"class":165}," data;\n",[148,4518,4519],{"class":150,"line":873},[148,4520,398],{"class":165},[148,4522,4523],{"class":150,"line":893},[148,4524,2881],{"class":165},[148,4526,4527],{"class":150,"line":911},[148,4528,275],{"class":165},[49,4530,4532],{"id":4531},"_3-async-loading","3. Async Loading",[15,4534,4535],{},"Don't block page render for non-critical data:",[54,4537,4539],{"className":142,"code":4538,"language":144,"meta":63,"style":63},"\u002F\u002F Load critical data synchronously\nview.model.fetch().done(function() {\n    view.render();\n    \n    \u002F\u002F Load secondary data asynchronously\n    setTimeout(function() {\n        relatedProducts.fetch().done(function() {\n            view.updateRelated();\n        });\n    }, 0);\n});\n",[61,4540,4541,4546,4563,4573,4577,4582,4593,4610,4620,4624,4634],{"__ignoreMap":63},[148,4542,4543],{"class":150,"line":151},[148,4544,4545],{"class":154},"\u002F\u002F Load critical data synchronously\n",[148,4547,4548,4551,4553,4555,4557,4559,4561],{"class":150,"line":158},[148,4549,4550],{"class":165},"view.model.",[148,4552,4201],{"class":175},[148,4554,2762],{"class":165},[148,4556,223],{"class":175},[148,4558,226],{"class":165},[148,4560,229],{"class":161},[148,4562,923],{"class":165},[148,4564,4565,4568,4571],{"class":150,"line":182},[148,4566,4567],{"class":165},"    view.",[148,4569,4570],{"class":175},"render",[148,4572,179],{"class":165},[148,4574,4575],{"class":150,"line":194},[148,4576,526],{"class":165},[148,4578,4579],{"class":150,"line":207},[148,4580,4581],{"class":154},"    \u002F\u002F Load secondary data asynchronously\n",[148,4583,4584,4587,4589,4591],{"class":150,"line":217},[148,4585,4586],{"class":175},"    setTimeout",[148,4588,226],{"class":165},[148,4590,229],{"class":161},[148,4592,923],{"class":165},[148,4594,4595,4598,4600,4602,4604,4606,4608],{"class":150,"line":241},[148,4596,4597],{"class":165},"        relatedProducts.",[148,4599,4201],{"class":175},[148,4601,2762],{"class":165},[148,4603,223],{"class":175},[148,4605,226],{"class":165},[148,4607,229],{"class":161},[148,4609,923],{"class":165},[148,4611,4612,4615,4618],{"class":150,"line":247},[148,4613,4614],{"class":165},"            view.",[148,4616,4617],{"class":175},"updateRelated",[148,4619,179],{"class":165},[148,4621,4622],{"class":150,"line":266},[148,4623,2736],{"class":165},[148,4625,4626,4629,4632],{"class":150,"line":272},[148,4627,4628],{"class":165},"    }, ",[148,4630,4631],{"class":213},"0",[148,4633,1391],{"class":165},[148,4635,4636],{"class":150,"line":369},[148,4637,275],{"class":165},[49,4639,4641],{"id":4640},"_4-minimize-suitescript-execution","4. Minimize SuiteScript Execution",[15,4643,4644],{},"SuiteScript is slow. Cache aggressively, use saved searches over script logic, and avoid record loads when search columns suffice.",[54,4646,4648],{"className":142,"code":4647,"language":144,"meta":63,"style":63},"\u002F\u002F BAD: Loading records to get field values\nresults.forEach(function(result) {\n    var record = nlapiLoadRecord('item', result.getId());\n    items.push({\n        name: record.getFieldValue('displayname'),\n        price: record.getFieldValue('price')\n    });\n});\n\n\u002F\u002F GOOD: Get values from search columns\nresults.forEach(function(result) {\n    items.push({\n        name: result.getValue('displayname'),\n        price: result.getValue('price')\n    });\n});\n",[61,4649,4650,4655,4672,4692,4701,4714,4727,4731,4735,4739,4744,4760,4768,4780,4792,4796],{"__ignoreMap":63},[148,4651,4652],{"class":150,"line":151},[148,4653,4654],{"class":154},"\u002F\u002F BAD: Loading records to get field values\n",[148,4656,4657,4660,4662,4664,4666,4668,4670],{"class":150,"line":158},[148,4658,4659],{"class":165},"results.",[148,4661,3012],{"class":175},[148,4663,226],{"class":165},[148,4665,229],{"class":161},[148,4667,226],{"class":165},[148,4669,2515],{"class":234},[148,4671,238],{"class":165},[148,4673,4674,4676,4678,4680,4682,4684,4686,4688,4690],{"class":150,"line":182},[148,4675,3027],{"class":161},[148,4677,2229],{"class":165},[148,4679,169],{"class":161},[148,4681,2234],{"class":175},[148,4683,226],{"class":165},[148,4685,888],{"class":200},[148,4687,3042],{"class":165},[148,4689,2260],{"class":175},[148,4691,4096],{"class":165},[148,4693,4694,4697,4699],{"class":150,"line":194},[148,4695,4696],{"class":165},"    items.",[148,4698,632],{"class":175},[148,4700,191],{"class":165},[148,4702,4703,4706,4708,4710,4712],{"class":150,"line":207},[148,4704,4705],{"class":165},"        name: record.",[148,4707,2271],{"class":175},[148,4709,226],{"class":165},[148,4711,2724],{"class":200},[148,4713,555],{"class":165},[148,4715,4716,4719,4721,4723,4725],{"class":150,"line":217},[148,4717,4718],{"class":165},"        price: record.",[148,4720,2271],{"class":175},[148,4722,226],{"class":165},[148,4724,3126],{"class":200},[148,4726,908],{"class":165},[148,4728,4729],{"class":150,"line":241},[148,4730,662],{"class":165},[148,4732,4733],{"class":150,"line":247},[148,4734,275],{"class":165},[148,4736,4737],{"class":150,"line":266},[148,4738,307],{"emptyLinePlaceholder":306},[148,4740,4741],{"class":150,"line":272},[148,4742,4743],{"class":154},"\u002F\u002F GOOD: Get values from search columns\n",[148,4745,4746,4748,4750,4752,4754,4756,4758],{"class":150,"line":369},[148,4747,4659],{"class":165},[148,4749,3012],{"class":175},[148,4751,226],{"class":165},[148,4753,229],{"class":161},[148,4755,226],{"class":165},[148,4757,2515],{"class":234},[148,4759,238],{"class":165},[148,4761,4762,4764,4766],{"class":150,"line":385},[148,4763,4696],{"class":165},[148,4765,632],{"class":175},[148,4767,191],{"class":165},[148,4769,4770,4772,4774,4776,4778],{"class":150,"line":395},[148,4771,3106],{"class":165},[148,4773,2540],{"class":175},[148,4775,226],{"class":165},[148,4777,2724],{"class":200},[148,4779,555],{"class":165},[148,4781,4782,4784,4786,4788,4790],{"class":150,"line":401},[148,4783,3119],{"class":165},[148,4785,2540],{"class":175},[148,4787,226],{"class":165},[148,4789,3126],{"class":200},[148,4791,908],{"class":165},[148,4793,4794],{"class":150,"line":407},[148,4795,662],{"class":165},[148,4797,4798],{"class":150,"line":592},[148,4799,275],{"class":165},[97,4801],{},[34,4803,4805],{"id":4804},"common-architectural-mistakes","Common Architectural Mistakes",[15,4807,4808],{},"We've fixed these issues on more SuiteCommerce sites than we can count.",[49,4810,4812],{"id":4811},"_1-ignoring-the-ssp-libraries-bundle","1. Ignoring the SSP Libraries Bundle",[15,4814,4815,4816,4819],{},"All backend models are compiled into ",[61,4817,4818],{},"ssp_libraries.js",". The larger this file, the slower your server-side performance.",[15,4821,4822,4825,4826,4829],{},[74,4823,4824],{},"Fix",": Only include models your site actually uses. Audit your ",[61,4827,4828],{},"distro.json"," dependencies.",[49,4831,4833],{"id":4832},"_2-synchronous-external-api-calls","2. Synchronous External API Calls",[15,4835,4836],{},"Calling external APIs from service controllers blocks the entire request.",[15,4838,4839,4841],{},[74,4840,4824],{},": Use scheduled scripts for non-critical external data. Cache aggressively. Consider middleware for high-volume integrations.",[49,4843,4845],{"id":4844},"_3-over-fetching-data","3. Over-Fetching Data",[15,4847,4848],{},"Default fieldsets often return more data than needed.",[54,4850,4852],{"className":142,"code":4851,"language":144,"meta":63,"style":63},"\u002F\u002F Returns massive payload with all item fields\nGET \u002Fapi\u002Fitems?fieldset=details\n\n\u002F\u002F Returns only what you need\nGET \u002Fapi\u002Fitems?fieldset=search&fields=itemid,displayname,price,thumbnail\n",[61,4853,4854,4859,4886,4890,4895],{"__ignoreMap":63},[148,4855,4856],{"class":150,"line":151},[148,4857,4858],{"class":154},"\u002F\u002F Returns massive payload with all item fields\n",[148,4860,4861,4863,4866,4869,4872,4875,4878,4881,4883],{"class":150,"line":158},[148,4862,1683],{"class":213},[148,4864,4865],{"class":161}," \u002F",[148,4867,4868],{"class":165},"api",[148,4870,4871],{"class":161},"\u002F",[148,4873,4874],{"class":165},"items",[148,4876,4877],{"class":161},"?",[148,4879,4880],{"class":165},"fieldset",[148,4882,169],{"class":161},[148,4884,4885],{"class":165},"details\n",[148,4887,4888],{"class":150,"line":182},[148,4889,307],{"emptyLinePlaceholder":306},[148,4891,4892],{"class":150,"line":194},[148,4893,4894],{"class":154},"\u002F\u002F Returns only what you need\n",[148,4896,4897,4899,4901,4903,4905,4907,4909,4911,4913,4915,4918,4921,4923],{"class":150,"line":207},[148,4898,1683],{"class":213},[148,4900,4865],{"class":161},[148,4902,4868],{"class":165},[148,4904,4871],{"class":161},[148,4906,4874],{"class":165},[148,4908,4877],{"class":161},[148,4910,4880],{"class":165},[148,4912,169],{"class":161},[148,4914,2652],{"class":165},[148,4916,4917],{"class":161},"&",[148,4919,4920],{"class":165},"fields",[148,4922,169],{"class":161},[148,4924,4925],{"class":165},"itemid,displayname,price,thumbnail\n",[49,4927,4929],{"id":4928},"_4-ignoring-the-seo-engine","4. Ignoring the SEO Engine",[15,4931,4932],{},"SuiteCommerce's SEO engine pre-renders pages for crawlers. Misconfigurations cause slow crawl times and duplicate content.",[15,4934,4935,4937],{},[74,4936,4824],{},": Tune SEO page generator settings. Cache rendered pages. Monitor performance with Google Search Console.",[97,4939],{},[34,4941,4943],{"id":4942},"debugging-architecture-issues","Debugging Architecture Issues",[15,4945,4946],{},"When things go wrong, these tools help.",[49,4948,4950],{"id":4949},"frontend-debugging","Frontend Debugging",[54,4952,4954],{"className":142,"code":4953,"language":144,"meta":63,"style":63},"\u002F\u002F Enable Backbone debugging\nSC.DEBUG = true;\n\n\u002F\u002F Log all Backbone sync operations\nBackbone.sync = _.wrap(Backbone.sync, function(sync, method, model, options) {\n    console.log('Sync:', method, model.url || model.urlRoot);\n    return sync.call(Backbone, method, model, options);\n});\n",[61,4955,4956,4961,4977,4981,4986,5024,5044,5057],{"__ignoreMap":63},[148,4957,4958],{"class":150,"line":151},[148,4959,4960],{"class":154},"\u002F\u002F Enable Backbone debugging\n",[148,4962,4963,4966,4968,4971,4973,4975],{"class":150,"line":158},[148,4964,4965],{"class":213},"SC",[148,4967,606],{"class":165},[148,4969,4970],{"class":213},"DEBUG",[148,4972,2689],{"class":161},[148,4974,2839],{"class":213},[148,4976,521],{"class":165},[148,4978,4979],{"class":150,"line":182},[148,4980,307],{"emptyLinePlaceholder":306},[148,4982,4983],{"class":150,"line":194},[148,4984,4985],{"class":154},"\u002F\u002F Log all Backbone sync operations\n",[148,4987,4988,4991,4993,4995,4998,5001,5003,5005,5008,5010,5013,5015,5018,5020,5022],{"class":150,"line":207},[148,4989,4990],{"class":165},"Backbone.sync ",[148,4992,169],{"class":161},[148,4994,2497],{"class":165},[148,4996,4997],{"class":175},"wrap",[148,4999,5000],{"class":165},"(Backbone.sync, ",[148,5002,229],{"class":161},[148,5004,226],{"class":165},[148,5006,5007],{"class":234},"sync",[148,5009,503],{"class":165},[148,5011,5012],{"class":234},"method",[148,5014,503],{"class":165},[148,5016,5017],{"class":234},"model",[148,5019,503],{"class":165},[148,5021,1739],{"class":234},[148,5023,238],{"class":165},[148,5025,5026,5029,5031,5033,5036,5039,5041],{"class":150,"line":217},[148,5027,5028],{"class":165},"    console.",[148,5030,3489],{"class":175},[148,5032,226],{"class":165},[148,5034,5035],{"class":200},"'Sync:'",[148,5037,5038],{"class":165},", method, model.url ",[148,5040,620],{"class":161},[148,5042,5043],{"class":165}," model.urlRoot);\n",[148,5045,5046,5048,5051,5054],{"class":150,"line":241},[148,5047,531],{"class":161},[148,5049,5050],{"class":165}," sync.",[148,5052,5053],{"class":175},"call",[148,5055,5056],{"class":165},"(Backbone, method, model, options);\n",[148,5058,5059],{"class":150,"line":247},[148,5060,275],{"class":165},[49,5062,5064],{"id":5063},"backend-debugging","Backend Debugging",[54,5066,5068],{"className":142,"code":5067,"language":144,"meta":63,"style":63},"\u002F\u002F SuiteScript logging\nnlapiLogExecution('DEBUG', 'Function Entry', JSON.stringify(params));\n\n\u002F\u002F Measure execution time\nvar start = new Date().getTime();\n\u002F\u002F ... operation ...\nnlapiLogExecution('DEBUG', 'Operation Time', (new Date().getTime() - start) + 'ms');\n",[61,5069,5070,5075,5103,5107,5112,5133,5138],{"__ignoreMap":63},[148,5071,5072],{"class":150,"line":151},[148,5073,5074],{"class":154},"\u002F\u002F SuiteScript logging\n",[148,5076,5077,5080,5082,5085,5087,5090,5092,5095,5097,5100],{"class":150,"line":158},[148,5078,5079],{"class":175},"nlapiLogExecution",[148,5081,226],{"class":165},[148,5083,5084],{"class":200},"'DEBUG'",[148,5086,503],{"class":165},[148,5088,5089],{"class":200},"'Function Entry'",[148,5091,503],{"class":165},[148,5093,5094],{"class":213},"JSON",[148,5096,606],{"class":165},[148,5098,5099],{"class":175},"stringify",[148,5101,5102],{"class":165},"(params));\n",[148,5104,5105],{"class":150,"line":182},[148,5106,307],{"emptyLinePlaceholder":306},[148,5108,5109],{"class":150,"line":194},[148,5110,5111],{"class":154},"\u002F\u002F Measure execution time\n",[148,5113,5114,5116,5119,5121,5123,5126,5128,5131],{"class":150,"line":207},[148,5115,162],{"class":161},[148,5117,5118],{"class":165}," start ",[148,5120,169],{"class":161},[148,5122,172],{"class":161},[148,5124,5125],{"class":175}," Date",[148,5127,2762],{"class":165},[148,5129,5130],{"class":175},"getTime",[148,5132,179],{"class":165},[148,5134,5135],{"class":150,"line":217},[148,5136,5137],{"class":154},"\u002F\u002F ... operation ...\n",[148,5139,5140,5142,5144,5146,5148,5151,5154,5157,5159,5161,5163,5166,5168,5171,5174,5177],{"class":150,"line":241},[148,5141,5079],{"class":175},[148,5143,226],{"class":165},[148,5145,5084],{"class":200},[148,5147,503],{"class":165},[148,5149,5150],{"class":200},"'Operation Time'",[148,5152,5153],{"class":165},", (",[148,5155,5156],{"class":161},"new",[148,5158,5125],{"class":175},[148,5160,2762],{"class":165},[148,5162,5130],{"class":175},[148,5164,5165],{"class":165},"() ",[148,5167,4446],{"class":161},[148,5169,5170],{"class":165}," start) ",[148,5172,5173],{"class":161},"+",[148,5175,5176],{"class":200}," 'ms'",[148,5178,1391],{"class":165},[49,5180,5182],{"id":5181},"network-analysis","Network Analysis",[15,5184,5185],{},"Use Chrome DevTools Network tab with these filters:",[5187,5188,5189,5196,5202],"ul",{},[5190,5191,5192,5195],"li",{},[61,5193,5194],{},"Service.ss",": All service controller requests",[5190,5197,5198,5201],{},[61,5199,5200],{},"api\u002F",": Commerce API requests",[5190,5203,5204,5207],{},[61,5205,5206],{},"?fieldset=",": Item data requests",[97,5209],{},[34,5211,5213],{"id":5212},"faq","FAQ",[49,5215,5217],{"id":5216},"how-is-suitecommerce-different-from-headless-commerce","How is SuiteCommerce different from headless commerce?",[15,5219,5220],{},"SuiteCommerce is a traditional coupled architecture—the frontend and backend are tightly integrated. Headless separates them via API. SuiteCommerce is faster to implement but less flexible than headless. For most NetSuite businesses, SuiteCommerce's native integration advantages outweigh headless flexibility.",[49,5222,5224],{"id":5223},"can-i-use-react-or-vue-instead-of-backbone","Can I use React or Vue instead of Backbone?",[15,5226,5227],{},"Technically yes, by going headless and building a custom frontend. But you'd lose SuiteCommerce's built-in templates, extensions, and much of the platform's value. We recommend working with Backbone unless you have compelling reasons and budget for custom development.",[49,5229,5231],{"id":5230},"how-do-i-improve-ttfb-on-suitecommerce","How do I improve TTFB on SuiteCommerce?",[15,5233,5234],{},"TTFB depends on NetSuite server performance and your SSP code efficiency. Optimize service controllers, cache responses, minimize SuiteScript execution, and use a CDN with edge caching. Target under 800ms; anything over 1.2s needs investigation.",[49,5236,5238],{"id":5237},"is-suitescript-2x-better-than-10","Is SuiteScript 2.x better than 1.0?",[15,5240,5241],{},"For new development, yes—cleaner syntax, promises, and better module structure. But SuiteCommerce's core uses 1.0. Don't mix versions in the same module. Choose based on compatibility with existing code.",[49,5243,5245],{"id":5244},"what-causes-governance-errors","What causes governance errors?",[15,5247,5248,5249,5252],{},"Exceeding NetSuite's unit limits per script execution. Common causes: loading too many records, inefficient searches, or loops that scale with data. Monitor ",[61,5250,5251],{},"getRemainingUsage()"," and optimize high-consumption operations.",[97,5254],{},[34,5256,5258],{"id":5257},"next-steps","Next Steps",[15,5260,5261],{},"Understanding SuiteCommerce's architecture is the foundation. To apply this knowledge:",[5263,5264,5265,5271,5277,5283],"ol",{},[5190,5266,5267,5270],{},[74,5268,5269],{},"Audit your current implementation"," - Identify architectural anti-patterns costing you performance",[5190,5272,5273,5276],{},[74,5274,5275],{},"Map your data flows"," - Document which operations are real-time vs. cached",[5190,5278,5279,5282],{},[74,5280,5281],{},"Review your extensions"," - Ensure they follow Extensibility API best practices",[5190,5284,5285,5288],{},[74,5286,5287],{},"Measure performance"," - Baseline your TTFB, JavaScript execution, and API response times",[15,5290,5291,5292,5297],{},"Need help optimizing your SuiteCommerce architecture? Our team has rebuilt, optimized, and rescued more SuiteCommerce implementations than we can count. ",[5293,5294,5296],"a",{"href":5295},"\u002Fcontact","Get a free architecture review"," and we'll identify exactly where your site is bleeding performance.",[5299,5300,5301],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":63,"searchDepth":158,"depth":158,"links":5303},[5304,5308,5312,5317,5322,5327,5332,5337,5343,5349,5354,5361],{"id":36,"depth":158,"text":37,"children":5305},[5306,5307],{"id":51,"depth":182,"text":52},{"id":69,"depth":182,"text":70},{"id":101,"depth":158,"text":102,"children":5309},[5310,5311],{"id":114,"depth":182,"text":115},{"id":127,"depth":182,"text":128},{"id":421,"depth":158,"text":422,"children":5313},[5314,5315,5316],{"id":428,"depth":182,"text":429},{"id":438,"depth":182,"text":439},{"id":1183,"depth":182,"text":1184},{"id":1198,"depth":158,"text":1199,"children":5318},[5319,5320,5321],{"id":1205,"depth":182,"text":1206},{"id":1654,"depth":182,"text":1655},{"id":1725,"depth":182,"text":1726},{"id":1856,"depth":158,"text":1857,"children":5323},[5324,5325,5326],{"id":1863,"depth":182,"text":1864},{"id":2583,"depth":182,"text":2584},{"id":2888,"depth":182,"text":2889},{"id":3141,"depth":158,"text":3142,"children":5328},[5329,5330,5331],{"id":3148,"depth":182,"text":3149},{"id":3350,"depth":182,"text":3351},{"id":3594,"depth":182,"text":3595},{"id":3760,"depth":158,"text":3761,"children":5333},[5334,5335,5336],{"id":3767,"depth":182,"text":3768},{"id":3819,"depth":182,"text":3820},{"id":3902,"depth":182,"text":3903},{"id":4172,"depth":158,"text":4173,"children":5338},[5339,5340,5341,5342],{"id":4179,"depth":182,"text":4180},{"id":4311,"depth":182,"text":4312},{"id":4531,"depth":182,"text":4532},{"id":4640,"depth":182,"text":4641},{"id":4804,"depth":158,"text":4805,"children":5344},[5345,5346,5347,5348],{"id":4811,"depth":182,"text":4812},{"id":4832,"depth":182,"text":4833},{"id":4844,"depth":182,"text":4845},{"id":4928,"depth":182,"text":4929},{"id":4942,"depth":158,"text":4943,"children":5350},[5351,5352,5353],{"id":4949,"depth":182,"text":4950},{"id":5063,"depth":182,"text":5064},{"id":5181,"depth":182,"text":5182},{"id":5212,"depth":158,"text":5213,"children":5355},[5356,5357,5358,5359,5360],{"id":5216,"depth":182,"text":5217},{"id":5223,"depth":182,"text":5224},{"id":5230,"depth":182,"text":5231},{"id":5237,"depth":182,"text":5238},{"id":5244,"depth":182,"text":5245},{"id":5257,"depth":158,"text":5258},[5363,5364,5365],"SuiteCommerce","Development","Integration","2026-02-07","Deep dive into SuiteCommerce's technical architecture. Understand data flow, RESTful APIs, service controllers, and how the storefront communicates with NetSuite backend.","md","\u002Fimages\u002Fblog\u002Fnetsuite-ecommerce-integration-hero.webp",{},"\u002Fblog\u002Fnetsuite-ecommerce-integration-architecture-how-suitecommerce-works",null,{"title":5,"description":5367},"blog\u002Fnetsuite-ecommerce-integration-architecture-how-suitecommerce-works",[5376,5365,5377,5378,5379,5380],"Architecture","SuiteScript","API","Backend","Frontend","cYNoLbRxvVNrCeVY4m8vZYdiMwMwksihF1UQFNTbXkI",[5383,5393,5405,5417,5425,5428,5440,5449,5459,5468,5477,5487,5495,5505,5513,5524,5536,5545,5554,5563,5571],{"path":5384,"title":5385,"categories":5386,"tags":5387,"heroImage":5392},"\u002Fblog\u002Fbuilding-custom-suitecommerce-extensions-developer-guide","Building Custom SuiteCommerce Extensions: A Developer's Start-to-Finish Guide",[5363,5364],[5388,5389,5390,5377,5391],"SuiteCommerce Extensions","Custom Development","Backbone.js","Frontend Development","\u002Fimages\u002Fblog\u002Fextensions-guide-hero.webp",{"path":5394,"title":5395,"categories":5396,"tags":5398,"heroImage":5404},"\u002Fblog\u002Fcore-web-vitals-suitecommerce-optimization-checklist","Core Web Vitals for SuiteCommerce: The Complete 2026 Optimization Checklist",[5397,5363],"Performance",[5399,5400,5401,5402,5403,5363],"Core Web Vitals","LCP","INP","CLS","Performance Optimization","\u002Fimages\u002Fblog\u002Fcore-web-vitals-hero.webp",{"path":5406,"title":5407,"categories":5408,"tags":5410,"heroImage":5416},"\u002Fblog\u002Ffixing-duplicate-content-suitecommerce-faceted-navigation","Fixing Duplicate Content in SuiteCommerce Faceted Navigation",[5409,5363],"SEO",[5411,5412,5413,5414,5363,5415],"Duplicate Content","Faceted Navigation","Canonical Tags","Technical SEO","URL Parameters","\u002Fimages\u002Fblog\u002Fduplicate-content-seo-hero.webp",{"path":5418,"title":5419,"categories":5420,"tags":5421,"heroImage":5424},"\u002Fblog\u002Fheadless-suitecommerce-when-does-it-make-sense","Headless SuiteCommerce: When Does It Make Sense?",[5363,5364],[5363,5422,5376,5423,5397],"Headless Commerce","Implementation","\u002Fimages\u002Fblog\u002Fheadless-suitecommerce-hero.webp",{"path":5371,"title":5,"categories":5426,"tags":5427,"heroImage":5369},[5363,5364,5365],[5376,5365,5377,5378,5379,5380],{"path":5429,"title":5430,"categories":5431,"tags":5433,"heroImage":5439},"\u002Fblog\u002Fnetsuite-integration-without-celigo-when-custom-beats-off-the-shelf","NetSuite Integration Without Celigo: When Custom Beats Off-the-Shelf",[5432,5365],"NetSuite",[5434,5435,5436,5437,5377,5438],"NetSuite Integration","Celigo","Custom Integration","RESTlet","API Development","\u002Fimages\u002Fblog\u002Fnetsuite-integration-hero.webp",{"path":5441,"title":5442,"categories":5443,"tags":5444,"heroImage":5448},"\u002Fblog\u002Fsuitecommerce-checkout-optimization-fixing-abandonment","SuiteCommerce Checkout Optimization: Fixing Abandonment at the Technical Level",[5363,5397],[5363,5445,5446,5447,5397],"Checkout Optimization","Cart Abandonment","Conversions","\u002Fimages\u002Fblog\u002Fsuitecommerce-checkout-hero.webp",{"path":5450,"title":5451,"categories":5452,"tags":5453,"heroImage":5458},"\u002Fblog\u002Fsuitecommerce-image-optimization-developer-guide","SuiteCommerce Image Optimization: A Developer's Guide",[5397,5363],[5454,5455,5456,5457,5397,5363],"Image Optimization","WebP","Lazy Loading","CDN","\u002Fimages\u002Fblog\u002Fimage-optimization-hero.webp",{"path":5460,"title":5461,"categories":5462,"tags":5463,"heroImage":5467},"\u002Fblog\u002Fsuitecommerce-implementation-cost-guide-2026","SuiteCommerce Implementation Cost Guide: What to Expect in 2026",[5363,5423],[5464,5423,5432,5465,5466],"SuiteCommerce Cost","Budget Planning","E-commerce","\u002Fimages\u002Fblog\u002Fimplementation-cost-hero.webp",{"path":5469,"title":5470,"categories":5471,"tags":5472,"heroImage":5476},"\u002Fblog\u002Fsuitecommerce-migration-checklist-upgrading-without-downtime","The SuiteCommerce Migration Checklist: Upgrading Without Downtime",[5363,5364],[5363,5473,5474,5475,5423],"Migration","Upgrade","Zero Downtime","\u002Fimages\u002Fblog\u002Fmigration-checklist-hero.webp",{"path":5478,"title":5479,"categories":5480,"tags":5481,"heroImage":5486},"\u002Fblog\u002Fsuitecommerce-myaccount-customization-b2b-features","SuiteCommerce MyAccount Customization: 10 Features B2B Customers Need",[5363,5364],[5363,5482,5483,5484,5485],"MyAccount","B2B","Customization","Portal","\u002Fimages\u002Fblog\u002Fsuitecommerce-myaccount-hero.webp",{"path":5488,"title":5489,"categories":5490,"tags":5492,"heroImage":5494},"\u002Fblog\u002Fsuitecommerce-performance-audit-286-stores","We Audited 286 Live SuiteCommerce Stores. Here's What We Found",[5397,5491,5363],"Research",[5397,5363,5399,5491,5493],"Benchmarks","\u002Fimages\u002Fblog\u002Fsuitecommerce-audit-hero.webp",{"path":5496,"title":5497,"categories":5498,"tags":5499,"heroImage":5504},"\u002Fblog\u002Fsuitecommerce-product-page-optimization-conversions-seo","How to Optimize SuiteCommerce Product Pages for Conversions and SEO",[5409,5397,5363],[5500,5501,5502,5414,5503],"Product Pages","Conversion Optimization","Schema Markup","CRO","\u002Fimages\u002Fblog\u002Fsuitecommerce-product-page-hero.webp",{"path":5506,"title":5507,"categories":5508,"tags":5509,"heroImage":5512},"\u002Fblog\u002Fsuitecommerce-seo-schema-markup-technical-guide","SuiteCommerce SEO: Schema Markup, Technical SEO, and What Actually Works",[5409,5363],[5502,5414,5510,5511,5363,5432],"JSON-LD","Structured Data","\u002Fimages\u002Fblog\u002Fseo-schema-markup-hero.webp",{"path":5514,"title":5515,"categories":5516,"tags":5518,"heroImage":5523},"\u002Fblog\u002Fsuitecommerce-theme-development-design-to-deployment","SuiteCommerce Theme Development: From Design to Deployment",[5364,5363,5517],"Themes",[5519,5520,5521,5522,5391,5484],"Theme Development","SASS","CSS","Templates","\u002Fimages\u002Fblog\u002Fsuitecommerce-theme-hero.webp",{"path":5525,"title":5526,"categories":5527,"tags":5530,"heroImage":5535},"\u002Fblog\u002Fsuitecommerce-version-upgrade-guide-2024","SuiteCommerce Version Upgrade Guide: 2023.x to 2024.x",[5363,5528,5529],"Maintenance","Upgrades",[5531,5473,5532,5533,5534],"Version Upgrade","2024 Release","SCA","Deployment","\u002Fimages\u002Fblog\u002Fsuitecommerce-upgrade-hero.webp",{"path":5537,"title":5538,"categories":5539,"tags":5540,"heroImage":5544},"\u002Fblog\u002Fsuitecommerce-vs-bigcommerce-netsuite-users","SuiteCommerce vs. BigCommerce for NetSuite Users: Which Platform Wins?",[5363,5466],[5541,5363,5432,5542,5543,5365],"BigCommerce","Platform Comparison","E-commerce Platform","\u002Fimages\u002Fblog\u002Fsuitecommerce-vs-bigcommerce-hero.webp",{"path":5546,"title":5547,"categories":5548,"tags":5549,"heroImage":5553},"\u002Fblog\u002Fsuitescript-performance-optimization-writing-efficient-scripts","SuiteScript Performance Optimization: Writing Efficient Scripts",[5432,5377],[5377,5403,5550,5551,5552,5378],"Governance","Map\u002FReduce","NetSuite Development","\u002Fimages\u002Fblog\u002Fsuitescript-performance-hero.webp",{"path":5555,"title":5556,"categories":5557,"tags":5558,"heroImage":5562},"\u002Fblog\u002Ftroubleshooting-suitecommerce-15-common-errors-how-to-fix","Troubleshooting SuiteCommerce: 15 Common Errors and How to Fix Them",[5363,5364],[5363,5559,5560,5561,5364],"Troubleshooting","Errors","Debugging","\u002Fimages\u002Fblog\u002Ftroubleshooting-errors-hero.webp",{"path":5564,"title":5565,"categories":5566,"tags":5567,"heroImage":5570},"\u002Fblog\u002Ftrue-cost-suitecommerce-maintenance-annual-budget-guide","The True Cost of SuiteCommerce Maintenance: Annual Budget Planning Guide",[5363,5397],[5363,5528,5465,5568,5569],"TCO","E-commerce Operations","\u002Fimages\u002Fblog\u002Fsuitecommerce-maintenance-cost-hero.webp",{"path":5572,"title":5573,"categories":5574,"tags":5575,"heroImage":5577},"\u002Fblog\u002Fwhy-suitecommerce-site-slow-how-to-fix","Why Your SuiteCommerce Site is Slow (And How to Fix It)",[5397,5363],[5397,5363,5576,5559],"Speed Optimization","\u002Fimages\u002Fblog\u002Fslow-site-fix-hero.webp",1773773965833]