[{"data":1,"prerenderedAt":5348},["ShallowReactive",2],{"blog-suitecommerce-migration-checklist-upgrading-without-downtime":3,"all-blog-posts":5151},{"id":4,"title":5,"author":6,"body":7,"categories":5128,"date":5131,"description":5132,"extension":5133,"heroImage":5134,"meta":5135,"navigation":307,"path":5141,"relatedArticles":5142,"seo":5143,"stem":5144,"tags":5145,"__hash__":5150},"content\u002Fblog\u002Fsuitecommerce-migration-checklist-upgrading-without-downtime.md","The SuiteCommerce Migration Checklist: Upgrading Without Downtime","Stenbase Team",{"type":8,"value":9,"toc":5076},"minimark",[10,14,18,21,26,97,100,103,110,116,122,128,134,137,140,147,152,155,222,226,229,234,245,250,261,266,277,281,284,439,443,446,618,621,625,628,654,658,661,783,787,790,896,900,903,1046,1049,1132,1135,1139,1142,1221,1225,1228,1286,1290,1293,1457,1461,1464,1657,1660,1664,1667,1672,1735,1740,1897,1901,1904,2071,2075,2078,2208,2211,2217,2221,2224,2321,2325,2328,3066,3070,3073,3536,3539,3543,3546,3687,3691,3694,3798,3802,3805,4007,4011,4014,4121,4124,4128,4131,4332,4336,4339,4501,4505,4508,4634,4637,4640,4932,4935,4938,4943,4959,4964,4987,4995,4998,5002,5005,5025,5029,5032,5036,5039,5043,5051,5055,5058,5061,5072],[11,12,5],"h1",{"id":13},"the-suitecommerce-migration-checklist-upgrading-without-downtime",[15,16,17],"p",{},"Every hour of downtime costs money. For a mid-sized B2B store processing $50,000 daily, a four-hour migration window means $8,300 in lost revenue—plus the customer trust you can't quantify.",[15,19,20],{},"We've migrated dozens of SuiteCommerce stores, including complex B2B implementations with 50,000+ SKUs and custom integrations. Our track record: zero unplanned downtime. This guide shares the exact methodology we use.",[22,23,25],"h2",{"id":24},"table-of-contents","Table of Contents",[27,28,29,37,43,49,55,61,67,73,79,85,91],"ul",{},[30,31,32],"li",{},[33,34,36],"a",{"href":35},"#why-suitecommerce-migrations-fail","Why SuiteCommerce Migrations Fail",[30,38,39],{},[33,40,42],{"href":41},"#phase-1-pre-migration-assessment","Phase 1: Pre-Migration Assessment",[30,44,45],{},[33,46,48],{"href":47},"#phase-2-version-compatibility-analysis","Phase 2: Version Compatibility Analysis",[30,50,51],{},[33,52,54],{"href":53},"#phase-3-customization-audit","Phase 3: Customization Audit",[30,56,57],{},[33,58,60],{"href":59},"#phase-4-data-backup-and-recovery-planning","Phase 4: Data Backup and Recovery Planning",[30,62,63],{},[33,64,66],{"href":65},"#phase-5-staging-environment-setup","Phase 5: Staging Environment Setup",[30,68,69],{},[33,70,72],{"href":71},"#phase-6-zero-downtime-deployment","Phase 6: Zero-Downtime Deployment",[30,74,75],{},[33,76,78],{"href":77},"#phase-7-post-migration-validation","Phase 7: Post-Migration Validation",[30,80,81],{},[33,82,84],{"href":83},"#the-complete-migration-checklist","The Complete Migration Checklist",[30,86,87],{},[33,88,90],{"href":89},"#when-to-diy-vs-hire-help","When to DIY vs. Hire Help",[30,92,93],{},[33,94,96],{"href":95},"#faq","FAQ",[22,98,36],{"id":99},"why-suitecommerce-migrations-fail",[15,101,102],{},"Before diving into the checklist, understand why migrations go wrong. In our experience, failures cluster around five root causes:",[15,104,105,109],{},[106,107,108],"strong",{},"1. Untested Customizations","\nCustom extensions that worked on version 2022.2 break silently on 2024.1. The store launches, everything looks fine, then orders start failing at checkout because a custom payment handler references deprecated APIs.",[15,111,112,115],{},[106,113,114],{},"2. Data Sync Timing","\nMigrations during business hours without proper data freeze protocols result in orders placed during the cutover window disappearing—or worse, duplicating.",[15,117,118,121],{},[106,119,120],{},"3. DNS and CDN Propagation","\nTeams flip DNS without accounting for TTL propagation. Half your customers hit the new store while the other half still see the old one, both writing to different databases.",[15,123,124,127],{},[106,125,126],{},"4. Missing Rollback Plans","\nThe new deployment has a critical bug. There's no way back. You're debugging production at 2 AM while customers can't complete purchases.",[15,129,130,133],{},[106,131,132],{},"5. Incomplete Testing","\n\"We tested the homepage and checkout\" isn't a test plan. The edge case where a B2B customer with custom pricing and net terms places a partial shipment order—that's where things break.",[15,135,136],{},"This checklist exists to eliminate these failure modes systematically.",[22,138,42],{"id":139},"phase-1-pre-migration-assessment",[15,141,142],{},[143,144],"img",{"alt":145,"src":146},"Migration checklist and organized planning","\u002Fimages\u002Fblog\u002Fmigration-checklist-checklist.webp",[148,149,151],"h3",{"id":150},"_11-define-migration-scope","1.1 Define Migration Scope",[15,153,154],{},"Not all migrations are equal. Clarify exactly what you're doing:",[156,157,158,174],"table",{},[159,160,161],"thead",{},[162,163,164,168,171],"tr",{},[165,166,167],"th",{},"Migration Type",[165,169,170],{},"Complexity",[165,172,173],{},"Typical Timeline",[175,176,177,189,200,211],"tbody",{},[162,178,179,183,186],{},[180,181,182],"td",{},"Theme update (same version)",[180,184,185],{},"Low",[180,187,188],{},"1-2 weeks",[162,190,191,194,197],{},[180,192,193],{},"Minor version upgrade (2024.1 → 2024.2)",[180,195,196],{},"Medium",[180,198,199],{},"2-4 weeks",[162,201,202,205,208],{},[180,203,204],{},"Major version upgrade (2022.x → 2024.x)",[180,206,207],{},"High",[180,209,210],{},"6-12 weeks",[162,212,213,216,219],{},[180,214,215],{},"Platform migration (external → SuiteCommerce)",[180,217,218],{},"Very High",[180,220,221],{},"12-24 weeks",[148,223,225],{"id":224},"_12-business-requirements-gathering","1.2 Business Requirements Gathering",[15,227,228],{},"Document these before touching any code:",[15,230,231],{},[106,232,233],{},"Downtime Tolerance",[27,235,236,239,242],{},[30,237,238],{},"What's the maximum acceptable downtime?",[30,240,241],{},"Are there blackout periods (holiday season, monthly billing cycles)?",[30,243,244],{},"Who approves the go-live decision?",[15,246,247],{},[106,248,249],{},"Data Requirements",[27,251,252,255,258],{},[30,253,254],{},"Historical orders: How far back must they migrate?",[30,256,257],{},"Customer accounts: Passwords, saved addresses, payment methods?",[30,259,260],{},"Product data: Reviews, custom attributes, pricing tiers?",[15,262,263],{},[106,264,265],{},"Feature Parity",[27,267,268,271,274],{},[30,269,270],{},"What functionality must work identically post-migration?",[30,272,273],{},"What can change or improve?",[30,275,276],{},"What legacy features can be deprecated?",[148,278,280],{"id":279},"_13-technical-inventory","1.3 Technical Inventory",[15,282,283],{},"Create a complete inventory of your current implementation:",[285,286,291],"pre",{"className":287,"code":288,"language":289,"meta":290,"style":290},"language-plaintext shiki shiki-themes github-light github-dark","CURRENT STATE DOCUMENTATION\n\nPlatform Version: SuiteCommerce Advanced 2022.2\nTheme: Custom (based on Starter Theme v3)\nExtensions: \n  - Custom Product Configurator (v2.1.0)\n  - B2B Quick Order Pad (v1.4.2)\n  - Advanced Shipping Calculator (v1.0.0)\n  - Custom Payment Gateway Integration (v3.2.1)\n  \nThird-Party Integrations:\n  - Avalara Tax Calculation\n  - ShipStation Fulfillment\n  - Klaviyo Email Marketing\n  - Yotpo Reviews\n  \nCustom SuiteScripts:\n  - ue_custom_checkout_validation.js\n  - sl_shipping_rate_calculator.js\n  - mr_inventory_sync.js\n  \nCustom Records:\n  - customrecord_product_config\n  - customrecord_shipping_rules\n","plaintext","",[292,293,294,302,309,315,321,327,333,339,345,351,357,363,369,375,381,387,392,398,404,410,416,421,427,433],"code",{"__ignoreMap":290},[295,296,299],"span",{"class":297,"line":298},"line",1,[295,300,301],{},"CURRENT STATE DOCUMENTATION\n",[295,303,305],{"class":297,"line":304},2,[295,306,308],{"emptyLinePlaceholder":307},true,"\n",[295,310,312],{"class":297,"line":311},3,[295,313,314],{},"Platform Version: SuiteCommerce Advanced 2022.2\n",[295,316,318],{"class":297,"line":317},4,[295,319,320],{},"Theme: Custom (based on Starter Theme v3)\n",[295,322,324],{"class":297,"line":323},5,[295,325,326],{},"Extensions: \n",[295,328,330],{"class":297,"line":329},6,[295,331,332],{},"  - Custom Product Configurator (v2.1.0)\n",[295,334,336],{"class":297,"line":335},7,[295,337,338],{},"  - B2B Quick Order Pad (v1.4.2)\n",[295,340,342],{"class":297,"line":341},8,[295,343,344],{},"  - Advanced Shipping Calculator (v1.0.0)\n",[295,346,348],{"class":297,"line":347},9,[295,349,350],{},"  - Custom Payment Gateway Integration (v3.2.1)\n",[295,352,354],{"class":297,"line":353},10,[295,355,356],{},"  \n",[295,358,360],{"class":297,"line":359},11,[295,361,362],{},"Third-Party Integrations:\n",[295,364,366],{"class":297,"line":365},12,[295,367,368],{},"  - Avalara Tax Calculation\n",[295,370,372],{"class":297,"line":371},13,[295,373,374],{},"  - ShipStation Fulfillment\n",[295,376,378],{"class":297,"line":377},14,[295,379,380],{},"  - Klaviyo Email Marketing\n",[295,382,384],{"class":297,"line":383},15,[295,385,386],{},"  - Yotpo Reviews\n",[295,388,390],{"class":297,"line":389},16,[295,391,356],{},[295,393,395],{"class":297,"line":394},17,[295,396,397],{},"Custom SuiteScripts:\n",[295,399,401],{"class":297,"line":400},18,[295,402,403],{},"  - ue_custom_checkout_validation.js\n",[295,405,407],{"class":297,"line":406},19,[295,408,409],{},"  - sl_shipping_rate_calculator.js\n",[295,411,413],{"class":297,"line":412},20,[295,414,415],{},"  - mr_inventory_sync.js\n",[295,417,419],{"class":297,"line":418},21,[295,420,356],{},[295,422,424],{"class":297,"line":423},22,[295,425,426],{},"Custom Records:\n",[295,428,430],{"class":297,"line":429},23,[295,431,432],{},"  - customrecord_product_config\n",[295,434,436],{"class":297,"line":435},24,[295,437,438],{},"  - customrecord_shipping_rules\n",[148,440,442],{"id":441},"_14-performance-baseline","1.4 Performance Baseline",[15,444,445],{},"Capture current performance metrics. You'll compare these post-migration to validate success:",[285,447,451],{"className":448,"code":449,"language":450,"meta":290,"style":290},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F Performance metrics to capture before migration\nconst baselineMetrics = {\n  coreWebVitals: {\n    LCP: 2.4,  \u002F\u002F seconds (homepage, PDP, PLP)\n    INP: 180,  \u002F\u002F milliseconds\n    CLS: 0.08\n  },\n  serverMetrics: {\n    TTFB: 0.6,           \u002F\u002F seconds\n    avgPageLoad: 3.2,     \u002F\u002F seconds\n    checkoutCompletion: 4.1  \u002F\u002F seconds\n  },\n  businessMetrics: {\n    conversionRate: 2.8,  \u002F\u002F percent\n    cartAbandonmentRate: 68.5,\n    avgOrderValue: 847    \u002F\u002F dollars\n  }\n};\n","javascript",[292,452,453,459,476,481,495,508,516,521,526,540,553,564,568,573,586,597,608,613],{"__ignoreMap":290},[295,454,455],{"class":297,"line":298},[295,456,458],{"class":457},"sJ8bj","\u002F\u002F Performance metrics to capture before migration\n",[295,460,461,465,469,472],{"class":297,"line":304},[295,462,464],{"class":463},"szBVR","const",[295,466,468],{"class":467},"sj4cs"," baselineMetrics",[295,470,471],{"class":463}," =",[295,473,475],{"class":474},"sVt8B"," {\n",[295,477,478],{"class":297,"line":311},[295,479,480],{"class":474},"  coreWebVitals: {\n",[295,482,483,486,489,492],{"class":297,"line":317},[295,484,485],{"class":474},"    LCP: ",[295,487,488],{"class":467},"2.4",[295,490,491],{"class":474},",  ",[295,493,494],{"class":457},"\u002F\u002F seconds (homepage, PDP, PLP)\n",[295,496,497,500,503,505],{"class":297,"line":323},[295,498,499],{"class":474},"    INP: ",[295,501,502],{"class":467},"180",[295,504,491],{"class":474},[295,506,507],{"class":457},"\u002F\u002F milliseconds\n",[295,509,510,513],{"class":297,"line":329},[295,511,512],{"class":474},"    CLS: ",[295,514,515],{"class":467},"0.08\n",[295,517,518],{"class":297,"line":335},[295,519,520],{"class":474},"  },\n",[295,522,523],{"class":297,"line":341},[295,524,525],{"class":474},"  serverMetrics: {\n",[295,527,528,531,534,537],{"class":297,"line":347},[295,529,530],{"class":474},"    TTFB: ",[295,532,533],{"class":467},"0.6",[295,535,536],{"class":474},",           ",[295,538,539],{"class":457},"\u002F\u002F seconds\n",[295,541,542,545,548,551],{"class":297,"line":353},[295,543,544],{"class":474},"    avgPageLoad: ",[295,546,547],{"class":467},"3.2",[295,549,550],{"class":474},",     ",[295,552,539],{"class":457},[295,554,555,558,561],{"class":297,"line":359},[295,556,557],{"class":474},"    checkoutCompletion: ",[295,559,560],{"class":467},"4.1",[295,562,563],{"class":457},"  \u002F\u002F seconds\n",[295,565,566],{"class":297,"line":365},[295,567,520],{"class":474},[295,569,570],{"class":297,"line":371},[295,571,572],{"class":474},"  businessMetrics: {\n",[295,574,575,578,581,583],{"class":297,"line":377},[295,576,577],{"class":474},"    conversionRate: ",[295,579,580],{"class":467},"2.8",[295,582,491],{"class":474},[295,584,585],{"class":457},"\u002F\u002F percent\n",[295,587,588,591,594],{"class":297,"line":383},[295,589,590],{"class":474},"    cartAbandonmentRate: ",[295,592,593],{"class":467},"68.5",[295,595,596],{"class":474},",\n",[295,598,599,602,605],{"class":297,"line":389},[295,600,601],{"class":474},"    avgOrderValue: ",[295,603,604],{"class":467},"847",[295,606,607],{"class":457},"    \u002F\u002F dollars\n",[295,609,610],{"class":297,"line":394},[295,611,612],{"class":474},"  }\n",[295,614,615],{"class":297,"line":400},[295,616,617],{"class":474},"};\n",[22,619,48],{"id":620},"phase-2-version-compatibility-analysis",[148,622,624],{"id":623},"_21-review-release-notes","2.1 Review Release Notes",[15,626,627],{},"Oracle publishes detailed release notes for each SuiteCommerce version. Don't skim them—read them thoroughly. Look for:",[27,629,630,636,642,648],{},[30,631,632,635],{},[106,633,634],{},"Deprecated APIs",": Functions your extensions might use",[30,637,638,641],{},[106,639,640],{},"Breaking changes",": Modified behaviors that affect existing functionality",[30,643,644,647],{},[106,645,646],{},"New dependencies",": Updated Node.js versions, changed build tools",[30,649,650,653],{},[106,651,652],{},"Security patches",": Required updates that may affect customizations",[148,655,657],{"id":656},"_22-api-deprecation-audit","2.2 API Deprecation Audit",[15,659,660],{},"Run this analysis against your custom code:",[285,662,664],{"className":448,"code":663,"language":450,"meta":290,"style":290},"\u002F\u002F Example: Check for deprecated API usage\nconst deprecatedAPIs = {\n  '2023.1': [\n    'SC.Configuration.get()',  \u002F\u002F Replaced with Configuration.get()\n    'Application.getLayout()', \u002F\u002F Replaced with Layout module\n    'Backbone.View.afterAppend' \u002F\u002F Replaced with lifecycle hooks\n  ],\n  '2024.1': [\n    'jQuery.ajax()', \u002F\u002F Should use Fetch API or Utils.ajax()\n    'underscore.template()', \u002F\u002F Use Handlebars\n    'SC.Environment.published' \u002F\u002F Replaced with Context module\n  ]\n};\n\n\u002F\u002F Grep your codebase for these patterns\n\u002F\u002F grep -r \"SC.Configuration.get\" .\u002FModules\u002F\n",[292,665,666,671,682,691,701,712,720,725,732,742,752,760,765,769,773,778],{"__ignoreMap":290},[295,667,668],{"class":297,"line":298},[295,669,670],{"class":457},"\u002F\u002F Example: Check for deprecated API usage\n",[295,672,673,675,678,680],{"class":297,"line":304},[295,674,464],{"class":463},[295,676,677],{"class":467}," deprecatedAPIs",[295,679,471],{"class":463},[295,681,475],{"class":474},[295,683,684,688],{"class":297,"line":311},[295,685,687],{"class":686},"sZZnC","  '2023.1'",[295,689,690],{"class":474},": [\n",[295,692,693,696,698],{"class":297,"line":317},[295,694,695],{"class":686},"    'SC.Configuration.get()'",[295,697,491],{"class":474},[295,699,700],{"class":457},"\u002F\u002F Replaced with Configuration.get()\n",[295,702,703,706,709],{"class":297,"line":323},[295,704,705],{"class":686},"    'Application.getLayout()'",[295,707,708],{"class":474},", ",[295,710,711],{"class":457},"\u002F\u002F Replaced with Layout module\n",[295,713,714,717],{"class":297,"line":329},[295,715,716],{"class":686},"    'Backbone.View.afterAppend'",[295,718,719],{"class":457}," \u002F\u002F Replaced with lifecycle hooks\n",[295,721,722],{"class":297,"line":335},[295,723,724],{"class":474},"  ],\n",[295,726,727,730],{"class":297,"line":341},[295,728,729],{"class":686},"  '2024.1'",[295,731,690],{"class":474},[295,733,734,737,739],{"class":297,"line":347},[295,735,736],{"class":686},"    'jQuery.ajax()'",[295,738,708],{"class":474},[295,740,741],{"class":457},"\u002F\u002F Should use Fetch API or Utils.ajax()\n",[295,743,744,747,749],{"class":297,"line":353},[295,745,746],{"class":686},"    'underscore.template()'",[295,748,708],{"class":474},[295,750,751],{"class":457},"\u002F\u002F Use Handlebars\n",[295,753,754,757],{"class":297,"line":359},[295,755,756],{"class":686},"    'SC.Environment.published'",[295,758,759],{"class":457}," \u002F\u002F Replaced with Context module\n",[295,761,762],{"class":297,"line":365},[295,763,764],{"class":474},"  ]\n",[295,766,767],{"class":297,"line":371},[295,768,617],{"class":474},[295,770,771],{"class":297,"line":377},[295,772,308],{"emptyLinePlaceholder":307},[295,774,775],{"class":297,"line":383},[295,776,777],{"class":457},"\u002F\u002F Grep your codebase for these patterns\n",[295,779,780],{"class":297,"line":389},[295,781,782],{"class":457},"\u002F\u002F grep -r \"SC.Configuration.get\" .\u002FModules\u002F\n",[148,784,786],{"id":785},"_23-dependency-version-matrix","2.3 Dependency Version Matrix",[15,788,789],{},"Create a compatibility matrix for your tech stack:",[156,791,792,811],{},[159,793,794],{},[162,795,796,799,802,805,808],{},[165,797,798],{},"Component",[165,800,801],{},"Current",[165,803,804],{},"Target",[165,806,807],{},"Compatible?",[165,809,810],{},"Action Required",[175,812,813,830,847,864,880],{},[162,814,815,818,821,824,827],{},[180,816,817],{},"Node.js",[180,819,820],{},"14.x",[180,822,823],{},"18.x",[180,825,826],{},"⚠️ Warning",[180,828,829],{},"Update local dev environments",[162,831,832,835,838,841,844],{},[180,833,834],{},"Gulp",[180,836,837],{},"3.9.1",[180,839,840],{},"4.0.2",[180,842,843],{},"❌ Breaking",[180,845,846],{},"Refactor gulpfile.js",[162,848,849,852,855,858,861],{},[180,850,851],{},"Backbone",[180,853,854],{},"1.3.3",[180,856,857],{},"1.4.1",[180,859,860],{},"✅ Yes",[180,862,863],{},"Minor updates only",[162,865,866,869,872,875,877],{},[180,867,868],{},"Handlebars",[180,870,871],{},"4.0.x",[180,873,874],{},"4.7.x",[180,876,860],{},[180,878,879],{},"None",[162,881,882,885,888,891,893],{},[180,883,884],{},"SASS",[180,886,887],{},"1.32.x",[180,889,890],{},"1.57.x",[180,892,826],{},[180,894,895],{},"Update deprecated syntax",[148,897,899],{"id":898},"_24-extension-compatibility-testing","2.4 Extension Compatibility Testing",[15,901,902],{},"For each custom extension, verify compatibility:",[285,904,908],{"className":905,"code":906,"language":907,"meta":290,"style":290},"language-bash shiki shiki-themes github-light github-dark","# Extension compatibility test procedure\n1. Clone extension to isolated test environment\n2. Update manifest.json to target new SC version\n3. Run gulp deploy against new SC base theme\n4. Catalog all compilation errors\n5. Test all extension entry points manually\n6. Document required code changes\n","bash",[292,909,910,915,939,964,991,1008,1029],{"__ignoreMap":290},[295,911,912],{"class":297,"line":298},[295,913,914],{"class":457},"# Extension compatibility test procedure\n",[295,916,917,921,924,927,930,933,936],{"class":297,"line":304},[295,918,920],{"class":919},"sScJk","1.",[295,922,923],{"class":686}," Clone",[295,925,926],{"class":686}," extension",[295,928,929],{"class":686}," to",[295,931,932],{"class":686}," isolated",[295,934,935],{"class":686}," test",[295,937,938],{"class":686}," environment\n",[295,940,941,944,947,950,952,955,958,961],{"class":297,"line":311},[295,942,943],{"class":919},"2.",[295,945,946],{"class":686}," Update",[295,948,949],{"class":686}," manifest.json",[295,951,929],{"class":686},[295,953,954],{"class":686}," target",[295,956,957],{"class":686}," new",[295,959,960],{"class":686}," SC",[295,962,963],{"class":686}," version\n",[295,965,966,969,972,975,978,981,983,985,988],{"class":297,"line":317},[295,967,968],{"class":919},"3.",[295,970,971],{"class":686}," Run",[295,973,974],{"class":686}," gulp",[295,976,977],{"class":686}," deploy",[295,979,980],{"class":686}," against",[295,982,957],{"class":686},[295,984,960],{"class":686},[295,986,987],{"class":686}," base",[295,989,990],{"class":686}," theme\n",[295,992,993,996,999,1002,1005],{"class":297,"line":323},[295,994,995],{"class":919},"4.",[295,997,998],{"class":686}," Catalog",[295,1000,1001],{"class":686}," all",[295,1003,1004],{"class":686}," compilation",[295,1006,1007],{"class":686}," errors\n",[295,1009,1010,1013,1016,1018,1020,1023,1026],{"class":297,"line":329},[295,1011,1012],{"class":919},"5.",[295,1014,1015],{"class":686}," Test",[295,1017,1001],{"class":686},[295,1019,926],{"class":686},[295,1021,1022],{"class":686}," entry",[295,1024,1025],{"class":686}," points",[295,1027,1028],{"class":686}," manually\n",[295,1030,1031,1034,1037,1040,1043],{"class":297,"line":335},[295,1032,1033],{"class":919},"6.",[295,1035,1036],{"class":686}," Document",[295,1038,1039],{"class":686}," required",[295,1041,1042],{"class":686}," code",[295,1044,1045],{"class":686}," changes\n",[15,1047,1048],{},"Create a compatibility report:",[285,1050,1054],{"className":1051,"code":1052,"language":1053,"meta":290,"style":290},"language-markdown shiki shiki-themes github-light github-dark","## Extension: Custom Product Configurator v2.1.0\n\n### Compilation Status: ⚠️ Errors\n\n### Issues Found:\n1. Line 47: SC.Configuration.get() deprecated\n   - Fix: Replace with Configuration module import\n   \n2. Line 182: jQuery.Deferred() pattern\n   - Fix: Migrate to native Promises\n   \n3. Line 256: Backbone.View lifecycle\n   - Fix: Update to new afterViewRender hook\n\n### Estimated Effort: 8-12 hours\n### Risk Level: Medium\n","markdown",[292,1055,1056,1061,1065,1070,1074,1079,1084,1089,1094,1099,1104,1108,1113,1118,1122,1127],{"__ignoreMap":290},[295,1057,1058],{"class":297,"line":298},[295,1059,1060],{},"## Extension: Custom Product Configurator v2.1.0\n",[295,1062,1063],{"class":297,"line":304},[295,1064,308],{"emptyLinePlaceholder":307},[295,1066,1067],{"class":297,"line":311},[295,1068,1069],{},"### Compilation Status: ⚠️ Errors\n",[295,1071,1072],{"class":297,"line":317},[295,1073,308],{"emptyLinePlaceholder":307},[295,1075,1076],{"class":297,"line":323},[295,1077,1078],{},"### Issues Found:\n",[295,1080,1081],{"class":297,"line":329},[295,1082,1083],{},"1. Line 47: SC.Configuration.get() deprecated\n",[295,1085,1086],{"class":297,"line":335},[295,1087,1088],{},"   - Fix: Replace with Configuration module import\n",[295,1090,1091],{"class":297,"line":341},[295,1092,1093],{},"   \n",[295,1095,1096],{"class":297,"line":347},[295,1097,1098],{},"2. Line 182: jQuery.Deferred() pattern\n",[295,1100,1101],{"class":297,"line":353},[295,1102,1103],{},"   - Fix: Migrate to native Promises\n",[295,1105,1106],{"class":297,"line":359},[295,1107,1093],{},[295,1109,1110],{"class":297,"line":365},[295,1111,1112],{},"3. Line 256: Backbone.View lifecycle\n",[295,1114,1115],{"class":297,"line":371},[295,1116,1117],{},"   - Fix: Update to new afterViewRender hook\n",[295,1119,1120],{"class":297,"line":377},[295,1121,308],{"emptyLinePlaceholder":307},[295,1123,1124],{"class":297,"line":383},[295,1125,1126],{},"### Estimated Effort: 8-12 hours\n",[295,1128,1129],{"class":297,"line":389},[295,1130,1131],{},"### Risk Level: Medium\n",[22,1133,54],{"id":1134},"phase-3-customization-audit",[148,1136,1138],{"id":1137},"_31-theme-customization-inventory","3.1 Theme Customization Inventory",[15,1140,1141],{},"Document every theme modification:",[285,1143,1145],{"className":287,"code":1144,"language":289,"meta":290,"style":290},"THEME MODIFICATIONS\n\n\u002FModules\u002FTheme\u002F\n├── overrides\u002F\n│   ├── Header.View.js          # Custom mega menu\n│   ├── ProductDetails.View.js  # Custom image gallery\n│   └── Cart.View.js            # Custom upsell logic\n├── sass\u002F\n│   ├── _custom-header.scss     # 450 lines\n│   ├── _custom-pdp.scss        # 380 lines\n│   └── _variables-override.scss # 120 lines\n└── templates\u002F\n    ├── header.tpl              # Complete override\n    ├── product_details.tpl     # Partial modifications\n    └── facets_browse.tpl       # Minor tweaks\n",[292,1146,1147,1152,1156,1161,1166,1171,1176,1181,1186,1191,1196,1201,1206,1211,1216],{"__ignoreMap":290},[295,1148,1149],{"class":297,"line":298},[295,1150,1151],{},"THEME MODIFICATIONS\n",[295,1153,1154],{"class":297,"line":304},[295,1155,308],{"emptyLinePlaceholder":307},[295,1157,1158],{"class":297,"line":311},[295,1159,1160],{},"\u002FModules\u002FTheme\u002F\n",[295,1162,1163],{"class":297,"line":317},[295,1164,1165],{},"├── overrides\u002F\n",[295,1167,1168],{"class":297,"line":323},[295,1169,1170],{},"│   ├── Header.View.js          # Custom mega menu\n",[295,1172,1173],{"class":297,"line":329},[295,1174,1175],{},"│   ├── ProductDetails.View.js  # Custom image gallery\n",[295,1177,1178],{"class":297,"line":335},[295,1179,1180],{},"│   └── Cart.View.js            # Custom upsell logic\n",[295,1182,1183],{"class":297,"line":341},[295,1184,1185],{},"├── sass\u002F\n",[295,1187,1188],{"class":297,"line":347},[295,1189,1190],{},"│   ├── _custom-header.scss     # 450 lines\n",[295,1192,1193],{"class":297,"line":353},[295,1194,1195],{},"│   ├── _custom-pdp.scss        # 380 lines\n",[295,1197,1198],{"class":297,"line":359},[295,1199,1200],{},"│   └── _variables-override.scss # 120 lines\n",[295,1202,1203],{"class":297,"line":365},[295,1204,1205],{},"└── templates\u002F\n",[295,1207,1208],{"class":297,"line":371},[295,1209,1210],{},"    ├── header.tpl              # Complete override\n",[295,1212,1213],{"class":297,"line":377},[295,1214,1215],{},"    ├── product_details.tpl     # Partial modifications\n",[295,1217,1218],{"class":297,"line":383},[295,1219,1220],{},"    └── facets_browse.tpl       # Minor tweaks\n",[148,1222,1224],{"id":1223},"_32-classify-customizations-by-risk","3.2 Classify Customizations by Risk",[15,1226,1227],{},"Categorize each customization:",[156,1229,1230,1243],{},[159,1231,1232],{},[162,1233,1234,1237,1240],{},[165,1235,1236],{},"Risk Level",[165,1238,1239],{},"Criteria",[165,1241,1242],{},"Migration Approach",[175,1244,1245,1255,1265,1275],{},[162,1246,1247,1249,1252],{},[180,1248,185],{},[180,1250,1251],{},"CSS-only changes, minor template tweaks",[180,1253,1254],{},"Direct port",[162,1256,1257,1259,1262],{},[180,1258,196],{},[180,1260,1261],{},"View logic modifications, new components",[180,1263,1264],{},"Test and adapt",[162,1266,1267,1269,1272],{},[180,1268,207],{},[180,1270,1271],{},"Core functionality overrides, API integrations",[180,1273,1274],{},"Rebuild and validate",[162,1276,1277,1280,1283],{},[180,1278,1279],{},"Critical",[180,1281,1282],{},"Checkout, payment, order processing",[180,1284,1285],{},"Full regression testing",[148,1287,1289],{"id":1288},"_33-document-business-logic","3.3 Document Business Logic",[15,1291,1292],{},"For every custom business logic, document the \"why\" not just the \"what\":",[285,1294,1296],{"className":448,"code":1295,"language":450,"meta":290,"style":290},"\u002F\u002F BEFORE: Undocumented customization\nif (order.shipmethod === 'GROUND' && order.total > 500) {\n  order.shipmethod = 'EXPRESS';\n}\n\n\u002F\u002F AFTER: Documented customization\n\u002F**\n * Shipping Upgrade Rule (Implemented: 2023-06)\n * \n * BUSINESS RULE: Orders over $500 with ground shipping selected\n * automatically upgrade to express at no additional cost.\n * \n * STAKEHOLDER: VP Sales (approval email: 2023-06-15)\n * REASON: Customer retention initiative - high-value orders\n *         were experiencing delivery complaints\n * \n * DEPENDENCIES: Requires EXPRESS shipping method in NetSuite\n * TESTING: Verify with orders $499, $500, $501\n *\u002F\nif (order.shipmethod === 'GROUND' && order.total > 500) {\n  order.shipmethod = 'EXPRESS';\n}\n",[292,1297,1298,1303,1332,1346,1351,1355,1360,1365,1370,1375,1380,1385,1389,1394,1399,1404,1408,1413,1418,1423,1443,1453],{"__ignoreMap":290},[295,1299,1300],{"class":297,"line":298},[295,1301,1302],{"class":457},"\u002F\u002F BEFORE: Undocumented customization\n",[295,1304,1305,1308,1311,1314,1317,1320,1323,1326,1329],{"class":297,"line":304},[295,1306,1307],{"class":463},"if",[295,1309,1310],{"class":474}," (order.shipmethod ",[295,1312,1313],{"class":463},"===",[295,1315,1316],{"class":686}," 'GROUND'",[295,1318,1319],{"class":463}," &&",[295,1321,1322],{"class":474}," order.total ",[295,1324,1325],{"class":463},">",[295,1327,1328],{"class":467}," 500",[295,1330,1331],{"class":474},") {\n",[295,1333,1334,1337,1340,1343],{"class":297,"line":311},[295,1335,1336],{"class":474},"  order.shipmethod ",[295,1338,1339],{"class":463},"=",[295,1341,1342],{"class":686}," 'EXPRESS'",[295,1344,1345],{"class":474},";\n",[295,1347,1348],{"class":297,"line":317},[295,1349,1350],{"class":474},"}\n",[295,1352,1353],{"class":297,"line":323},[295,1354,308],{"emptyLinePlaceholder":307},[295,1356,1357],{"class":297,"line":329},[295,1358,1359],{"class":457},"\u002F\u002F AFTER: Documented customization\n",[295,1361,1362],{"class":297,"line":335},[295,1363,1364],{"class":457},"\u002F**\n",[295,1366,1367],{"class":297,"line":341},[295,1368,1369],{"class":457}," * Shipping Upgrade Rule (Implemented: 2023-06)\n",[295,1371,1372],{"class":297,"line":347},[295,1373,1374],{"class":457}," * \n",[295,1376,1377],{"class":297,"line":353},[295,1378,1379],{"class":457}," * BUSINESS RULE: Orders over $500 with ground shipping selected\n",[295,1381,1382],{"class":297,"line":359},[295,1383,1384],{"class":457}," * automatically upgrade to express at no additional cost.\n",[295,1386,1387],{"class":297,"line":365},[295,1388,1374],{"class":457},[295,1390,1391],{"class":297,"line":371},[295,1392,1393],{"class":457}," * STAKEHOLDER: VP Sales (approval email: 2023-06-15)\n",[295,1395,1396],{"class":297,"line":377},[295,1397,1398],{"class":457}," * REASON: Customer retention initiative - high-value orders\n",[295,1400,1401],{"class":297,"line":383},[295,1402,1403],{"class":457}," *         were experiencing delivery complaints\n",[295,1405,1406],{"class":297,"line":389},[295,1407,1374],{"class":457},[295,1409,1410],{"class":297,"line":394},[295,1411,1412],{"class":457}," * DEPENDENCIES: Requires EXPRESS shipping method in NetSuite\n",[295,1414,1415],{"class":297,"line":400},[295,1416,1417],{"class":457}," * TESTING: Verify with orders $499, $500, $501\n",[295,1419,1420],{"class":297,"line":406},[295,1421,1422],{"class":457}," *\u002F\n",[295,1424,1425,1427,1429,1431,1433,1435,1437,1439,1441],{"class":297,"line":412},[295,1426,1307],{"class":463},[295,1428,1310],{"class":474},[295,1430,1313],{"class":463},[295,1432,1316],{"class":686},[295,1434,1319],{"class":463},[295,1436,1322],{"class":474},[295,1438,1325],{"class":463},[295,1440,1328],{"class":467},[295,1442,1331],{"class":474},[295,1444,1445,1447,1449,1451],{"class":297,"line":418},[295,1446,1336],{"class":474},[295,1448,1339],{"class":463},[295,1450,1342],{"class":686},[295,1452,1345],{"class":474},[295,1454,1455],{"class":297,"line":423},[295,1456,1350],{"class":474},[148,1458,1460],{"id":1459},"_34-suitescript-audit","3.4 SuiteScript Audit",[15,1462,1463],{},"Audit all custom SuiteScripts:",[285,1465,1467],{"className":448,"code":1466,"language":450,"meta":290,"style":290},"\u002F\u002F SuiteScript compatibility checklist\nconst scriptAudit = {\n  scriptId: 'customscript_checkout_validation',\n  scriptType: 'UserEvent',\n  deployedTo: ['Sales Order'],\n  apiVersion: '2.0',  \u002F\u002F ✅ Current\n  \n  \u002F\u002F Check for version-specific issues\n  usesNLAPI: false,   \u002F\u002F ✅ Good - NLAPI is deprecated\n  usesHttps: true,    \u002F\u002F ✅ Using N\u002Fhttps module\n  governanceUsage: {\n    beforeSubmit: 15,  \u002F\u002F units\n    afterSubmit: 45    \u002F\u002F units - watch this\n  },\n  \n  \u002F\u002F External dependencies\n  callsExternalAPIs: ['avalara.com', 'shipstation.com'],\n  handlesErrors: true,\n  hasLogging: true,\n  \n  migrationRisk: 'Low'\n};\n",[292,1468,1469,1474,1485,1495,1505,1516,1529,1533,1538,1552,1566,1571,1584,1595,1599,1603,1608,1623,1632,1641,1645,1653],{"__ignoreMap":290},[295,1470,1471],{"class":297,"line":298},[295,1472,1473],{"class":457},"\u002F\u002F SuiteScript compatibility checklist\n",[295,1475,1476,1478,1481,1483],{"class":297,"line":304},[295,1477,464],{"class":463},[295,1479,1480],{"class":467}," scriptAudit",[295,1482,471],{"class":463},[295,1484,475],{"class":474},[295,1486,1487,1490,1493],{"class":297,"line":311},[295,1488,1489],{"class":474},"  scriptId: ",[295,1491,1492],{"class":686},"'customscript_checkout_validation'",[295,1494,596],{"class":474},[295,1496,1497,1500,1503],{"class":297,"line":317},[295,1498,1499],{"class":474},"  scriptType: ",[295,1501,1502],{"class":686},"'UserEvent'",[295,1504,596],{"class":474},[295,1506,1507,1510,1513],{"class":297,"line":323},[295,1508,1509],{"class":474},"  deployedTo: [",[295,1511,1512],{"class":686},"'Sales Order'",[295,1514,1515],{"class":474},"],\n",[295,1517,1518,1521,1524,1526],{"class":297,"line":329},[295,1519,1520],{"class":474},"  apiVersion: ",[295,1522,1523],{"class":686},"'2.0'",[295,1525,491],{"class":474},[295,1527,1528],{"class":457},"\u002F\u002F ✅ Current\n",[295,1530,1531],{"class":297,"line":335},[295,1532,356],{"class":474},[295,1534,1535],{"class":297,"line":341},[295,1536,1537],{"class":457},"  \u002F\u002F Check for version-specific issues\n",[295,1539,1540,1543,1546,1549],{"class":297,"line":347},[295,1541,1542],{"class":474},"  usesNLAPI: ",[295,1544,1545],{"class":467},"false",[295,1547,1548],{"class":474},",   ",[295,1550,1551],{"class":457},"\u002F\u002F ✅ Good - NLAPI is deprecated\n",[295,1553,1554,1557,1560,1563],{"class":297,"line":353},[295,1555,1556],{"class":474},"  usesHttps: ",[295,1558,1559],{"class":467},"true",[295,1561,1562],{"class":474},",    ",[295,1564,1565],{"class":457},"\u002F\u002F ✅ Using N\u002Fhttps module\n",[295,1567,1568],{"class":297,"line":359},[295,1569,1570],{"class":474},"  governanceUsage: {\n",[295,1572,1573,1576,1579,1581],{"class":297,"line":365},[295,1574,1575],{"class":474},"    beforeSubmit: ",[295,1577,1578],{"class":467},"15",[295,1580,491],{"class":474},[295,1582,1583],{"class":457},"\u002F\u002F units\n",[295,1585,1586,1589,1592],{"class":297,"line":371},[295,1587,1588],{"class":474},"    afterSubmit: ",[295,1590,1591],{"class":467},"45",[295,1593,1594],{"class":457},"    \u002F\u002F units - watch this\n",[295,1596,1597],{"class":297,"line":377},[295,1598,520],{"class":474},[295,1600,1601],{"class":297,"line":383},[295,1602,356],{"class":474},[295,1604,1605],{"class":297,"line":389},[295,1606,1607],{"class":457},"  \u002F\u002F External dependencies\n",[295,1609,1610,1613,1616,1618,1621],{"class":297,"line":394},[295,1611,1612],{"class":474},"  callsExternalAPIs: [",[295,1614,1615],{"class":686},"'avalara.com'",[295,1617,708],{"class":474},[295,1619,1620],{"class":686},"'shipstation.com'",[295,1622,1515],{"class":474},[295,1624,1625,1628,1630],{"class":297,"line":400},[295,1626,1627],{"class":474},"  handlesErrors: ",[295,1629,1559],{"class":467},[295,1631,596],{"class":474},[295,1633,1634,1637,1639],{"class":297,"line":406},[295,1635,1636],{"class":474},"  hasLogging: ",[295,1638,1559],{"class":467},[295,1640,596],{"class":474},[295,1642,1643],{"class":297,"line":412},[295,1644,356],{"class":474},[295,1646,1647,1650],{"class":297,"line":418},[295,1648,1649],{"class":474},"  migrationRisk: ",[295,1651,1652],{"class":686},"'Low'\n",[295,1654,1655],{"class":297,"line":423},[295,1656,617],{"class":474},[22,1658,60],{"id":1659},"phase-4-data-backup-and-recovery-planning",[148,1661,1663],{"id":1662},"_41-comprehensive-backup-strategy","4.1 Comprehensive Backup Strategy",[15,1665,1666],{},"Never migrate without backups. Create redundant copies:",[15,1668,1669],{},[106,1670,1671],{},"NetSuite Data Backup",[285,1673,1675],{"className":287,"code":1674,"language":289,"meta":290,"style":290},"BACKUP CHECKLIST - NETSUITE\n\n□ Export all saved searches to CSV\n□ Export custom records (SuiteQL or saved search)\n□ Screenshot all custom forms configurations\n□ Export workflow definitions\n□ Document all role permissions\n□ Export all scripts and deployments\n□ Backup File Cabinet custom folders\n\nStorage: Minimum 2 locations (cloud + local)\nRetention: 90 days post-migration\n",[292,1676,1677,1682,1686,1691,1696,1701,1706,1711,1716,1721,1725,1730],{"__ignoreMap":290},[295,1678,1679],{"class":297,"line":298},[295,1680,1681],{},"BACKUP CHECKLIST - NETSUITE\n",[295,1683,1684],{"class":297,"line":304},[295,1685,308],{"emptyLinePlaceholder":307},[295,1687,1688],{"class":297,"line":311},[295,1689,1690],{},"□ Export all saved searches to CSV\n",[295,1692,1693],{"class":297,"line":317},[295,1694,1695],{},"□ Export custom records (SuiteQL or saved search)\n",[295,1697,1698],{"class":297,"line":323},[295,1699,1700],{},"□ Screenshot all custom forms configurations\n",[295,1702,1703],{"class":297,"line":329},[295,1704,1705],{},"□ Export workflow definitions\n",[295,1707,1708],{"class":297,"line":335},[295,1709,1710],{},"□ Document all role permissions\n",[295,1712,1713],{"class":297,"line":341},[295,1714,1715],{},"□ Export all scripts and deployments\n",[295,1717,1718],{"class":297,"line":347},[295,1719,1720],{},"□ Backup File Cabinet custom folders\n",[295,1722,1723],{"class":297,"line":353},[295,1724,308],{"emptyLinePlaceholder":307},[295,1726,1727],{"class":297,"line":359},[295,1728,1729],{},"Storage: Minimum 2 locations (cloud + local)\n",[295,1731,1732],{"class":297,"line":365},[295,1733,1734],{},"Retention: 90 days post-migration\n",[15,1736,1737],{},[106,1738,1739],{},"SuiteCommerce Code Backup",[285,1741,1743],{"className":905,"code":1742,"language":907,"meta":290,"style":290},"# Complete code backup procedure\ncd \u002Fpath\u002Fto\u002Fsuitecommerce\n\n# Tag current state in git\ngit tag -a \"pre-migration-$(date +%Y%m%d)\" -m \"Backup before migration to v2024.1\"\ngit push origin --tags\n\n# Create archive\ntar -czvf sc-backup-$(date +%Y%m%d).tar.gz \\\n  --exclude='node_modules' \\\n  --exclude='.git' \\\n  .\u002F\n\n# Upload to cloud storage\naws s3 cp sc-backup-*.tar.gz s3:\u002F\u002Fcompany-backups\u002Fsuitecommerce\u002F\n",[292,1744,1745,1750,1758,1762,1767,1793,1806,1810,1815,1843,1853,1862,1867,1871,1876],{"__ignoreMap":290},[295,1746,1747],{"class":297,"line":298},[295,1748,1749],{"class":457},"# Complete code backup procedure\n",[295,1751,1752,1755],{"class":297,"line":304},[295,1753,1754],{"class":467},"cd",[295,1756,1757],{"class":686}," \u002Fpath\u002Fto\u002Fsuitecommerce\n",[295,1759,1760],{"class":297,"line":311},[295,1761,308],{"emptyLinePlaceholder":307},[295,1763,1764],{"class":297,"line":317},[295,1765,1766],{"class":457},"# Tag current state in git\n",[295,1768,1769,1772,1775,1778,1781,1784,1787,1790],{"class":297,"line":323},[295,1770,1771],{"class":919},"git",[295,1773,1774],{"class":686}," tag",[295,1776,1777],{"class":467}," -a",[295,1779,1780],{"class":686}," \"pre-migration-$(",[295,1782,1783],{"class":919},"date",[295,1785,1786],{"class":686}," +%Y%m%d)\"",[295,1788,1789],{"class":467}," -m",[295,1791,1792],{"class":686}," \"Backup before migration to v2024.1\"\n",[295,1794,1795,1797,1800,1803],{"class":297,"line":329},[295,1796,1771],{"class":919},[295,1798,1799],{"class":686}," push",[295,1801,1802],{"class":686}," origin",[295,1804,1805],{"class":467}," --tags\n",[295,1807,1808],{"class":297,"line":335},[295,1809,308],{"emptyLinePlaceholder":307},[295,1811,1812],{"class":297,"line":341},[295,1813,1814],{"class":457},"# Create archive\n",[295,1816,1817,1820,1823,1826,1829,1831,1834,1837,1840],{"class":297,"line":347},[295,1818,1819],{"class":919},"tar",[295,1821,1822],{"class":467}," -czvf",[295,1824,1825],{"class":686}," sc-backup-",[295,1827,1828],{"class":474},"$(",[295,1830,1783],{"class":919},[295,1832,1833],{"class":686}," +%Y%m%d",[295,1835,1836],{"class":474},")",[295,1838,1839],{"class":686},".tar.gz",[295,1841,1842],{"class":467}," \\\n",[295,1844,1845,1848,1851],{"class":297,"line":353},[295,1846,1847],{"class":467},"  --exclude=",[295,1849,1850],{"class":686},"'node_modules'",[295,1852,1842],{"class":467},[295,1854,1855,1857,1860],{"class":297,"line":359},[295,1856,1847],{"class":467},[295,1858,1859],{"class":686},"'.git'",[295,1861,1842],{"class":467},[295,1863,1864],{"class":297,"line":365},[295,1865,1866],{"class":686},"  .\u002F\n",[295,1868,1869],{"class":297,"line":371},[295,1870,308],{"emptyLinePlaceholder":307},[295,1872,1873],{"class":297,"line":377},[295,1874,1875],{"class":457},"# Upload to cloud storage\n",[295,1877,1878,1881,1884,1887,1889,1892,1894],{"class":297,"line":383},[295,1879,1880],{"class":919},"aws",[295,1882,1883],{"class":686}," s3",[295,1885,1886],{"class":686}," cp",[295,1888,1825],{"class":686},[295,1890,1891],{"class":467},"*",[295,1893,1839],{"class":686},[295,1895,1896],{"class":686}," s3:\u002F\u002Fcompany-backups\u002Fsuitecommerce\u002F\n",[148,1898,1900],{"id":1899},"_42-rollback-procedures","4.2 Rollback Procedures",[15,1902,1903],{},"Document exact rollback steps for every migration phase:",[285,1905,1907],{"className":1051,"code":1906,"language":1053,"meta":290,"style":290},"## ROLLBACK PROCEDURE - PHASE 6 (DEPLOYMENT)\n\n### Trigger Conditions:\n- Critical checkout errors affecting >1% of transactions\n- Payment processing failures\n- Order sync failures to NetSuite\n- Homepage\u002FPDP\u002FPLP returning errors\n\n### Rollback Steps:\n1. **Immediate** (\u003C 5 minutes)\n   - Revert SSP application to previous bundle\n   - NetSuite: Setup > SuiteCommerce > SSP Applications\n   - Select previous version from dropdown\n   - Save\n\n2. **DNS Rollback** (if applicable)\n   - Revert CNAME to previous deployment\n   - TTL: Ensure pre-migration TTL was lowered to 300s\n\n3. **Database Sync**\n   - Pause all scheduled scripts\n   - Run order reconciliation report\n   - Manually process any orders stuck in queue\n\n### Communication:\n- Slack: #ecommerce-oncall\n- Email: stakeholder-list@company.com\n- Status page update: status.company.com\n\n### Post-Rollback:\n- Incident report within 24 hours\n- Root cause analysis within 72 hours\n",[292,1908,1909,1914,1918,1923,1928,1933,1938,1943,1947,1952,1957,1962,1967,1972,1977,1981,1986,1991,1996,2000,2005,2010,2015,2020,2024,2030,2036,2042,2048,2053,2059,2065],{"__ignoreMap":290},[295,1910,1911],{"class":297,"line":298},[295,1912,1913],{},"## ROLLBACK PROCEDURE - PHASE 6 (DEPLOYMENT)\n",[295,1915,1916],{"class":297,"line":304},[295,1917,308],{"emptyLinePlaceholder":307},[295,1919,1920],{"class":297,"line":311},[295,1921,1922],{},"### Trigger Conditions:\n",[295,1924,1925],{"class":297,"line":317},[295,1926,1927],{},"- Critical checkout errors affecting >1% of transactions\n",[295,1929,1930],{"class":297,"line":323},[295,1931,1932],{},"- Payment processing failures\n",[295,1934,1935],{"class":297,"line":329},[295,1936,1937],{},"- Order sync failures to NetSuite\n",[295,1939,1940],{"class":297,"line":335},[295,1941,1942],{},"- Homepage\u002FPDP\u002FPLP returning errors\n",[295,1944,1945],{"class":297,"line":341},[295,1946,308],{"emptyLinePlaceholder":307},[295,1948,1949],{"class":297,"line":347},[295,1950,1951],{},"### Rollback Steps:\n",[295,1953,1954],{"class":297,"line":353},[295,1955,1956],{},"1. **Immediate** (\u003C 5 minutes)\n",[295,1958,1959],{"class":297,"line":359},[295,1960,1961],{},"   - Revert SSP application to previous bundle\n",[295,1963,1964],{"class":297,"line":365},[295,1965,1966],{},"   - NetSuite: Setup > SuiteCommerce > SSP Applications\n",[295,1968,1969],{"class":297,"line":371},[295,1970,1971],{},"   - Select previous version from dropdown\n",[295,1973,1974],{"class":297,"line":377},[295,1975,1976],{},"   - Save\n",[295,1978,1979],{"class":297,"line":383},[295,1980,308],{"emptyLinePlaceholder":307},[295,1982,1983],{"class":297,"line":389},[295,1984,1985],{},"2. **DNS Rollback** (if applicable)\n",[295,1987,1988],{"class":297,"line":394},[295,1989,1990],{},"   - Revert CNAME to previous deployment\n",[295,1992,1993],{"class":297,"line":400},[295,1994,1995],{},"   - TTL: Ensure pre-migration TTL was lowered to 300s\n",[295,1997,1998],{"class":297,"line":406},[295,1999,308],{"emptyLinePlaceholder":307},[295,2001,2002],{"class":297,"line":412},[295,2003,2004],{},"3. **Database Sync**\n",[295,2006,2007],{"class":297,"line":418},[295,2008,2009],{},"   - Pause all scheduled scripts\n",[295,2011,2012],{"class":297,"line":423},[295,2013,2014],{},"   - Run order reconciliation report\n",[295,2016,2017],{"class":297,"line":429},[295,2018,2019],{},"   - Manually process any orders stuck in queue\n",[295,2021,2022],{"class":297,"line":435},[295,2023,308],{"emptyLinePlaceholder":307},[295,2025,2027],{"class":297,"line":2026},25,[295,2028,2029],{},"### Communication:\n",[295,2031,2033],{"class":297,"line":2032},26,[295,2034,2035],{},"- Slack: #ecommerce-oncall\n",[295,2037,2039],{"class":297,"line":2038},27,[295,2040,2041],{},"- Email: stakeholder-list@company.com\n",[295,2043,2045],{"class":297,"line":2044},28,[295,2046,2047],{},"- Status page update: status.company.com\n",[295,2049,2051],{"class":297,"line":2050},29,[295,2052,308],{"emptyLinePlaceholder":307},[295,2054,2056],{"class":297,"line":2055},30,[295,2057,2058],{},"### Post-Rollback:\n",[295,2060,2062],{"class":297,"line":2061},31,[295,2063,2064],{},"- Incident report within 24 hours\n",[295,2066,2068],{"class":297,"line":2067},32,[295,2069,2070],{},"- Root cause analysis within 72 hours\n",[148,2072,2074],{"id":2073},"_43-data-freeze-protocol","4.3 Data Freeze Protocol",[15,2076,2077],{},"For migrations requiring data consistency:",[285,2079,2081],{"className":287,"code":2080,"language":289,"meta":290,"style":290},"DATA FREEZE TIMELINE\n\nT-24 hours:\n□ Notify customer service team\n□ Add banner to site: \"Scheduled maintenance Saturday 2-4 AM\"\n□ Disable promotional campaign triggers\n\nT-4 hours:\n□ Stop scheduled inventory syncs\n□ Disable automated email campaigns\n□ Export current order queue status\n\nT-1 hour:\n□ Disable new customer registration\n□ Disable wishlist\u002Fsaved cart updates\n□ Set cart expiration to 30 minutes\n\nT-0 (Migration Start):\n□ Enable maintenance mode\n□ Final order queue export\n□ Begin migration\n\nT+X (Migration Complete):\n□ Validate order queue restored\n□ Re-enable all systems\n□ Monitor for 2 hours\n",[292,2082,2083,2088,2092,2097,2102,2107,2112,2116,2121,2126,2131,2136,2140,2145,2150,2155,2160,2164,2169,2174,2179,2184,2188,2193,2198,2203],{"__ignoreMap":290},[295,2084,2085],{"class":297,"line":298},[295,2086,2087],{},"DATA FREEZE TIMELINE\n",[295,2089,2090],{"class":297,"line":304},[295,2091,308],{"emptyLinePlaceholder":307},[295,2093,2094],{"class":297,"line":311},[295,2095,2096],{},"T-24 hours:\n",[295,2098,2099],{"class":297,"line":317},[295,2100,2101],{},"□ Notify customer service team\n",[295,2103,2104],{"class":297,"line":323},[295,2105,2106],{},"□ Add banner to site: \"Scheduled maintenance Saturday 2-4 AM\"\n",[295,2108,2109],{"class":297,"line":329},[295,2110,2111],{},"□ Disable promotional campaign triggers\n",[295,2113,2114],{"class":297,"line":335},[295,2115,308],{"emptyLinePlaceholder":307},[295,2117,2118],{"class":297,"line":341},[295,2119,2120],{},"T-4 hours:\n",[295,2122,2123],{"class":297,"line":347},[295,2124,2125],{},"□ Stop scheduled inventory syncs\n",[295,2127,2128],{"class":297,"line":353},[295,2129,2130],{},"□ Disable automated email campaigns\n",[295,2132,2133],{"class":297,"line":359},[295,2134,2135],{},"□ Export current order queue status\n",[295,2137,2138],{"class":297,"line":365},[295,2139,308],{"emptyLinePlaceholder":307},[295,2141,2142],{"class":297,"line":371},[295,2143,2144],{},"T-1 hour:\n",[295,2146,2147],{"class":297,"line":377},[295,2148,2149],{},"□ Disable new customer registration\n",[295,2151,2152],{"class":297,"line":383},[295,2153,2154],{},"□ Disable wishlist\u002Fsaved cart updates\n",[295,2156,2157],{"class":297,"line":389},[295,2158,2159],{},"□ Set cart expiration to 30 minutes\n",[295,2161,2162],{"class":297,"line":394},[295,2163,308],{"emptyLinePlaceholder":307},[295,2165,2166],{"class":297,"line":400},[295,2167,2168],{},"T-0 (Migration Start):\n",[295,2170,2171],{"class":297,"line":406},[295,2172,2173],{},"□ Enable maintenance mode\n",[295,2175,2176],{"class":297,"line":412},[295,2177,2178],{},"□ Final order queue export\n",[295,2180,2181],{"class":297,"line":418},[295,2182,2183],{},"□ Begin migration\n",[295,2185,2186],{"class":297,"line":423},[295,2187,308],{"emptyLinePlaceholder":307},[295,2189,2190],{"class":297,"line":429},[295,2191,2192],{},"T+X (Migration Complete):\n",[295,2194,2195],{"class":297,"line":435},[295,2196,2197],{},"□ Validate order queue restored\n",[295,2199,2200],{"class":297,"line":2026},[295,2201,2202],{},"□ Re-enable all systems\n",[295,2204,2205],{"class":297,"line":2032},[295,2206,2207],{},"□ Monitor for 2 hours\n",[22,2209,66],{"id":2210},"phase-5-staging-environment-setup",[15,2212,2213],{},[143,2214],{"alt":2215,"src":2216},"Cloud data center and server infrastructure","\u002Fimages\u002Fblog\u002Fmigration-checklist-datacenter.webp",[148,2218,2220],{"id":2219},"_51-production-mirror-staging","5.1 Production-Mirror Staging",[15,2222,2223],{},"Your staging environment must mirror production exactly:",[285,2225,2227],{"className":287,"code":2226,"language":289,"meta":290,"style":290},"STAGING ENVIRONMENT REQUIREMENTS\n\nNetSuite:\n□ Sandbox account with recent production refresh\n□ All custom records synced\n□ All SuiteScripts deployed\n□ Test payment processor credentials\n\nSuiteCommerce:\n□ Separate SSP application\n□ Isolated domain (staging.company.com)\n□ SSL certificate configured\n□ CDN configured (or bypassed for testing)\n\nData:\n□ Product catalog (full or representative subset)\n□ Customer accounts (anonymized production data)\n□ Pricing rules and promotions\n□ Inventory levels\n",[292,2228,2229,2234,2238,2243,2248,2253,2258,2263,2267,2272,2277,2282,2287,2292,2296,2301,2306,2311,2316],{"__ignoreMap":290},[295,2230,2231],{"class":297,"line":298},[295,2232,2233],{},"STAGING ENVIRONMENT REQUIREMENTS\n",[295,2235,2236],{"class":297,"line":304},[295,2237,308],{"emptyLinePlaceholder":307},[295,2239,2240],{"class":297,"line":311},[295,2241,2242],{},"NetSuite:\n",[295,2244,2245],{"class":297,"line":317},[295,2246,2247],{},"□ Sandbox account with recent production refresh\n",[295,2249,2250],{"class":297,"line":323},[295,2251,2252],{},"□ All custom records synced\n",[295,2254,2255],{"class":297,"line":329},[295,2256,2257],{},"□ All SuiteScripts deployed\n",[295,2259,2260],{"class":297,"line":335},[295,2261,2262],{},"□ Test payment processor credentials\n",[295,2264,2265],{"class":297,"line":341},[295,2266,308],{"emptyLinePlaceholder":307},[295,2268,2269],{"class":297,"line":347},[295,2270,2271],{},"SuiteCommerce:\n",[295,2273,2274],{"class":297,"line":353},[295,2275,2276],{},"□ Separate SSP application\n",[295,2278,2279],{"class":297,"line":359},[295,2280,2281],{},"□ Isolated domain (staging.company.com)\n",[295,2283,2284],{"class":297,"line":365},[295,2285,2286],{},"□ SSL certificate configured\n",[295,2288,2289],{"class":297,"line":371},[295,2290,2291],{},"□ CDN configured (or bypassed for testing)\n",[295,2293,2294],{"class":297,"line":377},[295,2295,308],{"emptyLinePlaceholder":307},[295,2297,2298],{"class":297,"line":383},[295,2299,2300],{},"Data:\n",[295,2302,2303],{"class":297,"line":389},[295,2304,2305],{},"□ Product catalog (full or representative subset)\n",[295,2307,2308],{"class":297,"line":394},[295,2309,2310],{},"□ Customer accounts (anonymized production data)\n",[295,2312,2313],{"class":297,"line":400},[295,2314,2315],{},"□ Pricing rules and promotions\n",[295,2317,2318],{"class":297,"line":406},[295,2319,2320],{},"□ Inventory levels\n",[148,2322,2324],{"id":2323},"_52-automated-testing-infrastructure","5.2 Automated Testing Infrastructure",[15,2326,2327],{},"Set up automated testing before migration:",[285,2329,2331],{"className":448,"code":2330,"language":450,"meta":290,"style":290},"\u002F\u002F Example: Cypress E2E test suite for SuiteCommerce\ndescribe('Critical Path Tests', () => {\n  \n  describe('Guest Checkout', () => {\n    it('should complete checkout with credit card', () => {\n      cy.visit('\u002Fproduct\u002Fsample-product');\n      cy.get('[data-action=\"add-to-cart\"]').click();\n      cy.get('[data-action=\"proceed-to-checkout\"]').click();\n      \n      \u002F\u002F Fill shipping\n      cy.get('#shipping-address-form').within(() => {\n        cy.get('[name=\"firstname\"]').type('Test');\n        cy.get('[name=\"lastname\"]').type('User');\n        cy.get('[name=\"addr1\"]').type('123 Test St');\n        cy.get('[name=\"city\"]').type('Austin');\n        cy.get('[name=\"state\"]').select('TX');\n        cy.get('[name=\"zip\"]').type('78701');\n      });\n      \n      \u002F\u002F Select shipping method\n      cy.get('[data-shipmethod=\"standard\"]').click();\n      \n      \u002F\u002F Payment\n      cy.get('#cc-number').type('4111111111111111');\n      cy.get('#cc-expiry').type('12\u002F28');\n      cy.get('#cc-cvv').type('123');\n      \n      \u002F\u002F Submit\n      cy.get('[data-action=\"submit-order\"]').click();\n      \n      \u002F\u002F Verify confirmation\n      cy.url().should('include', '\u002Fconfirmation');\n      cy.contains('Thank you for your order');\n    });\n  });\n  \n  describe('B2B Customer Flow', () => {\n    it('should apply customer-specific pricing', () => {\n      cy.login('b2b-customer@test.com', 'password');\n      cy.visit('\u002Fproduct\u002Fsample-product');\n      cy.get('[data-price]').should('contain', '$89.99'); \u002F\u002F Custom price\n    });\n    \n    it('should allow purchase on terms', () => {\n      cy.login('b2b-customer@test.com', 'password');\n      cy.addToCart('sample-product');\n      cy.checkout();\n      cy.get('[data-payment=\"terms\"]').should('be.visible');\n      cy.get('[data-payment=\"terms\"]').click();\n      cy.submitOrder();\n      cy.url().should('include', '\u002Fconfirmation');\n    });\n  });\n});\n",[292,2332,2333,2338,2357,2361,2377,2393,2409,2430,2447,2452,2457,2480,2504,2526,2548,2570,2593,2615,2620,2624,2629,2646,2650,2655,2677,2699,2721,2725,2730,2747,2751,2756,2781,2796,2802,2808,2813,2829,2845,2865,2878,2910,2915,2921,2937,2954,2969,2979,3002,3019,3029,3050,3055,3060],{"__ignoreMap":290},[295,2334,2335],{"class":297,"line":298},[295,2336,2337],{"class":457},"\u002F\u002F Example: Cypress E2E test suite for SuiteCommerce\n",[295,2339,2340,2343,2346,2349,2352,2355],{"class":297,"line":304},[295,2341,2342],{"class":919},"describe",[295,2344,2345],{"class":474},"(",[295,2347,2348],{"class":686},"'Critical Path Tests'",[295,2350,2351],{"class":474},", () ",[295,2353,2354],{"class":463},"=>",[295,2356,475],{"class":474},[295,2358,2359],{"class":297,"line":311},[295,2360,356],{"class":474},[295,2362,2363,2366,2368,2371,2373,2375],{"class":297,"line":317},[295,2364,2365],{"class":919},"  describe",[295,2367,2345],{"class":474},[295,2369,2370],{"class":686},"'Guest Checkout'",[295,2372,2351],{"class":474},[295,2374,2354],{"class":463},[295,2376,475],{"class":474},[295,2378,2379,2382,2384,2387,2389,2391],{"class":297,"line":323},[295,2380,2381],{"class":919},"    it",[295,2383,2345],{"class":474},[295,2385,2386],{"class":686},"'should complete checkout with credit card'",[295,2388,2351],{"class":474},[295,2390,2354],{"class":463},[295,2392,475],{"class":474},[295,2394,2395,2398,2401,2403,2406],{"class":297,"line":329},[295,2396,2397],{"class":474},"      cy.",[295,2399,2400],{"class":919},"visit",[295,2402,2345],{"class":474},[295,2404,2405],{"class":686},"'\u002Fproduct\u002Fsample-product'",[295,2407,2408],{"class":474},");\n",[295,2410,2411,2413,2416,2418,2421,2424,2427],{"class":297,"line":335},[295,2412,2397],{"class":474},[295,2414,2415],{"class":919},"get",[295,2417,2345],{"class":474},[295,2419,2420],{"class":686},"'[data-action=\"add-to-cart\"]'",[295,2422,2423],{"class":474},").",[295,2425,2426],{"class":919},"click",[295,2428,2429],{"class":474},"();\n",[295,2431,2432,2434,2436,2438,2441,2443,2445],{"class":297,"line":341},[295,2433,2397],{"class":474},[295,2435,2415],{"class":919},[295,2437,2345],{"class":474},[295,2439,2440],{"class":686},"'[data-action=\"proceed-to-checkout\"]'",[295,2442,2423],{"class":474},[295,2444,2426],{"class":919},[295,2446,2429],{"class":474},[295,2448,2449],{"class":297,"line":347},[295,2450,2451],{"class":474},"      \n",[295,2453,2454],{"class":297,"line":353},[295,2455,2456],{"class":457},"      \u002F\u002F Fill shipping\n",[295,2458,2459,2461,2463,2465,2468,2470,2473,2476,2478],{"class":297,"line":359},[295,2460,2397],{"class":474},[295,2462,2415],{"class":919},[295,2464,2345],{"class":474},[295,2466,2467],{"class":686},"'#shipping-address-form'",[295,2469,2423],{"class":474},[295,2471,2472],{"class":919},"within",[295,2474,2475],{"class":474},"(() ",[295,2477,2354],{"class":463},[295,2479,475],{"class":474},[295,2481,2482,2485,2487,2489,2492,2494,2497,2499,2502],{"class":297,"line":365},[295,2483,2484],{"class":474},"        cy.",[295,2486,2415],{"class":919},[295,2488,2345],{"class":474},[295,2490,2491],{"class":686},"'[name=\"firstname\"]'",[295,2493,2423],{"class":474},[295,2495,2496],{"class":919},"type",[295,2498,2345],{"class":474},[295,2500,2501],{"class":686},"'Test'",[295,2503,2408],{"class":474},[295,2505,2506,2508,2510,2512,2515,2517,2519,2521,2524],{"class":297,"line":371},[295,2507,2484],{"class":474},[295,2509,2415],{"class":919},[295,2511,2345],{"class":474},[295,2513,2514],{"class":686},"'[name=\"lastname\"]'",[295,2516,2423],{"class":474},[295,2518,2496],{"class":919},[295,2520,2345],{"class":474},[295,2522,2523],{"class":686},"'User'",[295,2525,2408],{"class":474},[295,2527,2528,2530,2532,2534,2537,2539,2541,2543,2546],{"class":297,"line":377},[295,2529,2484],{"class":474},[295,2531,2415],{"class":919},[295,2533,2345],{"class":474},[295,2535,2536],{"class":686},"'[name=\"addr1\"]'",[295,2538,2423],{"class":474},[295,2540,2496],{"class":919},[295,2542,2345],{"class":474},[295,2544,2545],{"class":686},"'123 Test St'",[295,2547,2408],{"class":474},[295,2549,2550,2552,2554,2556,2559,2561,2563,2565,2568],{"class":297,"line":383},[295,2551,2484],{"class":474},[295,2553,2415],{"class":919},[295,2555,2345],{"class":474},[295,2557,2558],{"class":686},"'[name=\"city\"]'",[295,2560,2423],{"class":474},[295,2562,2496],{"class":919},[295,2564,2345],{"class":474},[295,2566,2567],{"class":686},"'Austin'",[295,2569,2408],{"class":474},[295,2571,2572,2574,2576,2578,2581,2583,2586,2588,2591],{"class":297,"line":389},[295,2573,2484],{"class":474},[295,2575,2415],{"class":919},[295,2577,2345],{"class":474},[295,2579,2580],{"class":686},"'[name=\"state\"]'",[295,2582,2423],{"class":474},[295,2584,2585],{"class":919},"select",[295,2587,2345],{"class":474},[295,2589,2590],{"class":686},"'TX'",[295,2592,2408],{"class":474},[295,2594,2595,2597,2599,2601,2604,2606,2608,2610,2613],{"class":297,"line":394},[295,2596,2484],{"class":474},[295,2598,2415],{"class":919},[295,2600,2345],{"class":474},[295,2602,2603],{"class":686},"'[name=\"zip\"]'",[295,2605,2423],{"class":474},[295,2607,2496],{"class":919},[295,2609,2345],{"class":474},[295,2611,2612],{"class":686},"'78701'",[295,2614,2408],{"class":474},[295,2616,2617],{"class":297,"line":400},[295,2618,2619],{"class":474},"      });\n",[295,2621,2622],{"class":297,"line":406},[295,2623,2451],{"class":474},[295,2625,2626],{"class":297,"line":412},[295,2627,2628],{"class":457},"      \u002F\u002F Select shipping method\n",[295,2630,2631,2633,2635,2637,2640,2642,2644],{"class":297,"line":418},[295,2632,2397],{"class":474},[295,2634,2415],{"class":919},[295,2636,2345],{"class":474},[295,2638,2639],{"class":686},"'[data-shipmethod=\"standard\"]'",[295,2641,2423],{"class":474},[295,2643,2426],{"class":919},[295,2645,2429],{"class":474},[295,2647,2648],{"class":297,"line":423},[295,2649,2451],{"class":474},[295,2651,2652],{"class":297,"line":429},[295,2653,2654],{"class":457},"      \u002F\u002F Payment\n",[295,2656,2657,2659,2661,2663,2666,2668,2670,2672,2675],{"class":297,"line":435},[295,2658,2397],{"class":474},[295,2660,2415],{"class":919},[295,2662,2345],{"class":474},[295,2664,2665],{"class":686},"'#cc-number'",[295,2667,2423],{"class":474},[295,2669,2496],{"class":919},[295,2671,2345],{"class":474},[295,2673,2674],{"class":686},"'4111111111111111'",[295,2676,2408],{"class":474},[295,2678,2679,2681,2683,2685,2688,2690,2692,2694,2697],{"class":297,"line":2026},[295,2680,2397],{"class":474},[295,2682,2415],{"class":919},[295,2684,2345],{"class":474},[295,2686,2687],{"class":686},"'#cc-expiry'",[295,2689,2423],{"class":474},[295,2691,2496],{"class":919},[295,2693,2345],{"class":474},[295,2695,2696],{"class":686},"'12\u002F28'",[295,2698,2408],{"class":474},[295,2700,2701,2703,2705,2707,2710,2712,2714,2716,2719],{"class":297,"line":2032},[295,2702,2397],{"class":474},[295,2704,2415],{"class":919},[295,2706,2345],{"class":474},[295,2708,2709],{"class":686},"'#cc-cvv'",[295,2711,2423],{"class":474},[295,2713,2496],{"class":919},[295,2715,2345],{"class":474},[295,2717,2718],{"class":686},"'123'",[295,2720,2408],{"class":474},[295,2722,2723],{"class":297,"line":2038},[295,2724,2451],{"class":474},[295,2726,2727],{"class":297,"line":2044},[295,2728,2729],{"class":457},"      \u002F\u002F Submit\n",[295,2731,2732,2734,2736,2738,2741,2743,2745],{"class":297,"line":2050},[295,2733,2397],{"class":474},[295,2735,2415],{"class":919},[295,2737,2345],{"class":474},[295,2739,2740],{"class":686},"'[data-action=\"submit-order\"]'",[295,2742,2423],{"class":474},[295,2744,2426],{"class":919},[295,2746,2429],{"class":474},[295,2748,2749],{"class":297,"line":2055},[295,2750,2451],{"class":474},[295,2752,2753],{"class":297,"line":2061},[295,2754,2755],{"class":457},"      \u002F\u002F Verify confirmation\n",[295,2757,2758,2760,2763,2766,2769,2771,2774,2776,2779],{"class":297,"line":2067},[295,2759,2397],{"class":474},[295,2761,2762],{"class":919},"url",[295,2764,2765],{"class":474},"().",[295,2767,2768],{"class":919},"should",[295,2770,2345],{"class":474},[295,2772,2773],{"class":686},"'include'",[295,2775,708],{"class":474},[295,2777,2778],{"class":686},"'\u002Fconfirmation'",[295,2780,2408],{"class":474},[295,2782,2784,2786,2789,2791,2794],{"class":297,"line":2783},33,[295,2785,2397],{"class":474},[295,2787,2788],{"class":919},"contains",[295,2790,2345],{"class":474},[295,2792,2793],{"class":686},"'Thank you for your order'",[295,2795,2408],{"class":474},[295,2797,2799],{"class":297,"line":2798},34,[295,2800,2801],{"class":474},"    });\n",[295,2803,2805],{"class":297,"line":2804},35,[295,2806,2807],{"class":474},"  });\n",[295,2809,2811],{"class":297,"line":2810},36,[295,2812,356],{"class":474},[295,2814,2816,2818,2820,2823,2825,2827],{"class":297,"line":2815},37,[295,2817,2365],{"class":919},[295,2819,2345],{"class":474},[295,2821,2822],{"class":686},"'B2B Customer Flow'",[295,2824,2351],{"class":474},[295,2826,2354],{"class":463},[295,2828,475],{"class":474},[295,2830,2832,2834,2836,2839,2841,2843],{"class":297,"line":2831},38,[295,2833,2381],{"class":919},[295,2835,2345],{"class":474},[295,2837,2838],{"class":686},"'should apply customer-specific pricing'",[295,2840,2351],{"class":474},[295,2842,2354],{"class":463},[295,2844,475],{"class":474},[295,2846,2848,2850,2853,2855,2858,2860,2863],{"class":297,"line":2847},39,[295,2849,2397],{"class":474},[295,2851,2852],{"class":919},"login",[295,2854,2345],{"class":474},[295,2856,2857],{"class":686},"'b2b-customer@test.com'",[295,2859,708],{"class":474},[295,2861,2862],{"class":686},"'password'",[295,2864,2408],{"class":474},[295,2866,2868,2870,2872,2874,2876],{"class":297,"line":2867},40,[295,2869,2397],{"class":474},[295,2871,2400],{"class":919},[295,2873,2345],{"class":474},[295,2875,2405],{"class":686},[295,2877,2408],{"class":474},[295,2879,2881,2883,2885,2887,2890,2892,2894,2896,2899,2901,2904,2907],{"class":297,"line":2880},41,[295,2882,2397],{"class":474},[295,2884,2415],{"class":919},[295,2886,2345],{"class":474},[295,2888,2889],{"class":686},"'[data-price]'",[295,2891,2423],{"class":474},[295,2893,2768],{"class":919},[295,2895,2345],{"class":474},[295,2897,2898],{"class":686},"'contain'",[295,2900,708],{"class":474},[295,2902,2903],{"class":686},"'$89.99'",[295,2905,2906],{"class":474},"); ",[295,2908,2909],{"class":457},"\u002F\u002F Custom price\n",[295,2911,2913],{"class":297,"line":2912},42,[295,2914,2801],{"class":474},[295,2916,2918],{"class":297,"line":2917},43,[295,2919,2920],{"class":474},"    \n",[295,2922,2924,2926,2928,2931,2933,2935],{"class":297,"line":2923},44,[295,2925,2381],{"class":919},[295,2927,2345],{"class":474},[295,2929,2930],{"class":686},"'should allow purchase on terms'",[295,2932,2351],{"class":474},[295,2934,2354],{"class":463},[295,2936,475],{"class":474},[295,2938,2940,2942,2944,2946,2948,2950,2952],{"class":297,"line":2939},45,[295,2941,2397],{"class":474},[295,2943,2852],{"class":919},[295,2945,2345],{"class":474},[295,2947,2857],{"class":686},[295,2949,708],{"class":474},[295,2951,2862],{"class":686},[295,2953,2408],{"class":474},[295,2955,2957,2959,2962,2964,2967],{"class":297,"line":2956},46,[295,2958,2397],{"class":474},[295,2960,2961],{"class":919},"addToCart",[295,2963,2345],{"class":474},[295,2965,2966],{"class":686},"'sample-product'",[295,2968,2408],{"class":474},[295,2970,2972,2974,2977],{"class":297,"line":2971},47,[295,2973,2397],{"class":474},[295,2975,2976],{"class":919},"checkout",[295,2978,2429],{"class":474},[295,2980,2982,2984,2986,2988,2991,2993,2995,2997,3000],{"class":297,"line":2981},48,[295,2983,2397],{"class":474},[295,2985,2415],{"class":919},[295,2987,2345],{"class":474},[295,2989,2990],{"class":686},"'[data-payment=\"terms\"]'",[295,2992,2423],{"class":474},[295,2994,2768],{"class":919},[295,2996,2345],{"class":474},[295,2998,2999],{"class":686},"'be.visible'",[295,3001,2408],{"class":474},[295,3003,3005,3007,3009,3011,3013,3015,3017],{"class":297,"line":3004},49,[295,3006,2397],{"class":474},[295,3008,2415],{"class":919},[295,3010,2345],{"class":474},[295,3012,2990],{"class":686},[295,3014,2423],{"class":474},[295,3016,2426],{"class":919},[295,3018,2429],{"class":474},[295,3020,3022,3024,3027],{"class":297,"line":3021},50,[295,3023,2397],{"class":474},[295,3025,3026],{"class":919},"submitOrder",[295,3028,2429],{"class":474},[295,3030,3032,3034,3036,3038,3040,3042,3044,3046,3048],{"class":297,"line":3031},51,[295,3033,2397],{"class":474},[295,3035,2762],{"class":919},[295,3037,2765],{"class":474},[295,3039,2768],{"class":919},[295,3041,2345],{"class":474},[295,3043,2773],{"class":686},[295,3045,708],{"class":474},[295,3047,2778],{"class":686},[295,3049,2408],{"class":474},[295,3051,3053],{"class":297,"line":3052},52,[295,3054,2801],{"class":474},[295,3056,3058],{"class":297,"line":3057},53,[295,3059,2807],{"class":474},[295,3061,3063],{"class":297,"line":3062},54,[295,3064,3065],{"class":474},"});\n",[148,3067,3069],{"id":3068},"_53-performance-testing","5.3 Performance Testing",[15,3071,3072],{},"Load test your staging environment:",[285,3074,3076],{"className":905,"code":3075,"language":907,"meta":290,"style":290},"# Example: k6 load testing script\nimport http from 'k6\u002Fhttp';\nimport { check, sleep } from 'k6';\n\nexport const options = {\n  stages: [\n    { duration: '2m', target: 50 },   \u002F\u002F Ramp up\n    { duration: '5m', target: 100 },  \u002F\u002F Sustained load\n    { duration: '2m', target: 200 },  \u002F\u002F Peak load\n    { duration: '2m', target: 0 },    \u002F\u002F Ramp down\n  ],\n  thresholds: {\n    http_req_duration: ['p(95)\u003C2000'], \u002F\u002F 95% of requests \u003C 2s\n    http_req_failed: ['rate\u003C0.01'],    \u002F\u002F \u003C1% failure rate\n  },\n};\n\nexport default function() {\n  \u002F\u002F Homepage\n  let res = http.get('https:\u002F\u002Fstaging.company.com\u002F');\n  check(res, { 'homepage status 200': (r) => r.status === 200 });\n  sleep(1);\n  \n  \u002F\u002F Product listing\n  res = http.get('https:\u002F\u002Fstaging.company.com\u002Fcategory\u002Fwidgets');\n  check(res, { 'PLP status 200': (r) => r.status === 200 });\n  sleep(2);\n  \n  \u002F\u002F Product detail\n  res = http.get('https:\u002F\u002Fstaging.company.com\u002Fproduct\u002Fwidget-pro');\n  check(res, { 'PDP status 200': (r) => r.status === 200 });\n  sleep(1);\n  \n  \u002F\u002F Add to cart\n  res = http.post('https:\u002F\u002Fstaging.company.com\u002Fapi\u002Fcart', {\n    item_id: '12345',\n    quantity: 1\n  });\n  check(res, { 'add to cart': (r) => r.status === 200 });\n}\n",[292,3077,3078,3083,3099,3122,3126,3134,3142,3171,3196,3218,3241,3245,3252,3272,3290,3294,3298,3302,3309,3316,3336,3354,3361,3365,3375,3391,3406,3413,3417,3426,3441,3456,3462,3466,3478,3497,3505,3513,3517,3532],{"__ignoreMap":290},[295,3079,3080],{"class":297,"line":298},[295,3081,3082],{"class":457},"# Example: k6 load testing script\n",[295,3084,3085,3088,3091,3094,3097],{"class":297,"line":304},[295,3086,3087],{"class":919},"import",[295,3089,3090],{"class":686}," http",[295,3092,3093],{"class":686}," from",[295,3095,3096],{"class":686}," 'k6\u002Fhttp'",[295,3098,1345],{"class":474},[295,3100,3101,3103,3106,3109,3112,3115,3117,3120],{"class":297,"line":311},[295,3102,3087],{"class":919},[295,3104,3105],{"class":686}," {",[295,3107,3108],{"class":686}," check,",[295,3110,3111],{"class":686}," sleep",[295,3113,3114],{"class":686}," }",[295,3116,3093],{"class":686},[295,3118,3119],{"class":686}," 'k6'",[295,3121,1345],{"class":474},[295,3123,3124],{"class":297,"line":317},[295,3125,308],{"emptyLinePlaceholder":307},[295,3127,3128,3131],{"class":297,"line":323},[295,3129,3130],{"class":463},"export",[295,3132,3133],{"class":474}," const options = {\n",[295,3135,3136,3139],{"class":297,"line":329},[295,3137,3138],{"class":919},"  stages:",[295,3140,3141],{"class":474}," [\n",[295,3143,3144,3147,3150,3153,3156,3159,3162,3165,3168],{"class":297,"line":335},[295,3145,3146],{"class":474},"    { ",[295,3148,3149],{"class":919},"duration:",[295,3151,3152],{"class":686}," '2m',",[295,3154,3155],{"class":686}," target:",[295,3157,3158],{"class":467}," 50",[295,3160,3161],{"class":686}," },",[295,3163,3164],{"class":686},"   \u002F\u002F",[295,3166,3167],{"class":686}," Ramp",[295,3169,3170],{"class":686}," up\n",[295,3172,3173,3175,3177,3180,3182,3185,3187,3190,3193],{"class":297,"line":341},[295,3174,3146],{"class":474},[295,3176,3149],{"class":919},[295,3178,3179],{"class":686}," '5m',",[295,3181,3155],{"class":686},[295,3183,3184],{"class":467}," 100",[295,3186,3161],{"class":686},[295,3188,3189],{"class":686},"  \u002F\u002F",[295,3191,3192],{"class":686}," Sustained",[295,3194,3195],{"class":686}," load\n",[295,3197,3198,3200,3202,3204,3206,3209,3211,3213,3216],{"class":297,"line":347},[295,3199,3146],{"class":474},[295,3201,3149],{"class":919},[295,3203,3152],{"class":686},[295,3205,3155],{"class":686},[295,3207,3208],{"class":467}," 200",[295,3210,3161],{"class":686},[295,3212,3189],{"class":686},[295,3214,3215],{"class":686}," Peak",[295,3217,3195],{"class":686},[295,3219,3220,3222,3224,3226,3228,3231,3233,3236,3238],{"class":297,"line":353},[295,3221,3146],{"class":474},[295,3223,3149],{"class":919},[295,3225,3152],{"class":686},[295,3227,3155],{"class":686},[295,3229,3230],{"class":467}," 0",[295,3232,3161],{"class":686},[295,3234,3235],{"class":686},"    \u002F\u002F",[295,3237,3167],{"class":686},[295,3239,3240],{"class":686}," down\n",[295,3242,3243],{"class":297,"line":359},[295,3244,724],{"class":474},[295,3246,3247,3250],{"class":297,"line":365},[295,3248,3249],{"class":919},"  thresholds:",[295,3251,475],{"class":686},[295,3253,3254,3257,3260,3263,3266,3269],{"class":297,"line":371},[295,3255,3256],{"class":919},"    http_req_duration:",[295,3258,3259],{"class":474}," [",[295,3261,3262],{"class":686},"'p(95)\u003C2000'",[295,3264,3265],{"class":474},"], \u002F\u002F 95% of requests ",[295,3267,3268],{"class":463},"\u003C",[295,3270,3271],{"class":474}," 2s\n",[295,3273,3274,3277,3279,3282,3285,3287],{"class":297,"line":377},[295,3275,3276],{"class":919},"    http_req_failed:",[295,3278,3259],{"class":474},[295,3280,3281],{"class":686},"'rate\u003C0.01'",[295,3283,3284],{"class":474},"],    \u002F\u002F ",[295,3286,3268],{"class":463},[295,3288,3289],{"class":474},"1% failure rate\n",[295,3291,3292],{"class":297,"line":383},[295,3293,520],{"class":474},[295,3295,3296],{"class":297,"line":389},[295,3297,617],{"class":474},[295,3299,3300],{"class":297,"line":394},[295,3301,308],{"emptyLinePlaceholder":307},[295,3303,3304,3306],{"class":297,"line":400},[295,3305,3130],{"class":463},[295,3307,3308],{"class":474}," default function() {\n",[295,3310,3311,3313],{"class":297,"line":406},[295,3312,3189],{"class":919},[295,3314,3315],{"class":686}," Homepage\n",[295,3317,3318,3321,3324,3326,3329,3331,3334],{"class":297,"line":412},[295,3319,3320],{"class":467},"  let",[295,3322,3323],{"class":686}," res",[295,3325,471],{"class":686},[295,3327,3328],{"class":686}," http.get",[295,3330,2345],{"class":474},[295,3332,3333],{"class":919},"'https:\u002F\u002Fstaging.company.com\u002F'",[295,3335,2408],{"class":474},[295,3337,3338,3341,3343,3346,3349,3351],{"class":297,"line":418},[295,3339,3340],{"class":919},"  check(res,",[295,3342,3105],{"class":686},[295,3344,3345],{"class":686}," 'homepage status 200':",[295,3347,3348],{"class":474}," (r) =",[295,3350,1325],{"class":463},[295,3352,3353],{"class":474}," r.status === 200 });\n",[295,3355,3356,3359],{"class":297,"line":423},[295,3357,3358],{"class":919},"  sleep(1",[295,3360,2408],{"class":474},[295,3362,3363],{"class":297,"line":429},[295,3364,356],{"class":474},[295,3366,3367,3369,3372],{"class":297,"line":435},[295,3368,3189],{"class":919},[295,3370,3371],{"class":686}," Product",[295,3373,3374],{"class":686}," listing\n",[295,3376,3377,3380,3382,3384,3386,3389],{"class":297,"line":2026},[295,3378,3379],{"class":919},"  res",[295,3381,471],{"class":686},[295,3383,3328],{"class":686},[295,3385,2345],{"class":474},[295,3387,3388],{"class":919},"'https:\u002F\u002Fstaging.company.com\u002Fcategory\u002Fwidgets'",[295,3390,2408],{"class":474},[295,3392,3393,3395,3397,3400,3402,3404],{"class":297,"line":2032},[295,3394,3340],{"class":919},[295,3396,3105],{"class":686},[295,3398,3399],{"class":686}," 'PLP status 200':",[295,3401,3348],{"class":474},[295,3403,1325],{"class":463},[295,3405,3353],{"class":474},[295,3407,3408,3411],{"class":297,"line":2038},[295,3409,3410],{"class":919},"  sleep(2",[295,3412,2408],{"class":474},[295,3414,3415],{"class":297,"line":2044},[295,3416,356],{"class":474},[295,3418,3419,3421,3423],{"class":297,"line":2050},[295,3420,3189],{"class":919},[295,3422,3371],{"class":686},[295,3424,3425],{"class":686}," detail\n",[295,3427,3428,3430,3432,3434,3436,3439],{"class":297,"line":2055},[295,3429,3379],{"class":919},[295,3431,471],{"class":686},[295,3433,3328],{"class":686},[295,3435,2345],{"class":474},[295,3437,3438],{"class":919},"'https:\u002F\u002Fstaging.company.com\u002Fproduct\u002Fwidget-pro'",[295,3440,2408],{"class":474},[295,3442,3443,3445,3447,3450,3452,3454],{"class":297,"line":2061},[295,3444,3340],{"class":919},[295,3446,3105],{"class":686},[295,3448,3449],{"class":686}," 'PDP status 200':",[295,3451,3348],{"class":474},[295,3453,1325],{"class":463},[295,3455,3353],{"class":474},[295,3457,3458,3460],{"class":297,"line":2067},[295,3459,3358],{"class":919},[295,3461,2408],{"class":474},[295,3463,3464],{"class":297,"line":2783},[295,3465,356],{"class":474},[295,3467,3468,3470,3473,3475],{"class":297,"line":2798},[295,3469,3189],{"class":919},[295,3471,3472],{"class":686}," Add",[295,3474,929],{"class":686},[295,3476,3477],{"class":686}," cart\n",[295,3479,3480,3482,3484,3487,3489,3492,3495],{"class":297,"line":2804},[295,3481,3379],{"class":919},[295,3483,471],{"class":686},[295,3485,3486],{"class":686}," http.post",[295,3488,2345],{"class":474},[295,3490,3491],{"class":919},"'https:\u002F\u002Fstaging.company.com\u002Fapi\u002Fcart'",[295,3493,3494],{"class":919},",",[295,3496,475],{"class":686},[295,3498,3499,3502],{"class":297,"line":2810},[295,3500,3501],{"class":919},"    item_id:",[295,3503,3504],{"class":686}," '12345',\n",[295,3506,3507,3510],{"class":297,"line":2815},[295,3508,3509],{"class":919},"    quantity:",[295,3511,3512],{"class":467}," 1\n",[295,3514,3515],{"class":297,"line":2831},[295,3516,2807],{"class":474},[295,3518,3519,3521,3523,3526,3528,3530],{"class":297,"line":2847},[295,3520,3340],{"class":919},[295,3522,3105],{"class":686},[295,3524,3525],{"class":686}," 'add to cart':",[295,3527,3348],{"class":474},[295,3529,1325],{"class":463},[295,3531,3353],{"class":474},[295,3533,3534],{"class":297,"line":2867},[295,3535,1350],{"class":474},[22,3537,72],{"id":3538},"phase-6-zero-downtime-deployment",[148,3540,3542],{"id":3541},"_61-blue-green-deployment-strategy","6.1 Blue-Green Deployment Strategy",[15,3544,3545],{},"The key to zero-downtime migrations is running old and new versions simultaneously:",[285,3547,3549],{"className":287,"code":3548,"language":289,"meta":290,"style":290},"BLUE-GREEN DEPLOYMENT ARCHITECTURE\n\n                    ┌─────────────────┐\n                    │   Load Balancer │\n                    └────────┬────────┘\n                             │\n              ┌──────────────┴──────────────┐\n              │                             │\n    ┌─────────▼─────────┐        ┌─────────▼─────────┐\n    │   BLUE (Current)  │        │   GREEN (New)     │\n    │   SC 2022.2       │        │   SC 2024.1       │\n    │   100% traffic    │        │   0% traffic      │\n    └───────────────────┘        └───────────────────┘\n              │                             │\n              └──────────────┬──────────────┘\n                             │\n                    ┌────────▼────────┐\n                    │    NetSuite     │\n                    │   (Shared)      │\n                    └─────────────────┘\n\nCUTOVER PROCESS:\n1. Deploy GREEN with 0% traffic\n2. Internal testing on GREEN\n3. Shift 5% traffic to GREEN (canary)\n4. Monitor for 30 minutes\n5. Shift 25% → 50% → 100% to GREEN\n6. Decommission BLUE after 24 hours\n",[292,3550,3551,3556,3560,3565,3570,3575,3580,3585,3590,3595,3600,3605,3610,3615,3619,3624,3628,3633,3638,3643,3648,3652,3657,3662,3667,3672,3677,3682],{"__ignoreMap":290},[295,3552,3553],{"class":297,"line":298},[295,3554,3555],{},"BLUE-GREEN DEPLOYMENT ARCHITECTURE\n",[295,3557,3558],{"class":297,"line":304},[295,3559,308],{"emptyLinePlaceholder":307},[295,3561,3562],{"class":297,"line":311},[295,3563,3564],{},"                    ┌─────────────────┐\n",[295,3566,3567],{"class":297,"line":317},[295,3568,3569],{},"                    │   Load Balancer │\n",[295,3571,3572],{"class":297,"line":323},[295,3573,3574],{},"                    └────────┬────────┘\n",[295,3576,3577],{"class":297,"line":329},[295,3578,3579],{},"                             │\n",[295,3581,3582],{"class":297,"line":335},[295,3583,3584],{},"              ┌──────────────┴──────────────┐\n",[295,3586,3587],{"class":297,"line":341},[295,3588,3589],{},"              │                             │\n",[295,3591,3592],{"class":297,"line":347},[295,3593,3594],{},"    ┌─────────▼─────────┐        ┌─────────▼─────────┐\n",[295,3596,3597],{"class":297,"line":353},[295,3598,3599],{},"    │   BLUE (Current)  │        │   GREEN (New)     │\n",[295,3601,3602],{"class":297,"line":359},[295,3603,3604],{},"    │   SC 2022.2       │        │   SC 2024.1       │\n",[295,3606,3607],{"class":297,"line":365},[295,3608,3609],{},"    │   100% traffic    │        │   0% traffic      │\n",[295,3611,3612],{"class":297,"line":371},[295,3613,3614],{},"    └───────────────────┘        └───────────────────┘\n",[295,3616,3617],{"class":297,"line":377},[295,3618,3589],{},[295,3620,3621],{"class":297,"line":383},[295,3622,3623],{},"              └──────────────┬──────────────┘\n",[295,3625,3626],{"class":297,"line":389},[295,3627,3579],{},[295,3629,3630],{"class":297,"line":394},[295,3631,3632],{},"                    ┌────────▼────────┐\n",[295,3634,3635],{"class":297,"line":400},[295,3636,3637],{},"                    │    NetSuite     │\n",[295,3639,3640],{"class":297,"line":406},[295,3641,3642],{},"                    │   (Shared)      │\n",[295,3644,3645],{"class":297,"line":412},[295,3646,3647],{},"                    └─────────────────┘\n",[295,3649,3650],{"class":297,"line":418},[295,3651,308],{"emptyLinePlaceholder":307},[295,3653,3654],{"class":297,"line":423},[295,3655,3656],{},"CUTOVER PROCESS:\n",[295,3658,3659],{"class":297,"line":429},[295,3660,3661],{},"1. Deploy GREEN with 0% traffic\n",[295,3663,3664],{"class":297,"line":435},[295,3665,3666],{},"2. Internal testing on GREEN\n",[295,3668,3669],{"class":297,"line":2026},[295,3670,3671],{},"3. Shift 5% traffic to GREEN (canary)\n",[295,3673,3674],{"class":297,"line":2032},[295,3675,3676],{},"4. Monitor for 30 minutes\n",[295,3678,3679],{"class":297,"line":2038},[295,3680,3681],{},"5. Shift 25% → 50% → 100% to GREEN\n",[295,3683,3684],{"class":297,"line":2044},[295,3685,3686],{},"6. Decommission BLUE after 24 hours\n",[148,3688,3690],{"id":3689},"_62-database-considerations","6.2 Database Considerations",[15,3692,3693],{},"SuiteCommerce uses NetSuite as its database, simplifying some concerns but creating others:",[285,3695,3697],{"className":448,"code":3696,"language":450,"meta":290,"style":290},"\u002F\u002F Handling concurrent sessions during migration\n\n\u002F\u002F PROBLEM: Customer on BLUE adds item to cart\n\u002F\u002F          Traffic shifts to GREEN\n\u002F\u002F          Cart appears empty\n\n\u002F\u002F SOLUTION: Session-aware routing\nconst routingStrategy = {\n  existingSession: 'STICKY',    \u002F\u002F Keep on current environment\n  newSession: 'WEIGHTED',       \u002F\u002F Route per traffic split\n  cartInProgress: 'BLUE',       \u002F\u002F Don't migrate active carts\n  checkoutInProgress: 'CURRENT' \u002F\u002F Never switch mid-checkout\n};\n",[292,3698,3699,3704,3708,3713,3718,3723,3727,3732,3743,3756,3770,3783,3794],{"__ignoreMap":290},[295,3700,3701],{"class":297,"line":298},[295,3702,3703],{"class":457},"\u002F\u002F Handling concurrent sessions during migration\n",[295,3705,3706],{"class":297,"line":304},[295,3707,308],{"emptyLinePlaceholder":307},[295,3709,3710],{"class":297,"line":311},[295,3711,3712],{"class":457},"\u002F\u002F PROBLEM: Customer on BLUE adds item to cart\n",[295,3714,3715],{"class":297,"line":317},[295,3716,3717],{"class":457},"\u002F\u002F          Traffic shifts to GREEN\n",[295,3719,3720],{"class":297,"line":323},[295,3721,3722],{"class":457},"\u002F\u002F          Cart appears empty\n",[295,3724,3725],{"class":297,"line":329},[295,3726,308],{"emptyLinePlaceholder":307},[295,3728,3729],{"class":297,"line":335},[295,3730,3731],{"class":457},"\u002F\u002F SOLUTION: Session-aware routing\n",[295,3733,3734,3736,3739,3741],{"class":297,"line":341},[295,3735,464],{"class":463},[295,3737,3738],{"class":467}," routingStrategy",[295,3740,471],{"class":463},[295,3742,475],{"class":474},[295,3744,3745,3748,3751,3753],{"class":297,"line":347},[295,3746,3747],{"class":474},"  existingSession: ",[295,3749,3750],{"class":686},"'STICKY'",[295,3752,1562],{"class":474},[295,3754,3755],{"class":457},"\u002F\u002F Keep on current environment\n",[295,3757,3758,3761,3764,3767],{"class":297,"line":353},[295,3759,3760],{"class":474},"  newSession: ",[295,3762,3763],{"class":686},"'WEIGHTED'",[295,3765,3766],{"class":474},",       ",[295,3768,3769],{"class":457},"\u002F\u002F Route per traffic split\n",[295,3771,3772,3775,3778,3780],{"class":297,"line":359},[295,3773,3774],{"class":474},"  cartInProgress: ",[295,3776,3777],{"class":686},"'BLUE'",[295,3779,3766],{"class":474},[295,3781,3782],{"class":457},"\u002F\u002F Don't migrate active carts\n",[295,3784,3785,3788,3791],{"class":297,"line":365},[295,3786,3787],{"class":474},"  checkoutInProgress: ",[295,3789,3790],{"class":686},"'CURRENT'",[295,3792,3793],{"class":457}," \u002F\u002F Never switch mid-checkout\n",[295,3795,3796],{"class":297,"line":371},[295,3797,617],{"class":474},[148,3799,3801],{"id":3800},"_63-cdn-and-cache-management","6.3 CDN and Cache Management",[15,3803,3804],{},"Manage caches carefully during cutover:",[285,3806,3808],{"className":905,"code":3807,"language":907,"meta":290,"style":290},"# Pre-cutover cache warming\n# Warm GREEN environment caches before traffic shift\n\nPAGES=(\n  \"\u002F\"\n  \"\u002Fcategory\u002Fmost-popular\"\n  \"\u002Fcategory\u002Fnew-arrivals\"\n  \"\u002Fproduct\u002Fbest-seller-1\"\n  \"\u002Fproduct\u002Fbest-seller-2\"\n  \"\u002Fcart\"\n  \"\u002Fcheckout\"\n)\n\nfor page in \"${PAGES[@]}\"; do\n  curl -s -o \u002Fdev\u002Fnull \"https:\u002F\u002Fgreen.company.com${page}\"\n  echo \"Warmed: ${page}\"\ndone\n\n# Post-cutover cache invalidation\n# Clear old BLUE content from CDN\n\ncurl -X POST \"https:\u002F\u002Fapi.cdn.com\u002Fpurge\" \\\n  -H \"Authorization: Bearer $CDN_TOKEN\" \\\n  -d '{\"files\": [\"\u002F*\"]}'\n",[292,3809,3810,3815,3820,3824,3834,3839,3844,3849,3854,3859,3864,3869,3874,3878,3909,3932,3944,3949,3953,3958,3963,3967,3983,3999],{"__ignoreMap":290},[295,3811,3812],{"class":297,"line":298},[295,3813,3814],{"class":457},"# Pre-cutover cache warming\n",[295,3816,3817],{"class":297,"line":304},[295,3818,3819],{"class":457},"# Warm GREEN environment caches before traffic shift\n",[295,3821,3822],{"class":297,"line":311},[295,3823,308],{"emptyLinePlaceholder":307},[295,3825,3826,3829,3831],{"class":297,"line":317},[295,3827,3828],{"class":474},"PAGES",[295,3830,1339],{"class":463},[295,3832,3833],{"class":474},"(\n",[295,3835,3836],{"class":297,"line":323},[295,3837,3838],{"class":686},"  \"\u002F\"\n",[295,3840,3841],{"class":297,"line":329},[295,3842,3843],{"class":686},"  \"\u002Fcategory\u002Fmost-popular\"\n",[295,3845,3846],{"class":297,"line":335},[295,3847,3848],{"class":686},"  \"\u002Fcategory\u002Fnew-arrivals\"\n",[295,3850,3851],{"class":297,"line":341},[295,3852,3853],{"class":686},"  \"\u002Fproduct\u002Fbest-seller-1\"\n",[295,3855,3856],{"class":297,"line":347},[295,3857,3858],{"class":686},"  \"\u002Fproduct\u002Fbest-seller-2\"\n",[295,3860,3861],{"class":297,"line":353},[295,3862,3863],{"class":686},"  \"\u002Fcart\"\n",[295,3865,3866],{"class":297,"line":359},[295,3867,3868],{"class":686},"  \"\u002Fcheckout\"\n",[295,3870,3871],{"class":297,"line":365},[295,3872,3873],{"class":474},")\n",[295,3875,3876],{"class":297,"line":371},[295,3877,308],{"emptyLinePlaceholder":307},[295,3879,3880,3883,3886,3889,3892,3894,3897,3900,3903,3906],{"class":297,"line":377},[295,3881,3882],{"class":463},"for",[295,3884,3885],{"class":474}," page ",[295,3887,3888],{"class":463},"in",[295,3890,3891],{"class":686}," \"${",[295,3893,3828],{"class":474},[295,3895,3896],{"class":686},"[",[295,3898,3899],{"class":463},"@",[295,3901,3902],{"class":686},"]}\"",[295,3904,3905],{"class":474},"; ",[295,3907,3908],{"class":463},"do\n",[295,3910,3911,3914,3917,3920,3923,3926,3929],{"class":297,"line":383},[295,3912,3913],{"class":919},"  curl",[295,3915,3916],{"class":467}," -s",[295,3918,3919],{"class":467}," -o",[295,3921,3922],{"class":686}," \u002Fdev\u002Fnull",[295,3924,3925],{"class":686}," \"https:\u002F\u002Fgreen.company.com${",[295,3927,3928],{"class":474},"page",[295,3930,3931],{"class":686},"}\"\n",[295,3933,3934,3937,3940,3942],{"class":297,"line":389},[295,3935,3936],{"class":467},"  echo",[295,3938,3939],{"class":686}," \"Warmed: ${",[295,3941,3928],{"class":474},[295,3943,3931],{"class":686},[295,3945,3946],{"class":297,"line":394},[295,3947,3948],{"class":463},"done\n",[295,3950,3951],{"class":297,"line":400},[295,3952,308],{"emptyLinePlaceholder":307},[295,3954,3955],{"class":297,"line":406},[295,3956,3957],{"class":457},"# Post-cutover cache invalidation\n",[295,3959,3960],{"class":297,"line":412},[295,3961,3962],{"class":457},"# Clear old BLUE content from CDN\n",[295,3964,3965],{"class":297,"line":418},[295,3966,308],{"emptyLinePlaceholder":307},[295,3968,3969,3972,3975,3978,3981],{"class":297,"line":423},[295,3970,3971],{"class":919},"curl",[295,3973,3974],{"class":467}," -X",[295,3976,3977],{"class":686}," POST",[295,3979,3980],{"class":686}," \"https:\u002F\u002Fapi.cdn.com\u002Fpurge\"",[295,3982,1842],{"class":467},[295,3984,3985,3988,3991,3994,3997],{"class":297,"line":429},[295,3986,3987],{"class":467},"  -H",[295,3989,3990],{"class":686}," \"Authorization: Bearer ",[295,3992,3993],{"class":474},"$CDN_TOKEN",[295,3995,3996],{"class":686},"\"",[295,3998,1842],{"class":467},[295,4000,4001,4004],{"class":297,"line":435},[295,4002,4003],{"class":467},"  -d",[295,4005,4006],{"class":686}," '{\"files\": [\"\u002F*\"]}'\n",[148,4008,4010],{"id":4009},"_64-real-time-monitoring-during-cutover","6.4 Real-Time Monitoring During Cutover",[15,4012,4013],{},"Set up dashboards for the deployment window:",[285,4015,4017],{"className":287,"code":4016,"language":289,"meta":290,"style":290},"DEPLOYMENT MONITORING CHECKLIST\n\nReal-Time Dashboards:\n□ Error rate (target: \u003C0.1%)\n□ Response time P50\u002FP95\u002FP99\n□ Checkout completion rate\n□ Payment success rate\n□ Order creation rate vs. baseline\n\nAlerts (Immediate Response):\n□ Error rate >1% for 2 minutes\n□ P95 response time >5s\n□ Checkout failures >5 in 5 minutes\n□ Payment errors (any)\n□ NetSuite sync queue >100 items\n\nTeam Communication:\n□ War room Slack channel\n□ All stakeholders on standby\n□ Customer service briefed\n□ Executive sponsor reachable\n",[292,4018,4019,4024,4028,4033,4038,4043,4048,4053,4058,4062,4067,4072,4077,4082,4087,4092,4096,4101,4106,4111,4116],{"__ignoreMap":290},[295,4020,4021],{"class":297,"line":298},[295,4022,4023],{},"DEPLOYMENT MONITORING CHECKLIST\n",[295,4025,4026],{"class":297,"line":304},[295,4027,308],{"emptyLinePlaceholder":307},[295,4029,4030],{"class":297,"line":311},[295,4031,4032],{},"Real-Time Dashboards:\n",[295,4034,4035],{"class":297,"line":317},[295,4036,4037],{},"□ Error rate (target: \u003C0.1%)\n",[295,4039,4040],{"class":297,"line":323},[295,4041,4042],{},"□ Response time P50\u002FP95\u002FP99\n",[295,4044,4045],{"class":297,"line":329},[295,4046,4047],{},"□ Checkout completion rate\n",[295,4049,4050],{"class":297,"line":335},[295,4051,4052],{},"□ Payment success rate\n",[295,4054,4055],{"class":297,"line":341},[295,4056,4057],{},"□ Order creation rate vs. baseline\n",[295,4059,4060],{"class":297,"line":347},[295,4061,308],{"emptyLinePlaceholder":307},[295,4063,4064],{"class":297,"line":353},[295,4065,4066],{},"Alerts (Immediate Response):\n",[295,4068,4069],{"class":297,"line":359},[295,4070,4071],{},"□ Error rate >1% for 2 minutes\n",[295,4073,4074],{"class":297,"line":365},[295,4075,4076],{},"□ P95 response time >5s\n",[295,4078,4079],{"class":297,"line":371},[295,4080,4081],{},"□ Checkout failures >5 in 5 minutes\n",[295,4083,4084],{"class":297,"line":377},[295,4085,4086],{},"□ Payment errors (any)\n",[295,4088,4089],{"class":297,"line":383},[295,4090,4091],{},"□ NetSuite sync queue >100 items\n",[295,4093,4094],{"class":297,"line":389},[295,4095,308],{"emptyLinePlaceholder":307},[295,4097,4098],{"class":297,"line":394},[295,4099,4100],{},"Team Communication:\n",[295,4102,4103],{"class":297,"line":400},[295,4104,4105],{},"□ War room Slack channel\n",[295,4107,4108],{"class":297,"line":406},[295,4109,4110],{},"□ All stakeholders on standby\n",[295,4112,4113],{"class":297,"line":412},[295,4114,4115],{},"□ Customer service briefed\n",[295,4117,4118],{"class":297,"line":418},[295,4119,4120],{},"□ Executive sponsor reachable\n",[22,4122,78],{"id":4123},"phase-7-post-migration-validation",[148,4125,4127],{"id":4126},"_71-functional-validation-checklist","7.1 Functional Validation Checklist",[15,4129,4130],{},"After cutover, systematically validate every critical function:",[285,4132,4134],{"className":287,"code":4133,"language":289,"meta":290,"style":290},"POST-MIGRATION FUNCTIONAL TESTING\n\nCORE SHOPPING FLOW\n□ Homepage loads correctly\n□ Navigation menus work\n□ Search returns results\n□ Faceted filtering works\n□ Product pages display correctly\n□ Add to cart functions\n□ Cart updates (quantity, remove)\n□ Checkout completes (guest)\n□ Checkout completes (registered)\n□ Order confirmation displays\n□ Confirmation email received\n\nCUSTOMER ACCOUNTS\n□ Login works\n□ Registration works\n□ Password reset works\n□ Order history displays\n□ Address book editable\n□ Payment methods manageable\n□ Wishlist functions\n\nB2B FEATURES (if applicable)\n□ Customer-specific pricing shows\n□ Terms payment available\n□ Quick order pad works\n□ Quote request submits\n□ Account hierarchy displays\n□ Sub-user permissions work\n\nINTEGRATIONS\n□ Tax calculation correct\n□ Shipping rates calculate\n□ Inventory levels sync\n□ Orders appear in NetSuite\n□ Fulfillment triggers work\n□ Email marketing events fire\n□ Analytics tracking correct\n",[292,4135,4136,4141,4145,4150,4155,4160,4165,4170,4175,4180,4185,4190,4195,4200,4205,4209,4214,4219,4224,4229,4234,4239,4244,4249,4253,4258,4263,4268,4273,4278,4283,4288,4292,4297,4302,4307,4312,4317,4322,4327],{"__ignoreMap":290},[295,4137,4138],{"class":297,"line":298},[295,4139,4140],{},"POST-MIGRATION FUNCTIONAL TESTING\n",[295,4142,4143],{"class":297,"line":304},[295,4144,308],{"emptyLinePlaceholder":307},[295,4146,4147],{"class":297,"line":311},[295,4148,4149],{},"CORE SHOPPING FLOW\n",[295,4151,4152],{"class":297,"line":317},[295,4153,4154],{},"□ Homepage loads correctly\n",[295,4156,4157],{"class":297,"line":323},[295,4158,4159],{},"□ Navigation menus work\n",[295,4161,4162],{"class":297,"line":329},[295,4163,4164],{},"□ Search returns results\n",[295,4166,4167],{"class":297,"line":335},[295,4168,4169],{},"□ Faceted filtering works\n",[295,4171,4172],{"class":297,"line":341},[295,4173,4174],{},"□ Product pages display correctly\n",[295,4176,4177],{"class":297,"line":347},[295,4178,4179],{},"□ Add to cart functions\n",[295,4181,4182],{"class":297,"line":353},[295,4183,4184],{},"□ Cart updates (quantity, remove)\n",[295,4186,4187],{"class":297,"line":359},[295,4188,4189],{},"□ Checkout completes (guest)\n",[295,4191,4192],{"class":297,"line":365},[295,4193,4194],{},"□ Checkout completes (registered)\n",[295,4196,4197],{"class":297,"line":371},[295,4198,4199],{},"□ Order confirmation displays\n",[295,4201,4202],{"class":297,"line":377},[295,4203,4204],{},"□ Confirmation email received\n",[295,4206,4207],{"class":297,"line":383},[295,4208,308],{"emptyLinePlaceholder":307},[295,4210,4211],{"class":297,"line":389},[295,4212,4213],{},"CUSTOMER ACCOUNTS\n",[295,4215,4216],{"class":297,"line":394},[295,4217,4218],{},"□ Login works\n",[295,4220,4221],{"class":297,"line":400},[295,4222,4223],{},"□ Registration works\n",[295,4225,4226],{"class":297,"line":406},[295,4227,4228],{},"□ Password reset works\n",[295,4230,4231],{"class":297,"line":412},[295,4232,4233],{},"□ Order history displays\n",[295,4235,4236],{"class":297,"line":418},[295,4237,4238],{},"□ Address book editable\n",[295,4240,4241],{"class":297,"line":423},[295,4242,4243],{},"□ Payment methods manageable\n",[295,4245,4246],{"class":297,"line":429},[295,4247,4248],{},"□ Wishlist functions\n",[295,4250,4251],{"class":297,"line":435},[295,4252,308],{"emptyLinePlaceholder":307},[295,4254,4255],{"class":297,"line":2026},[295,4256,4257],{},"B2B FEATURES (if applicable)\n",[295,4259,4260],{"class":297,"line":2032},[295,4261,4262],{},"□ Customer-specific pricing shows\n",[295,4264,4265],{"class":297,"line":2038},[295,4266,4267],{},"□ Terms payment available\n",[295,4269,4270],{"class":297,"line":2044},[295,4271,4272],{},"□ Quick order pad works\n",[295,4274,4275],{"class":297,"line":2050},[295,4276,4277],{},"□ Quote request submits\n",[295,4279,4280],{"class":297,"line":2055},[295,4281,4282],{},"□ Account hierarchy displays\n",[295,4284,4285],{"class":297,"line":2061},[295,4286,4287],{},"□ Sub-user permissions work\n",[295,4289,4290],{"class":297,"line":2067},[295,4291,308],{"emptyLinePlaceholder":307},[295,4293,4294],{"class":297,"line":2783},[295,4295,4296],{},"INTEGRATIONS\n",[295,4298,4299],{"class":297,"line":2798},[295,4300,4301],{},"□ Tax calculation correct\n",[295,4303,4304],{"class":297,"line":2804},[295,4305,4306],{},"□ Shipping rates calculate\n",[295,4308,4309],{"class":297,"line":2810},[295,4310,4311],{},"□ Inventory levels sync\n",[295,4313,4314],{"class":297,"line":2815},[295,4315,4316],{},"□ Orders appear in NetSuite\n",[295,4318,4319],{"class":297,"line":2831},[295,4320,4321],{},"□ Fulfillment triggers work\n",[295,4323,4324],{"class":297,"line":2847},[295,4325,4326],{},"□ Email marketing events fire\n",[295,4328,4329],{"class":297,"line":2867},[295,4330,4331],{},"□ Analytics tracking correct\n",[148,4333,4335],{"id":4334},"_72-performance-validation","7.2 Performance Validation",[15,4337,4338],{},"Compare against your pre-migration baseline:",[285,4340,4342],{"className":448,"code":4341,"language":450,"meta":290,"style":290},"\u002F\u002F Post-migration performance check\nconst postMigrationMetrics = {\n  coreWebVitals: {\n    LCP: 2.1,   \u002F\u002F ✅ Improved from 2.4\n    INP: 165,   \u002F\u002F ✅ Improved from 180\n    CLS: 0.06   \u002F\u002F ✅ Improved from 0.08\n  },\n  serverMetrics: {\n    TTFB: 0.5,            \u002F\u002F ✅ Improved\n    avgPageLoad: 2.9,      \u002F\u002F ✅ Improved\n    checkoutCompletion: 3.8 \u002F\u002F ✅ Improved\n  }\n};\n\n\u002F\u002F Regression thresholds\nconst regressionAlerts = {\n  LCP: baseline * 1.1,    \u002F\u002F Alert if >10% worse\n  conversionRate: baseline * 0.95 \u002F\u002F Alert if >5% drop\n};\n",[292,4343,4344,4349,4360,4364,4376,4388,4398,4402,4406,4419,4431,4441,4445,4449,4453,4458,4469,4484,4497],{"__ignoreMap":290},[295,4345,4346],{"class":297,"line":298},[295,4347,4348],{"class":457},"\u002F\u002F Post-migration performance check\n",[295,4350,4351,4353,4356,4358],{"class":297,"line":304},[295,4352,464],{"class":463},[295,4354,4355],{"class":467}," postMigrationMetrics",[295,4357,471],{"class":463},[295,4359,475],{"class":474},[295,4361,4362],{"class":297,"line":311},[295,4363,480],{"class":474},[295,4365,4366,4368,4371,4373],{"class":297,"line":317},[295,4367,485],{"class":474},[295,4369,4370],{"class":467},"2.1",[295,4372,1548],{"class":474},[295,4374,4375],{"class":457},"\u002F\u002F ✅ Improved from 2.4\n",[295,4377,4378,4380,4383,4385],{"class":297,"line":323},[295,4379,499],{"class":474},[295,4381,4382],{"class":467},"165",[295,4384,1548],{"class":474},[295,4386,4387],{"class":457},"\u002F\u002F ✅ Improved from 180\n",[295,4389,4390,4392,4395],{"class":297,"line":329},[295,4391,512],{"class":474},[295,4393,4394],{"class":467},"0.06",[295,4396,4397],{"class":457},"   \u002F\u002F ✅ Improved from 0.08\n",[295,4399,4400],{"class":297,"line":335},[295,4401,520],{"class":474},[295,4403,4404],{"class":297,"line":341},[295,4405,525],{"class":474},[295,4407,4408,4410,4413,4416],{"class":297,"line":347},[295,4409,530],{"class":474},[295,4411,4412],{"class":467},"0.5",[295,4414,4415],{"class":474},",            ",[295,4417,4418],{"class":457},"\u002F\u002F ✅ Improved\n",[295,4420,4421,4423,4426,4429],{"class":297,"line":353},[295,4422,544],{"class":474},[295,4424,4425],{"class":467},"2.9",[295,4427,4428],{"class":474},",      ",[295,4430,4418],{"class":457},[295,4432,4433,4435,4438],{"class":297,"line":359},[295,4434,557],{"class":474},[295,4436,4437],{"class":467},"3.8",[295,4439,4440],{"class":457}," \u002F\u002F ✅ Improved\n",[295,4442,4443],{"class":297,"line":365},[295,4444,612],{"class":474},[295,4446,4447],{"class":297,"line":371},[295,4448,617],{"class":474},[295,4450,4451],{"class":297,"line":377},[295,4452,308],{"emptyLinePlaceholder":307},[295,4454,4455],{"class":297,"line":383},[295,4456,4457],{"class":457},"\u002F\u002F Regression thresholds\n",[295,4459,4460,4462,4465,4467],{"class":297,"line":389},[295,4461,464],{"class":463},[295,4463,4464],{"class":467}," regressionAlerts",[295,4466,471],{"class":463},[295,4468,475],{"class":474},[295,4470,4471,4474,4476,4479,4481],{"class":297,"line":394},[295,4472,4473],{"class":474},"  LCP: baseline ",[295,4475,1891],{"class":463},[295,4477,4478],{"class":467}," 1.1",[295,4480,1562],{"class":474},[295,4482,4483],{"class":457},"\u002F\u002F Alert if >10% worse\n",[295,4485,4486,4489,4491,4494],{"class":297,"line":400},[295,4487,4488],{"class":474},"  conversionRate: baseline ",[295,4490,1891],{"class":463},[295,4492,4493],{"class":467}," 0.95",[295,4495,4496],{"class":457}," \u002F\u002F Alert if >5% drop\n",[295,4498,4499],{"class":297,"line":406},[295,4500,617],{"class":474},[148,4502,4504],{"id":4503},"_73-48-hour-monitoring-protocol","7.3 48-Hour Monitoring Protocol",[15,4506,4507],{},"Maintain heightened monitoring for 48 hours post-migration:",[285,4509,4511],{"className":287,"code":4510,"language":289,"meta":290,"style":290},"48-HOUR POST-MIGRATION PROTOCOL\n\nHours 0-4:\n□ All hands monitoring\n□ Check orders every 15 minutes\n□ Compare conversion rate vs. same day last week\n□ Review all error logs\n\nHours 4-12:\n□ Reduced team, senior engineer on call\n□ Check orders every 30 minutes\n□ Review customer service tickets\n□ First daily comparison report\n\nHours 12-24:\n□ On-call engineer only\n□ Automated monitoring active\n□ Escalation procedures documented\n□ Morning stand-up scheduled\n\nHours 24-48:\n□ Normal operations resume\n□ Continue enhanced monitoring\n□ Compile migration success report\n□ Schedule retrospective meeting\n",[292,4512,4513,4518,4522,4527,4532,4537,4542,4547,4551,4556,4561,4566,4571,4576,4580,4585,4590,4595,4600,4605,4609,4614,4619,4624,4629],{"__ignoreMap":290},[295,4514,4515],{"class":297,"line":298},[295,4516,4517],{},"48-HOUR POST-MIGRATION PROTOCOL\n",[295,4519,4520],{"class":297,"line":304},[295,4521,308],{"emptyLinePlaceholder":307},[295,4523,4524],{"class":297,"line":311},[295,4525,4526],{},"Hours 0-4:\n",[295,4528,4529],{"class":297,"line":317},[295,4530,4531],{},"□ All hands monitoring\n",[295,4533,4534],{"class":297,"line":323},[295,4535,4536],{},"□ Check orders every 15 minutes\n",[295,4538,4539],{"class":297,"line":329},[295,4540,4541],{},"□ Compare conversion rate vs. same day last week\n",[295,4543,4544],{"class":297,"line":335},[295,4545,4546],{},"□ Review all error logs\n",[295,4548,4549],{"class":297,"line":341},[295,4550,308],{"emptyLinePlaceholder":307},[295,4552,4553],{"class":297,"line":347},[295,4554,4555],{},"Hours 4-12:\n",[295,4557,4558],{"class":297,"line":353},[295,4559,4560],{},"□ Reduced team, senior engineer on call\n",[295,4562,4563],{"class":297,"line":359},[295,4564,4565],{},"□ Check orders every 30 minutes\n",[295,4567,4568],{"class":297,"line":365},[295,4569,4570],{},"□ Review customer service tickets\n",[295,4572,4573],{"class":297,"line":371},[295,4574,4575],{},"□ First daily comparison report\n",[295,4577,4578],{"class":297,"line":377},[295,4579,308],{"emptyLinePlaceholder":307},[295,4581,4582],{"class":297,"line":383},[295,4583,4584],{},"Hours 12-24:\n",[295,4586,4587],{"class":297,"line":389},[295,4588,4589],{},"□ On-call engineer only\n",[295,4591,4592],{"class":297,"line":394},[295,4593,4594],{},"□ Automated monitoring active\n",[295,4596,4597],{"class":297,"line":400},[295,4598,4599],{},"□ Escalation procedures documented\n",[295,4601,4602],{"class":297,"line":406},[295,4603,4604],{},"□ Morning stand-up scheduled\n",[295,4606,4607],{"class":297,"line":412},[295,4608,308],{"emptyLinePlaceholder":307},[295,4610,4611],{"class":297,"line":418},[295,4612,4613],{},"Hours 24-48:\n",[295,4615,4616],{"class":297,"line":423},[295,4617,4618],{},"□ Normal operations resume\n",[295,4620,4621],{"class":297,"line":429},[295,4622,4623],{},"□ Continue enhanced monitoring\n",[295,4625,4626],{"class":297,"line":435},[295,4627,4628],{},"□ Compile migration success report\n",[295,4630,4631],{"class":297,"line":2026},[295,4632,4633],{},"□ Schedule retrospective meeting\n",[22,4635,84],{"id":4636},"the-complete-migration-checklist",[15,4638,4639],{},"Here's the consolidated checklist for your migration:",[285,4641,4643],{"className":1051,"code":4642,"language":1053,"meta":290,"style":290},"# SUITECOMMERCE MIGRATION CHECKLIST\n\n## PHASE 1: PRE-MIGRATION ASSESSMENT\n□ Define migration scope and type\n□ Document business requirements\n□ Identify downtime tolerance\n□ Create technical inventory\n□ Capture performance baseline\n□ Identify stakeholders and approvers\n\n## PHASE 2: VERSION COMPATIBILITY\n□ Review target version release notes\n□ Audit code for deprecated APIs\n□ Create dependency version matrix\n□ Test each extension for compatibility\n□ Estimate total development effort\n\n## PHASE 3: CUSTOMIZATION AUDIT\n□ Inventory all theme modifications\n□ Classify customizations by risk level\n□ Document business logic and reasons\n□ Audit all SuiteScripts\n□ Map all third-party integrations\n\n## PHASE 4: BACKUP AND RECOVERY\n□ Complete NetSuite data backup\n□ Tag code in version control\n□ Create code archive in cloud storage\n□ Document rollback procedures\n□ Define data freeze protocol\n□ Schedule maintenance window\n\n## PHASE 5: STAGING SETUP\n□ Configure sandbox environment\n□ Deploy new version to staging\n□ Migrate all customizations\n□ Set up automated test suite\n□ Execute load testing\n□ Complete UAT sign-off\n\n## PHASE 6: DEPLOYMENT\n□ Lower DNS TTL (if applicable)\n□ Deploy to production (GREEN)\n□ Warm CDN caches\n□ Execute canary deployment (5%)\n□ Monitor for 30 minutes\n□ Gradual traffic shift to 100%\n□ Update monitoring thresholds\n\n## PHASE 7: POST-MIGRATION\n□ Complete functional validation\n□ Verify performance metrics\n□ Confirm order flow to NetSuite\n□ Check all integrations\n□ Review error logs\n□ 48-hour enhanced monitoring\n□ Decommission old environment\n□ Conduct retrospective\n",[292,4644,4645,4650,4654,4659,4664,4669,4674,4679,4684,4689,4693,4698,4703,4708,4713,4718,4723,4727,4732,4737,4742,4747,4752,4757,4761,4766,4771,4776,4781,4786,4791,4796,4800,4805,4810,4815,4820,4825,4830,4835,4839,4844,4849,4854,4859,4864,4869,4874,4879,4883,4888,4893,4898,4903,4908,4914,4920,4926],{"__ignoreMap":290},[295,4646,4647],{"class":297,"line":298},[295,4648,4649],{},"# SUITECOMMERCE MIGRATION CHECKLIST\n",[295,4651,4652],{"class":297,"line":304},[295,4653,308],{"emptyLinePlaceholder":307},[295,4655,4656],{"class":297,"line":311},[295,4657,4658],{},"## PHASE 1: PRE-MIGRATION ASSESSMENT\n",[295,4660,4661],{"class":297,"line":317},[295,4662,4663],{},"□ Define migration scope and type\n",[295,4665,4666],{"class":297,"line":323},[295,4667,4668],{},"□ Document business requirements\n",[295,4670,4671],{"class":297,"line":329},[295,4672,4673],{},"□ Identify downtime tolerance\n",[295,4675,4676],{"class":297,"line":335},[295,4677,4678],{},"□ Create technical inventory\n",[295,4680,4681],{"class":297,"line":341},[295,4682,4683],{},"□ Capture performance baseline\n",[295,4685,4686],{"class":297,"line":347},[295,4687,4688],{},"□ Identify stakeholders and approvers\n",[295,4690,4691],{"class":297,"line":353},[295,4692,308],{"emptyLinePlaceholder":307},[295,4694,4695],{"class":297,"line":359},[295,4696,4697],{},"## PHASE 2: VERSION COMPATIBILITY\n",[295,4699,4700],{"class":297,"line":365},[295,4701,4702],{},"□ Review target version release notes\n",[295,4704,4705],{"class":297,"line":371},[295,4706,4707],{},"□ Audit code for deprecated APIs\n",[295,4709,4710],{"class":297,"line":377},[295,4711,4712],{},"□ Create dependency version matrix\n",[295,4714,4715],{"class":297,"line":383},[295,4716,4717],{},"□ Test each extension for compatibility\n",[295,4719,4720],{"class":297,"line":389},[295,4721,4722],{},"□ Estimate total development effort\n",[295,4724,4725],{"class":297,"line":394},[295,4726,308],{"emptyLinePlaceholder":307},[295,4728,4729],{"class":297,"line":400},[295,4730,4731],{},"## PHASE 3: CUSTOMIZATION AUDIT\n",[295,4733,4734],{"class":297,"line":406},[295,4735,4736],{},"□ Inventory all theme modifications\n",[295,4738,4739],{"class":297,"line":412},[295,4740,4741],{},"□ Classify customizations by risk level\n",[295,4743,4744],{"class":297,"line":418},[295,4745,4746],{},"□ Document business logic and reasons\n",[295,4748,4749],{"class":297,"line":423},[295,4750,4751],{},"□ Audit all SuiteScripts\n",[295,4753,4754],{"class":297,"line":429},[295,4755,4756],{},"□ Map all third-party integrations\n",[295,4758,4759],{"class":297,"line":435},[295,4760,308],{"emptyLinePlaceholder":307},[295,4762,4763],{"class":297,"line":2026},[295,4764,4765],{},"## PHASE 4: BACKUP AND RECOVERY\n",[295,4767,4768],{"class":297,"line":2032},[295,4769,4770],{},"□ Complete NetSuite data backup\n",[295,4772,4773],{"class":297,"line":2038},[295,4774,4775],{},"□ Tag code in version control\n",[295,4777,4778],{"class":297,"line":2044},[295,4779,4780],{},"□ Create code archive in cloud storage\n",[295,4782,4783],{"class":297,"line":2050},[295,4784,4785],{},"□ Document rollback procedures\n",[295,4787,4788],{"class":297,"line":2055},[295,4789,4790],{},"□ Define data freeze protocol\n",[295,4792,4793],{"class":297,"line":2061},[295,4794,4795],{},"□ Schedule maintenance window\n",[295,4797,4798],{"class":297,"line":2067},[295,4799,308],{"emptyLinePlaceholder":307},[295,4801,4802],{"class":297,"line":2783},[295,4803,4804],{},"## PHASE 5: STAGING SETUP\n",[295,4806,4807],{"class":297,"line":2798},[295,4808,4809],{},"□ Configure sandbox environment\n",[295,4811,4812],{"class":297,"line":2804},[295,4813,4814],{},"□ Deploy new version to staging\n",[295,4816,4817],{"class":297,"line":2810},[295,4818,4819],{},"□ Migrate all customizations\n",[295,4821,4822],{"class":297,"line":2815},[295,4823,4824],{},"□ Set up automated test suite\n",[295,4826,4827],{"class":297,"line":2831},[295,4828,4829],{},"□ Execute load testing\n",[295,4831,4832],{"class":297,"line":2847},[295,4833,4834],{},"□ Complete UAT sign-off\n",[295,4836,4837],{"class":297,"line":2867},[295,4838,308],{"emptyLinePlaceholder":307},[295,4840,4841],{"class":297,"line":2880},[295,4842,4843],{},"## PHASE 6: DEPLOYMENT\n",[295,4845,4846],{"class":297,"line":2912},[295,4847,4848],{},"□ Lower DNS TTL (if applicable)\n",[295,4850,4851],{"class":297,"line":2917},[295,4852,4853],{},"□ Deploy to production (GREEN)\n",[295,4855,4856],{"class":297,"line":2923},[295,4857,4858],{},"□ Warm CDN caches\n",[295,4860,4861],{"class":297,"line":2939},[295,4862,4863],{},"□ Execute canary deployment (5%)\n",[295,4865,4866],{"class":297,"line":2956},[295,4867,4868],{},"□ Monitor for 30 minutes\n",[295,4870,4871],{"class":297,"line":2971},[295,4872,4873],{},"□ Gradual traffic shift to 100%\n",[295,4875,4876],{"class":297,"line":2981},[295,4877,4878],{},"□ Update monitoring thresholds\n",[295,4880,4881],{"class":297,"line":3004},[295,4882,308],{"emptyLinePlaceholder":307},[295,4884,4885],{"class":297,"line":3021},[295,4886,4887],{},"## PHASE 7: POST-MIGRATION\n",[295,4889,4890],{"class":297,"line":3031},[295,4891,4892],{},"□ Complete functional validation\n",[295,4894,4895],{"class":297,"line":3052},[295,4896,4897],{},"□ Verify performance metrics\n",[295,4899,4900],{"class":297,"line":3057},[295,4901,4902],{},"□ Confirm order flow to NetSuite\n",[295,4904,4905],{"class":297,"line":3062},[295,4906,4907],{},"□ Check all integrations\n",[295,4909,4911],{"class":297,"line":4910},55,[295,4912,4913],{},"□ Review error logs\n",[295,4915,4917],{"class":297,"line":4916},56,[295,4918,4919],{},"□ 48-hour enhanced monitoring\n",[295,4921,4923],{"class":297,"line":4922},57,[295,4924,4925],{},"□ Decommission old environment\n",[295,4927,4929],{"class":297,"line":4928},58,[295,4930,4931],{},"□ Conduct retrospective\n",[22,4933,90],{"id":4934},"when-to-diy-vs-hire-help",[15,4936,4937],{},"Be honest about your team's capabilities:",[15,4939,4940],{},[106,4941,4942],{},"Handle In-House If:",[27,4944,4945,4947,4950,4953,4956],{},[30,4946,193],{},[30,4948,4949],{},"Minimal customizations (\u003C5 extensions)",[30,4951,4952],{},"Standard theme with CSS-only changes",[30,4954,4955],{},"You have SuiteCommerce development experience",[30,4957,4958],{},"You can tolerate a maintenance window",[15,4960,4961],{},[106,4962,4963],{},"Hire Help If:",[27,4965,4966,4969,4972,4975,4978,4981,4984],{},[30,4967,4968],{},"Major version jump (2022.x → 2024.x)",[30,4970,4971],{},"Heavy customizations (>10 extensions or core overrides)",[30,4973,4974],{},"Custom SuiteScript integrations",[30,4976,4977],{},"Zero-downtime requirement",[30,4979,4980],{},"No in-house SuiteCommerce expertise",[30,4982,4983],{},"B2B functionality with complex pricing",[30,4985,4986],{},"High transaction volume (>$1M\u002Fmonth)",[15,4988,4989,4990,4994],{},"At Stenbase, we specialize in complex migrations. Our ",[33,4991,4993],{"href":4992},"\u002Fsuitecommerce-services\u002Fsuitecommerce-implementation","SuiteCommerce implementation services"," include migration planning, execution, and post-migration optimization.",[22,4996,96],{"id":4997},"faq",[148,4999,5001],{"id":5000},"how-long-does-a-typical-suitecommerce-migration-take","How long does a typical SuiteCommerce migration take?",[15,5003,5004],{},"Timeline depends on complexity:",[27,5006,5007,5013,5019],{},[30,5008,5009,5012],{},[106,5010,5011],{},"Simple upgrades"," (theme refresh, minor version): 2-4 weeks",[30,5014,5015,5018],{},[106,5016,5017],{},"Standard migrations"," (major version, moderate customizations): 6-8 weeks",[30,5020,5021,5024],{},[106,5022,5023],{},"Complex migrations"," (heavy customizations, zero-downtime requirement): 10-16 weeks",[148,5026,5028],{"id":5027},"can-i-migrate-during-business-hours","Can I migrate during business hours?",[15,5030,5031],{},"With proper blue-green deployment, yes. We've executed migrations during peak business hours without customers noticing. The key is gradual traffic shifting and instant rollback capability.",[148,5033,5035],{"id":5034},"whats-the-biggest-migration-risk","What's the biggest migration risk?",[15,5037,5038],{},"Untested customizations. Every custom extension, theme modification, and SuiteScript must be tested against the new version in staging before production deployment. \"It worked before\" is not a test plan.",[148,5040,5042],{"id":5041},"should-i-migrate-or-rebuild","Should I migrate or rebuild?",[15,5044,5045,5046,5050],{},"If your customizations are more than 3 versions old and weren't built following SuiteCommerce best practices, rebuilding is often faster than migrating. We assess this during our ",[33,5047,5049],{"href":5048},"\u002Ffree-audit","free site audit",".",[148,5052,5054],{"id":5053},"how-do-i-handle-orders-placed-during-migration","How do I handle orders placed during migration?",[15,5056,5057],{},"With zero-downtime deployment, orders continue processing normally. For traditional maintenance-window migrations, implement a data freeze protocol 1-4 hours before cutover and reconcile all pending orders immediately after.",[5059,5060],"hr",{},[15,5062,5063],{},[5064,5065,5066,5067,5071],"em",{},"Planning a SuiteCommerce migration? ",[33,5068,5070],{"href":5069},"\u002Fcontact","Contact Stenbase"," for a free migration assessment. We'll review your current implementation and provide a realistic timeline and risk analysis—no obligation.",[5073,5074,5075],"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 .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}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 .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":290,"searchDepth":304,"depth":304,"links":5077},[5078,5079,5080,5086,5092,5098,5103,5108,5114,5119,5120,5121],{"id":24,"depth":304,"text":25},{"id":99,"depth":304,"text":36},{"id":139,"depth":304,"text":42,"children":5081},[5082,5083,5084,5085],{"id":150,"depth":311,"text":151},{"id":224,"depth":311,"text":225},{"id":279,"depth":311,"text":280},{"id":441,"depth":311,"text":442},{"id":620,"depth":304,"text":48,"children":5087},[5088,5089,5090,5091],{"id":623,"depth":311,"text":624},{"id":656,"depth":311,"text":657},{"id":785,"depth":311,"text":786},{"id":898,"depth":311,"text":899},{"id":1134,"depth":304,"text":54,"children":5093},[5094,5095,5096,5097],{"id":1137,"depth":311,"text":1138},{"id":1223,"depth":311,"text":1224},{"id":1288,"depth":311,"text":1289},{"id":1459,"depth":311,"text":1460},{"id":1659,"depth":304,"text":60,"children":5099},[5100,5101,5102],{"id":1662,"depth":311,"text":1663},{"id":1899,"depth":311,"text":1900},{"id":2073,"depth":311,"text":2074},{"id":2210,"depth":304,"text":66,"children":5104},[5105,5106,5107],{"id":2219,"depth":311,"text":2220},{"id":2323,"depth":311,"text":2324},{"id":3068,"depth":311,"text":3069},{"id":3538,"depth":304,"text":72,"children":5109},[5110,5111,5112,5113],{"id":3541,"depth":311,"text":3542},{"id":3689,"depth":311,"text":3690},{"id":3800,"depth":311,"text":3801},{"id":4009,"depth":311,"text":4010},{"id":4123,"depth":304,"text":78,"children":5115},[5116,5117,5118],{"id":4126,"depth":311,"text":4127},{"id":4334,"depth":311,"text":4335},{"id":4503,"depth":311,"text":4504},{"id":4636,"depth":304,"text":84},{"id":4934,"depth":304,"text":90},{"id":4997,"depth":304,"text":96,"children":5122},[5123,5124,5125,5126,5127],{"id":5000,"depth":311,"text":5001},{"id":5027,"depth":311,"text":5028},{"id":5034,"depth":311,"text":5035},{"id":5041,"depth":311,"text":5042},{"id":5053,"depth":311,"text":5054},[5129,5130],"SuiteCommerce","Development","2026-02-01","A comprehensive guide to migrating or upgrading your SuiteCommerce store with zero downtime. Includes pre-migration assessment, staging setup, deployment strategies, and a downloadable checklist.","md","\u002Fimages\u002Fblog\u002Fmigration-checklist-hero.webp",{"keywords":5136},[5137,5138,5139,5140],"SuiteCommerce migration","SuiteCommerce upgrade","zero downtime deployment","SuiteCommerce version upgrade","\u002Fblog\u002Fsuitecommerce-migration-checklist-upgrading-without-downtime",null,{"title":5,"description":5132},"blog\u002Fsuitecommerce-migration-checklist-upgrading-without-downtime",[5129,5146,5147,5148,5149],"Migration","Upgrade","Zero Downtime","Implementation","d07WZ2PVBp-qx_S3b2PfSw1cyCimK-vttLBKydCEROQ",[5152,5163,5175,5187,5195,5205,5217,5226,5236,5245,5248,5258,5266,5276,5284,5294,5306,5315,5324,5333,5341],{"path":5153,"title":5154,"categories":5155,"tags":5156,"heroImage":5162},"\u002Fblog\u002Fbuilding-custom-suitecommerce-extensions-developer-guide","Building Custom SuiteCommerce Extensions: A Developer's Start-to-Finish Guide",[5129,5130],[5157,5158,5159,5160,5161],"SuiteCommerce Extensions","Custom Development","Backbone.js","SuiteScript","Frontend Development","\u002Fimages\u002Fblog\u002Fextensions-guide-hero.webp",{"path":5164,"title":5165,"categories":5166,"tags":5168,"heroImage":5174},"\u002Fblog\u002Fcore-web-vitals-suitecommerce-optimization-checklist","Core Web Vitals for SuiteCommerce: The Complete 2026 Optimization Checklist",[5167,5129],"Performance",[5169,5170,5171,5172,5173,5129],"Core Web Vitals","LCP","INP","CLS","Performance Optimization","\u002Fimages\u002Fblog\u002Fcore-web-vitals-hero.webp",{"path":5176,"title":5177,"categories":5178,"tags":5180,"heroImage":5186},"\u002Fblog\u002Ffixing-duplicate-content-suitecommerce-faceted-navigation","Fixing Duplicate Content in SuiteCommerce Faceted Navigation",[5179,5129],"SEO",[5181,5182,5183,5184,5129,5185],"Duplicate Content","Faceted Navigation","Canonical Tags","Technical SEO","URL Parameters","\u002Fimages\u002Fblog\u002Fduplicate-content-seo-hero.webp",{"path":5188,"title":5189,"categories":5190,"tags":5191,"heroImage":5194},"\u002Fblog\u002Fheadless-suitecommerce-when-does-it-make-sense","Headless SuiteCommerce: When Does It Make Sense?",[5129,5130],[5129,5192,5193,5149,5167],"Headless Commerce","Architecture","\u002Fimages\u002Fblog\u002Fheadless-suitecommerce-hero.webp",{"path":5196,"title":5197,"categories":5198,"tags":5200,"heroImage":5204},"\u002Fblog\u002Fnetsuite-ecommerce-integration-architecture-how-suitecommerce-works","NetSuite E-commerce Integration Architecture: How SuiteCommerce Actually Works",[5129,5130,5199],"Integration",[5193,5199,5160,5201,5202,5203],"API","Backend","Frontend","\u002Fimages\u002Fblog\u002Fnetsuite-ecommerce-integration-hero.webp",{"path":5206,"title":5207,"categories":5208,"tags":5210,"heroImage":5216},"\u002Fblog\u002Fnetsuite-integration-without-celigo-when-custom-beats-off-the-shelf","NetSuite Integration Without Celigo: When Custom Beats Off-the-Shelf",[5209,5199],"NetSuite",[5211,5212,5213,5214,5160,5215],"NetSuite Integration","Celigo","Custom Integration","RESTlet","API Development","\u002Fimages\u002Fblog\u002Fnetsuite-integration-hero.webp",{"path":5218,"title":5219,"categories":5220,"tags":5221,"heroImage":5225},"\u002Fblog\u002Fsuitecommerce-checkout-optimization-fixing-abandonment","SuiteCommerce Checkout Optimization: Fixing Abandonment at the Technical Level",[5129,5167],[5129,5222,5223,5224,5167],"Checkout Optimization","Cart Abandonment","Conversions","\u002Fimages\u002Fblog\u002Fsuitecommerce-checkout-hero.webp",{"path":5227,"title":5228,"categories":5229,"tags":5230,"heroImage":5235},"\u002Fblog\u002Fsuitecommerce-image-optimization-developer-guide","SuiteCommerce Image Optimization: A Developer's Guide",[5167,5129],[5231,5232,5233,5234,5167,5129],"Image Optimization","WebP","Lazy Loading","CDN","\u002Fimages\u002Fblog\u002Fimage-optimization-hero.webp",{"path":5237,"title":5238,"categories":5239,"tags":5240,"heroImage":5244},"\u002Fblog\u002Fsuitecommerce-implementation-cost-guide-2026","SuiteCommerce Implementation Cost Guide: What to Expect in 2026",[5129,5149],[5241,5149,5209,5242,5243],"SuiteCommerce Cost","Budget Planning","E-commerce","\u002Fimages\u002Fblog\u002Fimplementation-cost-hero.webp",{"path":5141,"title":5,"categories":5246,"tags":5247,"heroImage":5134},[5129,5130],[5129,5146,5147,5148,5149],{"path":5249,"title":5250,"categories":5251,"tags":5252,"heroImage":5257},"\u002Fblog\u002Fsuitecommerce-myaccount-customization-b2b-features","SuiteCommerce MyAccount Customization: 10 Features B2B Customers Need",[5129,5130],[5129,5253,5254,5255,5256],"MyAccount","B2B","Customization","Portal","\u002Fimages\u002Fblog\u002Fsuitecommerce-myaccount-hero.webp",{"path":5259,"title":5260,"categories":5261,"tags":5263,"heroImage":5265},"\u002Fblog\u002Fsuitecommerce-performance-audit-286-stores","We Audited 286 Live SuiteCommerce Stores. Here's What We Found",[5167,5262,5129],"Research",[5167,5129,5169,5262,5264],"Benchmarks","\u002Fimages\u002Fblog\u002Fsuitecommerce-audit-hero.webp",{"path":5267,"title":5268,"categories":5269,"tags":5270,"heroImage":5275},"\u002Fblog\u002Fsuitecommerce-product-page-optimization-conversions-seo","How to Optimize SuiteCommerce Product Pages for Conversions and SEO",[5179,5167,5129],[5271,5272,5273,5184,5274],"Product Pages","Conversion Optimization","Schema Markup","CRO","\u002Fimages\u002Fblog\u002Fsuitecommerce-product-page-hero.webp",{"path":5277,"title":5278,"categories":5279,"tags":5280,"heroImage":5283},"\u002Fblog\u002Fsuitecommerce-seo-schema-markup-technical-guide","SuiteCommerce SEO: Schema Markup, Technical SEO, and What Actually Works",[5179,5129],[5273,5184,5281,5282,5129,5209],"JSON-LD","Structured Data","\u002Fimages\u002Fblog\u002Fseo-schema-markup-hero.webp",{"path":5285,"title":5286,"categories":5287,"tags":5289,"heroImage":5293},"\u002Fblog\u002Fsuitecommerce-theme-development-design-to-deployment","SuiteCommerce Theme Development: From Design to Deployment",[5130,5129,5288],"Themes",[5290,884,5291,5292,5161,5255],"Theme Development","CSS","Templates","\u002Fimages\u002Fblog\u002Fsuitecommerce-theme-hero.webp",{"path":5295,"title":5296,"categories":5297,"tags":5300,"heroImage":5305},"\u002Fblog\u002Fsuitecommerce-version-upgrade-guide-2024","SuiteCommerce Version Upgrade Guide: 2023.x to 2024.x",[5129,5298,5299],"Maintenance","Upgrades",[5301,5146,5302,5303,5304],"Version Upgrade","2024 Release","SCA","Deployment","\u002Fimages\u002Fblog\u002Fsuitecommerce-upgrade-hero.webp",{"path":5307,"title":5308,"categories":5309,"tags":5310,"heroImage":5314},"\u002Fblog\u002Fsuitecommerce-vs-bigcommerce-netsuite-users","SuiteCommerce vs. BigCommerce for NetSuite Users: Which Platform Wins?",[5129,5243],[5311,5129,5209,5312,5313,5199],"BigCommerce","Platform Comparison","E-commerce Platform","\u002Fimages\u002Fblog\u002Fsuitecommerce-vs-bigcommerce-hero.webp",{"path":5316,"title":5317,"categories":5318,"tags":5319,"heroImage":5323},"\u002Fblog\u002Fsuitescript-performance-optimization-writing-efficient-scripts","SuiteScript Performance Optimization: Writing Efficient Scripts",[5209,5160],[5160,5173,5320,5321,5322,5201],"Governance","Map\u002FReduce","NetSuite Development","\u002Fimages\u002Fblog\u002Fsuitescript-performance-hero.webp",{"path":5325,"title":5326,"categories":5327,"tags":5328,"heroImage":5332},"\u002Fblog\u002Ftroubleshooting-suitecommerce-15-common-errors-how-to-fix","Troubleshooting SuiteCommerce: 15 Common Errors and How to Fix Them",[5129,5130],[5129,5329,5330,5331,5130],"Troubleshooting","Errors","Debugging","\u002Fimages\u002Fblog\u002Ftroubleshooting-errors-hero.webp",{"path":5334,"title":5335,"categories":5336,"tags":5337,"heroImage":5340},"\u002Fblog\u002Ftrue-cost-suitecommerce-maintenance-annual-budget-guide","The True Cost of SuiteCommerce Maintenance: Annual Budget Planning Guide",[5129,5167],[5129,5298,5242,5338,5339],"TCO","E-commerce Operations","\u002Fimages\u002Fblog\u002Fsuitecommerce-maintenance-cost-hero.webp",{"path":5342,"title":5343,"categories":5344,"tags":5345,"heroImage":5347},"\u002Fblog\u002Fwhy-suitecommerce-site-slow-how-to-fix","Why Your SuiteCommerce Site is Slow (And How to Fix It)",[5167,5129],[5167,5129,5346,5329],"Speed Optimization","\u002Fimages\u002Fblog\u002Fslow-site-fix-hero.webp",1773773963918]