[{"data":1,"prerenderedAt":4313},["ShallowReactive",2],{"blog-suitecommerce-version-upgrade-guide-2024":3,"all-blog-posts":4119},{"id":4,"title":5,"author":6,"body":7,"categories":4099,"date":4103,"description":4104,"extension":4105,"heroImage":4106,"meta":4107,"navigation":408,"path":4108,"relatedArticles":4109,"seo":4110,"stem":4111,"tags":4112,"__hash__":4118},"content\u002Fblog\u002Fsuitecommerce-version-upgrade-guide-2024.md","SuiteCommerce Version Upgrade Guide: 2023.x to 2024.x","Stenbase Team",{"type":8,"value":9,"toc":4027},"minimark",[10,14,18,21,24,27,32,39,42,47,55,107,110,114,121,137,141,146,160,165,176,180,185,196,201,212,217,228,231,235,238,242,315,321,325,328,333,347,352,366,369,371,375,378,382,385,563,567,570,575,602,607,625,629,632,637,645,650,655,660,668,670,674,677,681,684,704,710,714,717,723,726,744,748,751,819,821,825,828,832,835,843,925,933,967,981,985,990,1067,1072,1113,1118,1121,1125,1128,1463,1467,1470,1518,1520,1524,1527,1531,1534,1542,1579,1593,1605,1609,1612,1617,1620,1637,1642,1645,1659,1663,1666,1710,1716,1739,1743,1746,1772,1775,1789,1791,1795,1798,1802,1805,2073,2077,2080,2265,2269,2323,2325,2329,2332,2336,2534,2538,2541,2582,2587,2645,2649,2652,2672,2676,2679,2752,2754,2758,2761,2765,2768,2777,2791,2798,2809,2813,2816,2830,2834,2837,2851,2853,2857,2863,2866,2870,2878,2882,2887,2930,2935,2962,2966,2969,3085,3089,3092,3141,3145,3148,3153,3164,3169,3180,3183,3185,3189,3192,3196,3201,3234,3239,3272,3276,3279,3328,3332,3335,3403,3405,3409,3413,3418,3421,3526,3530,3535,3538,3586,3590,3595,3613,3617,3622,3703,3707,3712,3729,3731,3735,3738,3925,3927,3931,3936,3939,3944,3947,3952,3955,3960,3963,3968,3971,3973,3977,3980,4000,4003,4010,4012,4023],[11,12,5],"h1",{"id":13},"suitecommerce-version-upgrade-guide-2023x-to-2024x",[15,16,17],"p",{},"Your SuiteCommerce site is running on a 2023.x version. It works. Orders process. Customers check out. So why upgrade?",[15,19,20],{},"Because you're accumulating technical debt with every month you delay. Security patches you're missing. Performance improvements you're not benefiting from. Features your competitors are using. And the longer you wait, the harder the eventual upgrade becomes.",[15,22,23],{},"We've handled 50+ SuiteCommerce version upgrades, including complex migrations spanning multiple major versions. The 2023 to 2024 jump is significant—Oracle introduced architectural improvements that deliver real performance gains, but they require careful migration planning.",[15,25,26],{},"This guide walks you through the entire upgrade process: from initial assessment to zero-downtime deployment.",[28,29,31],"h2",{"id":30},"whats-new-in-2024x-releases","What's New in 2024.x Releases",[15,33,34],{},[35,36],"img",{"alt":37,"src":38},"Version upgrade testing","\u002Fimages\u002Fblog\u002Fsuitecommerce-upgrade-testing.webp",[15,40,41],{},"Before diving into the upgrade process, understand what you're gaining. The 2024 releases introduced substantial improvements across performance, features, and developer experience.",[43,44,46],"h3",{"id":45},"performance-improvements","Performance Improvements",[15,48,49,50,54],{},"The headline improvement in 2024.2 is ",[51,52,53],"strong",{},"skipping prerendering for returning shoppers",". This architectural change reduces Time to First Byte (TTFB) and First Contentful Paint (FCP) for the majority of your visitors.",[56,57,58,71],"table",{},[59,60,61],"thead",{},[62,63,64,68],"tr",{},[65,66,67],"th",{},"Metric",[65,69,70],{},"Typical Improvement",[72,73,74,83,91,99],"tbody",{},[62,75,76,80],{},[77,78,79],"td",{},"TTFB",[77,81,82],{},"20-35% faster",[62,84,85,88],{},[77,86,87],{},"FCP",[77,89,90],{},"15-25% faster",[62,92,93,96],{},[77,94,95],{},"LCP",[77,97,98],{},"10-20% faster",[62,100,101,104],{},[77,102,103],{},"Server Response",[77,105,106],{},"25-40% faster",[15,108,109],{},"These aren't theoretical benchmarks—we measured these improvements across client sites post-upgrade.",[43,111,113],{"id":112},"seo-enhancements","SEO Enhancements",[15,115,116,117,120],{},"The 2024 releases improved the ",[51,118,119],{},"SEO Page Generator"," with better handling of:",[122,123,124,128,131,134],"ul",{},[125,126,127],"li",{},"Dynamic meta tags for faceted navigation pages",[125,129,130],{},"Automatic canonical URL management",[125,132,133],{},"Enhanced structured data output",[125,135,136],{},"Improved sitemap generation performance",[43,138,140],{"id":139},"site-management-improvements","Site Management Improvements",[15,142,143],{},[51,144,145],{},"Enhanced Site Management Tools (SMT):",[122,147,148,151,154,157],{},[125,149,150],{},"Improved content editing interface",[125,152,153],{},"Better preview functionality",[125,155,156],{},"Streamlined publishing workflows",[125,158,159],{},"New content type support",[15,161,162],{},[51,163,164],{},"Theme Management:",[122,166,167,170,173],{},[125,168,169],{},"Fallback themes now fully supported",[125,171,172],{},"Improved skin configuration options",[125,174,175],{},"Better asset management",[43,177,179],{"id":178},"commerce-features","Commerce Features",[15,181,182],{},[51,183,184],{},"Subscription Management:",[122,186,187,190,193],{},[125,188,189],{},"Advanced subscription capabilities for recurring revenue businesses",[125,191,192],{},"Improved subscription lifecycle management",[125,194,195],{},"Better integration with NetSuite billing",[15,197,198],{},[51,199,200],{},"Checkout Improvements:",[122,202,203,206,209],{},[125,204,205],{},"Streamlined payment gateway integrations",[125,207,208],{},"Enhanced address validation",[125,210,211],{},"Improved guest checkout flows",[15,213,214],{},[51,215,216],{},"B2B Enhancements:",[122,218,219,222,225],{},[125,220,221],{},"Better quote management in MyAccount",[125,223,224],{},"Improved purchase order handling",[125,226,227],{},"Enhanced account hierarchy support",[229,230],"hr",{},[28,232,234],{"id":233},"upgrade-path-assessment","Upgrade Path Assessment",[15,236,237],{},"Not all upgrades follow the same path. Your starting version and customization level determine the complexity.",[43,239,241],{"id":240},"version-compatibility-matrix","Version Compatibility Matrix",[56,243,244,260],{},[59,245,246],{},[62,247,248,251,254,257],{},[65,249,250],{},"Current Version",[65,252,253],{},"Target Version",[65,255,256],{},"Upgrade Complexity",[65,258,259],{},"Estimated Effort",[72,261,262,276,289,302],{},[62,263,264,267,270,273],{},[77,265,266],{},"2023.2",[77,268,269],{},"2024.2",[77,271,272],{},"Moderate",[77,274,275],{},"2-4 weeks",[62,277,278,281,283,286],{},[77,279,280],{},"2023.1",[77,282,269],{},[77,284,285],{},"Moderate-High",[77,287,288],{},"3-5 weeks",[62,290,291,294,296,299],{},[77,292,293],{},"2022.x",[77,295,269],{},[77,297,298],{},"High",[77,300,301],{},"4-8 weeks",[62,303,304,307,309,312],{},[77,305,306],{},"2021.x or earlier",[77,308,269],{},[77,310,311],{},"Very High",[77,313,314],{},"6-12 weeks",[15,316,317,320],{},[51,318,319],{},"Rule of thumb:"," Each major version jump adds 1-2 weeks to the timeline due to cumulative breaking changes.",[43,322,324],{"id":323},"suitecommerce-vs-suitecommerce-advanced","SuiteCommerce vs. SuiteCommerce Advanced",[15,326,327],{},"Your product tier affects the upgrade process fundamentally:",[15,329,330],{},[51,331,332],{},"SuiteCommerce (Standard):",[122,334,335,338,341,344],{},[125,336,337],{},"Upgrades applied automatically by NetSuite",[125,339,340],{},"Customizations limited to themes and extensions",[125,342,343],{},"Extensions may need compatibility updates",[125,345,346],{},"Generally lower complexity",[15,348,349],{},[51,350,351],{},"SuiteCommerce Advanced (SCA):",[122,353,354,357,360,363],{},[125,355,356],{},"Manual upgrade required—you control the timing",[125,358,359],{},"Full source code access means more customization possibilities (and migration work)",[125,361,362],{},"Customizations embedded in core code must be re-implemented",[125,364,365],{},"Higher complexity but more control",[15,367,368],{},"This guide covers both paths, with specific callouts for SCA considerations.",[229,370],{},[28,372,374],{"id":373},"pre-upgrade-assessment","Pre-Upgrade Assessment",[15,376,377],{},"Before touching any code, conduct a thorough assessment. This phase prevents 80% of upgrade problems.",[43,379,381],{"id":380},"customization-inventory","Customization Inventory",[15,383,384],{},"Document every customization on your current site:",[386,387,392],"pre",{"className":388,"code":389,"language":390,"meta":391,"style":391},"language-markdown shiki shiki-themes github-light github-dark","## Customization Inventory Template\n\n### Extensions Installed\n| Extension Name | Version | Source | Custom? |\n|---------------|---------|--------|---------|\n| PowerReviews Integration | 2.1.0 | Third-party | No |\n| Custom Quick View | 1.0.0 | In-house | Yes |\n| Enhanced Search | 3.0.0 | SuiteApp | No |\n\n### Theme Customizations\n| File | Modification Type | Description |\n|------|------------------|-------------|\n| header.tpl | Template override | Custom mega-menu |\n| product_details.tpl | Template override | Custom gallery |\n| _product-list.scss | Style override | Grid layout changes |\n\n### SuiteScript Customizations (SCA only)\n| Script Type | Name | Dependencies |\n|------------|------|--------------|\n| Service | CustomShipping.ss | - |\n| Model | CustomProduct.Model.js | Product.Model.js |\n\n### Third-Party Integrations\n| Integration | Connection Method | Version Sensitive? |\n|------------|------------------|-------------------|\n| Klaviyo | Tag + Extension | Yes |\n| Google Analytics 4 | Tag Manager | No |\n| TaxJar | SuiteScript | Yes |\n","markdown","",[393,394,395,403,410,416,422,428,434,440,446,451,457,463,469,475,481,487,492,498,504,510,516,522,527,533,539,545,551,557],"code",{"__ignoreMap":391},[396,397,400],"span",{"class":398,"line":399},"line",1,[396,401,402],{},"## Customization Inventory Template\n",[396,404,406],{"class":398,"line":405},2,[396,407,409],{"emptyLinePlaceholder":408},true,"\n",[396,411,413],{"class":398,"line":412},3,[396,414,415],{},"### Extensions Installed\n",[396,417,419],{"class":398,"line":418},4,[396,420,421],{},"| Extension Name | Version | Source | Custom? |\n",[396,423,425],{"class":398,"line":424},5,[396,426,427],{},"|---------------|---------|--------|---------|\n",[396,429,431],{"class":398,"line":430},6,[396,432,433],{},"| PowerReviews Integration | 2.1.0 | Third-party | No |\n",[396,435,437],{"class":398,"line":436},7,[396,438,439],{},"| Custom Quick View | 1.0.0 | In-house | Yes |\n",[396,441,443],{"class":398,"line":442},8,[396,444,445],{},"| Enhanced Search | 3.0.0 | SuiteApp | No |\n",[396,447,449],{"class":398,"line":448},9,[396,450,409],{"emptyLinePlaceholder":408},[396,452,454],{"class":398,"line":453},10,[396,455,456],{},"### Theme Customizations\n",[396,458,460],{"class":398,"line":459},11,[396,461,462],{},"| File | Modification Type | Description |\n",[396,464,466],{"class":398,"line":465},12,[396,467,468],{},"|------|------------------|-------------|\n",[396,470,472],{"class":398,"line":471},13,[396,473,474],{},"| header.tpl | Template override | Custom mega-menu |\n",[396,476,478],{"class":398,"line":477},14,[396,479,480],{},"| product_details.tpl | Template override | Custom gallery |\n",[396,482,484],{"class":398,"line":483},15,[396,485,486],{},"| _product-list.scss | Style override | Grid layout changes |\n",[396,488,490],{"class":398,"line":489},16,[396,491,409],{"emptyLinePlaceholder":408},[396,493,495],{"class":398,"line":494},17,[396,496,497],{},"### SuiteScript Customizations (SCA only)\n",[396,499,501],{"class":398,"line":500},18,[396,502,503],{},"| Script Type | Name | Dependencies |\n",[396,505,507],{"class":398,"line":506},19,[396,508,509],{},"|------------|------|--------------|\n",[396,511,513],{"class":398,"line":512},20,[396,514,515],{},"| Service | CustomShipping.ss | - |\n",[396,517,519],{"class":398,"line":518},21,[396,520,521],{},"| Model | CustomProduct.Model.js | Product.Model.js |\n",[396,523,525],{"class":398,"line":524},22,[396,526,409],{"emptyLinePlaceholder":408},[396,528,530],{"class":398,"line":529},23,[396,531,532],{},"### Third-Party Integrations\n",[396,534,536],{"class":398,"line":535},24,[396,537,538],{},"| Integration | Connection Method | Version Sensitive? |\n",[396,540,542],{"class":398,"line":541},25,[396,543,544],{},"|------------|------------------|-------------------|\n",[396,546,548],{"class":398,"line":547},26,[396,549,550],{},"| Klaviyo | Tag + Extension | Yes |\n",[396,552,554],{"class":398,"line":553},27,[396,555,556],{},"| Google Analytics 4 | Tag Manager | No |\n",[396,558,560],{"class":398,"line":559},28,[396,561,562],{},"| TaxJar | SuiteScript | Yes |\n",[43,564,566],{"id":565},"breaking-change-analysis","Breaking Change Analysis",[15,568,569],{},"Review NetSuite's release notes for breaking changes between your version and target:",[15,571,572],{},[51,573,574],{},"Common breaking changes in 2024.x:",[576,577,578,584,590,596],"ol",{},[125,579,580,583],{},[51,581,582],{},"Backbone.js updates:"," Views using deprecated patterns may fail",[125,585,586,589],{},[51,587,588],{},"Template context changes:"," Some data structures in templates modified",[125,591,592,595],{},[51,593,594],{},"Service endpoint changes:"," API response formats may differ",[125,597,598,601],{},[51,599,600],{},"SASS variable deprecations:"," Some variables renamed or removed",[15,603,604],{},[51,605,606],{},"How to check:",[386,608,612],{"className":609,"code":610,"language":611,"meta":391,"style":391},"language-bash shiki shiki-themes github-light github-dark","# Download release notes from Oracle documentation\n# Search for \"breaking changes\" and \"deprecated\"\n","bash",[393,613,614,620],{"__ignoreMap":391},[396,615,616],{"class":398,"line":399},[396,617,619],{"class":618},"sJ8bj","# Download release notes from Oracle documentation\n",[396,621,622],{"class":398,"line":405},[396,623,624],{"class":618},"# Search for \"breaking changes\" and \"deprecated\"\n",[43,626,628],{"id":627},"dependency-check","Dependency Check",[15,630,631],{},"Verify all dependencies are compatible with 2024.x:",[15,633,634],{},[51,635,636],{},"Node.js requirements:",[122,638,639,642],{},[125,640,641],{},"2023.x: Node 16.x or 18.x",[125,643,644],{},"2024.x: Node 18.x or 20.x (Node 16 deprecated)",[15,646,647],{},[51,648,649],{},"Gulp requirements:",[122,651,652],{},[125,653,654],{},"Both versions: Gulp 4.x",[15,656,657],{},[51,658,659],{},"Third-party bundles:",[122,661,662,665],{},[125,663,664],{},"Check SuiteApp store for 2024.x compatible versions",[125,666,667],{},"Contact vendors for custom integrations",[229,669],{},[28,671,673],{"id":672},"sandbox-setup","Sandbox Setup",[15,675,676],{},"Never upgrade production first. Your sandbox environment is where you'll do all development and testing.",[43,678,680],{"id":679},"creating-an-upgrade-sandbox","Creating an Upgrade Sandbox",[15,682,683],{},"If your sandbox isn't a recent production copy, refresh it:",[576,685,686,692,698],{},[125,687,688,691],{},[51,689,690],{},"Navigate to:"," Setup → Company → Setup Tasks → Sandbox Refresh",[125,693,694,697],{},[51,695,696],{},"Select:"," Full copy or Production to Sandbox Copy",[125,699,700,703],{},[51,701,702],{},"Wait:"," This can take several hours for large accounts",[15,705,706,709],{},[51,707,708],{},"Important:"," Schedule the refresh during off-hours. It consumes system resources.",[43,711,713],{"id":712},"downloading-development-tools","Downloading Development Tools",[15,715,716],{},"Get the 2024.x development tools:",[15,718,719,722],{},[51,720,721],{},"Navigation:"," File Cabinet → SuiteBundles → Bundle 387395 (SuiteCommerce)",[15,724,725],{},"Download:",[122,727,728,733,738],{},[125,729,730],{},[393,731,732],{},"ExtensionDevelopmentTools-24.x.x.zip",[125,734,735],{},[393,736,737],{},"ThemeDevelopmentTools-24.x.x.zip",[125,739,740,741],{},"For SCA: ",[393,742,743],{},"SuiteCommerce Advanced Developer Tools-24.x.x.zip",[43,745,747],{"id":746},"version-control-setup","Version Control Setup",[15,749,750],{},"Your code should be in version control. Create an upgrade branch:",[386,752,754],{"className":609,"code":753,"language":611,"meta":391,"style":391},"# Create upgrade branch from production\ngit checkout production\ngit checkout -b upgrade\u002F2024.2\n\n# Commit current state\ngit add .\ngit commit -m \"Pre-upgrade snapshot - 2023.2\"\n",[393,755,756,761,774,787,791,796,806],{"__ignoreMap":391},[396,757,758],{"class":398,"line":399},[396,759,760],{"class":618},"# Create upgrade branch from production\n",[396,762,763,767,771],{"class":398,"line":405},[396,764,766],{"class":765},"sScJk","git",[396,768,770],{"class":769},"sZZnC"," checkout",[396,772,773],{"class":769}," production\n",[396,775,776,778,780,784],{"class":398,"line":412},[396,777,766],{"class":765},[396,779,770],{"class":769},[396,781,783],{"class":782},"sj4cs"," -b",[396,785,786],{"class":769}," upgrade\u002F2024.2\n",[396,788,789],{"class":398,"line":418},[396,790,409],{"emptyLinePlaceholder":408},[396,792,793],{"class":398,"line":424},[396,794,795],{"class":618},"# Commit current state\n",[396,797,798,800,803],{"class":398,"line":430},[396,799,766],{"class":765},[396,801,802],{"class":769}," add",[396,804,805],{"class":769}," .\n",[396,807,808,810,813,816],{"class":398,"line":436},[396,809,766],{"class":765},[396,811,812],{"class":769}," commit",[396,814,815],{"class":782}," -m",[396,817,818],{"class":769}," \"Pre-upgrade snapshot - 2023.2\"\n",[229,820],{},[28,822,824],{"id":823},"extension-migration","Extension Migration",[15,826,827],{},"Extensions are the most portable customizations—but they still need compatibility verification.",[43,829,831],{"id":830},"compatibility-testing-process","Compatibility Testing Process",[15,833,834],{},"For each extension:",[576,836,837],{},[125,838,839,842],{},[51,840,841],{},"Check manifest.json"," for version constraints:",[386,844,848],{"className":845,"code":846,"language":847,"meta":391,"style":391},"language-json shiki shiki-themes github-light github-dark","{\n    \"name\": \"CustomQuickView\",\n    \"version\": \"1.0.0\",\n    \"target_version\": {\n        \"minimum\": \"2020.1.0\",\n        \"maximum\": \"2024.2.0\"  \u002F\u002F Update this if needed\n    }\n}\n","json",[393,849,850,856,870,882,890,902,915,920],{"__ignoreMap":391},[396,851,852],{"class":398,"line":399},[396,853,855],{"class":854},"sVt8B","{\n",[396,857,858,861,864,867],{"class":398,"line":405},[396,859,860],{"class":782},"    \"name\"",[396,862,863],{"class":854},": ",[396,865,866],{"class":769},"\"CustomQuickView\"",[396,868,869],{"class":854},",\n",[396,871,872,875,877,880],{"class":398,"line":412},[396,873,874],{"class":782},"    \"version\"",[396,876,863],{"class":854},[396,878,879],{"class":769},"\"1.0.0\"",[396,881,869],{"class":854},[396,883,884,887],{"class":398,"line":418},[396,885,886],{"class":782},"    \"target_version\"",[396,888,889],{"class":854},": {\n",[396,891,892,895,897,900],{"class":398,"line":424},[396,893,894],{"class":782},"        \"minimum\"",[396,896,863],{"class":854},[396,898,899],{"class":769},"\"2020.1.0\"",[396,901,869],{"class":854},[396,903,904,907,909,912],{"class":398,"line":430},[396,905,906],{"class":782},"        \"maximum\"",[396,908,863],{"class":854},[396,910,911],{"class":769},"\"2024.2.0\"",[396,913,914],{"class":618},"  \u002F\u002F Update this if needed\n",[396,916,917],{"class":398,"line":436},[396,918,919],{"class":854},"    }\n",[396,921,922],{"class":398,"line":442},[396,923,924],{"class":854},"}\n",[576,926,927],{"start":405},[125,928,929,932],{},[51,930,931],{},"Test locally"," against 2024.x:",[386,934,936],{"className":609,"code":935,"language":611,"meta":391,"style":391},"# Fetch 2024.x base\ngulp extension:fetch\n\n# Deploy extension to local\ngulp extension:local\n",[393,937,938,943,951,955,960],{"__ignoreMap":391},[396,939,940],{"class":398,"line":399},[396,941,942],{"class":618},"# Fetch 2024.x base\n",[396,944,945,948],{"class":398,"line":405},[396,946,947],{"class":765},"gulp",[396,949,950],{"class":769}," extension:fetch\n",[396,952,953],{"class":398,"line":412},[396,954,409],{"emptyLinePlaceholder":408},[396,956,957],{"class":398,"line":418},[396,958,959],{"class":618},"# Deploy extension to local\n",[396,961,962,964],{"class":398,"line":424},[396,963,947],{"class":765},[396,965,966],{"class":769}," extension:local\n",[576,968,969,975],{"start":412},[125,970,971,974],{},[51,972,973],{},"Check browser console"," for errors",[125,976,977,980],{},[51,978,979],{},"Verify functionality"," manually",[43,982,984],{"id":983},"common-extension-issues","Common Extension Issues",[15,986,987],{},[51,988,989],{},"Issue: Backbone view errors",[386,991,995],{"className":992,"code":993,"language":994,"meta":391,"style":391},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F Old pattern (may fail)\nthis.constructor.__super__.initialize.apply(this, arguments);\n\n\u002F\u002F Updated pattern\nParentView.prototype.initialize.apply(this, arguments);\n","javascript",[393,996,997,1002,1033,1037,1042],{"__ignoreMap":391},[396,998,999],{"class":398,"line":399},[396,1000,1001],{"class":618},"\u002F\u002F Old pattern (may fail)\n",[396,1003,1004,1007,1010,1013,1016,1019,1022,1024,1027,1030],{"class":398,"line":405},[396,1005,1006],{"class":782},"this",[396,1008,1009],{"class":854},".",[396,1011,1012],{"class":782},"constructor",[396,1014,1015],{"class":854},".__super__.initialize.",[396,1017,1018],{"class":765},"apply",[396,1020,1021],{"class":854},"(",[396,1023,1006],{"class":782},[396,1025,1026],{"class":854},", ",[396,1028,1029],{"class":782},"arguments",[396,1031,1032],{"class":854},");\n",[396,1034,1035],{"class":398,"line":412},[396,1036,409],{"emptyLinePlaceholder":408},[396,1038,1039],{"class":398,"line":418},[396,1040,1041],{"class":618},"\u002F\u002F Updated pattern\n",[396,1043,1044,1047,1049,1052,1055,1057,1059,1061,1063,1065],{"class":398,"line":424},[396,1045,1046],{"class":782},"ParentView",[396,1048,1009],{"class":854},[396,1050,1051],{"class":782},"prototype",[396,1053,1054],{"class":854},".initialize.",[396,1056,1018],{"class":765},[396,1058,1021],{"class":854},[396,1060,1006],{"class":782},[396,1062,1026],{"class":854},[396,1064,1029],{"class":782},[396,1066,1032],{"class":854},[15,1068,1069],{},[51,1070,1071],{},"Issue: Template data undefined",[386,1073,1077],{"className":1074,"code":1075,"language":1076,"meta":391,"style":391},"language-handlebars shiki shiki-themes github-light github-dark","{{!-- If this worked before but fails now --}}\n{{item.custitem_field}}\n\n{{!-- Check if the model includes this field --}}\n{{#if item.custitem_field}}\n    {{item.custitem_field}}\n{{\u002Fif}}\n","handlebars",[393,1078,1079,1084,1089,1093,1098,1103,1108],{"__ignoreMap":391},[396,1080,1081],{"class":398,"line":399},[396,1082,1083],{},"{{!-- If this worked before but fails now --}}\n",[396,1085,1086],{"class":398,"line":405},[396,1087,1088],{},"{{item.custitem_field}}\n",[396,1090,1091],{"class":398,"line":412},[396,1092,409],{"emptyLinePlaceholder":408},[396,1094,1095],{"class":398,"line":418},[396,1096,1097],{},"{{!-- Check if the model includes this field --}}\n",[396,1099,1100],{"class":398,"line":424},[396,1101,1102],{},"{{#if item.custitem_field}}\n",[396,1104,1105],{"class":398,"line":430},[396,1106,1107],{},"    {{item.custitem_field}}\n",[396,1109,1110],{"class":398,"line":436},[396,1111,1112],{},"{{\u002Fif}}\n",[15,1114,1115],{},[51,1116,1117],{},"Issue: Service endpoint 404",[15,1119,1120],{},"Verify service URLs in your extension configuration match 2024.x patterns.",[43,1122,1124],{"id":1123},"updating-extensions-for-2024x","Updating Extensions for 2024.x",[15,1126,1127],{},"When an extension needs code changes:",[386,1129,1131],{"className":992,"code":1130,"language":994,"meta":391,"style":391},"\u002F\u002F extension\u002FJavaScript\u002FMyExtension.View.js\n\ndefine('MyExtension.View', [\n    'Backbone',\n    'my_extension.tpl'\n], function(Backbone, template) {\n    'use strict';\n    \n    return Backbone.View.extend({\n        template: template,\n        \n        \u002F\u002F 2024.x: Use events hash instead of deprecated bindEvents\n        events: {\n            'click [data-action=\"myAction\"]': 'handleAction'\n        },\n        \n        initialize: function(options) {\n            this.options = options;\n            \u002F\u002F 2024.x: Ensure model is bound correctly\n            this.model = options.model || this.options.application.getCart();\n        },\n        \n        \u002F\u002F 2024.x: getContext is now required for template data\n        getContext: function() {\n            return {\n                showFeature: this.model.get('enableFeature'),\n                items: this.model.get('items') || []\n            };\n        },\n        \n        handleAction: function(e) {\n            e.preventDefault();\n            \u002F\u002F Action logic\n        }\n    });\n});\n",[393,1132,1133,1138,1142,1155,1162,1167,1190,1198,1203,1217,1222,1227,1232,1237,1247,1252,1256,1272,1286,1291,1318,1322,1326,1331,1343,1351,1372,1396,1401,1406,1411,1428,1439,1445,1451,1457],{"__ignoreMap":391},[396,1134,1135],{"class":398,"line":399},[396,1136,1137],{"class":618},"\u002F\u002F extension\u002FJavaScript\u002FMyExtension.View.js\n",[396,1139,1140],{"class":398,"line":405},[396,1141,409],{"emptyLinePlaceholder":408},[396,1143,1144,1147,1149,1152],{"class":398,"line":412},[396,1145,1146],{"class":765},"define",[396,1148,1021],{"class":854},[396,1150,1151],{"class":769},"'MyExtension.View'",[396,1153,1154],{"class":854},", [\n",[396,1156,1157,1160],{"class":398,"line":418},[396,1158,1159],{"class":769},"    'Backbone'",[396,1161,869],{"class":854},[396,1163,1164],{"class":398,"line":424},[396,1165,1166],{"class":769},"    'my_extension.tpl'\n",[396,1168,1169,1172,1176,1178,1182,1184,1187],{"class":398,"line":430},[396,1170,1171],{"class":854},"], ",[396,1173,1175],{"class":1174},"szBVR","function",[396,1177,1021],{"class":854},[396,1179,1181],{"class":1180},"s4XuR","Backbone",[396,1183,1026],{"class":854},[396,1185,1186],{"class":1180},"template",[396,1188,1189],{"class":854},") {\n",[396,1191,1192,1195],{"class":398,"line":436},[396,1193,1194],{"class":769},"    'use strict'",[396,1196,1197],{"class":854},";\n",[396,1199,1200],{"class":398,"line":442},[396,1201,1202],{"class":854},"    \n",[396,1204,1205,1208,1211,1214],{"class":398,"line":448},[396,1206,1207],{"class":1174},"    return",[396,1209,1210],{"class":854}," Backbone.View.",[396,1212,1213],{"class":765},"extend",[396,1215,1216],{"class":854},"({\n",[396,1218,1219],{"class":398,"line":453},[396,1220,1221],{"class":854},"        template: template,\n",[396,1223,1224],{"class":398,"line":459},[396,1225,1226],{"class":854},"        \n",[396,1228,1229],{"class":398,"line":465},[396,1230,1231],{"class":618},"        \u002F\u002F 2024.x: Use events hash instead of deprecated bindEvents\n",[396,1233,1234],{"class":398,"line":471},[396,1235,1236],{"class":854},"        events: {\n",[396,1238,1239,1242,1244],{"class":398,"line":477},[396,1240,1241],{"class":769},"            'click [data-action=\"myAction\"]'",[396,1243,863],{"class":854},[396,1245,1246],{"class":769},"'handleAction'\n",[396,1248,1249],{"class":398,"line":483},[396,1250,1251],{"class":854},"        },\n",[396,1253,1254],{"class":398,"line":489},[396,1255,1226],{"class":854},[396,1257,1258,1261,1263,1265,1267,1270],{"class":398,"line":494},[396,1259,1260],{"class":765},"        initialize",[396,1262,863],{"class":854},[396,1264,1175],{"class":1174},[396,1266,1021],{"class":854},[396,1268,1269],{"class":1180},"options",[396,1271,1189],{"class":854},[396,1273,1274,1277,1280,1283],{"class":398,"line":500},[396,1275,1276],{"class":782},"            this",[396,1278,1279],{"class":854},".options ",[396,1281,1282],{"class":1174},"=",[396,1284,1285],{"class":854}," options;\n",[396,1287,1288],{"class":398,"line":506},[396,1289,1290],{"class":618},"            \u002F\u002F 2024.x: Ensure model is bound correctly\n",[396,1292,1293,1295,1298,1300,1303,1306,1309,1312,1315],{"class":398,"line":512},[396,1294,1276],{"class":782},[396,1296,1297],{"class":854},".model ",[396,1299,1282],{"class":1174},[396,1301,1302],{"class":854}," options.model ",[396,1304,1305],{"class":1174},"||",[396,1307,1308],{"class":782}," this",[396,1310,1311],{"class":854},".options.application.",[396,1313,1314],{"class":765},"getCart",[396,1316,1317],{"class":854},"();\n",[396,1319,1320],{"class":398,"line":518},[396,1321,1251],{"class":854},[396,1323,1324],{"class":398,"line":524},[396,1325,1226],{"class":854},[396,1327,1328],{"class":398,"line":529},[396,1329,1330],{"class":618},"        \u002F\u002F 2024.x: getContext is now required for template data\n",[396,1332,1333,1336,1338,1340],{"class":398,"line":535},[396,1334,1335],{"class":765},"        getContext",[396,1337,863],{"class":854},[396,1339,1175],{"class":1174},[396,1341,1342],{"class":854},"() {\n",[396,1344,1345,1348],{"class":398,"line":541},[396,1346,1347],{"class":1174},"            return",[396,1349,1350],{"class":854}," {\n",[396,1352,1353,1356,1358,1361,1364,1366,1369],{"class":398,"line":547},[396,1354,1355],{"class":854},"                showFeature: ",[396,1357,1006],{"class":782},[396,1359,1360],{"class":854},".model.",[396,1362,1363],{"class":765},"get",[396,1365,1021],{"class":854},[396,1367,1368],{"class":769},"'enableFeature'",[396,1370,1371],{"class":854},"),\n",[396,1373,1374,1377,1379,1381,1383,1385,1388,1391,1393],{"class":398,"line":553},[396,1375,1376],{"class":854},"                items: ",[396,1378,1006],{"class":782},[396,1380,1360],{"class":854},[396,1382,1363],{"class":765},[396,1384,1021],{"class":854},[396,1386,1387],{"class":769},"'items'",[396,1389,1390],{"class":854},") ",[396,1392,1305],{"class":1174},[396,1394,1395],{"class":854}," []\n",[396,1397,1398],{"class":398,"line":559},[396,1399,1400],{"class":854},"            };\n",[396,1402,1404],{"class":398,"line":1403},29,[396,1405,1251],{"class":854},[396,1407,1409],{"class":398,"line":1408},30,[396,1410,1226],{"class":854},[396,1412,1414,1417,1419,1421,1423,1426],{"class":398,"line":1413},31,[396,1415,1416],{"class":765},"        handleAction",[396,1418,863],{"class":854},[396,1420,1175],{"class":1174},[396,1422,1021],{"class":854},[396,1424,1425],{"class":1180},"e",[396,1427,1189],{"class":854},[396,1429,1431,1434,1437],{"class":398,"line":1430},32,[396,1432,1433],{"class":854},"            e.",[396,1435,1436],{"class":765},"preventDefault",[396,1438,1317],{"class":854},[396,1440,1442],{"class":398,"line":1441},33,[396,1443,1444],{"class":618},"            \u002F\u002F Action logic\n",[396,1446,1448],{"class":398,"line":1447},34,[396,1449,1450],{"class":854},"        }\n",[396,1452,1454],{"class":398,"line":1453},35,[396,1455,1456],{"class":854},"    });\n",[396,1458,1460],{"class":398,"line":1459},36,[396,1461,1462],{"class":854},"});\n",[43,1464,1466],{"id":1465},"extension-re-deployment","Extension Re-deployment",[15,1468,1469],{},"After updating:",[386,1471,1473],{"className":609,"code":1472,"language":611,"meta":391,"style":391},"# Validate extension\ngulp extension:validate\n\n# Deploy to sandbox\ngulp extension:deploy --to sandbox\n\n# Test thoroughly\n",[393,1474,1475,1480,1487,1491,1496,1509,1513],{"__ignoreMap":391},[396,1476,1477],{"class":398,"line":399},[396,1478,1479],{"class":618},"# Validate extension\n",[396,1481,1482,1484],{"class":398,"line":405},[396,1483,947],{"class":765},[396,1485,1486],{"class":769}," extension:validate\n",[396,1488,1489],{"class":398,"line":412},[396,1490,409],{"emptyLinePlaceholder":408},[396,1492,1493],{"class":398,"line":418},[396,1494,1495],{"class":618},"# Deploy to sandbox\n",[396,1497,1498,1500,1503,1506],{"class":398,"line":424},[396,1499,947],{"class":765},[396,1501,1502],{"class":769}," extension:deploy",[396,1504,1505],{"class":782}," --to",[396,1507,1508],{"class":769}," sandbox\n",[396,1510,1511],{"class":398,"line":430},[396,1512,409],{"emptyLinePlaceholder":408},[396,1514,1515],{"class":398,"line":436},[396,1516,1517],{"class":618},"# Test thoroughly\n",[229,1519],{},[28,1521,1523],{"id":1522},"theme-migration","Theme Migration",[15,1525,1526],{},"Theme migration complexity depends on whether you're using the newer fallback architecture or traditional full themes.",[43,1528,1530],{"id":1529},"fallback-theme-migration","Fallback Theme Migration",[15,1532,1533],{},"If you're already using fallback themes, migration is straightforward:",[576,1535,1536],{},[125,1537,1538,1541],{},[51,1539,1540],{},"Update base_theme reference"," in manifest.json:",[386,1543,1545],{"className":845,"code":1544,"language":847,"meta":391,"style":391},"{\n    \"name\": \"myTheme\",\n    \"base_theme\": \"starter_theme_2024\"  \u002F\u002F Update to 2024.x base\n}\n",[393,1546,1547,1551,1562,1575],{"__ignoreMap":391},[396,1548,1549],{"class":398,"line":399},[396,1550,855],{"class":854},[396,1552,1553,1555,1557,1560],{"class":398,"line":405},[396,1554,860],{"class":782},[396,1556,863],{"class":854},[396,1558,1559],{"class":769},"\"myTheme\"",[396,1561,869],{"class":854},[396,1563,1564,1567,1569,1572],{"class":398,"line":412},[396,1565,1566],{"class":782},"    \"base_theme\"",[396,1568,863],{"class":854},[396,1570,1571],{"class":769},"\"starter_theme_2024\"",[396,1573,1574],{"class":618},"  \u002F\u002F Update to 2024.x base\n",[396,1576,1577],{"class":398,"line":418},[396,1578,924],{"class":854},[576,1580,1581,1587],{"start":405},[125,1582,1583,1586],{},[51,1584,1585],{},"Review override files"," for deprecated classes or variables",[125,1588,1589,1592],{},[51,1590,1591],{},"Test"," with new development tools:",[386,1594,1596],{"className":609,"code":1595,"language":611,"meta":391,"style":391},"gulp theme:local\n",[393,1597,1598],{"__ignoreMap":391},[396,1599,1600,1602],{"class":398,"line":399},[396,1601,947],{"class":765},[396,1603,1604],{"class":769}," theme:local\n",[43,1606,1608],{"id":1607},"full-theme-migration-sca","Full Theme Migration (SCA)",[15,1610,1611],{},"For traditional SCA themes with full source code, you have two options:",[15,1613,1614],{},[51,1615,1616],{},"Option A: Convert to Fallback Theme (Recommended)",[15,1618,1619],{},"This is more upfront work but dramatically simplifies future upgrades:",[576,1621,1622,1625,1628,1631,1634],{},[125,1623,1624],{},"Install 2024.x starter theme as base",[125,1626,1627],{},"Identify which files you actually modified",[125,1629,1630],{},"Copy only modified files to new fallback theme structure",[125,1632,1633],{},"Update manifest.json with fallback configuration",[125,1635,1636],{},"Test thoroughly",[15,1638,1639],{},[51,1640,1641],{},"Option B: Manual Merge",[15,1643,1644],{},"More error-prone but preserves your existing structure:",[576,1646,1647,1650,1653,1656],{},[125,1648,1649],{},"Get diff between your theme and original 2023.x base",[125,1651,1652],{},"Apply same modifications to 2024.x base",[125,1654,1655],{},"Resolve conflicts manually",[125,1657,1658],{},"Test every modified file",[43,1660,1662],{"id":1661},"sass-variable-updates","SASS Variable Updates",[15,1664,1665],{},"Check for deprecated or renamed variables:",[386,1667,1671],{"className":1668,"code":1669,"language":1670,"meta":391,"style":391},"language-scss shiki shiki-themes github-light github-dark","\u002F\u002F 2023.x variable\n$sc-color-theme-bg: #f5f5f5;\n\n\u002F\u002F 2024.x renamed to\n$sc-color-theme-background: #f5f5f5;\n","scss",[393,1672,1673,1678,1690,1694,1699],{"__ignoreMap":391},[396,1674,1675],{"class":398,"line":399},[396,1676,1677],{"class":618},"\u002F\u002F 2023.x variable\n",[396,1679,1680,1683,1685,1688],{"class":398,"line":405},[396,1681,1682],{"class":1180},"$sc-color-theme-bg",[396,1684,863],{"class":854},[396,1686,1687],{"class":782},"#f5f5f5",[396,1689,1197],{"class":854},[396,1691,1692],{"class":398,"line":412},[396,1693,409],{"emptyLinePlaceholder":408},[396,1695,1696],{"class":398,"line":418},[396,1697,1698],{"class":618},"\u002F\u002F 2024.x renamed to\n",[396,1700,1701,1704,1706,1708],{"class":398,"line":424},[396,1702,1703],{"class":1180},"$sc-color-theme-background",[396,1705,863],{"class":854},[396,1707,1687],{"class":782},[396,1709,1197],{"class":854},[15,1711,1712,1715],{},[51,1713,1714],{},"Quick fix:"," Add aliases in your custom SASS:",[386,1717,1719],{"className":1668,"code":1718,"language":1670,"meta":391,"style":391},"\u002F\u002F Bridge for renamed variables\n$sc-color-theme-bg: $sc-color-theme-background !default;\n",[393,1720,1721,1726],{"__ignoreMap":391},[396,1722,1723],{"class":398,"line":399},[396,1724,1725],{"class":618},"\u002F\u002F Bridge for renamed variables\n",[396,1727,1728,1730,1732,1734,1737],{"class":398,"line":405},[396,1729,1682],{"class":1180},[396,1731,863],{"class":854},[396,1733,1703],{"class":1180},[396,1735,1736],{"class":1174}," !default",[396,1738,1197],{"class":854},[43,1740,1742],{"id":1741},"template-migration","Template Migration",[15,1744,1745],{},"Compare templates between versions for structural changes:",[386,1747,1749],{"className":609,"code":1748,"language":611,"meta":391,"style":391},"# Diff specific template\ndiff Themes\u002FMyTheme\u002FModules\u002FHeader@1.0.0\u002FTemplates\u002Fheader.tpl \\\n     Themes\u002FStarterTheme2024\u002FModules\u002FHeader@2.0.0\u002FTemplates\u002Fheader.tpl\n",[393,1750,1751,1756,1767],{"__ignoreMap":391},[396,1752,1753],{"class":398,"line":399},[396,1754,1755],{"class":618},"# Diff specific template\n",[396,1757,1758,1761,1764],{"class":398,"line":405},[396,1759,1760],{"class":765},"diff",[396,1762,1763],{"class":769}," Themes\u002FMyTheme\u002FModules\u002FHeader@1.0.0\u002FTemplates\u002Fheader.tpl",[396,1765,1766],{"class":782}," \\\n",[396,1768,1769],{"class":398,"line":412},[396,1770,1771],{"class":769},"     Themes\u002FStarterTheme2024\u002FModules\u002FHeader@2.0.0\u002FTemplates\u002Fheader.tpl\n",[15,1773,1774],{},"Look for:",[122,1776,1777,1780,1783,1786],{},[125,1778,1779],{},"New data-attributes",[125,1781,1782],{},"Changed context variables",[125,1784,1785],{},"New child views",[125,1787,1788],{},"Modified structure",[229,1790],{},[28,1792,1794],{"id":1793},"suitescript-migration-sca-only","SuiteScript Migration (SCA Only)",[15,1796,1797],{},"SCA customizations often include SuiteScript services and modified models. These require careful migration.",[43,1799,1801],{"id":1800},"service-controller-updates","Service Controller Updates",[15,1803,1804],{},"Check for API changes in service controllers:",[386,1806,1808],{"className":992,"code":1807,"language":994,"meta":391,"style":391},"\u002F\u002F services\u002FMyCustom.Service.ss\n\n\u002F\u002F 2023.x pattern\nfunction service(request) {\n    var response = require('SC.Response');\n    \u002F\u002F ...\n}\n\n\u002F\u002F 2024.x - verify require paths still valid\ndefine('MyCustom.Service', [\n    'Application',\n    'SC.Response',\n    'MyCustom.Model'\n], function(Application, Response, Model) {\n    'use strict';\n    \n    Application.registerService({\n        name: 'MyCustom.Service',\n        \n        get: function() {\n            return Model.get(this.request.getParameter('id'));\n        },\n        \n        post: function() {\n            var data = JSON.parse(this.request.getBody());\n            return Model.create(data);\n        }\n    });\n});\n",[393,1809,1810,1815,1819,1824,1838,1858,1863,1867,1871,1876,1887,1894,1901,1906,1929,1935,1939,1949,1958,1962,1973,2000,2004,2008,2019,2049,2061,2065,2069],{"__ignoreMap":391},[396,1811,1812],{"class":398,"line":399},[396,1813,1814],{"class":618},"\u002F\u002F services\u002FMyCustom.Service.ss\n",[396,1816,1817],{"class":398,"line":405},[396,1818,409],{"emptyLinePlaceholder":408},[396,1820,1821],{"class":398,"line":412},[396,1822,1823],{"class":618},"\u002F\u002F 2023.x pattern\n",[396,1825,1826,1828,1831,1833,1836],{"class":398,"line":418},[396,1827,1175],{"class":1174},[396,1829,1830],{"class":765}," service",[396,1832,1021],{"class":854},[396,1834,1835],{"class":1180},"request",[396,1837,1189],{"class":854},[396,1839,1840,1843,1846,1848,1851,1853,1856],{"class":398,"line":424},[396,1841,1842],{"class":1174},"    var",[396,1844,1845],{"class":854}," response ",[396,1847,1282],{"class":1174},[396,1849,1850],{"class":765}," require",[396,1852,1021],{"class":854},[396,1854,1855],{"class":769},"'SC.Response'",[396,1857,1032],{"class":854},[396,1859,1860],{"class":398,"line":430},[396,1861,1862],{"class":618},"    \u002F\u002F ...\n",[396,1864,1865],{"class":398,"line":436},[396,1866,924],{"class":854},[396,1868,1869],{"class":398,"line":442},[396,1870,409],{"emptyLinePlaceholder":408},[396,1872,1873],{"class":398,"line":448},[396,1874,1875],{"class":618},"\u002F\u002F 2024.x - verify require paths still valid\n",[396,1877,1878,1880,1882,1885],{"class":398,"line":453},[396,1879,1146],{"class":765},[396,1881,1021],{"class":854},[396,1883,1884],{"class":769},"'MyCustom.Service'",[396,1886,1154],{"class":854},[396,1888,1889,1892],{"class":398,"line":459},[396,1890,1891],{"class":769},"    'Application'",[396,1893,869],{"class":854},[396,1895,1896,1899],{"class":398,"line":465},[396,1897,1898],{"class":769},"    'SC.Response'",[396,1900,869],{"class":854},[396,1902,1903],{"class":398,"line":471},[396,1904,1905],{"class":769},"    'MyCustom.Model'\n",[396,1907,1908,1910,1912,1914,1917,1919,1922,1924,1927],{"class":398,"line":477},[396,1909,1171],{"class":854},[396,1911,1175],{"class":1174},[396,1913,1021],{"class":854},[396,1915,1916],{"class":1180},"Application",[396,1918,1026],{"class":854},[396,1920,1921],{"class":1180},"Response",[396,1923,1026],{"class":854},[396,1925,1926],{"class":1180},"Model",[396,1928,1189],{"class":854},[396,1930,1931,1933],{"class":398,"line":483},[396,1932,1194],{"class":769},[396,1934,1197],{"class":854},[396,1936,1937],{"class":398,"line":489},[396,1938,1202],{"class":854},[396,1940,1941,1944,1947],{"class":398,"line":494},[396,1942,1943],{"class":854},"    Application.",[396,1945,1946],{"class":765},"registerService",[396,1948,1216],{"class":854},[396,1950,1951,1954,1956],{"class":398,"line":500},[396,1952,1953],{"class":854},"        name: ",[396,1955,1884],{"class":769},[396,1957,869],{"class":854},[396,1959,1960],{"class":398,"line":506},[396,1961,1226],{"class":854},[396,1963,1964,1967,1969,1971],{"class":398,"line":512},[396,1965,1966],{"class":765},"        get",[396,1968,863],{"class":854},[396,1970,1175],{"class":1174},[396,1972,1342],{"class":854},[396,1974,1975,1977,1980,1982,1984,1986,1989,1992,1994,1997],{"class":398,"line":518},[396,1976,1347],{"class":1174},[396,1978,1979],{"class":854}," Model.",[396,1981,1363],{"class":765},[396,1983,1021],{"class":854},[396,1985,1006],{"class":782},[396,1987,1988],{"class":854},".request.",[396,1990,1991],{"class":765},"getParameter",[396,1993,1021],{"class":854},[396,1995,1996],{"class":769},"'id'",[396,1998,1999],{"class":854},"));\n",[396,2001,2002],{"class":398,"line":524},[396,2003,1251],{"class":854},[396,2005,2006],{"class":398,"line":529},[396,2007,1226],{"class":854},[396,2009,2010,2013,2015,2017],{"class":398,"line":535},[396,2011,2012],{"class":765},"        post",[396,2014,863],{"class":854},[396,2016,1175],{"class":1174},[396,2018,1342],{"class":854},[396,2020,2021,2024,2027,2029,2032,2034,2037,2039,2041,2043,2046],{"class":398,"line":541},[396,2022,2023],{"class":1174},"            var",[396,2025,2026],{"class":854}," data ",[396,2028,1282],{"class":1174},[396,2030,2031],{"class":782}," JSON",[396,2033,1009],{"class":854},[396,2035,2036],{"class":765},"parse",[396,2038,1021],{"class":854},[396,2040,1006],{"class":782},[396,2042,1988],{"class":854},[396,2044,2045],{"class":765},"getBody",[396,2047,2048],{"class":854},"());\n",[396,2050,2051,2053,2055,2058],{"class":398,"line":547},[396,2052,1347],{"class":1174},[396,2054,1979],{"class":854},[396,2056,2057],{"class":765},"create",[396,2059,2060],{"class":854},"(data);\n",[396,2062,2063],{"class":398,"line":553},[396,2064,1450],{"class":854},[396,2066,2067],{"class":398,"line":559},[396,2068,1456],{"class":854},[396,2070,2071],{"class":398,"line":1403},[396,2072,1462],{"class":854},[43,2074,2076],{"id":2075},"model-layer-changes","Model Layer Changes",[15,2078,2079],{},"Check if your custom models extend base models that changed:",[386,2081,2083],{"className":992,"code":2082,"language":994,"meta":391,"style":391},"\u002F\u002F Models\u002FMyCustomProduct.Model.js\n\ndefine('MyCustomProduct.Model', [\n    'Product.Model',  \u002F\u002F Check if this changed in 2024.x\n    'underscore'\n], function(ProductModel, _) {\n    'use strict';\n    \n    return ProductModel.extend({\n        \u002F\u002F Override methods - verify parent method signatures\n        get: function(id, options) {\n            var result = ProductModel.prototype.get.apply(this, arguments);\n            \n            \u002F\u002F Your custom additions\n            result.custom_field = this.getCustomField(id);\n            \n            return result;\n        }\n    });\n});\n",[393,2084,2085,2090,2094,2105,2116,2121,2139,2145,2149,2160,2165,2184,2215,2220,2225,2242,2246,2253,2257,2261],{"__ignoreMap":391},[396,2086,2087],{"class":398,"line":399},[396,2088,2089],{"class":618},"\u002F\u002F Models\u002FMyCustomProduct.Model.js\n",[396,2091,2092],{"class":398,"line":405},[396,2093,409],{"emptyLinePlaceholder":408},[396,2095,2096,2098,2100,2103],{"class":398,"line":412},[396,2097,1146],{"class":765},[396,2099,1021],{"class":854},[396,2101,2102],{"class":769},"'MyCustomProduct.Model'",[396,2104,1154],{"class":854},[396,2106,2107,2110,2113],{"class":398,"line":418},[396,2108,2109],{"class":769},"    'Product.Model'",[396,2111,2112],{"class":854},",  ",[396,2114,2115],{"class":618},"\u002F\u002F Check if this changed in 2024.x\n",[396,2117,2118],{"class":398,"line":424},[396,2119,2120],{"class":769},"    'underscore'\n",[396,2122,2123,2125,2127,2129,2132,2134,2137],{"class":398,"line":430},[396,2124,1171],{"class":854},[396,2126,1175],{"class":1174},[396,2128,1021],{"class":854},[396,2130,2131],{"class":1180},"ProductModel",[396,2133,1026],{"class":854},[396,2135,2136],{"class":1180},"_",[396,2138,1189],{"class":854},[396,2140,2141,2143],{"class":398,"line":436},[396,2142,1194],{"class":769},[396,2144,1197],{"class":854},[396,2146,2147],{"class":398,"line":442},[396,2148,1202],{"class":854},[396,2150,2151,2153,2156,2158],{"class":398,"line":448},[396,2152,1207],{"class":1174},[396,2154,2155],{"class":854}," ProductModel.",[396,2157,1213],{"class":765},[396,2159,1216],{"class":854},[396,2161,2162],{"class":398,"line":453},[396,2163,2164],{"class":618},"        \u002F\u002F Override methods - verify parent method signatures\n",[396,2166,2167,2169,2171,2173,2175,2178,2180,2182],{"class":398,"line":459},[396,2168,1966],{"class":765},[396,2170,863],{"class":854},[396,2172,1175],{"class":1174},[396,2174,1021],{"class":854},[396,2176,2177],{"class":1180},"id",[396,2179,1026],{"class":854},[396,2181,1269],{"class":1180},[396,2183,1189],{"class":854},[396,2185,2186,2188,2191,2193,2196,2198,2200,2203,2205,2207,2209,2211,2213],{"class":398,"line":465},[396,2187,2023],{"class":1174},[396,2189,2190],{"class":854}," result ",[396,2192,1282],{"class":1174},[396,2194,2195],{"class":782}," ProductModel",[396,2197,1009],{"class":854},[396,2199,1051],{"class":782},[396,2201,2202],{"class":854},".get.",[396,2204,1018],{"class":765},[396,2206,1021],{"class":854},[396,2208,1006],{"class":782},[396,2210,1026],{"class":854},[396,2212,1029],{"class":782},[396,2214,1032],{"class":854},[396,2216,2217],{"class":398,"line":471},[396,2218,2219],{"class":854},"            \n",[396,2221,2222],{"class":398,"line":477},[396,2223,2224],{"class":618},"            \u002F\u002F Your custom additions\n",[396,2226,2227,2230,2232,2234,2236,2239],{"class":398,"line":483},[396,2228,2229],{"class":854},"            result.custom_field ",[396,2231,1282],{"class":1174},[396,2233,1308],{"class":782},[396,2235,1009],{"class":854},[396,2237,2238],{"class":765},"getCustomField",[396,2240,2241],{"class":854},"(id);\n",[396,2243,2244],{"class":398,"line":489},[396,2245,2219],{"class":854},[396,2247,2248,2250],{"class":398,"line":494},[396,2249,1347],{"class":1174},[396,2251,2252],{"class":854}," result;\n",[396,2254,2255],{"class":398,"line":500},[396,2256,1450],{"class":854},[396,2258,2259],{"class":398,"line":506},[396,2260,1456],{"class":854},[396,2262,2263],{"class":398,"line":512},[396,2264,1462],{"class":854},[43,2266,2268],{"id":2267},"testing-suitescript-changes","Testing SuiteScript Changes",[386,2270,2272],{"className":609,"code":2271,"language":611,"meta":391,"style":391},"# Deploy to sandbox for testing\ngulp ssp:deploy --to sandbox\n\n# Test all custom endpoints\ncurl -X GET \"https:\u002F\u002Fsandbox.netsuite.com\u002Fapi\u002Fmycustom?id=123\" \\\n     -H \"Authorization: Bearer YOUR_TOKEN\"\n",[393,2273,2274,2279,2290,2294,2299,2315],{"__ignoreMap":391},[396,2275,2276],{"class":398,"line":399},[396,2277,2278],{"class":618},"# Deploy to sandbox for testing\n",[396,2280,2281,2283,2286,2288],{"class":398,"line":405},[396,2282,947],{"class":765},[396,2284,2285],{"class":769}," ssp:deploy",[396,2287,1505],{"class":782},[396,2289,1508],{"class":769},[396,2291,2292],{"class":398,"line":412},[396,2293,409],{"emptyLinePlaceholder":408},[396,2295,2296],{"class":398,"line":418},[396,2297,2298],{"class":618},"# Test all custom endpoints\n",[396,2300,2301,2304,2307,2310,2313],{"class":398,"line":424},[396,2302,2303],{"class":765},"curl",[396,2305,2306],{"class":782}," -X",[396,2308,2309],{"class":769}," GET",[396,2311,2312],{"class":769}," \"https:\u002F\u002Fsandbox.netsuite.com\u002Fapi\u002Fmycustom?id=123\"",[396,2314,1766],{"class":782},[396,2316,2317,2320],{"class":398,"line":430},[396,2318,2319],{"class":782},"     -H",[396,2321,2322],{"class":769}," \"Authorization: Bearer YOUR_TOKEN\"\n",[229,2324],{},[28,2326,2328],{"id":2327},"testing-methodology","Testing Methodology",[15,2330,2331],{},"Comprehensive testing prevents post-deployment disasters. Follow this methodology systematically.",[43,2333,2335],{"id":2334},"functional-testing-checklist","Functional Testing Checklist",[386,2337,2339],{"className":388,"code":2338,"language":390,"meta":391,"style":391},"## Core Functionality Tests\n\n### Shopping Flow\n- [ ] Homepage loads correctly\n- [ ] Category navigation works\n- [ ] Product listing displays correctly\n- [ ] Faceted search filters function\n- [ ] Product detail pages render\n- [ ] Image galleries work\n- [ ] Add to cart functions\n- [ ] Cart updates correctly\n- [ ] Quantity changes work\n\n### Checkout Flow\n- [ ] Guest checkout works\n- [ ] Registered user checkout works\n- [ ] Address validation functions\n- [ ] Shipping methods display\n- [ ] Payment processing works (use test mode)\n- [ ] Order confirmation displays\n- [ ] Order emails send\n\n### MyAccount\n- [ ] Login\u002Flogout works\n- [ ] Order history displays\n- [ ] Address book functions\n- [ ] Payment methods manageable\n- [ ] Account details editable\n\n### B2B Features (if applicable)\n- [ ] Quote request functions\n- [ ] Approval workflows work\n- [ ] Purchase orders process\n- [ ] Account hierarchy displays\n\n### Mobile\n- [ ] All above tests pass on mobile devices\n- [ ] Touch interactions work\n- [ ] Mobile navigation functions\n",[393,2340,2341,2346,2350,2355,2360,2365,2370,2375,2380,2385,2390,2395,2400,2404,2409,2414,2419,2424,2429,2434,2439,2444,2448,2453,2458,2463,2468,2473,2478,2482,2487,2492,2497,2502,2507,2511,2516,2522,2528],{"__ignoreMap":391},[396,2342,2343],{"class":398,"line":399},[396,2344,2345],{},"## Core Functionality Tests\n",[396,2347,2348],{"class":398,"line":405},[396,2349,409],{"emptyLinePlaceholder":408},[396,2351,2352],{"class":398,"line":412},[396,2353,2354],{},"### Shopping Flow\n",[396,2356,2357],{"class":398,"line":418},[396,2358,2359],{},"- [ ] Homepage loads correctly\n",[396,2361,2362],{"class":398,"line":424},[396,2363,2364],{},"- [ ] Category navigation works\n",[396,2366,2367],{"class":398,"line":430},[396,2368,2369],{},"- [ ] Product listing displays correctly\n",[396,2371,2372],{"class":398,"line":436},[396,2373,2374],{},"- [ ] Faceted search filters function\n",[396,2376,2377],{"class":398,"line":442},[396,2378,2379],{},"- [ ] Product detail pages render\n",[396,2381,2382],{"class":398,"line":448},[396,2383,2384],{},"- [ ] Image galleries work\n",[396,2386,2387],{"class":398,"line":453},[396,2388,2389],{},"- [ ] Add to cart functions\n",[396,2391,2392],{"class":398,"line":459},[396,2393,2394],{},"- [ ] Cart updates correctly\n",[396,2396,2397],{"class":398,"line":465},[396,2398,2399],{},"- [ ] Quantity changes work\n",[396,2401,2402],{"class":398,"line":471},[396,2403,409],{"emptyLinePlaceholder":408},[396,2405,2406],{"class":398,"line":477},[396,2407,2408],{},"### Checkout Flow\n",[396,2410,2411],{"class":398,"line":483},[396,2412,2413],{},"- [ ] Guest checkout works\n",[396,2415,2416],{"class":398,"line":489},[396,2417,2418],{},"- [ ] Registered user checkout works\n",[396,2420,2421],{"class":398,"line":494},[396,2422,2423],{},"- [ ] Address validation functions\n",[396,2425,2426],{"class":398,"line":500},[396,2427,2428],{},"- [ ] Shipping methods display\n",[396,2430,2431],{"class":398,"line":506},[396,2432,2433],{},"- [ ] Payment processing works (use test mode)\n",[396,2435,2436],{"class":398,"line":512},[396,2437,2438],{},"- [ ] Order confirmation displays\n",[396,2440,2441],{"class":398,"line":518},[396,2442,2443],{},"- [ ] Order emails send\n",[396,2445,2446],{"class":398,"line":524},[396,2447,409],{"emptyLinePlaceholder":408},[396,2449,2450],{"class":398,"line":529},[396,2451,2452],{},"### MyAccount\n",[396,2454,2455],{"class":398,"line":535},[396,2456,2457],{},"- [ ] Login\u002Flogout works\n",[396,2459,2460],{"class":398,"line":541},[396,2461,2462],{},"- [ ] Order history displays\n",[396,2464,2465],{"class":398,"line":547},[396,2466,2467],{},"- [ ] Address book functions\n",[396,2469,2470],{"class":398,"line":553},[396,2471,2472],{},"- [ ] Payment methods manageable\n",[396,2474,2475],{"class":398,"line":559},[396,2476,2477],{},"- [ ] Account details editable\n",[396,2479,2480],{"class":398,"line":1403},[396,2481,409],{"emptyLinePlaceholder":408},[396,2483,2484],{"class":398,"line":1408},[396,2485,2486],{},"### B2B Features (if applicable)\n",[396,2488,2489],{"class":398,"line":1413},[396,2490,2491],{},"- [ ] Quote request functions\n",[396,2493,2494],{"class":398,"line":1430},[396,2495,2496],{},"- [ ] Approval workflows work\n",[396,2498,2499],{"class":398,"line":1441},[396,2500,2501],{},"- [ ] Purchase orders process\n",[396,2503,2504],{"class":398,"line":1447},[396,2505,2506],{},"- [ ] Account hierarchy displays\n",[396,2508,2509],{"class":398,"line":1453},[396,2510,409],{"emptyLinePlaceholder":408},[396,2512,2513],{"class":398,"line":1459},[396,2514,2515],{},"### Mobile\n",[396,2517,2519],{"class":398,"line":2518},37,[396,2520,2521],{},"- [ ] All above tests pass on mobile devices\n",[396,2523,2525],{"class":398,"line":2524},38,[396,2526,2527],{},"- [ ] Touch interactions work\n",[396,2529,2531],{"class":398,"line":2530},39,[396,2532,2533],{},"- [ ] Mobile navigation functions\n",[43,2535,2537],{"id":2536},"performance-testing","Performance Testing",[15,2539,2540],{},"Compare performance metrics before and after:",[386,2542,2544],{"className":609,"code":2543,"language":611,"meta":391,"style":391},"# Run Lighthouse on staging\nlighthouse https:\u002F\u002Fsandbox.yoursite.com \\\n    --output=json \\\n    --output-path=.\u002Flighthouse-2024-upgrade.json\n\n# Compare to pre-upgrade baseline\n",[393,2545,2546,2551,2561,2568,2573,2577],{"__ignoreMap":391},[396,2547,2548],{"class":398,"line":399},[396,2549,2550],{"class":618},"# Run Lighthouse on staging\n",[396,2552,2553,2556,2559],{"class":398,"line":405},[396,2554,2555],{"class":765},"lighthouse",[396,2557,2558],{"class":769}," https:\u002F\u002Fsandbox.yoursite.com",[396,2560,1766],{"class":782},[396,2562,2563,2566],{"class":398,"line":412},[396,2564,2565],{"class":782},"    --output=json",[396,2567,1766],{"class":782},[396,2569,2570],{"class":398,"line":418},[396,2571,2572],{"class":782},"    --output-path=.\u002Flighthouse-2024-upgrade.json\n",[396,2574,2575],{"class":398,"line":424},[396,2576,409],{"emptyLinePlaceholder":408},[396,2578,2579],{"class":398,"line":430},[396,2580,2581],{"class":618},"# Compare to pre-upgrade baseline\n",[15,2583,2584],{},[51,2585,2586],{},"Key metrics to compare:",[56,2588,2589,2601],{},[59,2590,2591],{},[62,2592,2593,2595,2598],{},[65,2594,67],{},[65,2596,2597],{},"Acceptable Regression",[65,2599,2600],{},"Investigate If",[72,2602,2603,2613,2623,2634],{},[62,2604,2605,2607,2610],{},[77,2606,95],{},[77,2608,2609],{},"+200ms",[77,2611,2612],{},"> +500ms",[62,2614,2615,2617,2620],{},[77,2616,87],{},[77,2618,2619],{},"+100ms",[77,2621,2622],{},"> +300ms",[62,2624,2625,2628,2631],{},[77,2626,2627],{},"CLS",[77,2629,2630],{},"+0.02",[77,2632,2633],{},"> 0.05",[62,2635,2636,2639,2642],{},[77,2637,2638],{},"TBT",[77,2640,2641],{},"+50ms",[77,2643,2644],{},"> +200ms",[43,2646,2648],{"id":2647},"cross-browser-testing","Cross-Browser Testing",[15,2650,2651],{},"Test on these minimum browser versions:",[122,2653,2654,2657,2660,2663,2666,2669],{},[125,2655,2656],{},"Chrome (latest 2 versions)",[125,2658,2659],{},"Firefox (latest 2 versions)",[125,2661,2662],{},"Safari (latest 2 versions)",[125,2664,2665],{},"Edge (latest 2 versions)",[125,2667,2668],{},"iOS Safari (latest)",[125,2670,2671],{},"Chrome for Android (latest)",[43,2673,2675],{"id":2674},"regression-testing","Regression Testing",[15,2677,2678],{},"Document and verify any custom functionality:",[386,2680,2682],{"className":388,"code":2681,"language":390,"meta":391,"style":391},"## Custom Feature Tests\n\n### Custom Quick View Extension\n- [ ] Quick view button appears on product list\n- [ ] Modal opens with product details\n- [ ] Add to cart from modal works\n- [ ] Modal closes correctly\n- [ ] Keyboard accessibility (Escape to close)\n\n### Custom Shipping Calculator\n- [ ] Calculator appears in cart\n- [ ] Postal code input works\n- [ ] Shipping options display\n- [ ] Rates are accurate\n",[393,2683,2684,2689,2693,2698,2703,2708,2713,2718,2723,2727,2732,2737,2742,2747],{"__ignoreMap":391},[396,2685,2686],{"class":398,"line":399},[396,2687,2688],{},"## Custom Feature Tests\n",[396,2690,2691],{"class":398,"line":405},[396,2692,409],{"emptyLinePlaceholder":408},[396,2694,2695],{"class":398,"line":412},[396,2696,2697],{},"### Custom Quick View Extension\n",[396,2699,2700],{"class":398,"line":418},[396,2701,2702],{},"- [ ] Quick view button appears on product list\n",[396,2704,2705],{"class":398,"line":424},[396,2706,2707],{},"- [ ] Modal opens with product details\n",[396,2709,2710],{"class":398,"line":430},[396,2711,2712],{},"- [ ] Add to cart from modal works\n",[396,2714,2715],{"class":398,"line":436},[396,2716,2717],{},"- [ ] Modal closes correctly\n",[396,2719,2720],{"class":398,"line":442},[396,2721,2722],{},"- [ ] Keyboard accessibility (Escape to close)\n",[396,2724,2725],{"class":398,"line":448},[396,2726,409],{"emptyLinePlaceholder":408},[396,2728,2729],{"class":398,"line":453},[396,2730,2731],{},"### Custom Shipping Calculator\n",[396,2733,2734],{"class":398,"line":459},[396,2735,2736],{},"- [ ] Calculator appears in cart\n",[396,2738,2739],{"class":398,"line":465},[396,2740,2741],{},"- [ ] Postal code input works\n",[396,2743,2744],{"class":398,"line":471},[396,2745,2746],{},"- [ ] Shipping options display\n",[396,2748,2749],{"class":398,"line":477},[396,2750,2751],{},"- [ ] Rates are accurate\n",[229,2753],{},[28,2755,2757],{"id":2756},"data-migration-considerations","Data Migration Considerations",[15,2759,2760],{},"While most data stays in NetSuite (unchanged by SuiteCommerce upgrades), some configurations may need attention.",[43,2762,2764],{"id":2763},"site-configuration-review","Site Configuration Review",[15,2766,2767],{},"After upgrading the application code, verify site configurations:",[15,2769,2770],{},[51,2771,2772,2773,2776],{},"Commerce → Websites → ",[396,2774,2775],{},"Your Site"," → Setup:",[122,2778,2779,2782,2785,2788],{},[125,2780,2781],{},"Domain settings",[125,2783,2784],{},"SSL certificate assignment",[125,2786,2787],{},"Checkout flow configuration",[125,2789,2790],{},"Payment method settings",[15,2792,2793],{},[51,2794,2772,2795,2797],{},[396,2796,2775],{}," → SMT Configuration:",[122,2799,2800,2803,2806],{},[125,2801,2802],{},"Content types",[125,2804,2805],{},"Layout assignments",[125,2807,2808],{},"Widget configurations",[43,2810,2812],{"id":2811},"catalog-configuration","Catalog Configuration",[15,2814,2815],{},"Verify catalog settings weren't affected:",[122,2817,2818,2821,2824,2827],{},[125,2819,2820],{},"Item display templates",[125,2822,2823],{},"Category configurations",[125,2825,2826],{},"Pricing display rules",[125,2828,2829],{},"Inventory display settings",[43,2831,2833],{"id":2832},"order-flow-configuration","Order Flow Configuration",[15,2835,2836],{},"Test and verify:",[122,2838,2839,2842,2845,2848],{},[125,2840,2841],{},"Tax calculation settings",[125,2843,2844],{},"Shipping method assignments",[125,2846,2847],{},"Email notification templates",[125,2849,2850],{},"Order status mappings",[229,2852],{},[28,2854,2856],{"id":2855},"zero-downtime-deployment-strategy","Zero-Downtime Deployment Strategy",[15,2858,2859],{},[35,2860],{"alt":2861,"src":2862},"Backup and deployment","\u002Fimages\u002Fblog\u002Fsuitecommerce-upgrade-backup.webp",[15,2864,2865],{},"Your customers shouldn't know you upgraded. Here's how to achieve zero-downtime deployment.",[43,2867,2869],{"id":2868},"deployment-timeline","Deployment Timeline",[386,2871,2876],{"className":2872,"code":2874,"language":2875},[2873],"language-text","Day -7:  Final sandbox testing complete\nDay -3:  Production deployment scheduled with team\nDay -1:  Final production backup\nDay 0:   Deployment (during lowest traffic window)\nDay +1:  Monitoring and quick-fix readiness\nDay +7:  Post-upgrade review\n","text",[393,2877,2874],{"__ignoreMap":391},[43,2879,2881],{"id":2880},"pre-deployment-preparation","Pre-Deployment Preparation",[15,2883,2884],{},[51,2885,2886],{},"24 hours before:",[122,2888,2891,2900,2906,2912,2918,2924],{"className":2889},[2890],"contains-task-list",[125,2892,2895,2899],{"className":2893},[2894],"task-list-item",[2896,2897],"input",{"disabled":408,"type":2898},"checkbox"," Final sandbox testing passed",[125,2901,2903,2905],{"className":2902},[2894],[2896,2904],{"disabled":408,"type":2898}," All team members briefed on rollback procedure",[125,2907,2909,2911],{"className":2908},[2894],[2896,2910],{"disabled":408,"type":2898}," Support team aware of upgrade",[125,2913,2915,2917],{"className":2914},[2894],[2896,2916],{"disabled":408,"type":2898}," Customer service team prepared for potential issues",[125,2919,2921,2923],{"className":2920},[2894],[2896,2922],{"disabled":408,"type":2898}," Monitoring alerts configured",[125,2925,2927,2929],{"className":2926},[2894],[2896,2928],{"disabled":408,"type":2898}," Rollback plan documented",[15,2931,2932],{},[51,2933,2934],{},"1 hour before:",[122,2936,2938,2944,2950,2956],{"className":2937},[2890],[125,2939,2941,2943],{"className":2940},[2894],[2896,2942],{"disabled":408,"type":2898}," Team assembled (developers, DevOps, project manager)",[125,2945,2947,2949],{"className":2946},[2894],[2896,2948],{"disabled":408,"type":2898}," Communication channels open",[125,2951,2953,2955],{"className":2952},[2894],[2896,2954],{"disabled":408,"type":2898}," Production site current performance baseline captured",[125,2957,2959,2961],{"className":2958},[2894],[2896,2960],{"disabled":408,"type":2898}," Database backup confirmed",[43,2963,2965],{"id":2964},"deployment-steps","Deployment Steps",[15,2967,2968],{},"Execute during your lowest traffic period (typically 2-6 AM local time for your primary market):",[386,2970,2972],{"className":609,"code":2971,"language":611,"meta":391,"style":391},"# Step 1: Deploy extensions (doesn't affect live site yet)\ngulp extension:deploy --to production\n\n# Step 2: Deploy theme (doesn't affect live site yet)  \ngulp theme:deploy --to production\n\n# Step 3: For SCA - Deploy SSP application\ngulp ssp:deploy --to production\n\n# Step 4: Activate new version in NetSuite\n# Navigate to: Commerce → Websites → [Site] → Setup\n# Update to 2024.x bundle version\n\n# Step 5: Activate new theme\n# Navigate to: Commerce → Websites → [Site] → Themes\n# Activate upgraded theme\n\n# Step 6: Clear caches\n# CDN cache purge\n# NetSuite cache refresh\n",[393,2973,2974,2979,2989,2993,2998,3009,3013,3018,3028,3032,3037,3042,3047,3051,3056,3061,3066,3070,3075,3080],{"__ignoreMap":391},[396,2975,2976],{"class":398,"line":399},[396,2977,2978],{"class":618},"# Step 1: Deploy extensions (doesn't affect live site yet)\n",[396,2980,2981,2983,2985,2987],{"class":398,"line":405},[396,2982,947],{"class":765},[396,2984,1502],{"class":769},[396,2986,1505],{"class":782},[396,2988,773],{"class":769},[396,2990,2991],{"class":398,"line":412},[396,2992,409],{"emptyLinePlaceholder":408},[396,2994,2995],{"class":398,"line":418},[396,2996,2997],{"class":618},"# Step 2: Deploy theme (doesn't affect live site yet)  \n",[396,2999,3000,3002,3005,3007],{"class":398,"line":424},[396,3001,947],{"class":765},[396,3003,3004],{"class":769}," theme:deploy",[396,3006,1505],{"class":782},[396,3008,773],{"class":769},[396,3010,3011],{"class":398,"line":430},[396,3012,409],{"emptyLinePlaceholder":408},[396,3014,3015],{"class":398,"line":436},[396,3016,3017],{"class":618},"# Step 3: For SCA - Deploy SSP application\n",[396,3019,3020,3022,3024,3026],{"class":398,"line":442},[396,3021,947],{"class":765},[396,3023,2285],{"class":769},[396,3025,1505],{"class":782},[396,3027,773],{"class":769},[396,3029,3030],{"class":398,"line":448},[396,3031,409],{"emptyLinePlaceholder":408},[396,3033,3034],{"class":398,"line":453},[396,3035,3036],{"class":618},"# Step 4: Activate new version in NetSuite\n",[396,3038,3039],{"class":398,"line":459},[396,3040,3041],{"class":618},"# Navigate to: Commerce → Websites → [Site] → Setup\n",[396,3043,3044],{"class":398,"line":465},[396,3045,3046],{"class":618},"# Update to 2024.x bundle version\n",[396,3048,3049],{"class":398,"line":471},[396,3050,409],{"emptyLinePlaceholder":408},[396,3052,3053],{"class":398,"line":477},[396,3054,3055],{"class":618},"# Step 5: Activate new theme\n",[396,3057,3058],{"class":398,"line":483},[396,3059,3060],{"class":618},"# Navigate to: Commerce → Websites → [Site] → Themes\n",[396,3062,3063],{"class":398,"line":489},[396,3064,3065],{"class":618},"# Activate upgraded theme\n",[396,3067,3068],{"class":398,"line":494},[396,3069,409],{"emptyLinePlaceholder":408},[396,3071,3072],{"class":398,"line":500},[396,3073,3074],{"class":618},"# Step 6: Clear caches\n",[396,3076,3077],{"class":398,"line":506},[396,3078,3079],{"class":618},"# CDN cache purge\n",[396,3081,3082],{"class":398,"line":512},[396,3083,3084],{"class":618},"# NetSuite cache refresh\n",[43,3086,3088],{"id":3087},"smoke-testing-post-deployment","Smoke Testing Post-Deployment",[15,3090,3091],{},"Immediately after activation, run critical path tests:",[386,3093,3095],{"className":609,"code":3094,"language":611,"meta":391,"style":391},"# Automated smoke test script\n.\u002Fscripts\u002Fsmoke-test-production.sh\n\n# Manual verification\n# 1. Load homepage\n# 2. Search for product\n# 3. Add to cart\n# 4. Proceed to checkout (stop before payment)\n# 5. Check MyAccount login\n",[393,3096,3097,3102,3107,3111,3116,3121,3126,3131,3136],{"__ignoreMap":391},[396,3098,3099],{"class":398,"line":399},[396,3100,3101],{"class":618},"# Automated smoke test script\n",[396,3103,3104],{"class":398,"line":405},[396,3105,3106],{"class":765},".\u002Fscripts\u002Fsmoke-test-production.sh\n",[396,3108,3109],{"class":398,"line":412},[396,3110,409],{"emptyLinePlaceholder":408},[396,3112,3113],{"class":398,"line":418},[396,3114,3115],{"class":618},"# Manual verification\n",[396,3117,3118],{"class":398,"line":424},[396,3119,3120],{"class":618},"# 1. Load homepage\n",[396,3122,3123],{"class":398,"line":430},[396,3124,3125],{"class":618},"# 2. Search for product\n",[396,3127,3128],{"class":398,"line":436},[396,3129,3130],{"class":618},"# 3. Add to cart\n",[396,3132,3133],{"class":398,"line":442},[396,3134,3135],{"class":618},"# 4. Proceed to checkout (stop before payment)\n",[396,3137,3138],{"class":398,"line":448},[396,3139,3140],{"class":618},"# 5. Check MyAccount login\n",[43,3142,3144],{"id":3143},"rollback-procedure","Rollback Procedure",[15,3146,3147],{},"If critical issues arise:",[15,3149,3150],{},[51,3151,3152],{},"Quick rollback (\u003C 5 minutes):",[576,3154,3155,3158,3161],{},[125,3156,3157],{},"Reactivate previous theme",[125,3159,3160],{},"Reactivate previous extensions",[125,3162,3163],{},"For SCA: Revert bundle version",[15,3165,3166],{},[51,3167,3168],{},"Full rollback (\u003C 30 minutes):",[576,3170,3171,3174,3177],{},[125,3172,3173],{},"Restore from pre-upgrade backup",[125,3175,3176],{},"Redeploy previous code versions",[125,3178,3179],{},"Verify all functionality",[15,3181,3182],{},"Document the rollback procedure before deployment so anyone can execute it under pressure.",[229,3184],{},[28,3186,3188],{"id":3187},"post-upgrade-validation","Post-Upgrade Validation",[15,3190,3191],{},"The upgrade isn't complete until you've validated everything in production.",[43,3193,3195],{"id":3194},"monitoring-checklist","Monitoring Checklist",[15,3197,3198],{},[51,3199,3200],{},"First 24 hours:",[122,3202,3204,3210,3216,3222,3228],{"className":3203},[2890],[125,3205,3207,3209],{"className":3206},[2894],[2896,3208],{"disabled":408,"type":2898}," Error rate monitoring (should be stable or improved)",[125,3211,3213,3215],{"className":3212},[2894],[2896,3214],{"disabled":408,"type":2898}," Performance metrics (LCP, FCP, TTFB)",[125,3217,3219,3221],{"className":3218},[2894],[2896,3220],{"disabled":408,"type":2898}," Conversion rate (no significant drops)",[125,3223,3225,3227],{"className":3224},[2894],[2896,3226],{"disabled":408,"type":2898}," Cart abandonment rate",[125,3229,3231,3233],{"className":3230},[2894],[2896,3232],{"disabled":408,"type":2898}," Server response times",[15,3235,3236],{},[51,3237,3238],{},"First week:",[122,3240,3242,3248,3254,3260,3266],{"className":3241},[2890],[125,3243,3245,3247],{"className":3244},[2894],[2896,3246],{"disabled":408,"type":2898}," Customer support ticket volume",[125,3249,3251,3253],{"className":3250},[2894],[2896,3252],{"disabled":408,"type":2898}," Payment processing success rates",[125,3255,3257,3259],{"className":3256},[2894],[2896,3258],{"disabled":408,"type":2898}," Email delivery rates",[125,3261,3263,3265],{"className":3262},[2894],[2896,3264],{"disabled":408,"type":2898}," Search functionality accuracy",[125,3267,3269,3271],{"className":3268},[2894],[2896,3270],{"disabled":408,"type":2898}," Mobile conversion rates",[43,3273,3275],{"id":3274},"performance-baseline","Performance Baseline",[15,3277,3278],{},"Capture new performance baseline:",[386,3280,3282],{"className":609,"code":3281,"language":611,"meta":391,"style":391},"# Run Lighthouse on production\nlighthouse https:\u002F\u002Fwww.yoursite.com \\\n    --output=json \\\n    --output-path=.\u002Flighthouse-post-upgrade.json\n\n# Compare to pre-upgrade\ndiff lighthouse-pre-upgrade.json lighthouse-post-upgrade.json\n",[393,3283,3284,3289,3298,3304,3309,3313,3318],{"__ignoreMap":391},[396,3285,3286],{"class":398,"line":399},[396,3287,3288],{"class":618},"# Run Lighthouse on production\n",[396,3290,3291,3293,3296],{"class":398,"line":405},[396,3292,2555],{"class":765},[396,3294,3295],{"class":769}," https:\u002F\u002Fwww.yoursite.com",[396,3297,1766],{"class":782},[396,3299,3300,3302],{"class":398,"line":412},[396,3301,2565],{"class":782},[396,3303,1766],{"class":782},[396,3305,3306],{"class":398,"line":418},[396,3307,3308],{"class":782},"    --output-path=.\u002Flighthouse-post-upgrade.json\n",[396,3310,3311],{"class":398,"line":424},[396,3312,409],{"emptyLinePlaceholder":408},[396,3314,3315],{"class":398,"line":430},[396,3316,3317],{"class":618},"# Compare to pre-upgrade\n",[396,3319,3320,3322,3325],{"class":398,"line":436},[396,3321,1760],{"class":765},[396,3323,3324],{"class":769}," lighthouse-pre-upgrade.json",[396,3326,3327],{"class":769}," lighthouse-post-upgrade.json\n",[43,3329,3331],{"id":3330},"issue-tracking","Issue Tracking",[15,3333,3334],{},"Create a dedicated channel for upgrade-related issues:",[386,3336,3338],{"className":388,"code":3337,"language":390,"meta":391,"style":391},"## Post-Upgrade Issue Template\n\n**Issue:** [Brief description]\n**Severity:** Critical \u002F High \u002F Medium \u002F Low\n**Affected Area:** [Shopping \u002F Checkout \u002F MyAccount \u002F etc.]\n**Steps to Reproduce:** \n1. ...\n2. ...\n\n**Expected Behavior:** ...\n**Actual Behavior:** ...\n**Browser\u002FDevice:** ...\n**Screenshots\u002FLogs:** [Attach]\n",[393,3339,3340,3345,3349,3354,3359,3364,3369,3374,3379,3383,3388,3393,3398],{"__ignoreMap":391},[396,3341,3342],{"class":398,"line":399},[396,3343,3344],{},"## Post-Upgrade Issue Template\n",[396,3346,3347],{"class":398,"line":405},[396,3348,409],{"emptyLinePlaceholder":408},[396,3350,3351],{"class":398,"line":412},[396,3352,3353],{},"**Issue:** [Brief description]\n",[396,3355,3356],{"class":398,"line":418},[396,3357,3358],{},"**Severity:** Critical \u002F High \u002F Medium \u002F Low\n",[396,3360,3361],{"class":398,"line":424},[396,3362,3363],{},"**Affected Area:** [Shopping \u002F Checkout \u002F MyAccount \u002F etc.]\n",[396,3365,3366],{"class":398,"line":430},[396,3367,3368],{},"**Steps to Reproduce:** \n",[396,3370,3371],{"class":398,"line":436},[396,3372,3373],{},"1. ...\n",[396,3375,3376],{"class":398,"line":442},[396,3377,3378],{},"2. ...\n",[396,3380,3381],{"class":398,"line":448},[396,3382,409],{"emptyLinePlaceholder":408},[396,3384,3385],{"class":398,"line":453},[396,3386,3387],{},"**Expected Behavior:** ...\n",[396,3389,3390],{"class":398,"line":459},[396,3391,3392],{},"**Actual Behavior:** ...\n",[396,3394,3395],{"class":398,"line":465},[396,3396,3397],{},"**Browser\u002FDevice:** ...\n",[396,3399,3400],{"class":398,"line":471},[396,3401,3402],{},"**Screenshots\u002FLogs:** [Attach]\n",[229,3404],{},[28,3406,3408],{"id":3407},"troubleshooting-common-upgrade-issues","Troubleshooting Common Upgrade Issues",[43,3410,3412],{"id":3411},"javascript-errors","JavaScript Errors",[15,3414,3415],{},[51,3416,3417],{},"Console shows \"undefined is not a function\":",[15,3419,3420],{},"Usually a dependency loading order issue:",[386,3422,3424],{"className":992,"code":3423,"language":994,"meta":391,"style":391},"\u002F\u002F Check module definition\ndefine('MyModule', [\n    'Backbone',\n    'underscore',\n    'jQuery'  \u002F\u002F Ensure jQuery loads before dependent modules\n], function(Backbone, _, jQuery) {\n    \u002F\u002F Verify all dependencies are available\n    if (!jQuery) {\n        console.error('jQuery not loaded');\n    }\n});\n",[393,3425,3426,3431,3442,3448,3455,3463,3484,3489,3503,3518,3522],{"__ignoreMap":391},[396,3427,3428],{"class":398,"line":399},[396,3429,3430],{"class":618},"\u002F\u002F Check module definition\n",[396,3432,3433,3435,3437,3440],{"class":398,"line":405},[396,3434,1146],{"class":765},[396,3436,1021],{"class":854},[396,3438,3439],{"class":769},"'MyModule'",[396,3441,1154],{"class":854},[396,3443,3444,3446],{"class":398,"line":412},[396,3445,1159],{"class":769},[396,3447,869],{"class":854},[396,3449,3450,3453],{"class":398,"line":418},[396,3451,3452],{"class":769},"    'underscore'",[396,3454,869],{"class":854},[396,3456,3457,3460],{"class":398,"line":424},[396,3458,3459],{"class":769},"    'jQuery'",[396,3461,3462],{"class":618},"  \u002F\u002F Ensure jQuery loads before dependent modules\n",[396,3464,3465,3467,3469,3471,3473,3475,3477,3479,3482],{"class":398,"line":430},[396,3466,1171],{"class":854},[396,3468,1175],{"class":1174},[396,3470,1021],{"class":854},[396,3472,1181],{"class":1180},[396,3474,1026],{"class":854},[396,3476,2136],{"class":1180},[396,3478,1026],{"class":854},[396,3480,3481],{"class":1180},"jQuery",[396,3483,1189],{"class":854},[396,3485,3486],{"class":398,"line":436},[396,3487,3488],{"class":618},"    \u002F\u002F Verify all dependencies are available\n",[396,3490,3491,3494,3497,3500],{"class":398,"line":442},[396,3492,3493],{"class":1174},"    if",[396,3495,3496],{"class":854}," (",[396,3498,3499],{"class":1174},"!",[396,3501,3502],{"class":854},"jQuery) {\n",[396,3504,3505,3508,3511,3513,3516],{"class":398,"line":448},[396,3506,3507],{"class":854},"        console.",[396,3509,3510],{"class":765},"error",[396,3512,1021],{"class":854},[396,3514,3515],{"class":769},"'jQuery not loaded'",[396,3517,1032],{"class":854},[396,3519,3520],{"class":398,"line":453},[396,3521,919],{"class":854},[396,3523,3524],{"class":398,"line":459},[396,3525,1462],{"class":854},[43,3527,3529],{"id":3528},"template-rendering-failures","Template Rendering Failures",[15,3531,3532],{},[51,3533,3534],{},"Blank page or partial rendering:",[15,3536,3537],{},"Check template context:",[386,3539,3541],{"className":1074,"code":3540,"language":1076,"meta":391,"style":391},"{{!-- Add debugging --}}\n{{log this}}\n\n{{!-- Verify expected data exists --}}\n{{#if model}}\n    {{!-- Normal template --}}\n{{else}}\n    \u003Cdiv>Model not available - check view getContext()\u003C\u002Fdiv>\n{{\u002Fif}}\n",[393,3542,3543,3548,3553,3557,3562,3567,3572,3577,3582],{"__ignoreMap":391},[396,3544,3545],{"class":398,"line":399},[396,3546,3547],{},"{{!-- Add debugging --}}\n",[396,3549,3550],{"class":398,"line":405},[396,3551,3552],{},"{{log this}}\n",[396,3554,3555],{"class":398,"line":412},[396,3556,409],{"emptyLinePlaceholder":408},[396,3558,3559],{"class":398,"line":418},[396,3560,3561],{},"{{!-- Verify expected data exists --}}\n",[396,3563,3564],{"class":398,"line":424},[396,3565,3566],{},"{{#if model}}\n",[396,3568,3569],{"class":398,"line":430},[396,3570,3571],{},"    {{!-- Normal template --}}\n",[396,3573,3574],{"class":398,"line":436},[396,3575,3576],{},"{{else}}\n",[396,3578,3579],{"class":398,"line":442},[396,3580,3581],{},"    \u003Cdiv>Model not available - check view getContext()\u003C\u002Fdiv>\n",[396,3583,3584],{"class":398,"line":448},[396,3585,1112],{},[43,3587,3589],{"id":3588},"extension-not-loading","Extension Not Loading",[15,3591,3592],{},[51,3593,3594],{},"Extension installed but not functioning:",[576,3596,3597,3600,3607,3610],{},[125,3598,3599],{},"Verify bundle is active: Setup → SuiteCloud → Installed Bundles",[125,3601,3602,3603,3606],{},"Check extension activation: Commerce → Websites → ",[396,3604,3605],{},"Site"," → Extensions",[125,3608,3609],{},"Review browser console for loading errors",[125,3611,3612],{},"Verify manifest.json target_version includes 2024.x",[43,3614,3616],{"id":3615},"style-regressions","Style Regressions",[15,3618,3619],{},[51,3620,3621],{},"Layout broken or styles missing:",[386,3623,3625],{"className":609,"code":3624,"language":611,"meta":391,"style":391},"# Compare compiled CSS size\nls -la LocalDistribution\u002Fcss\u002F*.css\n\n# Check for SASS compilation errors\ngulp sass:compile 2>&1 | grep -i error\n\n# Verify all SASS files included in entry points\ngrep -r \"import\" Themes\u002FMyTheme\u002FModules\u002FBaseSassStyles\u002F\n",[393,3626,3627,3632,3649,3653,3658,3680,3684,3689],{"__ignoreMap":391},[396,3628,3629],{"class":398,"line":399},[396,3630,3631],{"class":618},"# Compare compiled CSS size\n",[396,3633,3634,3637,3640,3643,3646],{"class":398,"line":405},[396,3635,3636],{"class":765},"ls",[396,3638,3639],{"class":782}," -la",[396,3641,3642],{"class":769}," LocalDistribution\u002Fcss\u002F",[396,3644,3645],{"class":782},"*",[396,3647,3648],{"class":769},".css\n",[396,3650,3651],{"class":398,"line":412},[396,3652,409],{"emptyLinePlaceholder":408},[396,3654,3655],{"class":398,"line":418},[396,3656,3657],{"class":618},"# Check for SASS compilation errors\n",[396,3659,3660,3662,3665,3668,3671,3674,3677],{"class":398,"line":424},[396,3661,947],{"class":765},[396,3663,3664],{"class":769}," sass:compile",[396,3666,3667],{"class":1174}," 2>&1",[396,3669,3670],{"class":1174}," |",[396,3672,3673],{"class":765}," grep",[396,3675,3676],{"class":782}," -i",[396,3678,3679],{"class":769}," error\n",[396,3681,3682],{"class":398,"line":430},[396,3683,409],{"emptyLinePlaceholder":408},[396,3685,3686],{"class":398,"line":436},[396,3687,3688],{"class":618},"# Verify all SASS files included in entry points\n",[396,3690,3691,3694,3697,3700],{"class":398,"line":442},[396,3692,3693],{"class":765},"grep",[396,3695,3696],{"class":782}," -r",[396,3698,3699],{"class":769}," \"import\"",[396,3701,3702],{"class":769}," Themes\u002FMyTheme\u002FModules\u002FBaseSassStyles\u002F\n",[43,3704,3706],{"id":3705},"performance-degradation","Performance Degradation",[15,3708,3709],{},[51,3710,3711],{},"Site slower after upgrade:",[576,3713,3714,3717,3720,3723,3726],{},[125,3715,3716],{},"Check if prerendering is working correctly",[125,3718,3719],{},"Verify CDN cache is functioning",[125,3721,3722],{},"Review new feature impact (disable optional features)",[125,3724,3725],{},"Check for inefficient new JavaScript",[125,3727,3728],{},"Review third-party integration impact",[229,3730],{},[28,3732,3734],{"id":3733},"upgrade-complexity-estimator","Upgrade Complexity Estimator",[15,3736,3737],{},"Use this to estimate your specific upgrade effort:",[386,3739,3741],{"className":388,"code":3740,"language":390,"meta":391,"style":391},"## Upgrade Effort Calculator\n\n### Base Effort\nVersion jump (2023 → 2024): 3 base points\n\n### Customization Multipliers\nNumber of custom extensions:\n- 0-2: ×1.0\n- 3-5: ×1.3\n- 6-10: ×1.6\n- 10+: ×2.0\n\nTheme customization level:\n- Minimal (colors\u002Ffonts): ×1.0\n- Moderate (layout changes): ×1.3\n- Heavy (custom templates): ×1.6\n- Complete redesign: ×2.0\n\nSuiteScript customizations (SCA):\n- None: ×1.0\n- Light (1-3 scripts): ×1.3\n- Moderate (4-10 scripts): ×1.6\n- Heavy (10+ scripts): ×2.0\n\n### Third-Party Integration Factor\n- None: ×1.0\n- Standard (GA, Klaviyo): ×1.1\n- Multiple (5+ integrations): ×1.3\n- Complex (custom APIs): ×1.5\n\n### Calculation\nTotal Points = Base × Extensions × Theme × SuiteScript × Integrations\n\n### Effort Translation\n- 3-6 points: 2-3 weeks\n- 6-12 points: 3-6 weeks\n- 12-24 points: 6-10 weeks\n- 24+ points: 10+ weeks (consider phased approach)\n",[393,3742,3743,3748,3752,3757,3762,3766,3771,3776,3781,3786,3791,3796,3800,3805,3810,3815,3820,3825,3829,3834,3839,3844,3849,3854,3858,3863,3867,3872,3877,3882,3886,3891,3896,3900,3905,3910,3915,3920],{"__ignoreMap":391},[396,3744,3745],{"class":398,"line":399},[396,3746,3747],{},"## Upgrade Effort Calculator\n",[396,3749,3750],{"class":398,"line":405},[396,3751,409],{"emptyLinePlaceholder":408},[396,3753,3754],{"class":398,"line":412},[396,3755,3756],{},"### Base Effort\n",[396,3758,3759],{"class":398,"line":418},[396,3760,3761],{},"Version jump (2023 → 2024): 3 base points\n",[396,3763,3764],{"class":398,"line":424},[396,3765,409],{"emptyLinePlaceholder":408},[396,3767,3768],{"class":398,"line":430},[396,3769,3770],{},"### Customization Multipliers\n",[396,3772,3773],{"class":398,"line":436},[396,3774,3775],{},"Number of custom extensions:\n",[396,3777,3778],{"class":398,"line":442},[396,3779,3780],{},"- 0-2: ×1.0\n",[396,3782,3783],{"class":398,"line":448},[396,3784,3785],{},"- 3-5: ×1.3\n",[396,3787,3788],{"class":398,"line":453},[396,3789,3790],{},"- 6-10: ×1.6\n",[396,3792,3793],{"class":398,"line":459},[396,3794,3795],{},"- 10+: ×2.0\n",[396,3797,3798],{"class":398,"line":465},[396,3799,409],{"emptyLinePlaceholder":408},[396,3801,3802],{"class":398,"line":471},[396,3803,3804],{},"Theme customization level:\n",[396,3806,3807],{"class":398,"line":477},[396,3808,3809],{},"- Minimal (colors\u002Ffonts): ×1.0\n",[396,3811,3812],{"class":398,"line":483},[396,3813,3814],{},"- Moderate (layout changes): ×1.3\n",[396,3816,3817],{"class":398,"line":489},[396,3818,3819],{},"- Heavy (custom templates): ×1.6\n",[396,3821,3822],{"class":398,"line":494},[396,3823,3824],{},"- Complete redesign: ×2.0\n",[396,3826,3827],{"class":398,"line":500},[396,3828,409],{"emptyLinePlaceholder":408},[396,3830,3831],{"class":398,"line":506},[396,3832,3833],{},"SuiteScript customizations (SCA):\n",[396,3835,3836],{"class":398,"line":512},[396,3837,3838],{},"- None: ×1.0\n",[396,3840,3841],{"class":398,"line":518},[396,3842,3843],{},"- Light (1-3 scripts): ×1.3\n",[396,3845,3846],{"class":398,"line":524},[396,3847,3848],{},"- Moderate (4-10 scripts): ×1.6\n",[396,3850,3851],{"class":398,"line":529},[396,3852,3853],{},"- Heavy (10+ scripts): ×2.0\n",[396,3855,3856],{"class":398,"line":535},[396,3857,409],{"emptyLinePlaceholder":408},[396,3859,3860],{"class":398,"line":541},[396,3861,3862],{},"### Third-Party Integration Factor\n",[396,3864,3865],{"class":398,"line":547},[396,3866,3838],{},[396,3868,3869],{"class":398,"line":553},[396,3870,3871],{},"- Standard (GA, Klaviyo): ×1.1\n",[396,3873,3874],{"class":398,"line":559},[396,3875,3876],{},"- Multiple (5+ integrations): ×1.3\n",[396,3878,3879],{"class":398,"line":1403},[396,3880,3881],{},"- Complex (custom APIs): ×1.5\n",[396,3883,3884],{"class":398,"line":1408},[396,3885,409],{"emptyLinePlaceholder":408},[396,3887,3888],{"class":398,"line":1413},[396,3889,3890],{},"### Calculation\n",[396,3892,3893],{"class":398,"line":1430},[396,3894,3895],{},"Total Points = Base × Extensions × Theme × SuiteScript × Integrations\n",[396,3897,3898],{"class":398,"line":1441},[396,3899,409],{"emptyLinePlaceholder":408},[396,3901,3902],{"class":398,"line":1447},[396,3903,3904],{},"### Effort Translation\n",[396,3906,3907],{"class":398,"line":1453},[396,3908,3909],{},"- 3-6 points: 2-3 weeks\n",[396,3911,3912],{"class":398,"line":1459},[396,3913,3914],{},"- 6-12 points: 3-6 weeks\n",[396,3916,3917],{"class":398,"line":2518},[396,3918,3919],{},"- 12-24 points: 6-10 weeks\n",[396,3921,3922],{"class":398,"line":2524},[396,3923,3924],{},"- 24+ points: 10+ weeks (consider phased approach)\n",[229,3926],{},[28,3928,3930],{"id":3929},"faq","FAQ",[15,3932,3933],{},[51,3934,3935],{},"Q: Can I skip versions? (e.g., 2022.x directly to 2024.x)",[15,3937,3938],{},"A: Yes, but it's more complex. Each skipped version adds potential breaking changes you must address. We recommend sequential upgrades only for highly customized sites.",[15,3940,3941],{},[51,3942,3943],{},"Q: How long will 2023.x be supported?",[15,3945,3946],{},"A: NetSuite typically supports N-2 versions. 2023.x will receive security patches through late 2025, but new features are only added to current releases. Plan your upgrade before support ends.",[15,3948,3949],{},[51,3950,3951],{},"Q: Should I upgrade extensions and themes together or separately?",[15,3953,3954],{},"A: Deploy together in a coordinated release. Mismatched versions can cause subtle compatibility issues that are hard to debug.",[15,3956,3957],{},[51,3958,3959],{},"Q: What if my third-party extension isn't compatible with 2024.x?",[15,3961,3962],{},"A: Contact the vendor for an updated version. If unavailable, evaluate: is the functionality critical? Can you build a replacement extension? Factor this into timeline.",[15,3964,3965],{},[51,3966,3967],{},"Q: Will the upgrade affect my SEO rankings?",[15,3969,3970],{},"A: It shouldn't, but monitor carefully. Ensure redirects are in place for any URL changes, verify meta tags render correctly, and monitor Search Console for crawl errors post-upgrade.",[229,3972],{},[28,3974,3976],{"id":3975},"when-to-get-help","When to Get Help",[15,3978,3979],{},"Consider professional assistance if:",[122,3981,3982,3985,3988,3991,3994,3997],{},[125,3983,3984],{},"You're jumping more than one major version",[125,3986,3987],{},"You have 10+ custom extensions",[125,3989,3990],{},"Your theme has significant customizations",[125,3992,3993],{},"You've modified core SCA code",[125,3995,3996],{},"Your site generates $1M+ annually (risk is too high for errors)",[125,3998,3999],{},"Your team lacks SuiteCommerce upgrade experience",[15,4001,4002],{},"We've handled upgrades from versions as old as Aconcagua to current releases. The investment in expertise typically pays for itself by reducing downtime and accelerating the timeline.",[15,4004,4005],{},[4006,4007,4009],"a",{"href":4008},"\u002Fcontact","Schedule an Upgrade Assessment →",[229,4011],{},[15,4013,4014],{},[4015,4016,4017,4018,4022],"em",{},"Running an outdated SuiteCommerce version? ",[4006,4019,4021],{"href":4020},"\u002Fsuitecommerce-services\u002Fsuitecommerce-implementation","Contact our team"," to plan your upgrade path and minimize business disruption.",[4024,4025,4026],"style",{},"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);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":391,"searchDepth":405,"depth":405,"links":4028},[4029,4035,4039,4044,4049,4055,4061,4066,4072,4077,4084,4089,4096,4097,4098],{"id":30,"depth":405,"text":31,"children":4030},[4031,4032,4033,4034],{"id":45,"depth":412,"text":46},{"id":112,"depth":412,"text":113},{"id":139,"depth":412,"text":140},{"id":178,"depth":412,"text":179},{"id":233,"depth":405,"text":234,"children":4036},[4037,4038],{"id":240,"depth":412,"text":241},{"id":323,"depth":412,"text":324},{"id":373,"depth":405,"text":374,"children":4040},[4041,4042,4043],{"id":380,"depth":412,"text":381},{"id":565,"depth":412,"text":566},{"id":627,"depth":412,"text":628},{"id":672,"depth":405,"text":673,"children":4045},[4046,4047,4048],{"id":679,"depth":412,"text":680},{"id":712,"depth":412,"text":713},{"id":746,"depth":412,"text":747},{"id":823,"depth":405,"text":824,"children":4050},[4051,4052,4053,4054],{"id":830,"depth":412,"text":831},{"id":983,"depth":412,"text":984},{"id":1123,"depth":412,"text":1124},{"id":1465,"depth":412,"text":1466},{"id":1522,"depth":405,"text":1523,"children":4056},[4057,4058,4059,4060],{"id":1529,"depth":412,"text":1530},{"id":1607,"depth":412,"text":1608},{"id":1661,"depth":412,"text":1662},{"id":1741,"depth":412,"text":1742},{"id":1793,"depth":405,"text":1794,"children":4062},[4063,4064,4065],{"id":1800,"depth":412,"text":1801},{"id":2075,"depth":412,"text":2076},{"id":2267,"depth":412,"text":2268},{"id":2327,"depth":405,"text":2328,"children":4067},[4068,4069,4070,4071],{"id":2334,"depth":412,"text":2335},{"id":2536,"depth":412,"text":2537},{"id":2647,"depth":412,"text":2648},{"id":2674,"depth":412,"text":2675},{"id":2756,"depth":405,"text":2757,"children":4073},[4074,4075,4076],{"id":2763,"depth":412,"text":2764},{"id":2811,"depth":412,"text":2812},{"id":2832,"depth":412,"text":2833},{"id":2855,"depth":405,"text":2856,"children":4078},[4079,4080,4081,4082,4083],{"id":2868,"depth":412,"text":2869},{"id":2880,"depth":412,"text":2881},{"id":2964,"depth":412,"text":2965},{"id":3087,"depth":412,"text":3088},{"id":3143,"depth":412,"text":3144},{"id":3187,"depth":405,"text":3188,"children":4085},[4086,4087,4088],{"id":3194,"depth":412,"text":3195},{"id":3274,"depth":412,"text":3275},{"id":3330,"depth":412,"text":3331},{"id":3407,"depth":405,"text":3408,"children":4090},[4091,4092,4093,4094,4095],{"id":3411,"depth":412,"text":3412},{"id":3528,"depth":412,"text":3529},{"id":3588,"depth":412,"text":3589},{"id":3615,"depth":412,"text":3616},{"id":3705,"depth":412,"text":3706},{"id":3733,"depth":405,"text":3734},{"id":3929,"depth":405,"text":3930},{"id":3975,"depth":405,"text":3976},[4100,4101,4102],"SuiteCommerce","Maintenance","Upgrades","2026-02-08","Step-by-step guide to upgrading SuiteCommerce from 2023 versions to 2024.x releases. Compatibility assessment, customization migration, testing methodology, and zero-downtime deployment.","md","\u002Fimages\u002Fblog\u002Fsuitecommerce-upgrade-hero.webp",{},"\u002Fblog\u002Fsuitecommerce-version-upgrade-guide-2024",null,{"title":5,"description":4104},"blog\u002Fsuitecommerce-version-upgrade-guide-2024",[4113,4114,4115,4116,4117],"Version Upgrade","Migration","2024 Release","SCA","Deployment","J4sZBuqRngBOO34K6MsPuc1E4DaX_0ypznxTI9l5ZN0",[4120,4132,4142,4154,4163,4173,4185,4194,4204,4213,4221,4231,4239,4249,4257,4268,4271,4280,4289,4298,4306],{"path":4121,"title":4122,"categories":4123,"tags":4125,"heroImage":4131},"\u002Fblog\u002Fbuilding-custom-suitecommerce-extensions-developer-guide","Building Custom SuiteCommerce Extensions: A Developer's Start-to-Finish Guide",[4100,4124],"Development",[4126,4127,4128,4129,4130],"SuiteCommerce Extensions","Custom Development","Backbone.js","SuiteScript","Frontend Development","\u002Fimages\u002Fblog\u002Fextensions-guide-hero.webp",{"path":4133,"title":4134,"categories":4135,"tags":4137,"heroImage":4141},"\u002Fblog\u002Fcore-web-vitals-suitecommerce-optimization-checklist","Core Web Vitals for SuiteCommerce: The Complete 2026 Optimization Checklist",[4136,4100],"Performance",[4138,95,4139,2627,4140,4100],"Core Web Vitals","INP","Performance Optimization","\u002Fimages\u002Fblog\u002Fcore-web-vitals-hero.webp",{"path":4143,"title":4144,"categories":4145,"tags":4147,"heroImage":4153},"\u002Fblog\u002Ffixing-duplicate-content-suitecommerce-faceted-navigation","Fixing Duplicate Content in SuiteCommerce Faceted Navigation",[4146,4100],"SEO",[4148,4149,4150,4151,4100,4152],"Duplicate Content","Faceted Navigation","Canonical Tags","Technical SEO","URL Parameters","\u002Fimages\u002Fblog\u002Fduplicate-content-seo-hero.webp",{"path":4155,"title":4156,"categories":4157,"tags":4158,"heroImage":4162},"\u002Fblog\u002Fheadless-suitecommerce-when-does-it-make-sense","Headless SuiteCommerce: When Does It Make Sense?",[4100,4124],[4100,4159,4160,4161,4136],"Headless Commerce","Architecture","Implementation","\u002Fimages\u002Fblog\u002Fheadless-suitecommerce-hero.webp",{"path":4164,"title":4165,"categories":4166,"tags":4168,"heroImage":4172},"\u002Fblog\u002Fnetsuite-ecommerce-integration-architecture-how-suitecommerce-works","NetSuite E-commerce Integration Architecture: How SuiteCommerce Actually Works",[4100,4124,4167],"Integration",[4160,4167,4129,4169,4170,4171],"API","Backend","Frontend","\u002Fimages\u002Fblog\u002Fnetsuite-ecommerce-integration-hero.webp",{"path":4174,"title":4175,"categories":4176,"tags":4178,"heroImage":4184},"\u002Fblog\u002Fnetsuite-integration-without-celigo-when-custom-beats-off-the-shelf","NetSuite Integration Without Celigo: When Custom Beats Off-the-Shelf",[4177,4167],"NetSuite",[4179,4180,4181,4182,4129,4183],"NetSuite Integration","Celigo","Custom Integration","RESTlet","API Development","\u002Fimages\u002Fblog\u002Fnetsuite-integration-hero.webp",{"path":4186,"title":4187,"categories":4188,"tags":4189,"heroImage":4193},"\u002Fblog\u002Fsuitecommerce-checkout-optimization-fixing-abandonment","SuiteCommerce Checkout Optimization: Fixing Abandonment at the Technical Level",[4100,4136],[4100,4190,4191,4192,4136],"Checkout Optimization","Cart Abandonment","Conversions","\u002Fimages\u002Fblog\u002Fsuitecommerce-checkout-hero.webp",{"path":4195,"title":4196,"categories":4197,"tags":4198,"heroImage":4203},"\u002Fblog\u002Fsuitecommerce-image-optimization-developer-guide","SuiteCommerce Image Optimization: A Developer's Guide",[4136,4100],[4199,4200,4201,4202,4136,4100],"Image Optimization","WebP","Lazy Loading","CDN","\u002Fimages\u002Fblog\u002Fimage-optimization-hero.webp",{"path":4205,"title":4206,"categories":4207,"tags":4208,"heroImage":4212},"\u002Fblog\u002Fsuitecommerce-implementation-cost-guide-2026","SuiteCommerce Implementation Cost Guide: What to Expect in 2026",[4100,4161],[4209,4161,4177,4210,4211],"SuiteCommerce Cost","Budget Planning","E-commerce","\u002Fimages\u002Fblog\u002Fimplementation-cost-hero.webp",{"path":4214,"title":4215,"categories":4216,"tags":4217,"heroImage":4220},"\u002Fblog\u002Fsuitecommerce-migration-checklist-upgrading-without-downtime","The SuiteCommerce Migration Checklist: Upgrading Without Downtime",[4100,4124],[4100,4114,4218,4219,4161],"Upgrade","Zero Downtime","\u002Fimages\u002Fblog\u002Fmigration-checklist-hero.webp",{"path":4222,"title":4223,"categories":4224,"tags":4225,"heroImage":4230},"\u002Fblog\u002Fsuitecommerce-myaccount-customization-b2b-features","SuiteCommerce MyAccount Customization: 10 Features B2B Customers Need",[4100,4124],[4100,4226,4227,4228,4229],"MyAccount","B2B","Customization","Portal","\u002Fimages\u002Fblog\u002Fsuitecommerce-myaccount-hero.webp",{"path":4232,"title":4233,"categories":4234,"tags":4236,"heroImage":4238},"\u002Fblog\u002Fsuitecommerce-performance-audit-286-stores","We Audited 286 Live SuiteCommerce Stores. Here's What We Found",[4136,4235,4100],"Research",[4136,4100,4138,4235,4237],"Benchmarks","\u002Fimages\u002Fblog\u002Fsuitecommerce-audit-hero.webp",{"path":4240,"title":4241,"categories":4242,"tags":4243,"heroImage":4248},"\u002Fblog\u002Fsuitecommerce-product-page-optimization-conversions-seo","How to Optimize SuiteCommerce Product Pages for Conversions and SEO",[4146,4136,4100],[4244,4245,4246,4151,4247],"Product Pages","Conversion Optimization","Schema Markup","CRO","\u002Fimages\u002Fblog\u002Fsuitecommerce-product-page-hero.webp",{"path":4250,"title":4251,"categories":4252,"tags":4253,"heroImage":4256},"\u002Fblog\u002Fsuitecommerce-seo-schema-markup-technical-guide","SuiteCommerce SEO: Schema Markup, Technical SEO, and What Actually Works",[4146,4100],[4246,4151,4254,4255,4100,4177],"JSON-LD","Structured Data","\u002Fimages\u002Fblog\u002Fseo-schema-markup-hero.webp",{"path":4258,"title":4259,"categories":4260,"tags":4262,"heroImage":4267},"\u002Fblog\u002Fsuitecommerce-theme-development-design-to-deployment","SuiteCommerce Theme Development: From Design to Deployment",[4124,4100,4261],"Themes",[4263,4264,4265,4266,4130,4228],"Theme Development","SASS","CSS","Templates","\u002Fimages\u002Fblog\u002Fsuitecommerce-theme-hero.webp",{"path":4108,"title":5,"categories":4269,"tags":4270,"heroImage":4106},[4100,4101,4102],[4113,4114,4115,4116,4117],{"path":4272,"title":4273,"categories":4274,"tags":4275,"heroImage":4279},"\u002Fblog\u002Fsuitecommerce-vs-bigcommerce-netsuite-users","SuiteCommerce vs. BigCommerce for NetSuite Users: Which Platform Wins?",[4100,4211],[4276,4100,4177,4277,4278,4167],"BigCommerce","Platform Comparison","E-commerce Platform","\u002Fimages\u002Fblog\u002Fsuitecommerce-vs-bigcommerce-hero.webp",{"path":4281,"title":4282,"categories":4283,"tags":4284,"heroImage":4288},"\u002Fblog\u002Fsuitescript-performance-optimization-writing-efficient-scripts","SuiteScript Performance Optimization: Writing Efficient Scripts",[4177,4129],[4129,4140,4285,4286,4287,4169],"Governance","Map\u002FReduce","NetSuite Development","\u002Fimages\u002Fblog\u002Fsuitescript-performance-hero.webp",{"path":4290,"title":4291,"categories":4292,"tags":4293,"heroImage":4297},"\u002Fblog\u002Ftroubleshooting-suitecommerce-15-common-errors-how-to-fix","Troubleshooting SuiteCommerce: 15 Common Errors and How to Fix Them",[4100,4124],[4100,4294,4295,4296,4124],"Troubleshooting","Errors","Debugging","\u002Fimages\u002Fblog\u002Ftroubleshooting-errors-hero.webp",{"path":4299,"title":4300,"categories":4301,"tags":4302,"heroImage":4305},"\u002Fblog\u002Ftrue-cost-suitecommerce-maintenance-annual-budget-guide","The True Cost of SuiteCommerce Maintenance: Annual Budget Planning Guide",[4100,4136],[4100,4101,4210,4303,4304],"TCO","E-commerce Operations","\u002Fimages\u002Fblog\u002Fsuitecommerce-maintenance-cost-hero.webp",{"path":4307,"title":4308,"categories":4309,"tags":4310,"heroImage":4312},"\u002Fblog\u002Fwhy-suitecommerce-site-slow-how-to-fix","Why Your SuiteCommerce Site is Slow (And How to Fix It)",[4136,4100],[4136,4100,4311,4294],"Speed Optimization","\u002Fimages\u002Fblog\u002Fslow-site-fix-hero.webp",1773773966062]