order: payment-first express checkout + fix dead Tawk chat widget

Conversion fix for the checkout drop-off (54 sessions reached an /order/ page
over 3 days, 0 advanced to payment). Root cause was friction, not a bug: every
order page dropped a cold email-click straight into a 28-field intake Wizard
before showing any payment option.

- New ExpressCheckout.astro: payment-first entry. Shows price + the minimal
  fields the API needs (prefilled from public records: ?dot= FMCSA census for
  trucking, ?npi= NPPES lookup for healthcare) + Continue to payment. Creates a
  single-service batch-of-one (POST /compliance-orders/batch, which does NOT
  gate Stripe on intake_data_validated) then create-session -> Stripe. Full
  intake is collected AFTER payment via the per-service 'Complete Your Intake
  Form' email the webhook already sends (links to /order/<slug>?order=CO-xxx,
  which re-enters the Wizard in paid-intake mode).

- New OrderFlow.astro: single source of truth replacing ~50 near-identical thin
  Wizard wrappers. Trucking + healthcare default to payment-first (express on
  top, marketing hero moved BELOW the CTA). Telecom + corporate keep Wizard-first
  (rich pre-payment FCC/499 intake, no public-records prefill). Paid-intake
  re-entry (?order=/?token=) always renders the full Wizard.

