Email security gateways (Microsoft Defender Safe Links / ATP, Proofpoint,
Mimecast, Barracuda, etc.) auto-fetch and often render every link in a
campaign email to scan for malware. The advanced ones drive a real headless
browser, execute JS, and fire Umami pageviews/clicks that masquerade as human
visits -- inflating campaign click-through.
New site/public/js/pw-bot-filter.js queries multiple real-browser signals and
gates Umami via its official data-before-send hook (umamiBeforeSend), dropping
all events when the visitor is a bot. Signals (from empirical chromium probing):
decisive: navigator.webdriver, HeadlessChrome UA, known scanner UAs, zero/
collapsed screen|viewport|outer geometry, window LARGER than the
physical screen (impossible on real HW; uses outerW/H so page zoom
does not false-positive), software GPU rasterizer (SwiftShader/
llvmpipe/swrast via WebGL UNMASKED_RENDERER), zero logical CPUs.
soft (>=2 to trip): tiny screen, inner>screen, low color depth, empty
navigator.languages, no input device (no fine/coarse pointer + no
hover + 0 touch), no WebGL on a desktop UA.
Designed to FAIL OPEN: only strong/corroborated evidence suppresses, so real
visitors (incl. zoomed, privacy-tooled, remote-desktop, kiosk) still count.
Wired before the Umami tag in Base.astro (Astro pages) and all 86 static
public/**/*.html pages; both load with defer so order is guaranteed and the
hook is defined before Umami reads it.
Tested end-to-end with chromium (site/tests/bot-filter.test.sh, 4/4):
default headless-new, spoofed-Windows-UA + normal 1366x768 window, and
spoofed-UA + 1x1 window are all caught; hook returns null to drop the event.
371 lines
No EOL
74 KiB
HTML
371 lines
No EOL
74 KiB
HTML
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="description" content="Your order has been received and is being processed by Performance West Inc."><link rel="canonical" href="https://performancewest.net/order/success/"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><!-- Open Graph --><meta property="og:type" content="website"><meta property="og:url" content="https://performancewest.net/order/success/"><meta property="og:title" content="Order Confirmed | Performance West Inc."><meta property="og:description" content="Your order has been received and is being processed by Performance West Inc."><!-- Twitter --><meta name="twitter:card" content="summary"><meta name="twitter:title" content="Order Confirmed | Performance West Inc."><meta name="twitter:description" content="Your order has been received and is being processed by Performance West Inc."><script>
|
||
window.__PW_API = (function() {
|
||
var h = window.location.hostname;
|
||
if (h === "localhost" || h === "127.0.0.1") return "http://" + h + ":3001";
|
||
if (h === "dev.performancewest.net") return "https://api.dev.performancewest.net";
|
||
return "https://api.performancewest.net";
|
||
})();
|
||
</script><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"><title>Order Confirmed | Performance West Inc.</title><script defer src="/js/pw-bot-filter.js"></script><script defer src="https://analytics.performancewest.net/script.js" data-website-id="55250014-ee15-44ac-a1f6-81dabad3fe0f" data-before-send="umamiBeforeSend"></script><link rel="stylesheet" href="/_astro/about.DhmoKVOS.css"><script type="module" src="/_astro/hoisted.Be9YR9_C.js"></script>
|
||
<script>
|
||
// Handle free ($0) orders — verify payment_status with server
|
||
(function(){
|
||
var params = new URLSearchParams(window.location.search);
|
||
if (params.get("free") !== "1") return;
|
||
var orderId = params.get("order_id");
|
||
if (!orderId) return;
|
||
var API = window.__PW_API || "https://api.performancewest.net";
|
||
|
||
function showFreeSuccess(d) {
|
||
["state-loading","state-error"].forEach(function(id){var el=document.getElementById(id);if(el)el.classList.add("hidden");});
|
||
var success = document.getElementById("state-success");
|
||
if (success) success.classList.remove("hidden");
|
||
var orderDisplay = document.getElementById("order-id-display");
|
||
if (orderDisplay) orderDisplay.textContent = "Order ID: " + orderId;
|
||
var emailEl = document.getElementById("success-email");
|
||
var orders = d.orders || [];
|
||
var email = orders.length > 0 ? orders[0].customer_email : "";
|
||
if (emailEl) emailEl.textContent = email || "your email address";
|
||
var generic = document.getElementById("next-steps-generic");
|
||
if (generic) generic.classList.remove("hidden");
|
||
var h2 = success && success.querySelector("h2");
|
||
if (h2) h2.textContent = "Order Confirmed";
|
||
var desc = success && success.querySelector("p.text-gray-600");
|
||
if (desc) desc.textContent = "Thank you \u2014 your free filing order has been received and is now being processed.";
|
||
}
|
||
|
||
// Run verification and keep re-asserting success state to override Astro JS
|
||
fetch(API + "/api/v1/compliance-orders/" + encodeURIComponent(orderId))
|
||
.then(function(r) { return r.json(); })
|
||
.then(function(d) {
|
||
if (d.payment_status === "paid") {
|
||
// Show immediately and re-assert after delays to override Astro hoisted JS
|
||
window._freeOrderData = d;
|
||
showFreeSuccess(d);
|
||
setTimeout(function(){ showFreeSuccess(window._freeOrderData); }, 100);
|
||
setTimeout(function(){ showFreeSuccess(window._freeOrderData); }, 500);
|
||
setTimeout(function(){ showFreeSuccess(window._freeOrderData); }, 1500);
|
||
}
|
||
})
|
||
.catch(function(){});
|
||
})();
|
||
</script>
|
||
</head> <body class="min-h-screen flex flex-col"> <!-- Navigation --> <nav class="border-b border-gray-200 bg-white sticky top-0 z-50"> <div class="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="flex justify-between h-24 items-center"> <a href="/" class="flex items-center"> <img src="/images/logo.png" alt="Performance West" class="h-20 w-auto" width="83" height="70"> </a> <div class="hidden md:flex items-center gap-8"> <!-- Services dropdown --> <div class="relative" id="services-dropdown"> <button type="button" class="text-sm text-gray-600 hover:text-gray-900 inline-flex items-center gap-1" id="services-btn"> Services <svg class="w-3.5 h-3.5 transition-transform" id="services-chevron" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"></path></svg> </button> <div id="services-menu" class="absolute left-1/2 -translate-x-1/2 top-full mt-2 rounded-xl border border-gray-200 bg-white shadow-xl hidden z-50" style="width: 720px;"> <div class="grid grid-cols-3 gap-0 p-4"> <!-- Column 1 --> <div class="pr-4 border-r border-gray-100"> <p class="text-[11px] font-semibold uppercase tracking-wider text-blue-500 mb-2">Telecom</p> <a href="/services/telecom/fcc-499a" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">FCC 499A Filing</a> <a href="/services/telecom/stir-shaken" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">STIR/SHAKEN</a> <a href="/services/telecom/ipes-isp" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">FCC Carrier / ISP Registration</a> <a href="/services/telecom/database-management" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Telecom Databases</a> <a href="/services/telecom/state-puc" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">State PUC/PSC Filings</a> <a href="/services/telecom/canada-crtc" class="block py-1.5 text-sm font-medium text-blue-600 hover:text-blue-800">Canada CRTC Package <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-red-500 text-white ml-1 animate-pulse">HOT</span></a> <a href="/tools/fcc-compliance-check" class="block py-1.5 text-sm font-medium text-green-600 hover:text-green-800">FCC Compliance Check <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-green-500 text-white ml-1">FREE</span></a> <p class="text-[11px] font-semibold uppercase tracking-wider text-orange-500 mb-2 mt-4">Trucking / DOT</p> <a href="/services/trucking" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">DOT Compliance Services</a> <a href="/order/dot-compliance" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">MCS-150 / BOC-3 / UCR</a> <a href="/order/trucking-new-carrier" class="block py-1.5 text-sm font-medium text-orange-600 hover:text-orange-800">New Carrier Setup</a> <a href="/tools/dot-compliance-check" class="block py-1.5 text-sm font-medium text-orange-600 hover:text-orange-800">DOT Compliance Check <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-orange-500 text-white ml-1">FREE</span></a> </div> <!-- Column 2 --> <div class="px-4 border-r border-gray-100"> <p class="text-[11px] font-semibold uppercase tracking-wider text-purple-500 mb-2">Data Privacy</p> <a href="/services/privacy/ccpa-audit" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">CCPA/CPRA Audit</a> <a href="/services/privacy/privacy-policy" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Privacy Policy Review</a> <a href="/services/privacy/data-mapping" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Data Mapping</a> <a href="/services/privacy/breach-response" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Breach Response Plan</a> <p class="text-[11px] font-semibold uppercase tracking-wider text-green-500 mb-2 mt-4">TCPA</p> <a href="/services/tcpa/consent-audit" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Consent Audit</a> <a href="/services/tcpa/dnc-compliance" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">DNC Compliance</a> <a href="/services/tcpa/campaign-review" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Campaign Review</a> </div> <!-- Column 3 --> <div class="pl-4"> <p class="text-[11px] font-semibold uppercase tracking-wider text-slate-500 mb-2">Corporate</p> <a href="/services/corporate/dexit-reincorporation" class="block py-1.5 text-sm font-medium text-blue-600 hover:text-blue-800">DEXIT: Leave Delaware <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-blue-500 text-white ml-1">NEW</span></a> <a href="/services/corporate/formation" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Business Formation</a> <a href="/services/corporate/state-registration" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">State Registration</a> <a href="/services/corporate/annual-reports" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Annual Reports</a> <a href="/services/corporate/registered-agent" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Registered Agent</a> <p class="text-[11px] font-semibold uppercase tracking-wider text-teal-500 mb-2 mt-4">Healthcare</p> <a href="/services/healthcare/npi-revalidation" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Medicare Revalidation</a> <a href="/services/healthcare/medicare-enrollment" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Medicare Enrollment (PECOS)</a> <a href="/services/healthcare" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">NPI / NPPES Services</a> <a href="/tools/npi-compliance-check" class="block py-1.5 text-sm font-medium text-teal-600 hover:text-teal-800">NPI Compliance Check <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-teal-500 text-white ml-1">FREE</span></a> <a href="/order/formation" class="mt-3 block py-2 px-3 text-sm font-medium text-white bg-pw-700 hover:bg-pw-800 rounded-lg text-center transition-colors">Form a Business</a> </div> </div> </div> </div> <a href="/services" class="text-sm text-gray-600 hover:text-gray-900">All Services</a> <a href="/pricing" class="text-sm text-gray-600 hover:text-gray-900">Pricing</a> <a href="/tools/contractor-quiz" class="text-sm text-gray-600 hover:text-gray-900">Free Tools</a> <a href="/contact" class="text-sm text-gray-600 hover:text-gray-900">Contact</a> <a href="/order/formation" class="ml-2 px-4 py-2 text-sm font-medium text-white bg-pw-700 hover:bg-pw-800 rounded-lg transition-colors">Form a Business</a> <!-- Account button - links to ERPNext portal --> <a href="https://portal.performancewest.net" id="nav-login-btn" class="ml-1 flex items-center gap-1.5 px-3 py-2 text-sm font-medium text-gray-600 hover:text-pw-700 hover:bg-pw-50 rounded-lg transition-colors border border-gray-200 hover:border-pw-300"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z"></path></svg> Client Portal </a> <!-- Account button - logged in (hidden until session confirmed) --> <div id="nav-account-btn" class="hidden relative ml-1"> <button type="button" id="nav-account-trigger" class="flex items-center gap-2 px-3 py-2 text-sm font-medium text-pw-700 hover:bg-pw-50 rounded-lg transition-colors border border-pw-200"> <div class="w-6 h-6 rounded-full bg-pw-600 flex items-center justify-center shrink-0"> <svg class="w-3.5 h-3.5 text-white" fill="currentColor" viewBox="0 0 24 24"><path d="M12 12c2.7 0 4.8-2.1 4.8-4.8S14.7 2.4 12 2.4 7.2 4.5 7.2 7.2 9.3 12 12 12zm0 2.4c-3.2 0-9.6 1.6-9.6 4.8v2.4h19.2v-2.4c0-3.2-6.4-4.8-9.6-4.8z"></path></svg> </div> <span id="nav-greeting" class="max-w-[120px] truncate">My Account</span> <svg class="w-3.5 h-3.5 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"></path></svg> </button> <!-- Dropdown --> <div id="nav-account-menu" class="absolute right-0 top-full mt-1 w-48 bg-white rounded-xl border border-gray-200 shadow-lg hidden z-50 py-1"> <div class="px-4 py-2 border-b border-gray-100"> <p class="text-xs text-gray-500">Signed in as</p> <p id="nav-account-email" class="text-xs font-medium text-gray-800 truncate"></p> </div> <button type="button" id="nav-logout-btn" class="w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-50 transition-colors"> Sign out </button> </div> </div> </div> <!-- Mobile menu button --> <button type="button" class="md:hidden text-gray-600 hover:text-gray-900" id="mobile-menu-btn"> <svg class="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"></path></svg> </button> </div> </div> <!-- Mobile menu --> <div id="mobile-menu" class="md:hidden hidden border-t border-gray-200 bg-white"> <div class="px-4 py-3 space-y-1"> <p class="text-xs font-semibold text-blue-500 uppercase tracking-wider px-2 pt-1">Telecom</p> <a href="/services/telecom/fcc-499a" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">FCC 499A Filing</a> <a href="/services/telecom/stir-shaken" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">STIR/SHAKEN</a> <a href="/services/telecom/ipes-isp" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">FCC Carrier / ISP Registration</a> <a href="/services/telecom/database-management" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Telecom Databases</a> <a href="/services/telecom/state-puc" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">State PUC/PSC</a> <a href="/services/telecom/canada-crtc" class="block px-2 py-2 text-sm font-medium text-blue-600 hover:bg-blue-50 rounded">Canada CRTC Package <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-red-500 text-white ml-1 animate-pulse">HOT</span></a> <p class="text-xs font-semibold text-orange-500 uppercase tracking-wider px-2 pt-3">Trucking / DOT</p> <a href="/services/trucking" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">DOT Compliance Services</a> <a href="/order/dot-compliance" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">MCS-150 / BOC-3 / UCR</a> <a href="/order/trucking-new-carrier" class="block px-2 py-2 text-sm font-medium text-orange-600 hover:bg-orange-50 rounded">New Carrier Setup</a> <a href="/tools/dot-compliance-check" class="block px-2 py-2 text-sm font-medium text-orange-600 hover:bg-orange-50 rounded">DOT Compliance Check <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-orange-500 text-white ml-1">FREE</span></a> <p class="text-xs font-semibold text-purple-500 uppercase tracking-wider px-2 pt-3">Data Privacy</p> <a href="/services/privacy/ccpa-audit" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">CCPA/CPRA Audit</a> <a href="/services/privacy/privacy-policy" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Privacy Policy Review</a> <a href="/services/privacy/data-mapping" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Data Mapping</a> <a href="/services/privacy/breach-response" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Breach Response Plan</a> <p class="text-xs font-semibold text-green-500 uppercase tracking-wider px-2 pt-3">TCPA</p> <a href="/services/tcpa/consent-audit" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Consent Audit</a> <a href="/services/tcpa/dnc-compliance" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">DNC Compliance</a> <a href="/services/tcpa/campaign-review" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Campaign Review</a> <p class="text-xs font-semibold text-teal-500 uppercase tracking-wider px-2 pt-3">Healthcare</p> <a href="/services/healthcare/npi-revalidation" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Medicare Revalidation</a> <a href="/services/healthcare/medicare-enrollment" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Medicare Enrollment (PECOS)</a> <a href="/services/healthcare" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">NPI / NPPES Services</a> <a href="/tools/npi-compliance-check" class="block px-2 py-2 text-sm font-medium text-teal-600 hover:bg-teal-50 rounded">NPI Compliance Check <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-teal-500 text-white ml-1">FREE</span></a> <p class="text-xs font-semibold text-slate-500 uppercase tracking-wider px-2 pt-3">Corporate</p> <a href="/services/corporate/formation" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Business Formation</a> <a href="/services/corporate/state-registration" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">State Registration</a> <a href="/services/corporate/annual-reports" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Annual Reports</a> <a href="/services/corporate/registered-agent" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Registered Agent</a> <div class="border-t border-gray-100 my-2"></div> <a href="/services" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">All Services</a> <a href="/pricing" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Pricing</a> <a href="/tools/contractor-quiz" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Free Tools</a> <a href="/contact" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Contact</a> <a href="/order/formation" class="block mx-2 mt-2 px-4 py-2.5 text-sm font-medium text-white bg-pw-700 hover:bg-pw-800 rounded-lg text-center transition-colors">Form a Business</a> </div> </div> </nav> <main class="flex-1"> <section class="bg-pw-950 py-12 sm:py-16"> <div class="max-w-4xl mx-auto px-4 text-center"> <h1 class="text-3xl sm:text-4xl font-bold text-white mb-3">Order Confirmation</h1> <p class="text-gray-300 text-base sm:text-lg max-w-2xl mx-auto">
|
||
Please wait while we confirm your payment.
|
||
</p> </div> </section> <section class="bg-gray-50 min-h-[60vh] py-16"> <div class="max-w-2xl mx-auto px-4"> <!-- Loading state --> <div id="state-loading" class="text-center"> <div class="inline-flex items-center justify-center w-16 h-16 rounded-full bg-pw-100 mb-6"> <svg class="animate-spin w-8 h-8 text-pw-700" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"> <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle> <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path> </svg> </div> <p class="text-lg font-medium text-gray-700">Confirming your payment…</p> <p class="text-sm text-gray-500 mt-2">This usually takes just a moment.</p> </div> <!-- Success state --> <div id="state-success" class="hidden"> <!-- Confirmed --> <div class="bg-white border border-green-200 rounded-2xl shadow-sm p-8 text-center mb-6"> <div class="inline-flex items-center justify-center w-16 h-16 rounded-full bg-green-100 mb-5"> <svg class="w-8 h-8 text-green-600" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2.5"> <path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"></path> </svg> </div> <h2 class="text-2xl font-bold text-gray-900 mb-2">Payment Confirmed</h2> <p class="text-gray-600 mb-4">Thank you — your order has been received and is now being processed.</p> <div id="order-id-display" class="inline-block bg-gray-100 rounded-lg px-4 py-2 text-sm font-mono text-gray-700 mb-2"></div> </div> <!-- Email updates notice --> <div class="bg-blue-50 border border-blue-200 rounded-2xl shadow-sm p-6 mb-6 flex gap-4 items-start"> <svg class="w-6 h-6 text-blue-600 shrink-0 mt-0.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"> <path stroke-linecap="round" stroke-linejoin="round" d="M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75"></path> </svg> <div> <p class="text-sm font-semibold text-blue-900 mb-1">You will receive email updates throughout your order</p> <p class="text-sm text-blue-800" id="email-updates-text">A confirmation has been sent to <strong id="success-email" class="font-semibold"></strong>. We will email you as each step is completed.</p> </div> </div> <!-- Order timeline -->
|
||
<div id="order-timeline" class="hidden bg-white border border-gray-200 rounded-2xl shadow-sm p-6 mb-6">
|
||
<h3 style="font-size:16px;font-weight:700;color:#1a2744;margin:0 0 4px">Estimated Timeline</h3>
|
||
<p style="font-size:13px;color:#64748b;margin:0 0 16px">Business days only — excludes weekends and US holidays.</p>
|
||
<div id="timeline-steps"></div>
|
||
</div>
|
||
|
||
<!-- Portal password setup --> <div class="bg-white border border-gray-200 rounded-2xl shadow-sm p-6 mb-6"> <div class="flex items-start gap-3 mb-4"> <svg class="w-6 h-6 text-pw-700 shrink-0 mt-0.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"> <path stroke-linecap="round" stroke-linejoin="round" d="M15.75 5.25a3 3 0 013 3m3 0a6 6 0 01-7.029 5.912c-.563-.097-1.159.026-1.563.43L10.5 17.25H8.25v2.25H6v2.25H2.25v-2.818c0-.597.237-1.17.659-1.591l6.499-6.499c.404-.404.527-1 .43-1.563A6 6 0 1121.75 8.25z"></path> </svg> <div> <p class="text-sm font-semibold text-gray-900 mb-0.5">Set up your client portal access</p> <p class="text-sm text-gray-600">Track your order, download documents, and manage your services at any time. Set a password to activate your portal account.</p> </div> </div> <!-- Already set state --> <div id="portal-already-set" class="hidden"> <div class="rounded-lg bg-green-50 border border-green-200 p-3 flex items-center gap-2 text-sm text-green-800"> <svg class="w-4 h-4 text-green-600 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"></path></svg>
|
||
Portal account activated. <a id="portal-login-link" href="https://portal.performancewest.net" class="underline font-medium hover:text-green-900 ml-1">Log in to your portal →</a> </div> </div> <!-- Password form --> <div id="portal-password-form"> <div class="space-y-3"> <div> <label for="portal-password" class="block text-xs font-medium text-gray-700 mb-1">Password <span class="text-red-500">*</span></label> <input type="password" id="portal-password" autocomplete="new-password" class="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm text-gray-900 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-pw-500 focus:border-pw-500 transition-colors" placeholder="At least 8 characters" minlength="8"> </div> <div> <label for="portal-password-confirm" class="block text-xs font-medium text-gray-700 mb-1">Confirm password <span class="text-red-500">*</span></label> <input type="password" id="portal-password-confirm" autocomplete="new-password" class="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm text-gray-900 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-pw-500 focus:border-pw-500 transition-colors" placeholder="Repeat password" minlength="8"> </div> <div id="portal-password-error" class="hidden text-xs text-red-600 font-medium"></div> <button type="button" id="btn-set-portal-password" class="w-full inline-flex items-center justify-center gap-2 bg-pw-700 hover:bg-pw-800 text-white text-sm font-medium px-5 py-2.5 rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 5.25a3 3 0 013 3m3 0a6 6 0 01-7.029 5.912c-.563-.097-1.159.026-1.563.43L10.5 17.25H8.25v2.25H6v2.25H2.25v-2.818c0-.597.237-1.17.659-1.591l6.499-6.499c.404-.404.527-1 .43-1.563A6 6 0 1121.75 8.25z"></path></svg>
|
||
Activate Portal Account
|
||
</button> <p class="text-xs text-gray-400 text-center">You can also set a password later from your email confirmation link.</p> </div> </div> </div> <!-- Next steps: canada_crtc --> <div id="next-steps-canada_crtc" class="hidden bg-white border border-gray-200 rounded-2xl shadow-sm p-8 mb-6"> <h3 class="text-lg font-semibold text-gray-900 mb-5">What happens next</h3> <p class="text-sm text-gray-500 uppercase tracking-wide font-semibold mb-4">Estimated timeline: 10–15 business days</p> <ol class="space-y-4"> <li class="flex gap-4"> <span class="flex-shrink-0 inline-flex items-center justify-center w-7 h-7 rounded-full bg-pw-700 text-white text-sm font-bold">1</span> <div> <p class="font-medium text-gray-900">BC Incorporation Filing</p> <p class="text-sm text-gray-600">We register your British Columbia corporation with BC Registries, including name search and registered office setup.</p> </div> </li> <li class="flex gap-4"> <span class="flex-shrink-0 inline-flex items-center justify-center w-7 h-7 rounded-full bg-pw-700 text-white text-sm font-bold">2</span> <div> <p class="font-medium text-gray-900">CRTC & BITS Registration</p> <p class="text-sm text-gray-600">We generate your CRTC registration letter for you to eSign. For BITS international authorization, we arrange a brief online notarization session (~5 min video call with a notary) and submit the notarized Form 503 to the CRTC on your behalf.</p> </div> </li> <li class="flex gap-4"> <span class="flex-shrink-0 inline-flex items-center justify-center w-7 h-7 rounded-full bg-pw-700 text-white text-sm font-bold">3</span> <div> <p class="font-medium text-gray-900">CCTS, Domain & DID Provisioning</p> <p class="text-sm text-gray-600">We register your complaint-handling program with CCTS, provision your Canadian phone number (DID), and set up your .ca domain.</p> </div> </li> <li class="flex gap-4"> <span class="flex-shrink-0 inline-flex items-center justify-center w-7 h-7 rounded-full bg-pw-700 text-white text-sm font-bold">4</span> <div> <p class="font-medium text-gray-900">Corporate Binder Delivery</p> <p class="text-sm text-gray-600">You receive your complete digital and physical corporate binder with all certificates, resolutions, and registration documents.</p> </div> </li> </ol> </div> <!-- Next steps: formation --> <div id="next-steps-formation" class="hidden bg-white border border-gray-200 rounded-2xl shadow-sm p-8 mb-6"> <h3 class="text-lg font-semibold text-gray-900 mb-5">What happens next</h3> <p class="text-sm text-gray-500 uppercase tracking-wide font-semibold mb-4">Estimated timeline: 3–10 business days</p> <ol class="space-y-4"> <li class="flex gap-4"> <span class="flex-shrink-0 inline-flex items-center justify-center w-7 h-7 rounded-full bg-pw-700 text-white text-sm font-bold">1</span> <div> <p class="font-medium text-gray-900">Name Availability Check</p> <p class="text-sm text-gray-600">We verify your chosen business name is available with the state and flag any conflicts before filing.</p> </div> </li> <li class="flex gap-4"> <span class="flex-shrink-0 inline-flex items-center justify-center w-7 h-7 rounded-full bg-pw-700 text-white text-sm font-bold">2</span> <div> <p class="font-medium text-gray-900">State Filing</p> <p class="text-sm text-gray-600">Your formation documents are prepared and submitted to the appropriate state authority on your behalf.</p> </div> </li> <li class="flex gap-4"> <span class="flex-shrink-0 inline-flex items-center justify-center w-7 h-7 rounded-full bg-pw-700 text-white text-sm font-bold">3</span> <div> <p class="font-medium text-gray-900">Document Delivery</p> <p class="text-sm text-gray-600">Approved formation documents, EIN (if ordered), and operating agreement are delivered to your email.</p> </div> </li> </ol> </div> <!-- Next steps: bundle / compliance / generic --> <div id="next-steps-generic" class="hidden bg-white border border-gray-200 rounded-2xl shadow-sm p-8 mb-6"> <h3 class="text-lg font-semibold text-gray-900 mb-4">What happens next</h3> <p class="text-gray-600">Our team will review your order and begin processing. You will receive a status update by email within one business day.</p> </div> <!-- Trucking insurance upsell (shown for DOT/trucking orders) -->
|
||
<div id="upsell-insurance" class="hidden" style="background:linear-gradient(135deg,#eff6ff,#dbeafe);border:2px solid #3b82f6;border-radius:16px;padding:24px;margin-bottom:24px">
|
||
<div style="display:flex;align-items:flex-start;gap:16px">
|
||
<div style="background:#2563eb;border-radius:12px;padding:12px;flex-shrink:0">
|
||
<svg style="width:28px;height:28px;color:#fff" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12.75L11.25 15 15 9.75m-3-7.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285z"/></svg>
|
||
</div>
|
||
<div>
|
||
<h3 style="font-size:18px;font-weight:700;color:#1e3a5f;margin:0 0 4px">You'll need trucking insurance before you can operate</h3>
|
||
<p style="font-size:14px;color:#1d4ed8;margin:0 0 12px">FMCSA requires proof of insurance before your operating authority goes active. We can connect you with a licensed trucking insurance agent — no obligation, fast quotes.</p>
|
||
<div id="ins-upsell-form" style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:12px">
|
||
<input type="text" id="ins-upsell-name" placeholder="Your name" style="padding:10px 12px;font-size:14px;border:1px solid #93c5fd;border-radius:8px;outline:none">
|
||
<input type="tel" id="ins-upsell-phone" placeholder="Phone number" style="padding:10px 12px;font-size:14px;border:1px solid #93c5fd;border-radius:8px;outline:none">
|
||
<input type="email" id="ins-upsell-email" placeholder="Email address" style="padding:10px 12px;font-size:14px;border:1px solid #93c5fd;border-radius:8px;outline:none;grid-column:span 2">
|
||
</div>
|
||
<button type="button" id="ins-upsell-btn" style="padding:10px 24px;background:#2563eb;color:#fff;font-weight:600;border-radius:8px;font-size:14px;border:none;cursor:pointer">Get a Free Insurance Quote</button>
|
||
<p id="ins-upsell-status" style="font-size:12px;margin:6px 0 0;color:#1d4ed8" hidden></p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- State compliance upsell (shown for new carrier orders) -->
|
||
<div id="upsell-state" class="hidden" style="background:#fff7ed;border:2px solid #f97316;border-radius:16px;padding:20px;margin-bottom:24px;text-align:center">
|
||
<h3 style="font-size:16px;font-weight:700;color:#9a3412;margin:0 0 6px">Don't forget state compliance</h3>
|
||
<p style="font-size:14px;color:#c2410c;margin:0 0 12px">Most states require IRP registration, IFTA fuel tax filing, and other permits before you can operate interstate.</p>
|
||
<a id="upsell-state-link" href="/order/dot-compliance" style="display:inline-block;padding:10px 24px;background:#ea580c;color:#fff;font-weight:600;border-radius:8px;text-decoration:none;font-size:14px">Check State Requirements →</a>
|
||
</div>
|
||
|
||
<!-- Financing / factoring interest capture (shown for trucking orders) -->
|
||
<div id="upsell-financing" class="hidden" style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:16px;margin-bottom:24px">
|
||
<label style="display:flex;align-items:flex-start;gap:12px;cursor:pointer">
|
||
<input type="checkbox" id="financing-interest" style="margin-top:3px;width:18px;height:18px;accent-color:#2563eb;flex-shrink:0">
|
||
<div>
|
||
<span style="font-weight:600;color:#1a2744;font-size:14px">Interested in freight factoring or cash advances?</span>
|
||
<p style="font-size:13px;color:#64748b;margin:4px 0 0">Get paid same-day on your invoices instead of waiting 30-90 days. We work with reputable factoring companies that specialize in trucking. Check this box and we'll send you more info — no obligation.</p>
|
||
</div>
|
||
</label>
|
||
<p id="financing-status" style="font-size:12px;margin:8px 0 0 30px;color:#059669" hidden></p>
|
||
</div>
|
||
|
||
<!-- Footer actions --> <div class="flex flex-col sm:flex-row gap-3"> <a href="https://portal.performancewest.net" class="flex-1 inline-flex items-center justify-center gap-2 border border-pw-300 text-pw-700 hover:bg-pw-50 font-semibold px-6 py-3 rounded-lg transition-colors text-sm"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M17.982 18.725A7.488 7.488 0 0012 15.75a7.488 7.488 0 00-5.982 2.975m11.963 0a9 9 0 10-11.963 0m11.963 0A8.966 8.966 0 0112 21a8.966 8.966 0 01-5.982-2.275M15 9.75a3 3 0 11-6 0 3 3 0 016 0z"></path></svg>
|
||
Go to Client Portal
|
||
</a> <a href="/" class="flex-1 inline-flex items-center justify-center gap-2 bg-pw-700 hover:bg-pw-800 text-white font-semibold px-6 py-3 rounded-lg transition-colors text-sm">
|
||
Return Home
|
||
</a> </div> </div> <!-- Error state --> <div id="state-error" class="hidden"> <div class="bg-white border border-red-200 rounded-2xl shadow-sm p-8 text-center mb-6"> <div class="inline-flex items-center justify-center w-16 h-16 rounded-full bg-red-100 mb-5"> <svg class="w-8 h-8 text-red-600" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z"></path> </svg> </div> <h2 class="text-2xl font-bold text-gray-900 mb-2">Payment Not Confirmed</h2> <p class="text-gray-600 mb-4">We were unable to confirm your payment. Your order has been saved — you can try again with the same or a different payment method.</p> <div id="error-order-id-display" class="inline-block bg-gray-100 rounded-lg px-4 py-2 text-sm font-mono text-gray-700 mb-4"></div> </div> <div id="error-retry-section" class="bg-white border border-gray-200 rounded-2xl shadow-sm p-6 mb-6"> <h3 class="text-base font-semibold text-gray-900 mb-4">Try again</h3> <p id="expedited-error-note" class="hidden mb-3 text-xs text-amber-700 flex items-center gap-1.5 bg-amber-50 border border-amber-200 rounded-lg p-2.5"> <svg class="w-3.5 h-3.5 text-amber-500 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M3.75 13.5l10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75z"></path></svg>
|
||
Expedited order — only instant-funds payment methods (PayPal or cryptocurrency) are available.
|
||
</p> <div id="error-retry-methods" class="space-y-2 mb-4"> <label class="flex items-center gap-3 p-3 rounded-lg border border-gray-200 cursor-pointer hover:border-pw-400 has-[:checked]:border-pw-500 has-[:checked]:bg-pw-50"> <input type="radio" name="error_retry_method" value="ach" checked class="text-pw-600"> <span class="text-sm font-medium text-gray-800">ACH Bank Transfer</span> <span class="ml-auto text-xs text-green-600 font-medium">No fee</span> </label> <label class="flex items-center gap-3 p-3 rounded-lg border border-gray-200 cursor-pointer hover:border-pw-400 has-[:checked]:border-pw-500 has-[:checked]:bg-pw-50"> <input type="radio" name="error_retry_method" value="card" class="text-pw-600"> <span class="text-sm font-medium text-gray-800">Credit / Debit Card</span> <span class="ml-auto text-xs text-gray-400">+3%</span> </label> <label class="flex items-center gap-3 p-3 rounded-lg border border-gray-200 cursor-pointer hover:border-pw-400 has-[:checked]:border-pw-500 has-[:checked]:bg-pw-50"> <input type="radio" name="error_retry_method" value="paypal" class="text-pw-600"> <span class="text-sm font-medium text-gray-800">PayPal</span> <span class="ml-auto text-xs text-gray-400">+3%</span> </label> <label class="flex items-center gap-3 p-3 rounded-lg border border-gray-200 cursor-pointer hover:border-pw-400 has-[:checked]:border-pw-500 has-[:checked]:bg-pw-50"> <input type="radio" name="error_retry_method" value="klarna" class="text-pw-600"> <span class="text-sm font-medium text-gray-800">Klarna <span class="text-[10px] text-gray-400 font-normal">(Pay in 4)</span></span> <span class="ml-auto text-xs text-gray-400">+6%</span> </label> <label class="flex items-center gap-3 p-3 rounded-lg border border-gray-200 cursor-pointer hover:border-pw-400 has-[:checked]:border-pw-500 has-[:checked]:bg-pw-50"> <input type="radio" name="error_retry_method" value="crypto" class="text-pw-600"> <span class="text-sm font-medium text-gray-800">Cryptocurrency</span> <span class="ml-auto text-xs text-green-600 font-medium">No fee</span> </label> </div> <button id="btn-error-retry" type="button" class="w-full inline-flex items-center justify-center gap-2 bg-pw-700 hover:bg-pw-800 text-white font-semibold px-6 py-3 rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed text-sm"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99"></path></svg>
|
||
Retry Payment
|
||
</button> <p id="error-retry-status" class="mt-2 text-sm text-gray-500 hidden text-center"></p> </div> <div class="text-center"> <a href="/contact" class="text-sm text-pw-700 underline hover:text-pw-800 font-medium">Contact Support</a> </div> </div> </div> </section> </main> <section class="py-10 border-t border-gray-100"> <div class="max-w-2xl mx-auto px-4 text-center"> <h2 class="text-lg font-bold text-gray-900 mb-2">Stay ahead of compliance changes</h2> <p class="text-sm text-gray-600 mb-5">Regulatory updates, enforcement trends, and compliance tips. No spam.</p> <button type="button" id="subscribe-btn-footer" class="inline-flex items-center gap-2 px-5 py-2.5 rounded-lg bg-pw-700 text-white text-sm font-medium hover:bg-pw-800 transition-colors"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75"></path></svg>
|
||
Join Mailing List
|
||
</button> </div> </section> <!-- Subscribe modal --> <div id="subscribe-modal-global" class="fixed inset-0 z-[9999] hidden items-center justify-center bg-black/50 backdrop-blur-sm"> <div class="bg-white rounded-2xl shadow-2xl max-w-md w-full mx-4 p-6"> <div class="flex justify-between items-start mb-4"> <h3 class="text-lg font-semibold text-gray-900">Join our mailing list</h3> <button type="button" id="subscribe-close-global" class="text-gray-400 hover:text-gray-600"> <svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"></path></svg> </button> </div> <form id="subscribe-form-global" class="space-y-4"> <div> <label for="sub-name-g" class="block text-sm font-medium text-gray-700 mb-1">Name <span class="text-gray-400">(optional)</span></label> <input type="text" id="sub-name-g" placeholder="Your name" maxlength="100" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none"> </div> <div> <label for="sub-company-g" class="block text-sm font-medium text-gray-700 mb-1">Company <span class="text-gray-400">(optional)</span></label> <input type="text" id="sub-company-g" placeholder="Your company" maxlength="200" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none"> </div> <div> <label for="sub-email-g" class="block text-sm font-medium text-gray-700 mb-1">Email <span class="text-red-400">*</span></label> <input type="email" id="sub-email-g" required placeholder="you@company.com" maxlength="200" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none"> </div> <div class="flex items-start gap-2"> <input type="checkbox" id="sub-consent-g" required class="mt-1 rounded border-gray-300 text-pw-600 focus:ring-pw-500"> <label for="sub-consent-g" class="text-xs text-gray-600 leading-relaxed">
|
||
I agree to receive compliance updates and service announcements from Performance West Inc. I can unsubscribe at any time. We never share your email.
|
||
</label> </div> <!-- Honeypot --> <div class="absolute opacity-0 h-0 overflow-hidden" aria-hidden="true" tabindex="-1"> <label for="sub-website-g">Website</label> <input type="text" id="sub-website-g" name="website" autocomplete="off" tabindex="-1"> </div> <input type="hidden" id="sub-ts-g" value=""> <button type="submit" id="sub-submit-g" class="w-full py-2.5 px-4 bg-pw-700 text-white text-sm font-medium rounded-lg hover:bg-pw-800 transition-colors disabled:opacity-50 disabled:cursor-not-allowed">
|
||
Subscribe
|
||
</button> </form> <div id="subscribe-success-global" class="hidden text-center py-4"> <div class="w-12 h-12 mx-auto mb-3 rounded-full bg-green-100 flex items-center justify-center"> <svg class="w-6 h-6 text-green-600" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"></path></svg> </div> <p class="text-sm font-medium text-gray-900">You're on the list!</p> <p class="text-xs text-gray-500 mt-1">We'll send compliance updates and regulatory alerts.</p> </div> </div> </div> <footer class="border-t border-gray-200 bg-gray-50 mt-auto py-8">
|
||
<div class="max-w-4xl mx-auto px-4 text-center text-xs text-gray-400">
|
||
<img src="/images/logo.png" alt="Performance West" class="h-10 mx-auto mb-3">
|
||
<p>Performance West Inc. · 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001 · <a href="https://performancewest.net" class="text-gray-500">performancewest.net</a> · (888) 411-0383</p>
|
||
<p class="mt-2"><a href="/privacy" class="text-gray-500 hover:text-gray-700">Privacy Policy</a> · <a href="/terms" class="text-gray-500 hover:text-gray-700">Terms of Service</a> · <a href="/security" class="text-gray-500 hover:text-gray-700">Security & Trust</a> · <a href="/accessibility" class="text-gray-500 hover:text-gray-700">Accessibility</a></p>
|
||
<p class="mt-2">Performance West is a regulatory compliance consulting firm, not a law firm. This does not constitute legal advice.</p>
|
||
</div>
|
||
</footer> <!-- Floating help button --><button type="button" id="support-fab" aria-label="Open support" class="fixed bottom-6 left-6 z-[9999] w-14 h-14 rounded-full bg-pw-700 text-white shadow-lg hover:bg-pw-800 transition-all hover:scale-105 flex items-center justify-center"> <svg id="support-fab-icon-open" class="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path> </svg> <svg id="support-fab-icon-close" class="w-6 h-6 hidden" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> <!-- Slide-out panel --> <div id="support-panel" class="fixed bottom-24 left-6 z-[9998] w-[380px] max-w-[calc(100vw-2rem)] bg-white rounded-xl shadow-2xl border border-gray-200 transform translate-y-4 opacity-0 pointer-events-none transition-all duration-200 ease-out"> <div class="px-5 py-4 border-b border-gray-100 bg-gray-50 rounded-t-xl"> <h3 class="text-base font-semibold text-gray-900">How can we help?</h3> <p class="text-xs text-gray-500 mt-0.5">Choose a category and tell us what you need.</p> </div> <!-- Category selector (step 1) --> <div id="support-step-categories" class="p-4 space-y-2"> <button type="button" data-category="question" class="support-cat-btn w-full text-left px-4 py-3 rounded-lg border border-gray-200 hover:border-pw-300 hover:bg-pw-50 transition-colors group"> <div class="flex items-center gap-3"> <span class="flex-shrink-0 w-8 h-8 rounded-full bg-blue-100 text-blue-600 flex items-center justify-center"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg> </span> <div> <span class="text-sm font-medium text-gray-900 group-hover:text-pw-700">Ask a Question</span> <span class="block text-xs text-gray-500">About our compliance services or process</span> </div> </div> </button> <button type="button" data-category="support" class="support-cat-btn w-full text-left px-4 py-3 rounded-lg border border-gray-200 hover:border-pw-300 hover:bg-pw-50 transition-colors group"> <div class="flex items-center gap-3"> <span class="flex-shrink-0 w-8 h-8 rounded-full bg-green-100 text-green-600 flex items-center justify-center"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M18.364 5.636l-3.536 3.536m0 5.656l3.536 3.536M9.172 9.172L5.636 5.636m3.536 9.192l-3.536 3.536M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-5 0a4 4 0 11-8 0 4 4 0 018 0z"></path></svg> </span> <div> <span class="text-sm font-medium text-gray-900 group-hover:text-pw-700">Get Support</span> <span class="block text-xs text-gray-500">Help with an ongoing engagement</span> </div> </div> </button> <button type="button" data-category="issue" class="support-cat-btn w-full text-left px-4 py-3 rounded-lg border border-gray-200 hover:border-pw-300 hover:bg-pw-50 transition-colors group"> <div class="flex items-center gap-3"> <span class="flex-shrink-0 w-8 h-8 rounded-full bg-red-100 text-red-600 flex items-center justify-center"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path></svg> </span> <div> <span class="text-sm font-medium text-gray-900 group-hover:text-pw-700">Report an Issue</span> <span class="block text-xs text-gray-500">Something isn't right with a deliverable</span> </div> </div> </button> <button type="button" data-category="service_request" class="support-cat-btn w-full text-left px-4 py-3 rounded-lg border border-gray-200 hover:border-pw-300 hover:bg-pw-50 transition-colors group"> <div class="flex items-center gap-3"> <span class="flex-shrink-0 w-8 h-8 rounded-full bg-purple-100 text-purple-600 flex items-center justify-center"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path></svg> </span> <div> <span class="text-sm font-medium text-gray-900 group-hover:text-pw-700">Request a Service</span> <span class="block text-xs text-gray-500">Start a new compliance engagement</span> </div> </div> </button> <button type="button" data-category="quote" class="support-cat-btn w-full text-left px-4 py-3 rounded-lg border border-gray-200 hover:border-pw-300 hover:bg-pw-50 transition-colors group"> <div class="flex items-center gap-3"> <span class="flex-shrink-0 w-8 h-8 rounded-full bg-amber-100 text-amber-600 flex items-center justify-center"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg> </span> <div> <span class="text-sm font-medium text-gray-900 group-hover:text-pw-700">Request a Quote</span> <span class="block text-xs text-gray-500">Get pricing for a complex engagement</span> </div> </div> </button> <!-- Sign-in link (hidden when logged in) --> <div id="support-signin-link" class="pt-2 border-t border-gray-100 mt-2"> <button type="button" id="support-signin-btn" class="w-full flex items-center justify-center gap-2 px-4 py-2 text-xs text-gray-500 hover:text-pw-700 transition-colors"> <svg class="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"></path></svg>
|
||
Already a client? <span class="font-medium text-pw-600">Sign in</span> </button> </div> </div> <!-- Ticket form — Report an Issue + guest fallback (step 2a) --> <form id="support-step-form" class="hidden p-4"> <button type="button" id="support-back-btn" class="inline-flex items-center gap-1 text-xs text-gray-500 hover:text-gray-700 mb-3"> <svg class="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"></path></svg>
|
||
Back
|
||
</button> <div id="support-category-badge" class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-medium bg-pw-100 text-pw-700 mb-3"></div> <div class="space-y-3"> <div> <label for="support-name" class="block text-xs font-medium text-gray-700 mb-1">Name <span class="text-gray-400">(optional)</span></label> <input type="text" id="support-name" name="name" placeholder="Your name" maxlength="100" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow"> </div> <div> <label for="support-email" class="block text-xs font-medium text-gray-700 mb-1">Email <span class="text-gray-400">(for follow-up)</span></label> <input type="email" id="support-email" name="email" placeholder="you@company.com" maxlength="200" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow"> </div> <div> <label for="support-subject" class="block text-xs font-medium text-gray-700 mb-1">Subject <span class="text-red-400">*</span></label> <input type="text" id="support-subject" name="subject" required minlength="3" maxlength="200" placeholder="Brief summary" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow"> </div> <div> <label for="support-message" class="block text-xs font-medium text-gray-700 mb-1">Message <span class="text-red-400">*</span></label> <textarea id="support-message" name="message" required minlength="10" maxlength="5000" rows="4" placeholder="Describe your question, issue, or request..." class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow resize-y"></textarea> <p class="text-[10px] text-gray-400 mt-0.5 text-right"><span id="support-char-count">0</span> / 5000</p> </div> <button type="submit" id="support-submit-btn" class="w-full py-2.5 px-4 bg-pw-700 text-white text-sm font-medium rounded-lg hover:bg-pw-800 transition-colors disabled:opacity-50 disabled:cursor-not-allowed">
|
||
Submit
|
||
</button> </div> </form> <!-- Opportunity form — Request a Service / Request a Quote (step 2b) --> <form id="support-step-opportunity" class="hidden p-4"> <button type="button" id="opportunity-back-btn" class="inline-flex items-center gap-1 text-xs text-gray-500 hover:text-gray-700 mb-3"> <svg class="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"></path></svg>
|
||
Back
|
||
</button> <div id="opportunity-category-badge" class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-medium bg-pw-100 text-pw-700 mb-3"></div> <div class="space-y-3"> <div> <label for="opp-name" class="block text-xs font-medium text-gray-700 mb-1">Name <span class="text-red-400">*</span></label> <input type="text" id="opp-name" name="name" required minlength="2" maxlength="100" placeholder="Your name" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow"> </div> <div> <label for="opp-email" class="block text-xs font-medium text-gray-700 mb-1">Email <span class="text-red-400">*</span></label> <input type="email" id="opp-email" name="email" required placeholder="you@company.com" maxlength="200" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow"> </div> <div> <label for="opp-company" class="block text-xs font-medium text-gray-700 mb-1">Company <span class="text-gray-400">(optional)</span></label> <input type="text" id="opp-company" name="company" placeholder="Company name" maxlength="200" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow"> </div> <div> <label for="opp-phone" class="block text-xs font-medium text-gray-700 mb-1">Phone <span class="text-gray-400">(optional)</span></label> <input type="tel" id="opp-phone" name="phone" placeholder="(555) 555-1234" maxlength="30" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow"> </div> <div> <label for="opp-service" class="block text-xs font-medium text-gray-700 mb-1">Service interest <span class="text-red-400">*</span></label> <select id="opp-service" name="service_slug" required class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow bg-white"> <option value="" disabled selected>Select a service...</option> <option value="canada-crtc">Canada CRTC Carrier Package</option> <option value="llc-formation">LLC Formation</option> <option value="corporation-formation">Corporation Formation</option> <option value="registered-agent">Registered Agent</option> <option value="compliance-audit">Compliance Audit</option> <option value="other">Other / Not sure</option> </select> </div> <div> <label for="opp-details" class="block text-xs font-medium text-gray-700 mb-1">Details <span class="text-gray-400">(optional)</span></label> <textarea id="opp-details" name="details" maxlength="5000" rows="3" placeholder="Tell us about your project or what you need..." class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow resize-y"></textarea> </div> <button type="submit" id="opp-submit-btn" class="w-full py-2.5 px-4 bg-pw-700 text-white text-sm font-medium rounded-lg hover:bg-pw-800 transition-colors disabled:opacity-50 disabled:cursor-not-allowed">
|
||
Submit Request
|
||
</button> </div> </form> <!-- Sign-in prompt — Ask a Question / Get Support when not logged in (step 2c) --> <div id="support-step-signin" class="hidden p-6"> <button type="button" id="signin-back-btn" class="inline-flex items-center gap-1 text-xs text-gray-500 hover:text-gray-700 mb-4"> <svg class="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"></path></svg>
|
||
Back
|
||
</button> <div class="text-center"> <div class="w-12 h-12 mx-auto mb-3 rounded-full bg-blue-100 flex items-center justify-center"> <svg class="w-6 h-6 text-blue-600" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"></path></svg> </div> <h4 class="text-sm font-semibold text-gray-900 mb-1">Sign in for support</h4> <p class="text-xs text-gray-500 mb-5">Sign in to access your client portal where you can view your orders, submit support requests, and manage your services.</p> <button type="button" id="signin-auth-btn" class="w-full py-2.5 px-4 bg-pw-700 text-white text-sm font-medium rounded-lg hover:bg-pw-800 transition-colors mb-3">
|
||
Sign In
|
||
</button> <button type="button" id="signin-guest-btn" class="text-xs text-gray-500 hover:text-gray-700 transition-colors">
|
||
Continue as guest →
|
||
</button> </div> </div> <!-- Success state (step 3) --> <div id="support-step-success" class="hidden p-6 text-center"> <div class="w-12 h-12 mx-auto mb-3 rounded-full bg-green-100 flex items-center justify-center"> <svg class="w-6 h-6 text-green-600" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"></path></svg> </div> <h4 class="text-sm font-semibold text-gray-900 mb-1">Request received</h4> <p id="support-success-message" class="text-xs text-gray-500 mb-4">We'll get back to you within one business day.</p> <p id="support-ticket-id" class="text-xs text-gray-400 mb-4 hidden">Ref: <span></span></p> <button type="button" id="support-new-ticket-btn" class="text-xs text-pw-600 hover:text-pw-700 font-medium">Submit another request</button> </div> </div> <!-- Modal backdrop --><div id="auth-modal-backdrop" class="fixed inset-0 z-[200] bg-black/50 backdrop-blur-sm hidden items-center justify-center p-4" role="dialog" aria-modal="true" aria-labelledby="auth-modal-title"> <div id="auth-modal" class="relative w-full max-w-sm bg-white rounded-2xl shadow-2xl overflow-hidden"> <!-- Close --> <button id="auth-modal-close" type="button" aria-label="Close" class="absolute top-4 right-4 text-gray-400 hover:text-gray-600 transition-colors z-10"> <svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> <!-- Tab bar --> <div id="auth-tabs" class="flex border-b border-gray-100"> <button type="button" id="auth-tab-login" class="auth-tab flex-1 py-4 text-sm font-semibold text-pw-700 border-b-2 border-pw-600 transition-colors">
|
||
Sign In
|
||
</button> <button type="button" id="auth-tab-register" class="auth-tab flex-1 py-4 text-sm font-semibold text-gray-400 border-b-2 border-transparent hover:text-gray-600 transition-colors">
|
||
Create Account
|
||
</button> </div> <div class="px-6 py-6"> <!-- ── Login form ──────────────────────────────────────────────────── --> <form id="auth-login-form" class="space-y-4" novalidate> <div> <label for="auth-login-email" class="block text-sm font-medium text-gray-700 mb-1">Email</label> <input type="email" id="auth-login-email" autocomplete="email" required class="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-pw-500 focus:border-pw-500 transition-colors" placeholder="you@company.com"> </div> <div> <div class="flex items-center justify-between mb-1"> <label for="auth-login-password" class="text-sm font-medium text-gray-700">Password</label> <button type="button" id="auth-forgot-link" class="text-xs text-pw-600 hover:text-pw-800 underline underline-offset-2">
|
||
Forgot password?
|
||
</button> </div> <input type="password" id="auth-login-password" autocomplete="current-password" required class="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-pw-500 focus:border-pw-500 transition-colors" placeholder="••••••••"> </div> <p id="auth-login-err" class="hidden text-xs text-red-600 font-medium"></p> <button type="submit" id="auth-login-btn" class="w-full py-2.5 rounded-lg bg-pw-700 text-white text-sm font-semibold hover:bg-pw-800 transition-colors disabled:opacity-50">
|
||
Sign In
|
||
</button> </form> <!-- ── Register form ──────────────────────────────────────────────── --> <form id="auth-register-form" class="space-y-4 hidden" novalidate> <div> <label for="auth-reg-name" class="block text-sm font-medium text-gray-700 mb-1">Your Name</label> <input type="text" id="auth-reg-name" autocomplete="name" class="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-pw-500 focus:border-pw-500 transition-colors" placeholder="Full name"> </div> <div> <label for="auth-reg-email" class="block text-sm font-medium text-gray-700 mb-1">Email</label> <input type="email" id="auth-reg-email" autocomplete="email" required class="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-pw-500 focus:border-pw-500 transition-colors" placeholder="you@company.com"> </div> <div> <label for="auth-reg-password" class="block text-sm font-medium text-gray-700 mb-1">Password</label> <input type="password" id="auth-reg-password" autocomplete="new-password" required class="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-pw-500 focus:border-pw-500 transition-colors" placeholder="At least 8 characters"> </div> <p id="auth-reg-err" class="hidden text-xs text-red-600 font-medium"></p> <button type="submit" id="auth-reg-btn" class="w-full py-2.5 rounded-lg bg-pw-700 text-white text-sm font-semibold hover:bg-pw-800 transition-colors disabled:opacity-50">
|
||
Create Account
|
||
</button> </form> <!-- ── Forgot password form ────────────────────────────────────────── --> <div id="auth-forgot-form" class="hidden"> <button type="button" id="auth-back-to-login" class="flex items-center gap-1 text-xs text-gray-500 hover:text-gray-700 mb-4"> <svg class="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18"></path></svg>
|
||
Back to sign in
|
||
</button> <h3 class="text-base font-semibold text-gray-900 mb-1">Reset your password</h3> <p class="text-sm text-gray-500 mb-4">Enter your email and we'll send you a reset link.</p> <form id="auth-forgot-email-form" class="space-y-4" novalidate> <div> <label for="auth-forgot-email" class="block text-sm font-medium text-gray-700 mb-1">Email</label> <input type="email" id="auth-forgot-email" autocomplete="email" required class="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-pw-500 focus:border-pw-500 transition-colors" placeholder="you@company.com"> </div> <p id="auth-forgot-err" class="hidden text-xs text-red-600 font-medium"></p> <p id="auth-forgot-ok" class="hidden text-xs text-green-700 font-medium"></p> <button type="submit" id="auth-forgot-btn" class="w-full py-2.5 rounded-lg bg-pw-700 text-white text-sm font-semibold hover:bg-pw-800 transition-colors disabled:opacity-50">
|
||
Send reset link
|
||
</button> </form> </div> </div> </div> </div> <!-- Tawk.to Live Chat --> <script>
|
||
var Tawk_API=Tawk_API||{}, Tawk_LoadStart=new Date();
|
||
// Mobile UX: suppress proactive popup text overlays on small screens.
|
||
Tawk_API.onLoad = function() {
|
||
if (window.matchMedia('(max-width: 768px)').matches) {
|
||
Tawk_API.hideWidget();
|
||
}
|
||
};
|
||
(function(){
|
||
var s1=document.createElement("script"),s0=document.getElementsByTagName("script")[0];
|
||
s1.async=true;
|
||
s1.src='https://embed.tawk.to/69d5a9ca0d1c3f1c37998081/1jll9ufph';
|
||
s1.charset='UTF-8';
|
||
s1.setAttribute('crossorigin','*');
|
||
s0.parentNode.insertBefore(s1,s0);
|
||
})();
|
||
</script>
|
||
<script>
|
||
// Check portal status and show appropriate UI (password form vs welcome back)
|
||
(function() {
|
||
var API = window.__PW_API || "https://api.performancewest.net";
|
||
|
||
// Wait for the hoisted JS to populate the email
|
||
function checkPortal() {
|
||
var emailEl = document.getElementById("success-email");
|
||
var email = emailEl ? emailEl.textContent.trim() : "";
|
||
if (!email || email === "--" || email === "") {
|
||
setTimeout(checkPortal, 500);
|
||
return;
|
||
}
|
||
|
||
fetch(API + "/api/v1/auth/portal-status?email=" + encodeURIComponent(email))
|
||
.then(function(r) { return r.json(); })
|
||
.then(function(data) {
|
||
if (data.has_account) {
|
||
// Existing account — hide password form, show portal link
|
||
var form = document.getElementById("portal-password-form");
|
||
var already = document.getElementById("portal-already-set");
|
||
if (form) form.classList.add("hidden");
|
||
if (already) {
|
||
already.classList.remove("hidden");
|
||
already.innerHTML =
|
||
'<div class="rounded-lg bg-blue-50 border border-blue-200 p-3 flex items-center gap-2 text-sm text-blue-800">' +
|
||
'<svg class="w-4 h-4 text-blue-600 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"></path></svg>' +
|
||
(data.returning
|
||
? 'Welcome back' + (data.name ? ', ' + data.name.split(' ')[0] : '') + '! This order has been added to your portal. '
|
||
: 'Your portal account is ready. ') +
|
||
'<a href="https://portal.performancewest.net" class="underline font-medium hover:text-blue-900 ml-1">Go to your portal →</a>' +
|
||
'</div>';
|
||
}
|
||
}
|
||
// If no account, the default password form is already showing — let it be
|
||
})
|
||
.catch(function() {});
|
||
}
|
||
setTimeout(checkPortal, 1500);
|
||
})();
|
||
|
||
// Fix email updates text based on order type
|
||
(function() {
|
||
var params = new URLSearchParams(window.location.search);
|
||
var orderType = params.get("order_type") || "";
|
||
var el = document.getElementById("email-updates-text");
|
||
if (!el) return;
|
||
|
||
var messageTemplates = {
|
||
canada_crtc: "A confirmation has been sent to <strong id=\"success-email\"></strong>. We will email you as each step is completed — incorporation, CRTC registration, DID provisioning, and final binder delivery.",
|
||
formation: "A confirmation has been sent to <strong id=\"success-email\"></strong>. We will email you when your state filing is submitted and when your documents are ready for download.",
|
||
compliance: "A confirmation has been sent to <strong id=\"success-email\"></strong>. We will email you as each filing is completed, including confirmation numbers from the FCC.",
|
||
compliance_batch: "A confirmation has been sent to <strong id=\"success-email\"></strong>. We will email you as each filing is completed, including confirmation numbers from the FCC. Some services may require your review and approval before submission.",
|
||
};
|
||
|
||
// Set the template immediately — the hoisted JS will fill in #success-email later
|
||
var template = messageTemplates[orderType] ||
|
||
"A confirmation has been sent to <strong id=\"success-email\"></strong>. We will email you with updates as your order is processed.";
|
||
el.innerHTML = template;
|
||
})();
|
||
</script>
|
||
<script>
|
||
// Trucking order upsells — show insurance + state compliance for DOT orders
|
||
(function() {
|
||
var params = new URLSearchParams(window.location.search);
|
||
var orderId = params.get("order_id") || params.get("session_id") || "";
|
||
var API = window.__PW_API || "https://api.performancewest.net";
|
||
var DOT_SLUGS = ["mcs150-update","ucr-registration","boc3-filing","dot-registration","mc-authority","dot-drug-alcohol","dot-audit-prep","dot-full-compliance","irp-registration","ifta-application","usdot-reactivation","emergency-temporary-authority","new-carrier-bundle","dot-new-carrier-bundle"];
|
||
var NEW_CARRIER_SLUGS = ["new-carrier-bundle","dot-new-carrier-bundle","dot-registration","mc-authority"];
|
||
|
||
// Fetch and render order timeline
|
||
function renderTimeline(orderId) {
|
||
fetch(API + "/api/v1/order-timeline/" + encodeURIComponent(orderId))
|
||
.then(function(r) { return r.json(); })
|
||
.then(function(d) {
|
||
if (!d.timelines || d.timelines.length === 0) return;
|
||
var container = document.getElementById("order-timeline");
|
||
var stepsEl = document.getElementById("timeline-steps");
|
||
if (!container || !stepsEl) return;
|
||
|
||
var html = "";
|
||
d.timelines.forEach(function(tl) {
|
||
if (d.timelines.length > 1) {
|
||
html += '<p style="font-size:13px;font-weight:600;color:#f97316;margin:12px 0 6px">' + (tl.service_name || tl.service_slug) + '</p>';
|
||
}
|
||
tl.steps.forEach(function(step, i) {
|
||
var isFirst = i === 0;
|
||
var isLast = i === tl.steps.length - 1;
|
||
var color = isFirst ? "#059669" : "#94a3b8";
|
||
var dotBg = isFirst ? "#f0fdf4" : "#f8fafc";
|
||
html += '<div style="display:flex;gap:12px;position:relative">';
|
||
// Vertical line
|
||
if (!isLast) html += '<div style="position:absolute;left:11px;top:24px;bottom:0;width:2px;background:#e2e8f0"></div>';
|
||
// Dot
|
||
html += '<div style="width:24px;height:24px;border-radius:50%;background:' + dotBg + ';border:2px solid ' + color + ';flex-shrink:0;display:flex;align-items:center;justify-content:center;z-index:1">';
|
||
if (isFirst) html += '<svg style="width:12px;height:12px;color:#059669" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="3"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"/></svg>';
|
||
html += '</div>';
|
||
// Content
|
||
html += '<div style="padding-bottom:16px;flex:1">';
|
||
html += '<div style="display:flex;justify-content:space-between;align-items:baseline">';
|
||
html += '<span style="font-size:14px;font-weight:600;color:' + (isFirst ? "#059669" : "#374151") + '">' + step.name + '</span>';
|
||
html += '<span style="font-size:12px;color:#94a3b8">' + step.estimated_date + '</span>';
|
||
html += '</div>';
|
||
html += '<p style="font-size:13px;color:#64748b;margin:2px 0 0">' + step.description + '</p>';
|
||
html += '</div></div>';
|
||
});
|
||
});
|
||
|
||
stepsEl.innerHTML = html;
|
||
container.classList.remove("hidden");
|
||
}).catch(function() {});
|
||
}
|
||
|
||
// Wait for order data to be available
|
||
setTimeout(function() {
|
||
if (!orderId) return;
|
||
// Fetch timeline
|
||
renderTimeline(orderId);
|
||
|
||
fetch(API + "/api/v1/compliance-orders/" + encodeURIComponent(orderId))
|
||
.then(function(r) { return r.json(); })
|
||
.then(function(d) {
|
||
var orders = d.orders || [d];
|
||
var slugs = orders.map(function(o) { return o.service_slug; });
|
||
var isTrucking = slugs.some(function(s) { return DOT_SLUGS.indexOf(s) >= 0; });
|
||
var isNewCarrier = slugs.some(function(s) { return NEW_CARRIER_SLUGS.indexOf(s) >= 0; });
|
||
|
||
if (isTrucking || isNewCarrier) {
|
||
// Show insurance upsell
|
||
var insEl = document.getElementById("upsell-insurance");
|
||
if (insEl) {
|
||
insEl.classList.remove("hidden");
|
||
var email = orders[0].customer_email || "";
|
||
var name = orders[0].customer_name || "";
|
||
var nameEl = document.getElementById("ins-upsell-name");
|
||
var emailEl = document.getElementById("ins-upsell-email");
|
||
if (nameEl && name) nameEl.value = name;
|
||
if (emailEl && email) emailEl.value = email;
|
||
}
|
||
|
||
// Show financing interest checkbox
|
||
var finEl = document.getElementById("upsell-financing");
|
||
if (finEl) finEl.classList.remove("hidden");
|
||
|
||
// Show state compliance upsell for new carriers
|
||
if (isNewCarrier) {
|
||
var stateEl = document.getElementById("upsell-state");
|
||
if (stateEl) stateEl.classList.remove("hidden");
|
||
}
|
||
}
|
||
}).catch(function() {});
|
||
}, 1500);
|
||
|
||
// Financing interest checkbox
|
||
document.addEventListener("change", function(e) {
|
||
if (e.target && e.target.id === "financing-interest" && e.target.checked) {
|
||
fetch(API + "/api/v1/insurance-leads", {
|
||
method: "POST",
|
||
headers: { "Content-Type": "application/json" },
|
||
body: JSON.stringify({
|
||
name: (document.getElementById("ins-upsell-name") || {}).value || "",
|
||
email: (document.getElementById("ins-upsell-email") || {}).value || "",
|
||
phone: "",
|
||
source: "post_order_financing_interest",
|
||
order_id: orderId,
|
||
notes: "Interested in freight factoring / cash advances"
|
||
})
|
||
}).then(function() {
|
||
var st = document.getElementById("financing-status");
|
||
if (st) { st.hidden = false; st.textContent = "Got it! We'll send you information about factoring options."; }
|
||
}).catch(function() {});
|
||
}
|
||
});
|
||
|
||
// Insurance upsell submit
|
||
document.addEventListener("click", function(e) {
|
||
if (e.target && e.target.id === "ins-upsell-btn") {
|
||
var name = (document.getElementById("ins-upsell-name") || {}).value || "";
|
||
var phone = (document.getElementById("ins-upsell-phone") || {}).value || "";
|
||
var email = (document.getElementById("ins-upsell-email") || {}).value || "";
|
||
if (!email && !phone) { alert("Please enter your email or phone number."); return; }
|
||
var statusEl = document.getElementById("ins-upsell-status");
|
||
|
||
fetch(API + "/api/v1/insurance-leads", {
|
||
method: "POST",
|
||
headers: { "Content-Type": "application/json" },
|
||
body: JSON.stringify({
|
||
name: name, email: email, phone: phone,
|
||
source: "post_order_upsell", order_id: orderId,
|
||
notes: "Post-order insurance upsell from success page"
|
||
})
|
||
}).then(function(r) {
|
||
if (statusEl) { statusEl.hidden = false; statusEl.textContent = "Thank you! An insurance agent will contact you shortly."; statusEl.style.color = "#059669"; }
|
||
e.target.disabled = true; e.target.textContent = "Quote Requested";
|
||
}).catch(function() {
|
||
if (statusEl) { statusEl.hidden = false; statusEl.textContent = "Please call (888) 411-0383 for a quote."; }
|
||
});
|
||
}
|
||
});
|
||
})();
|
||
</script>
|
||
<script defer src="/js/pw-cookie-consent.js"></script></body> </html> |