[{"data":1,"prerenderedAt":8149},["ShallowReactive",2],{"blog-suitecommerce-checkout-optimization-fixing-abandonment":3,"all-blog-posts":7950},{"id":4,"title":5,"author":6,"body":7,"categories":7927,"date":7930,"description":7931,"extension":7932,"heroImage":7933,"meta":7934,"navigation":232,"path":7941,"relatedArticles":7942,"seo":7943,"stem":7944,"tags":7945,"__hash__":7949},"content\u002Fblog\u002Fsuitecommerce-checkout-optimization-fixing-abandonment.md","SuiteCommerce Checkout Optimization: Fixing Abandonment at the Technical Level","Stenbase Team",{"type":8,"value":9,"toc":7878},"minimark",[10,14,22,25,28,31,36,107,109,112,115,118,156,159,165,171,177,183,186,188,191,194,199,202,715,718,807,811,814,817,819,822,825,829,835,1137,1143,1146,1181,1187,1191,1194,1533,1536,1612,1615,1617,1620,1623,1627,1630,2041,2045,2048,2053,2073,2382,2386,2389,2395,2402,2529,2532,2534,2537,2544,2547,2551,2557,2571,2577,2581,3037,3040,3151,3155,3158,3455,3457,3460,3463,3467,3470,3474,3477,3508,3511,3873,3876,4189,4192,4196,4199,4438,4440,4443,4446,4450,4542,4546,5140,5144,5147,5244,5247,5249,5252,5255,5259,5262,5977,5980,6575,6579,6582,6717,6720,6722,6725,6731,6734,6738,7449,7453,7707,7710,7712,7715,7718,7801,7804,7806,7809,7813,7819,7823,7826,7830,7833,7837,7844,7848,7851,7853,7857,7860,7863,7874],[11,12,5],"h1",{"id":13},"suitecommerce-checkout-optimization-fixing-abandonment-at-the-technical-level",[15,16,17,21],"p",{},[18,19,20],"strong",{},"70.22% of online shopping carts are abandoned before checkout completes."," That's the global average across all platforms, according to Baymard Institute's analysis of 50 independent studies. For SuiteCommerce stores specifically, we've seen rates climb above 75%—largely due to technical friction that most store owners don't know exists.",[15,23,24],{},"Here's what makes this painful: Baymard estimates that $260 billion in lost orders are recoverable through better checkout design and implementation alone. Not through bigger ad budgets or more traffic. Through fixing what's already broken.",[15,26,27],{},"This guide isn't about generic \"add trust badges\" advice. It's a technical breakdown of the SuiteCommerce-specific issues that kill conversions at checkout—and the exact code, configuration, and architecture changes that fix them.",[29,30],"hr",{},[32,33,35],"h2",{"id":34},"table-of-contents","Table of Contents",[37,38,39,47,53,59,65,71,77,83,89,95,101],"ol",{},[40,41,42],"li",{},[43,44,46],"a",{"href":45},"#why-suitecommerce-checkouts-underperform","Why SuiteCommerce Checkouts Underperform",[40,48,49],{},[43,50,52],{"href":51},"#diagnosing-your-checkout-abandonment","Diagnosing Your Checkout Abandonment",[40,54,55],{},[43,56,58],{"href":57},"#payment-integration-issues-and-how-to-fix-them","Payment Integration Issues (And How to Fix Them)",[40,60,61],{},[43,62,64],{"href":63},"#checkout-flow-speed-optimization","Checkout Flow Speed Optimization",[40,66,67],{},[43,68,70],{"href":69},"#mobile-checkout-where-most-suitecommerce-stores-fail","Mobile Checkout: Where Most SuiteCommerce Stores Fail",[40,72,73],{},[43,74,76],{"href":75},"#implementing-guest-checkout-properly","Implementing Guest Checkout Properly",[40,78,79],{},[43,80,82],{"href":81},"#reducing-form-fields-without-losing-data","Reducing Form Fields Without Losing Data",[40,84,85],{},[43,86,88],{"href":87},"#shipping-and-tax-transparency","Shipping and Tax Transparency",[40,90,91],{},[43,92,94],{"href":93},"#ab-testing-checkout-changes-in-suitecommerce","A\u002FB Testing Checkout Changes in SuiteCommerce",[40,96,97],{},[43,98,100],{"href":99},"#measuring-checkout-performance","Measuring Checkout Performance",[40,102,103],{},[43,104,106],{"href":105},"#faq","FAQ",[29,108],{},[32,110,46],{"id":111},"why-suitecommerce-checkouts-underperform",[15,113,114],{},"SuiteCommerce's checkout isn't inherently broken. But its default configuration creates friction that modern shoppers won't tolerate.",[15,116,117],{},"The top reasons shoppers abandon carts, per Baymard's research:",[119,120,121,127,133,138,144,150],"ul",{},[40,122,123,126],{},[18,124,125],{},"39%"," — Extra costs too high (shipping, tax, fees)",[40,128,129,132],{},[18,130,131],{},"19%"," — Didn't trust the site with credit card information",[40,134,135,137],{},[18,136,131],{}," — Site required account creation",[40,139,140,143],{},[18,141,142],{},"18%"," — Checkout process too long or complicated",[40,145,146,149],{},[18,147,148],{},"15%"," — Website had errors or crashed",[40,151,152,155],{},[18,153,154],{},"10%"," — Not enough payment methods",[15,157,158],{},"Now map those against a default SuiteCommerce checkout:",[15,160,161,164],{},[18,162,163],{},"Account creation required by default."," SuiteCommerce's standard checkout flow funnels users through account registration. That's 19% of abandoners right there.",[15,166,167,170],{},[18,168,169],{},"Form fields exceed best practice."," Baymard's checkout usability research shows the ideal checkout has 12–14 form elements. The average SuiteCommerce checkout shows 18–22 form elements, including fields like \"Company Name\" and \"Phone (Evening)\" that most B2C stores don't need.",[15,172,173,176],{},[18,174,175],{},"Payment options are limited out of the box."," Default SuiteCommerce supports credit cards through NetSuite's payment processing. No Apple Pay. No Google Pay. No PayPal Express. That's the 10% who need more payment methods.",[15,178,179,182],{},[18,180,181],{},"No real-time shipping estimates."," Customers don't see shipping costs until deep in the checkout flow—triggering the #1 abandonment reason.",[15,184,185],{},"Each of these is fixable. Let's get into the specifics.",[29,187],{},[32,189,52],{"id":190},"diagnosing-your-checkout-abandonment",[15,192,193],{},"Before writing a single line of code, you need data. Here's how to identify exactly where customers drop off.",[195,196,198],"h3",{"id":197},"set-up-checkout-funnel-tracking","Set Up Checkout Funnel Tracking",[15,200,201],{},"SuiteCommerce's standard analytics integration doesn't track granular checkout steps. You need enhanced ecommerce tracking.",[203,204,209],"pre",{"className":205,"code":206,"language":207,"meta":208,"style":208},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F Enhanced Ecommerce Checkout Step Tracking\n\u002F\u002F Add to your checkout module's router or wizard steps\n\ndefine('Stenbase.CheckoutTracking', [\n    'Backbone',\n    'underscore'\n], function (Backbone, _) {\n    'use strict';\n\n    return {\n        trackCheckoutStep: function (stepNumber, stepName, options) {\n            \u002F\u002F Google Analytics 4 checkout tracking\n            if (window.gtag) {\n                gtag('event', 'begin_checkout', {\n                    currency: SC.ENVIRONMENT.currencyCode || 'USD',\n                    value: this.getCartTotal(),\n                    items: this.getCartItems()\n                });\n\n                gtag('event', 'checkout_progress', {\n                    checkout_step: stepNumber,\n                    checkout_option: stepName\n                });\n            }\n\n            \u002F\u002F DataLayer push for GTM\n            window.dataLayer = window.dataLayer || [];\n            window.dataLayer.push({\n                event: 'checkout_step',\n                checkout_step_number: stepNumber,\n                checkout_step_name: stepName,\n                checkout_options: options || {}\n            });\n        },\n\n        getCartTotal: function () {\n            try {\n                var cart = SC.Application('Checkout').getLayout()\n                    .application.getCart();\n                return cart.get('summary').total || 0;\n            } catch (e) {\n                return 0;\n            }\n        }\n    };\n});\n","javascript","",[210,211,212,221,227,234,252,261,267,293,302,307,316,344,350,359,378,405,422,438,444,449,465,471,477,482,488,493,499,516,528,539,545,551,562,568,574,579,592,600,632,644,671,683,692,697,703,709],"code",{"__ignoreMap":208},[213,214,217],"span",{"class":215,"line":216},"line",1,[213,218,220],{"class":219},"sJ8bj","\u002F\u002F Enhanced Ecommerce Checkout Step Tracking\n",[213,222,224],{"class":215,"line":223},2,[213,225,226],{"class":219},"\u002F\u002F Add to your checkout module's router or wizard steps\n",[213,228,230],{"class":215,"line":229},3,[213,231,233],{"emptyLinePlaceholder":232},true,"\n",[213,235,237,241,245,249],{"class":215,"line":236},4,[213,238,240],{"class":239},"sScJk","define",[213,242,244],{"class":243},"sVt8B","(",[213,246,248],{"class":247},"sZZnC","'Stenbase.CheckoutTracking'",[213,250,251],{"class":243},", [\n",[213,253,255,258],{"class":215,"line":254},5,[213,256,257],{"class":247},"    'Backbone'",[213,259,260],{"class":243},",\n",[213,262,264],{"class":215,"line":263},6,[213,265,266],{"class":247},"    'underscore'\n",[213,268,270,273,277,280,284,287,290],{"class":215,"line":269},7,[213,271,272],{"class":243},"], ",[213,274,276],{"class":275},"szBVR","function",[213,278,279],{"class":243}," (",[213,281,283],{"class":282},"s4XuR","Backbone",[213,285,286],{"class":243},", ",[213,288,289],{"class":282},"_",[213,291,292],{"class":243},") {\n",[213,294,296,299],{"class":215,"line":295},8,[213,297,298],{"class":247},"    'use strict'",[213,300,301],{"class":243},";\n",[213,303,305],{"class":215,"line":304},9,[213,306,233],{"emptyLinePlaceholder":232},[213,308,310,313],{"class":215,"line":309},10,[213,311,312],{"class":275},"    return",[213,314,315],{"class":243}," {\n",[213,317,319,322,325,327,329,332,334,337,339,342],{"class":215,"line":318},11,[213,320,321],{"class":239},"        trackCheckoutStep",[213,323,324],{"class":243},": ",[213,326,276],{"class":275},[213,328,279],{"class":243},[213,330,331],{"class":282},"stepNumber",[213,333,286],{"class":243},[213,335,336],{"class":282},"stepName",[213,338,286],{"class":243},[213,340,341],{"class":282},"options",[213,343,292],{"class":243},[213,345,347],{"class":215,"line":346},12,[213,348,349],{"class":219},"            \u002F\u002F Google Analytics 4 checkout tracking\n",[213,351,353,356],{"class":215,"line":352},13,[213,354,355],{"class":275},"            if",[213,357,358],{"class":243}," (window.gtag) {\n",[213,360,362,365,367,370,372,375],{"class":215,"line":361},14,[213,363,364],{"class":239},"                gtag",[213,366,244],{"class":243},[213,368,369],{"class":247},"'event'",[213,371,286],{"class":243},[213,373,374],{"class":247},"'begin_checkout'",[213,376,377],{"class":243},", {\n",[213,379,381,384,388,391,394,397,400,403],{"class":215,"line":380},15,[213,382,383],{"class":243},"                    currency: ",[213,385,387],{"class":386},"sj4cs","SC",[213,389,390],{"class":243},".",[213,392,393],{"class":386},"ENVIRONMENT",[213,395,396],{"class":243},".currencyCode ",[213,398,399],{"class":275},"||",[213,401,402],{"class":247}," 'USD'",[213,404,260],{"class":243},[213,406,408,411,414,416,419],{"class":215,"line":407},16,[213,409,410],{"class":243},"                    value: ",[213,412,413],{"class":386},"this",[213,415,390],{"class":243},[213,417,418],{"class":239},"getCartTotal",[213,420,421],{"class":243},"(),\n",[213,423,425,428,430,432,435],{"class":215,"line":424},17,[213,426,427],{"class":243},"                    items: ",[213,429,413],{"class":386},[213,431,390],{"class":243},[213,433,434],{"class":239},"getCartItems",[213,436,437],{"class":243},"()\n",[213,439,441],{"class":215,"line":440},18,[213,442,443],{"class":243},"                });\n",[213,445,447],{"class":215,"line":446},19,[213,448,233],{"emptyLinePlaceholder":232},[213,450,452,454,456,458,460,463],{"class":215,"line":451},20,[213,453,364],{"class":239},[213,455,244],{"class":243},[213,457,369],{"class":247},[213,459,286],{"class":243},[213,461,462],{"class":247},"'checkout_progress'",[213,464,377],{"class":243},[213,466,468],{"class":215,"line":467},21,[213,469,470],{"class":243},"                    checkout_step: stepNumber,\n",[213,472,474],{"class":215,"line":473},22,[213,475,476],{"class":243},"                    checkout_option: stepName\n",[213,478,480],{"class":215,"line":479},23,[213,481,443],{"class":243},[213,483,485],{"class":215,"line":484},24,[213,486,487],{"class":243},"            }\n",[213,489,491],{"class":215,"line":490},25,[213,492,233],{"emptyLinePlaceholder":232},[213,494,496],{"class":215,"line":495},26,[213,497,498],{"class":219},"            \u002F\u002F DataLayer push for GTM\n",[213,500,502,505,508,511,513],{"class":215,"line":501},27,[213,503,504],{"class":243},"            window.dataLayer ",[213,506,507],{"class":275},"=",[213,509,510],{"class":243}," window.dataLayer ",[213,512,399],{"class":275},[213,514,515],{"class":243}," [];\n",[213,517,519,522,525],{"class":215,"line":518},28,[213,520,521],{"class":243},"            window.dataLayer.",[213,523,524],{"class":239},"push",[213,526,527],{"class":243},"({\n",[213,529,531,534,537],{"class":215,"line":530},29,[213,532,533],{"class":243},"                event: ",[213,535,536],{"class":247},"'checkout_step'",[213,538,260],{"class":243},[213,540,542],{"class":215,"line":541},30,[213,543,544],{"class":243},"                checkout_step_number: stepNumber,\n",[213,546,548],{"class":215,"line":547},31,[213,549,550],{"class":243},"                checkout_step_name: stepName,\n",[213,552,554,557,559],{"class":215,"line":553},32,[213,555,556],{"class":243},"                checkout_options: options ",[213,558,399],{"class":275},[213,560,561],{"class":243}," {}\n",[213,563,565],{"class":215,"line":564},33,[213,566,567],{"class":243},"            });\n",[213,569,571],{"class":215,"line":570},34,[213,572,573],{"class":243},"        },\n",[213,575,577],{"class":215,"line":576},35,[213,578,233],{"emptyLinePlaceholder":232},[213,580,582,585,587,589],{"class":215,"line":581},36,[213,583,584],{"class":239},"        getCartTotal",[213,586,324],{"class":243},[213,588,276],{"class":275},[213,590,591],{"class":243}," () {\n",[213,593,595,598],{"class":215,"line":594},37,[213,596,597],{"class":275},"            try",[213,599,315],{"class":243},[213,601,603,606,609,611,614,616,619,621,624,627,630],{"class":215,"line":602},38,[213,604,605],{"class":275},"                var",[213,607,608],{"class":243}," cart ",[213,610,507],{"class":275},[213,612,613],{"class":386}," SC",[213,615,390],{"class":243},[213,617,618],{"class":239},"Application",[213,620,244],{"class":243},[213,622,623],{"class":247},"'Checkout'",[213,625,626],{"class":243},").",[213,628,629],{"class":239},"getLayout",[213,631,437],{"class":243},[213,633,635,638,641],{"class":215,"line":634},39,[213,636,637],{"class":243},"                    .application.",[213,639,640],{"class":239},"getCart",[213,642,643],{"class":243},"();\n",[213,645,647,650,653,656,658,661,664,666,669],{"class":215,"line":646},40,[213,648,649],{"class":275},"                return",[213,651,652],{"class":243}," cart.",[213,654,655],{"class":239},"get",[213,657,244],{"class":243},[213,659,660],{"class":247},"'summary'",[213,662,663],{"class":243},").total ",[213,665,399],{"class":275},[213,667,668],{"class":386}," 0",[213,670,301],{"class":243},[213,672,674,677,680],{"class":215,"line":673},41,[213,675,676],{"class":243},"            } ",[213,678,679],{"class":275},"catch",[213,681,682],{"class":243}," (e) {\n",[213,684,686,688,690],{"class":215,"line":685},42,[213,687,649],{"class":275},[213,689,668],{"class":386},[213,691,301],{"class":243},[213,693,695],{"class":215,"line":694},43,[213,696,487],{"class":243},[213,698,700],{"class":215,"line":699},44,[213,701,702],{"class":243},"        }\n",[213,704,706],{"class":215,"line":705},45,[213,707,708],{"class":243},"    };\n",[213,710,712],{"class":215,"line":711},46,[213,713,714],{"class":243},"});\n",[15,716,717],{},"Map your steps:",[719,720,721,737],"table",{},[722,723,724],"thead",{},[725,726,727,731,734],"tr",{},[728,729,730],"th",{},"Step",[728,732,733],{},"Page",[728,735,736],{},"What to Measure",[738,739,740,752,763,774,785,796],"tbody",{},[725,741,742,746,749],{},[743,744,745],"td",{},"1",[743,747,748],{},"Cart page",[743,750,751],{},"Cart views vs. \"Proceed to Checkout\" clicks",[725,753,754,757,760],{},[743,755,756],{},"2",[743,758,759],{},"Login \u002F Account",[743,761,762],{},"Login completions vs. abandons",[725,764,765,768,771],{},[743,766,767],{},"3",[743,769,770],{},"Shipping address",[743,772,773],{},"Address form completions",[725,775,776,779,782],{},[743,777,778],{},"4",[743,780,781],{},"Shipping method",[743,783,784],{},"Method selections",[725,786,787,790,793],{},[743,788,789],{},"5",[743,791,792],{},"Payment",[743,794,795],{},"Payment form completions",[725,797,798,801,804],{},[743,799,800],{},"6",[743,802,803],{},"Review & Place Order",[743,805,806],{},"Final conversions",[195,808,810],{"id":809},"identify-your-biggest-drop-off","Identify Your Biggest Drop-Off",[15,812,813],{},"Most SuiteCommerce stores see the largest drop between Step 1 (Cart) and Step 2 (Login\u002FAccount). The second-largest drop is usually between Step 4 (Shipping Method) and Step 5 (Payment)—when the full cost becomes visible.",[15,815,816],{},"If your largest drop is at the login step, guest checkout is your highest-priority fix. If it's at shipping, you need earlier cost transparency. Data tells you where to invest development time.",[29,818],{},[32,820,58],{"id":821},"payment-integration-issues-and-how-to-fix-them",[15,823,824],{},"Payment is where SuiteCommerce checkout gets fragile. NetSuite's payment processing architecture adds layers between the customer's card and the authorization—each layer a potential failure point.",[195,826,828],{"id":827},"common-payment-failures","Common Payment Failures",[15,830,831,834],{},[18,832,833],{},"Tokenization timeouts."," SuiteCommerce uses CyberSource or payment gateway tokenization to secure card data. If the tokenization request takes longer than 10 seconds (common on slow connections), the checkout silently fails.",[203,836,838],{"className":205,"code":837,"language":207,"meta":208,"style":208},"\u002F\u002F Fix: Increase tokenization timeout and add retry logic\n\u002F\u002F Modify your payment method view\n\nCreditCardEditView.prototype.saveForm = _.wrap(\n    CreditCardEditView.prototype.saveForm,\n    function (originalFn, e) {\n        var self = this;\n        var maxRetries = 2;\n        var attempt = 0;\n\n        function attemptTokenization() {\n            attempt++;\n            return originalFn.call(self, e).fail(function (jqXhr) {\n                if (attempt \u003C maxRetries && jqXhr.status === 0) {\n                    \u002F\u002F Network timeout - retry\n                    console.warn(\n                        'Payment tokenization timeout, retry ' + attempt\n                    );\n                    return attemptTokenization();\n                }\n                \u002F\u002F Show user-friendly error\n                self.showError(\n                    'We had trouble processing your card. ' +\n                    'Please check your details and try again.'\n                );\n            });\n        }\n\n        return attemptTokenization();\n    }\n);\n",[210,839,840,845,850,854,878,890,907,922,936,949,953,964,974,1002,1028,1033,1043,1054,1059,1068,1073,1078,1088,1096,1101,1106,1110,1114,1118,1127,1132],{"__ignoreMap":208},[213,841,842],{"class":215,"line":216},[213,843,844],{"class":219},"\u002F\u002F Fix: Increase tokenization timeout and add retry logic\n",[213,846,847],{"class":215,"line":223},[213,848,849],{"class":219},"\u002F\u002F Modify your payment method view\n",[213,851,852],{"class":215,"line":229},[213,853,233],{"emptyLinePlaceholder":232},[213,855,856,859,861,864,867,869,872,875],{"class":215,"line":236},[213,857,858],{"class":386},"CreditCardEditView",[213,860,390],{"class":243},[213,862,863],{"class":386},"prototype",[213,865,866],{"class":243},".saveForm ",[213,868,507],{"class":275},[213,870,871],{"class":243}," _.",[213,873,874],{"class":239},"wrap",[213,876,877],{"class":243},"(\n",[213,879,880,883,885,887],{"class":215,"line":254},[213,881,882],{"class":386},"    CreditCardEditView",[213,884,390],{"class":243},[213,886,863],{"class":386},[213,888,889],{"class":243},".saveForm,\n",[213,891,892,895,897,900,902,905],{"class":215,"line":263},[213,893,894],{"class":275},"    function",[213,896,279],{"class":243},[213,898,899],{"class":282},"originalFn",[213,901,286],{"class":243},[213,903,904],{"class":282},"e",[213,906,292],{"class":243},[213,908,909,912,915,917,920],{"class":215,"line":269},[213,910,911],{"class":275},"        var",[213,913,914],{"class":243}," self ",[213,916,507],{"class":275},[213,918,919],{"class":386}," this",[213,921,301],{"class":243},[213,923,924,926,929,931,934],{"class":215,"line":295},[213,925,911],{"class":275},[213,927,928],{"class":243}," maxRetries ",[213,930,507],{"class":275},[213,932,933],{"class":386}," 2",[213,935,301],{"class":243},[213,937,938,940,943,945,947],{"class":215,"line":304},[213,939,911],{"class":275},[213,941,942],{"class":243}," attempt ",[213,944,507],{"class":275},[213,946,668],{"class":386},[213,948,301],{"class":243},[213,950,951],{"class":215,"line":309},[213,952,233],{"emptyLinePlaceholder":232},[213,954,955,958,961],{"class":215,"line":318},[213,956,957],{"class":275},"        function",[213,959,960],{"class":239}," attemptTokenization",[213,962,963],{"class":243},"() {\n",[213,965,966,969,972],{"class":215,"line":346},[213,967,968],{"class":243},"            attempt",[213,970,971],{"class":275},"++",[213,973,301],{"class":243},[213,975,976,979,982,985,988,991,993,995,997,1000],{"class":215,"line":352},[213,977,978],{"class":275},"            return",[213,980,981],{"class":243}," originalFn.",[213,983,984],{"class":239},"call",[213,986,987],{"class":243},"(self, e).",[213,989,990],{"class":239},"fail",[213,992,244],{"class":243},[213,994,276],{"class":275},[213,996,279],{"class":243},[213,998,999],{"class":282},"jqXhr",[213,1001,292],{"class":243},[213,1003,1004,1007,1010,1013,1015,1018,1021,1024,1026],{"class":215,"line":361},[213,1005,1006],{"class":275},"                if",[213,1008,1009],{"class":243}," (attempt ",[213,1011,1012],{"class":275},"\u003C",[213,1014,928],{"class":243},[213,1016,1017],{"class":275},"&&",[213,1019,1020],{"class":243}," jqXhr.status ",[213,1022,1023],{"class":275},"===",[213,1025,668],{"class":386},[213,1027,292],{"class":243},[213,1029,1030],{"class":215,"line":380},[213,1031,1032],{"class":219},"                    \u002F\u002F Network timeout - retry\n",[213,1034,1035,1038,1041],{"class":215,"line":407},[213,1036,1037],{"class":243},"                    console.",[213,1039,1040],{"class":239},"warn",[213,1042,877],{"class":243},[213,1044,1045,1048,1051],{"class":215,"line":424},[213,1046,1047],{"class":247},"                        'Payment tokenization timeout, retry '",[213,1049,1050],{"class":275}," +",[213,1052,1053],{"class":243}," attempt\n",[213,1055,1056],{"class":215,"line":440},[213,1057,1058],{"class":243},"                    );\n",[213,1060,1061,1064,1066],{"class":215,"line":446},[213,1062,1063],{"class":275},"                    return",[213,1065,960],{"class":239},[213,1067,643],{"class":243},[213,1069,1070],{"class":215,"line":451},[213,1071,1072],{"class":243},"                }\n",[213,1074,1075],{"class":215,"line":467},[213,1076,1077],{"class":219},"                \u002F\u002F Show user-friendly error\n",[213,1079,1080,1083,1086],{"class":215,"line":473},[213,1081,1082],{"class":243},"                self.",[213,1084,1085],{"class":239},"showError",[213,1087,877],{"class":243},[213,1089,1090,1093],{"class":215,"line":479},[213,1091,1092],{"class":247},"                    'We had trouble processing your card. '",[213,1094,1095],{"class":275}," +\n",[213,1097,1098],{"class":215,"line":484},[213,1099,1100],{"class":247},"                    'Please check your details and try again.'\n",[213,1102,1103],{"class":215,"line":490},[213,1104,1105],{"class":243},"                );\n",[213,1107,1108],{"class":215,"line":495},[213,1109,567],{"class":243},[213,1111,1112],{"class":215,"line":501},[213,1113,702],{"class":243},[213,1115,1116],{"class":215,"line":518},[213,1117,233],{"emptyLinePlaceholder":232},[213,1119,1120,1123,1125],{"class":215,"line":530},[213,1121,1122],{"class":275},"        return",[213,1124,960],{"class":239},[213,1126,643],{"class":243},[213,1128,1129],{"class":215,"line":541},[213,1130,1131],{"class":243},"    }\n",[213,1133,1134],{"class":215,"line":547},[213,1135,1136],{"class":243},");\n",[15,1138,1139,1142],{},[18,1140,1141],{},"3D Secure redirect failures."," When 3D Secure authentication is required, SuiteCommerce opens a redirect flow. If the return URL isn't configured correctly in NetSuite, customers complete authentication but land on an error page.",[15,1144,1145],{},"Fix this in NetSuite:",[37,1147,1148,1154,1157,1168,1178],{},[40,1149,1150,1151],{},"Navigate to ",[18,1152,1153],{},"Setup > Accounting > Payment Processing Profiles",[40,1155,1156],{},"Select your payment gateway",[40,1158,1159,1160,1163,1164,1167],{},"Under 3D Secure settings, verify the ",[18,1161,1162],{},"Return URL"," matches your SuiteCommerce domain exactly (including ",[210,1165,1166],{},"https:\u002F\u002F",")",[40,1169,1170,1171,1174,1175,1177],{},"Add both ",[210,1172,1173],{},"www"," and non-",[210,1176,1173],{}," variants",[40,1179,1180],{},"Test with a 3DS-enrolled test card",[15,1182,1183,1186],{},[18,1184,1185],{},"Gateway mismatch after SuiteCommerce update."," After updating SuiteCommerce versions, payment gateway integrations can break because API endpoints or field mappings changed. Always test payment in staging after any update.",[195,1188,1190],{"id":1189},"adding-alternative-payment-methods","Adding Alternative Payment Methods",[15,1192,1193],{},"Modern shoppers expect options. Here's how to integrate PayPal Express as a checkout shortcut:",[203,1195,1197],{"className":205,"code":1196,"language":207,"meta":208,"style":208},"\u002F\u002F PayPal Express Checkout integration for SuiteCommerce\n\u002F\u002F Extension entry point\n\ndefine('Stenbase.PayPalExpress.Module', [\n    'Stenbase.PayPalExpress.View',\n    'Stenbase.PayPalExpress.Model'\n], function (PayPalExpressView, PayPalExpressModel) {\n    'use strict';\n\n    return {\n        mountToApp: function (application) {\n            \u002F\u002F Add PayPal button to cart summary\n            var layout = application.getLayout();\n\n            layout.addChildView(\n                'PayPalExpress.Button',\n                function () {\n                    return new PayPalExpressView({\n                        application: application,\n                        model: new PayPalExpressModel()\n                    });\n                }\n            );\n\n            \u002F\u002F Register the PayPal payment method\n            var checkout = application.getComponent('Checkout');\n            if (checkout) {\n                checkout.addPaymentMethod({\n                    id: 'paypal_express',\n                    name: 'PayPal',\n                    template: 'stenbase_paypal_express_method.tpl',\n                    isExternal: true,\n                    handler: function (data) {\n                        return PayPalExpressModel\n                            .prototype\n                            .initiatePayPalFlow(data);\n                    }\n                });\n            }\n        }\n    };\n});\n",[210,1198,1199,1204,1209,1213,1224,1231,1236,1254,1260,1264,1270,1286,1291,1308,1312,1322,1329,1336,1348,1353,1366,1371,1375,1380,1384,1389,1409,1416,1426,1436,1446,1456,1466,1482,1490,1498,1508,1513,1517,1521,1525,1529],{"__ignoreMap":208},[213,1200,1201],{"class":215,"line":216},[213,1202,1203],{"class":219},"\u002F\u002F PayPal Express Checkout integration for SuiteCommerce\n",[213,1205,1206],{"class":215,"line":223},[213,1207,1208],{"class":219},"\u002F\u002F Extension entry point\n",[213,1210,1211],{"class":215,"line":229},[213,1212,233],{"emptyLinePlaceholder":232},[213,1214,1215,1217,1219,1222],{"class":215,"line":236},[213,1216,240],{"class":239},[213,1218,244],{"class":243},[213,1220,1221],{"class":247},"'Stenbase.PayPalExpress.Module'",[213,1223,251],{"class":243},[213,1225,1226,1229],{"class":215,"line":254},[213,1227,1228],{"class":247},"    'Stenbase.PayPalExpress.View'",[213,1230,260],{"class":243},[213,1232,1233],{"class":215,"line":263},[213,1234,1235],{"class":247},"    'Stenbase.PayPalExpress.Model'\n",[213,1237,1238,1240,1242,1244,1247,1249,1252],{"class":215,"line":269},[213,1239,272],{"class":243},[213,1241,276],{"class":275},[213,1243,279],{"class":243},[213,1245,1246],{"class":282},"PayPalExpressView",[213,1248,286],{"class":243},[213,1250,1251],{"class":282},"PayPalExpressModel",[213,1253,292],{"class":243},[213,1255,1256,1258],{"class":215,"line":295},[213,1257,298],{"class":247},[213,1259,301],{"class":243},[213,1261,1262],{"class":215,"line":304},[213,1263,233],{"emptyLinePlaceholder":232},[213,1265,1266,1268],{"class":215,"line":309},[213,1267,312],{"class":275},[213,1269,315],{"class":243},[213,1271,1272,1275,1277,1279,1281,1284],{"class":215,"line":318},[213,1273,1274],{"class":239},"        mountToApp",[213,1276,324],{"class":243},[213,1278,276],{"class":275},[213,1280,279],{"class":243},[213,1282,1283],{"class":282},"application",[213,1285,292],{"class":243},[213,1287,1288],{"class":215,"line":346},[213,1289,1290],{"class":219},"            \u002F\u002F Add PayPal button to cart summary\n",[213,1292,1293,1296,1299,1301,1304,1306],{"class":215,"line":352},[213,1294,1295],{"class":275},"            var",[213,1297,1298],{"class":243}," layout ",[213,1300,507],{"class":275},[213,1302,1303],{"class":243}," application.",[213,1305,629],{"class":239},[213,1307,643],{"class":243},[213,1309,1310],{"class":215,"line":361},[213,1311,233],{"emptyLinePlaceholder":232},[213,1313,1314,1317,1320],{"class":215,"line":380},[213,1315,1316],{"class":243},"            layout.",[213,1318,1319],{"class":239},"addChildView",[213,1321,877],{"class":243},[213,1323,1324,1327],{"class":215,"line":407},[213,1325,1326],{"class":247},"                'PayPalExpress.Button'",[213,1328,260],{"class":243},[213,1330,1331,1334],{"class":215,"line":424},[213,1332,1333],{"class":275},"                function",[213,1335,591],{"class":243},[213,1337,1338,1340,1343,1346],{"class":215,"line":440},[213,1339,1063],{"class":275},[213,1341,1342],{"class":275}," new",[213,1344,1345],{"class":239}," PayPalExpressView",[213,1347,527],{"class":243},[213,1349,1350],{"class":215,"line":446},[213,1351,1352],{"class":243},"                        application: application,\n",[213,1354,1355,1358,1361,1364],{"class":215,"line":451},[213,1356,1357],{"class":243},"                        model: ",[213,1359,1360],{"class":275},"new",[213,1362,1363],{"class":239}," PayPalExpressModel",[213,1365,437],{"class":243},[213,1367,1368],{"class":215,"line":467},[213,1369,1370],{"class":243},"                    });\n",[213,1372,1373],{"class":215,"line":473},[213,1374,1072],{"class":243},[213,1376,1377],{"class":215,"line":479},[213,1378,1379],{"class":243},"            );\n",[213,1381,1382],{"class":215,"line":484},[213,1383,233],{"emptyLinePlaceholder":232},[213,1385,1386],{"class":215,"line":490},[213,1387,1388],{"class":219},"            \u002F\u002F Register the PayPal payment method\n",[213,1390,1391,1393,1396,1398,1400,1403,1405,1407],{"class":215,"line":495},[213,1392,1295],{"class":275},[213,1394,1395],{"class":243}," checkout ",[213,1397,507],{"class":275},[213,1399,1303],{"class":243},[213,1401,1402],{"class":239},"getComponent",[213,1404,244],{"class":243},[213,1406,623],{"class":247},[213,1408,1136],{"class":243},[213,1410,1411,1413],{"class":215,"line":501},[213,1412,355],{"class":275},[213,1414,1415],{"class":243}," (checkout) {\n",[213,1417,1418,1421,1424],{"class":215,"line":518},[213,1419,1420],{"class":243},"                checkout.",[213,1422,1423],{"class":239},"addPaymentMethod",[213,1425,527],{"class":243},[213,1427,1428,1431,1434],{"class":215,"line":530},[213,1429,1430],{"class":243},"                    id: ",[213,1432,1433],{"class":247},"'paypal_express'",[213,1435,260],{"class":243},[213,1437,1438,1441,1444],{"class":215,"line":541},[213,1439,1440],{"class":243},"                    name: ",[213,1442,1443],{"class":247},"'PayPal'",[213,1445,260],{"class":243},[213,1447,1448,1451,1454],{"class":215,"line":547},[213,1449,1450],{"class":243},"                    template: ",[213,1452,1453],{"class":247},"'stenbase_paypal_express_method.tpl'",[213,1455,260],{"class":243},[213,1457,1458,1461,1464],{"class":215,"line":553},[213,1459,1460],{"class":243},"                    isExternal: ",[213,1462,1463],{"class":386},"true",[213,1465,260],{"class":243},[213,1467,1468,1471,1473,1475,1477,1480],{"class":215,"line":564},[213,1469,1470],{"class":239},"                    handler",[213,1472,324],{"class":243},[213,1474,276],{"class":275},[213,1476,279],{"class":243},[213,1478,1479],{"class":282},"data",[213,1481,292],{"class":243},[213,1483,1484,1487],{"class":215,"line":570},[213,1485,1486],{"class":275},"                        return",[213,1488,1489],{"class":243}," PayPalExpressModel\n",[213,1491,1492,1495],{"class":215,"line":576},[213,1493,1494],{"class":243},"                            .",[213,1496,1497],{"class":386},"prototype\n",[213,1499,1500,1502,1505],{"class":215,"line":581},[213,1501,1494],{"class":243},[213,1503,1504],{"class":239},"initiatePayPalFlow",[213,1506,1507],{"class":243},"(data);\n",[213,1509,1510],{"class":215,"line":594},[213,1511,1512],{"class":243},"                    }\n",[213,1514,1515],{"class":215,"line":602},[213,1516,443],{"class":243},[213,1518,1519],{"class":215,"line":634},[213,1520,487],{"class":243},[213,1522,1523],{"class":215,"line":646},[213,1524,702],{"class":243},[213,1526,1527],{"class":215,"line":673},[213,1528,708],{"class":243},[213,1530,1531],{"class":215,"line":685},[213,1532,714],{"class":243},[15,1534,1535],{},"The corresponding Handlebars template for the cart page:",[203,1537,1541],{"className":1538,"code":1539,"language":1540,"meta":208,"style":208},"language-handlebars shiki shiki-themes github-light github-dark","{{!-- stenbase_paypal_express_button.tpl --}}\n\u003Cdiv class=\"paypal-express-container\"\n     data-view=\"PayPalExpress.Button\">\n    \u003Cdiv class=\"paypal-express-divider\">\n        \u003Cspan>or\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cdiv id=\"paypal-button-container\"\n         data-paypal-env=\"{{paypalEnvironment}}\"\n         data-paypal-client-id=\"{{paypalClientId}}\">\n    \u003C\u002Fdiv>\n    \u003Cp class=\"paypal-express-note\">\n        Skip the form. Pay securely with PayPal.\n    \u003C\u002Fp>\n\u003C\u002Fdiv>\n","handlebars",[210,1542,1543,1548,1553,1558,1563,1568,1573,1578,1583,1588,1592,1597,1602,1607],{"__ignoreMap":208},[213,1544,1545],{"class":215,"line":216},[213,1546,1547],{},"{{!-- stenbase_paypal_express_button.tpl --}}\n",[213,1549,1550],{"class":215,"line":223},[213,1551,1552],{},"\u003Cdiv class=\"paypal-express-container\"\n",[213,1554,1555],{"class":215,"line":229},[213,1556,1557],{},"     data-view=\"PayPalExpress.Button\">\n",[213,1559,1560],{"class":215,"line":236},[213,1561,1562],{},"    \u003Cdiv class=\"paypal-express-divider\">\n",[213,1564,1565],{"class":215,"line":254},[213,1566,1567],{},"        \u003Cspan>or\u003C\u002Fspan>\n",[213,1569,1570],{"class":215,"line":263},[213,1571,1572],{},"    \u003C\u002Fdiv>\n",[213,1574,1575],{"class":215,"line":269},[213,1576,1577],{},"    \u003Cdiv id=\"paypal-button-container\"\n",[213,1579,1580],{"class":215,"line":295},[213,1581,1582],{},"         data-paypal-env=\"{{paypalEnvironment}}\"\n",[213,1584,1585],{"class":215,"line":304},[213,1586,1587],{},"         data-paypal-client-id=\"{{paypalClientId}}\">\n",[213,1589,1590],{"class":215,"line":309},[213,1591,1572],{},[213,1593,1594],{"class":215,"line":318},[213,1595,1596],{},"    \u003Cp class=\"paypal-express-note\">\n",[213,1598,1599],{"class":215,"line":346},[213,1600,1601],{},"        Skip the form. Pay securely with PayPal.\n",[213,1603,1604],{"class":215,"line":352},[213,1605,1606],{},"    \u003C\u002Fp>\n",[213,1608,1609],{"class":215,"line":361},[213,1610,1611],{},"\u003C\u002Fdiv>\n",[15,1613,1614],{},"For digital wallets like Apple Pay and Google Pay, you'll need a Payment Request API integration that works alongside SuiteCommerce's checkout model. This requires a custom SuiteScript service endpoint to create and validate payment sessions on the NetSuite side.",[29,1616],{},[32,1618,64],{"id":1619},"checkout-flow-speed-optimization",[15,1621,1622],{},"A slow checkout is an abandoned checkout. Every 100ms of latency during payment processing correlates with measurable conversion loss. Here's where SuiteCommerce checkouts get slow and how to fix each bottleneck.",[195,1624,1626],{"id":1625},"problem-1-redundant-api-calls-on-step-transitions","Problem 1: Redundant API Calls on Step Transitions",[15,1628,1629],{},"SuiteCommerce's checkout wizard makes API calls to the NetSuite backend on every step transition to validate the cart state. For a 5-step checkout, that's at least 5 round-trips—each taking 300–800ms depending on server load.",[203,1631,1633],{"className":205,"code":1632,"language":207,"meta":208,"style":208},"\u002F\u002F Optimize: Cache cart state and batch validations\n\u002F\u002F Override the checkout step validation\n\ndefine('Stenbase.CheckoutOptimizer', [\n    'OrderWizard.Module.CartSummary',\n    'underscore',\n    'jQuery'\n], function (CartSummaryModule, _, jQuery) {\n    'use strict';\n\n    var cartStateCache = {\n        data: null,\n        timestamp: 0,\n        maxAge: 30000  \u002F\u002F 30 second cache\n    };\n\n    \u002F\u002F Skip redundant cart fetches if data is fresh\n    var originalFetch = CartSummaryModule.prototype.fetch;\n    CartSummaryModule.prototype.fetch = function () {\n        var now = Date.now();\n        if (\n            cartStateCache.data &&\n            (now - cartStateCache.timestamp) \u003C cartStateCache.maxAge\n        ) {\n            var deferred = jQuery.Deferred();\n            deferred.resolve(cartStateCache.data);\n            return deferred.promise();\n        }\n\n        return originalFetch.apply(this, arguments)\n            .done(function (data) {\n                cartStateCache.data = data;\n                cartStateCache.timestamp = Date.now();\n            });\n    };\n\n    \u002F\u002F Invalidate cache when cart actually changes\n    return {\n        invalidateCache: function () {\n            cartStateCache.data = null;\n            cartStateCache.timestamp = 0;\n        }\n    };\n});\n",[210,1634,1635,1640,1645,1649,1660,1667,1674,1679,1701,1707,1711,1723,1733,1743,1754,1758,1762,1767,1786,1808,1825,1833,1841,1857,1862,1879,1890,1902,1906,1910,1932,1950,1960,1973,1977,1981,1985,1990,1996,2007,2018,2029,2033,2037],{"__ignoreMap":208},[213,1636,1637],{"class":215,"line":216},[213,1638,1639],{"class":219},"\u002F\u002F Optimize: Cache cart state and batch validations\n",[213,1641,1642],{"class":215,"line":223},[213,1643,1644],{"class":219},"\u002F\u002F Override the checkout step validation\n",[213,1646,1647],{"class":215,"line":229},[213,1648,233],{"emptyLinePlaceholder":232},[213,1650,1651,1653,1655,1658],{"class":215,"line":236},[213,1652,240],{"class":239},[213,1654,244],{"class":243},[213,1656,1657],{"class":247},"'Stenbase.CheckoutOptimizer'",[213,1659,251],{"class":243},[213,1661,1662,1665],{"class":215,"line":254},[213,1663,1664],{"class":247},"    'OrderWizard.Module.CartSummary'",[213,1666,260],{"class":243},[213,1668,1669,1672],{"class":215,"line":263},[213,1670,1671],{"class":247},"    'underscore'",[213,1673,260],{"class":243},[213,1675,1676],{"class":215,"line":269},[213,1677,1678],{"class":247},"    'jQuery'\n",[213,1680,1681,1683,1685,1687,1690,1692,1694,1696,1699],{"class":215,"line":295},[213,1682,272],{"class":243},[213,1684,276],{"class":275},[213,1686,279],{"class":243},[213,1688,1689],{"class":282},"CartSummaryModule",[213,1691,286],{"class":243},[213,1693,289],{"class":282},[213,1695,286],{"class":243},[213,1697,1698],{"class":282},"jQuery",[213,1700,292],{"class":243},[213,1702,1703,1705],{"class":215,"line":304},[213,1704,298],{"class":247},[213,1706,301],{"class":243},[213,1708,1709],{"class":215,"line":309},[213,1710,233],{"emptyLinePlaceholder":232},[213,1712,1713,1716,1719,1721],{"class":215,"line":318},[213,1714,1715],{"class":275},"    var",[213,1717,1718],{"class":243}," cartStateCache ",[213,1720,507],{"class":275},[213,1722,315],{"class":243},[213,1724,1725,1728,1731],{"class":215,"line":346},[213,1726,1727],{"class":243},"        data: ",[213,1729,1730],{"class":386},"null",[213,1732,260],{"class":243},[213,1734,1735,1738,1741],{"class":215,"line":352},[213,1736,1737],{"class":243},"        timestamp: ",[213,1739,1740],{"class":386},"0",[213,1742,260],{"class":243},[213,1744,1745,1748,1751],{"class":215,"line":361},[213,1746,1747],{"class":243},"        maxAge: ",[213,1749,1750],{"class":386},"30000",[213,1752,1753],{"class":219},"  \u002F\u002F 30 second cache\n",[213,1755,1756],{"class":215,"line":380},[213,1757,708],{"class":243},[213,1759,1760],{"class":215,"line":407},[213,1761,233],{"emptyLinePlaceholder":232},[213,1763,1764],{"class":215,"line":424},[213,1765,1766],{"class":219},"    \u002F\u002F Skip redundant cart fetches if data is fresh\n",[213,1768,1769,1771,1774,1776,1779,1781,1783],{"class":215,"line":440},[213,1770,1715],{"class":275},[213,1772,1773],{"class":243}," originalFetch ",[213,1775,507],{"class":275},[213,1777,1778],{"class":386}," CartSummaryModule",[213,1780,390],{"class":243},[213,1782,863],{"class":386},[213,1784,1785],{"class":243},".fetch;\n",[213,1787,1788,1791,1793,1795,1797,1800,1803,1806],{"class":215,"line":446},[213,1789,1790],{"class":386},"    CartSummaryModule",[213,1792,390],{"class":243},[213,1794,863],{"class":386},[213,1796,390],{"class":243},[213,1798,1799],{"class":239},"fetch",[213,1801,1802],{"class":275}," =",[213,1804,1805],{"class":275}," function",[213,1807,591],{"class":243},[213,1809,1810,1812,1815,1817,1820,1823],{"class":215,"line":451},[213,1811,911],{"class":275},[213,1813,1814],{"class":243}," now ",[213,1816,507],{"class":275},[213,1818,1819],{"class":243}," Date.",[213,1821,1822],{"class":239},"now",[213,1824,643],{"class":243},[213,1826,1827,1830],{"class":215,"line":467},[213,1828,1829],{"class":275},"        if",[213,1831,1832],{"class":243}," (\n",[213,1834,1835,1838],{"class":215,"line":473},[213,1836,1837],{"class":243},"            cartStateCache.data ",[213,1839,1840],{"class":275},"&&\n",[213,1842,1843,1846,1849,1852,1854],{"class":215,"line":479},[213,1844,1845],{"class":243},"            (now ",[213,1847,1848],{"class":275},"-",[213,1850,1851],{"class":243}," cartStateCache.timestamp) ",[213,1853,1012],{"class":275},[213,1855,1856],{"class":243}," cartStateCache.maxAge\n",[213,1858,1859],{"class":215,"line":484},[213,1860,1861],{"class":243},"        ) {\n",[213,1863,1864,1866,1869,1871,1874,1877],{"class":215,"line":490},[213,1865,1295],{"class":275},[213,1867,1868],{"class":243}," deferred ",[213,1870,507],{"class":275},[213,1872,1873],{"class":243}," jQuery.",[213,1875,1876],{"class":239},"Deferred",[213,1878,643],{"class":243},[213,1880,1881,1884,1887],{"class":215,"line":495},[213,1882,1883],{"class":243},"            deferred.",[213,1885,1886],{"class":239},"resolve",[213,1888,1889],{"class":243},"(cartStateCache.data);\n",[213,1891,1892,1894,1897,1900],{"class":215,"line":501},[213,1893,978],{"class":275},[213,1895,1896],{"class":243}," deferred.",[213,1898,1899],{"class":239},"promise",[213,1901,643],{"class":243},[213,1903,1904],{"class":215,"line":518},[213,1905,702],{"class":243},[213,1907,1908],{"class":215,"line":530},[213,1909,233],{"emptyLinePlaceholder":232},[213,1911,1912,1914,1917,1920,1922,1924,1926,1929],{"class":215,"line":541},[213,1913,1122],{"class":275},[213,1915,1916],{"class":243}," originalFetch.",[213,1918,1919],{"class":239},"apply",[213,1921,244],{"class":243},[213,1923,413],{"class":386},[213,1925,286],{"class":243},[213,1927,1928],{"class":386},"arguments",[213,1930,1931],{"class":243},")\n",[213,1933,1934,1937,1940,1942,1944,1946,1948],{"class":215,"line":547},[213,1935,1936],{"class":243},"            .",[213,1938,1939],{"class":239},"done",[213,1941,244],{"class":243},[213,1943,276],{"class":275},[213,1945,279],{"class":243},[213,1947,1479],{"class":282},[213,1949,292],{"class":243},[213,1951,1952,1955,1957],{"class":215,"line":553},[213,1953,1954],{"class":243},"                cartStateCache.data ",[213,1956,507],{"class":275},[213,1958,1959],{"class":243}," data;\n",[213,1961,1962,1965,1967,1969,1971],{"class":215,"line":564},[213,1963,1964],{"class":243},"                cartStateCache.timestamp ",[213,1966,507],{"class":275},[213,1968,1819],{"class":243},[213,1970,1822],{"class":239},[213,1972,643],{"class":243},[213,1974,1975],{"class":215,"line":570},[213,1976,567],{"class":243},[213,1978,1979],{"class":215,"line":576},[213,1980,708],{"class":243},[213,1982,1983],{"class":215,"line":581},[213,1984,233],{"emptyLinePlaceholder":232},[213,1986,1987],{"class":215,"line":594},[213,1988,1989],{"class":219},"    \u002F\u002F Invalidate cache when cart actually changes\n",[213,1991,1992,1994],{"class":215,"line":602},[213,1993,312],{"class":275},[213,1995,315],{"class":243},[213,1997,1998,2001,2003,2005],{"class":215,"line":634},[213,1999,2000],{"class":239},"        invalidateCache",[213,2002,324],{"class":243},[213,2004,276],{"class":275},[213,2006,591],{"class":243},[213,2008,2009,2011,2013,2016],{"class":215,"line":646},[213,2010,1837],{"class":243},[213,2012,507],{"class":275},[213,2014,2015],{"class":386}," null",[213,2017,301],{"class":243},[213,2019,2020,2023,2025,2027],{"class":215,"line":673},[213,2021,2022],{"class":243},"            cartStateCache.timestamp ",[213,2024,507],{"class":275},[213,2026,668],{"class":386},[213,2028,301],{"class":243},[213,2030,2031],{"class":215,"line":685},[213,2032,702],{"class":243},[213,2034,2035],{"class":215,"line":694},[213,2036,708],{"class":243},[213,2038,2039],{"class":215,"line":699},[213,2040,714],{"class":243},[195,2042,2044],{"id":2043},"problem-2-unoptimized-shipping-rate-calculations","Problem 2: Unoptimized Shipping Rate Calculations",[15,2046,2047],{},"Shipping rate lookups hit the NetSuite backend, which in turn queries your configured carriers in real time. If you have multiple shipping carriers configured, each one adds latency.",[15,2049,2050],{},[18,2051,2052],{},"Fixes:",[37,2054,2055,2061,2067],{},[40,2056,2057,2060],{},[18,2058,2059],{},"Pre-fetch shipping rates"," once the customer enters their ZIP code, before they complete the full address.",[40,2062,2063,2066],{},[18,2064,2065],{},"Limit carrier queries"," to carriers that actually serve the customer's region.",[40,2068,2069,2072],{},[18,2070,2071],{},"Cache shipping rates"," for the same destination within a session.",[203,2074,2076],{"className":205,"code":2075,"language":207,"meta":208,"style":208},"\u002F\u002F Pre-fetch shipping rates on ZIP code entry\n\u002F\u002F Attach to the address form's ZIP field blur event\n\nAddressFormView.prototype.events = _.extend(\n    AddressFormView.prototype.events || {},\n    {\n        'blur [name=\"zip\"]': 'prefetchShippingRates'\n    }\n);\n\nAddressFormView.prototype.prefetchShippingRates = function (e) {\n    var zip = jQuery(e.target).val();\n    var country = this.$('[name=\"country\"]').val();\n\n    if (zip && zip.length >= 5 && country) {\n        \u002F\u002F Fire rate lookup in background\n        var shippingModel = this.options.model || this.model;\n        shippingModel.estimateRates({\n            zip: zip,\n            country: country\n        }).done(function (rates) {\n            \u002F\u002F Cache the rates for when user advances to shipping step\n            SC._shippingRateCache = {\n                zip: zip,\n                country: country,\n                rates: rates,\n                timestamp: Date.now()\n            };\n        });\n    }\n};\n",[210,2077,2078,2083,2088,2092,2113,2129,2134,2144,2148,2152,2156,2179,2199,2226,2230,2258,2263,2284,2294,2299,2304,2322,2327,2339,2344,2349,2354,2363,2368,2373,2377],{"__ignoreMap":208},[213,2079,2080],{"class":215,"line":216},[213,2081,2082],{"class":219},"\u002F\u002F Pre-fetch shipping rates on ZIP code entry\n",[213,2084,2085],{"class":215,"line":223},[213,2086,2087],{"class":219},"\u002F\u002F Attach to the address form's ZIP field blur event\n",[213,2089,2090],{"class":215,"line":229},[213,2091,233],{"emptyLinePlaceholder":232},[213,2093,2094,2097,2099,2101,2104,2106,2108,2111],{"class":215,"line":236},[213,2095,2096],{"class":386},"AddressFormView",[213,2098,390],{"class":243},[213,2100,863],{"class":386},[213,2102,2103],{"class":243},".events ",[213,2105,507],{"class":275},[213,2107,871],{"class":243},[213,2109,2110],{"class":239},"extend",[213,2112,877],{"class":243},[213,2114,2115,2118,2120,2122,2124,2126],{"class":215,"line":254},[213,2116,2117],{"class":386},"    AddressFormView",[213,2119,390],{"class":243},[213,2121,863],{"class":386},[213,2123,2103],{"class":243},[213,2125,399],{"class":275},[213,2127,2128],{"class":243}," {},\n",[213,2130,2131],{"class":215,"line":263},[213,2132,2133],{"class":243},"    {\n",[213,2135,2136,2139,2141],{"class":215,"line":269},[213,2137,2138],{"class":247},"        'blur [name=\"zip\"]'",[213,2140,324],{"class":243},[213,2142,2143],{"class":247},"'prefetchShippingRates'\n",[213,2145,2146],{"class":215,"line":295},[213,2147,1131],{"class":243},[213,2149,2150],{"class":215,"line":304},[213,2151,1136],{"class":243},[213,2153,2154],{"class":215,"line":309},[213,2155,233],{"emptyLinePlaceholder":232},[213,2157,2158,2160,2162,2164,2166,2169,2171,2173,2175,2177],{"class":215,"line":318},[213,2159,2096],{"class":386},[213,2161,390],{"class":243},[213,2163,863],{"class":386},[213,2165,390],{"class":243},[213,2167,2168],{"class":239},"prefetchShippingRates",[213,2170,1802],{"class":275},[213,2172,1805],{"class":275},[213,2174,279],{"class":243},[213,2176,904],{"class":282},[213,2178,292],{"class":243},[213,2180,2181,2183,2186,2188,2191,2194,2197],{"class":215,"line":346},[213,2182,1715],{"class":275},[213,2184,2185],{"class":243}," zip ",[213,2187,507],{"class":275},[213,2189,2190],{"class":239}," jQuery",[213,2192,2193],{"class":243},"(e.target).",[213,2195,2196],{"class":239},"val",[213,2198,643],{"class":243},[213,2200,2201,2203,2206,2208,2210,2212,2215,2217,2220,2222,2224],{"class":215,"line":352},[213,2202,1715],{"class":275},[213,2204,2205],{"class":243}," country ",[213,2207,507],{"class":275},[213,2209,919],{"class":386},[213,2211,390],{"class":243},[213,2213,2214],{"class":239},"$",[213,2216,244],{"class":243},[213,2218,2219],{"class":247},"'[name=\"country\"]'",[213,2221,626],{"class":243},[213,2223,2196],{"class":239},[213,2225,643],{"class":243},[213,2227,2228],{"class":215,"line":361},[213,2229,233],{"emptyLinePlaceholder":232},[213,2231,2232,2235,2238,2240,2243,2246,2249,2252,2255],{"class":215,"line":380},[213,2233,2234],{"class":275},"    if",[213,2236,2237],{"class":243}," (zip ",[213,2239,1017],{"class":275},[213,2241,2242],{"class":243}," zip.",[213,2244,2245],{"class":386},"length",[213,2247,2248],{"class":275}," >=",[213,2250,2251],{"class":386}," 5",[213,2253,2254],{"class":275}," &&",[213,2256,2257],{"class":243}," country) {\n",[213,2259,2260],{"class":215,"line":407},[213,2261,2262],{"class":219},"        \u002F\u002F Fire rate lookup in background\n",[213,2264,2265,2267,2270,2272,2274,2277,2279,2281],{"class":215,"line":424},[213,2266,911],{"class":275},[213,2268,2269],{"class":243}," shippingModel ",[213,2271,507],{"class":275},[213,2273,919],{"class":386},[213,2275,2276],{"class":243},".options.model ",[213,2278,399],{"class":275},[213,2280,919],{"class":386},[213,2282,2283],{"class":243},".model;\n",[213,2285,2286,2289,2292],{"class":215,"line":440},[213,2287,2288],{"class":243},"        shippingModel.",[213,2290,2291],{"class":239},"estimateRates",[213,2293,527],{"class":243},[213,2295,2296],{"class":215,"line":446},[213,2297,2298],{"class":243},"            zip: zip,\n",[213,2300,2301],{"class":215,"line":451},[213,2302,2303],{"class":243},"            country: country\n",[213,2305,2306,2309,2311,2313,2315,2317,2320],{"class":215,"line":467},[213,2307,2308],{"class":243},"        }).",[213,2310,1939],{"class":239},[213,2312,244],{"class":243},[213,2314,276],{"class":275},[213,2316,279],{"class":243},[213,2318,2319],{"class":282},"rates",[213,2321,292],{"class":243},[213,2323,2324],{"class":215,"line":473},[213,2325,2326],{"class":219},"            \u002F\u002F Cache the rates for when user advances to shipping step\n",[213,2328,2329,2332,2335,2337],{"class":215,"line":479},[213,2330,2331],{"class":386},"            SC",[213,2333,2334],{"class":243},"._shippingRateCache ",[213,2336,507],{"class":275},[213,2338,315],{"class":243},[213,2340,2341],{"class":215,"line":484},[213,2342,2343],{"class":243},"                zip: zip,\n",[213,2345,2346],{"class":215,"line":490},[213,2347,2348],{"class":243},"                country: country,\n",[213,2350,2351],{"class":215,"line":495},[213,2352,2353],{"class":243},"                rates: rates,\n",[213,2355,2356,2359,2361],{"class":215,"line":501},[213,2357,2358],{"class":243},"                timestamp: Date.",[213,2360,1822],{"class":239},[213,2362,437],{"class":243},[213,2364,2365],{"class":215,"line":518},[213,2366,2367],{"class":243},"            };\n",[213,2369,2370],{"class":215,"line":530},[213,2371,2372],{"class":243},"        });\n",[213,2374,2375],{"class":215,"line":541},[213,2376,1131],{"class":243},[213,2378,2379],{"class":215,"line":547},[213,2380,2381],{"class":243},"};\n",[195,2383,2385],{"id":2384},"problem-3-heavy-javascript-on-checkout-pages","Problem 3: Heavy JavaScript on Checkout Pages",[15,2387,2388],{},"SuiteCommerce loads your entire application bundle on checkout pages—including modules for PLP, PDP, and other non-checkout functionality. This means customers wait for irrelevant code to parse and execute before they can interact with the checkout form.",[15,2390,2391,2394],{},[18,2392,2393],{},"Solution:"," Implement checkout-specific code splitting.",[15,2396,2397,2398,2401],{},"In your ",[210,2399,2400],{},"distro.json",", separate checkout dependencies:",[203,2403,2407],{"className":2404,"code":2405,"language":2406,"meta":208,"style":208},"language-json shiki shiki-themes github-light github-dark","{\n    \"tasksConfig\": {\n        \"javascript\": [\n            {\n                \"entryPoint\": \"js\u002Fcheckout_entry.js\",\n                \"exportFile\": \"checkout.js\",\n                \"dependencies\": [\n                    \"OrderWizard*\",\n                    \"Address*\",\n                    \"PaymentMethod*\",\n                    \"CreditCard*\",\n                    \"GlobalViews*\",\n                    \"Cart*\"\n                ]\n            }\n        ]\n    }\n}\n","json",[210,2408,2409,2414,2422,2430,2435,2447,2459,2466,2473,2480,2487,2494,2501,2506,2511,2515,2520,2524],{"__ignoreMap":208},[213,2410,2411],{"class":215,"line":216},[213,2412,2413],{"class":243},"{\n",[213,2415,2416,2419],{"class":215,"line":223},[213,2417,2418],{"class":386},"    \"tasksConfig\"",[213,2420,2421],{"class":243},": {\n",[213,2423,2424,2427],{"class":215,"line":229},[213,2425,2426],{"class":386},"        \"javascript\"",[213,2428,2429],{"class":243},": [\n",[213,2431,2432],{"class":215,"line":236},[213,2433,2434],{"class":243},"            {\n",[213,2436,2437,2440,2442,2445],{"class":215,"line":254},[213,2438,2439],{"class":386},"                \"entryPoint\"",[213,2441,324],{"class":243},[213,2443,2444],{"class":247},"\"js\u002Fcheckout_entry.js\"",[213,2446,260],{"class":243},[213,2448,2449,2452,2454,2457],{"class":215,"line":263},[213,2450,2451],{"class":386},"                \"exportFile\"",[213,2453,324],{"class":243},[213,2455,2456],{"class":247},"\"checkout.js\"",[213,2458,260],{"class":243},[213,2460,2461,2464],{"class":215,"line":269},[213,2462,2463],{"class":386},"                \"dependencies\"",[213,2465,2429],{"class":243},[213,2467,2468,2471],{"class":215,"line":295},[213,2469,2470],{"class":247},"                    \"OrderWizard*\"",[213,2472,260],{"class":243},[213,2474,2475,2478],{"class":215,"line":304},[213,2476,2477],{"class":247},"                    \"Address*\"",[213,2479,260],{"class":243},[213,2481,2482,2485],{"class":215,"line":309},[213,2483,2484],{"class":247},"                    \"PaymentMethod*\"",[213,2486,260],{"class":243},[213,2488,2489,2492],{"class":215,"line":318},[213,2490,2491],{"class":247},"                    \"CreditCard*\"",[213,2493,260],{"class":243},[213,2495,2496,2499],{"class":215,"line":346},[213,2497,2498],{"class":247},"                    \"GlobalViews*\"",[213,2500,260],{"class":243},[213,2502,2503],{"class":215,"line":352},[213,2504,2505],{"class":247},"                    \"Cart*\"\n",[213,2507,2508],{"class":215,"line":361},[213,2509,2510],{"class":243},"                ]\n",[213,2512,2513],{"class":215,"line":380},[213,2514,487],{"class":243},[213,2516,2517],{"class":215,"line":407},[213,2518,2519],{"class":243},"        ]\n",[213,2521,2522],{"class":215,"line":424},[213,2523,1131],{"class":243},[213,2525,2526],{"class":215,"line":440},[213,2527,2528],{"class":243},"}\n",[15,2530,2531],{},"This can reduce checkout page JavaScript by 30–40%, cutting Time to Interactive by 1–2 seconds.",[29,2533],{},[32,2535,70],{"id":2536},"mobile-checkout-where-most-suitecommerce-stores-fail",[15,2538,2539],{},[2540,2541],"img",{"alt":2542,"src":2543},"Cart abandonment on mobile devices","\u002Fimages\u002Fblog\u002Fsuitecommerce-checkout-abandonment.webp",[15,2545,2546],{},"Mobile commerce accounts for over 60% of e-commerce traffic. Mobile cart abandonment rates exceed 80%—significantly higher than desktop. SuiteCommerce's default checkout was designed desktop-first, and it shows on smaller screens.",[195,2548,2550],{"id":2549},"the-problems","The Problems",[15,2552,2553,2556],{},[18,2554,2555],{},"Tiny tap targets."," Default form elements and buttons don't meet the recommended 48x48px minimum tap target size. Customers mis-tap, get frustrated, leave.",[15,2558,2559,2562,2563,2566,2567,2570],{},[18,2560,2561],{},"No input type optimization."," Phone number fields render as text inputs instead of ",[210,2564,2565],{},"tel"," inputs. ZIP codes render as text instead of ",[210,2568,2569],{},"numeric",". This means customers get a full QWERTY keyboard when they should see a numeric pad.",[15,2572,2573,2576],{},[18,2574,2575],{},"Excessive scrolling."," Checkout steps that fit on one desktop screen require 3–4 scroll lengths on mobile. Customers lose context of where they are in the process.",[195,2578,2580],{"id":2579},"the-fixes","The Fixes",[203,2582,2586],{"className":2583,"code":2584,"language":2585,"meta":208,"style":208},"language-css shiki shiki-themes github-light github-dark","\u002F* Mobile checkout CSS optimizations *\u002F\n\n\u002F* Increase tap targets *\u002F\n@media screen and (max-width: 768px) {\n    .checkout-step .input-group input,\n    .checkout-step .input-group select {\n        min-height: 48px;\n        font-size: 16px; \u002F* Prevents iOS zoom on focus *\u002F\n        padding: 12px;\n    }\n\n    .checkout-step button[type=\"submit\"],\n    .checkout-step .button-primary {\n        min-height: 54px;\n        width: 100%;\n        font-size: 18px;\n        margin-top: 16px;\n    }\n\n    \u002F* Stack address fields vertically *\u002F\n    .address-form .control-group {\n        width: 100%;\n        float: none;\n    }\n\n    \u002F* Sticky order summary on mobile *\u002F\n    .order-summary-mobile {\n        position: sticky;\n        top: 0;\n        z-index: 100;\n        background: #fff;\n        border-bottom: 1px solid #e0e0e0;\n        padding: 12px;\n    }\n\n    \u002F* Collapse non-essential sections *\u002F\n    .checkout-step .order-details-collapsible {\n        max-height: 0;\n        overflow: hidden;\n        transition: max-height 0.3s ease;\n    }\n\n    .checkout-step .order-details-collapsible.expanded {\n        max-height: 500px;\n    }\n}\n","css",[210,2587,2588,2593,2597,2602,2628,2642,2653,2667,2685,2699,2703,2707,2728,2737,2750,2765,2778,2791,2795,2799,2804,2814,2826,2838,2842,2846,2851,2858,2870,2881,2892,2904,2923,2935,2939,2943,2948,2957,2968,2980,2999,3003,3007,3016,3029,3033],{"__ignoreMap":208},[213,2589,2590],{"class":215,"line":216},[213,2591,2592],{"class":219},"\u002F* Mobile checkout CSS optimizations *\u002F\n",[213,2594,2595],{"class":215,"line":223},[213,2596,233],{"emptyLinePlaceholder":232},[213,2598,2599],{"class":215,"line":229},[213,2600,2601],{"class":219},"\u002F* Increase tap targets *\u002F\n",[213,2603,2604,2607,2610,2613,2615,2618,2620,2623,2626],{"class":215,"line":236},[213,2605,2606],{"class":275},"@media",[213,2608,2609],{"class":386}," screen",[213,2611,2612],{"class":275}," and",[213,2614,279],{"class":243},[213,2616,2617],{"class":386},"max-width",[213,2619,324],{"class":243},[213,2621,2622],{"class":386},"768",[213,2624,2625],{"class":275},"px",[213,2627,292],{"class":243},[213,2629,2630,2633,2636,2640],{"class":215,"line":254},[213,2631,2632],{"class":239},"    .checkout-step",[213,2634,2635],{"class":239}," .input-group",[213,2637,2639],{"class":2638},"s9eBZ"," input",[213,2641,260],{"class":243},[213,2643,2644,2646,2648,2651],{"class":215,"line":263},[213,2645,2632],{"class":239},[213,2647,2635],{"class":239},[213,2649,2650],{"class":2638}," select",[213,2652,315],{"class":243},[213,2654,2655,2658,2660,2663,2665],{"class":215,"line":269},[213,2656,2657],{"class":386},"        min-height",[213,2659,324],{"class":243},[213,2661,2662],{"class":386},"48",[213,2664,2625],{"class":275},[213,2666,301],{"class":243},[213,2668,2669,2672,2674,2677,2679,2682],{"class":215,"line":295},[213,2670,2671],{"class":386},"        font-size",[213,2673,324],{"class":243},[213,2675,2676],{"class":386},"16",[213,2678,2625],{"class":275},[213,2680,2681],{"class":243},"; ",[213,2683,2684],{"class":219},"\u002F* Prevents iOS zoom on focus *\u002F\n",[213,2686,2687,2690,2692,2695,2697],{"class":215,"line":304},[213,2688,2689],{"class":386},"        padding",[213,2691,324],{"class":243},[213,2693,2694],{"class":386},"12",[213,2696,2625],{"class":275},[213,2698,301],{"class":243},[213,2700,2701],{"class":215,"line":309},[213,2702,1131],{"class":243},[213,2704,2705],{"class":215,"line":318},[213,2706,233],{"emptyLinePlaceholder":232},[213,2708,2709,2711,2714,2717,2720,2722,2725],{"class":215,"line":346},[213,2710,2632],{"class":239},[213,2712,2713],{"class":2638}," button",[213,2715,2716],{"class":243},"[",[213,2718,2719],{"class":239},"type",[213,2721,507],{"class":275},[213,2723,2724],{"class":247},"\"submit\"",[213,2726,2727],{"class":243},"],\n",[213,2729,2730,2732,2735],{"class":215,"line":352},[213,2731,2632],{"class":239},[213,2733,2734],{"class":239}," .button-primary",[213,2736,315],{"class":243},[213,2738,2739,2741,2743,2746,2748],{"class":215,"line":361},[213,2740,2657],{"class":386},[213,2742,324],{"class":243},[213,2744,2745],{"class":386},"54",[213,2747,2625],{"class":275},[213,2749,301],{"class":243},[213,2751,2752,2755,2757,2760,2763],{"class":215,"line":380},[213,2753,2754],{"class":386},"        width",[213,2756,324],{"class":243},[213,2758,2759],{"class":386},"100",[213,2761,2762],{"class":275},"%",[213,2764,301],{"class":243},[213,2766,2767,2769,2771,2774,2776],{"class":215,"line":407},[213,2768,2671],{"class":386},[213,2770,324],{"class":243},[213,2772,2773],{"class":386},"18",[213,2775,2625],{"class":275},[213,2777,301],{"class":243},[213,2779,2780,2783,2785,2787,2789],{"class":215,"line":424},[213,2781,2782],{"class":386},"        margin-top",[213,2784,324],{"class":243},[213,2786,2676],{"class":386},[213,2788,2625],{"class":275},[213,2790,301],{"class":243},[213,2792,2793],{"class":215,"line":440},[213,2794,1131],{"class":243},[213,2796,2797],{"class":215,"line":446},[213,2798,233],{"emptyLinePlaceholder":232},[213,2800,2801],{"class":215,"line":451},[213,2802,2803],{"class":219},"    \u002F* Stack address fields vertically *\u002F\n",[213,2805,2806,2809,2812],{"class":215,"line":467},[213,2807,2808],{"class":239},"    .address-form",[213,2810,2811],{"class":239}," .control-group",[213,2813,315],{"class":243},[213,2815,2816,2818,2820,2822,2824],{"class":215,"line":473},[213,2817,2754],{"class":386},[213,2819,324],{"class":243},[213,2821,2759],{"class":386},[213,2823,2762],{"class":275},[213,2825,301],{"class":243},[213,2827,2828,2831,2833,2836],{"class":215,"line":479},[213,2829,2830],{"class":386},"        float",[213,2832,324],{"class":243},[213,2834,2835],{"class":386},"none",[213,2837,301],{"class":243},[213,2839,2840],{"class":215,"line":484},[213,2841,1131],{"class":243},[213,2843,2844],{"class":215,"line":490},[213,2845,233],{"emptyLinePlaceholder":232},[213,2847,2848],{"class":215,"line":495},[213,2849,2850],{"class":219},"    \u002F* Sticky order summary on mobile *\u002F\n",[213,2852,2853,2856],{"class":215,"line":501},[213,2854,2855],{"class":239},"    .order-summary-mobile",[213,2857,315],{"class":243},[213,2859,2860,2863,2865,2868],{"class":215,"line":518},[213,2861,2862],{"class":386},"        position",[213,2864,324],{"class":243},[213,2866,2867],{"class":386},"sticky",[213,2869,301],{"class":243},[213,2871,2872,2875,2877,2879],{"class":215,"line":530},[213,2873,2874],{"class":386},"        top",[213,2876,324],{"class":243},[213,2878,1740],{"class":386},[213,2880,301],{"class":243},[213,2882,2883,2886,2888,2890],{"class":215,"line":541},[213,2884,2885],{"class":386},"        z-index",[213,2887,324],{"class":243},[213,2889,2759],{"class":386},[213,2891,301],{"class":243},[213,2893,2894,2897,2899,2902],{"class":215,"line":547},[213,2895,2896],{"class":386},"        background",[213,2898,324],{"class":243},[213,2900,2901],{"class":386},"#fff",[213,2903,301],{"class":243},[213,2905,2906,2909,2911,2913,2915,2918,2921],{"class":215,"line":553},[213,2907,2908],{"class":386},"        border-bottom",[213,2910,324],{"class":243},[213,2912,745],{"class":386},[213,2914,2625],{"class":275},[213,2916,2917],{"class":386}," solid",[213,2919,2920],{"class":386}," #e0e0e0",[213,2922,301],{"class":243},[213,2924,2925,2927,2929,2931,2933],{"class":215,"line":564},[213,2926,2689],{"class":386},[213,2928,324],{"class":243},[213,2930,2694],{"class":386},[213,2932,2625],{"class":275},[213,2934,301],{"class":243},[213,2936,2937],{"class":215,"line":570},[213,2938,1131],{"class":243},[213,2940,2941],{"class":215,"line":576},[213,2942,233],{"emptyLinePlaceholder":232},[213,2944,2945],{"class":215,"line":581},[213,2946,2947],{"class":219},"    \u002F* Collapse non-essential sections *\u002F\n",[213,2949,2950,2952,2955],{"class":215,"line":594},[213,2951,2632],{"class":239},[213,2953,2954],{"class":239}," .order-details-collapsible",[213,2956,315],{"class":243},[213,2958,2959,2962,2964,2966],{"class":215,"line":602},[213,2960,2961],{"class":386},"        max-height",[213,2963,324],{"class":243},[213,2965,1740],{"class":386},[213,2967,301],{"class":243},[213,2969,2970,2973,2975,2978],{"class":215,"line":634},[213,2971,2972],{"class":386},"        overflow",[213,2974,324],{"class":243},[213,2976,2977],{"class":386},"hidden",[213,2979,301],{"class":243},[213,2981,2982,2985,2988,2991,2994,2997],{"class":215,"line":646},[213,2983,2984],{"class":386},"        transition",[213,2986,2987],{"class":243},": max-height ",[213,2989,2990],{"class":386},"0.3",[213,2992,2993],{"class":275},"s",[213,2995,2996],{"class":386}," ease",[213,2998,301],{"class":243},[213,3000,3001],{"class":215,"line":673},[213,3002,1131],{"class":243},[213,3004,3005],{"class":215,"line":685},[213,3006,233],{"emptyLinePlaceholder":232},[213,3008,3009,3011,3014],{"class":215,"line":694},[213,3010,2632],{"class":239},[213,3012,3013],{"class":239}," .order-details-collapsible.expanded",[213,3015,315],{"class":243},[213,3017,3018,3020,3022,3025,3027],{"class":215,"line":699},[213,3019,2961],{"class":386},[213,3021,324],{"class":243},[213,3023,3024],{"class":386},"500",[213,3026,2625],{"class":275},[213,3028,301],{"class":243},[213,3030,3031],{"class":215,"line":705},[213,3032,1131],{"class":243},[213,3034,3035],{"class":215,"line":711},[213,3036,2528],{"class":243},[15,3038,3039],{},"Fix input types in your address templates:",[203,3041,3043],{"className":1538,"code":3042,"language":1540,"meta":208,"style":208},"{{!-- Optimized address form inputs for mobile --}}\n\u003Cdiv class=\"address-form-group\">\n    \u003Clabel for=\"phone\">{{translate 'Phone'}}\u003C\u002Flabel>\n    \u003Cinput type=\"tel\"\n           id=\"phone\"\n           name=\"phone\"\n           autocomplete=\"tel\"\n           inputmode=\"tel\"\n           pattern=\"[0-9\\-\\+\\(\\) ]*\"\n           value=\"{{phone}}\" \u002F>\n\u003C\u002Fdiv>\n\n\u003Cdiv class=\"address-form-group\">\n    \u003Clabel for=\"zip\">{{translate 'ZIP Code'}}\u003C\u002Flabel>\n    \u003Cinput type=\"text\"\n           id=\"zip\"\n           name=\"zip\"\n           autocomplete=\"postal-code\"\n           inputmode=\"numeric\"\n           pattern=\"[0-9]*\"\n           value=\"{{zip}}\" \u002F>\n\u003C\u002Fdiv>\n",[210,3044,3045,3050,3055,3060,3065,3070,3075,3080,3085,3090,3095,3099,3103,3107,3112,3117,3122,3127,3132,3137,3142,3147],{"__ignoreMap":208},[213,3046,3047],{"class":215,"line":216},[213,3048,3049],{},"{{!-- Optimized address form inputs for mobile --}}\n",[213,3051,3052],{"class":215,"line":223},[213,3053,3054],{},"\u003Cdiv class=\"address-form-group\">\n",[213,3056,3057],{"class":215,"line":229},[213,3058,3059],{},"    \u003Clabel for=\"phone\">{{translate 'Phone'}}\u003C\u002Flabel>\n",[213,3061,3062],{"class":215,"line":236},[213,3063,3064],{},"    \u003Cinput type=\"tel\"\n",[213,3066,3067],{"class":215,"line":254},[213,3068,3069],{},"           id=\"phone\"\n",[213,3071,3072],{"class":215,"line":263},[213,3073,3074],{},"           name=\"phone\"\n",[213,3076,3077],{"class":215,"line":269},[213,3078,3079],{},"           autocomplete=\"tel\"\n",[213,3081,3082],{"class":215,"line":295},[213,3083,3084],{},"           inputmode=\"tel\"\n",[213,3086,3087],{"class":215,"line":304},[213,3088,3089],{},"           pattern=\"[0-9\\-\\+\\(\\) ]*\"\n",[213,3091,3092],{"class":215,"line":309},[213,3093,3094],{},"           value=\"{{phone}}\" \u002F>\n",[213,3096,3097],{"class":215,"line":318},[213,3098,1611],{},[213,3100,3101],{"class":215,"line":346},[213,3102,233],{"emptyLinePlaceholder":232},[213,3104,3105],{"class":215,"line":352},[213,3106,3054],{},[213,3108,3109],{"class":215,"line":361},[213,3110,3111],{},"    \u003Clabel for=\"zip\">{{translate 'ZIP Code'}}\u003C\u002Flabel>\n",[213,3113,3114],{"class":215,"line":380},[213,3115,3116],{},"    \u003Cinput type=\"text\"\n",[213,3118,3119],{"class":215,"line":407},[213,3120,3121],{},"           id=\"zip\"\n",[213,3123,3124],{"class":215,"line":424},[213,3125,3126],{},"           name=\"zip\"\n",[213,3128,3129],{"class":215,"line":440},[213,3130,3131],{},"           autocomplete=\"postal-code\"\n",[213,3133,3134],{"class":215,"line":446},[213,3135,3136],{},"           inputmode=\"numeric\"\n",[213,3138,3139],{"class":215,"line":451},[213,3140,3141],{},"           pattern=\"[0-9]*\"\n",[213,3143,3144],{"class":215,"line":467},[213,3145,3146],{},"           value=\"{{zip}}\" \u002F>\n",[213,3148,3149],{"class":215,"line":473},[213,3150,1611],{},[195,3152,3154],{"id":3153},"implement-a-mobile-progress-indicator","Implement a Mobile Progress Indicator",[15,3156,3157],{},"Mobile users need to know where they stand. Replace the default step indicators with a compact progress bar:",[203,3159,3161],{"className":205,"code":3160,"language":207,"meta":208,"style":208},"\u002F\u002F Mobile checkout progress indicator\ndefine('Stenbase.MobileProgress.View', [\n    'Marionette',\n    'stenbase_mobile_progress.tpl'\n], function (Marionette, template) {\n    'use strict';\n\n    return Marionette.ItemView.extend({\n        template: template,\n\n        getContext: function () {\n            var steps = this.options.wizard.steps;\n            var currentIndex = this.options.wizard.currentStep || 0;\n\n            return {\n                steps: steps.map(function (step, index) {\n                    return {\n                        name: step.getName(),\n                        isComplete: index \u003C currentIndex,\n                        isCurrent: index === currentIndex,\n                        stepNumber: index + 1\n                    };\n                }),\n                totalSteps: steps.length,\n                currentStep: currentIndex + 1,\n                progressPercent: Math.round(\n                    ((currentIndex + 1) \u002F steps.length) * 100\n                )\n            };\n        }\n    });\n});\n",[210,3162,3163,3168,3179,3186,3191,3209,3215,3219,3230,3235,3239,3250,3264,3284,3288,3294,3318,3324,3334,3344,3353,3364,3369,3374,3383,3395,3405,3433,3438,3442,3446,3451],{"__ignoreMap":208},[213,3164,3165],{"class":215,"line":216},[213,3166,3167],{"class":219},"\u002F\u002F Mobile checkout progress indicator\n",[213,3169,3170,3172,3174,3177],{"class":215,"line":223},[213,3171,240],{"class":239},[213,3173,244],{"class":243},[213,3175,3176],{"class":247},"'Stenbase.MobileProgress.View'",[213,3178,251],{"class":243},[213,3180,3181,3184],{"class":215,"line":229},[213,3182,3183],{"class":247},"    'Marionette'",[213,3185,260],{"class":243},[213,3187,3188],{"class":215,"line":236},[213,3189,3190],{"class":247},"    'stenbase_mobile_progress.tpl'\n",[213,3192,3193,3195,3197,3199,3202,3204,3207],{"class":215,"line":254},[213,3194,272],{"class":243},[213,3196,276],{"class":275},[213,3198,279],{"class":243},[213,3200,3201],{"class":282},"Marionette",[213,3203,286],{"class":243},[213,3205,3206],{"class":282},"template",[213,3208,292],{"class":243},[213,3210,3211,3213],{"class":215,"line":263},[213,3212,298],{"class":247},[213,3214,301],{"class":243},[213,3216,3217],{"class":215,"line":269},[213,3218,233],{"emptyLinePlaceholder":232},[213,3220,3221,3223,3226,3228],{"class":215,"line":295},[213,3222,312],{"class":275},[213,3224,3225],{"class":243}," Marionette.ItemView.",[213,3227,2110],{"class":239},[213,3229,527],{"class":243},[213,3231,3232],{"class":215,"line":304},[213,3233,3234],{"class":243},"        template: template,\n",[213,3236,3237],{"class":215,"line":309},[213,3238,233],{"emptyLinePlaceholder":232},[213,3240,3241,3244,3246,3248],{"class":215,"line":318},[213,3242,3243],{"class":239},"        getContext",[213,3245,324],{"class":243},[213,3247,276],{"class":275},[213,3249,591],{"class":243},[213,3251,3252,3254,3257,3259,3261],{"class":215,"line":346},[213,3253,1295],{"class":275},[213,3255,3256],{"class":243}," steps ",[213,3258,507],{"class":275},[213,3260,919],{"class":386},[213,3262,3263],{"class":243},".options.wizard.steps;\n",[213,3265,3266,3268,3271,3273,3275,3278,3280,3282],{"class":215,"line":352},[213,3267,1295],{"class":275},[213,3269,3270],{"class":243}," currentIndex ",[213,3272,507],{"class":275},[213,3274,919],{"class":386},[213,3276,3277],{"class":243},".options.wizard.currentStep ",[213,3279,399],{"class":275},[213,3281,668],{"class":386},[213,3283,301],{"class":243},[213,3285,3286],{"class":215,"line":361},[213,3287,233],{"emptyLinePlaceholder":232},[213,3289,3290,3292],{"class":215,"line":380},[213,3291,978],{"class":275},[213,3293,315],{"class":243},[213,3295,3296,3299,3302,3304,3306,3308,3311,3313,3316],{"class":215,"line":407},[213,3297,3298],{"class":243},"                steps: steps.",[213,3300,3301],{"class":239},"map",[213,3303,244],{"class":243},[213,3305,276],{"class":275},[213,3307,279],{"class":243},[213,3309,3310],{"class":282},"step",[213,3312,286],{"class":243},[213,3314,3315],{"class":282},"index",[213,3317,292],{"class":243},[213,3319,3320,3322],{"class":215,"line":424},[213,3321,1063],{"class":275},[213,3323,315],{"class":243},[213,3325,3326,3329,3332],{"class":215,"line":440},[213,3327,3328],{"class":243},"                        name: step.",[213,3330,3331],{"class":239},"getName",[213,3333,421],{"class":243},[213,3335,3336,3339,3341],{"class":215,"line":446},[213,3337,3338],{"class":243},"                        isComplete: index ",[213,3340,1012],{"class":275},[213,3342,3343],{"class":243}," currentIndex,\n",[213,3345,3346,3349,3351],{"class":215,"line":451},[213,3347,3348],{"class":243},"                        isCurrent: index ",[213,3350,1023],{"class":275},[213,3352,3343],{"class":243},[213,3354,3355,3358,3361],{"class":215,"line":467},[213,3356,3357],{"class":243},"                        stepNumber: index ",[213,3359,3360],{"class":275},"+",[213,3362,3363],{"class":386}," 1\n",[213,3365,3366],{"class":215,"line":473},[213,3367,3368],{"class":243},"                    };\n",[213,3370,3371],{"class":215,"line":479},[213,3372,3373],{"class":243},"                }),\n",[213,3375,3376,3379,3381],{"class":215,"line":484},[213,3377,3378],{"class":243},"                totalSteps: steps.",[213,3380,2245],{"class":386},[213,3382,260],{"class":243},[213,3384,3385,3388,3390,3393],{"class":215,"line":490},[213,3386,3387],{"class":243},"                currentStep: currentIndex ",[213,3389,3360],{"class":275},[213,3391,3392],{"class":386}," 1",[213,3394,260],{"class":243},[213,3396,3397,3400,3403],{"class":215,"line":495},[213,3398,3399],{"class":243},"                progressPercent: Math.",[213,3401,3402],{"class":239},"round",[213,3404,877],{"class":243},[213,3406,3407,3410,3412,3414,3417,3420,3423,3425,3427,3430],{"class":215,"line":501},[213,3408,3409],{"class":243},"                    ((currentIndex ",[213,3411,3360],{"class":275},[213,3413,3392],{"class":386},[213,3415,3416],{"class":243},") ",[213,3418,3419],{"class":275},"\u002F",[213,3421,3422],{"class":243}," steps.",[213,3424,2245],{"class":386},[213,3426,3416],{"class":243},[213,3428,3429],{"class":275},"*",[213,3431,3432],{"class":386}," 100\n",[213,3434,3435],{"class":215,"line":518},[213,3436,3437],{"class":243},"                )\n",[213,3439,3440],{"class":215,"line":530},[213,3441,2367],{"class":243},[213,3443,3444],{"class":215,"line":541},[213,3445,702],{"class":243},[213,3447,3448],{"class":215,"line":547},[213,3449,3450],{"class":243},"    });\n",[213,3452,3453],{"class":215,"line":553},[213,3454,714],{"class":243},[29,3456],{},[32,3458,76],{"id":3459},"implementing-guest-checkout-properly",[15,3461,3462],{},"19% of shoppers abandon when forced to create an account. Guest checkout isn't optional—it's a conversion requirement. But SuiteCommerce's architecture makes this tricky because the platform is built around NetSuite customer records.",[195,3464,3466],{"id":3465},"how-suitecommerce-guest-checkout-works","How SuiteCommerce Guest Checkout Works",[15,3468,3469],{},"When a guest checks out, SuiteCommerce still creates a NetSuite customer record behind the scenes. The difference is that the shopper doesn't need to set a password or go through a registration flow. The record is created with a \"Web Customer\" role and a system-generated password.",[195,3471,3473],{"id":3472},"enabling-guest-checkout","Enabling Guest Checkout",[15,3475,3476],{},"In NetSuite:",[37,3478,3479,3484,3494,3501],{},[40,3480,1150,3481],{},[18,3482,3483],{},"Setup > SuiteCommerce Advanced > Configuration",[40,3485,3486,3487,3490,3491],{},"Under the ",[18,3488,3489],{},"Checkout"," tab, enable ",[18,3492,3493],{},"Allow Guest Checkout",[40,3495,3496,3497,3500],{},"Set the ",[18,3498,3499],{},"Default Customer Form"," for guest orders",[40,3502,3503,3504,3507],{},"Configure a ",[18,3505,3506],{},"Web Customer Role"," with appropriate permissions",[15,3509,3510],{},"On the SuiteCommerce side, modify the checkout login step to present guest checkout prominently:",[203,3512,3514],{"className":205,"code":3513,"language":207,"meta":208,"style":208},"\u002F\u002F Prioritize guest checkout in the login step\ndefine('Stenbase.GuestCheckout.LoginView', [\n    'LoginRegister.View',\n    'stenbase_guest_checkout_login.tpl',\n    'jQuery'\n], function (LoginRegisterView, template, jQuery) {\n    'use strict';\n\n    return LoginRegisterView.extend({\n        template: template,\n\n        events: _.extend(LoginRegisterView.prototype.events, {\n            'click [data-action=\"guest-checkout\"]': 'proceedAsGuest'\n        }),\n\n        proceedAsGuest: function (e) {\n            e.preventDefault();\n\n            \u002F\u002F Set guest checkout flag\n            this.model.set('skipLogin', true);\n\n            \u002F\u002F Track the choice\n            if (window.dataLayer) {\n                window.dataLayer.push({\n                    event: 'checkout_option',\n                    checkout_option: 'guest'\n                });\n            }\n\n            \u002F\u002F Advance to address step\n            this.wizard.goToNextStep();\n        },\n\n        getContext: function () {\n            var context = LoginRegisterView\n                .prototype.getContext.apply(this, arguments);\n\n            \u002F\u002F Add guest checkout data\n            context.showGuestCheckout = true;\n            context.guestCheckoutLabel = 'Continue as Guest';\n\n            return context;\n        }\n    });\n});\n",[210,3515,3516,3521,3532,3539,3546,3550,3571,3577,3581,3592,3596,3600,3618,3628,3633,3637,3652,3662,3666,3671,3693,3697,3702,3709,3718,3728,3736,3740,3744,3748,3753,3765,3769,3773,3783,3795,3817,3821,3826,3838,3850,3854,3861,3865,3869],{"__ignoreMap":208},[213,3517,3518],{"class":215,"line":216},[213,3519,3520],{"class":219},"\u002F\u002F Prioritize guest checkout in the login step\n",[213,3522,3523,3525,3527,3530],{"class":215,"line":223},[213,3524,240],{"class":239},[213,3526,244],{"class":243},[213,3528,3529],{"class":247},"'Stenbase.GuestCheckout.LoginView'",[213,3531,251],{"class":243},[213,3533,3534,3537],{"class":215,"line":229},[213,3535,3536],{"class":247},"    'LoginRegister.View'",[213,3538,260],{"class":243},[213,3540,3541,3544],{"class":215,"line":236},[213,3542,3543],{"class":247},"    'stenbase_guest_checkout_login.tpl'",[213,3545,260],{"class":243},[213,3547,3548],{"class":215,"line":254},[213,3549,1678],{"class":247},[213,3551,3552,3554,3556,3558,3561,3563,3565,3567,3569],{"class":215,"line":263},[213,3553,272],{"class":243},[213,3555,276],{"class":275},[213,3557,279],{"class":243},[213,3559,3560],{"class":282},"LoginRegisterView",[213,3562,286],{"class":243},[213,3564,3206],{"class":282},[213,3566,286],{"class":243},[213,3568,1698],{"class":282},[213,3570,292],{"class":243},[213,3572,3573,3575],{"class":215,"line":269},[213,3574,298],{"class":247},[213,3576,301],{"class":243},[213,3578,3579],{"class":215,"line":295},[213,3580,233],{"emptyLinePlaceholder":232},[213,3582,3583,3585,3588,3590],{"class":215,"line":304},[213,3584,312],{"class":275},[213,3586,3587],{"class":243}," LoginRegisterView.",[213,3589,2110],{"class":239},[213,3591,527],{"class":243},[213,3593,3594],{"class":215,"line":309},[213,3595,3234],{"class":243},[213,3597,3598],{"class":215,"line":318},[213,3599,233],{"emptyLinePlaceholder":232},[213,3601,3602,3605,3607,3609,3611,3613,3615],{"class":215,"line":346},[213,3603,3604],{"class":243},"        events: _.",[213,3606,2110],{"class":239},[213,3608,244],{"class":243},[213,3610,3560],{"class":386},[213,3612,390],{"class":243},[213,3614,863],{"class":386},[213,3616,3617],{"class":243},".events, {\n",[213,3619,3620,3623,3625],{"class":215,"line":352},[213,3621,3622],{"class":247},"            'click [data-action=\"guest-checkout\"]'",[213,3624,324],{"class":243},[213,3626,3627],{"class":247},"'proceedAsGuest'\n",[213,3629,3630],{"class":215,"line":361},[213,3631,3632],{"class":243},"        }),\n",[213,3634,3635],{"class":215,"line":380},[213,3636,233],{"emptyLinePlaceholder":232},[213,3638,3639,3642,3644,3646,3648,3650],{"class":215,"line":407},[213,3640,3641],{"class":239},"        proceedAsGuest",[213,3643,324],{"class":243},[213,3645,276],{"class":275},[213,3647,279],{"class":243},[213,3649,904],{"class":282},[213,3651,292],{"class":243},[213,3653,3654,3657,3660],{"class":215,"line":424},[213,3655,3656],{"class":243},"            e.",[213,3658,3659],{"class":239},"preventDefault",[213,3661,643],{"class":243},[213,3663,3664],{"class":215,"line":440},[213,3665,233],{"emptyLinePlaceholder":232},[213,3667,3668],{"class":215,"line":446},[213,3669,3670],{"class":219},"            \u002F\u002F Set guest checkout flag\n",[213,3672,3673,3676,3679,3682,3684,3687,3689,3691],{"class":215,"line":451},[213,3674,3675],{"class":386},"            this",[213,3677,3678],{"class":243},".model.",[213,3680,3681],{"class":239},"set",[213,3683,244],{"class":243},[213,3685,3686],{"class":247},"'skipLogin'",[213,3688,286],{"class":243},[213,3690,1463],{"class":386},[213,3692,1136],{"class":243},[213,3694,3695],{"class":215,"line":467},[213,3696,233],{"emptyLinePlaceholder":232},[213,3698,3699],{"class":215,"line":473},[213,3700,3701],{"class":219},"            \u002F\u002F Track the choice\n",[213,3703,3704,3706],{"class":215,"line":479},[213,3705,355],{"class":275},[213,3707,3708],{"class":243}," (window.dataLayer) {\n",[213,3710,3711,3714,3716],{"class":215,"line":484},[213,3712,3713],{"class":243},"                window.dataLayer.",[213,3715,524],{"class":239},[213,3717,527],{"class":243},[213,3719,3720,3723,3726],{"class":215,"line":490},[213,3721,3722],{"class":243},"                    event: ",[213,3724,3725],{"class":247},"'checkout_option'",[213,3727,260],{"class":243},[213,3729,3730,3733],{"class":215,"line":495},[213,3731,3732],{"class":243},"                    checkout_option: ",[213,3734,3735],{"class":247},"'guest'\n",[213,3737,3738],{"class":215,"line":501},[213,3739,443],{"class":243},[213,3741,3742],{"class":215,"line":518},[213,3743,487],{"class":243},[213,3745,3746],{"class":215,"line":530},[213,3747,233],{"emptyLinePlaceholder":232},[213,3749,3750],{"class":215,"line":541},[213,3751,3752],{"class":219},"            \u002F\u002F Advance to address step\n",[213,3754,3755,3757,3760,3763],{"class":215,"line":547},[213,3756,3675],{"class":386},[213,3758,3759],{"class":243},".wizard.",[213,3761,3762],{"class":239},"goToNextStep",[213,3764,643],{"class":243},[213,3766,3767],{"class":215,"line":553},[213,3768,573],{"class":243},[213,3770,3771],{"class":215,"line":564},[213,3772,233],{"emptyLinePlaceholder":232},[213,3774,3775,3777,3779,3781],{"class":215,"line":570},[213,3776,3243],{"class":239},[213,3778,324],{"class":243},[213,3780,276],{"class":275},[213,3782,591],{"class":243},[213,3784,3785,3787,3790,3792],{"class":215,"line":576},[213,3786,1295],{"class":275},[213,3788,3789],{"class":243}," context ",[213,3791,507],{"class":275},[213,3793,3794],{"class":243}," LoginRegisterView\n",[213,3796,3797,3800,3802,3805,3807,3809,3811,3813,3815],{"class":215,"line":581},[213,3798,3799],{"class":243},"                .",[213,3801,863],{"class":386},[213,3803,3804],{"class":243},".getContext.",[213,3806,1919],{"class":239},[213,3808,244],{"class":243},[213,3810,413],{"class":386},[213,3812,286],{"class":243},[213,3814,1928],{"class":386},[213,3816,1136],{"class":243},[213,3818,3819],{"class":215,"line":594},[213,3820,233],{"emptyLinePlaceholder":232},[213,3822,3823],{"class":215,"line":602},[213,3824,3825],{"class":219},"            \u002F\u002F Add guest checkout data\n",[213,3827,3828,3831,3833,3836],{"class":215,"line":634},[213,3829,3830],{"class":243},"            context.showGuestCheckout ",[213,3832,507],{"class":275},[213,3834,3835],{"class":386}," true",[213,3837,301],{"class":243},[213,3839,3840,3843,3845,3848],{"class":215,"line":646},[213,3841,3842],{"class":243},"            context.guestCheckoutLabel ",[213,3844,507],{"class":275},[213,3846,3847],{"class":247}," 'Continue as Guest'",[213,3849,301],{"class":243},[213,3851,3852],{"class":215,"line":673},[213,3853,233],{"emptyLinePlaceholder":232},[213,3855,3856,3858],{"class":215,"line":685},[213,3857,978],{"class":275},[213,3859,3860],{"class":243}," context;\n",[213,3862,3863],{"class":215,"line":694},[213,3864,702],{"class":243},[213,3866,3867],{"class":215,"line":699},[213,3868,3450],{"class":243},[213,3870,3871],{"class":215,"line":705},[213,3872,714],{"class":243},[15,3874,3875],{},"The template should lead with the guest option:",[203,3877,3879],{"className":1538,"code":3878,"language":1540,"meta":208,"style":208},"{{!-- stenbase_guest_checkout_login.tpl --}}\n\u003Cdiv class=\"checkout-login-container\">\n\n    {{!-- Guest checkout: PRIMARY option --}}\n    \u003Cdiv class=\"checkout-guest-section\">\n        \u003Ch2>{{translate 'Checkout'}}\u003C\u002Fh2>\n        \u003Cp>{{translate 'No account needed. Enter your email to continue.'}}\u003C\u002Fp>\n\n        \u003Cform data-action=\"guest-checkout\">\n            \u003Cdiv class=\"form-group\">\n                \u003Clabel for=\"guest-email\">{{translate 'Email Address'}}\u003C\u002Flabel>\n                \u003Cinput type=\"email\"\n                       id=\"guest-email\"\n                       name=\"email\"\n                       autocomplete=\"email\"\n                       required\n                       placeholder=\"your@email.com\" \u002F>\n            \u003C\u002Fdiv>\n            \u003Cbutton type=\"submit\" class=\"button-primary button-full-width\">\n                {{translate 'Continue to Shipping'}}\n            \u003C\u002Fbutton>\n        \u003C\u002Fform>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"checkout-divider\">\n        \u003Cspan>{{translate 'or'}}\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n\n    {{!-- Returning customer: SECONDARY option --}}\n    \u003Cdiv class=\"checkout-login-section\">\n        \u003Ch3>{{translate 'Returning Customer?'}}\u003C\u002Fh3>\n        \u003Cp>{{translate 'Sign in for faster checkout.'}}\u003C\u002Fp>\n\n        \u003Cdetails>\n            \u003Csummary>{{translate 'Sign In'}}\u003C\u002Fsummary>\n            \u003Cform data-action=\"login\">\n                \u003Cdiv class=\"form-group\">\n                    \u003Clabel for=\"login-email\">\n                        {{translate 'Email'}}\n                    \u003C\u002Flabel>\n                    \u003Cinput type=\"email\"\n                           id=\"login-email\"\n                           name=\"email\"\n                           autocomplete=\"email\" \u002F>\n                \u003C\u002Fdiv>\n                \u003Cdiv class=\"form-group\">\n                    \u003Clabel for=\"login-password\">\n                        {{translate 'Password'}}\n                    \u003C\u002Flabel>\n                    \u003Cinput type=\"password\"\n                           id=\"login-password\"\n                           name=\"password\"\n                           autocomplete=\"current-password\" \u002F>\n                \u003C\u002Fdiv>\n                \u003Cbutton type=\"submit\" class=\"button-secondary\">\n                    {{translate 'Sign In & Checkout'}}\n                \u003C\u002Fbutton>\n            \u003C\u002Fform>\n        \u003C\u002Fdetails>\n    \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n",[210,3880,3881,3886,3891,3895,3900,3905,3910,3915,3919,3924,3929,3934,3939,3944,3949,3954,3959,3964,3969,3974,3979,3984,3989,3993,3997,4002,4007,4011,4015,4020,4025,4030,4035,4039,4044,4049,4054,4059,4064,4069,4074,4079,4084,4089,4094,4099,4103,4109,4115,4120,4126,4132,4138,4144,4149,4155,4161,4167,4173,4179,4184],{"__ignoreMap":208},[213,3882,3883],{"class":215,"line":216},[213,3884,3885],{},"{{!-- stenbase_guest_checkout_login.tpl --}}\n",[213,3887,3888],{"class":215,"line":223},[213,3889,3890],{},"\u003Cdiv class=\"checkout-login-container\">\n",[213,3892,3893],{"class":215,"line":229},[213,3894,233],{"emptyLinePlaceholder":232},[213,3896,3897],{"class":215,"line":236},[213,3898,3899],{},"    {{!-- Guest checkout: PRIMARY option --}}\n",[213,3901,3902],{"class":215,"line":254},[213,3903,3904],{},"    \u003Cdiv class=\"checkout-guest-section\">\n",[213,3906,3907],{"class":215,"line":263},[213,3908,3909],{},"        \u003Ch2>{{translate 'Checkout'}}\u003C\u002Fh2>\n",[213,3911,3912],{"class":215,"line":269},[213,3913,3914],{},"        \u003Cp>{{translate 'No account needed. Enter your email to continue.'}}\u003C\u002Fp>\n",[213,3916,3917],{"class":215,"line":295},[213,3918,233],{"emptyLinePlaceholder":232},[213,3920,3921],{"class":215,"line":304},[213,3922,3923],{},"        \u003Cform data-action=\"guest-checkout\">\n",[213,3925,3926],{"class":215,"line":309},[213,3927,3928],{},"            \u003Cdiv class=\"form-group\">\n",[213,3930,3931],{"class":215,"line":318},[213,3932,3933],{},"                \u003Clabel for=\"guest-email\">{{translate 'Email Address'}}\u003C\u002Flabel>\n",[213,3935,3936],{"class":215,"line":346},[213,3937,3938],{},"                \u003Cinput type=\"email\"\n",[213,3940,3941],{"class":215,"line":352},[213,3942,3943],{},"                       id=\"guest-email\"\n",[213,3945,3946],{"class":215,"line":361},[213,3947,3948],{},"                       name=\"email\"\n",[213,3950,3951],{"class":215,"line":380},[213,3952,3953],{},"                       autocomplete=\"email\"\n",[213,3955,3956],{"class":215,"line":407},[213,3957,3958],{},"                       required\n",[213,3960,3961],{"class":215,"line":424},[213,3962,3963],{},"                       placeholder=\"your@email.com\" \u002F>\n",[213,3965,3966],{"class":215,"line":440},[213,3967,3968],{},"            \u003C\u002Fdiv>\n",[213,3970,3971],{"class":215,"line":446},[213,3972,3973],{},"            \u003Cbutton type=\"submit\" class=\"button-primary button-full-width\">\n",[213,3975,3976],{"class":215,"line":451},[213,3977,3978],{},"                {{translate 'Continue to Shipping'}}\n",[213,3980,3981],{"class":215,"line":467},[213,3982,3983],{},"            \u003C\u002Fbutton>\n",[213,3985,3986],{"class":215,"line":473},[213,3987,3988],{},"        \u003C\u002Fform>\n",[213,3990,3991],{"class":215,"line":479},[213,3992,1572],{},[213,3994,3995],{"class":215,"line":484},[213,3996,233],{"emptyLinePlaceholder":232},[213,3998,3999],{"class":215,"line":490},[213,4000,4001],{},"    \u003Cdiv class=\"checkout-divider\">\n",[213,4003,4004],{"class":215,"line":495},[213,4005,4006],{},"        \u003Cspan>{{translate 'or'}}\u003C\u002Fspan>\n",[213,4008,4009],{"class":215,"line":501},[213,4010,1572],{},[213,4012,4013],{"class":215,"line":518},[213,4014,233],{"emptyLinePlaceholder":232},[213,4016,4017],{"class":215,"line":530},[213,4018,4019],{},"    {{!-- Returning customer: SECONDARY option --}}\n",[213,4021,4022],{"class":215,"line":541},[213,4023,4024],{},"    \u003Cdiv class=\"checkout-login-section\">\n",[213,4026,4027],{"class":215,"line":547},[213,4028,4029],{},"        \u003Ch3>{{translate 'Returning Customer?'}}\u003C\u002Fh3>\n",[213,4031,4032],{"class":215,"line":553},[213,4033,4034],{},"        \u003Cp>{{translate 'Sign in for faster checkout.'}}\u003C\u002Fp>\n",[213,4036,4037],{"class":215,"line":564},[213,4038,233],{"emptyLinePlaceholder":232},[213,4040,4041],{"class":215,"line":570},[213,4042,4043],{},"        \u003Cdetails>\n",[213,4045,4046],{"class":215,"line":576},[213,4047,4048],{},"            \u003Csummary>{{translate 'Sign In'}}\u003C\u002Fsummary>\n",[213,4050,4051],{"class":215,"line":581},[213,4052,4053],{},"            \u003Cform data-action=\"login\">\n",[213,4055,4056],{"class":215,"line":594},[213,4057,4058],{},"                \u003Cdiv class=\"form-group\">\n",[213,4060,4061],{"class":215,"line":602},[213,4062,4063],{},"                    \u003Clabel for=\"login-email\">\n",[213,4065,4066],{"class":215,"line":634},[213,4067,4068],{},"                        {{translate 'Email'}}\n",[213,4070,4071],{"class":215,"line":646},[213,4072,4073],{},"                    \u003C\u002Flabel>\n",[213,4075,4076],{"class":215,"line":673},[213,4077,4078],{},"                    \u003Cinput type=\"email\"\n",[213,4080,4081],{"class":215,"line":685},[213,4082,4083],{},"                           id=\"login-email\"\n",[213,4085,4086],{"class":215,"line":694},[213,4087,4088],{},"                           name=\"email\"\n",[213,4090,4091],{"class":215,"line":699},[213,4092,4093],{},"                           autocomplete=\"email\" \u002F>\n",[213,4095,4096],{"class":215,"line":705},[213,4097,4098],{},"                \u003C\u002Fdiv>\n",[213,4100,4101],{"class":215,"line":711},[213,4102,4058],{},[213,4104,4106],{"class":215,"line":4105},47,[213,4107,4108],{},"                    \u003Clabel for=\"login-password\">\n",[213,4110,4112],{"class":215,"line":4111},48,[213,4113,4114],{},"                        {{translate 'Password'}}\n",[213,4116,4118],{"class":215,"line":4117},49,[213,4119,4073],{},[213,4121,4123],{"class":215,"line":4122},50,[213,4124,4125],{},"                    \u003Cinput type=\"password\"\n",[213,4127,4129],{"class":215,"line":4128},51,[213,4130,4131],{},"                           id=\"login-password\"\n",[213,4133,4135],{"class":215,"line":4134},52,[213,4136,4137],{},"                           name=\"password\"\n",[213,4139,4141],{"class":215,"line":4140},53,[213,4142,4143],{},"                           autocomplete=\"current-password\" \u002F>\n",[213,4145,4147],{"class":215,"line":4146},54,[213,4148,4098],{},[213,4150,4152],{"class":215,"line":4151},55,[213,4153,4154],{},"                \u003Cbutton type=\"submit\" class=\"button-secondary\">\n",[213,4156,4158],{"class":215,"line":4157},56,[213,4159,4160],{},"                    {{translate 'Sign In & Checkout'}}\n",[213,4162,4164],{"class":215,"line":4163},57,[213,4165,4166],{},"                \u003C\u002Fbutton>\n",[213,4168,4170],{"class":215,"line":4169},58,[213,4171,4172],{},"            \u003C\u002Fform>\n",[213,4174,4176],{"class":215,"line":4175},59,[213,4177,4178],{},"        \u003C\u002Fdetails>\n",[213,4180,4182],{"class":215,"line":4181},60,[213,4183,1572],{},[213,4185,4187],{"class":215,"line":4186},61,[213,4188,1611],{},[15,4190,4191],{},"The key design principle: guest checkout is the default path. Signing in is available but secondary. This alone can recover a significant portion of the 19% who abandon over account creation.",[195,4193,4195],{"id":4194},"post-purchase-account-creation","Post-Purchase Account Creation",[15,4197,4198],{},"Don't lose the opportunity to create accounts—just move it to after the purchase:",[203,4200,4202],{"className":205,"code":4201,"language":207,"meta":208,"style":208},"\u002F\u002F Show account creation prompt on order confirmation page\nOrderConfirmationView.prototype.showAccountPrompt = function () {\n    var email = this.model.get('confirmation').email;\n\n    if (!this.model.get('isLoggedIn')) {\n        this.$('.confirmation-account-prompt').html(\n            '\u003Cdiv class=\"post-purchase-account\">' +\n            '  \u003Ch3>Want to track this order?\u003C\u002Fh3>' +\n            '  \u003Cp>Create a password to save your info ' +\n            '     for next time.\u003C\u002Fp>' +\n            '  \u003Cform data-action=\"create-account-post-purchase\">' +\n            '    \u003Cinput type=\"hidden\" name=\"email\" ' +\n            '           value=\"' + _.escape(email) + '\" \u002F>' +\n            '    \u003Cinput type=\"password\" name=\"password\" ' +\n            '           placeholder=\"Create a password\" ' +\n            '           autocomplete=\"new-password\" \u002F>' +\n            '    \u003Cbutton type=\"submit\" ' +\n            '            class=\"button-secondary\">' +\n            '      Create Account' +\n            '    \u003C\u002Fbutton>' +\n            '  \u003C\u002Fform>' +\n            '\u003C\u002Fdiv>'\n        );\n    }\n};\n",[210,4203,4204,4209,4229,4252,4256,4279,4300,4307,4314,4321,4328,4335,4342,4364,4371,4378,4385,4392,4399,4406,4413,4420,4425,4430,4434],{"__ignoreMap":208},[213,4205,4206],{"class":215,"line":216},[213,4207,4208],{"class":219},"\u002F\u002F Show account creation prompt on order confirmation page\n",[213,4210,4211,4214,4216,4218,4220,4223,4225,4227],{"class":215,"line":223},[213,4212,4213],{"class":386},"OrderConfirmationView",[213,4215,390],{"class":243},[213,4217,863],{"class":386},[213,4219,390],{"class":243},[213,4221,4222],{"class":239},"showAccountPrompt",[213,4224,1802],{"class":275},[213,4226,1805],{"class":275},[213,4228,591],{"class":243},[213,4230,4231,4233,4236,4238,4240,4242,4244,4246,4249],{"class":215,"line":229},[213,4232,1715],{"class":275},[213,4234,4235],{"class":243}," email ",[213,4237,507],{"class":275},[213,4239,919],{"class":386},[213,4241,3678],{"class":243},[213,4243,655],{"class":239},[213,4245,244],{"class":243},[213,4247,4248],{"class":247},"'confirmation'",[213,4250,4251],{"class":243},").email;\n",[213,4253,4254],{"class":215,"line":236},[213,4255,233],{"emptyLinePlaceholder":232},[213,4257,4258,4260,4262,4265,4267,4269,4271,4273,4276],{"class":215,"line":254},[213,4259,2234],{"class":275},[213,4261,279],{"class":243},[213,4263,4264],{"class":275},"!",[213,4266,413],{"class":386},[213,4268,3678],{"class":243},[213,4270,655],{"class":239},[213,4272,244],{"class":243},[213,4274,4275],{"class":247},"'isLoggedIn'",[213,4277,4278],{"class":243},")) {\n",[213,4280,4281,4284,4286,4288,4290,4293,4295,4298],{"class":215,"line":263},[213,4282,4283],{"class":386},"        this",[213,4285,390],{"class":243},[213,4287,2214],{"class":239},[213,4289,244],{"class":243},[213,4291,4292],{"class":247},"'.confirmation-account-prompt'",[213,4294,626],{"class":243},[213,4296,4297],{"class":239},"html",[213,4299,877],{"class":243},[213,4301,4302,4305],{"class":215,"line":269},[213,4303,4304],{"class":247},"            '\u003Cdiv class=\"post-purchase-account\">'",[213,4306,1095],{"class":275},[213,4308,4309,4312],{"class":215,"line":295},[213,4310,4311],{"class":247},"            '  \u003Ch3>Want to track this order?\u003C\u002Fh3>'",[213,4313,1095],{"class":275},[213,4315,4316,4319],{"class":215,"line":304},[213,4317,4318],{"class":247},"            '  \u003Cp>Create a password to save your info '",[213,4320,1095],{"class":275},[213,4322,4323,4326],{"class":215,"line":309},[213,4324,4325],{"class":247},"            '     for next time.\u003C\u002Fp>'",[213,4327,1095],{"class":275},[213,4329,4330,4333],{"class":215,"line":318},[213,4331,4332],{"class":247},"            '  \u003Cform data-action=\"create-account-post-purchase\">'",[213,4334,1095],{"class":275},[213,4336,4337,4340],{"class":215,"line":346},[213,4338,4339],{"class":247},"            '    \u003Cinput type=\"hidden\" name=\"email\" '",[213,4341,1095],{"class":275},[213,4343,4344,4347,4349,4351,4354,4357,4359,4362],{"class":215,"line":352},[213,4345,4346],{"class":247},"            '           value=\"'",[213,4348,1050],{"class":275},[213,4350,871],{"class":243},[213,4352,4353],{"class":239},"escape",[213,4355,4356],{"class":243},"(email) ",[213,4358,3360],{"class":275},[213,4360,4361],{"class":247}," '\" \u002F>'",[213,4363,1095],{"class":275},[213,4365,4366,4369],{"class":215,"line":361},[213,4367,4368],{"class":247},"            '    \u003Cinput type=\"password\" name=\"password\" '",[213,4370,1095],{"class":275},[213,4372,4373,4376],{"class":215,"line":380},[213,4374,4375],{"class":247},"            '           placeholder=\"Create a password\" '",[213,4377,1095],{"class":275},[213,4379,4380,4383],{"class":215,"line":407},[213,4381,4382],{"class":247},"            '           autocomplete=\"new-password\" \u002F>'",[213,4384,1095],{"class":275},[213,4386,4387,4390],{"class":215,"line":424},[213,4388,4389],{"class":247},"            '    \u003Cbutton type=\"submit\" '",[213,4391,1095],{"class":275},[213,4393,4394,4397],{"class":215,"line":440},[213,4395,4396],{"class":247},"            '            class=\"button-secondary\">'",[213,4398,1095],{"class":275},[213,4400,4401,4404],{"class":215,"line":446},[213,4402,4403],{"class":247},"            '      Create Account'",[213,4405,1095],{"class":275},[213,4407,4408,4411],{"class":215,"line":451},[213,4409,4410],{"class":247},"            '    \u003C\u002Fbutton>'",[213,4412,1095],{"class":275},[213,4414,4415,4418],{"class":215,"line":467},[213,4416,4417],{"class":247},"            '  \u003C\u002Fform>'",[213,4419,1095],{"class":275},[213,4421,4422],{"class":215,"line":473},[213,4423,4424],{"class":247},"            '\u003C\u002Fdiv>'\n",[213,4426,4427],{"class":215,"line":479},[213,4428,4429],{"class":243},"        );\n",[213,4431,4432],{"class":215,"line":484},[213,4433,1131],{"class":243},[213,4435,4436],{"class":215,"line":490},[213,4437,2381],{"class":243},[29,4439],{},[32,4441,82],{"id":4442},"reducing-form-fields-without-losing-data",[15,4444,4445],{},"Baymard's research shows the ideal checkout has 12–14 form elements. Here's how to get there in SuiteCommerce without losing the data NetSuite needs.",[195,4447,4449],{"id":4448},"fields-to-remove-or-auto-fill","Fields to Remove or Auto-Fill",[719,4451,4452,4465],{},[722,4453,4454],{},[725,4455,4456,4459,4462],{},[728,4457,4458],{},"Default Field",[728,4460,4461],{},"Action",[728,4463,4464],{},"Rationale",[738,4466,4467,4478,4489,4500,4510,4521,4531],{},[725,4468,4469,4472,4475],{},[743,4470,4471],{},"Company Name",[743,4473,4474],{},"Remove for B2C, keep for B2B",[743,4476,4477],{},"Only 15-20% of B2C customers have a company",[725,4479,4480,4483,4486],{},[743,4481,4482],{},"Phone (Evening)",[743,4484,4485],{},"Remove",[743,4487,4488],{},"Duplicate; nobody calls customers in the evening",[725,4490,4491,4494,4497],{},[743,4492,4493],{},"Phone (Daytime)",[743,4495,4496],{},"Rename to \"Phone\"",[743,4498,4499],{},"Single phone field is sufficient",[725,4501,4502,4505,4507],{},[743,4503,4504],{},"Fax",[743,4506,4485],{},[743,4508,4509],{},"It's 2026.",[725,4511,4512,4515,4518],{},[743,4513,4514],{},"Address Line 2",[743,4516,4517],{},"Collapse",[743,4519,4520],{},"Show as \"Add apartment, suite, etc.\" link",[725,4522,4523,4526,4528],{},[743,4524,4525],{},"Address Line 3",[743,4527,4485],{},[743,4529,4530],{},"Virtually never used",[725,4532,4533,4536,4539],{},[743,4534,4535],{},"State + ZIP",[743,4537,4538],{},"Auto-detect",[743,4540,4541],{},"Lookup state from ZIP code",[195,4543,4545],{"id":4544},"auto-detect-state-from-zip-code","Auto-Detect State from ZIP Code",[203,4547,4549],{"className":205,"code":4548,"language":207,"meta":208,"style":208},"\u002F\u002F ZIP code to state auto-detection\n\u002F\u002F Reduces one form field interaction\n\nvar zipToState = {\n    \u002F\u002F First 3 digits of ZIP to state code mapping\n    '006': 'PR', '007': 'PR', '008': 'PR', '009': 'PR',\n    '010': 'MA', '011': 'MA', '012': 'MA', '013': 'MA',\n    '014': 'MA', '015': 'MA', '016': 'MA', '017': 'MA',\n    '018': 'MA', '019': 'MA', '020': 'MA', '021': 'MA',\n    '022': 'MA', '023': 'MA', '024': 'MA', '025': 'MA',\n    '026': 'MA', '027': 'MA',\n    '028': 'RI', '029': 'RI',\n    '030': 'NH', '031': 'NH', '032': 'NH', '033': 'NH',\n    '034': 'NH', '035': 'NH', '036': 'NH', '037': 'NH',\n    '038': 'NH',\n    \u002F\u002F ... extend for all US ZIP prefixes\n    '900': 'CA', '901': 'CA', '902': 'CA'\n    \u002F\u002F Full mapping available in our GitHub gist\n};\n\nAddressFormView.prototype.autoDetectState = function (zip) {\n    if (!zip || zip.length \u003C 3) return;\n\n    var prefix = zip.substring(0, 3);\n    var state = zipToState[prefix];\n\n    if (state) {\n        this.$('[name=\"state\"]').val(state).trigger('change');\n        \u002F\u002F Visually indicate auto-detection\n        this.$('[name=\"state\"]')\n            .closest('.form-group')\n            .addClass('auto-detected');\n    }\n};\n",[210,4550,4551,4556,4561,4565,4577,4582,4621,4660,4698,4736,4774,4794,4815,4854,4892,4903,4908,4937,4942,4946,4950,4974,5004,5008,5032,5044,5048,5055,5085,5090,5104,5118,5132,5136],{"__ignoreMap":208},[213,4552,4553],{"class":215,"line":216},[213,4554,4555],{"class":219},"\u002F\u002F ZIP code to state auto-detection\n",[213,4557,4558],{"class":215,"line":223},[213,4559,4560],{"class":219},"\u002F\u002F Reduces one form field interaction\n",[213,4562,4563],{"class":215,"line":229},[213,4564,233],{"emptyLinePlaceholder":232},[213,4566,4567,4570,4573,4575],{"class":215,"line":236},[213,4568,4569],{"class":275},"var",[213,4571,4572],{"class":243}," zipToState ",[213,4574,507],{"class":275},[213,4576,315],{"class":243},[213,4578,4579],{"class":215,"line":254},[213,4580,4581],{"class":219},"    \u002F\u002F First 3 digits of ZIP to state code mapping\n",[213,4583,4584,4587,4589,4592,4594,4597,4599,4601,4603,4606,4608,4610,4612,4615,4617,4619],{"class":215,"line":263},[213,4585,4586],{"class":247},"    '006'",[213,4588,324],{"class":243},[213,4590,4591],{"class":247},"'PR'",[213,4593,286],{"class":243},[213,4595,4596],{"class":247},"'007'",[213,4598,324],{"class":243},[213,4600,4591],{"class":247},[213,4602,286],{"class":243},[213,4604,4605],{"class":247},"'008'",[213,4607,324],{"class":243},[213,4609,4591],{"class":247},[213,4611,286],{"class":243},[213,4613,4614],{"class":247},"'009'",[213,4616,324],{"class":243},[213,4618,4591],{"class":247},[213,4620,260],{"class":243},[213,4622,4623,4626,4628,4631,4633,4636,4638,4640,4642,4645,4647,4649,4651,4654,4656,4658],{"class":215,"line":269},[213,4624,4625],{"class":247},"    '010'",[213,4627,324],{"class":243},[213,4629,4630],{"class":247},"'MA'",[213,4632,286],{"class":243},[213,4634,4635],{"class":247},"'011'",[213,4637,324],{"class":243},[213,4639,4630],{"class":247},[213,4641,286],{"class":243},[213,4643,4644],{"class":247},"'012'",[213,4646,324],{"class":243},[213,4648,4630],{"class":247},[213,4650,286],{"class":243},[213,4652,4653],{"class":247},"'013'",[213,4655,324],{"class":243},[213,4657,4630],{"class":247},[213,4659,260],{"class":243},[213,4661,4662,4665,4667,4669,4671,4674,4676,4678,4680,4683,4685,4687,4689,4692,4694,4696],{"class":215,"line":295},[213,4663,4664],{"class":247},"    '014'",[213,4666,324],{"class":243},[213,4668,4630],{"class":247},[213,4670,286],{"class":243},[213,4672,4673],{"class":247},"'015'",[213,4675,324],{"class":243},[213,4677,4630],{"class":247},[213,4679,286],{"class":243},[213,4681,4682],{"class":247},"'016'",[213,4684,324],{"class":243},[213,4686,4630],{"class":247},[213,4688,286],{"class":243},[213,4690,4691],{"class":247},"'017'",[213,4693,324],{"class":243},[213,4695,4630],{"class":247},[213,4697,260],{"class":243},[213,4699,4700,4703,4705,4707,4709,4712,4714,4716,4718,4721,4723,4725,4727,4730,4732,4734],{"class":215,"line":304},[213,4701,4702],{"class":247},"    '018'",[213,4704,324],{"class":243},[213,4706,4630],{"class":247},[213,4708,286],{"class":243},[213,4710,4711],{"class":247},"'019'",[213,4713,324],{"class":243},[213,4715,4630],{"class":247},[213,4717,286],{"class":243},[213,4719,4720],{"class":247},"'020'",[213,4722,324],{"class":243},[213,4724,4630],{"class":247},[213,4726,286],{"class":243},[213,4728,4729],{"class":247},"'021'",[213,4731,324],{"class":243},[213,4733,4630],{"class":247},[213,4735,260],{"class":243},[213,4737,4738,4741,4743,4745,4747,4750,4752,4754,4756,4759,4761,4763,4765,4768,4770,4772],{"class":215,"line":309},[213,4739,4740],{"class":247},"    '022'",[213,4742,324],{"class":243},[213,4744,4630],{"class":247},[213,4746,286],{"class":243},[213,4748,4749],{"class":247},"'023'",[213,4751,324],{"class":243},[213,4753,4630],{"class":247},[213,4755,286],{"class":243},[213,4757,4758],{"class":247},"'024'",[213,4760,324],{"class":243},[213,4762,4630],{"class":247},[213,4764,286],{"class":243},[213,4766,4767],{"class":247},"'025'",[213,4769,324],{"class":243},[213,4771,4630],{"class":247},[213,4773,260],{"class":243},[213,4775,4776,4779,4781,4783,4785,4788,4790,4792],{"class":215,"line":318},[213,4777,4778],{"class":247},"    '026'",[213,4780,324],{"class":243},[213,4782,4630],{"class":247},[213,4784,286],{"class":243},[213,4786,4787],{"class":247},"'027'",[213,4789,324],{"class":243},[213,4791,4630],{"class":247},[213,4793,260],{"class":243},[213,4795,4796,4799,4801,4804,4806,4809,4811,4813],{"class":215,"line":346},[213,4797,4798],{"class":247},"    '028'",[213,4800,324],{"class":243},[213,4802,4803],{"class":247},"'RI'",[213,4805,286],{"class":243},[213,4807,4808],{"class":247},"'029'",[213,4810,324],{"class":243},[213,4812,4803],{"class":247},[213,4814,260],{"class":243},[213,4816,4817,4820,4822,4825,4827,4830,4832,4834,4836,4839,4841,4843,4845,4848,4850,4852],{"class":215,"line":352},[213,4818,4819],{"class":247},"    '030'",[213,4821,324],{"class":243},[213,4823,4824],{"class":247},"'NH'",[213,4826,286],{"class":243},[213,4828,4829],{"class":247},"'031'",[213,4831,324],{"class":243},[213,4833,4824],{"class":247},[213,4835,286],{"class":243},[213,4837,4838],{"class":247},"'032'",[213,4840,324],{"class":243},[213,4842,4824],{"class":247},[213,4844,286],{"class":243},[213,4846,4847],{"class":247},"'033'",[213,4849,324],{"class":243},[213,4851,4824],{"class":247},[213,4853,260],{"class":243},[213,4855,4856,4859,4861,4863,4865,4868,4870,4872,4874,4877,4879,4881,4883,4886,4888,4890],{"class":215,"line":361},[213,4857,4858],{"class":247},"    '034'",[213,4860,324],{"class":243},[213,4862,4824],{"class":247},[213,4864,286],{"class":243},[213,4866,4867],{"class":247},"'035'",[213,4869,324],{"class":243},[213,4871,4824],{"class":247},[213,4873,286],{"class":243},[213,4875,4876],{"class":247},"'036'",[213,4878,324],{"class":243},[213,4880,4824],{"class":247},[213,4882,286],{"class":243},[213,4884,4885],{"class":247},"'037'",[213,4887,324],{"class":243},[213,4889,4824],{"class":247},[213,4891,260],{"class":243},[213,4893,4894,4897,4899,4901],{"class":215,"line":380},[213,4895,4896],{"class":247},"    '038'",[213,4898,324],{"class":243},[213,4900,4824],{"class":247},[213,4902,260],{"class":243},[213,4904,4905],{"class":215,"line":407},[213,4906,4907],{"class":219},"    \u002F\u002F ... extend for all US ZIP prefixes\n",[213,4909,4910,4913,4915,4918,4920,4923,4925,4927,4929,4932,4934],{"class":215,"line":424},[213,4911,4912],{"class":247},"    '900'",[213,4914,324],{"class":243},[213,4916,4917],{"class":247},"'CA'",[213,4919,286],{"class":243},[213,4921,4922],{"class":247},"'901'",[213,4924,324],{"class":243},[213,4926,4917],{"class":247},[213,4928,286],{"class":243},[213,4930,4931],{"class":247},"'902'",[213,4933,324],{"class":243},[213,4935,4936],{"class":247},"'CA'\n",[213,4938,4939],{"class":215,"line":440},[213,4940,4941],{"class":219},"    \u002F\u002F Full mapping available in our GitHub gist\n",[213,4943,4944],{"class":215,"line":446},[213,4945,2381],{"class":243},[213,4947,4948],{"class":215,"line":451},[213,4949,233],{"emptyLinePlaceholder":232},[213,4951,4952,4954,4956,4958,4960,4963,4965,4967,4969,4972],{"class":215,"line":467},[213,4953,2096],{"class":386},[213,4955,390],{"class":243},[213,4957,863],{"class":386},[213,4959,390],{"class":243},[213,4961,4962],{"class":239},"autoDetectState",[213,4964,1802],{"class":275},[213,4966,1805],{"class":275},[213,4968,279],{"class":243},[213,4970,4971],{"class":282},"zip",[213,4973,292],{"class":243},[213,4975,4976,4978,4980,4982,4985,4987,4989,4991,4994,4997,4999,5002],{"class":215,"line":473},[213,4977,2234],{"class":275},[213,4979,279],{"class":243},[213,4981,4264],{"class":275},[213,4983,4984],{"class":243},"zip ",[213,4986,399],{"class":275},[213,4988,2242],{"class":243},[213,4990,2245],{"class":386},[213,4992,4993],{"class":275}," \u003C",[213,4995,4996],{"class":386}," 3",[213,4998,3416],{"class":243},[213,5000,5001],{"class":275},"return",[213,5003,301],{"class":243},[213,5005,5006],{"class":215,"line":479},[213,5007,233],{"emptyLinePlaceholder":232},[213,5009,5010,5012,5015,5017,5019,5022,5024,5026,5028,5030],{"class":215,"line":484},[213,5011,1715],{"class":275},[213,5013,5014],{"class":243}," prefix ",[213,5016,507],{"class":275},[213,5018,2242],{"class":243},[213,5020,5021],{"class":239},"substring",[213,5023,244],{"class":243},[213,5025,1740],{"class":386},[213,5027,286],{"class":243},[213,5029,767],{"class":386},[213,5031,1136],{"class":243},[213,5033,5034,5036,5039,5041],{"class":215,"line":490},[213,5035,1715],{"class":275},[213,5037,5038],{"class":243}," state ",[213,5040,507],{"class":275},[213,5042,5043],{"class":243}," zipToState[prefix];\n",[213,5045,5046],{"class":215,"line":495},[213,5047,233],{"emptyLinePlaceholder":232},[213,5049,5050,5052],{"class":215,"line":501},[213,5051,2234],{"class":275},[213,5053,5054],{"class":243}," (state) {\n",[213,5056,5057,5059,5061,5063,5065,5068,5070,5072,5075,5078,5080,5083],{"class":215,"line":518},[213,5058,4283],{"class":386},[213,5060,390],{"class":243},[213,5062,2214],{"class":239},[213,5064,244],{"class":243},[213,5066,5067],{"class":247},"'[name=\"state\"]'",[213,5069,626],{"class":243},[213,5071,2196],{"class":239},[213,5073,5074],{"class":243},"(state).",[213,5076,5077],{"class":239},"trigger",[213,5079,244],{"class":243},[213,5081,5082],{"class":247},"'change'",[213,5084,1136],{"class":243},[213,5086,5087],{"class":215,"line":530},[213,5088,5089],{"class":219},"        \u002F\u002F Visually indicate auto-detection\n",[213,5091,5092,5094,5096,5098,5100,5102],{"class":215,"line":541},[213,5093,4283],{"class":386},[213,5095,390],{"class":243},[213,5097,2214],{"class":239},[213,5099,244],{"class":243},[213,5101,5067],{"class":247},[213,5103,1931],{"class":243},[213,5105,5106,5108,5111,5113,5116],{"class":215,"line":547},[213,5107,1936],{"class":243},[213,5109,5110],{"class":239},"closest",[213,5112,244],{"class":243},[213,5114,5115],{"class":247},"'.form-group'",[213,5117,1931],{"class":243},[213,5119,5120,5122,5125,5127,5130],{"class":215,"line":553},[213,5121,1936],{"class":243},[213,5123,5124],{"class":239},"addClass",[213,5126,244],{"class":243},[213,5128,5129],{"class":247},"'auto-detected'",[213,5131,1136],{"class":243},[213,5133,5134],{"class":215,"line":564},[213,5135,1131],{"class":243},[213,5137,5138],{"class":215,"line":570},[213,5139,2381],{"class":243},[195,5141,5143],{"id":5142},"collapse-optional-fields","Collapse Optional Fields",[15,5145,5146],{},"Instead of showing Address Line 2 by default, hide it behind a toggle:",[203,5148,5150],{"className":1538,"code":5149,"language":1540,"meta":208,"style":208},"{{!-- Collapsible address line 2 --}}\n\u003Cdiv class=\"address-form-group address-line-2-container\">\n    {{#unless showAddressLine2}}\n        \u003Ca href=\"#\"\n           class=\"address-line-2-toggle\"\n           data-action=\"show-address-line-2\">\n            {{translate '+ Add apartment, suite, unit, etc.'}}\n        \u003C\u002Fa>\n    {{\u002Funless}}\n\n    \u003Cdiv class=\"address-line-2-field {{#unless showAddressLine2}}hidden{{\u002Funless}}\">\n        \u003Clabel for=\"addr2\">{{translate 'Apt, Suite, Unit'}}\u003C\u002Flabel>\n        \u003Cinput type=\"text\"\n               id=\"addr2\"\n               name=\"addr2\"\n               autocomplete=\"address-line2\"\n               value=\"{{addr2}}\" \u002F>\n    \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n",[210,5151,5152,5157,5162,5167,5172,5177,5182,5187,5192,5197,5201,5206,5211,5216,5221,5226,5231,5236,5240],{"__ignoreMap":208},[213,5153,5154],{"class":215,"line":216},[213,5155,5156],{},"{{!-- Collapsible address line 2 --}}\n",[213,5158,5159],{"class":215,"line":223},[213,5160,5161],{},"\u003Cdiv class=\"address-form-group address-line-2-container\">\n",[213,5163,5164],{"class":215,"line":229},[213,5165,5166],{},"    {{#unless showAddressLine2}}\n",[213,5168,5169],{"class":215,"line":236},[213,5170,5171],{},"        \u003Ca href=\"#\"\n",[213,5173,5174],{"class":215,"line":254},[213,5175,5176],{},"           class=\"address-line-2-toggle\"\n",[213,5178,5179],{"class":215,"line":263},[213,5180,5181],{},"           data-action=\"show-address-line-2\">\n",[213,5183,5184],{"class":215,"line":269},[213,5185,5186],{},"            {{translate '+ Add apartment, suite, unit, etc.'}}\n",[213,5188,5189],{"class":215,"line":295},[213,5190,5191],{},"        \u003C\u002Fa>\n",[213,5193,5194],{"class":215,"line":304},[213,5195,5196],{},"    {{\u002Funless}}\n",[213,5198,5199],{"class":215,"line":309},[213,5200,233],{"emptyLinePlaceholder":232},[213,5202,5203],{"class":215,"line":318},[213,5204,5205],{},"    \u003Cdiv class=\"address-line-2-field {{#unless showAddressLine2}}hidden{{\u002Funless}}\">\n",[213,5207,5208],{"class":215,"line":346},[213,5209,5210],{},"        \u003Clabel for=\"addr2\">{{translate 'Apt, Suite, Unit'}}\u003C\u002Flabel>\n",[213,5212,5213],{"class":215,"line":352},[213,5214,5215],{},"        \u003Cinput type=\"text\"\n",[213,5217,5218],{"class":215,"line":361},[213,5219,5220],{},"               id=\"addr2\"\n",[213,5222,5223],{"class":215,"line":380},[213,5224,5225],{},"               name=\"addr2\"\n",[213,5227,5228],{"class":215,"line":407},[213,5229,5230],{},"               autocomplete=\"address-line2\"\n",[213,5232,5233],{"class":215,"line":424},[213,5234,5235],{},"               value=\"{{addr2}}\" \u002F>\n",[213,5237,5238],{"class":215,"line":440},[213,5239,1572],{},[213,5241,5242],{"class":215,"line":446},[213,5243,1611],{},[15,5245,5246],{},"Result: a cleaner initial form that shows only what's needed. Customers who need Address Line 2 can expand it. Everyone else sees fewer fields.",[29,5248],{},[32,5250,88],{"id":5251},"shipping-and-tax-transparency",[15,5253,5254],{},"39% of shoppers abandon because extra costs are too high. The real problem isn't always the cost itself—it's the surprise. Customers who see shipping and tax estimates early are far less likely to abandon when the final total matches their expectation.",[195,5256,5258],{"id":5257},"show-estimated-costs-in-the-cart","Show Estimated Costs in the Cart",[15,5260,5261],{},"Don't wait until the shipping step to reveal costs. Estimate them on the cart page:",[203,5263,5265],{"className":205,"code":5264,"language":207,"meta":208,"style":208},"\u002F\u002F Cart page shipping estimator\ndefine('Stenbase.CartShippingEstimate', [\n    'Backbone',\n    'jQuery',\n    'stenbase_cart_shipping_estimate.tpl'\n], function (Backbone, jQuery, template) {\n    'use strict';\n\n    return Backbone.View.extend({\n        template: template,\n\n        events: {\n            'blur [name=\"estimate-zip\"]': 'estimateShipping',\n            'change [name=\"estimate-country\"]': 'estimateShipping'\n        },\n\n        estimateShipping: function () {\n            var self = this;\n            var zip = this.$('[name=\"estimate-zip\"]').val();\n            var country = this.$('[name=\"estimate-country\"]').val();\n\n            if (!zip || !country) return;\n\n            this.$('.estimate-loading').show();\n            this.$('.estimate-results').hide();\n\n            jQuery.ajax({\n                url: _.getAbsoluteUrl(\n                    'services\u002FStenbase.ShippingEstimate.Service.ss'\n                ),\n                type: 'POST',\n                contentType: 'application\u002Fjson',\n                data: JSON.stringify({\n                    zip: zip,\n                    country: country,\n                    cartId: this.model.get('internalid')\n                })\n            }).done(function (response) {\n                self.$('.estimate-loading').hide();\n                self.$('.estimate-results').show();\n\n                self.renderEstimates(response.rates);\n                self.renderTaxEstimate(response.estimatedTax);\n            }).fail(function () {\n                self.$('.estimate-loading').hide();\n                self.$('.estimate-error')\n                    .text('Unable to estimate. Continue to ' +\n                          'checkout for exact costs.')\n                    .show();\n            });\n        },\n\n        renderEstimates: function (rates) {\n            var html = rates.map(function (rate) {\n                return '\u003Cdiv class=\"estimate-rate\">' +\n                    '\u003Cspan class=\"rate-name\">' +\n                        rate.name + '\u003C\u002Fspan>' +\n                    '\u003Cspan class=\"rate-price\">' +\n                        SC.Utils.formatCurrency(rate.price) +\n                    '\u003C\u002Fspan>' +\n                    '\u003Cspan class=\"rate-delivery\">' +\n                        rate.estimatedDays + ' business days' +\n                    '\u003C\u002Fspan>' +\n                '\u003C\u002Fdiv>';\n            }).join('');\n\n            this.$('.estimate-rates').html(html);\n        }\n    });\n});\n",[210,5266,5267,5272,5283,5289,5296,5301,5321,5327,5331,5342,5346,5350,5355,5367,5377,5381,5385,5396,5408,5433,5458,5462,5484,5488,5508,5528,5532,5542,5552,5557,5562,5572,5582,5597,5602,5607,5625,5630,5648,5664,5680,5684,5694,5704,5716,5732,5745,5760,5767,5775,5779,5783,5787,5802,5827,5836,5843,5855,5862,5879,5886,5893,5906,5913,5921,5936,5941,5962,5967,5972],{"__ignoreMap":208},[213,5268,5269],{"class":215,"line":216},[213,5270,5271],{"class":219},"\u002F\u002F Cart page shipping estimator\n",[213,5273,5274,5276,5278,5281],{"class":215,"line":223},[213,5275,240],{"class":239},[213,5277,244],{"class":243},[213,5279,5280],{"class":247},"'Stenbase.CartShippingEstimate'",[213,5282,251],{"class":243},[213,5284,5285,5287],{"class":215,"line":229},[213,5286,257],{"class":247},[213,5288,260],{"class":243},[213,5290,5291,5294],{"class":215,"line":236},[213,5292,5293],{"class":247},"    'jQuery'",[213,5295,260],{"class":243},[213,5297,5298],{"class":215,"line":254},[213,5299,5300],{"class":247},"    'stenbase_cart_shipping_estimate.tpl'\n",[213,5302,5303,5305,5307,5309,5311,5313,5315,5317,5319],{"class":215,"line":263},[213,5304,272],{"class":243},[213,5306,276],{"class":275},[213,5308,279],{"class":243},[213,5310,283],{"class":282},[213,5312,286],{"class":243},[213,5314,1698],{"class":282},[213,5316,286],{"class":243},[213,5318,3206],{"class":282},[213,5320,292],{"class":243},[213,5322,5323,5325],{"class":215,"line":269},[213,5324,298],{"class":247},[213,5326,301],{"class":243},[213,5328,5329],{"class":215,"line":295},[213,5330,233],{"emptyLinePlaceholder":232},[213,5332,5333,5335,5338,5340],{"class":215,"line":304},[213,5334,312],{"class":275},[213,5336,5337],{"class":243}," Backbone.View.",[213,5339,2110],{"class":239},[213,5341,527],{"class":243},[213,5343,5344],{"class":215,"line":309},[213,5345,3234],{"class":243},[213,5347,5348],{"class":215,"line":318},[213,5349,233],{"emptyLinePlaceholder":232},[213,5351,5352],{"class":215,"line":346},[213,5353,5354],{"class":243},"        events: {\n",[213,5356,5357,5360,5362,5365],{"class":215,"line":352},[213,5358,5359],{"class":247},"            'blur [name=\"estimate-zip\"]'",[213,5361,324],{"class":243},[213,5363,5364],{"class":247},"'estimateShipping'",[213,5366,260],{"class":243},[213,5368,5369,5372,5374],{"class":215,"line":361},[213,5370,5371],{"class":247},"            'change [name=\"estimate-country\"]'",[213,5373,324],{"class":243},[213,5375,5376],{"class":247},"'estimateShipping'\n",[213,5378,5379],{"class":215,"line":380},[213,5380,573],{"class":243},[213,5382,5383],{"class":215,"line":407},[213,5384,233],{"emptyLinePlaceholder":232},[213,5386,5387,5390,5392,5394],{"class":215,"line":424},[213,5388,5389],{"class":239},"        estimateShipping",[213,5391,324],{"class":243},[213,5393,276],{"class":275},[213,5395,591],{"class":243},[213,5397,5398,5400,5402,5404,5406],{"class":215,"line":440},[213,5399,1295],{"class":275},[213,5401,914],{"class":243},[213,5403,507],{"class":275},[213,5405,919],{"class":386},[213,5407,301],{"class":243},[213,5409,5410,5412,5414,5416,5418,5420,5422,5424,5427,5429,5431],{"class":215,"line":446},[213,5411,1295],{"class":275},[213,5413,2185],{"class":243},[213,5415,507],{"class":275},[213,5417,919],{"class":386},[213,5419,390],{"class":243},[213,5421,2214],{"class":239},[213,5423,244],{"class":243},[213,5425,5426],{"class":247},"'[name=\"estimate-zip\"]'",[213,5428,626],{"class":243},[213,5430,2196],{"class":239},[213,5432,643],{"class":243},[213,5434,5435,5437,5439,5441,5443,5445,5447,5449,5452,5454,5456],{"class":215,"line":451},[213,5436,1295],{"class":275},[213,5438,2205],{"class":243},[213,5440,507],{"class":275},[213,5442,919],{"class":386},[213,5444,390],{"class":243},[213,5446,2214],{"class":239},[213,5448,244],{"class":243},[213,5450,5451],{"class":247},"'[name=\"estimate-country\"]'",[213,5453,626],{"class":243},[213,5455,2196],{"class":239},[213,5457,643],{"class":243},[213,5459,5460],{"class":215,"line":467},[213,5461,233],{"emptyLinePlaceholder":232},[213,5463,5464,5466,5468,5470,5472,5474,5477,5480,5482],{"class":215,"line":473},[213,5465,355],{"class":275},[213,5467,279],{"class":243},[213,5469,4264],{"class":275},[213,5471,4984],{"class":243},[213,5473,399],{"class":275},[213,5475,5476],{"class":275}," !",[213,5478,5479],{"class":243},"country) ",[213,5481,5001],{"class":275},[213,5483,301],{"class":243},[213,5485,5486],{"class":215,"line":479},[213,5487,233],{"emptyLinePlaceholder":232},[213,5489,5490,5492,5494,5496,5498,5501,5503,5506],{"class":215,"line":484},[213,5491,3675],{"class":386},[213,5493,390],{"class":243},[213,5495,2214],{"class":239},[213,5497,244],{"class":243},[213,5499,5500],{"class":247},"'.estimate-loading'",[213,5502,626],{"class":243},[213,5504,5505],{"class":239},"show",[213,5507,643],{"class":243},[213,5509,5510,5512,5514,5516,5518,5521,5523,5526],{"class":215,"line":490},[213,5511,3675],{"class":386},[213,5513,390],{"class":243},[213,5515,2214],{"class":239},[213,5517,244],{"class":243},[213,5519,5520],{"class":247},"'.estimate-results'",[213,5522,626],{"class":243},[213,5524,5525],{"class":239},"hide",[213,5527,643],{"class":243},[213,5529,5530],{"class":215,"line":495},[213,5531,233],{"emptyLinePlaceholder":232},[213,5533,5534,5537,5540],{"class":215,"line":501},[213,5535,5536],{"class":243},"            jQuery.",[213,5538,5539],{"class":239},"ajax",[213,5541,527],{"class":243},[213,5543,5544,5547,5550],{"class":215,"line":518},[213,5545,5546],{"class":243},"                url: _.",[213,5548,5549],{"class":239},"getAbsoluteUrl",[213,5551,877],{"class":243},[213,5553,5554],{"class":215,"line":530},[213,5555,5556],{"class":247},"                    'services\u002FStenbase.ShippingEstimate.Service.ss'\n",[213,5558,5559],{"class":215,"line":541},[213,5560,5561],{"class":243},"                ),\n",[213,5563,5564,5567,5570],{"class":215,"line":547},[213,5565,5566],{"class":243},"                type: ",[213,5568,5569],{"class":247},"'POST'",[213,5571,260],{"class":243},[213,5573,5574,5577,5580],{"class":215,"line":553},[213,5575,5576],{"class":243},"                contentType: ",[213,5578,5579],{"class":247},"'application\u002Fjson'",[213,5581,260],{"class":243},[213,5583,5584,5587,5590,5592,5595],{"class":215,"line":564},[213,5585,5586],{"class":243},"                data: ",[213,5588,5589],{"class":386},"JSON",[213,5591,390],{"class":243},[213,5593,5594],{"class":239},"stringify",[213,5596,527],{"class":243},[213,5598,5599],{"class":215,"line":570},[213,5600,5601],{"class":243},"                    zip: zip,\n",[213,5603,5604],{"class":215,"line":576},[213,5605,5606],{"class":243},"                    country: country,\n",[213,5608,5609,5612,5614,5616,5618,5620,5623],{"class":215,"line":581},[213,5610,5611],{"class":243},"                    cartId: ",[213,5613,413],{"class":386},[213,5615,3678],{"class":243},[213,5617,655],{"class":239},[213,5619,244],{"class":243},[213,5621,5622],{"class":247},"'internalid'",[213,5624,1931],{"class":243},[213,5626,5627],{"class":215,"line":594},[213,5628,5629],{"class":243},"                })\n",[213,5631,5632,5635,5637,5639,5641,5643,5646],{"class":215,"line":602},[213,5633,5634],{"class":243},"            }).",[213,5636,1939],{"class":239},[213,5638,244],{"class":243},[213,5640,276],{"class":275},[213,5642,279],{"class":243},[213,5644,5645],{"class":282},"response",[213,5647,292],{"class":243},[213,5649,5650,5652,5654,5656,5658,5660,5662],{"class":215,"line":634},[213,5651,1082],{"class":243},[213,5653,2214],{"class":239},[213,5655,244],{"class":243},[213,5657,5500],{"class":247},[213,5659,626],{"class":243},[213,5661,5525],{"class":239},[213,5663,643],{"class":243},[213,5665,5666,5668,5670,5672,5674,5676,5678],{"class":215,"line":646},[213,5667,1082],{"class":243},[213,5669,2214],{"class":239},[213,5671,244],{"class":243},[213,5673,5520],{"class":247},[213,5675,626],{"class":243},[213,5677,5505],{"class":239},[213,5679,643],{"class":243},[213,5681,5682],{"class":215,"line":673},[213,5683,233],{"emptyLinePlaceholder":232},[213,5685,5686,5688,5691],{"class":215,"line":685},[213,5687,1082],{"class":243},[213,5689,5690],{"class":239},"renderEstimates",[213,5692,5693],{"class":243},"(response.rates);\n",[213,5695,5696,5698,5701],{"class":215,"line":694},[213,5697,1082],{"class":243},[213,5699,5700],{"class":239},"renderTaxEstimate",[213,5702,5703],{"class":243},"(response.estimatedTax);\n",[213,5705,5706,5708,5710,5712,5714],{"class":215,"line":699},[213,5707,5634],{"class":243},[213,5709,990],{"class":239},[213,5711,244],{"class":243},[213,5713,276],{"class":275},[213,5715,591],{"class":243},[213,5717,5718,5720,5722,5724,5726,5728,5730],{"class":215,"line":705},[213,5719,1082],{"class":243},[213,5721,2214],{"class":239},[213,5723,244],{"class":243},[213,5725,5500],{"class":247},[213,5727,626],{"class":243},[213,5729,5525],{"class":239},[213,5731,643],{"class":243},[213,5733,5734,5736,5738,5740,5743],{"class":215,"line":711},[213,5735,1082],{"class":243},[213,5737,2214],{"class":239},[213,5739,244],{"class":243},[213,5741,5742],{"class":247},"'.estimate-error'",[213,5744,1931],{"class":243},[213,5746,5747,5750,5753,5755,5758],{"class":215,"line":4105},[213,5748,5749],{"class":243},"                    .",[213,5751,5752],{"class":239},"text",[213,5754,244],{"class":243},[213,5756,5757],{"class":247},"'Unable to estimate. Continue to '",[213,5759,1095],{"class":275},[213,5761,5762,5765],{"class":215,"line":4111},[213,5763,5764],{"class":247},"                          'checkout for exact costs.'",[213,5766,1931],{"class":243},[213,5768,5769,5771,5773],{"class":215,"line":4117},[213,5770,5749],{"class":243},[213,5772,5505],{"class":239},[213,5774,643],{"class":243},[213,5776,5777],{"class":215,"line":4122},[213,5778,567],{"class":243},[213,5780,5781],{"class":215,"line":4128},[213,5782,573],{"class":243},[213,5784,5785],{"class":215,"line":4134},[213,5786,233],{"emptyLinePlaceholder":232},[213,5788,5789,5792,5794,5796,5798,5800],{"class":215,"line":4140},[213,5790,5791],{"class":239},"        renderEstimates",[213,5793,324],{"class":243},[213,5795,276],{"class":275},[213,5797,279],{"class":243},[213,5799,2319],{"class":282},[213,5801,292],{"class":243},[213,5803,5804,5806,5809,5811,5814,5816,5818,5820,5822,5825],{"class":215,"line":4146},[213,5805,1295],{"class":275},[213,5807,5808],{"class":243}," html ",[213,5810,507],{"class":275},[213,5812,5813],{"class":243}," rates.",[213,5815,3301],{"class":239},[213,5817,244],{"class":243},[213,5819,276],{"class":275},[213,5821,279],{"class":243},[213,5823,5824],{"class":282},"rate",[213,5826,292],{"class":243},[213,5828,5829,5831,5834],{"class":215,"line":4151},[213,5830,649],{"class":275},[213,5832,5833],{"class":247}," '\u003Cdiv class=\"estimate-rate\">'",[213,5835,1095],{"class":275},[213,5837,5838,5841],{"class":215,"line":4157},[213,5839,5840],{"class":247},"                    '\u003Cspan class=\"rate-name\">'",[213,5842,1095],{"class":275},[213,5844,5845,5848,5850,5853],{"class":215,"line":4163},[213,5846,5847],{"class":243},"                        rate.name ",[213,5849,3360],{"class":275},[213,5851,5852],{"class":247}," '\u003C\u002Fspan>'",[213,5854,1095],{"class":275},[213,5856,5857,5860],{"class":215,"line":4169},[213,5858,5859],{"class":247},"                    '\u003Cspan class=\"rate-price\">'",[213,5861,1095],{"class":275},[213,5863,5864,5867,5870,5873,5876],{"class":215,"line":4175},[213,5865,5866],{"class":386},"                        SC",[213,5868,5869],{"class":243},".Utils.",[213,5871,5872],{"class":239},"formatCurrency",[213,5874,5875],{"class":243},"(rate.price) ",[213,5877,5878],{"class":275},"+\n",[213,5880,5881,5884],{"class":215,"line":4181},[213,5882,5883],{"class":247},"                    '\u003C\u002Fspan>'",[213,5885,1095],{"class":275},[213,5887,5888,5891],{"class":215,"line":4186},[213,5889,5890],{"class":247},"                    '\u003Cspan class=\"rate-delivery\">'",[213,5892,1095],{"class":275},[213,5894,5896,5899,5901,5904],{"class":215,"line":5895},62,[213,5897,5898],{"class":243},"                        rate.estimatedDays ",[213,5900,3360],{"class":275},[213,5902,5903],{"class":247}," ' business days'",[213,5905,1095],{"class":275},[213,5907,5909,5911],{"class":215,"line":5908},63,[213,5910,5883],{"class":247},[213,5912,1095],{"class":275},[213,5914,5916,5919],{"class":215,"line":5915},64,[213,5917,5918],{"class":247},"                '\u003C\u002Fdiv>'",[213,5920,301],{"class":243},[213,5922,5924,5926,5929,5931,5934],{"class":215,"line":5923},65,[213,5925,5634],{"class":243},[213,5927,5928],{"class":239},"join",[213,5930,244],{"class":243},[213,5932,5933],{"class":247},"''",[213,5935,1136],{"class":243},[213,5937,5939],{"class":215,"line":5938},66,[213,5940,233],{"emptyLinePlaceholder":232},[213,5942,5944,5946,5948,5950,5952,5955,5957,5959],{"class":215,"line":5943},67,[213,5945,3675],{"class":386},[213,5947,390],{"class":243},[213,5949,2214],{"class":239},[213,5951,244],{"class":243},[213,5953,5954],{"class":247},"'.estimate-rates'",[213,5956,626],{"class":243},[213,5958,4297],{"class":239},[213,5960,5961],{"class":243},"(html);\n",[213,5963,5965],{"class":215,"line":5964},68,[213,5966,702],{"class":243},[213,5968,5970],{"class":215,"line":5969},69,[213,5971,3450],{"class":243},[213,5973,5975],{"class":215,"line":5974},70,[213,5976,714],{"class":243},[15,5978,5979],{},"The backend SuiteScript service:",[203,5981,5983],{"className":205,"code":5982,"language":207,"meta":208,"style":208},"\u002F**\n * @NApiVersion 2.1\n * @NScriptType Suitelet\n * @NModuleScope SameAccount\n *\n * Shipping rate estimation service\n *\u002F\ndefine(['N\u002Frecord', 'N\u002Fsearch', 'N\u002Fruntime'], function (record, search, runtime) {\n\n    function onRequest(context) {\n        if (context.request.method !== 'POST') {\n            context.response.write(JSON.stringify({\n                error: 'Method not allowed'\n            }));\n            return;\n        }\n\n        var body = JSON.parse(context.request.body);\n        var zip = body.zip;\n        var country = body.country;\n\n        \u002F\u002F Look up shipping rates based on zone\u002Fweight\n        var rates = getShippingRates(zip, country);\n        var estimatedTax = estimateTax(zip, country);\n\n        context.response.write(JSON.stringify({\n            rates: rates,\n            estimatedTax: estimatedTax\n        }));\n    }\n\n    function getShippingRates(zip, country) {\n        \u002F\u002F Query shipping items and calculate rates\n        var results = [];\n        var shipSearch = search.create({\n            type: search.Type.SHIP_ITEM,\n            filters: [\n                ['isinactive', 'is', 'F']\n            ],\n            columns: [\n                'itemid',\n                'displayname',\n                'rate'\n            ]\n        });\n\n        shipSearch.run().each(function (result) {\n            results.push({\n                name: result.getValue('displayname')\n                    || result.getValue('itemid'),\n                price: parseFloat(result.getValue('rate')) || 0,\n                estimatedDays: estimateDeliveryDays(\n                    result.getValue('itemid'), zip\n                )\n            });\n            return true;\n        });\n\n        return results;\n    }\n\n    return { onRequest: onRequest };\n});\n",[210,5984,5985,5990,6001,6011,6021,6026,6031,6036,6077,6081,6095,6110,6128,6136,6141,6147,6151,6155,6175,6186,6197,6201,6206,6221,6235,6239,6256,6261,6266,6271,6275,6279,6296,6301,6312,6329,6339,6344,6365,6370,6375,6382,6389,6394,6399,6403,6407,6432,6441,6456,6474,6501,6511,6525,6529,6533,6541,6545,6549,6556,6560,6564,6571],{"__ignoreMap":208},[213,5986,5987],{"class":215,"line":216},[213,5988,5989],{"class":219},"\u002F**\n",[213,5991,5992,5995,5998],{"class":215,"line":223},[213,5993,5994],{"class":219}," * ",[213,5996,5997],{"class":275},"@NApiVersion",[213,5999,6000],{"class":219}," 2.1\n",[213,6002,6003,6005,6008],{"class":215,"line":229},[213,6004,5994],{"class":219},[213,6006,6007],{"class":275},"@NScriptType",[213,6009,6010],{"class":219}," Suitelet\n",[213,6012,6013,6015,6018],{"class":215,"line":236},[213,6014,5994],{"class":219},[213,6016,6017],{"class":275},"@NModuleScope",[213,6019,6020],{"class":219}," SameAccount\n",[213,6022,6023],{"class":215,"line":254},[213,6024,6025],{"class":219}," *\n",[213,6027,6028],{"class":215,"line":263},[213,6029,6030],{"class":219}," * Shipping rate estimation service\n",[213,6032,6033],{"class":215,"line":269},[213,6034,6035],{"class":219}," *\u002F\n",[213,6037,6038,6040,6043,6046,6048,6051,6053,6056,6058,6060,6062,6065,6067,6070,6072,6075],{"class":215,"line":295},[213,6039,240],{"class":239},[213,6041,6042],{"class":243},"([",[213,6044,6045],{"class":247},"'N\u002Frecord'",[213,6047,286],{"class":243},[213,6049,6050],{"class":247},"'N\u002Fsearch'",[213,6052,286],{"class":243},[213,6054,6055],{"class":247},"'N\u002Fruntime'",[213,6057,272],{"class":243},[213,6059,276],{"class":275},[213,6061,279],{"class":243},[213,6063,6064],{"class":282},"record",[213,6066,286],{"class":243},[213,6068,6069],{"class":282},"search",[213,6071,286],{"class":243},[213,6073,6074],{"class":282},"runtime",[213,6076,292],{"class":243},[213,6078,6079],{"class":215,"line":304},[213,6080,233],{"emptyLinePlaceholder":232},[213,6082,6083,6085,6088,6090,6093],{"class":215,"line":309},[213,6084,894],{"class":275},[213,6086,6087],{"class":239}," onRequest",[213,6089,244],{"class":243},[213,6091,6092],{"class":282},"context",[213,6094,292],{"class":243},[213,6096,6097,6099,6102,6105,6108],{"class":215,"line":318},[213,6098,1829],{"class":275},[213,6100,6101],{"class":243}," (context.request.method ",[213,6103,6104],{"class":275},"!==",[213,6106,6107],{"class":247}," 'POST'",[213,6109,292],{"class":243},[213,6111,6112,6115,6118,6120,6122,6124,6126],{"class":215,"line":346},[213,6113,6114],{"class":243},"            context.response.",[213,6116,6117],{"class":239},"write",[213,6119,244],{"class":243},[213,6121,5589],{"class":386},[213,6123,390],{"class":243},[213,6125,5594],{"class":239},[213,6127,527],{"class":243},[213,6129,6130,6133],{"class":215,"line":352},[213,6131,6132],{"class":243},"                error: ",[213,6134,6135],{"class":247},"'Method not allowed'\n",[213,6137,6138],{"class":215,"line":361},[213,6139,6140],{"class":243},"            }));\n",[213,6142,6143,6145],{"class":215,"line":380},[213,6144,978],{"class":275},[213,6146,301],{"class":243},[213,6148,6149],{"class":215,"line":407},[213,6150,702],{"class":243},[213,6152,6153],{"class":215,"line":424},[213,6154,233],{"emptyLinePlaceholder":232},[213,6156,6157,6159,6162,6164,6167,6169,6172],{"class":215,"line":440},[213,6158,911],{"class":275},[213,6160,6161],{"class":243}," body ",[213,6163,507],{"class":275},[213,6165,6166],{"class":386}," JSON",[213,6168,390],{"class":243},[213,6170,6171],{"class":239},"parse",[213,6173,6174],{"class":243},"(context.request.body);\n",[213,6176,6177,6179,6181,6183],{"class":215,"line":446},[213,6178,911],{"class":275},[213,6180,2185],{"class":243},[213,6182,507],{"class":275},[213,6184,6185],{"class":243}," body.zip;\n",[213,6187,6188,6190,6192,6194],{"class":215,"line":451},[213,6189,911],{"class":275},[213,6191,2205],{"class":243},[213,6193,507],{"class":275},[213,6195,6196],{"class":243}," body.country;\n",[213,6198,6199],{"class":215,"line":467},[213,6200,233],{"emptyLinePlaceholder":232},[213,6202,6203],{"class":215,"line":473},[213,6204,6205],{"class":219},"        \u002F\u002F Look up shipping rates based on zone\u002Fweight\n",[213,6207,6208,6210,6213,6215,6218],{"class":215,"line":479},[213,6209,911],{"class":275},[213,6211,6212],{"class":243}," rates ",[213,6214,507],{"class":275},[213,6216,6217],{"class":239}," getShippingRates",[213,6219,6220],{"class":243},"(zip, country);\n",[213,6222,6223,6225,6228,6230,6233],{"class":215,"line":484},[213,6224,911],{"class":275},[213,6226,6227],{"class":243}," estimatedTax ",[213,6229,507],{"class":275},[213,6231,6232],{"class":239}," estimateTax",[213,6234,6220],{"class":243},[213,6236,6237],{"class":215,"line":490},[213,6238,233],{"emptyLinePlaceholder":232},[213,6240,6241,6244,6246,6248,6250,6252,6254],{"class":215,"line":495},[213,6242,6243],{"class":243},"        context.response.",[213,6245,6117],{"class":239},[213,6247,244],{"class":243},[213,6249,5589],{"class":386},[213,6251,390],{"class":243},[213,6253,5594],{"class":239},[213,6255,527],{"class":243},[213,6257,6258],{"class":215,"line":501},[213,6259,6260],{"class":243},"            rates: rates,\n",[213,6262,6263],{"class":215,"line":518},[213,6264,6265],{"class":243},"            estimatedTax: estimatedTax\n",[213,6267,6268],{"class":215,"line":530},[213,6269,6270],{"class":243},"        }));\n",[213,6272,6273],{"class":215,"line":541},[213,6274,1131],{"class":243},[213,6276,6277],{"class":215,"line":547},[213,6278,233],{"emptyLinePlaceholder":232},[213,6280,6281,6283,6285,6287,6289,6291,6294],{"class":215,"line":553},[213,6282,894],{"class":275},[213,6284,6217],{"class":239},[213,6286,244],{"class":243},[213,6288,4971],{"class":282},[213,6290,286],{"class":243},[213,6292,6293],{"class":282},"country",[213,6295,292],{"class":243},[213,6297,6298],{"class":215,"line":564},[213,6299,6300],{"class":219},"        \u002F\u002F Query shipping items and calculate rates\n",[213,6302,6303,6305,6308,6310],{"class":215,"line":570},[213,6304,911],{"class":275},[213,6306,6307],{"class":243}," results ",[213,6309,507],{"class":275},[213,6311,515],{"class":243},[213,6313,6314,6316,6319,6321,6324,6327],{"class":215,"line":576},[213,6315,911],{"class":275},[213,6317,6318],{"class":243}," shipSearch ",[213,6320,507],{"class":275},[213,6322,6323],{"class":243}," search.",[213,6325,6326],{"class":239},"create",[213,6328,527],{"class":243},[213,6330,6331,6334,6337],{"class":215,"line":581},[213,6332,6333],{"class":243},"            type: search.Type.",[213,6335,6336],{"class":386},"SHIP_ITEM",[213,6338,260],{"class":243},[213,6340,6341],{"class":215,"line":594},[213,6342,6343],{"class":243},"            filters: [\n",[213,6345,6346,6349,6352,6354,6357,6359,6362],{"class":215,"line":602},[213,6347,6348],{"class":243},"                [",[213,6350,6351],{"class":247},"'isinactive'",[213,6353,286],{"class":243},[213,6355,6356],{"class":247},"'is'",[213,6358,286],{"class":243},[213,6360,6361],{"class":247},"'F'",[213,6363,6364],{"class":243},"]\n",[213,6366,6367],{"class":215,"line":634},[213,6368,6369],{"class":243},"            ],\n",[213,6371,6372],{"class":215,"line":646},[213,6373,6374],{"class":243},"            columns: [\n",[213,6376,6377,6380],{"class":215,"line":673},[213,6378,6379],{"class":247},"                'itemid'",[213,6381,260],{"class":243},[213,6383,6384,6387],{"class":215,"line":685},[213,6385,6386],{"class":247},"                'displayname'",[213,6388,260],{"class":243},[213,6390,6391],{"class":215,"line":694},[213,6392,6393],{"class":247},"                'rate'\n",[213,6395,6396],{"class":215,"line":699},[213,6397,6398],{"class":243},"            ]\n",[213,6400,6401],{"class":215,"line":705},[213,6402,2372],{"class":243},[213,6404,6405],{"class":215,"line":711},[213,6406,233],{"emptyLinePlaceholder":232},[213,6408,6409,6412,6415,6418,6421,6423,6425,6427,6430],{"class":215,"line":4105},[213,6410,6411],{"class":243},"        shipSearch.",[213,6413,6414],{"class":239},"run",[213,6416,6417],{"class":243},"().",[213,6419,6420],{"class":239},"each",[213,6422,244],{"class":243},[213,6424,276],{"class":275},[213,6426,279],{"class":243},[213,6428,6429],{"class":282},"result",[213,6431,292],{"class":243},[213,6433,6434,6437,6439],{"class":215,"line":4111},[213,6435,6436],{"class":243},"            results.",[213,6438,524],{"class":239},[213,6440,527],{"class":243},[213,6442,6443,6446,6449,6451,6454],{"class":215,"line":4117},[213,6444,6445],{"class":243},"                name: result.",[213,6447,6448],{"class":239},"getValue",[213,6450,244],{"class":243},[213,6452,6453],{"class":247},"'displayname'",[213,6455,1931],{"class":243},[213,6457,6458,6461,6464,6466,6468,6471],{"class":215,"line":4122},[213,6459,6460],{"class":275},"                    ||",[213,6462,6463],{"class":243}," result.",[213,6465,6448],{"class":239},[213,6467,244],{"class":243},[213,6469,6470],{"class":247},"'itemid'",[213,6472,6473],{"class":243},"),\n",[213,6475,6476,6479,6482,6485,6487,6489,6492,6495,6497,6499],{"class":215,"line":4128},[213,6477,6478],{"class":243},"                price: ",[213,6480,6481],{"class":239},"parseFloat",[213,6483,6484],{"class":243},"(result.",[213,6486,6448],{"class":239},[213,6488,244],{"class":243},[213,6490,6491],{"class":247},"'rate'",[213,6493,6494],{"class":243},")) ",[213,6496,399],{"class":275},[213,6498,668],{"class":386},[213,6500,260],{"class":243},[213,6502,6503,6506,6509],{"class":215,"line":4134},[213,6504,6505],{"class":243},"                estimatedDays: ",[213,6507,6508],{"class":239},"estimateDeliveryDays",[213,6510,877],{"class":243},[213,6512,6513,6516,6518,6520,6522],{"class":215,"line":4140},[213,6514,6515],{"class":243},"                    result.",[213,6517,6448],{"class":239},[213,6519,244],{"class":243},[213,6521,6470],{"class":247},[213,6523,6524],{"class":243},"), zip\n",[213,6526,6527],{"class":215,"line":4146},[213,6528,3437],{"class":243},[213,6530,6531],{"class":215,"line":4151},[213,6532,567],{"class":243},[213,6534,6535,6537,6539],{"class":215,"line":4157},[213,6536,978],{"class":275},[213,6538,3835],{"class":386},[213,6540,301],{"class":243},[213,6542,6543],{"class":215,"line":4163},[213,6544,2372],{"class":243},[213,6546,6547],{"class":215,"line":4169},[213,6548,233],{"emptyLinePlaceholder":232},[213,6550,6551,6553],{"class":215,"line":4175},[213,6552,1122],{"class":275},[213,6554,6555],{"class":243}," results;\n",[213,6557,6558],{"class":215,"line":4181},[213,6559,1131],{"class":243},[213,6561,6562],{"class":215,"line":4186},[213,6563,233],{"emptyLinePlaceholder":232},[213,6565,6566,6568],{"class":215,"line":5895},[213,6567,312],{"class":275},[213,6569,6570],{"class":243}," { onRequest: onRequest };\n",[213,6572,6573],{"class":215,"line":5908},[213,6574,714],{"class":243},[195,6576,6578],{"id":6577},"display-a-running-total","Display a Running Total",[15,6580,6581],{},"Show a mini order summary that updates in real time as customers progress through checkout. Include estimated shipping and tax from the earliest possible step:",[203,6583,6585],{"className":1538,"code":6584,"language":1540,"meta":208,"style":208},"{{!-- Persistent mini summary visible at every checkout step --}}\n\u003Cdiv class=\"checkout-mini-summary\">\n    \u003Cdiv class=\"summary-line\">\n        \u003Cspan>{{translate 'Subtotal'}} ({{itemCount}} {{translate 'items'}})\u003C\u002Fspan>\n        \u003Cspan>{{formatCurrency subtotal}}\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    {{#if estimatedShipping}}\n    \u003Cdiv class=\"summary-line\">\n        \u003Cspan>{{translate 'Shipping'}}\u003C\u002Fspan>\n        \u003Cspan>{{formatCurrency estimatedShipping}}\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    {{else}}\n    \u003Cdiv class=\"summary-line summary-estimate\">\n        \u003Cspan>{{translate 'Shipping'}}\u003C\u002Fspan>\n        \u003Cspan>{{translate 'Calculated at next step'}}\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    {{\u002Fif}}\n    {{#if estimatedTax}}\n    \u003Cdiv class=\"summary-line\">\n        \u003Cspan>{{translate 'Est. Tax'}}\u003C\u002Fspan>\n        \u003Cspan>{{formatCurrency estimatedTax}}\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    {{\u002Fif}}\n    \u003Cdiv class=\"summary-line summary-total\">\n        \u003Cspan>{{translate 'Estimated Total'}}\u003C\u002Fspan>\n        \u003Cspan>{{formatCurrency estimatedTotal}}\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n",[210,6586,6587,6592,6597,6602,6607,6612,6616,6621,6625,6630,6635,6639,6644,6649,6653,6658,6662,6667,6672,6676,6681,6686,6690,6694,6699,6704,6709,6713],{"__ignoreMap":208},[213,6588,6589],{"class":215,"line":216},[213,6590,6591],{},"{{!-- Persistent mini summary visible at every checkout step --}}\n",[213,6593,6594],{"class":215,"line":223},[213,6595,6596],{},"\u003Cdiv class=\"checkout-mini-summary\">\n",[213,6598,6599],{"class":215,"line":229},[213,6600,6601],{},"    \u003Cdiv class=\"summary-line\">\n",[213,6603,6604],{"class":215,"line":236},[213,6605,6606],{},"        \u003Cspan>{{translate 'Subtotal'}} ({{itemCount}} {{translate 'items'}})\u003C\u002Fspan>\n",[213,6608,6609],{"class":215,"line":254},[213,6610,6611],{},"        \u003Cspan>{{formatCurrency subtotal}}\u003C\u002Fspan>\n",[213,6613,6614],{"class":215,"line":263},[213,6615,1572],{},[213,6617,6618],{"class":215,"line":269},[213,6619,6620],{},"    {{#if estimatedShipping}}\n",[213,6622,6623],{"class":215,"line":295},[213,6624,6601],{},[213,6626,6627],{"class":215,"line":304},[213,6628,6629],{},"        \u003Cspan>{{translate 'Shipping'}}\u003C\u002Fspan>\n",[213,6631,6632],{"class":215,"line":309},[213,6633,6634],{},"        \u003Cspan>{{formatCurrency estimatedShipping}}\u003C\u002Fspan>\n",[213,6636,6637],{"class":215,"line":318},[213,6638,1572],{},[213,6640,6641],{"class":215,"line":346},[213,6642,6643],{},"    {{else}}\n",[213,6645,6646],{"class":215,"line":352},[213,6647,6648],{},"    \u003Cdiv class=\"summary-line summary-estimate\">\n",[213,6650,6651],{"class":215,"line":361},[213,6652,6629],{},[213,6654,6655],{"class":215,"line":380},[213,6656,6657],{},"        \u003Cspan>{{translate 'Calculated at next step'}}\u003C\u002Fspan>\n",[213,6659,6660],{"class":215,"line":407},[213,6661,1572],{},[213,6663,6664],{"class":215,"line":424},[213,6665,6666],{},"    {{\u002Fif}}\n",[213,6668,6669],{"class":215,"line":440},[213,6670,6671],{},"    {{#if estimatedTax}}\n",[213,6673,6674],{"class":215,"line":446},[213,6675,6601],{},[213,6677,6678],{"class":215,"line":451},[213,6679,6680],{},"        \u003Cspan>{{translate 'Est. Tax'}}\u003C\u002Fspan>\n",[213,6682,6683],{"class":215,"line":467},[213,6684,6685],{},"        \u003Cspan>{{formatCurrency estimatedTax}}\u003C\u002Fspan>\n",[213,6687,6688],{"class":215,"line":473},[213,6689,1572],{},[213,6691,6692],{"class":215,"line":479},[213,6693,6666],{},[213,6695,6696],{"class":215,"line":484},[213,6697,6698],{},"    \u003Cdiv class=\"summary-line summary-total\">\n",[213,6700,6701],{"class":215,"line":490},[213,6702,6703],{},"        \u003Cspan>{{translate 'Estimated Total'}}\u003C\u002Fspan>\n",[213,6705,6706],{"class":215,"line":495},[213,6707,6708],{},"        \u003Cspan>{{formatCurrency estimatedTotal}}\u003C\u002Fspan>\n",[213,6710,6711],{"class":215,"line":501},[213,6712,1572],{},[213,6714,6715],{"class":215,"line":518},[213,6716,1611],{},[15,6718,6719],{},"No surprises means fewer abandonments.",[29,6721],{},[32,6723,94],{"id":6724},"ab-testing-checkout-changes-in-suitecommerce",[15,6726,6727],{},[2540,6728],{"alt":6729,"src":6730},"Checkout conversion optimization","\u002Fimages\u002Fblog\u002Fsuitecommerce-checkout-conversion.webp",[15,6732,6733],{},"Don't guess. Test. Here's how to implement checkout A\u002FB testing without a third-party tool.",[195,6735,6737],{"id":6736},"simple-client-side-split-testing","Simple Client-Side Split Testing",[203,6739,6741],{"className":205,"code":6740,"language":207,"meta":208,"style":208},"\u002F\u002F Lightweight checkout A\u002FB testing framework\ndefine('Stenbase.CheckoutABTest', [\n    'underscore',\n    'jQuery'\n], function (_, jQuery) {\n    'use strict';\n\n    var ABTest = {\n        getVariant: function (testName, variants) {\n            \u002F\u002F Check for existing assignment\n            var stored = localStorage.getItem('ab_' + testName);\n            if (stored && variants.indexOf(stored) !== -1) {\n                return stored;\n            }\n\n            \u002F\u002F Assign variant based on hash for consistency\n            var hash = this.hashString(\n                testName + '_' + this.getVisitorId()\n            );\n            var index = Math.abs(hash) % variants.length;\n            var variant = variants[index];\n\n            localStorage.setItem('ab_' + testName, variant);\n\n            \u002F\u002F Track assignment\n            if (window.dataLayer) {\n                window.dataLayer.push({\n                    event: 'ab_test_assignment',\n                    test_name: testName,\n                    variant: variant\n                });\n            }\n\n            return variant;\n        },\n\n        getVisitorId: function () {\n            var id = localStorage.getItem('visitor_id');\n            if (!id) {\n                id = 'v_' + Date.now() + '_' +\n                     Math.random().toString(36).substr(2, 9);\n                localStorage.setItem('visitor_id', id);\n            }\n            return id;\n        },\n\n        hashString: function (str) {\n            var hash = 0;\n            for (var i = 0; i \u003C str.length; i++) {\n                var char = str.charCodeAt(i);\n                hash = ((hash \u003C\u003C 5) - hash) + char;\n                hash = hash & hash;\n            }\n            return hash;\n        },\n\n        trackConversion: function (testName) {\n            var variant = localStorage.getItem('ab_' + testName);\n            if (variant && window.dataLayer) {\n                window.dataLayer.push({\n                    event: 'ab_test_conversion',\n                    test_name: testName,\n                    variant: variant\n                });\n            }\n        }\n    };\n\n    return ABTest;\n});\n",[210,6742,6743,6748,6759,6765,6769,6785,6791,6795,6806,6827,6832,6857,6884,6891,6895,6899,6904,6922,6943,6947,6973,6985,6989,7006,7010,7015,7021,7029,7038,7043,7048,7052,7056,7060,7067,7071,7075,7086,7106,7117,7142,7176,7190,7194,7201,7205,7209,7225,7237,7270,7287,7314,7328,7332,7338,7342,7346,7361,7381,7393,7401,7410,7414,7418,7422,7426,7430,7434,7438,7445],{"__ignoreMap":208},[213,6744,6745],{"class":215,"line":216},[213,6746,6747],{"class":219},"\u002F\u002F Lightweight checkout A\u002FB testing framework\n",[213,6749,6750,6752,6754,6757],{"class":215,"line":223},[213,6751,240],{"class":239},[213,6753,244],{"class":243},[213,6755,6756],{"class":247},"'Stenbase.CheckoutABTest'",[213,6758,251],{"class":243},[213,6760,6761,6763],{"class":215,"line":229},[213,6762,1671],{"class":247},[213,6764,260],{"class":243},[213,6766,6767],{"class":215,"line":236},[213,6768,1678],{"class":247},[213,6770,6771,6773,6775,6777,6779,6781,6783],{"class":215,"line":254},[213,6772,272],{"class":243},[213,6774,276],{"class":275},[213,6776,279],{"class":243},[213,6778,289],{"class":282},[213,6780,286],{"class":243},[213,6782,1698],{"class":282},[213,6784,292],{"class":243},[213,6786,6787,6789],{"class":215,"line":263},[213,6788,298],{"class":247},[213,6790,301],{"class":243},[213,6792,6793],{"class":215,"line":269},[213,6794,233],{"emptyLinePlaceholder":232},[213,6796,6797,6799,6802,6804],{"class":215,"line":295},[213,6798,1715],{"class":275},[213,6800,6801],{"class":243}," ABTest ",[213,6803,507],{"class":275},[213,6805,315],{"class":243},[213,6807,6808,6811,6813,6815,6817,6820,6822,6825],{"class":215,"line":304},[213,6809,6810],{"class":239},"        getVariant",[213,6812,324],{"class":243},[213,6814,276],{"class":275},[213,6816,279],{"class":243},[213,6818,6819],{"class":282},"testName",[213,6821,286],{"class":243},[213,6823,6824],{"class":282},"variants",[213,6826,292],{"class":243},[213,6828,6829],{"class":215,"line":309},[213,6830,6831],{"class":219},"            \u002F\u002F Check for existing assignment\n",[213,6833,6834,6836,6839,6841,6844,6847,6849,6852,6854],{"class":215,"line":318},[213,6835,1295],{"class":275},[213,6837,6838],{"class":243}," stored ",[213,6840,507],{"class":275},[213,6842,6843],{"class":243}," localStorage.",[213,6845,6846],{"class":239},"getItem",[213,6848,244],{"class":243},[213,6850,6851],{"class":247},"'ab_'",[213,6853,1050],{"class":275},[213,6855,6856],{"class":243}," testName);\n",[213,6858,6859,6861,6864,6866,6869,6872,6875,6877,6880,6882],{"class":215,"line":346},[213,6860,355],{"class":275},[213,6862,6863],{"class":243}," (stored ",[213,6865,1017],{"class":275},[213,6867,6868],{"class":243}," variants.",[213,6870,6871],{"class":239},"indexOf",[213,6873,6874],{"class":243},"(stored) ",[213,6876,6104],{"class":275},[213,6878,6879],{"class":275}," -",[213,6881,745],{"class":386},[213,6883,292],{"class":243},[213,6885,6886,6888],{"class":215,"line":352},[213,6887,649],{"class":275},[213,6889,6890],{"class":243}," stored;\n",[213,6892,6893],{"class":215,"line":361},[213,6894,487],{"class":243},[213,6896,6897],{"class":215,"line":380},[213,6898,233],{"emptyLinePlaceholder":232},[213,6900,6901],{"class":215,"line":407},[213,6902,6903],{"class":219},"            \u002F\u002F Assign variant based on hash for consistency\n",[213,6905,6906,6908,6911,6913,6915,6917,6920],{"class":215,"line":424},[213,6907,1295],{"class":275},[213,6909,6910],{"class":243}," hash ",[213,6912,507],{"class":275},[213,6914,919],{"class":386},[213,6916,390],{"class":243},[213,6918,6919],{"class":239},"hashString",[213,6921,877],{"class":243},[213,6923,6924,6927,6929,6932,6934,6936,6938,6941],{"class":215,"line":440},[213,6925,6926],{"class":243},"                testName ",[213,6928,3360],{"class":275},[213,6930,6931],{"class":247}," '_'",[213,6933,1050],{"class":275},[213,6935,919],{"class":386},[213,6937,390],{"class":243},[213,6939,6940],{"class":239},"getVisitorId",[213,6942,437],{"class":243},[213,6944,6945],{"class":215,"line":446},[213,6946,1379],{"class":243},[213,6948,6949,6951,6954,6956,6959,6962,6965,6967,6969,6971],{"class":215,"line":451},[213,6950,1295],{"class":275},[213,6952,6953],{"class":243}," index ",[213,6955,507],{"class":275},[213,6957,6958],{"class":243}," Math.",[213,6960,6961],{"class":239},"abs",[213,6963,6964],{"class":243},"(hash) ",[213,6966,2762],{"class":275},[213,6968,6868],{"class":243},[213,6970,2245],{"class":386},[213,6972,301],{"class":243},[213,6974,6975,6977,6980,6982],{"class":215,"line":467},[213,6976,1295],{"class":275},[213,6978,6979],{"class":243}," variant ",[213,6981,507],{"class":275},[213,6983,6984],{"class":243}," variants[index];\n",[213,6986,6987],{"class":215,"line":473},[213,6988,233],{"emptyLinePlaceholder":232},[213,6990,6991,6994,6997,6999,7001,7003],{"class":215,"line":479},[213,6992,6993],{"class":243},"            localStorage.",[213,6995,6996],{"class":239},"setItem",[213,6998,244],{"class":243},[213,7000,6851],{"class":247},[213,7002,1050],{"class":275},[213,7004,7005],{"class":243}," testName, variant);\n",[213,7007,7008],{"class":215,"line":484},[213,7009,233],{"emptyLinePlaceholder":232},[213,7011,7012],{"class":215,"line":490},[213,7013,7014],{"class":219},"            \u002F\u002F Track assignment\n",[213,7016,7017,7019],{"class":215,"line":495},[213,7018,355],{"class":275},[213,7020,3708],{"class":243},[213,7022,7023,7025,7027],{"class":215,"line":501},[213,7024,3713],{"class":243},[213,7026,524],{"class":239},[213,7028,527],{"class":243},[213,7030,7031,7033,7036],{"class":215,"line":518},[213,7032,3722],{"class":243},[213,7034,7035],{"class":247},"'ab_test_assignment'",[213,7037,260],{"class":243},[213,7039,7040],{"class":215,"line":530},[213,7041,7042],{"class":243},"                    test_name: testName,\n",[213,7044,7045],{"class":215,"line":541},[213,7046,7047],{"class":243},"                    variant: variant\n",[213,7049,7050],{"class":215,"line":547},[213,7051,443],{"class":243},[213,7053,7054],{"class":215,"line":553},[213,7055,487],{"class":243},[213,7057,7058],{"class":215,"line":564},[213,7059,233],{"emptyLinePlaceholder":232},[213,7061,7062,7064],{"class":215,"line":570},[213,7063,978],{"class":275},[213,7065,7066],{"class":243}," variant;\n",[213,7068,7069],{"class":215,"line":576},[213,7070,573],{"class":243},[213,7072,7073],{"class":215,"line":581},[213,7074,233],{"emptyLinePlaceholder":232},[213,7076,7077,7080,7082,7084],{"class":215,"line":594},[213,7078,7079],{"class":239},"        getVisitorId",[213,7081,324],{"class":243},[213,7083,276],{"class":275},[213,7085,591],{"class":243},[213,7087,7088,7090,7093,7095,7097,7099,7101,7104],{"class":215,"line":602},[213,7089,1295],{"class":275},[213,7091,7092],{"class":243}," id ",[213,7094,507],{"class":275},[213,7096,6843],{"class":243},[213,7098,6846],{"class":239},[213,7100,244],{"class":243},[213,7102,7103],{"class":247},"'visitor_id'",[213,7105,1136],{"class":243},[213,7107,7108,7110,7112,7114],{"class":215,"line":634},[213,7109,355],{"class":275},[213,7111,279],{"class":243},[213,7113,4264],{"class":275},[213,7115,7116],{"class":243},"id) {\n",[213,7118,7119,7122,7124,7127,7129,7131,7133,7136,7138,7140],{"class":215,"line":646},[213,7120,7121],{"class":243},"                id ",[213,7123,507],{"class":275},[213,7125,7126],{"class":247}," 'v_'",[213,7128,1050],{"class":275},[213,7130,1819],{"class":243},[213,7132,1822],{"class":239},[213,7134,7135],{"class":243},"() ",[213,7137,3360],{"class":275},[213,7139,6931],{"class":247},[213,7141,1095],{"class":275},[213,7143,7144,7147,7150,7152,7155,7157,7160,7162,7165,7167,7169,7171,7174],{"class":215,"line":673},[213,7145,7146],{"class":243},"                     Math.",[213,7148,7149],{"class":239},"random",[213,7151,6417],{"class":243},[213,7153,7154],{"class":239},"toString",[213,7156,244],{"class":243},[213,7158,7159],{"class":386},"36",[213,7161,626],{"class":243},[213,7163,7164],{"class":239},"substr",[213,7166,244],{"class":243},[213,7168,756],{"class":386},[213,7170,286],{"class":243},[213,7172,7173],{"class":386},"9",[213,7175,1136],{"class":243},[213,7177,7178,7181,7183,7185,7187],{"class":215,"line":685},[213,7179,7180],{"class":243},"                localStorage.",[213,7182,6996],{"class":239},[213,7184,244],{"class":243},[213,7186,7103],{"class":247},[213,7188,7189],{"class":243},", id);\n",[213,7191,7192],{"class":215,"line":694},[213,7193,487],{"class":243},[213,7195,7196,7198],{"class":215,"line":699},[213,7197,978],{"class":275},[213,7199,7200],{"class":243}," id;\n",[213,7202,7203],{"class":215,"line":705},[213,7204,573],{"class":243},[213,7206,7207],{"class":215,"line":711},[213,7208,233],{"emptyLinePlaceholder":232},[213,7210,7211,7214,7216,7218,7220,7223],{"class":215,"line":4105},[213,7212,7213],{"class":239},"        hashString",[213,7215,324],{"class":243},[213,7217,276],{"class":275},[213,7219,279],{"class":243},[213,7221,7222],{"class":282},"str",[213,7224,292],{"class":243},[213,7226,7227,7229,7231,7233,7235],{"class":215,"line":4111},[213,7228,1295],{"class":275},[213,7230,6910],{"class":243},[213,7232,507],{"class":275},[213,7234,668],{"class":386},[213,7236,301],{"class":243},[213,7238,7239,7242,7244,7246,7249,7251,7253,7256,7258,7261,7263,7266,7268],{"class":215,"line":4117},[213,7240,7241],{"class":275},"            for",[213,7243,279],{"class":243},[213,7245,4569],{"class":275},[213,7247,7248],{"class":243}," i ",[213,7250,507],{"class":275},[213,7252,668],{"class":386},[213,7254,7255],{"class":243},"; i ",[213,7257,1012],{"class":275},[213,7259,7260],{"class":243}," str.",[213,7262,2245],{"class":386},[213,7264,7265],{"class":243},"; i",[213,7267,971],{"class":275},[213,7269,292],{"class":243},[213,7271,7272,7274,7277,7279,7281,7284],{"class":215,"line":4122},[213,7273,605],{"class":275},[213,7275,7276],{"class":243}," char ",[213,7278,507],{"class":275},[213,7280,7260],{"class":243},[213,7282,7283],{"class":239},"charCodeAt",[213,7285,7286],{"class":243},"(i);\n",[213,7288,7289,7292,7294,7297,7300,7302,7304,7306,7309,7311],{"class":215,"line":4128},[213,7290,7291],{"class":243},"                hash ",[213,7293,507],{"class":275},[213,7295,7296],{"class":243}," ((hash ",[213,7298,7299],{"class":275},"\u003C\u003C",[213,7301,2251],{"class":386},[213,7303,3416],{"class":243},[213,7305,1848],{"class":275},[213,7307,7308],{"class":243}," hash) ",[213,7310,3360],{"class":275},[213,7312,7313],{"class":243}," char;\n",[213,7315,7316,7318,7320,7322,7325],{"class":215,"line":4134},[213,7317,7291],{"class":243},[213,7319,507],{"class":275},[213,7321,6910],{"class":243},[213,7323,7324],{"class":275},"&",[213,7326,7327],{"class":243}," hash;\n",[213,7329,7330],{"class":215,"line":4140},[213,7331,487],{"class":243},[213,7333,7334,7336],{"class":215,"line":4146},[213,7335,978],{"class":275},[213,7337,7327],{"class":243},[213,7339,7340],{"class":215,"line":4151},[213,7341,573],{"class":243},[213,7343,7344],{"class":215,"line":4157},[213,7345,233],{"emptyLinePlaceholder":232},[213,7347,7348,7351,7353,7355,7357,7359],{"class":215,"line":4163},[213,7349,7350],{"class":239},"        trackConversion",[213,7352,324],{"class":243},[213,7354,276],{"class":275},[213,7356,279],{"class":243},[213,7358,6819],{"class":282},[213,7360,292],{"class":243},[213,7362,7363,7365,7367,7369,7371,7373,7375,7377,7379],{"class":215,"line":4169},[213,7364,1295],{"class":275},[213,7366,6979],{"class":243},[213,7368,507],{"class":275},[213,7370,6843],{"class":243},[213,7372,6846],{"class":239},[213,7374,244],{"class":243},[213,7376,6851],{"class":247},[213,7378,1050],{"class":275},[213,7380,6856],{"class":243},[213,7382,7383,7385,7388,7390],{"class":215,"line":4175},[213,7384,355],{"class":275},[213,7386,7387],{"class":243}," (variant ",[213,7389,1017],{"class":275},[213,7391,7392],{"class":243}," window.dataLayer) {\n",[213,7394,7395,7397,7399],{"class":215,"line":4181},[213,7396,3713],{"class":243},[213,7398,524],{"class":239},[213,7400,527],{"class":243},[213,7402,7403,7405,7408],{"class":215,"line":4186},[213,7404,3722],{"class":243},[213,7406,7407],{"class":247},"'ab_test_conversion'",[213,7409,260],{"class":243},[213,7411,7412],{"class":215,"line":5895},[213,7413,7042],{"class":243},[213,7415,7416],{"class":215,"line":5908},[213,7417,7047],{"class":243},[213,7419,7420],{"class":215,"line":5915},[213,7421,443],{"class":243},[213,7423,7424],{"class":215,"line":5923},[213,7425,487],{"class":243},[213,7427,7428],{"class":215,"line":5938},[213,7429,702],{"class":243},[213,7431,7432],{"class":215,"line":5943},[213,7433,708],{"class":243},[213,7435,7436],{"class":215,"line":5964},[213,7437,233],{"emptyLinePlaceholder":232},[213,7439,7440,7442],{"class":215,"line":5969},[213,7441,312],{"class":275},[213,7443,7444],{"class":243}," ABTest;\n",[213,7446,7447],{"class":215,"line":5974},[213,7448,714],{"class":243},[195,7450,7452],{"id":7451},"example-test-guest-checkout-vs-login-first","Example: Test Guest Checkout vs. Login-First",[203,7454,7456],{"className":205,"code":7455,"language":207,"meta":208,"style":208},"\u002F\u002F In your checkout initialization\nvar ABTest = require('Stenbase.CheckoutABTest');\n\nvar checkoutVariant = ABTest.getVariant(\n    'checkout_login_2026_q1',\n    ['guest_first', 'login_first']\n);\n\nif (checkoutVariant === 'guest_first') {\n    \u002F\u002F Show guest checkout as primary option\n    wizardSteps[0] = GuestCheckoutStep;\n} else {\n    \u002F\u002F Show traditional login-first flow\n    wizardSteps[0] = LoginFirstStep;\n}\n\n\u002F\u002F Track conversion on order confirmation\nOrderConfirmationView.prototype.initialize = _.wrap(\n    OrderConfirmationView.prototype.initialize,\n    function (originalFn) {\n        originalFn.apply(this, Array.prototype.slice.call(arguments, 1));\n        ABTest.trackConversion('checkout_login_2026_q1');\n    }\n);\n",[210,7457,7458,7463,7480,7484,7501,7508,7523,7527,7531,7546,7551,7566,7576,7581,7594,7598,7602,7607,7626,7638,7648,7684,7699,7703],{"__ignoreMap":208},[213,7459,7460],{"class":215,"line":216},[213,7461,7462],{"class":219},"\u002F\u002F In your checkout initialization\n",[213,7464,7465,7467,7469,7471,7474,7476,7478],{"class":215,"line":223},[213,7466,4569],{"class":275},[213,7468,6801],{"class":243},[213,7470,507],{"class":275},[213,7472,7473],{"class":239}," require",[213,7475,244],{"class":243},[213,7477,6756],{"class":247},[213,7479,1136],{"class":243},[213,7481,7482],{"class":215,"line":229},[213,7483,233],{"emptyLinePlaceholder":232},[213,7485,7486,7488,7491,7493,7496,7499],{"class":215,"line":236},[213,7487,4569],{"class":275},[213,7489,7490],{"class":243}," checkoutVariant ",[213,7492,507],{"class":275},[213,7494,7495],{"class":243}," ABTest.",[213,7497,7498],{"class":239},"getVariant",[213,7500,877],{"class":243},[213,7502,7503,7506],{"class":215,"line":254},[213,7504,7505],{"class":247},"    'checkout_login_2026_q1'",[213,7507,260],{"class":243},[213,7509,7510,7513,7516,7518,7521],{"class":215,"line":263},[213,7511,7512],{"class":243},"    [",[213,7514,7515],{"class":247},"'guest_first'",[213,7517,286],{"class":243},[213,7519,7520],{"class":247},"'login_first'",[213,7522,6364],{"class":243},[213,7524,7525],{"class":215,"line":269},[213,7526,1136],{"class":243},[213,7528,7529],{"class":215,"line":295},[213,7530,233],{"emptyLinePlaceholder":232},[213,7532,7533,7536,7539,7541,7544],{"class":215,"line":304},[213,7534,7535],{"class":275},"if",[213,7537,7538],{"class":243}," (checkoutVariant ",[213,7540,1023],{"class":275},[213,7542,7543],{"class":247}," 'guest_first'",[213,7545,292],{"class":243},[213,7547,7548],{"class":215,"line":309},[213,7549,7550],{"class":219},"    \u002F\u002F Show guest checkout as primary option\n",[213,7552,7553,7556,7558,7561,7563],{"class":215,"line":318},[213,7554,7555],{"class":243},"    wizardSteps[",[213,7557,1740],{"class":386},[213,7559,7560],{"class":243},"] ",[213,7562,507],{"class":275},[213,7564,7565],{"class":243}," GuestCheckoutStep;\n",[213,7567,7568,7571,7574],{"class":215,"line":346},[213,7569,7570],{"class":243},"} ",[213,7572,7573],{"class":275},"else",[213,7575,315],{"class":243},[213,7577,7578],{"class":215,"line":352},[213,7579,7580],{"class":219},"    \u002F\u002F Show traditional login-first flow\n",[213,7582,7583,7585,7587,7589,7591],{"class":215,"line":361},[213,7584,7555],{"class":243},[213,7586,1740],{"class":386},[213,7588,7560],{"class":243},[213,7590,507],{"class":275},[213,7592,7593],{"class":243}," LoginFirstStep;\n",[213,7595,7596],{"class":215,"line":380},[213,7597,2528],{"class":243},[213,7599,7600],{"class":215,"line":407},[213,7601,233],{"emptyLinePlaceholder":232},[213,7603,7604],{"class":215,"line":424},[213,7605,7606],{"class":219},"\u002F\u002F Track conversion on order confirmation\n",[213,7608,7609,7611,7613,7615,7618,7620,7622,7624],{"class":215,"line":440},[213,7610,4213],{"class":386},[213,7612,390],{"class":243},[213,7614,863],{"class":386},[213,7616,7617],{"class":243},".initialize ",[213,7619,507],{"class":275},[213,7621,871],{"class":243},[213,7623,874],{"class":239},[213,7625,877],{"class":243},[213,7627,7628,7631,7633,7635],{"class":215,"line":446},[213,7629,7630],{"class":386},"    OrderConfirmationView",[213,7632,390],{"class":243},[213,7634,863],{"class":386},[213,7636,7637],{"class":243},".initialize,\n",[213,7639,7640,7642,7644,7646],{"class":215,"line":451},[213,7641,894],{"class":275},[213,7643,279],{"class":243},[213,7645,899],{"class":282},[213,7647,292],{"class":243},[213,7649,7650,7653,7655,7657,7659,7661,7664,7666,7668,7671,7673,7675,7677,7679,7681],{"class":215,"line":467},[213,7651,7652],{"class":243},"        originalFn.",[213,7654,1919],{"class":239},[213,7656,244],{"class":243},[213,7658,413],{"class":386},[213,7660,286],{"class":243},[213,7662,7663],{"class":386},"Array",[213,7665,390],{"class":243},[213,7667,863],{"class":386},[213,7669,7670],{"class":243},".slice.",[213,7672,984],{"class":239},[213,7674,244],{"class":243},[213,7676,1928],{"class":386},[213,7678,286],{"class":243},[213,7680,745],{"class":386},[213,7682,7683],{"class":243},"));\n",[213,7685,7686,7689,7692,7694,7697],{"class":215,"line":473},[213,7687,7688],{"class":243},"        ABTest.",[213,7690,7691],{"class":239},"trackConversion",[213,7693,244],{"class":243},[213,7695,7696],{"class":247},"'checkout_login_2026_q1'",[213,7698,1136],{"class":243},[213,7700,7701],{"class":215,"line":479},[213,7702,1131],{"class":243},[213,7704,7705],{"class":215,"line":484},[213,7706,1136],{"class":243},[15,7708,7709],{},"Run each test for at least 2 weeks and 1,000 checkout attempts per variant before drawing conclusions.",[29,7711],{},[32,7713,100],{"id":7714},"measuring-checkout-performance",[15,7716,7717],{},"Track these metrics weekly to measure the impact of your optimizations:",[719,7719,7720,7733],{},[722,7721,7722],{},[725,7723,7724,7727,7730],{},[728,7725,7726],{},"Metric",[728,7728,7729],{},"How to Measure",[728,7731,7732],{},"Target",[738,7734,7735,7746,7757,7768,7779,7790],{},[725,7736,7737,7740,7743],{},[743,7738,7739],{},"Cart-to-checkout rate",[743,7741,7742],{},"Cart page views \u002F \"Proceed to Checkout\" clicks",[743,7744,7745],{},"> 55%",[725,7747,7748,7751,7754],{},[743,7749,7750],{},"Checkout completion rate",[743,7752,7753],{},"Checkout starts \u002F Order confirmations",[743,7755,7756],{},"> 45%",[725,7758,7759,7762,7765],{},[743,7760,7761],{},"Step abandonment rate",[743,7763,7764],{},"Per-step drop-off in funnel",[743,7766,7767],{},"\u003C 15% per step",[725,7769,7770,7773,7776],{},[743,7771,7772],{},"Checkout page load time",[743,7774,7775],{},"Time to Interactive on checkout pages",[743,7777,7778],{},"\u003C 3 seconds",[725,7780,7781,7784,7787],{},[743,7782,7783],{},"Payment error rate",[743,7785,7786],{},"Failed payment attempts \u002F Total attempts",[743,7788,7789],{},"\u003C 3%",[725,7791,7792,7795,7798],{},[743,7793,7794],{},"Mobile checkout rate",[743,7796,7797],{},"Mobile completions \u002F Mobile checkout starts",[743,7799,7800],{},"> 35%",[15,7802,7803],{},"Set up automated alerts for any metric that degrades more than 10% week over week. A sudden spike in payment errors, for example, could indicate a gateway configuration issue that's silently costing you thousands in lost orders.",[29,7805],{},[32,7807,106],{"id":7808},"faq",[195,7810,7812],{"id":7811},"how-do-i-enable-guest-checkout-in-suitecommerce","How do I enable guest checkout in SuiteCommerce?",[15,7814,1150,7815,7818],{},[18,7816,7817],{},"Setup > SuiteCommerce Advanced > Configuration > Checkout"," in NetSuite and enable the guest checkout option. Then customize the checkout login step to present guest checkout as the primary option, as shown in our code examples above. You'll also need to configure a default Web Customer role for guest orders.",[195,7820,7822],{"id":7821},"whats-a-good-checkout-conversion-rate-for-suitecommerce","What's a good checkout conversion rate for SuiteCommerce?",[15,7824,7825],{},"A well-optimized SuiteCommerce store should convert 40–50% of checkout starters to completed orders. If you're below 30%, there are significant technical issues worth addressing. The industry average across all platforms is approximately 30%, meaning a SuiteCommerce-specific optimization can meaningfully outperform the baseline.",[195,7827,7829],{"id":7828},"should-i-use-a-one-page-checkout-or-multi-step-checkout","Should I use a one-page checkout or multi-step checkout?",[15,7831,7832],{},"Multi-step checkouts with clear progress indicators typically outperform single-page checkouts for SuiteCommerce. The reason: SuiteCommerce's API calls during checkout create latency. Breaking the flow into steps lets you preload the next step's data while the customer completes the current one. One-page checkouts show all that latency at once during form submissions.",[195,7834,7836],{"id":7835},"how-do-i-add-apple-pay-or-google-pay-to-suitecommerce","How do I add Apple Pay or Google Pay to SuiteCommerce?",[15,7838,7839,7840,7843],{},"You'll need a custom extension that integrates the Payment Request API with a SuiteCommerce-compatible payment processor. This requires a SuiteScript backend service endpoint to create payment sessions and validate tokens. The frontend integration uses the browser's native ",[210,7841,7842],{},"PaymentRequest"," API, which automatically shows Apple Pay on Safari and Google Pay on Chrome.",[195,7845,7847],{"id":7846},"whats-the-fastest-checkout-optimization-i-can-implement","What's the fastest checkout optimization I can implement?",[15,7849,7850],{},"Enable guest checkout and remove unnecessary form fields. These two changes require minimal development time (typically 2–4 hours for an experienced SuiteCommerce developer) and address the two highest-impact abandonment reasons: forced account creation (19% of abandoners) and too-complicated checkout (18% of abandoners).",[29,7852],{},[32,7854,7856],{"id":7855},"whats-next","What's Next?",[15,7858,7859],{},"Checkout optimization isn't a one-time project. It's an ongoing process of measuring, testing, and iterating. Start with the highest-impact changes—guest checkout and form reduction—then layer in mobile improvements, payment method expansion, and A\u002FB testing.",[15,7861,7862],{},"If your SuiteCommerce checkout conversion rate is below 35%, you're leaving real revenue on the table. The technical fixes in this guide address the specific friction points that SuiteCommerce creates out of the box.",[15,7864,7865,7868,7869,7873],{},[18,7866,7867],{},"Need help diagnosing your checkout drop-off?"," ",[43,7870,7872],{"href":7871},"\u002Fsuitecommerce-services\u002Fperformance","Get a free checkout audit"," from Stenbase. We'll identify your top 3 conversion killers and give you a prioritized fix plan—no commitment required.",[7875,7876,7877],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .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 .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":208,"searchDepth":223,"depth":223,"links":7879},[7880,7881,7882,7886,7890,7895,7900,7905,7910,7914,7918,7919,7926],{"id":34,"depth":223,"text":35},{"id":111,"depth":223,"text":46},{"id":190,"depth":223,"text":52,"children":7883},[7884,7885],{"id":197,"depth":229,"text":198},{"id":809,"depth":229,"text":810},{"id":821,"depth":223,"text":58,"children":7887},[7888,7889],{"id":827,"depth":229,"text":828},{"id":1189,"depth":229,"text":1190},{"id":1619,"depth":223,"text":64,"children":7891},[7892,7893,7894],{"id":1625,"depth":229,"text":1626},{"id":2043,"depth":229,"text":2044},{"id":2384,"depth":229,"text":2385},{"id":2536,"depth":223,"text":70,"children":7896},[7897,7898,7899],{"id":2549,"depth":229,"text":2550},{"id":2579,"depth":229,"text":2580},{"id":3153,"depth":229,"text":3154},{"id":3459,"depth":223,"text":76,"children":7901},[7902,7903,7904],{"id":3465,"depth":229,"text":3466},{"id":3472,"depth":229,"text":3473},{"id":4194,"depth":229,"text":4195},{"id":4442,"depth":223,"text":82,"children":7906},[7907,7908,7909],{"id":4448,"depth":229,"text":4449},{"id":4544,"depth":229,"text":4545},{"id":5142,"depth":229,"text":5143},{"id":5251,"depth":223,"text":88,"children":7911},[7912,7913],{"id":5257,"depth":229,"text":5258},{"id":6577,"depth":229,"text":6578},{"id":6724,"depth":223,"text":94,"children":7915},[7916,7917],{"id":6736,"depth":229,"text":6737},{"id":7451,"depth":229,"text":7452},{"id":7714,"depth":223,"text":100},{"id":7808,"depth":223,"text":106,"children":7920},[7921,7922,7923,7924,7925],{"id":7811,"depth":229,"text":7812},{"id":7821,"depth":229,"text":7822},{"id":7828,"depth":229,"text":7829},{"id":7835,"depth":229,"text":7836},{"id":7846,"depth":229,"text":7847},{"id":7855,"depth":223,"text":7856},[7928,7929],"SuiteCommerce","Performance","2026-02-05","A technical guide to diagnosing and fixing checkout abandonment in SuiteCommerce. Covers payment integration issues, checkout flow speed, mobile optimization, guest checkout implementation, and A\u002FB testing strategies with code examples.","md","\u002Fimages\u002Fblog\u002Fsuitecommerce-checkout-hero.webp",{"keywords":7935},[7936,7937,7938,7939,7940],"SuiteCommerce checkout","SuiteCommerce cart abandonment","SuiteCommerce checkout optimization","SuiteCommerce guest checkout","SuiteCommerce payment integration","\u002Fblog\u002Fsuitecommerce-checkout-optimization-fixing-abandonment",null,{"title":5,"description":7931},"blog\u002Fsuitecommerce-checkout-optimization-fixing-abandonment",[7928,7946,7947,7948,7929],"Checkout Optimization","Cart Abandonment","Conversions","CWTicxbIRj-mso-IEqMjzme8lPMv1DD06f3rdJ4wfv8",[7951,7963,7974,7986,7995,8005,8017,8020,8030,8039,8048,8058,8066,8076,8084,8095,8107,8116,8125,8134,8142],{"path":7952,"title":7953,"categories":7954,"tags":7956,"heroImage":7962},"\u002Fblog\u002Fbuilding-custom-suitecommerce-extensions-developer-guide","Building Custom SuiteCommerce Extensions: A Developer's Start-to-Finish Guide",[7928,7955],"Development",[7957,7958,7959,7960,7961],"SuiteCommerce Extensions","Custom Development","Backbone.js","SuiteScript","Frontend Development","\u002Fimages\u002Fblog\u002Fextensions-guide-hero.webp",{"path":7964,"title":7965,"categories":7966,"tags":7967,"heroImage":7973},"\u002Fblog\u002Fcore-web-vitals-suitecommerce-optimization-checklist","Core Web Vitals for SuiteCommerce: The Complete 2026 Optimization Checklist",[7929,7928],[7968,7969,7970,7971,7972,7928],"Core Web Vitals","LCP","INP","CLS","Performance Optimization","\u002Fimages\u002Fblog\u002Fcore-web-vitals-hero.webp",{"path":7975,"title":7976,"categories":7977,"tags":7979,"heroImage":7985},"\u002Fblog\u002Ffixing-duplicate-content-suitecommerce-faceted-navigation","Fixing Duplicate Content in SuiteCommerce Faceted Navigation",[7978,7928],"SEO",[7980,7981,7982,7983,7928,7984],"Duplicate Content","Faceted Navigation","Canonical Tags","Technical SEO","URL Parameters","\u002Fimages\u002Fblog\u002Fduplicate-content-seo-hero.webp",{"path":7987,"title":7988,"categories":7989,"tags":7990,"heroImage":7994},"\u002Fblog\u002Fheadless-suitecommerce-when-does-it-make-sense","Headless SuiteCommerce: When Does It Make Sense?",[7928,7955],[7928,7991,7992,7993,7929],"Headless Commerce","Architecture","Implementation","\u002Fimages\u002Fblog\u002Fheadless-suitecommerce-hero.webp",{"path":7996,"title":7997,"categories":7998,"tags":8000,"heroImage":8004},"\u002Fblog\u002Fnetsuite-ecommerce-integration-architecture-how-suitecommerce-works","NetSuite E-commerce Integration Architecture: How SuiteCommerce Actually Works",[7928,7955,7999],"Integration",[7992,7999,7960,8001,8002,8003],"API","Backend","Frontend","\u002Fimages\u002Fblog\u002Fnetsuite-ecommerce-integration-hero.webp",{"path":8006,"title":8007,"categories":8008,"tags":8010,"heroImage":8016},"\u002Fblog\u002Fnetsuite-integration-without-celigo-when-custom-beats-off-the-shelf","NetSuite Integration Without Celigo: When Custom Beats Off-the-Shelf",[8009,7999],"NetSuite",[8011,8012,8013,8014,7960,8015],"NetSuite Integration","Celigo","Custom Integration","RESTlet","API Development","\u002Fimages\u002Fblog\u002Fnetsuite-integration-hero.webp",{"path":7941,"title":5,"categories":8018,"tags":8019,"heroImage":7933},[7928,7929],[7928,7946,7947,7948,7929],{"path":8021,"title":8022,"categories":8023,"tags":8024,"heroImage":8029},"\u002Fblog\u002Fsuitecommerce-image-optimization-developer-guide","SuiteCommerce Image Optimization: A Developer's Guide",[7929,7928],[8025,8026,8027,8028,7929,7928],"Image Optimization","WebP","Lazy Loading","CDN","\u002Fimages\u002Fblog\u002Fimage-optimization-hero.webp",{"path":8031,"title":8032,"categories":8033,"tags":8034,"heroImage":8038},"\u002Fblog\u002Fsuitecommerce-implementation-cost-guide-2026","SuiteCommerce Implementation Cost Guide: What to Expect in 2026",[7928,7993],[8035,7993,8009,8036,8037],"SuiteCommerce Cost","Budget Planning","E-commerce","\u002Fimages\u002Fblog\u002Fimplementation-cost-hero.webp",{"path":8040,"title":8041,"categories":8042,"tags":8043,"heroImage":8047},"\u002Fblog\u002Fsuitecommerce-migration-checklist-upgrading-without-downtime","The SuiteCommerce Migration Checklist: Upgrading Without Downtime",[7928,7955],[7928,8044,8045,8046,7993],"Migration","Upgrade","Zero Downtime","\u002Fimages\u002Fblog\u002Fmigration-checklist-hero.webp",{"path":8049,"title":8050,"categories":8051,"tags":8052,"heroImage":8057},"\u002Fblog\u002Fsuitecommerce-myaccount-customization-b2b-features","SuiteCommerce MyAccount Customization: 10 Features B2B Customers Need",[7928,7955],[7928,8053,8054,8055,8056],"MyAccount","B2B","Customization","Portal","\u002Fimages\u002Fblog\u002Fsuitecommerce-myaccount-hero.webp",{"path":8059,"title":8060,"categories":8061,"tags":8063,"heroImage":8065},"\u002Fblog\u002Fsuitecommerce-performance-audit-286-stores","We Audited 286 Live SuiteCommerce Stores. Here's What We Found",[7929,8062,7928],"Research",[7929,7928,7968,8062,8064],"Benchmarks","\u002Fimages\u002Fblog\u002Fsuitecommerce-audit-hero.webp",{"path":8067,"title":8068,"categories":8069,"tags":8070,"heroImage":8075},"\u002Fblog\u002Fsuitecommerce-product-page-optimization-conversions-seo","How to Optimize SuiteCommerce Product Pages for Conversions and SEO",[7978,7929,7928],[8071,8072,8073,7983,8074],"Product Pages","Conversion Optimization","Schema Markup","CRO","\u002Fimages\u002Fblog\u002Fsuitecommerce-product-page-hero.webp",{"path":8077,"title":8078,"categories":8079,"tags":8080,"heroImage":8083},"\u002Fblog\u002Fsuitecommerce-seo-schema-markup-technical-guide","SuiteCommerce SEO: Schema Markup, Technical SEO, and What Actually Works",[7978,7928],[8073,7983,8081,8082,7928,8009],"JSON-LD","Structured Data","\u002Fimages\u002Fblog\u002Fseo-schema-markup-hero.webp",{"path":8085,"title":8086,"categories":8087,"tags":8089,"heroImage":8094},"\u002Fblog\u002Fsuitecommerce-theme-development-design-to-deployment","SuiteCommerce Theme Development: From Design to Deployment",[7955,7928,8088],"Themes",[8090,8091,8092,8093,7961,8055],"Theme Development","SASS","CSS","Templates","\u002Fimages\u002Fblog\u002Fsuitecommerce-theme-hero.webp",{"path":8096,"title":8097,"categories":8098,"tags":8101,"heroImage":8106},"\u002Fblog\u002Fsuitecommerce-version-upgrade-guide-2024","SuiteCommerce Version Upgrade Guide: 2023.x to 2024.x",[7928,8099,8100],"Maintenance","Upgrades",[8102,8044,8103,8104,8105],"Version Upgrade","2024 Release","SCA","Deployment","\u002Fimages\u002Fblog\u002Fsuitecommerce-upgrade-hero.webp",{"path":8108,"title":8109,"categories":8110,"tags":8111,"heroImage":8115},"\u002Fblog\u002Fsuitecommerce-vs-bigcommerce-netsuite-users","SuiteCommerce vs. BigCommerce for NetSuite Users: Which Platform Wins?",[7928,8037],[8112,7928,8009,8113,8114,7999],"BigCommerce","Platform Comparison","E-commerce Platform","\u002Fimages\u002Fblog\u002Fsuitecommerce-vs-bigcommerce-hero.webp",{"path":8117,"title":8118,"categories":8119,"tags":8120,"heroImage":8124},"\u002Fblog\u002Fsuitescript-performance-optimization-writing-efficient-scripts","SuiteScript Performance Optimization: Writing Efficient Scripts",[8009,7960],[7960,7972,8121,8122,8123,8001],"Governance","Map\u002FReduce","NetSuite Development","\u002Fimages\u002Fblog\u002Fsuitescript-performance-hero.webp",{"path":8126,"title":8127,"categories":8128,"tags":8129,"heroImage":8133},"\u002Fblog\u002Ftroubleshooting-suitecommerce-15-common-errors-how-to-fix","Troubleshooting SuiteCommerce: 15 Common Errors and How to Fix Them",[7928,7955],[7928,8130,8131,8132,7955],"Troubleshooting","Errors","Debugging","\u002Fimages\u002Fblog\u002Ftroubleshooting-errors-hero.webp",{"path":8135,"title":8136,"categories":8137,"tags":8138,"heroImage":8141},"\u002Fblog\u002Ftrue-cost-suitecommerce-maintenance-annual-budget-guide","The True Cost of SuiteCommerce Maintenance: Annual Budget Planning Guide",[7928,7929],[7928,8099,8036,8139,8140],"TCO","E-commerce Operations","\u002Fimages\u002Fblog\u002Fsuitecommerce-maintenance-cost-hero.webp",{"path":8143,"title":8144,"categories":8145,"tags":8146,"heroImage":8148},"\u002Fblog\u002Fwhy-suitecommerce-site-slow-how-to-fix","Why Your SuiteCommerce Site is Slow (And How to Fix It)",[7929,7928],[7929,7928,8147,8130],"Speed Optimization","\u002Fimages\u002Fblog\u002Fslow-site-fix-hero.webp",1773773965875]