- Rewrote all 50 /order/*.astro pages to use OrderFlow (foreign-qualification
  keeps its multi-state toggle via slotted content).

- Fixed the dead Tawk.to live-chat widget site-wide: the snippet set an invalid
  crossorigin='*' attribute, forcing the browser into anonymous CORS mode and
  blocking the script (0 chat requests fired anywhere). Removed it to match
  Tawk's official snippet (footer partial + 73 static public/*.html files).

Verified: build clean; express on top with hero below; ?dot=/?npi= prefill;
paid-intake re-entry swaps to Wizard; telecom stays wizard-first; batch-of-one
-> live Stripe URL; both POST endpoints allow the prod origin via CORS.
This commit is contained in:
justin 2026-06-25 11:32:48 -05:00
parent ae68edbc58
commit 618fafe1d5
126 changed files with 766 additions and 1518 deletions

View file

@ -67,7 +67,7 @@ Send reset link
s1.async=true;
s1.src='https://embed.tawk.to/69d5a9ca0d1c3f1c37998081/1jll9ufph';
s1.charset='UTF-8';
s1.setAttribute('crossorigin','*');
s0.parentNode.insertBefore(s1,s0);
})();
</script> </body> </html>

View file

@ -81,7 +81,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -75,7 +75,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -64,7 +64,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -62,7 +62,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -68,7 +68,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -80,7 +80,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -110,7 +110,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -67,7 +67,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -64,7 +64,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -67,7 +67,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

File diff suppressed because one or more lines are too long

View file

@ -68,7 +68,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -514,7 +514,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -87,7 +87,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -163,7 +163,7 @@ Send reset link
s1.async=true;
s1.src='https://embed.tawk.to/69d5a9ca0d1c3f1c37998081/1jll9ufph';
s1.charset='UTF-8';
s1.setAttribute('crossorigin','*');
s0.parentNode.insertBefore(s1,s0);
})();
</script>

File diff suppressed because one or more lines are too long

View file

@ -66,7 +66,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -90,7 +90,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -68,7 +68,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -85,7 +85,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -87,7 +87,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -86,7 +86,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -81,7 +81,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -62,7 +62,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script><script>document.addEventListener('DOMContentLoaded',function(){var b=document.getElementById('dexit-questions-btn');if(b){b.addEventListener('click',function(){var f=document.getElementById('support-fab');if(f)f.click();});}});</script></body> </html>

View file

@ -78,7 +78,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -67,7 +67,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -67,7 +67,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -82,7 +82,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -67,7 +67,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -72,7 +72,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -67,7 +67,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -145,7 +145,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script><script defer src="/js/pw-crtc-collapse.js"></script></body> </html>

View file

@ -70,7 +70,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -70,7 +70,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -70,7 +70,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -62,7 +62,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -62,7 +62,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -62,7 +62,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -62,7 +62,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -62,7 +62,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -62,7 +62,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -67,7 +67,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -70,7 +70,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -70,7 +70,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -70,7 +70,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -84,7 +84,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -68,7 +68,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

File diff suppressed because one or more lines are too long

View file

@ -74,7 +74,7 @@ Send reset link
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>

View file

@ -85,7 +85,7 @@ Send reset link
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>

View file

@ -82,7 +82,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -68,7 +68,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -68,7 +68,7 @@ Send reset link
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 defer src="/js/pw-cookie-consent.js"></script></body> </html>

View file

@ -0,0 +1,363 @@
---
/**
* ExpressCheckout — payment-first order entry.
*
* The high-friction problem this solves: every /order/<slug> page used to drop a
* cold email-click straight into a 28-field intake Wizard BEFORE the visitor
* saw a payment option. Funnel data showed 100% drop at that step (54 reached
* the order page over 3 days, 0 advanced to payment). Asking a stranger to do
* 10 minutes of data entry before earning the sale is the classic conversion
* killer.
*
* The fix (modeled on the batch / compliance-check flow): collect only the
* minimal fields the API needs to CREATE the order + charge, then go straight to
* Stripe. The full intake is collected AFTER payment via the per-service
* "Complete Your Intake Form" email the webhook already sends (links back into
* the Wizard in paid-intake mode at /order/<slug>?order=CO-xxx).
*
* Implementation: creates a single-service "batch of one" via
* POST /api/v1/compliance-orders/batch (which, unlike the single-order create +
* /validate path, does NOT gate Stripe checkout on intake_data_validated), then
* POST /api/v1/checkout/create-session with order_type=compliance_batch and
* redirects to the returned checkout_url.
*
* Prefill: the minimal fields auto-populate from public records exactly like the
* Wizard does — ?dot=NNNN pulls the FMCSA census (trucking), ?npi=NNNN runs an
* NPPES lookup (healthcare). The visitor confirms a couple of numbers and pays.
*
* Verticals with rich pre-payment intake that the API genuinely needs up front
* (telecom 499 / corporate, which have no public-records prefill and many
* conditional fields) keep the Wizard-first flow — those are gated by the
* `express` prop the page sets (see OrderFlow.astro).
*/
import { SERVICE_META, formatUSD, slugVertical } from "../../lib/intake_manifest";
import OrderPriceBanner from "../OrderPriceBanner.astro";
import CheckoutTrustBand from "../CheckoutTrustBand.astro";
export interface Props {
service_slug: string;
/** Optional override of the human service name (e.g. foreign-qualification). */
name?: string;
}
const { service_slug, name } = Astro.props;
const meta = SERVICE_META[service_slug];
const vertical = slugVertical(service_slug);
const serviceName = name || meta?.name || service_slug;
// Which minimal fields to show, per vertical. These are the smallest set the
// API's create-order path needs; everything else is collected after payment.
type FieldKind = "trucking" | "healthcare" | "generic";
const kind: FieldKind =
vertical === "trucking" ? "trucking"
: vertical === "healthcare" ? "healthcare"
: "generic";
const interval = meta?.billing_interval;
const intervalLabel = interval === "month" ? "month" : interval === "year" ? "year" : null;
const ALL_METHODS = [
{ value: "card", label: "Credit / Debit card" },
{ value: "ach", label: "ACH (US bank)" },
{ value: "paypal", label: "PayPal" },
{ value: "klarna", label: "Klarna (pay over time)" },
{ value: "crypto", label: "Cryptocurrency" },
];
const allowed = meta?.allowed_methods;
const methods = allowed ? ALL_METHODS.filter(m => allowed.includes(m.value as any)) : ALL_METHODS;
---
<section
class="pw-express"
data-slug={service_slug}
data-vertical={vertical}
data-kind={kind}
data-price-cents={meta?.price_cents ?? ""}
>
<OrderPriceBanner
priceCents={meta?.price_cents}
govFeeLabel={meta?.gov_fee_label}
serviceSlug={service_slug}
note={kind === "trucking"
? "Pay now and we'll email you a short form to finish the details. Choose card, ACH, or PayPal at payment."
: kind === "healthcare"
? "Pay now and we'll email you a quick form to finish the details. Choose card, ACH, or PayPal at payment."
: "Choose card, ACH, or PayPal at payment."}
/>
<form class="pw-express-form" id="pw-express-form" novalidate>
<h2 class="pw-express-h2">Start your {serviceName}</h2>
<p class="pw-express-sub">
Just a few details to get started — you'll complete the full intake form
after payment (we'll email you a link).
</p>
{kind === "trucking" && (
<div class="pw-express-grid">
<label class="pw-xf">Business name <span class="pw-req">*</span>
<input type="text" id="xf-legal-name" autocomplete="organization" required placeholder="As registered with FMCSA" /></label>
<label class="pw-xf">USDOT number <span class="pw-req">*</span>
<input type="text" id="xf-dot" inputmode="numeric" required placeholder="e.g. 1234567" /></label>
<label class="pw-xf">Email <span class="pw-req">*</span>
<input type="email" id="xf-email" autocomplete="email" required placeholder="you@company.com" /></label>
<label class="pw-xf">Phone
<input type="tel" id="xf-phone" autocomplete="tel" placeholder="(555) 123-4567" /></label>
<label class="pw-xf">Base state <span class="pw-req">*</span>
<select id="xf-base-state" required>
<option value="">Select…</option>
{["AL","AK","AZ","AR","CA","CO","CT","DE","FL","GA","HI","ID","IL","IN","IA","KS","KY","LA","ME","MD","MA","MI","MN","MS","MO","MT","NE","NV","NH","NJ","NM","NY","NC","ND","OH","OK","OR","PA","RI","SC","SD","TN","TX","UT","VT","VA","WA","WV","WI","WY","DC"].map(s => <option value={s}>{s}</option>)}
</select></label>
<label class="pw-xf">Power units (trucks) <span class="pw-req">*</span>
<input type="number" id="xf-power-units" min="0" required placeholder="e.g. 5" /></label>
</div>
)}
{kind === "healthcare" && (
<div class="pw-express-grid">
<label class="pw-xf">Provider / practice name <span class="pw-req">*</span>
<input type="text" id="xf-provider-name" autocomplete="organization" required placeholder="As registered in NPPES" /></label>
<label class="pw-xf">NPI number <span class="pw-req">*</span>
<input type="text" id="xf-npi" inputmode="numeric" maxlength="10" required placeholder="e.g. 1234567893" />
<span id="xf-npi-status" class="pw-xf-status" hidden></span></label>
<label class="pw-xf">Email <span class="pw-req">*</span>
<input type="email" id="xf-email" autocomplete="email" required placeholder="you@practice.com" /></label>
<label class="pw-xf">Phone
<input type="tel" id="xf-phone" autocomplete="tel" placeholder="(555) 123-4567" /></label>
</div>
)}
{kind === "generic" && (
<div class="pw-express-grid">
<label class="pw-xf">Business / legal name <span class="pw-req">*</span>
<input type="text" id="xf-legal-name" autocomplete="organization" required placeholder="Your legal entity name" /></label>
<label class="pw-xf">Email <span class="pw-req">*</span>
<input type="email" id="xf-email" autocomplete="email" required placeholder="you@company.com" /></label>
<label class="pw-xf">Phone
<input type="tel" id="xf-phone" autocomplete="tel" placeholder="(555) 123-4567" /></label>
</div>
)}
<label class="pw-xf pw-xf-method">Payment method
<select id="xf-pay-method">
{methods.map(m => <option value={m.value}>{m.label}</option>)}
</select></label>
<div id="pw-express-error" class="pw-express-error" hidden></div>
<button type="submit" id="pw-express-submit" class="pw-express-btn">
Continue to payment{meta ? ` — ${intervalLabel ? `${formatUSD(meta.price_cents)}/${intervalLabel}` : formatUSD(meta.price_cents)}` : ""} &rarr;
</button>
<p class="pw-express-fineprint">
Secure checkout by Stripe. You'll review the total before you pay.
{kind !== "generic" && " The full intake form is emailed to you after payment."}
</p>
<CheckoutTrustBand variant="compact" vertical={vertical} />
</form>
</section>
<style>
.pw-express { max-width: 820px; margin: 0 auto; }
.pw-express-form {
background: #fff; border: 1px solid #e2e8f0; border-radius: 12px;
padding: 1.5rem 1.5rem 1.75rem; margin-top: 0.5rem;
box-shadow: 0 10px 30px rgba(15, 23, 42, 0.06);
}
.pw-express-h2 { margin: 0 0 0.35rem; color: var(--pw-navy, #1a2744); font-size: 1.35rem; }
.pw-express-sub { margin: 0 0 1.25rem; color: var(--pw-muted, #64748b); font-size: 0.95rem; line-height: 1.5; }
.pw-express-grid {
display: grid; grid-template-columns: 1fr 1fr; gap: 0.9rem 1.1rem;
}
.pw-xf { display: flex; flex-direction: column; gap: 0.3rem; font-size: 0.85rem; font-weight: 600; color: #334155; }
.pw-xf input, .pw-xf select {
padding: 0.6rem 0.7rem; border: 1px solid #cbd5e1; border-radius: 7px;
font-size: 0.95rem; font-weight: 400; color: #0f172a; background: #fff;
}
.pw-xf input:focus, .pw-xf select:focus { outline: 2px solid #2563eb; outline-offset: 0; border-color: #2563eb; }
.pw-req { color: #dc2626; }
.pw-xf-status { font-size: 0.78rem; font-weight: 500; color: #059669; }
.pw-xf-status[data-state="error"] { color: #b45309; }
.pw-xf-method { margin-top: 1.1rem; max-width: 22rem; }
.pw-express-error {
margin: 1rem 0 0; padding: 0.7rem 0.9rem; border-radius: 8px;
background: #fef2f2; border: 1px solid #fecaca; color: #b91c1c; font-size: 0.88rem;
}
.pw-express-btn {
margin-top: 1.25rem; width: 100%; padding: 0.95rem 1.4rem; border: 0;
border-radius: 9px; background: #059669; color: #fff; font-weight: 800;
font-size: 1.05rem; cursor: pointer; transition: background 0.15s;
}
.pw-express-btn:hover { background: #047857; }
.pw-express-btn:disabled { opacity: 0.6; cursor: not-allowed; }
.pw-express-fineprint { margin: 0.7rem 0 0; text-align: center; color: #94a3b8; font-size: 0.78rem; line-height: 1.5; }
@media (max-width: 560px) {
.pw-express-grid { grid-template-columns: 1fr; }
}
</style>
<script>
// ── ExpressCheckout client logic ────────────────────────────────────────
const root = document.querySelector<HTMLElement>(".pw-express");
if (root) {
const slug = root.dataset.slug!;
const kind = root.dataset.kind!;
const API = (window as any).__PW_API || "";
const form = document.getElementById("pw-express-form") as HTMLFormElement;
const errBox = document.getElementById("pw-express-error")!;
const submitBtn = document.getElementById("pw-express-submit") as HTMLButtonElement;
const params = new URLSearchParams(location.search);
const $ = (id: string) => document.getElementById(id) as HTMLInputElement | HTMLSelectElement | null;
const val = (id: string) => ($(id)?.value || "").trim();
const setVal = (id: string, v: string) => { const el = $(id); if (el && !el.value && v) el.value = v; };
// ── Public-records prefill (same sources the Wizard uses) ──────────────
async function prefill() {
if (kind === "trucking") {
const dot = (params.get("dot") || "").replace(/\D/g, "");
if (dot) {
setVal("xf-dot", dot);
try {
const r = await fetch(`${API}/api/v1/dot/census?dot=${dot}`);
if (r.ok) {
const c = await r.json();
setVal("xf-legal-name", c.legal_name || "");
setVal("xf-email", (c.email || "").toLowerCase());
setVal("xf-phone", c.telephone || "");
setVal("xf-base-state", c.phy_state || "");
setVal("xf-power-units", c.power_units != null ? String(c.power_units) : "");
}
} catch { /* prefill is best-effort */ }
}
} else if (kind === "healthcare") {
const npi = (params.get("npi") || "").replace(/\D/g, "").slice(0, 10);
if (npi) {
setVal("xf-npi", npi);
await npiLookup(npi);
}
}
}
async function npiLookup(npi: string) {
const status = document.getElementById("xf-npi-status");
if (status) { status.hidden = false; status.removeAttribute("data-state"); status.textContent = "Looking up NPI…"; }
try {
const r = await fetch(`${API}/api/v1/npi/lookup?npi=${encodeURIComponent(npi)}`, { headers: { Accept: "application/json" } });
if (r.ok) {
const d = await r.json();
const nm = d.provider_name || d.organization_name || d.name || "";
setVal("xf-provider-name", nm);
if (status) { status.removeAttribute("data-state"); status.textContent = nm ? `\u2713 ${nm}` : "Found"; }
} else {
if (status) { status.setAttribute("data-state", "error"); status.textContent = "NPI not found — you can still continue"; }
}
} catch {
if (status) { status.hidden = true; }
}
}
// Re-run NPI lookup when the user edits the field manually.
if (kind === "healthcare") {
const npiEl = document.getElementById("xf-npi") as HTMLInputElement | null;
npiEl?.addEventListener("blur", () => {
const n = (npiEl.value || "").replace(/\D/g, "").slice(0, 10);
if (n.length === 10) npiLookup(n);
});
}
function collect(): { ok: boolean; email: string; name: string; phone: string; intake: Record<string, any>; missing: string[] } {
const email = val("xf-email");
const phone = val("xf-phone");
const missing: string[] = [];
let name = "", intake: Record<string, any> = {};
if (kind === "trucking") {
name = val("xf-legal-name");
intake = {
legal_name: name, entity_name: name, dot_number: val("xf-dot").replace(/\D/g, ""),
email, phone, base_state: val("xf-base-state"), power_units: val("xf-power-units"),
};
if (!name) missing.push("Business name");
if (!intake.dot_number) missing.push("USDOT number");
if (!email) missing.push("Email");
if (!intake.base_state) missing.push("Base state");
if (!intake.power_units) missing.push("Power units");
} else if (kind === "healthcare") {
name = val("xf-provider-name");
intake = {
provider_name: name, organization_name: name, npi: val("xf-npi").replace(/\D/g, ""),
email, phone,
};
if (!name) missing.push("Provider / practice name");
if (!intake.npi || intake.npi.length !== 10) missing.push("Valid 10-digit NPI");
if (!email) missing.push("Email");
} else {
name = val("xf-legal-name");
intake = { legal_name: name, entity_name: name, email, phone };
if (!name) missing.push("Business / legal name");
if (!email) missing.push("Email");
}
if (email && !/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email)) missing.push("Valid email address");
return { ok: missing.length === 0, email, name, phone, intake, missing };
}
form.addEventListener("submit", async (e) => {
e.preventDefault();
errBox.hidden = true;
const c = collect();
if (!c.ok) {
errBox.hidden = false;
errBox.textContent = "Please complete: " + c.missing.join(", ") + ".";
return;
}
submitBtn.disabled = true;
const origLabel = submitBtn.innerHTML;
submitBtn.textContent = "Starting secure checkout…";
try {
const code = (params.get("code") || "").toUpperCase().trim();
// 1) Create a single-service "batch of one" — this path does NOT gate
// Stripe checkout on intake_data_validated, so we can charge first
// and collect the full intake after payment.
const createResp = await fetch(`${API}/api/v1/compliance-orders/batch`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
services: [slug],
customer_email: c.email,
customer_name: c.name,
customer_phone: c.phone || undefined,
intake_data: c.intake,
discount_code: code || undefined,
}),
});
if (!createResp.ok) {
const err = await createResp.json().catch(() => ({}));
throw new Error(err.error || `Could not create order (HTTP ${createResp.status})`);
}
const created = await createResp.json();
const batchId = created.batch_id;
if (!batchId) throw new Error("Order created but no batch id returned.");
// 2) Start checkout for the batch.
const paymentMethod = ($("xf-pay-method") as HTMLSelectElement)?.value || "card";
const checkoutResp = await fetch(`${API}/api/v1/checkout/create-session`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ order_id: batchId, order_type: "compliance_batch", payment_method: paymentMethod }),
});
if (!checkoutResp.ok) throw new Error(`Could not start checkout (HTTP ${checkoutResp.status})`);
const { checkout_url } = await checkoutResp.json();
if (!checkout_url) throw new Error("No checkout URL returned.");
// Fire a funnel event so we can see express conversions in Umami.
try { (window as any).pwTrack?.("express-checkout-start", { slug, method: paymentMethod }); } catch {}
window.location.href = checkout_url;
} catch (e: any) {
errBox.hidden = false;
errBox.textContent = e?.message || "Could not start checkout. Please try again or call (888) 411-0383.";
submitBtn.disabled = false;
submitBtn.innerHTML = origLabel;
}
});
prefill();
}
</script>

View file

@ -0,0 +1,157 @@
---
/**
* OrderFlow — the single source of truth for every /order/<slug> page.
*
* Replaces ~50 near-identical thin Wizard wrappers. It picks the right flow:
*
* 1. PAYMENT-FIRST (default for trucking + healthcare): show ExpressCheckout
* (price + minimal prefillable fields + "Continue to payment") at the TOP,
* with the marketing hero BELOW it. The full intake is collected after
* payment via the per-service email link the webhook already sends.
*
* 2. WIZARD-FIRST (telecom / corporate, express=false): these have rich
* pre-payment intake the API genuinely needs up front (FCC 499 conditional
* fields, de minimis, LNPA) and no public-records prefill, so the full
* Wizard stays first. Hero stays on top as before.
*
* 3. PAID-INTAKE re-entry (?order=CO-xxx or ?token=JWT): ALWAYS render the
* full Wizard (it self-detects paid-intake mode, strips the payment step,
* and hides the price). This is where the post-payment email lands so the
* customer finishes the details. Detected client-side; both the express UI
* and the wizard are rendered, and a tiny inline script shows the right one
* (avoids a server round-trip / flash since Astro is static-built).
*/
import VerticalOrderHeader from "../VerticalOrderHeader.astro";
import Wizard from "./Wizard.astro";
import TaxDeductibilityNotice from "../TaxDeductibilityNotice.astro";
import TruckingValueNotice from "../TruckingValueNotice.astro";
import ExpressCheckout from "./ExpressCheckout.astro";
import { INTAKE_MANIFEST, SERVICE_META, slugVertical } from "../../lib/intake_manifest";
export interface Props {
slug: string;
/** Human title + description for the intro + <Base>. */
title?: string;
description?: string;
/** Override the service display name passed to ExpressCheckout. */
name?: string;
/** Fallback step list when the manifest has none. */
fallbackSteps?: string[];
/**
* Force the flow. Default: trucking + healthcare = payment-first ("express"),
* telecom + corporate = wizard-first ("wizard"). Pages can override.
*/
flow?: "express" | "wizard";
/** Which value-notice to show below the hero. */
notice?: "tax" | "trucking" | "none";
}
const {
slug,
title,
description,
name,
fallbackSteps,
flow,
notice,
} = Astro.props;
const meta = SERVICE_META[slug];
const steps = INTAKE_MANIFEST[slug] ?? fallbackSteps ?? ["review", "payment"];
const vertical = slugVertical(slug) ?? "telecom";
const displayName = name || meta?.name || slug;
const introTitle = title || (meta ? meta.name : "Order");
// Default flow per vertical. Trucking + healthcare go payment-first because they
// prefill from public records (DOT census / NPPES) and the rest of the intake
// can be finished after payment. Telecom + corporate keep the Wizard first.
const resolvedFlow: "express" | "wizard" =
flow ?? (vertical === "trucking" || vertical === "healthcare" ? "express" : "wizard");
// Default notice per vertical (matches the previous per-page choices).
const resolvedNotice: "tax" | "trucking" | "none" =
notice ?? (vertical === "trucking"
? (slug.startsWith("dot-") || slug === "state-trucking-bundle" || slug === "state-dot-registration"
|| slug === "intrastate-authority" || slug === "mc-authority" || slug === "boc3-filing"
|| slug === "osow-permit" || slug === "dot-audit-prep"
? "tax" : "trucking")
: "none");
---
<main class="pw-order-main" data-flow={resolvedFlow}>
{resolvedFlow === "express" ? (
<>
{/* PAYMENT-FIRST: express checkout on top, hero + details below. */}
<section class="pw-order-intro">
<h1>{introTitle}</h1>
{description && <p class="pw-desc">{description}</p>}
</section>
<div id="pw-express-region">
<ExpressCheckout service_slug={slug} name={displayName} />
</div>
{/* Marketing hero + value notice moved BELOW the CTA. */}
<div class="pw-below-fold">
<VerticalOrderHeader vertical={vertical} />
{resolvedNotice === "tax" && <TaxDeductibilityNotice />}
{resolvedNotice === "trucking" && <TruckingValueNotice slug={slug} />}
</div>
{/* PAID-INTAKE re-entry: full wizard, hidden until ?order=/?token= detected. */}
<div id="pw-wizard-region" hidden>
<Wizard service_slug={slug} steps={steps} title={displayName} />
</div>
</>
) : (
<>
{/* WIZARD-FIRST (telecom / corporate). */}
<section class="pw-order-intro">
<h1>{introTitle}</h1>
{description && <p class="pw-desc">{description}</p>}
</section>
<VerticalOrderHeader vertical={vertical} />
{resolvedNotice === "tax" && <TaxDeductibilityNotice />}
{resolvedNotice === "trucking" && <TruckingValueNotice slug={slug} />}
<Wizard service_slug={slug} steps={steps} title={displayName} />
</>
)}
<slot />
</main>
<script>
// In paid-intake re-entry (?order=CO-xxx or ?token=JWT), the customer arrived
// from the post-payment "Complete Your Intake Form" email. Swap the express
// CTA for the full Wizard so they finish the details. Only relevant on
// express-flow pages (wizard-flow pages already render the Wizard first; the
// Wizard itself strips the payment step + price in paid-intake mode).
(function () {
const main = document.querySelector<HTMLElement>(".pw-order-main");
if (!main || main.dataset.flow !== "express") return;
const p = new URLSearchParams(location.search);
const paidIntake = p.has("order") || p.has("token");
if (!paidIntake) return;
const express = document.getElementById("pw-express-region");
const below = main.querySelector<HTMLElement>(".pw-below-fold");
const wizard = document.getElementById("pw-wizard-region");
if (express) express.hidden = true;
if (below) below.hidden = true;
if (wizard) wizard.hidden = false;
})();
</script>
<style>
.pw-order-main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.25rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
.pw-below-fold { margin-top: 2.5rem; padding-top: 1.5rem; border-top: 1px solid #eef2f7; }
.pw-below-fold::before {
content: "Why Performance West";
display: block; font-size: 0.75rem; font-weight: 800; letter-spacing: 0.08em;
text-transform: uppercase; color: #94a3b8; margin-bottom: 1rem; text-align: center;
}
</style>

View file

@ -1,41 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "bdc-broadband";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Availability data only (no voice subscription). For broadband-focused ISPs and fixed wireless providers.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="telecom" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<script>
if (new URLSearchParams(window.location.search).has("token")) {
const p = document.getElementById("pw-price");
const t = document.getElementById("pw-tax-notice");
if (p) p.style.display = "none";
if (t) t.style.display = "none";
}
</script>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,41 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "bdc-filing";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Both BDC blocks in one order — broadband deployment + voice subscription. For carriers with both.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="telecom" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<script>
if (new URLSearchParams(window.location.search).has("token")) {
const p = document.getElementById("pw-price");
const t = document.getElementById("pw-tax-notice");
if (p) p.style.display = "none";
if (t) t.style.display = "none";
}
</script>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,41 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "bdc-voice";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Voice subscriber counts only — the part of the legacy Form 477 that now files through BDC. For VoIP resellers + CLECs.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="telecom" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<script>
if (new URLSearchParams(window.location.search).has("token")) {
const p = document.getElementById("pw-price");
const t = document.getElementById("pw-tax-notice");
if (p) p.style.display = "none";
if (t) t.style.display = "none";
}
</script>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,39 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "boc3-filing";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Designate a process agent in all 48 states plus DC.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="trucking" />
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
<TaxDeductibilityNotice />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,38 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "ca-mcp-carb";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "California Motor Carrier Permit (MCP) plus CARB Clean Truck Check compliance for carriers operating in California.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="trucking" />
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
<TruckingValueNotice slug={slug} />
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<OrderFlow slug={slug} description={description} fallbackSteps={["state-trucking", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,41 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "calea-ssi";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "System Security and Integrity plan required of every common carrier under 47 USC § 229 / 47 CFR § 1.20003. Kept internally, provided to DOJ on subpoena.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="telecom" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<script>
if (new URLSearchParams(window.location.search).has("token")) {
const p = document.getElementById("pw-price");
const t = document.getElementById("pw-tax-notice");
if (p) p.style.display = "none";
if (t) t.style.display = "none";
}
</script>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,41 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "cdr-analysis";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Classified traffic study from your CDRs — feeds the 499-A with actual interstate/international percentages instead of the 64.9% safe harbor.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="telecom" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<script>
if (new URLSearchParams(window.location.search).has("token")) {
const p = document.getElementById("pw-price");
const t = document.getElementById("pw-tax-notice");
if (p) p.style.display = "none";
if (t) t.style.display = "none";
}
</script>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,35 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "clia-renewal";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Renew your CLIA laboratory certificate with CMS before it expires. CLIA certificates run on a 2-year cycle; an expired certificate stops you from legally performing or billing for lab testing.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="healthcare" />
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
<Wizard service_slug={slug} steps={steps ?? ["npi-intake", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<OrderFlow slug={slug} description={description} fallbackSteps={["npi-intake", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,41 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "cores-frn-registration";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Register your carrier in FCC CORES and obtain your FRN. Required before any other FCC filing.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="telecom" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<script>
if (new URLSearchParams(window.location.search).has("token")) {
const p = document.getElementById("pw-price");
const t = document.getElementById("pw-tax-notice");
if (p) p.style.display = "none";
if (t) t.style.display = "none";
}
</script>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,41 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "cpni-certification";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "47 CFR § 64.2009 annual CPNI certification filed at FCC ECFS docket 06-36. Due March 1.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="telecom" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<script>
// Always hide price + tax on intake pages — if the user is here, they've
// already paid via the order page or batch checkout.
const price = document.getElementById("pw-price");
const tax = document.getElementById("pw-tax-notice");
if (price) price.style.display = "none";
if (tax) tax.style.display = "none";
</script>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,38 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "ct-highway-use-fee";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Connecticut Highway Use Fee registration for heavy multi-unit carriers operating in Connecticut.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="trucking" />
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
<TruckingValueNotice slug={slug} />
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<OrderFlow slug={slug} description={description} fallbackSteps={["state-trucking", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,41 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "dc-agent";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Your required D.C. registered agent for service of process (47 CFR § 413). Uses Northwest Registered Agent wholesale.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="corporate" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<script>
if (new URLSearchParams(window.location.search).has("token")) {
const p = document.getElementById("pw-price");
const t = document.getElementById("pw-tax-notice");
if (p) p.style.display = "none";
if (t) t.style.display = "none";
}
</script>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,39 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "dot-audit-prep";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Prepare for your 18-month FMCSA safety audit.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="trucking" />
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
<TaxDeductibilityNotice />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,39 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "dot-drug-alcohol";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Consortium enrollment, written policy, and DER designation.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="trucking" />
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
<TaxDeductibilityNotice />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,39 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "dot-full-compliance";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "MCS-150 + BOC-3 + UCR + Drug & Alcohol + Audit Prep.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="trucking" />
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
<TaxDeductibilityNotice />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,39 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "dot-registration";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Register a new USDOT number with FMCSA.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="trucking" />
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
<TaxDeductibilityNotice />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,41 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "fcc-499-initial";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "New carrier registration with USAC — obtain your Filer ID (812xxx) and unlock all future 499-A filings.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="telecom" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<script>
if (new URLSearchParams(window.location.search).has("token")) {
const p = document.getElementById("pw-price");
const t = document.getElementById("pw-tax-notice");
if (p) p.style.display = "none";
if (t) t.style.display = "none";
}
</script>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,41 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "fcc-499a-499q";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Annual 499-A plus the four quarterly 499-Q filings — one bundle, full year covered.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="telecom" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<script>
if (new URLSearchParams(window.location.search).has("token")) {
const p = document.getElementById("pw-price");
const t = document.getElementById("pw-tax-notice");
if (p) p.style.display = "none";
if (t) t.style.display = "none";
}
</script>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,41 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "fcc-499a";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Annual Telecommunications Reporting Worksheet. Due April 1 for the prior year's revenue.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="telecom" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<script>
if (new URLSearchParams(window.location.search).has("token")) {
const p = document.getElementById("pw-price");
const t = document.getElementById("pw-tax-notice");
if (p) p.style.display = "none";
if (t) t.style.display = "none";
}
</script>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,41 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "fcc-63-11-notification";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "47 CFR § 63.11 notification filed with the FCC International Bureau. Required when U.S. carriers are affiliated with a foreign carrier serving the same route.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="telecom" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<script>
if (new URLSearchParams(window.location.search).has("token")) {
const p = document.getElementById("pw-price");
const t = document.getElementById("pw-tax-notice");
if (p) p.style.display = "none";
if (t) t.style.display = "none";
}
</script>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,41 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "fcc-compliance-checkup";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "Diagnostic check — CORES, RMD, STIR/SHAKEN, CPNI, 499-A status. No filing, just a report.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="telecom" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<script>
if (new URLSearchParams(window.location.search).has("token")) {
const p = document.getElementById("pw-price");
const t = document.getElementById("pw-tax-notice");
if (p) p.style.display = "none";
if (t) t.style.display = "none";
}
</script>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,41 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "fcc-full-compliance";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "RMD + CPNI + STIR/SHAKEN + 499-A + 499-Q in one order. Every annual filing, 15% bundle discount.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="telecom" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<script>
if (new URLSearchParams(window.location.search).has("token")) {
const p = document.getElementById("pw-price");
const t = document.getElementById("pw-tax-notice");
if (p) p.style.display = "none";
if (t) t.style.display = "none";
}
</script>
<OrderFlow slug={slug} description={description} fallbackSteps={["entity", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.75rem; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,14 +1,11 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import TaxDeductibilityNotice from "../../components/TaxDeductibilityNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META, formatUSD } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
// URL param ?multi=1 selects the multi-state discounted SKU.
const isMulti = Astro.url.searchParams.get("multi") === "1";
const slug = isMulti ? "foreign-qualification-multi" : "foreign-qualification-single";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = "Foreign Qualification (Certificate of Authority)";
const description =
@ -18,11 +15,12 @@ const description =
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{title}</h1>
<p class="pw-desc">{description}</p>
<OrderFlow
slug={slug}
title={title}
description={description}
fallbackSteps={["entity", "foreign_qual", "review", "payment"]}
>
{!isMulti && (
<p class="pw-multi-cta">
Registering in multiple states?
@ -39,28 +37,10 @@ const description =
</a>
</p>
)}
</section>
<VerticalOrderHeader vertical="corporate" />
<Wizard service_slug={slug} steps={steps ?? ["entity", "foreign_qual", "review", "payment"]} title={title} />
</main>
<script>
if (new URLSearchParams(window.location.search).has("token")) {
const p = document.getElementById("pw-price");
const t = document.getElementById("pw-tax-notice");
if (p) p.style.display = "none";
if (t) t.style.display = "none";
}
</script>
</OrderFlow>
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-price { font-size: 1.5rem; font-weight: 700; color: var(--pw-green, #059669); margin: 0 0 0.5rem; }
.pw-price-note { font-size: 0.9rem; font-weight: 400; color: #64748b; }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
.pw-multi-cta { font-size: 0.9rem; color: #475569; margin-top: 0.5rem; }
.pw-multi-cta { font-size: 0.9rem; color: #475569; margin-top: 1rem; }
.pw-multi-cta a { color: #2563eb; text-decoration: underline; }
</style>

View file

@ -1,38 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "hazmat-phmsa";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "PHMSA hazardous-materials registration for carriers transporting placardable quantities of hazmat.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="trucking" />
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
<TruckingValueNotice slug={slug} />
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<OrderFlow slug={slug} description={description} fallbackSteps={["state-trucking", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

View file

@ -1,38 +1,14 @@
---
import Base from "../../layouts/Base.astro";
import VerticalOrderHeader from "../../components/VerticalOrderHeader.astro";
import Wizard from "../../components/intake/Wizard.astro";
import OrderPriceBanner from "../../components/OrderPriceBanner.astro";
import TruckingValueNotice from "../../components/TruckingValueNotice.astro";
import { INTAKE_MANIFEST, SERVICE_META } from "../../lib/intake_manifest";
import OrderFlow from "../../components/intake/OrderFlow.astro";
import { SERVICE_META } from "../../lib/intake_manifest";
const slug = "ifta-application";
const steps = INTAKE_MANIFEST[slug];
const meta = SERVICE_META[slug];
const title = meta ? `Order ${meta.name}` : "Order";
const description = "International Fuel Tax Agreement (IFTA) license and decals — one fuel-tax credential covering all your operating jurisdictions.";
---
<Base title={title} description={description}>
<main>
<section class="pw-order-intro">
<h1>{meta?.name}</h1>
<p class="pw-desc">{description}</p>
</section>
<VerticalOrderHeader vertical="trucking" />
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
<TruckingValueNotice slug={slug} />
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
</main>
<OrderFlow slug={slug} description={description} fallbackSteps={["state-trucking", "review", "payment"]} />
</Base>
<style>
main { max-width: 900px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
.pw-order-intro { margin-bottom: 1.5rem; }
.pw-order-intro h1 { margin: 0 0 0.25rem; color: var(--pw-navy, #1a2744); }
.pw-desc { color: var(--pw-muted, #64748b); max-width: 48rem; }
</style>

Some files were not shown because too many files have changed in this diff Show more