{"id":82766,"date":"2026-07-29T16:29:00","date_gmt":"2026-07-29T14:29:00","guid":{"rendered":"https:\/\/www.zendeq.com\/?page_id=82766"},"modified":"2026-08-03T10:17:19","modified_gmt":"2026-08-03T08:17:19","slug":"calc","status":"publish","type":"page","link":"https:\/\/www.zendeq.com\/nl\/calc\/","title":{"rendered":"calc"},"content":{"rendered":"\n\n\t\n\t<div id=\"ts3-calc-wrapper\">\n\t<style>\n\t\/* --- CORE & RESET --- *\/\n\t#ts3-calc-wrapper { display: block; width: 100%; font-family: inherit; color: #1e293b; box-sizing: border-box; line-height: 1.5; }\n\t#ts3-calc-wrapper * { box-sizing: border-box; }\n\n\t\/* --- INTRO --- *\/\n\t#ts3-calc-wrapper .ts3-box { border: 1px solid #e2e8f0; border-radius: 16px; margin-bottom: 40px; }\n\t#ts3-calc-wrapper .ts3-intro { padding: 28px 32px 24px 32px; background: #fff; border-bottom: 1px solid #e2e8f0; border-radius: 15px 15px 0 0; }\n\t#ts3-calc-wrapper .ts3-intro-title { font-size: 25px; line-height: 1.25; font-weight: 800; color: #0f172a; margin: 0 0 9px 0; padding: 0; letter-spacing: -0.01em; }\n\t#ts3-calc-wrapper .ts3-intro-text { font-size: 14.5px; line-height: 1.65; color: #64748b; margin: 0; padding: 0; max-width: 780px; }\n\t\/* zonder intro rondt het paneel zelf de bovenkant af, met intro doet de balk dat *\/\n\t#ts3-calc-wrapper .ts3-has-intro .ts3-panel-left { border-radius: 0; }\n\t@media (max-width: 640px) {\n\t\t#ts3-calc-wrapper .ts3-intro { padding: 22px 20px 20px 20px; }\n\t\t#ts3-calc-wrapper .ts3-intro-title { font-size: 21px; }\n\t\t#ts3-calc-wrapper .ts3-intro-text { font-size: 14px; }\n\t}\n\n\t\/* --- CONTAINER (Fluid Flexbox) --- *\/\n\t#ts3-calc-wrapper .ts3-container { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 0 0 16px 16px; width: 100%; margin: 0 auto; display: flex; flex-wrap: wrap; }\n\n\t\/* --- SEGMENT SWITCHER (HERO) --- *\/\n\t#ts3-calc-wrapper .ts3-hero-top { display: flex; flex-direction: column; gap: 18px; align-items: stretch; }\n\t#ts3-calc-wrapper .ts3-hero-block { text-align: left; }\n\t#ts3-calc-wrapper .ts3-segment-title { font-size: 11px; font-weight: 700; color: #64748b; margin-bottom: 8px; text-transform: uppercase; letter-spacing: 1px; }\n\t#ts3-calc-wrapper .ts3-segment-controls { display: flex; width: 100%; background: #f1f5f9; padding: 4px; border-radius: 10px; gap: 4px; flex-wrap: wrap; }\n\t#ts3-calc-wrapper .ts3-seg-btn { flex: 1 1 auto; border: none; background: transparent; padding: 10px 8px; font-size: 12.5px; font-weight: 600; color: #64748b; border-radius: 8px; cursor: pointer; transition: all 0.2s; }\n\t#ts3-calc-wrapper .ts3-seg-btn:hover { color: #0f172a; }\n\t#ts3-calc-wrapper .ts3-seg-btn.active { background: #fff; color: #2563eb; box-shadow: 0 2px 4px -1px rgba(0,0,0,0.1); }\n\n\t\/* --- MINI SEGMENT (inline, left panel) --- *\/\n\t#ts3-calc-wrapper .ts3-mini-seg { display: flex; background: #f1f5f9; padding: 3px; border-radius: 8px; gap: 3px; }\n\t#ts3-calc-wrapper .ts3-mini-seg button { flex: 1; border: none; background: transparent; padding: 8px 6px; font-size: 12px; font-weight: 600; color: #64748b; border-radius: 6px; cursor: pointer; transition: all 0.15s; white-space: nowrap; }\n\t#ts3-calc-wrapper .ts3-mini-seg button.active { background: #fff; color: #2563eb; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }\n\n\t\/* --- PRESETS --- *\/\n\t#ts3-calc-wrapper .ts3-presets { margin-top: 22px; padding-top: 16px; border-top: 1px dashed #e2e8f0; }\n\t#ts3-calc-wrapper .ts3-presets-title { font-size: 11px; font-weight: 700; color: #94a3b8; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 10px; }\n\t#ts3-calc-wrapper .ts3-preset-btn { border: 1px dashed #cbd5e1; background: #fff; padding: 8px 12px; margin: 0 6px 6px 0; font-size: 12px; font-weight: 500; color: #64748b; border-radius: 6px; cursor: pointer; transition: all 0.2s; }\n\t#ts3-calc-wrapper .ts3-preset-btn:hover { border-color: #2563eb; color: #2563eb; background: #eff6ff; }\n\t#ts3-calc-wrapper .ts3-preset-btn.active { border-color: #2563eb; color: #2563eb; background: #eff6ff; font-weight: 700; box-shadow: inset 0 2px 4px rgba(0,0,0,0.05); }\n\n\t\/* --- LEFT PANEL (INPUTS) --- *\/\n\t#ts3-calc-wrapper .ts3-panel-left { padding: 32px; flex: 1 1 50%; min-width: 300px; border-right: 1px solid #e2e8f0; background: #f8fafc; border-radius: 16px 16px 0 0; }\n\t#ts3-calc-wrapper .ts3-section-header { font-size: 13px; font-weight: 700; color: #334155; margin: 24px 0 12px 0; border-bottom: 1px solid #e2e8f0; padding-bottom: 8px; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px; }\n\t#ts3-calc-wrapper .ts3-section-header:first-child { margin-top: 0; }\n\n\t\/* --- FORM ELEMENTS --- *\/\n\t#ts3-calc-wrapper .ts3-grid-2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin-bottom: 16px; }\n\t#ts3-calc-wrapper .ts3-input-col { margin-bottom: 12px; }\n\t#ts3-calc-wrapper label { display: block; font-size: 11px; font-weight: 700; color: #64748b; margin-bottom: 6px; text-transform: uppercase; letter-spacing: 0.5px; }\n\t#ts3-calc-wrapper input[type=\"number\"], #ts3-calc-wrapper select { width: 100%; padding: 10px 12px; border: 1px solid #cbd5e1; border-radius: 8px; font-size: 14px; transition: all 0.2s; background: #fff; color: #0f172a; }\n\t#ts3-calc-wrapper input[type=\"number\"]:focus, #ts3-calc-wrapper select:focus { border-color: #3b82f6; outline: none; box-shadow: 0 0 0 3px rgba(59,130,246,0.1); }\n\t#ts3-calc-wrapper .ts3-hint { font-size: 11px; color: #94a3b8; margin-top: 4px; }\n\n\t\/* --- CHECKBOX \/ TOGGLE GRID --- *\/\n\t#ts3-calc-wrapper .ts3-toggle-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 8px; margin-bottom: 16px; }\n\t#ts3-calc-wrapper .ts3-toggle-item { display: flex; align-items: center; gap: 8px; padding: 10px 12px; background: #fff; border: 1px solid #e2e8f0; border-radius: 8px; cursor: pointer; transition: all 0.2s; font-size: 13px; }\n\t#ts3-calc-wrapper .ts3-toggle-item:hover { border-color: #3b82f6; }\n\t#ts3-calc-wrapper .ts3-toggle-item.active { border-color: #2563eb; background: #eff6ff; }\n\t#ts3-calc-wrapper .ts3-toggle-item input { margin: 0; accent-color: #2563eb; }\n\n\t\/* --- MARKET CHIPS --- *\/\n\t#ts3-calc-wrapper .ts3-chips { display: flex; flex-wrap: wrap; gap: 7px; }\n\t#ts3-calc-wrapper .ts3-chip { border: 1px solid #cbd5e1; background: #fff; border-radius: 999px; padding: 6px 13px; font-size: 12px; font-weight: 600; color: #64748b; cursor: pointer; transition: all 0.14s; user-select: none; }\n\t#ts3-calc-wrapper .ts3-chip:hover { border-color: #2563eb; }\n\t#ts3-calc-wrapper .ts3-chip.active { background: #2563eb; border-color: #2563eb; color: #fff; }\n\t#ts3-calc-wrapper .ts3-chip.active::before { content: \"\\2713\\00a0\"; }\n\n\t\/* --- RIGHT PANEL (RESULTS) --- *\/\n\t#ts3-calc-wrapper .ts3-panel-right { padding: 32px; flex: 1 1 350px; max-width: 100%; background: #fff; display: flex; flex-direction: column; border-radius: 0 0 16px 16px; }\n\n\t\/* --- RESULTS TYPOGRAPHY --- *\/\n\t#ts3-calc-wrapper .ts3-res-title { font-size: 12px; color: #94a3b8; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; text-align: center; margin-bottom: 8px; }\n\t#ts3-calc-wrapper .ts3-res-main { font-size: 44px; font-weight: 800; color: #0f172a; text-align: center; line-height: 1; margin-bottom: 4px; }\n\t#ts3-calc-wrapper .ts3-res-sub { font-size: 14px; color: #64748b; text-align: center; margin-bottom: 6px; }\n\t#ts3-calc-wrapper .ts3-res-perorder { font-size: 14px; color: #0f172a; text-align: center; margin-bottom: 16px; font-weight: 600; }\n\t#ts3-calc-wrapper .ts3-res-perorder span.ts3-po-amt { color: #2563eb; font-weight: 800; font-size: 16px; }\n\t#ts3-calc-wrapper .ts3-res-perorder .ts3-po-note { display: block; font-size: 11px; color: #94a3b8; font-weight: 400; }\n\n\t\/* --- STACKED BAR --- *\/\n\t#ts3-calc-wrapper .ts3-bar-wrap { margin-bottom: 4px; }\n\t#ts3-calc-wrapper .ts3-bar-title { font-size: 11px; font-weight: 700; color: #64748b; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 8px; display: flex; justify-content: space-between; }\n\t#ts3-calc-wrapper .ts3-bar-title span:last-child { font-weight: 400; text-transform: none; letter-spacing: 0; }\n\t#ts3-calc-wrapper .ts3-stack { display: flex; height: 26px; border-radius: 7px; overflow: hidden; background: #f1f5f9; border: 1px solid #e2e8f0; }\n\t#ts3-calc-wrapper .ts3-stack .ts3-seg-b { height: 100%; transition: width 0.4s cubic-bezier(.4,0,.2,1); min-width: 0; }\n\t#ts3-calc-wrapper .ts3-dot { display: inline-block; width: 9px; height: 9px; border-radius: 3px; margin-right: 7px; flex: none; }\n\n\t#ts3-calc-wrapper .ts3-list { border-top: 1px solid #f1f5f9; padding-top: 12px; margin-top: 12px; }\n\t#ts3-calc-wrapper .ts3-li { display: flex; justify-content: space-between; align-items: center; font-size: 13px; padding: 7px 0; border-bottom: 1px solid #f8fafc; }\n\t#ts3-calc-wrapper .ts3-li .ts3-li-name { display: flex; align-items: center; }\n\t#ts3-calc-wrapper .ts3-li strong { font-weight: 600; color: #334155; }\n\t#ts3-calc-wrapper .ts3-li.ts3-sub { font-size: 12px; color: #64748b; padding-left: 16px; border-bottom: none; padding-top: 2px; }\n\t#ts3-calc-wrapper .ts3-li.ts3-total { border-top: 2px solid #e2e8f0; margin-top: 8px; padding-top: 12px; font-weight: 700; font-size: 14px; }\n\n\t\/* --- DESTINATION DETAILS --- *\/\n\t#ts3-calc-wrapper details.ts3-dest { margin-top: 10px; font-size: 12px; }\n\t#ts3-calc-wrapper details.ts3-dest summary { cursor: pointer; font-weight: 600; color: #2563eb; padding: 4px 0; font-size: 12px; }\n\t#ts3-calc-wrapper .ts3-dest-row { display: grid; grid-template-columns: 90px 1fr auto; align-items: center; gap: 10px; padding: 4px 0; }\n\t#ts3-calc-wrapper .ts3-dest-row .ts3-dn { font-weight: 600; color: #334155; font-size: 12px; }\n\t#ts3-calc-wrapper .ts3-dest-track { height: 7px; background: #f1f5f9; border-radius: 999px; overflow: hidden; }\n\t#ts3-calc-wrapper .ts3-dest-fill { height: 100%; background: linear-gradient(90deg, #34d399, #059669); border-radius: 999px; }\n\t#ts3-calc-wrapper .ts3-dest-row .ts3-da { font-size: 11.5px; font-weight: 600; color: #334155; white-space: nowrap; }\n\n\t\/* --- ONE-TIME COSTS BOX --- *\/\n\t#ts3-calc-wrapper .ts3-onetime-box { margin-top: 16px; padding: 12px; background: #fefce8; border: 1px solid #fef08a; border-radius: 8px; }\n\t#ts3-calc-wrapper .ts3-onetime-title { font-size: 11px; font-weight: 700; color: #a16207; text-transform: uppercase; margin-bottom: 8px; }\n\t#ts3-calc-wrapper .ts3-onetime-li { display: flex; justify-content: space-between; font-size: 12px; color: #854d0e; padding: 4px 0; }\n\n\t\/* --- SUMMARY BOX --- *\/\n\t#ts3-calc-wrapper .ts3-summary-box { margin-top: 16px; padding: 14px; background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%); border: 1px solid #bae6fd; border-radius: 10px; }\n\t#ts3-calc-wrapper .ts3-summary-title { font-size: 11px; font-weight: 700; color: #0369a1; text-transform: uppercase; margin-bottom: 10px; display: flex; align-items: center; gap: 6px; }\n\t#ts3-calc-wrapper .ts3-summary-config { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; }\n\t#ts3-calc-wrapper .ts3-config-tag { display: inline-flex; align-items: center; gap: 4px; padding: 4px 10px; background: #fff; border: 1px solid #e0f2fe; border-radius: 20px; font-size: 11px; color: #0c4a6e; font-weight: 500; }\n\t#ts3-calc-wrapper .ts3-summary-text { font-size: 12px; color: #0c4a6e; line-height: 1.6; }\n\t#ts3-calc-wrapper .ts3-summary-text p { margin: 0 0 8px 0; }\n\t#ts3-calc-wrapper .ts3-summary-text p:last-child { margin-bottom: 0; }\n\t#ts3-calc-wrapper .ts3-cost-driver { display: flex; align-items: center; gap: 6px; font-size: 11px; color: #64748b; margin-top: 4px; }\n\t#ts3-calc-wrapper .ts3-driver-up { color: #dc2626; }\n\t#ts3-calc-wrapper .ts3-driver-down { color: #16a34a; }\n\t#ts3-calc-wrapper .ts3-insight { display: flex; gap: 8px; padding: 9px 11px; border-radius: 8px; background: rgba(255,255,255,0.7); border: 1px solid #e0f2fe; font-size: 12px; color: #0c4a6e; margin-top: 8px; }\n\t#ts3-calc-wrapper .ts3-insight .ts3-ic { color: #0369a1; font-weight: 700; flex: none; }\n\n\t\/* --- RANGE EXPLANATION --- *\/\n\t#ts3-calc-wrapper .ts3-range-box { margin-top: 12px; padding: 10px 12px; background: #f8fafc; border-radius: 8px; font-size: 11px; color: #64748b; }\n\t#ts3-calc-wrapper .ts3-range-box strong { color: #334155; }\n\n\t\/* --- BADGES --- *\/\n\t#ts3-calc-wrapper .ts3-badge { display: inline-block; padding: 3px 8px; border-radius: 4px; font-size: 10px; font-weight: 700; margin-left: 8px; vertical-align: middle; text-transform: uppercase; }\n\t.bg-orange { background: #ffedd5; color: #9a3412; }\n\t.bg-blue { background: #dbeafe; color: #1e40af; }\n\t.bg-red { background: #fee2e2; color: #991b1b; }\n\t.bg-green { background: #dcfce7; color: #166534; }\n\t.bg-purple { background: #f3e8ff; color: #7c3aed; }\n\n\t\/* --- ALERTS --- *\/\n\t#ts3-calc-wrapper .ts3-alert { margin-top: 12px; padding: 10px; border-radius: 6px; font-size: 12px; }\n\t#ts3-calc-wrapper .ts3-alert-red { background: #fef2f2; border: 1px solid #fee2e2; color: #991b1b; }\n\t#ts3-calc-wrapper .ts3-alert-amber { background: #fffbeb; border: 1px solid #fef3c7; color: #92400e; }\n\t#ts3-calc-wrapper .ts3-alert-blue { background: #eff6ff; border: 1px solid #dbeafe; color: #1e40af; }\n\n\t\/* --- CTA --- *\/\n\t#ts3-calc-wrapper .ts3-cta-btn { display: block; width: 100%; padding: 16px 16px; background: #2563eb; color: #fff; text-align: center; font-weight: 700; border-radius: 10px; border: none; cursor: pointer; margin-top: 6px; font-size: 16px; transition: transform 0.2s; box-shadow: 0 4px 6px -1px rgba(37, 99, 235, 0.2); }\n\t#ts3-calc-wrapper .ts3-cta-btn:hover { background: #1d4ed8; transform: translateY(-2px); }\n\n\t\/* --- LEAD FORM --- *\/\n\t#ts3-calc-wrapper input[type=\"text\"],\n\t#ts3-calc-wrapper input[type=\"email\"],\n\t#ts3-calc-wrapper input[type=\"tel\"] { width: 100%; padding: 10px 12px; border: 1px solid #cbd5e1; border-radius: 8px; font-size: 14px; background: #fff; color: #0f172a; font-family: inherit; transition: all 0.2s; }\n\t#ts3-calc-wrapper input[type=\"text\"]:focus,\n\t#ts3-calc-wrapper input[type=\"email\"]:focus,\n\t#ts3-calc-wrapper input[type=\"tel\"]:focus { border-color: #3b82f6; outline: none; box-shadow: 0 0 0 3px rgba(59,130,246,0.1); }\n\t#ts3-calc-wrapper .ts3-lead { margin-top: 16px; padding: 18px; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; }\n\t#ts3-calc-wrapper .ts3-lead-title { font-size: 15px; font-weight: 800; color: #0f172a; margin-bottom: 4px; }\n\t#ts3-calc-wrapper .ts3-lead-sub { font-size: 12px; color: #64748b; margin-bottom: 14px; line-height: 1.5; }\n\t#ts3-calc-wrapper .ts3-lead-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 12px; margin-bottom: 14px; }\n\t#ts3-calc-wrapper .ts3-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }\n\t#ts3-calc-wrapper .ts3-lead-status { margin-top: 10px; font-size: 13px; font-weight: 600; text-align: center; line-height: 1.5; }\n\t#ts3-calc-wrapper .ts3-lead-status.ts3-err { color: #dc2626; }\n\t#ts3-calc-wrapper #ts3LeadSubmit { margin-top: 0; }\n\t#ts3-calc-wrapper #ts3LeadSubmit:disabled { opacity: 0.6; cursor: not-allowed; transform: none; }\n\n\t\/* --- CREDIBILITY FOOTER --- *\/\n\t#ts3-calc-wrapper .ts3-credibility { margin-top: 16px; padding: 14px; background: #f8fafc; border-radius: 8px; border: 1px solid #e2e8f0; }\n\t#ts3-calc-wrapper .ts3-credibility-title { font-size: 10px; font-weight: 700; color: #64748b; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 8px; }\n\t#ts3-calc-wrapper .ts3-credibility-stats { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 10px; }\n\t#ts3-calc-wrapper .ts3-stat { text-align: center; flex: 1; min-width: 70px; }\n\t#ts3-calc-wrapper .ts3-stat-num { font-size: 18px; font-weight: 800; color: #0f172a; }\n\t#ts3-calc-wrapper .ts3-stat-label { font-size: 9px; color: #64748b; text-transform: uppercase; }\n\t#ts3-calc-wrapper .ts3-credibility-text { font-size: 10px; color: #94a3b8; line-height: 1.5; }\n\n\t\/* --- ACCORDIONS --- *\/\n\t#ts3-calc-wrapper details.ts3-acc { border: 1px solid #e2e8f0; border-radius: 10px; margin-top: 10px; background: #fff; }\n\t#ts3-calc-wrapper details.ts3-acc > summary { cursor: pointer; padding: 13px 14px; font-size: 11.5px; font-weight: 700; color: #334155; text-transform: uppercase; letter-spacing: 0.5px; list-style: none; display: flex; justify-content: space-between; align-items: center; gap: 10px; }\n\t#ts3-calc-wrapper details.ts3-acc > summary::-webkit-details-marker { display: none; }\n\t#ts3-calc-wrapper details.ts3-acc > summary::after { content: \"+\"; font-size: 17px; font-weight: 400; color: #94a3b8; line-height: 1; }\n\t#ts3-calc-wrapper details.ts3-acc[open] > summary::after { content: \"\\2013\"; }\n\t#ts3-calc-wrapper details.ts3-acc > summary:hover { color: #2563eb; }\n\t#ts3-calc-wrapper .ts3-acc-body { padding: 0 14px 14px 14px; }\n\t#ts3-calc-wrapper .ts3-acc-body > *:first-child { margin-top: 0; }\n\t#ts3-calc-wrapper .ts3-acc-body .ts3-section-header:first-child { margin-top: 0; }\n\t#ts3-calc-wrapper .ts3-acc-note { font-size: 11px; font-weight: 400; text-transform: none; letter-spacing: 0; color: #94a3b8; }\n\n\t\/* --- CTA BLOCK --- *\/\n\t#ts3-calc-wrapper .ts3-cta-wrap { margin: 18px 0 6px 0; padding: 16px; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; }\n\t#ts3-calc-wrapper .ts3-cta-title { font-size: 15px; font-weight: 800; color: #0f172a; text-align: center; margin-bottom: 5px; }\n\t#ts3-calc-wrapper .ts3-cta-lead { font-size: 12px; color: #64748b; text-align: center; line-height: 1.55; margin-bottom: 12px; }\n\t#ts3-calc-wrapper .ts3-step-note { font-size: 11.5px; color: #94a3b8; line-height: 1.5; margin-top: 12px; }\n\t#ts3-calc-wrapper .ts3-cta-note { font-size: 11px; color: #94a3b8; text-align: center; margin-top: 8px; line-height: 1.5; }\n\n\t\/* --- STICKY RESULTS (DESKTOP) --- *\/\n\t@media (min-width: 900px) {\n\t\t#ts3-calc-wrapper .ts3-panel-right { position: sticky; top: 20px; align-self: flex-start; border-radius: 0 16px 16px 0; }\n\t\t#ts3-calc-wrapper .ts3-panel-right.ts3-nostick { position: static; }\n\t\t#ts3-calc-wrapper .ts3-panel-left { border-radius: 16px 0 0 16px; }\n\t\t#ts3-calc-wrapper .ts3-has-intro .ts3-panel-left { border-radius: 0 0 0 16px; }\n\t\t#ts3-calc-wrapper .ts3-has-intro .ts3-panel-right { border-radius: 0 0 16px 0; }\n\t}\n\n\t\/* --- MOBILE STICKY BAR --- *\/\n\t#ts3-calc-wrapper .ts3-mobile-bar { display: none; }\n\t@media (max-width: 899px) {\n\t\t#ts3-calc-wrapper .ts3-mobile-bar.ts3-on { display: flex; position: fixed; left: 0; right: 0; bottom: 0; z-index: 99990; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 14px; background: #0f172a; box-shadow: 0 -4px 14px rgba(0,0,0,0.18); }\n\t\t#ts3-calc-wrapper .ts3-mb-label { display: block; font-size: 10px; color: #94a3b8; text-transform: uppercase; letter-spacing: 0.5px; }\n\t\t#ts3-calc-wrapper .ts3-mb-total { font-size: 19px; font-weight: 800; color: #fff; line-height: 1.1; }\n\t\t#ts3-calc-wrapper .ts3-mb-btn { border: none; background: #2563eb; color: #fff; font-weight: 700; font-size: 14px; padding: 12px 18px; border-radius: 9px; cursor: pointer; white-space: nowrap; }\n\t}\n\n\t\/* --- STEPPER --- *\/\n\t#ts3-calc-wrapper .ts3-stepper { margin-bottom: 22px; }\n\t#ts3-calc-wrapper .ts3-stepbar { height: 4px; background: #e2e8f0; border-radius: 999px; overflow: hidden; margin-bottom: 14px; }\n\t#ts3-calc-wrapper .ts3-stepbar span { display: block; height: 100%; width: 0; background: #2563eb; border-radius: 999px; transition: width 0.3s ease; }\n\t#ts3-calc-wrapper .ts3-steptabs { display: flex; gap: 6px; flex-wrap: wrap; }\n\t#ts3-calc-wrapper .ts3-steptab { flex: 1 1 0; min-width: 84px; display: flex; align-items: center; gap: 7px; padding: 9px 10px; border: 1px solid #e2e8f0; background: #fff; border-radius: 9px; cursor: pointer; font-size: 12px; font-weight: 600; color: #64748b; transition: all 0.15s; text-align: left; }\n\t#ts3-calc-wrapper .ts3-steptab:hover { border-color: #93c5fd; color: #334155; }\n\t#ts3-calc-wrapper .ts3-steptab b { width: 19px; height: 19px; border-radius: 50%; background: #e2e8f0; color: #475569; display: inline-flex; align-items: center; justify-content: center; font-size: 10.5px; font-weight: 700; flex: none; }\n\t#ts3-calc-wrapper .ts3-steptab.ts3-cur { border-color: #2563eb; color: #2563eb; background: #eff6ff; }\n\t#ts3-calc-wrapper .ts3-steptab.ts3-cur b { background: #2563eb; color: #fff; }\n\t#ts3-calc-wrapper .ts3-steptab.ts3-seen b { background: #16a34a; color: #fff; }\n\t#ts3-calc-wrapper .ts3-step-panel { display: none; }\n\t#ts3-calc-wrapper .ts3-step-panel.ts3-cur { display: block; animation: ts3FadeIn 0.25s ease; }\n\t#ts3-calc-wrapper .ts3-stepnav { display: flex; gap: 10px; margin-top: 22px; }\n\t#ts3-calc-wrapper .ts3-nav-btn { flex: 1; padding: 13px 12px; border-radius: 9px; font-size: 14px; font-weight: 700; cursor: pointer; border: 1px solid #cbd5e1; background: #fff; color: #475569; transition: all 0.15s; }\n\t#ts3-calc-wrapper .ts3-nav-btn:hover { border-color: #2563eb; color: #2563eb; }\n\t#ts3-calc-wrapper .ts3-nav-next { flex: 1.7; background: #2563eb; border-color: #2563eb; color: #fff; }\n\t#ts3-calc-wrapper .ts3-nav-next:hover { background: #1d4ed8; border-color: #1d4ed8; color: #fff; }\n\t#ts3-calc-wrapper .ts3-nav-btn[disabled] { opacity: 0.35; cursor: not-allowed; }\n\t#ts3-calc-wrapper .ts3-nav-btn[disabled]:hover { border-color: #cbd5e1; color: #475569; }\n\t#ts3-calc-wrapper .ts3-showall { display: block; width: 100%; margin-top: 12px; background: none; border: none; color: #94a3b8; font-size: 11.5px; text-decoration: underline; cursor: pointer; text-align: center; }\n\t#ts3-calc-wrapper .ts3-showall:hover { color: #2563eb; }\n\t#ts3-calc-wrapper .ts3-panel-left.ts3-flat .ts3-step-panel { display: block; }\n\t#ts3-calc-wrapper .ts3-panel-left.ts3-flat .ts3-stepbar,\n\t#ts3-calc-wrapper .ts3-panel-left.ts3-flat .ts3-steptabs,\n\t#ts3-calc-wrapper .ts3-panel-left.ts3-flat .ts3-stepnav { display: none; }\n\t@media (max-width: 540px) {\n\t\t#ts3-calc-wrapper .ts3-steptab { flex: 1 1 0; min-width: 0; justify-content: center; padding: 9px 6px; }\n\t\t#ts3-calc-wrapper .ts3-tab-label { display: none; }\n\t}\n\n\t\/* --- UTILS --- *\/\n\t#ts3-calc-wrapper .ts3-hidden { display: none !important; }\n\t#ts3-calc-wrapper .ts3-fade-in { animation: ts3FadeIn 0.3s ease-in-out; }\n\t@keyframes ts3FadeIn { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: translateY(0); } }\n\t<\/style>\n\n\t<div class=\"ts3-box ts3-has-intro\">\n\n\t\t\t\t<div class=\"ts3-intro\">\n\t\t\t<h2 class=\"ts3-intro-title\">Warehouse and fulfilment cost calculator<\/h2>\t\t\t<p class=\"ts3-intro-text\">Estimate what 3PL fulfilment in the Netherlands costs for your volumes, including storage, handling, shipping and returns. It takes about a minute, and you can request real quotes from matching providers at the end.<\/p>\t\t<\/div>\n\t\t\n\t\t<div class=\"ts3-container\">\n\t\t\t<div class=\"ts3-panel-left\">\n\n\t\t\t\t<div class=\"ts3-stepper\">\n\t\t\t\t\t<div class=\"ts3-stepbar\"><span id=\"ts3StepFill\"><\/span><\/div>\n\t\t\t\t\t<div class=\"ts3-steptabs\" id=\"ts3StepTabs\"><\/div>\n\t\t\t\t\t<div class=\"ts3-step-note\">Don&rsquo;t know the exact figure? A rough estimate is fine. Providers will confirm the details in their quote.<\/div>\n\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"ts3-step-panel\" data-step=\"1\">\n\t\t\t\t\t<div class=\"ts3-hero-top\">\n\t\t\t\t\t\t<div class=\"ts3-hero-block\">\n\t\t\t\t\t\t\t<div class=\"ts3-segment-title\">Business Model<\/div>\n\t\t\t\t\t\t\t<div class=\"ts3-segment-controls\">\n\t\t\t\t\t\t\t\t<button class=\"ts3-seg-btn\" data-mode=\"b2b\" onclick=\"ts3Switch('b2b', this)\">\ud83d\ude9a B2B<\/button>\n\t\t\t\t\t\t\t\t<button class=\"ts3-seg-btn active\" data-mode=\"b2c\" onclick=\"ts3Switch('b2c', this)\">\ud83d\udce6 B2C<\/button>\n\t\t\t\t\t\t\t\t<button class=\"ts3-seg-btn\" data-mode=\"hybrid\" onclick=\"ts3Switch('hybrid', this)\">\ud83d\udd04 Hybrid<\/button>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-hero-block\">\n\t\t\t\t\t\t\t<div class=\"ts3-segment-title\">Region<\/div>\n\t\t\t\t\t\t\t<div class=\"ts3-segment-controls\">\n\t\t\t\t\t\t\t\t<button class=\"ts3-seg-btn active\" data-region=\"randstad\" onclick=\"ts3Region('randstad', this)\">\ud83c\udfd9\ufe0f Randstad<\/button>\n\t\t\t\t\t\t\t\t<button class=\"ts3-seg-btn\" data-region=\"south\" onclick=\"ts3Region('south', this)\">\ud83c\udfed Brabant \/ Limburg<\/button>\n\t\t\t\t\t\t\t\t<button class=\"ts3-seg-btn\" data-region=\"east\" onclick=\"ts3Region('east', this)\">\ud83c\udf3e East NL<\/button>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-hero-block\">\n\t\t\t\t\t\t\t<div class=\"ts3-segment-title\">Season<\/div>\n\t\t\t\t\t\t\t<div class=\"ts3-segment-controls\">\n\t\t\t\t\t\t\t\t<button class=\"ts3-seg-btn active\" data-season=\"normal\" onclick=\"ts3Season('normal', this)\">\ud83d\udcc5 Normal<\/button>\n\t\t\t\t\t\t\t\t<button class=\"ts3-seg-btn\" data-season=\"peak\" onclick=\"ts3Season('peak', this)\">\ud83d\udd25 Peak (Q4)<\/button>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div class=\"ts3-presets\">\n\t\t\t\t\t\t<div class=\"ts3-presets-title\">Or start from a template<\/div>\n\t\t\t\t\t\t<button class=\"ts3-preset-btn\" data-preset=\"starter\" onclick=\"ts3Preset('starter')\">\ud83d\ude80 E-com Starter<\/button>\n\t\t\t\t\t\t<button class=\"ts3-preset-btn\" data-preset=\"midsize\" onclick=\"ts3Preset('midsize')\">\ud83d\udcc8 Mid-size B2C<\/button>\n\t\t\t\t\t\t<button class=\"ts3-preset-btn\" data-preset=\"wholesale\" onclick=\"ts3Preset('wholesale')\">\ud83c\udfe2 Wholesale B2B<\/button>\n\t\t\t\t\t\t<button class=\"ts3-preset-btn\" data-preset=\"enterprise\" onclick=\"ts3Preset('enterprise')\">\ud83c\udfed Enterprise<\/button>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"ts3-step-panel\" data-step=\"2\">\n\t\t\t\t<div class=\"ts3-section-header\">\n\t\t\t\t\t<span>\ud83d\udce6 Storage Profile<\/span>\n\t\t\t\t\t<span class=\"ts3-badge bg-blue\" id=\"ts3TierBadge\">Standard Rate<\/span>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"ts3-grid-2\">\n\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t<label>Pallets (Bulk \/ Rack)<\/label>\n\t\t\t\t\t\t<input type=\"number\" id=\"ts3Pallets\" placeholder=\"0\" min=\"0\" oninput=\"ts3Calc()\">\n\t\t\t\t\t\t<div class=\"ts3-hint\">Standard Euro Pallets<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"ts3-input-col ts3-b2c-only\">\n\t\t\t\t\t\t<label>Pick Locations<\/label>\n\t\t\t\t\t\t<input type=\"number\" id=\"ts3Shelves\" placeholder=\"0\" min=\"0\" oninput=\"ts3Calc()\">\n\t\t\t\t\t\t<div class=\"ts3-hint\">Bins\/Shelves for loose items<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t<label>Active SKUs<\/label>\n\t\t\t\t\t\t<input type=\"number\" id=\"ts3Skus\" placeholder=\"0\" min=\"0\" oninput=\"ts3Calc()\">\n\t\t\t\t\t\t<div class=\"ts3-hint\">Unique products in stock<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"ts3-grid-2\">\n\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t<label>Goods Type<\/label>\n\t\t\t\t\t\t<select id=\"ts3GoodsType\" onchange=\"ts3Calc()\">\n\t\t\t\t\t\t\t<option value=\"std\">Standard (General Cargo)<\/option>\n\t\t\t\t\t\t\t<option value=\"food\">Food \/ HACCP (+20%)<\/option>\n\t\t\t\t\t\t\t<option value=\"adr\">Dangerous \/ ADR (+65%)<\/option>\n\t\t\t\t\t\t\t<option value=\"med\">Medical \/ Pharma (+40%)<\/option>\n\t\t\t\t\t\t<\/select>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t<label>Climate Control<\/label>\n\t\t\t\t\t\t<select id=\"ts3Climate\" onchange=\"ts3Calc()\">\n\t\t\t\t\t\t\t<option value=\"ambient\">Ambient (No control)<\/option>\n\t\t\t\t\t\t\t<option value=\"conditioned\">Conditioned 15-25\u00b0C (+15%)<\/option>\n\t\t\t\t\t\t\t<option value=\"chilled\">Chilled 2-8\u00b0C (+45%)<\/option>\n\t\t\t\t\t\t\t<option value=\"frozen\">Frozen -18\u00b0C (+80%)<\/option>\n\t\t\t\t\t\t<\/select>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t<label>\n\t\t\t\t\t\t<input type=\"checkbox\" id=\"ts3LotTracking\" onchange=\"ts3Calc()\" style=\"margin-right:6px;\">\n\t\t\t\t\t\tLot\/Batch &amp; Expiry Tracking (FEFO) <span class=\"ts3-badge bg-purple\">+\u20ac95\/mo<\/span>\n\t\t\t\t\t<\/label>\n\t\t\t\t\t<div class=\"ts3-hint\">Required for food, pharma. First-Expired-First-Out management.<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"ts3-step-panel\" data-step=\"3\">\n\t\t\t\t<div class=\"ts3-section-header\">\n\t\t\t\t\t<span>\ud83d\udce5 Inbound (Monthly)<\/span>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"ts3-grid-2\">\n\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t<label>Pallet Inbound<\/label>\n\t\t\t\t\t\t<input type=\"number\" id=\"ts3InPallets\" placeholder=\"0\" min=\"0\" oninput=\"ts3Calc()\">\n\t\t\t\t\t\t<div class=\"ts3-hint\">Full trucks\/pallets received<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t<label>Containers (Loose)<\/label>\n\t\t\t\t\t\t<input type=\"number\" id=\"ts3InContainers\" placeholder=\"0\" min=\"0\" oninput=\"ts3Calc()\">\n\t\t\t\t\t\t<div class=\"ts3-hint\">20ft \/ 40ft containers<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t<label>\n\t\t\t\t\t\t<input type=\"checkbox\" id=\"ts3QcInbound\" onchange=\"ts3Calc()\" style=\"margin-right:6px;\">\n\t\t\t\t\t\tQuality Inspection on Inbound <span class=\"ts3-badge bg-orange\">+\u20ac0.35\/unit<\/span>\n\t\t\t\t\t<\/label>\n\t\t\t\t\t<div class=\"ts3-hint\">Visual check, count verification, damage reporting<\/div>\n\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"ts3-section-header\">\n\t\t\t\t\t<span>\ud83d\udce4 Outbound (Monthly)<\/span>\n\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"ts3-b2b-only ts3-hidden\">\n\t\t\t\t\t<div class=\"ts3-grid-2\">\n\t\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t\t<label>B2B: Pallets Out<\/label>\n\t\t\t\t\t\t\t<input type=\"number\" id=\"ts3OutPallets\" placeholder=\"0\" min=\"0\" oninput=\"ts3Calc()\">\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t\t<label>B2B: Master Cartons<\/label>\n\t\t\t\t\t\t\t<input type=\"number\" id=\"ts3OutCartons\" placeholder=\"0\" min=\"0\" oninput=\"ts3Calc()\">\n\t\t\t\t\t\t\t<div class=\"ts3-hint\">Loose boxes to retail\/wholesale<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"ts3-b2c-only\">\n\t\t\t\t\t<div class=\"ts3-grid-2\">\n\t\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t\t<label>B2C: Total Orders<\/label>\n\t\t\t\t\t\t\t<input type=\"number\" id=\"ts3OutOrders\" placeholder=\"0\" min=\"0\" oninput=\"ts3Calc()\">\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t\t<label>Items per Order<\/label>\n\t\t\t\t\t\t\t<input type=\"number\" id=\"ts3ItemsPerOrder\" value=\"1.5\" step=\"0.1\" min=\"1\" oninput=\"ts3Calc()\">\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t<label>Return Rate: <span id=\"ts3RetPct\">5<\/span>%<\/label>\n\t\t\t\t\t\t<input type=\"range\" id=\"ts3ReturnRate\" min=\"0\" max=\"30\" value=\"5\" style=\"width:100%; accent-color:#2563eb;\" oninput=\"document.getElementById('ts3RetPct').innerText=this.value; ts3Calc()\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"ts3-step-panel\" data-step=\"4\">\n\t\t\t\t<div class=\"ts3-b2c-only\">\n\t\t\t\t\t<div class=\"ts3-section-header\">\n\t\t\t\t\t\t<span>\ud83c\udf0d Shipping Destinations<\/span>\n\t\t\t\t\t\t<span class=\"ts3-badge bg-green\" id=\"ts3ShipBadge\">0 markets<\/span>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div class=\"ts3-grid-2\">\n\t\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t\t<label>Parcel Weight<\/label>\n\t\t\t\t\t\t\t<div class=\"ts3-mini-seg\" id=\"ts3WeightSeg\">\n\t\t\t\t\t\t\t\t<button data-w=\"A\" class=\"active\" onclick=\"ts3Weight('A', this)\">&lt; 0.5 kg<\/button>\n\t\t\t\t\t\t\t\t<button data-w=\"B\" onclick=\"ts3Weight('B', this)\">0.5 \u2013 1 kg<\/button>\n\t\t\t\t\t\t\t\t<button data-w=\"C\" onclick=\"ts3Weight('C', this)\">1 \u2013 2 kg<\/button>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t\t<label>Region Preset<\/label>\n\t\t\t\t\t\t\t<div class=\"ts3-mini-seg\" id=\"ts3MktPresets\">\n\t\t\t\t\t\t\t\t<button data-p=\"benelux\" onclick=\"ts3MarketPreset('benelux', this)\">Benelux<\/button>\n\t\t\t\t\t\t\t\t<button data-p=\"west\" onclick=\"ts3MarketPreset('west', this)\">West EU<\/button>\n\t\t\t\t\t\t\t\t<button data-p=\"eu\" onclick=\"ts3MarketPreset('eu', this)\">All EU<\/button>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t<div class=\"ts3-chips\" id=\"ts3Markets\">\n\t\t\t\t\t\t\t<span class=\"ts3-chip active\" data-m=\"NL\" onclick=\"ts3Market(this)\">Netherlands<\/span>\n\t\t\t\t\t\t\t<span class=\"ts3-chip\" data-m=\"BE\" onclick=\"ts3Market(this)\">Belgium<\/span>\n\t\t\t\t\t\t\t<span class=\"ts3-chip\" data-m=\"DE\" onclick=\"ts3Market(this)\">Germany<\/span>\n\t\t\t\t\t\t\t<span class=\"ts3-chip\" data-m=\"FR\" onclick=\"ts3Market(this)\">France<\/span>\n\t\t\t\t\t\t\t<span class=\"ts3-chip\" data-m=\"ES\" onclick=\"ts3Market(this)\">Spain<\/span>\n\t\t\t\t\t\t\t<span class=\"ts3-chip\" data-m=\"IT\" onclick=\"ts3Market(this)\">Italy<\/span>\n\t\t\t\t\t\t\t<span class=\"ts3-chip\" data-m=\"AT\" onclick=\"ts3Market(this)\">Austria<\/span>\n\t\t\t\t\t\t\t<span class=\"ts3-chip\" data-m=\"PT\" onclick=\"ts3Market(this)\">Portugal<\/span>\n\t\t\t\t\t\t\t<span class=\"ts3-chip\" data-m=\"IE\" onclick=\"ts3Market(this)\">Ireland<\/span>\n\t\t\t\t\t\t\t<span class=\"ts3-chip\" data-m=\"DK\" onclick=\"ts3Market(this)\">Denmark<\/span>\n\t\t\t\t\t\t\t<span class=\"ts3-chip\" data-m=\"SE\" onclick=\"ts3Market(this)\">Sweden<\/span>\n\t\t\t\t\t\t\t<span class=\"ts3-chip\" data-m=\"PL\" onclick=\"ts3Market(this)\">Poland<\/span>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-hint\">Orders are assumed evenly spread across selected markets. Low end = economy tracked, high end = courier (DPD\/UPS).<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"ts3-step-panel\" data-step=\"5\">\n\t\t\t\t<div class=\"ts3-section-header\">\n\t\t\t\t\t<span>\u2728 Value-Added Services (VAS)<\/span>\n\t\t\t\t\t<span class=\"ts3-badge bg-green\" id=\"ts3VasBadge\">Optional<\/span>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"ts3-toggle-grid\">\n\t\t\t\t\t<label class=\"ts3-toggle-item\" onclick=\"this.classList.toggle('active')\">\n\t\t\t\t\t\t<input type=\"checkbox\" id=\"ts3VasLabeling\" onchange=\"ts3Calc()\">\n\t\t\t\t\t\t\ud83c\udff7\ufe0f Labeling\n\t\t\t\t\t<\/label>\n\t\t\t\t\t<label class=\"ts3-toggle-item\" onclick=\"this.classList.toggle('active')\">\n\t\t\t\t\t\t<input type=\"checkbox\" id=\"ts3VasKitting\" onchange=\"ts3Calc()\">\n\t\t\t\t\t\t\ud83d\udce6 Kitting\n\t\t\t\t\t<\/label>\n\t\t\t\t\t<label class=\"ts3-toggle-item ts3-b2c-only\" onclick=\"this.classList.toggle('active')\">\n\t\t\t\t\t\t<input type=\"checkbox\" id=\"ts3VasGiftwrap\" onchange=\"ts3Calc()\">\n\t\t\t\t\t\t\ud83c\udf81 Gift Wrap\n\t\t\t\t\t<\/label>\n\t\t\t\t\t<label class=\"ts3-toggle-item ts3-b2c-only\" onclick=\"this.classList.toggle('active')\">\n\t\t\t\t\t\t<input type=\"checkbox\" id=\"ts3VasInserts\" onchange=\"ts3Calc()\">\n\t\t\t\t\t\t\ud83d\udcc4 Flyers\n\t\t\t\t\t<\/label>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"ts3-grid-2 ts3-vas-details ts3-hidden\">\n\t\t\t\t\t<div class=\"ts3-input-col\" id=\"ts3LabelingQtyWrap\">\n\t\t\t\t\t\t<label>Labels per Month<\/label>\n\t\t\t\t\t\t<input type=\"number\" id=\"ts3LabelingQty\" placeholder=\"0\" min=\"0\" oninput=\"ts3Calc()\">\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"ts3-input-col\" id=\"ts3KittingQtyWrap\">\n\t\t\t\t\t\t<label>Kits per Month<\/label>\n\t\t\t\t\t\t<input type=\"number\" id=\"ts3KittingQty\" placeholder=\"0\" min=\"0\" oninput=\"ts3Calc()\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"ts3-section-header\">\n\t\t\t\t\t<span>\ud83d\udd0c Integrations<\/span>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"ts3-toggle-grid\">\n\t\t\t\t\t<label class=\"ts3-toggle-item\" onclick=\"this.classList.toggle('active')\">\n\t\t\t\t\t\t<input type=\"checkbox\" id=\"ts3IntWms\" onchange=\"ts3Calc()\">\n\t\t\t\t\t\t\ud83d\udda5\ufe0f Custom API\n\t\t\t\t\t<\/label>\n\t\t\t\t\t<label class=\"ts3-toggle-item ts3-b2c-only\" onclick=\"this.classList.toggle('active')\">\n\t\t\t\t\t\t<input type=\"checkbox\" id=\"ts3IntBol\" onchange=\"ts3Calc()\">\n\t\t\t\t\t\t\ud83d\udfe0 Bol.com\n\t\t\t\t\t<\/label>\n\t\t\t\t\t<label class=\"ts3-toggle-item ts3-b2c-only\" onclick=\"this.classList.toggle('active')\">\n\t\t\t\t\t\t<input type=\"checkbox\" id=\"ts3IntAmazon\" onchange=\"ts3Calc()\">\n\t\t\t\t\t\t\ud83d\udce6 Amazon\n\t\t\t\t\t<\/label>\n\t\t\t\t\t<label class=\"ts3-toggle-item ts3-b2c-only\" onclick=\"this.classList.toggle('active')\">\n\t\t\t\t\t\t<input type=\"checkbox\" id=\"ts3IntShopify\" onchange=\"ts3Calc()\">\n\t\t\t\t\t\t\ud83d\uded2 Shopify\n\t\t\t\t\t<\/label>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"ts3-stepnav\">\n\t\t\t\t\t<button type=\"button\" class=\"ts3-nav-btn ts3-nav-prev\" id=\"ts3Prev\">&larr; Back<\/button>\n\t\t\t\t\t<button type=\"button\" class=\"ts3-nav-btn ts3-nav-next\" id=\"ts3Next\">Next &rarr;<\/button>\n\t\t\t\t<\/div>\n\t\t\t\t<button type=\"button\" class=\"ts3-showall\" id=\"ts3ShowAll\">Show all fields at once<\/button>\n\n\n\t\t\t<\/div>\n\n\t\t\t<div class=\"ts3-panel-right\">\n\n\t\t\t\t<div id=\"ts3-empty\" style=\"text-align:center; margin-top:60px; color:#94a3b8;\">\n\t\t\t\t\t<div style=\"font-size:48px; margin-bottom:16px;\">\ud83d\udcca<\/div>\n\t\t\t\t\tEnter your volumes on the left<br>or select a preset to start.\n\t\t\t\t<\/div>\n\n\t\t\t\t<div id=\"ts3-results\" class=\"ts3-hidden ts3-fade-in\">\n\t\t\t\t\t<div class=\"ts3-res-title\">Estimated Monthly Cost (excl. VAT)<\/div>\n\t\t\t\t\t<div class=\"ts3-res-main\" id=\"ts3Total\">\u20ac0<\/div>\n\t\t\t\t\t<div class=\"ts3-res-sub\">Range: <span id=\"ts3Range\">\u20ac0 - \u20ac0<\/span><\/div>\n\t\t\t\t\t<div class=\"ts3-res-perorder ts3-hidden\" id=\"ts3PerOrderWrap\">\n\t\t\t\t\t\t\u2248 <span class=\"ts3-po-amt\" id=\"ts3PerOrder\">\u20ac0.00<\/span> per shipped order\n\t\t\t\t\t\t<span class=\"ts3-po-note\" id=\"ts3PerOrderNote\"><\/span>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div class=\"ts3-cta-wrap\">\n\t\t\t\t\t\t<div class=\"ts3-cta-title\">Ready for real numbers?<\/div>\n\t\t\t\t\t\t<div class=\"ts3-cta-lead\">The figure above is a market estimate. Actual pricing comes from the providers themselves, based on your profile.<\/div>\n\t\t\t\t\t\t<button id=\"ts3-cta-btn\" class=\"ts3-cta-btn\">Get quotes from matching 3PLs &rarr;<\/button>\n\t\t\t\t\t\t<div class=\"ts3-cta-note\">Free and without obligation.<\/div>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div id=\"ts3-lead\" class=\"ts3-lead ts3-hidden\">\n\t\t\t\t\t<div class=\"ts3-lead-title\">Where should we send the quotes?<\/div>\n\t\t\t\t\t<div class=\"ts3-lead-sub\">Your configuration above is included automatically, so providers quote on your actual profile.<\/div>\n\n\t\t\t\t\t<div class=\"ts3-lead-grid\">\n\t\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t\t<label for=\"ts3LeadName\">Full name *<\/label>\n\t\t\t\t\t\t\t<input type=\"text\" id=\"ts3LeadName\" autocomplete=\"name\">\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t\t<label for=\"ts3LeadEmail\">Email *<\/label>\n\t\t\t\t\t\t\t<input type=\"email\" id=\"ts3LeadEmail\" autocomplete=\"email\">\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-input-col\">\n\t\t\t\t\t\t\t<label for=\"ts3LeadPhone\">Phone (optional)<\/label>\n\t\t\t\t\t\t\t<input type=\"tel\" id=\"ts3LeadPhone\" autocomplete=\"tel\">\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div class=\"ts3-hp\" aria-hidden=\"true\">\n\t\t\t\t\t\t<label for=\"ts3LeadWebsite\">Website<\/label>\n\t\t\t\t\t\t<input type=\"text\" id=\"ts3LeadWebsite\" tabindex=\"-1\" autocomplete=\"off\">\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<button type=\"button\" id=\"ts3LeadSubmit\" class=\"ts3-cta-btn\">Send my request<\/button>\n\t\t\t\t\t<div id=\"ts3LeadStatus\" class=\"ts3-lead-status\"><\/div>\n\t\t\t\t<\/div>\n\n\t\t\t\t\t<div id=\"ts3Alerts\"><\/div>\n\n\t\t\t\t\t<details class=\"ts3-acc\" open>\n\t\t\t\t\t\t<summary>\ud83d\udcca Cost breakdown<\/summary>\n\t\t\t\t\t\t<div class=\"ts3-acc-body\">\n\t\t\t\t\t\t\t<div class=\"ts3-bar-wrap\">\n\t\t\t\t\t\t<div class=\"ts3-bar-title\"><span>Where the money goes<\/span><span>monthly<\/span><\/div>\n\t\t\t\t\t\t<div class=\"ts3-stack\" id=\"ts3Stack\"><\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"ts3-list\">\n\t\t\t\t\t\t<div class=\"ts3-li\">\n\t\t\t\t\t\t\t<span class=\"ts3-li-name\"><span class=\"ts3-dot\" style=\"background:#0f172a\"><\/span>Storage (Rent)<\/span>\n\t\t\t\t\t\t\t<strong id=\"ts3CostStorage\">\u20ac0<\/strong>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-li ts3-sub\" id=\"ts3ClimateRow\" style=\"display:none;\">\n\t\t\t\t\t\t\t<span>+ Climate surcharge<\/span>\n\t\t\t\t\t\t\t<span id=\"ts3CostClimate\">\u20ac0<\/span>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-li ts3-sub\" id=\"ts3LotRow\" style=\"display:none;\">\n\t\t\t\t\t\t\t<span>+ Lot\/Expiry tracking<\/span>\n\t\t\t\t\t\t\t<span>\u20ac95<\/span>\n\t\t\t\t\t\t<\/div>\n\n\t\t\t\t\t\t<div class=\"ts3-li\">\n\t\t\t\t\t\t\t<span class=\"ts3-li-name\"><span class=\"ts3-dot\" style=\"background:#475569\"><\/span>Inbound (Receiving)<\/span>\n\t\t\t\t\t\t\t<strong id=\"ts3CostIn\">\u20ac0<\/strong>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-li ts3-sub\" id=\"ts3QcRow\" style=\"display:none;\">\n\t\t\t\t\t\t\t<span>+ QC Inspection<\/span>\n\t\t\t\t\t\t\t<span id=\"ts3CostQc\">\u20ac0<\/span>\n\t\t\t\t\t\t<\/div>\n\n\t\t\t\t\t\t<div class=\"ts3-li\">\n\t\t\t\t\t\t\t<span class=\"ts3-li-name\"><span class=\"ts3-dot\" style=\"background:#2563eb\"><\/span>Outbound (Picking)<\/span>\n\t\t\t\t\t\t\t<strong id=\"ts3CostPick\">\u20ac0<\/strong>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-li ts3-sub ts3-b2c-only\">\n\t\t\t\t\t\t\t<span>+ Packaging Material<\/span>\n\t\t\t\t\t\t\t<span id=\"ts3CostPack\">\u20ac0<\/span>\n\t\t\t\t\t\t<\/div>\n\n\t\t\t\t\t\t<div class=\"ts3-li ts3-b2c-only\" id=\"ts3ShipRow\">\n\t\t\t\t\t\t\t<span class=\"ts3-li-name\"><span class=\"ts3-dot\" style=\"background:#10b981\"><\/span>Shipping <span id=\"ts3ShipMeta\" style=\"font-weight:400;color:#94a3b8;font-size:11px;margin-left:4px;\"><\/span><\/span>\n\t\t\t\t\t\t\t<strong id=\"ts3CostShip\">\u20ac0<\/strong>\n\t\t\t\t\t\t<\/div>\n\n\t\t\t\t\t\t<div class=\"ts3-li ts3-b2c-only\" style=\"color:#b45309;\">\n\t\t\t\t\t\t\t<span class=\"ts3-li-name\"><span class=\"ts3-dot\" style=\"background:#f59e0b\"><\/span>Returns Handling<\/span>\n\t\t\t\t\t\t\t<strong id=\"ts3CostRet\">\u20ac0<\/strong>\n\t\t\t\t\t\t<\/div>\n\n\t\t\t\t\t\t<div class=\"ts3-li\" id=\"ts3VasRow\" style=\"display:none;\">\n\t\t\t\t\t\t\t<span class=\"ts3-li-name\"><span class=\"ts3-dot\" style=\"background:#8b5cf6\"><\/span>Value-Added Services<\/span>\n\t\t\t\t\t\t\t<strong id=\"ts3CostVas\">\u20ac0<\/strong>\n\t\t\t\t\t\t<\/div>\n\n\t\t\t\t\t\t<div class=\"ts3-li\" style=\"color:#64748b; font-size:12px; background:#f8fafc; padding:8px; border-radius:6px;\">\n\t\t\t\t\t\t\t<span class=\"ts3-li-name\"><span class=\"ts3-dot\" style=\"background:#cbd5e1\"><\/span>Admin, Licences &amp; IT<\/span>\n\t\t\t\t\t\t\t<strong id=\"ts3CostAdmin\">\u20ac0<\/strong>\n\t\t\t\t\t\t<\/div>\n\n\t\t\t\t\t\t<div class=\"ts3-li ts3-total\">\n\t\t\t\t\t\t\t<span>Monthly Total<\/span>\n\t\t\t\t\t\t\t<strong id=\"ts3TotalBottom\">\u20ac0<\/strong>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<details class=\"ts3-dest ts3-b2c-only\" id=\"ts3DestDetails\">\n\t\t\t\t\t\t<summary>Shipping cost per destination \u2192<\/summary>\n\t\t\t\t\t\t<div id=\"ts3DestList\" style=\"margin-top:8px;\"><\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t\t<div class=\"ts3-onetime-box\" id=\"ts3OnetimeBox\" style=\"display:none;\">\n\t\t\t\t\t\t<div class=\"ts3-onetime-title\">\u26a1 One-Time Setup Costs<\/div>\n\t\t\t\t\t\t<div class=\"ts3-onetime-li\" id=\"ts3SetupWmsRow\" style=\"display:none;\">\n\t\t\t\t\t\t\t<span>WMS Integration<\/span>\n\t\t\t\t\t\t\t<strong id=\"ts3CostWmsSetup\">\u20ac0<\/strong>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-onetime-li\" id=\"ts3SetupMktRow\" style=\"display:none;\">\n\t\t\t\t\t\t\t<span>Marketplace Integrations<\/span>\n\t\t\t\t\t\t\t<strong id=\"ts3CostMktSetup\">\u20ac0<\/strong>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-onetime-li\" style=\"border-top:1px solid #fde68a; margin-top:6px; padding-top:6px; font-weight:700;\">\n\t\t\t\t\t\t\t<span>Total Setup<\/span>\n\t\t\t\t\t\t\t<strong id=\"ts3CostSetupTotal\">\u20ac0<\/strong>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\n\t\t\t\t\t<details class=\"ts3-acc\">\n\t\t\t\t\t\t<summary>\ud83d\udccb Your configuration and price factors<\/summary>\n\t\t\t\t\t\t<div class=\"ts3-acc-body\">\n\t\t\t\t\t\t\t<div class=\"ts3-summary-box\" id=\"ts3SummaryBox\">\n\t\t\t\t\t\t<div class=\"ts3-summary-title\">\ud83d\udccb Your Configuration<\/div>\n\t\t\t\t\t\t<div class=\"ts3-summary-config\" id=\"ts3SummaryTags\"><\/div>\n\t\t\t\t\t\t<div class=\"ts3-summary-text\" id=\"ts3SummaryText\"><\/div>\n\t\t\t\t\t\t<div id=\"ts3Insights\"><\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\n\t\t\t\t\t<details class=\"ts3-acc\">\n\t\t\t\t\t\t<summary>\u2139\ufe0f How this estimate is built<\/summary>\n\t\t\t\t\t\t<div class=\"ts3-acc-body\">\n\t\t\t\t\t\t\t<div class=\"ts3-range-box\">\n\t\t\t\t\t\t<strong>Why a range?<\/strong> The low end reflects economy tracked shipping and lean fulfilment terms; the high end reflects courier shipping (DPD\/UPS) and richer service levels. Final pricing depends on contract length, volume commitment, and negotiation. The estimate shows the median of quotes we've seen for similar profiles.\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"ts3-credibility\">\n\t\t\t\t\t\t<div class=\"ts3-credibility-title\">\ud83d\udcca About This Estimate<\/div>\n\t\t\t\t\t\t<div class=\"ts3-credibility-stats\">\n\t\t\t\t\t\t\t<div class=\"ts3-stat\">\n\t\t\t\t\t\t\t\t<div class=\"ts3-stat-num\">500+<\/div>\n\t\t\t\t\t\t\t\t<div class=\"ts3-stat-label\">Client Quotes<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"ts3-stat\">\n\t\t\t\t\t\t\t\t<div class=\"ts3-stat-num\">45+<\/div>\n\t\t\t\t\t\t\t\t<div class=\"ts3-stat-label\">3PL Partners<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"ts3-stat\">\n\t\t\t\t\t\t\t\t<div class=\"ts3-stat-num\">2026<\/div>\n\t\t\t\t\t\t\t\t<div class=\"ts3-stat-label\">Rate Data<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"ts3-credibility-text\">\n\t\t\t\t\t\t\tBased on anonymized data from 500+ warehouse RFQs processed through our platform, validated against current rate cards from 45+ Dutch 3PL providers. Shipping figures use indicative carrier rates for tracked parcels (incl. fuel surcharge). Rates updated Q1 2026 to reflect labor cost adjustments (CAO Logistics) and energy surcharges.\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t<\/div>\n\n\t\t\t<\/div>\n\t\t<\/div>\n\t<\/div>\n\t<div id=\"ts3MobileBar\" class=\"ts3-mobile-bar\">\n\t\t<div>\n\t\t\t<span class=\"ts3-mb-label\">Estimate per month<\/span>\n\t\t\t<span class=\"ts3-mb-total\" id=\"ts3MobileTotal\">&euro;0<\/span>\n\t\t<\/div>\n\t\t<button type=\"button\" class=\"ts3-mb-btn\" id=\"ts3MobileCta\">Get quotes<\/button>\n\t<\/div>\n\t<\/div>\n\n\t<script>\n\t(function () {\n\tconst TS3_AJAX = 'https:\/\/www.zendeq.com\/wp-admin\/admin-ajax.php';\n\n\t\/\/ =====================================================\n\t\/\/ CONFIGURATION: 2026 REAL-WORLD DATA (NL)\n\t\/\/ =====================================================\n\tconst RATES = {\n\t\tstorage: {\n\t\t\tpallet_euro: { low: 3.00, avg: 4.25, high: 5.50 },\n\t\t\tshelf_bin: { low: 0.50, avg: 1.25, high: 2.00 }\n\t\t},\n\t\tinbound: {\n\t\t\ttruck_pallet: { low: 3.50, avg: 4.25, high: 5.50 },\n\t\t\tcontainer_loose: { low: 400, avg: 525, high: 650 }\n\t\t},\n\t\toutbound: {\n\t\t\tb2b_pallet: { low: 3.50, avg: 5.00, high: 6.50 },\n\t\t\tb2b_carton: { low: 0.75, avg: 0.95, high: 1.25 },\n\t\t\tb2c_base: { low: 1.35, avg: 1.65, high: 2.25 },\n\t\t\tb2c_pick: { low: 0.30, avg: 0.35, high: 0.55 },\n\t\t\tb2c_pack_mat: { low: 0.50, avg: 0.75, high: 1.10 }\n\t\t},\n\t\treturns: {\n\t\t\tb2c_item: { low: 2.95, avg: 3.50, high: 4.50 }\n\t\t},\n\t\tvas: {\n\t\t\tlabeling: { low: 0.08, avg: 0.12, high: 0.18 },\n\t\t\tkitting: { low: 1.50, avg: 2.25, high: 3.50 },\n\t\t\tgiftwrap: { low: 1.25, avg: 1.75, high: 2.50 },\n\t\t\tinserts: { low: 0.10, avg: 0.15, high: 0.25 },\n\t\t\tqc_inbound: { low: 0.25, avg: 0.35, high: 0.50 }\n\t\t},\n\t\tlot_tracking: 95,\n\t\tadmin: {\n\t\t\tbase: 285,\n\t\t\tmin_spend: 500,\n\t\t\twaive_threshold: 3500\n\t\t},\n\t\tsetup: {\n\t\t\twms_basic: { low: 500, avg: 850, high: 1500 },\n\t\t\twms_complex: { low: 1500, avg: 2500, high: 4000 },\n\t\t\tmarketplace: { low: 150, avg: 250, high: 400 }\n\t\t},\n\t\tfactors: {\n\t\t\tgoods: { std: 1.0, food: 1.20, adr: 1.65, med: 1.40 },\n\t\t\tclimate: { ambient: 1.0, conditioned: 1.15, chilled: 1.45, frozen: 1.80 },\n\t\t\tregion: { randstad: 1.0, south: 0.87, east: 0.85 },\n\t\t\tseason: { normal: 1.0, peak: 1.15 },\n\t\t\tsku_complexity: { low: 1.0, mid: 1.08, high: 1.15 }\n\t\t},\n\t\tthresholds: {\n\t\t\tlow_volume_surcharge: 100,\n\t\t\tlow_volume_fee: 150,\n\t\t\tenterprise_pallets: 500\n\t\t}\n\t};\n\n\tconst SHIP = {\n\t\tNL: { n: 'Netherlands', e: [6.88, 6.88, 6.88], c: 9.55 },\n\t\tBE: { n: 'Belgium',     e: [8.65, 8.65, 8.65], c: 11.70 },\n\t\tDE: { n: 'Germany',     e: [7.08, 7.08, 7.93], c: 11.77 },\n\t\tFR: { n: 'France',      e: [7.52, 8.05, 10.32], c: 11.92 },\n\t\tES: { n: 'Spain',       e: [6.12, 6.65, 8.23], c: 16.00 },\n\t\tIT: { n: 'Italy',       e: [8.93, 9.38, 10.22], c: 17.02 },\n\t\tAT: { n: 'Austria',     e: [7.43, 8.18, 9.20], c: 13.58 },\n\t\tPT: { n: 'Portugal',    e: [7.00, 7.57, 9.45], c: 17.72 },\n\t\tIE: { n: 'Ireland',     e: [8.07, 8.40, 8.87], c: 15.58 },\n\t\tDK: { n: 'Denmark',     e: [9.22, 10.17, 10.38], c: 16.72 },\n\t\tSE: { n: 'Sweden',      e: [7.27, 9.87, 15.53], c: 22.40 },\n\t\tPL: { n: 'Poland',      e: [6.65, 7.00, 8.03], c: 14.85 }\n\t};\n\tconst BAND = { A: 0, B: 1, C: 2 };\n\tconst FUEL = 1.03;\n\tconst MARKET_PRESETS = {\n\t\tbenelux: ['NL', 'BE'],\n\t\twest: ['NL', 'BE', 'DE', 'FR', 'ES'],\n\t\teu: ['NL', 'BE', 'DE', 'FR', 'ES', 'IT', 'AT', 'PT', 'IE', 'DK', 'SE', 'PL']\n\t};\n\n\tconst LABELS = {\n\t\tmode: { b2b: 'B2B \/ Wholesale', b2c: 'B2C \/ E-commerce', hybrid: 'Hybrid (B2B + B2C)' },\n\t\tregion: { randstad: 'Randstad', south: 'Brabant \/ Limburg', east: 'East Netherlands' },\n\t\tseason: { normal: 'Normal Season', peak: 'Peak Season (Q4)' },\n\t\tgoods: { std: 'Standard Cargo', food: 'Food \/ HACCP', adr: 'Dangerous Goods (ADR)', med: 'Medical \/ Pharma' },\n\t\tclimate: { ambient: 'Ambient', conditioned: 'Conditioned (15-25\u00b0C)', chilled: 'Chilled (2-8\u00b0C)', frozen: 'Frozen (-18\u00b0C)' },\n\t\tweight: { A: '< 0.5 kg', B: '0.5-1 kg', C: '1-2 kg' }\n\t};\n\n\tlet mode = 'b2c';\n\tlet region = 'randstad';\n\tlet season = 'normal';\n\tlet weightBand = 'A';\n\tlet markets = { NL: true };\n\n\tfunction ts3SelectedMarkets() {\n\t\treturn Object.keys(markets).filter(m => markets[m]);\n\t}\n\n\t\/\/ =====================================================\n\t\/\/ MODE \/ REGION \/ SEASON SWITCHERS\n\t\/\/ =====================================================\n\twindow.ts3Switch = function(newMode, btn) {\n\t\tmode = newMode;\n\t\tdocument.querySelectorAll('[data-mode]').forEach(b => b.classList.remove('active'));\n\t\tbtn.classList.add('active');\n\n\t\tconst b2cEls = document.querySelectorAll('.ts3-b2c-only');\n\t\tconst b2bEls = document.querySelectorAll('.ts3-b2b-only');\n\n\t\tif (mode === 'b2b') {\n\t\t\tb2cEls.forEach(el => el.classList.add('ts3-hidden'));\n\t\t\tb2bEls.forEach(el => el.classList.remove('ts3-hidden'));\n\t\t} else if (mode === 'b2c') {\n\t\t\tb2cEls.forEach(el => el.classList.remove('ts3-hidden'));\n\t\t\tb2bEls.forEach(el => el.classList.add('ts3-hidden'));\n\t\t} else {\n\t\t\tb2cEls.forEach(el => el.classList.remove('ts3-hidden'));\n\t\t\tb2bEls.forEach(el => el.classList.remove('ts3-hidden'));\n\t\t}\n\t\tif (typeof ts3RenderSteps === 'function') ts3RenderSteps();\n\t\tts3Calc();\n\t}\n\n\twindow.ts3Region = function(newRegion, btn) {\n\t\tregion = newRegion;\n\t\tdocument.querySelectorAll('[data-region]').forEach(b => b.classList.remove('active'));\n\t\tbtn.classList.add('active');\n\t\tts3Calc();\n\t}\n\n\twindow.ts3Season = function(newSeason, btn) {\n\t\tseason = newSeason;\n\t\tdocument.querySelectorAll('[data-season]').forEach(b => b.classList.remove('active'));\n\t\tbtn.classList.add('active');\n\t\tts3Calc();\n\t}\n\n\t\/\/ =====================================================\n\t\/\/ SHIPPING CONTROLS\n\t\/\/ =====================================================\n\twindow.ts3Weight = function(band, btn) {\n\t\tweightBand = band;\n\t\tdocument.querySelectorAll('#ts3WeightSeg button').forEach(b => b.classList.remove('active'));\n\t\tbtn.classList.add('active');\n\t\tts3Calc();\n\t}\n\n\twindow.ts3Market = function(chip) {\n\t\tconst m = chip.getAttribute('data-m');\n\t\tconst isActive = chip.classList.contains('active');\n\t\tchip.classList.toggle('active');\n\t\tmarkets[m] = !isActive;\n\t\tdocument.querySelectorAll('#ts3MktPresets button').forEach(b => b.classList.remove('active'));\n\t\tts3Calc();\n\t}\n\n\twindow.ts3MarketPreset = function(preset, btn) {\n\t\tmarkets = {};\n\t\t(MARKET_PRESETS[preset] || []).forEach(m => { markets[m] = true; });\n\t\tdocument.querySelectorAll('#ts3Markets .ts3-chip').forEach(chip => {\n\t\t\tconst m = chip.getAttribute('data-m');\n\t\t\tchip.classList.toggle('active', !!markets[m]);\n\t\t});\n\t\tdocument.querySelectorAll('#ts3MktPresets button').forEach(b => b.classList.remove('active'));\n\t\tif (btn) btn.classList.add('active');\n\t\tts3Calc();\n\t}\n\n\t\/\/ =====================================================\n\t\/\/ PRESETS\n\t\/\/ =====================================================\n\twindow.ts3Preset = function(type) {\n\t\tdocument.querySelectorAll('.ts3-preset-btn').forEach(b => b.classList.remove('active'));\n\t\tconst activeBtn = document.querySelector(`.ts3-preset-btn[data-preset=\"${type}\"]`);\n\t\tif (activeBtn) activeBtn.classList.add('active');\n\n\t\tdocument.querySelectorAll('#ts3-calc-wrapper input[type=\"number\"]').forEach(i => i.value = '');\n\t\tdocument.querySelectorAll('#ts3-calc-wrapper input[type=\"checkbox\"]').forEach(c => { c.checked = false; c.closest('.ts3-toggle-item')?.classList.remove('active'); });\n\t\tdocument.getElementById('ts3GoodsType').value = 'std';\n\t\tdocument.getElementById('ts3Climate').value = 'ambient';\n\t\tdocument.getElementById('ts3ReturnRate').value = 5;\n\t\tdocument.getElementById('ts3RetPct').innerText = '5';\n\t\tdocument.getElementById('ts3ItemsPerOrder').value = 1.5;\n\n\t\tweightBand = 'A';\n\t\tdocument.querySelectorAll('#ts3WeightSeg button').forEach(b => b.classList.toggle('active', b.getAttribute('data-w') === 'A'));\n\n\t\tif (type === 'starter') {\n\t\t\tts3MarketPreset('benelux', document.querySelector('#ts3MktPresets [data-p=\"benelux\"]'));\n\t\t\tdocument.getElementById('ts3Pallets').value = 10;\n\t\t\tdocument.getElementById('ts3Shelves').value = 30;\n\t\t\tdocument.getElementById('ts3Skus').value = 50;\n\t\t\tdocument.getElementById('ts3InPallets').value = 5;\n\t\t\tdocument.getElementById('ts3OutOrders').value = 200;\n\t\t\tdocument.getElementById('ts3ItemsPerOrder').value = 1.8;\n\t\t\tdocument.getElementById('ts3ReturnRate').value = 8;\n\t\t\tdocument.getElementById('ts3RetPct').innerText = '8';\n\t\t\tts3Switch('b2c', document.querySelector('[data-mode=\"b2c\"]'));\n\t\t} else if (type === 'midsize') {\n\t\t\tts3MarketPreset('west', document.querySelector('#ts3MktPresets [data-p=\"west\"]'));\n\t\t\tdocument.getElementById('ts3Pallets').value = 80;\n\t\t\tdocument.getElementById('ts3Shelves').value = 200;\n\t\t\tdocument.getElementById('ts3Skus').value = 300;\n\t\t\tdocument.getElementById('ts3InPallets').value = 40;\n\t\t\tdocument.getElementById('ts3InContainers').value = 2;\n\t\t\tdocument.getElementById('ts3OutOrders').value = 2000;\n\t\t\tdocument.getElementById('ts3ItemsPerOrder').value = 2.2;\n\t\t\tdocument.getElementById('ts3ReturnRate').value = 12;\n\t\t\tdocument.getElementById('ts3RetPct').innerText = '12';\n\t\t\tdocument.getElementById('ts3IntShopify').checked = true;\n\t\t\tdocument.getElementById('ts3IntShopify').closest('.ts3-toggle-item').classList.add('active');\n\t\t\tts3Switch('b2c', document.querySelector('[data-mode=\"b2c\"]'));\n\t\t} else if (type === 'wholesale') {\n\t\t\tdocument.getElementById('ts3Pallets').value = 200;\n\t\t\tdocument.getElementById('ts3Skus').value = 50;\n\t\t\tdocument.getElementById('ts3InPallets').value = 80;\n\t\t\tdocument.getElementById('ts3InContainers').value = 4;\n\t\t\tdocument.getElementById('ts3OutPallets').value = 60;\n\t\t\tdocument.getElementById('ts3OutCartons').value = 150;\n\t\t\tts3Switch('b2b', document.querySelector('[data-mode=\"b2b\"]'));\n\t\t} else if (type === 'enterprise') {\n\t\t\tts3MarketPreset('eu', document.querySelector('#ts3MktPresets [data-p=\"eu\"]'));\n\t\t\tweightBand = 'B';\n\t\t\tdocument.querySelectorAll('#ts3WeightSeg button').forEach(b => b.classList.toggle('active', b.getAttribute('data-w') === 'B'));\n\t\t\tdocument.getElementById('ts3Pallets').value = 800;\n\t\t\tdocument.getElementById('ts3Shelves').value = 400;\n\t\t\tdocument.getElementById('ts3Skus').value = 1200;\n\t\t\tdocument.getElementById('ts3InPallets').value = 200;\n\t\t\tdocument.getElementById('ts3InContainers').value = 8;\n\t\t\tdocument.getElementById('ts3OutPallets').value = 120;\n\t\t\tdocument.getElementById('ts3OutCartons').value = 500;\n\t\t\tdocument.getElementById('ts3OutOrders').value = 5000;\n\t\t\tdocument.getElementById('ts3ItemsPerOrder').value = 2.5;\n\t\t\tdocument.getElementById('ts3LotTracking').checked = true;\n\t\t\tdocument.getElementById('ts3IntWms').checked = true;\n\t\t\tdocument.getElementById('ts3IntWms').closest('.ts3-toggle-item').classList.add('active');\n\t\t\tts3Switch('hybrid', document.querySelector('[data-mode=\"hybrid\"]'));\n\t\t}\n\n\t\tts3Calc();\n\t}\n\n\t\/\/ =====================================================\n\t\/\/ MAIN CALCULATION\n\t\/\/ =====================================================\n\twindow.ts3Calc = function() {\n\t\tconst pallets = parseFloat(document.getElementById('ts3Pallets').value) || 0;\n\t\tconst shelves = parseFloat(document.getElementById('ts3Shelves').value) || 0;\n\t\tconst skus = parseFloat(document.getElementById('ts3Skus').value) || 0;\n\t\tconst inPallets = parseFloat(document.getElementById('ts3InPallets').value) || 0;\n\t\tconst inCont = parseFloat(document.getElementById('ts3InContainers').value) || 0;\n\t\tconst goodsType = document.getElementById('ts3GoodsType').value;\n\t\tconst climate = document.getElementById('ts3Climate').value;\n\t\tconst lotTracking = document.getElementById('ts3LotTracking').checked;\n\t\tconst qcInbound = document.getElementById('ts3QcInbound').checked;\n\n\t\tconst outPallets = parseFloat(document.getElementById('ts3OutPallets').value) || 0;\n\t\tconst outCartons = parseFloat(document.getElementById('ts3OutCartons').value) || 0;\n\t\tconst outOrders = parseFloat(document.getElementById('ts3OutOrders').value) || 0;\n\t\tconst itemsPerOrder = parseFloat(document.getElementById('ts3ItemsPerOrder').value) || 1;\n\t\tconst retRate = parseFloat(document.getElementById('ts3ReturnRate').value) || 0;\n\n\t\tconst vasLabeling = document.getElementById('ts3VasLabeling').checked;\n\t\tconst vasKitting = document.getElementById('ts3VasKitting').checked;\n\t\tconst vasGiftwrap = document.getElementById('ts3VasGiftwrap')?.checked || false;\n\t\tconst vasInserts = document.getElementById('ts3VasInserts')?.checked || false;\n\t\tconst labelingQty = parseFloat(document.getElementById('ts3LabelingQty').value) || 0;\n\t\tconst kittingQty = parseFloat(document.getElementById('ts3KittingQty').value) || 0;\n\n\t\tconst intWms = document.getElementById('ts3IntWms').checked;\n\t\tconst intBol = document.getElementById('ts3IntBol')?.checked || false;\n\t\tconst intAmazon = document.getElementById('ts3IntAmazon')?.checked || false;\n\t\tconst intShopify = document.getElementById('ts3IntShopify')?.checked || false;\n\n\t\tconst vasDetailsEl = document.querySelector('.ts3-vas-details');\n\t\tif (vasLabeling || vasKitting) {\n\t\t\tvasDetailsEl.classList.remove('ts3-hidden');\n\t\t\tdocument.getElementById('ts3LabelingQtyWrap').style.display = vasLabeling ? 'block' : 'none';\n\t\t\tdocument.getElementById('ts3KittingQtyWrap').style.display = vasKitting ? 'block' : 'none';\n\t\t} else {\n\t\t\tvasDetailsEl.classList.add('ts3-hidden');\n\t\t}\n\n\t\tif (pallets + shelves + inPallets + inCont + outPallets + outOrders + outCartons === 0) {\n\t\t\tdocument.getElementById('ts3-empty').classList.remove('ts3-hidden');\n\t\t\tdocument.getElementById('ts3-results').classList.add('ts3-hidden');\n\t\t\tconst mb0 = document.getElementById('ts3MobileBar');\n\t\t\tif (mb0) mb0.classList.remove('ts3-on');\n\t\t\treturn;\n\t\t}\n\n\t\tconst weeks = 4.33;\n\t\tconst goodsFactor = RATES.factors.goods[goodsType] || 1.0;\n\t\tconst climateFactor = RATES.factors.climate[climate] || 1.0;\n\t\tconst regionFactor = RATES.factors.region[region] || 1.0;\n\t\tconst seasonFactor = RATES.factors.season[season] || 1.0;\n\n\t\tlet skuFactor = RATES.factors.sku_complexity.low;\n\t\tif (skus > 500) skuFactor = RATES.factors.sku_complexity.high;\n\t\telse if (skus > 100) skuFactor = RATES.factors.sku_complexity.mid;\n\n\t\tconst storageFactor = goodsFactor * regionFactor;\n\t\tconst handlingFactor = goodsFactor * regionFactor * seasonFactor;\n\n\t\tlet pRate = RATES.storage.pallet_euro.avg;\n\t\tif (pallets > RATES.thresholds.enterprise_pallets) pRate = RATES.storage.pallet_euro.low;\n\n\t\tlet costStorageBase = ((pallets * pRate) + (shelves * RATES.storage.shelf_bin.avg)) * weeks;\n\t\tlet costStorageClimate = costStorageBase * (climateFactor - 1);\n\t\tlet costStorage = (costStorageBase * climateFactor * storageFactor);\n\t\tlet costLot = lotTracking ? RATES.lot_tracking : 0;\n\n\t\tlet costIn = (inPallets * RATES.inbound.truck_pallet.avg) + (inCont * RATES.inbound.container_loose.avg);\n\t\tcostIn = costIn * handlingFactor;\n\n\t\tlet costQc = 0;\n\t\tif (qcInbound) {\n\t\t\tlet estUnitsIn = (inPallets * 50) + (inCont * 800);\n\t\t\tcostQc = estUnitsIn * RATES.vas.qc_inbound.avg;\n\t\t}\n\n\t\tlet costPick = 0;\n\t\tlet costPickB2C = 0;\n\t\tlet costPackMat = 0;\n\n\t\tif (mode !== 'b2c') {\n\t\t\tcostPick += (outPallets * RATES.outbound.b2b_pallet.avg);\n\t\t\tcostPick += (outCartons * RATES.outbound.b2b_carton.avg);\n\t\t}\n\t\tif (mode !== 'b2b') {\n\t\t\tlet lineCost = Math.max(0, (itemsPerOrder - 1) * RATES.outbound.b2c_pick.avg);\n\t\t\tcostPickB2C = outOrders * (RATES.outbound.b2c_base.avg + lineCost) * skuFactor;\n\t\t\tcostPick += costPickB2C;\n\t\t\tcostPackMat = outOrders * RATES.outbound.b2c_pack_mat.avg;\n\t\t}\n\t\tcostPick = costPick * handlingFactor;\n\t\tcostPickB2C = costPickB2C * handlingFactor;\n\n\t\tlet shipLoPer = 0, shipHiPer = 0, shipMidPer = 0;\n\t\tlet perDest = [];\n\t\tconst mk = ts3SelectedMarkets();\n\t\tconst b = BAND[weightBand];\n\n\t\tif (mode !== 'b2b' && mk.length > 0) {\n\t\t\tmk.forEach(m => {\n\t\t\t\tconst s = SHIP[m];\n\t\t\t\tconst lo = s.e[b] * FUEL;\n\t\t\t\tconst hi = s.c * FUEL;\n\t\t\t\tshipLoPer += lo;\n\t\t\t\tshipHiPer += hi;\n\t\t\t\tperDest.push({ m: m, nm: s.n, lo: lo, hi: hi, mid: (lo + hi) \/ 2 });\n\t\t\t});\n\t\t\tshipLoPer \/= mk.length;\n\t\t\tshipHiPer \/= mk.length;\n\t\t\tshipMidPer = (shipLoPer + shipHiPer) \/ 2;\n\t\t}\n\t\tlet costShip = outOrders * shipMidPer;\n\t\tlet costShipLo = outOrders * shipLoPer;\n\t\tlet costShipHi = outOrders * shipHiPer;\n\n\t\tlet costRet = 0;\n\t\tif (mode !== 'b2b') {\n\t\t\tlet returnVol = outOrders * (retRate \/ 100);\n\t\t\tcostRet = returnVol * RATES.returns.b2c_item.avg;\n\t\t}\n\n\t\tlet costVas = 0;\n\t\tif (vasLabeling && labelingQty > 0) costVas += labelingQty * RATES.vas.labeling.avg;\n\t\tif (vasKitting && kittingQty > 0) costVas += kittingQty * RATES.vas.kitting.avg;\n\t\tif (vasGiftwrap && mode !== 'b2b') costVas += outOrders * 0.10 * RATES.vas.giftwrap.avg;\n\t\tif (vasInserts && mode !== 'b2b') costVas += outOrders * RATES.vas.inserts.avg;\n\n\t\tlet costAdmin = RATES.admin.base;\n\t\tlet subtotal = costStorage + costIn + costPick;\n\t\tif (subtotal > RATES.admin.waive_threshold) costAdmin = 0;\n\n\t\tlet lowVolumeSurcharge = 0;\n\t\tif (mode !== 'b2b' && outOrders > 0 && outOrders < RATES.thresholds.low_volume_surcharge) {\n\t\t\tlowVolumeSurcharge = RATES.thresholds.low_volume_fee;\n\t\t}\n\n\t\tlet setupWms = 0;\n\t\tlet setupMarketplaces = 0;\n\n\t\tif (intWms) setupWms = skus > 500 ? RATES.setup.wms_complex.avg : RATES.setup.wms_basic.avg;\n\n\t\tlet marketplaceCount = [intBol, intAmazon, intShopify].filter(Boolean).length;\n\t\tif (marketplaceCount > 0) setupMarketplaces = marketplaceCount * RATES.setup.marketplace.avg;\n\t\tlet setupTotal = setupWms + setupMarketplaces;\n\n\t\tlet totalNonShip = costStorage + costLot + costIn + costQc + costPick + costPackMat + costRet + costVas + costAdmin + lowVolumeSurcharge;\n\t\tlet total = totalNonShip + costShip;\n\t\tlet rangeLow = totalNonShip * 0.85 + costShipLo;\n\t\tlet rangeHigh = totalNonShip * 1.15 + costShipHi;\n\n\t\tif (total < RATES.admin.min_spend && total > 0) {\n\t\t\ttotal = RATES.admin.min_spend;\n\t\t\trangeLow = RATES.admin.min_spend;\n\t\t}\n\n\t\tconst fmt = n => '\u20ac' + Math.round(n).toLocaleString('en-US');\n\t\tconst fmt2 = n => '\u20ac' + n.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n\n\t\tdocument.getElementById('ts3Total').innerText = fmt(total);\n\t\tdocument.getElementById('ts3TotalBottom').innerText = fmt(total);\n\t\tdocument.getElementById('ts3Range').innerText = fmt(rangeLow) + ' - ' + fmt(rangeHigh);\n\n\t\tdocument.getElementById('ts3CostStorage').innerText = fmt(costStorage);\n\t\tdocument.getElementById('ts3CostIn').innerText = fmt(costIn + costQc);\n\t\tdocument.getElementById('ts3CostPick').innerText = fmt(costPick);\n\t\tdocument.getElementById('ts3CostPack').innerText = fmt(costPackMat);\n\t\tdocument.getElementById('ts3CostShip').innerText = fmt(costShip);\n\t\tdocument.getElementById('ts3CostRet').innerText = fmt(costRet);\n\t\tdocument.getElementById('ts3CostVas').innerText = fmt(costVas);\n\t\tdocument.getElementById('ts3CostAdmin').innerText = fmt(costAdmin + lowVolumeSurcharge);\n\n\t\tdocument.getElementById('ts3ShipMeta').innerText = mk.length > 0 ? `(${mk.length} market${mk.length > 1 ? 's' : ''}, ${LABELS.weight[weightBand]})` : '';\n\t\tconst shipBadge = document.getElementById('ts3ShipBadge');\n\t\tshipBadge.innerText = mk.length + ' market' + (mk.length === 1 ? '' : 's');\n\t\tshipBadge.className = mk.length > 0 ? 'ts3-badge bg-green' : 'ts3-badge bg-red';\n\n\t\tconst perOrderWrap = document.getElementById('ts3PerOrderWrap');\n\t\tif (mode !== 'b2b' && outOrders > 0) {\n\t\t\tperOrderWrap.classList.remove('ts3-hidden');\n\t\t\tlet perOrderVal, perOrderNote;\n\t\t\tif (mode === 'b2c') {\n\t\t\t\tperOrderVal = total \/ outOrders;\n\t\t\t\tperOrderNote = 'All-in: fulfilment, storage, shipping, returns and fixed costs';\n\t\t\t} else {\n\t\t\t\tperOrderVal = (costPickB2C + costPackMat + costRet + costShip) \/ outOrders;\n\t\t\t\tperOrderNote = 'B2C handling, packaging, returns and shipping (excl. shared storage\/admin)';\n\t\t\t}\n\t\t\tdocument.getElementById('ts3PerOrder').innerText = fmt2(perOrderVal);\n\t\t\tdocument.getElementById('ts3PerOrderNote').innerText = perOrderNote;\n\t\t} else {\n\t\t\tperOrderWrap.classList.add('ts3-hidden');\n\t\t}\n\n\t\tconst barComponents = [\n\t\t\t{ nm: 'Storage', amt: costStorage + costLot, color: '#0f172a' },\n\t\t\t{ nm: 'Inbound', amt: costIn + costQc, color: '#475569' },\n\t\t\t{ nm: 'Picking', amt: costPick, color: '#2563eb' },\n\t\t\t{ nm: 'Packaging', amt: costPackMat, color: '#93c5fd' },\n\t\t\t{ nm: 'Shipping', amt: costShip, color: '#10b981' },\n\t\t\t{ nm: 'Returns', amt: costRet, color: '#f59e0b' },\n\t\t\t{ nm: 'VAS', amt: costVas, color: '#8b5cf6' },\n\t\t\t{ nm: 'Admin', amt: costAdmin + lowVolumeSurcharge, color: '#cbd5e1' }\n\t\t];\n\t\tconst barTotal = barComponents.reduce((s, c) => s + c.amt, 0);\n\t\tconst stack = document.getElementById('ts3Stack');\n\t\tstack.innerHTML = '';\n\t\tif (barTotal > 0) {\n\t\t\tbarComponents.forEach(c => {\n\t\t\t\tconst pct = c.amt \/ barTotal * 100;\n\t\t\t\tif (pct > 0.4) {\n\t\t\t\t\tconst seg = document.createElement('div');\n\t\t\t\t\tseg.className = 'ts3-seg-b';\n\t\t\t\t\tseg.style.width = pct + '%';\n\t\t\t\t\tseg.style.background = c.color;\n\t\t\t\t\tseg.title = c.nm + ': ' + fmt(c.amt) + ' (' + Math.round(pct) + '%)';\n\t\t\t\t\tstack.appendChild(seg);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst destDetails = document.getElementById('ts3DestDetails');\n\t\tconst destList = document.getElementById('ts3DestList');\n\t\tif (mode !== 'b2b' && perDest.length > 0) {\n\t\t\tdestDetails.style.display = 'block';\n\t\t\tconst maxHi = Math.max(...perDest.map(d => d.hi));\n\t\t\tdestList.innerHTML = perDest\n\t\t\t\t.sort((a, b2) => a.mid - b2.mid)\n\t\t\t\t.map(d => `\n\t\t\t\t\t<div class=\"ts3-dest-row\">\n\t\t\t\t\t\t<span class=\"ts3-dn\">${d.nm}<\/span>\n\t\t\t\t\t\t<span class=\"ts3-dest-track\"><span class=\"ts3-dest-fill\" style=\"width:${(d.mid \/ maxHi * 100)}%\"><\/span><\/span>\n\t\t\t\t\t\t<span class=\"ts3-da\">${fmt2(d.lo)} \u2013 ${fmt2(d.hi)}<\/span>\n\t\t\t\t\t<\/div>\n\t\t\t\t`).join('');\n\t\t} else {\n\t\t\tdestDetails.style.display = 'none';\n\t\t}\n\n\t\tconst climateRow = document.getElementById('ts3ClimateRow');\n\t\tif (climate !== 'ambient') {\n\t\t\tclimateRow.style.display = 'flex';\n\t\t\tdocument.getElementById('ts3CostClimate').innerText = fmt(costStorageClimate * storageFactor * weeks);\n\t\t} else {\n\t\t\tclimateRow.style.display = 'none';\n\t\t}\n\n\t\tdocument.getElementById('ts3LotRow').style.display = lotTracking ? 'flex' : 'none';\n\n\t\tconst qcRow = document.getElementById('ts3QcRow');\n\t\tif (qcInbound && costQc > 0) {\n\t\t\tqcRow.style.display = 'flex';\n\t\t\tdocument.getElementById('ts3CostQc').innerText = fmt(costQc);\n\t\t} else {\n\t\t\tqcRow.style.display = 'none';\n\t\t}\n\n\t\tdocument.getElementById('ts3VasRow').style.display = costVas > 0 ? 'flex' : 'none';\n\n\t\tconst onetimeBox = document.getElementById('ts3OnetimeBox');\n\t\tif (setupTotal > 0) {\n\t\t\tonetimeBox.style.display = 'block';\n\t\t\tdocument.getElementById('ts3SetupWmsRow').style.display = setupWms > 0 ? 'flex' : 'none';\n\t\t\tdocument.getElementById('ts3CostWmsSetup').innerText = fmt(setupWms);\n\t\t\tdocument.getElementById('ts3SetupMktRow').style.display = setupMarketplaces > 0 ? 'flex' : 'none';\n\t\t\tdocument.getElementById('ts3CostMktSetup').innerText = fmt(setupMarketplaces);\n\t\t\tdocument.getElementById('ts3CostSetupTotal').innerText = fmt(setupTotal);\n\t\t} else {\n\t\t\tonetimeBox.style.display = 'none';\n\t\t}\n\n\t\tlet tags = [];\n\t\ttags.push(LABELS.mode[mode]);\n\t\ttags.push(LABELS.region[region]);\n\t\tif (season === 'peak') tags.push('\ud83d\udd25 Peak Season');\n\t\tif (goodsType !== 'std') tags.push(LABELS.goods[goodsType]);\n\t\tif (climate !== 'ambient') tags.push(LABELS.climate[climate]);\n\t\tif (mode !== 'b2b' && mk.length > 0) tags.push(mk.length + ' EU market' + (mk.length > 1 ? 's' : ''));\n\t\tif (pallets > RATES.thresholds.enterprise_pallets) tags.push('Enterprise Volume');\n\t\tif (skus > 500) tags.push('High SKU Complexity');\n\t\tif (lotTracking) tags.push('FEFO Tracking');\n\n\t\tdocument.getElementById('ts3SummaryTags').innerHTML = tags.map(t => `<span class=\"ts3-config-tag\">${t}<\/span>`).join('');\n\n\t\tlet drivers = [];\n\n\t\tif (goodsType === 'adr') drivers.push({ text: 'ADR goods require specialized storage (+65%)', dir: 'up' });\n\t\telse if (goodsType === 'med') drivers.push({ text: 'Pharma compliance adds handling complexity (+40%)', dir: 'up' });\n\t\telse if (goodsType === 'food') drivers.push({ text: 'HACCP certification increases rates (+20%)', dir: 'up' });\n\n\t\tif (climate === 'frozen') drivers.push({ text: 'Frozen storage is energy-intensive (+80%)', dir: 'up' });\n\t\telse if (climate === 'chilled') drivers.push({ text: 'Chilled storage requires dedicated zones (+45%)', dir: 'up' });\n\t\telse if (climate === 'conditioned') drivers.push({ text: 'Climate control adds modest overhead (+15%)', dir: 'up' });\n\n\t\tif (season === 'peak') drivers.push({ text: 'Q4 peak season increases labor costs (+15%)', dir: 'up' });\n\t\tif (skus > 500) drivers.push({ text: 'Large SKU catalog increases pick complexity (+15%)', dir: 'up' });\n\t\tif (retRate > 15) drivers.push({ text: 'High return rate (' + retRate + '%) adds significant handling', dir: 'up' });\n\t\tif (weightBand === 'C' && mode !== 'b2b') drivers.push({ text: 'Heavier parcels (1-2 kg) push southern EU shipping into pricier bands', dir: 'up' });\n\n\t\tif (region === 'south') drivers.push({ text: 'Brabant\/Limburg offers competitive rates (-13%)', dir: 'down' });\n\t\telse if (region === 'east') drivers.push({ text: 'East Netherlands has lower operating costs (-15%)', dir: 'down' });\n\n\t\tif (pallets > RATES.thresholds.enterprise_pallets) drivers.push({ text: 'Enterprise volume qualifies for bulk discount', dir: 'down' });\n\t\tif (costAdmin === 0) drivers.push({ text: 'High volume waives admin fee', dir: 'down' });\n\n\t\tlet summaryParts = [];\n\n\t\tlet volParts = [];\n\t\tif (pallets > 0) volParts.push(`${pallets} pallet${pallets > 1 ? 's' : ''}`);\n\t\tif (shelves > 0) volParts.push(`${shelves} pick location${shelves > 1 ? 's' : ''}`);\n\t\tif (skus > 0) volParts.push(`${skus} SKU${skus > 1 ? 's' : ''}`);\n\n\t\tif (volParts.length > 0) {\n\t\t\tsummaryParts.push(`<p><strong>Storage:<\/strong> ${volParts.join(', ')}. Weekly pallet rate: \u20ac${pRate.toFixed(2)} (${pallets > RATES.thresholds.enterprise_pallets ? 'enterprise tier' : 'standard tier'}).<\/p>`);\n\t\t}\n\n\t\tlet throughputParts = [];\n\t\tif (inPallets > 0 || inCont > 0) {\n\t\t\tlet inParts = [];\n\t\t\tif (inPallets > 0) inParts.push(`${inPallets} pallets`);\n\t\t\tif (inCont > 0) inParts.push(`${inCont} container${inCont > 1 ? 's' : ''}`);\n\t\t\tthroughputParts.push(`Inbound: ${inParts.join(' + ')}\/month`);\n\t\t}\n\t\tif (mode !== 'b2c' && (outPallets > 0 || outCartons > 0)) {\n\t\t\tlet outParts = [];\n\t\t\tif (outPallets > 0) outParts.push(`${outPallets} pallets`);\n\t\t\tif (outCartons > 0) outParts.push(`${outCartons} cartons`);\n\t\t\tthroughputParts.push(`B2B outbound: ${outParts.join(' + ')}\/month`);\n\t\t}\n\t\tif (mode !== 'b2b' && outOrders > 0) {\n\t\t\tthroughputParts.push(`B2C orders: ${outOrders.toLocaleString()}\/month (${itemsPerOrder} items\/order avg.)`);\n\t\t}\n\n\t\tif (throughputParts.length > 0) {\n\t\t\tsummaryParts.push(`<p><strong>Throughput:<\/strong> ${throughputParts.join('. ')}.<\/p>`);\n\t\t}\n\n\t\tif (drivers.length > 0) {\n\t\t\tlet driverHtml = drivers.map(d =>\n\t\t\t\t`<span class=\"ts3-cost-driver ${d.dir === 'up' ? 'ts3-driver-up' : 'ts3-driver-down'}\">${d.dir === 'up' ? '\u2191' : '\u2193'} ${d.text}<\/span>`\n\t\t\t).join('');\n\t\t\tsummaryParts.push(`<p><strong>Price factors:<\/strong><\/p>${driverHtml}`);\n\t\t}\n\n\t\tdocument.getElementById('ts3SummaryText').innerHTML = summaryParts.join('');\n\n\t\tlet insights = [];\n\n\t\tif (mode !== 'b2b' && costShip > 0 && total > 0) {\n\t\t\tconst shipShare = Math.round(costShip \/ total * 100);\n\t\t\tif (shipShare >= 40) {\n\t\t\t\tinsights.push(`<strong>Shipping is ~${shipShare}% of your total cost.<\/strong> The carrier and destinations decide your economics far more than the pick rate. Choose the 3PL on fit, then optimise the carrier contract.`);\n\t\t\t} else if (shipShare >= 15) {\n\t\t\t\tinsights.push(`<strong>Shipping is ~${shipShare}% of your total cost,<\/strong> alongside fulfilment and handling. The headline pick rate alone tells you little until shipping is added.`);\n\t\t\t}\n\t\t}\n\n\t\tif (mode !== 'b2b' && perDest.length > 1) {\n\t\t\tconst sorted = perDest.slice().sort((a, b2) => a.mid - b2.mid);\n\t\t\tconst cheap = sorted[0], dear = sorted[sorted.length - 1];\n\t\t\tif (dear.mid - cheap.mid > 1.5) {\n\t\t\t\tinsights.push(`<strong>${dear.nm} costs ~\u20ac${(dear.mid - cheap.mid).toFixed(2)} more per parcel than ${cheap.nm}.<\/strong> Southern and Nordic zones often sit in a pricier courier band; a provider with the right carrier mix there makes a real difference.`);\n\t\t\t}\n\t\t}\n\n\t\tif (mode !== 'b2b' && outOrders > 0 && costAdmin > 0) {\n\t\t\tconst fixedPerOrder = (costAdmin + lowVolumeSurcharge) \/ outOrders;\n\t\t\tconst fixedAtDouble = RATES.admin.base \/ (outOrders * 2);\n\t\t\tinsights.push(`<strong>At ${outOrders.toLocaleString()} orders\/month, fixed costs add ~\u20ac${fixedPerOrder.toFixed(2)} per order.<\/strong> Double your volume and that roughly halves to ~\u20ac${fixedAtDouble.toFixed(2)}. The right provider at launch is rarely the right one at scale.`);\n\t\t}\n\n\t\tdocument.getElementById('ts3Insights').innerHTML = insights.map(t =>\n\t\t\t`<div class=\"ts3-insight\"><span class=\"ts3-ic\">\u2192<\/span><span>${t}<\/span><\/div>`\n\t\t).join('');\n\n\t\tlet alerts = [];\n\n\t\tif (goodsType === 'adr') {\n\t\t\talerts.push({ type: 'red', icon: '\u26a0\ufe0f', title: 'ADR Surcharge', text: 'Storage +65% due to specialized bunkers and safety requirements.' });\n\t\t}\n\t\tif (season === 'peak') {\n\t\t\talerts.push({ type: 'amber', icon: '\ud83d\udd25', title: 'Peak Season', text: 'Q4 handling rates +15% (temp staff, overtime). Storage rates unchanged.' });\n\t\t}\n\t\tif (mode !== 'b2b' && outOrders > 0 && mk.length === 0) {\n\t\t\talerts.push({ type: 'amber', icon: '\ud83c\udf0d', title: 'No Markets Selected', text: 'Select destination markets above to include shipping, often the largest single cost.' });\n\t\t}\n\t\tif (lowVolumeSurcharge > 0) {\n\t\t\talerts.push({ type: 'amber', icon: '\ud83d\udcc9', title: 'Low Volume Fee', text: `Orders below ${RATES.thresholds.low_volume_surcharge}\/month incur \u20ac${RATES.thresholds.low_volume_fee} surcharge.` });\n\t\t}\n\t\tif (total > 0 && total === RATES.admin.min_spend && rangeLow === RATES.admin.min_spend) {\n\t\t\talerts.push({ type: 'blue', icon: '\u2139\ufe0f', title: 'Minimum Spend', text: `Most 3PLs require minimum \u20ac${RATES.admin.min_spend}\/month.` });\n\t\t}\n\n\t\tdocument.getElementById('ts3Alerts').innerHTML = alerts.map(a => `\n\t\t\t<div class=\"ts3-alert ts3-alert-${a.type}\">\n\t\t\t\t${a.icon} <strong>${a.title}:<\/strong> ${a.text}\n\t\t\t<\/div>\n\t\t`).join('');\n\n\t\tconst tierBadge = document.getElementById('ts3TierBadge');\n\t\tif (pallets > RATES.thresholds.enterprise_pallets) {\n\t\t\ttierBadge.innerText = 'Enterprise Rate';\n\t\t\ttierBadge.className = 'ts3-badge bg-orange';\n\t\t} else {\n\t\t\ttierBadge.innerText = 'Standard Rate';\n\t\t\ttierBadge.className = 'ts3-badge bg-blue';\n\t\t}\n\n\t\tconst vasBadge = document.getElementById('ts3VasBadge');\n\t\tif (costVas > 0) {\n\t\t\tvasBadge.innerText = fmt(costVas) + '\/mo';\n\t\t\tvasBadge.className = 'ts3-badge bg-green';\n\t\t} else {\n\t\t\tvasBadge.innerText = 'Optional';\n\t\t\tvasBadge.className = 'ts3-badge bg-green';\n\t\t}\n\n\t\t\/\/ --- SNAPSHOT FOR THE LEAD EMAIL ---\n\t\tconst SNAP = [];\n\t\tconst snap = (l, v) => SNAP.push({ l: l, v: String(v) });\n\n\t\tsnap('Business model', LABELS.mode[mode]);\n\t\tsnap('Region', LABELS.region[region]);\n\t\tsnap('Season', LABELS.season[season]);\n\t\tsnap('Goods type', LABELS.goods[goodsType]);\n\t\tsnap('Climate', LABELS.climate[climate]);\n\t\tsnap('Pallets', pallets);\n\t\tif (mode !== 'b2b') snap('Pick locations', shelves);\n\t\tsnap('Actieve SKUs', skus);\n\t\tsnap('Lot\/expiry tracking', lotTracking ? 'Yes' : 'No');\n\t\tsnap('Inbound pallets\/mo', inPallets);\n\t\tsnap('Inbound containers\/mo', inCont);\n\t\tsnap('QC inspection', qcInbound ? 'Yes' : 'No');\n\t\tif (mode !== 'b2c') {\n\t\t\tsnap('B2B pallets out\/mo', outPallets);\n\t\t\tsnap('B2B cartons out\/mo', outCartons);\n\t\t}\n\t\tif (mode !== 'b2b') {\n\t\t\tsnap('B2C orders\/mo', outOrders);\n\t\t\tsnap('Items per order', itemsPerOrder);\n\t\t\tsnap('Return rate', retRate + '%');\n\t\t\tsnap('Weight band', LABELS.weight[weightBand]);\n\t\t\tsnap('Markets', mk.length ? mk.map(m => SHIP[m].n).join(', ') : 'None');\n\t\t}\n\t\tconst vasList = [];\n\t\tif (vasLabeling) vasList.push('Labeling (' + labelingQty + '\/mo)');\n\t\tif (vasKitting)  vasList.push('Kitting (' + kittingQty + '\/mo)');\n\t\tif (vasGiftwrap) vasList.push('Gift wrap');\n\t\tif (vasInserts)  vasList.push('Flyers');\n\t\tsnap('VAS', vasList.length ? vasList.join(', ') : 'None');\n\t\tconst intList = [];\n\t\tif (intWms)     intList.push('Custom API');\n\t\tif (intBol)     intList.push('Bol.com');\n\t\tif (intAmazon)  intList.push('Amazon');\n\t\tif (intShopify) intList.push('Shopify');\n\t\tsnap('Integrations', intList.length ? intList.join(', ') : 'None');\n\t\tsnap('ESTIMATE', '');\n\t\tsnap('Estimated monthly total', fmt(total));\n\t\tsnap('Range', fmt(rangeLow) + ' - ' + fmt(rangeHigh));\n\t\tsnap('Storage', fmt(costStorage + costLot));\n\t\tsnap('Inbound', fmt(costIn + costQc));\n\t\tsnap('Outbound \/ picking', fmt(costPick));\n\t\tif (mode !== 'b2b') {\n\t\t\tsnap('Packaging material', fmt(costPackMat));\n\t\t\tsnap('Shipping', fmt(costShip));\n\t\t\tsnap('Returns', fmt(costRet));\n\t\t}\n\t\tif (costVas > 0) snap('VAS cost', fmt(costVas));\n\t\tsnap('Admin \/ IT', fmt(costAdmin + lowVolumeSurcharge));\n\t\tif (setupTotal > 0) snap('One-time setup', fmt(setupTotal));\n\t\tif (mode === 'b2c' && outOrders > 0) snap('Cost per order', fmt2(total \/ outOrders));\n\n\t\twindow.ts3Snapshot = { lines: SNAP, url: window.location.href };\n\n\t\tdocument.getElementById('ts3-empty').classList.add('ts3-hidden');\n\t\tdocument.getElementById('ts3-results').classList.remove('ts3-hidden');\n\n\t\tts3StickSoon();\n\n\t\tconst mb = document.getElementById('ts3MobileBar');\n\t\tif (mb) {\n\t\t\tdocument.getElementById('ts3MobileTotal').innerText = fmt(total);\n\t\t\tif (document.getElementById('ts3-lead').classList.contains('ts3-hidden')) {\n\t\t\t\tmb.classList.add('ts3-on');\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\t\/\/ =====================================================\n\t\/\/ STICK ONLY WHEN THE PANEL FITS ON SCREEN\n\t\/\/ =====================================================\n\tfunction ts3StickCheck() {\n\t\tconst panel = document.querySelector('#ts3-calc-wrapper .ts3-panel-right');\n\t\tif (!panel) return;\n\t\tif (window.innerWidth < 900) {\n\t\t\tpanel.classList.remove('ts3-nostick');\n\t\t\treturn;\n\t\t}\n\t\t\/\/ measure unstuck, otherwise the height is clipped by the sticky box\n\t\tpanel.classList.add('ts3-nostick');\n\t\tconst fits = panel.offsetHeight <= window.innerHeight - 40;\n\t\tpanel.classList.toggle('ts3-nostick', !fits);\n\t}\n\n\tlet ts3StickTimer = null;\n\tfunction ts3StickSoon() {\n\t\tclearTimeout(ts3StickTimer);\n\t\tts3StickTimer = setTimeout(ts3StickCheck, 60);\n\t}\n\n\t\/\/ =====================================================\n\t\/\/ STEPPER\n\t\/\/ =====================================================\n\tconst TS3_STEPS = [\n\t\t{ n: 1, label: 'Profile' },\n\t\t{ n: 2, label: 'Storage' },\n\t\t{ n: 3, label: 'Volumes' },\n\t\t{ n: 4, label: 'Shipping', b2cOnly: true },\n\t\t{ n: 5, label: 'Extras' }\n\t];\n\tlet ts3Cur = 1;\n\tlet ts3Seen = { 1: true };\n\tlet ts3Flat = false;\n\n\tfunction ts3ActiveSteps() {\n\t\treturn TS3_STEPS.filter(s => !(s.b2cOnly && mode === 'b2b'));\n\t}\n\n\twindow.ts3GoStep = function (n) {\n\t\tconst act = ts3ActiveSteps();\n\t\tif (!act.some(s => s.n === n)) n = act[0].n;\n\t\tts3Cur = n;\n\t\tts3Seen[n] = true;\n\t\tts3RenderSteps();\n\t\tconst panel = document.querySelector('#ts3-calc-wrapper .ts3-panel-left');\n\t\tif (panel && window.innerWidth < 900) {\n\t\t\tconst top = panel.getBoundingClientRect().top + window.pageYOffset - 20;\n\t\t\twindow.scrollTo({ top: top, behavior: 'smooth' });\n\t\t}\n\t};\n\n\tfunction ts3RenderSteps() {\n\t\tconst act = ts3ActiveSteps();\n\t\tif (!act.some(s => s.n === ts3Cur)) ts3Cur = act[0].n;\n\n\t\tconst tabs = document.getElementById('ts3StepTabs');\n\t\tif (tabs) {\n\t\t\ttabs.innerHTML = act.map((s, i) =>\n\t\t\t\t'<button type=\"button\" class=\"ts3-steptab' +\n\t\t\t\t(s.n === ts3Cur ? ' ts3-cur' : (ts3Seen[s.n] ? ' ts3-seen' : '')) +\n\t\t\t\t'\" onclick=\"ts3GoStep(' + s.n + ')\">' +\n\t\t\t\t'<b>' + (i + 1) + '<\/b><span class=\"ts3-tab-label\">' + s.label + '<\/span><\/button>'\n\t\t\t).join('');\n\t\t}\n\n\t\tdocument.querySelectorAll('#ts3-calc-wrapper .ts3-step-panel').forEach(p => {\n\t\t\tp.classList.toggle('ts3-cur', parseInt(p.getAttribute('data-step'), 10) === ts3Cur);\n\t\t});\n\n\t\tconst pos = act.findIndex(s => s.n === ts3Cur);\n\t\tconst fill = document.getElementById('ts3StepFill');\n\t\tif (fill) fill.style.width = ((pos + 1) \/ act.length * 100) + '%';\n\n\t\tconst prev = document.getElementById('ts3Prev');\n\t\tconst next = document.getElementById('ts3Next');\n\t\tif (prev) prev.disabled = (pos === 0);\n\t\tif (next) {\n\t\t\tif (pos === act.length - 1) {\n\t\t\t\tnext.innerHTML = '\\uD83D\\uDCE9 Get my quotes';\n\t\t\t} else {\n\t\t\t\tnext.innerHTML = 'Next: ' + act[pos + 1].label + ' \\u2192';\n\t\t\t}\n\t\t}\n\t}\n\n\twindow.ts3NextStep = function () {\n\t\tconst act = ts3ActiveSteps();\n\t\tconst pos = act.findIndex(s => s.n === ts3Cur);\n\t\tif (pos === act.length - 1) {\n\t\t\tts3OpenLead();\n\t\t} else {\n\t\t\tts3GoStep(act[pos + 1].n);\n\t\t}\n\t};\n\n\twindow.ts3PrevStep = function () {\n\t\tconst act = ts3ActiveSteps();\n\t\tconst pos = act.findIndex(s => s.n === ts3Cur);\n\t\tif (pos > 0) ts3GoStep(act[pos - 1].n);\n\t};\n\n\twindow.ts3ToggleFlat = function () {\n\t\tts3Flat = !ts3Flat;\n\t\tconst left = document.querySelector('#ts3-calc-wrapper .ts3-panel-left');\n\t\tconst btn = document.getElementById('ts3ShowAll');\n\t\tif (left) left.classList.toggle('ts3-flat', ts3Flat);\n\t\tif (btn) btn.innerText = ts3Flat ? 'Back to steps' : 'Show all fields at once';\n\t\tif (!ts3Flat) ts3RenderSteps();\n\t};\n\n\t\/\/ =====================================================\n\t\/\/ LEAD SUBMIT\n\t\/\/ =====================================================\n\twindow.ts3SubmitLead = function () {\n\t\tconst btn    = document.getElementById('ts3LeadSubmit');\n\t\tconst status = document.getElementById('ts3LeadStatus');\n\t\tconst name   = document.getElementById('ts3LeadName').value.trim();\n\t\tconst email  = document.getElementById('ts3LeadEmail').value.trim();\n\n\t\tconst fail = m => { status.className = 'ts3-lead-status ts3-err'; status.innerText = m; };\n\n\t\tif (name.length < 2) { fail('Please enter your name.'); return; }\n\t\tif (!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$\/.test(email)) { fail('Please enter a valid email address.'); return; }\n\t\tif (!window.ts3Snapshot) { ts3Calc(); }\n\n\t\tconst original = btn.innerHTML;\n\t\tbtn.disabled = true;\n\t\tbtn.innerHTML = 'Sending...';\n\t\tstatus.innerText = '';\n\n\t\tconst body = new URLSearchParams();\n\t\tbody.append('action', 'ts3_calc_lead');\n\t\tbody.append('name', name);\n\t\tbody.append('email', email);\n\t\tbody.append('phone', document.getElementById('ts3LeadPhone').value.trim());\n\t\tbody.append('website', document.getElementById('ts3LeadWebsite').value.trim());\n\t\tbody.append('payload', JSON.stringify(window.ts3Snapshot || {}));\n\n\t\tfetch(TS3_AJAX, {\n\t\t\tmethod: 'POST',\n\t\t\tcredentials: 'same-origin',\n\t\t\theaders: { 'Content-Type': 'application\/x-www-form-urlencoded; charset=UTF-8' },\n\t\t\tbody: body.toString()\n\t\t})\n\t\t.then(r => r.json())\n\t\t.then(res => {\n\t\t\tif (res && res.success) {\n\t\t\t\tdocument.getElementById('ts3-lead').innerHTML =\n\t\t\t\t\t'<div class=\"ts3-lead-title\">Request sent. Thank you.<\/div>' +\n\t\t\t\t\t'<div class=\"ts3-lead-sub\">We will get back to you with matching providers.<\/div>';\n\t\t\t\tconst mbDone = document.getElementById('ts3MobileBar');\n\t\t\t\tif (mbDone) mbDone.classList.remove('ts3-on');\n\t\t\t} else {\n\t\t\t\tfail((res && res.data && res.data.message) ? res.data.message : 'Something went wrong. Email us directly at info@zendeq.com.');\n\t\t\t\tbtn.disabled = false;\n\t\t\t\tbtn.innerHTML = original;\n\t\t\t}\n\t\t})\n\t\t.catch(() => {\n\t\t\tfail('Connection failed. Please try again.');\n\t\t\tbtn.disabled = false;\n\t\t\tbtn.innerHTML = original;\n\t\t});\n\t}\n\n\t\/\/ =====================================================\n\t\/\/ INITIALIZE\n\t\/\/ =====================================================\n\tfunction ts3OpenLead() {\n\t\tconst lead = document.getElementById('ts3-lead');\n\t\tif (!lead) return;\n\t\tlead.classList.remove('ts3-hidden');\n\t\tts3StickSoon();\n\t\tconst mb = document.getElementById('ts3MobileBar');\n\t\tif (mb) mb.classList.remove('ts3-on');\n\t\tlead.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\t\tsetTimeout(function () {\n\t\t\tconst n = document.getElementById('ts3LeadName');\n\t\t\tif (n) n.focus();\n\t\t}, 400);\n\t}\n\n\tfunction ts3Init() {\n\t\tif (typeof ts3Preset === 'function') {\n\t\t\tts3Preset('starter');\n\t\t}\n\n\t\t['ts3-cta-btn', 'ts3MobileCta'].forEach(function (id) {\n\t\t\tconst b = document.getElementById(id);\n\t\t\tif (b) {\n\t\t\t\tb.addEventListener('click', function (e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tts3OpenLead();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tconst nextBtn = document.getElementById('ts3Next');\n\t\tif (nextBtn) nextBtn.addEventListener('click', function (e) { e.preventDefault(); ts3NextStep(); });\n\n\t\tconst prevBtn = document.getElementById('ts3Prev');\n\t\tif (prevBtn) prevBtn.addEventListener('click', function (e) { e.preventDefault(); ts3PrevStep(); });\n\n\t\tconst flatBtn = document.getElementById('ts3ShowAll');\n\t\tif (flatBtn) flatBtn.addEventListener('click', function (e) { e.preventDefault(); ts3ToggleFlat(); });\n\n\t\tts3RenderSteps();\n\n\t\tdocument.querySelectorAll('#ts3-calc-wrapper .ts3-panel-right details').forEach(function (d) {\n\t\t\td.addEventListener('toggle', ts3StickSoon);\n\t\t});\n\t\twindow.addEventListener('resize', ts3StickSoon);\n\t\tts3StickSoon();\n\n\t\tconst leadBtn = document.getElementById('ts3LeadSubmit');\n\t\tif (leadBtn) {\n\t\t\tleadBtn.addEventListener('click', function (e) {\n\t\t\t\te.preventDefault();\n\t\t\t\tts3SubmitLead();\n\t\t\t});\n\t\t}\n\t}\n\n\tif (document.readyState === 'loading') {\n\t\tdocument.addEventListener('DOMContentLoaded', ts3Init);\n\t} else {\n\t\tts3Init();\n\t}\n\t})();\n\t<\/script>\n\t\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_monsterinsights_skip_tracking":false,"_glsr_average":0,"_glsr_ranking":0,"_glsr_reviews":0,"footnotes":"","_members_access_role":[],"_members_access_error":""},"class_list":["post-82766","type-page","status-publish","hentry","wpbf-post"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>3PL Fulfilment Cost Calculator | ZENDEQ<\/title>\n<meta name=\"description\" content=\"Calculate your 3PL fulfilment costs in the Netherlands. Estimate storage, handling, shipping &amp; returns. Calculate your 3PL fulfilment costs in the Netherlands. Estimate storage, handling, shipping &amp; returns. Get real quotes from matching providers.\" class=\"yoast-seo-meta-tag\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.zendeq.com\/nl\/calc\/\" class=\"yoast-seo-meta-tag\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" class=\"yoast-seo-meta-tag\" \/>\n<meta property=\"og:type\" content=\"article\" class=\"yoast-seo-meta-tag\" \/>\n<meta property=\"og:title\" content=\"3PL Fulfilment Cost Calculator | ZENDEQ\" class=\"yoast-seo-meta-tag\" \/>\n<meta property=\"og:description\" content=\"Calculate your 3PL fulfilment costs in the Netherlands. Estimate storage, handling, shipping &amp; returns. Calculate your 3PL fulfilment costs in the Netherlands. Estimate storage, handling, shipping &amp; returns. Get real quotes from matching providers.\" class=\"yoast-seo-meta-tag\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.zendeq.com\/nl\/calc\/\" class=\"yoast-seo-meta-tag\" \/>\n<meta property=\"og:site_name\" content=\"ZENDEQ\" class=\"yoast-seo-meta-tag\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-03T08:17:19+00:00\" class=\"yoast-seo-meta-tag\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" class=\"yoast-seo-meta-tag\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.zendeq.com\\\/nl\\\/calc\\\/\",\"url\":\"https:\\\/\\\/www.zendeq.com\\\/nl\\\/calc\\\/\",\"name\":\"3PL Fulfilment Cost Calculator | ZENDEQ\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.zendeq.com\\\/nl\\\/#website\"},\"datePublished\":\"2026-07-29T14:29:00+00:00\",\"dateModified\":\"2026-08-03T08:17:19+00:00\",\"description\":\"Calculate your 3PL fulfilment costs in the Netherlands. Estimate storage, handling, shipping & returns. Calculate your 3PL fulfilment costs in the Netherlands. Estimate storage, handling, shipping & returns. Get real quotes from matching providers.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.zendeq.com\\\/nl\\\/calc\\\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.zendeq.com\\\/nl\\\/calc\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.zendeq.com\\\/nl\\\/calc\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.zendeq.com\\\/nl\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"calc\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.zendeq.com\\\/nl\\\/#website\",\"url\":\"https:\\\/\\\/www.zendeq.com\\\/nl\\\/\",\"name\":\"ZENDEQ\",\"description\":\"Get quotes for any transport\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.zendeq.com\\\/nl\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"3PL Fulfilment Cost Calculator | ZENDEQ","description":"Calculate your 3PL fulfilment costs in the Netherlands. Estimate storage, handling, shipping & returns. Calculate your 3PL fulfilment costs in the Netherlands. Estimate storage, handling, shipping & returns. Get real quotes from matching providers.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.zendeq.com\/nl\/calc\/","og_locale":"nl_NL","og_type":"article","og_title":"3PL Fulfilment Cost Calculator | ZENDEQ","og_description":"Calculate your 3PL fulfilment costs in the Netherlands. Estimate storage, handling, shipping & returns. Calculate your 3PL fulfilment costs in the Netherlands. Estimate storage, handling, shipping & returns. Get real quotes from matching providers.","og_url":"https:\/\/www.zendeq.com\/nl\/calc\/","og_site_name":"ZENDEQ","article_modified_time":"2026-08-03T08:17:19+00:00","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.zendeq.com\/nl\/calc\/","url":"https:\/\/www.zendeq.com\/nl\/calc\/","name":"3PL Fulfilment Cost Calculator | ZENDEQ","isPartOf":{"@id":"https:\/\/www.zendeq.com\/nl\/#website"},"datePublished":"2026-07-29T14:29:00+00:00","dateModified":"2026-08-03T08:17:19+00:00","description":"Calculate your 3PL fulfilment costs in the Netherlands. Estimate storage, handling, shipping & returns. Calculate your 3PL fulfilment costs in the Netherlands. Estimate storage, handling, shipping & returns. Get real quotes from matching providers.","breadcrumb":{"@id":"https:\/\/www.zendeq.com\/nl\/calc\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.zendeq.com\/nl\/calc\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.zendeq.com\/nl\/calc\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.zendeq.com\/nl\/"},{"@type":"ListItem","position":2,"name":"calc"}]},{"@type":"WebSite","@id":"https:\/\/www.zendeq.com\/nl\/#website","url":"https:\/\/www.zendeq.com\/nl\/","name":"ZENDEQ","description":"Get quotes for any transport","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.zendeq.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"}]}},"_links":{"self":[{"href":"https:\/\/www.zendeq.com\/nl\/wp-json\/wp\/v2\/pages\/82766","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zendeq.com\/nl\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.zendeq.com\/nl\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.zendeq.com\/nl\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.zendeq.com\/nl\/wp-json\/wp\/v2\/comments?post=82766"}],"version-history":[{"count":4,"href":"https:\/\/www.zendeq.com\/nl\/wp-json\/wp\/v2\/pages\/82766\/revisions"}],"predecessor-version":[{"id":82792,"href":"https:\/\/www.zendeq.com\/nl\/wp-json\/wp\/v2\/pages\/82766\/revisions\/82792"}],"wp:attachment":[{"href":"https:\/\/www.zendeq.com\/nl\/wp-json\/wp\/v2\/media?parent=82766"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}