trucking: same-day expiring coupon to drive immediate conversion
The sales we got came at $79 + a 24hr coupon; cutting MCS-150 to $39 flat removed urgency and conversions did NOT improve (a permanent low price sets a new anchor and lets people defer). Restore the higher anchor and let an expiring discount create the now-or-lose-it decision. - Restore MCS-150 anchor $39 -> $79 (catalog single source + regenerated). - build_trucking_campaigns.py: mint ONE random 5-letter coupon per send-day (40% off, valid through 23:59:59 ET that day) into the existing discount_codes table; inject coupon_code/pct/expires + a ?code= LP link into every email. Idempotent per day; service-fee-only scope (gov/pass-through fees never cut). - Listmonk MCS-150 (186) + Inactive USDOT (188) templates: lead with the struck-through anchor + sale price + code + 'expires tonight', and point the primary CTA at the order page (with code) instead of the 'free check' tool. - OrderPriceBanner: validates ?code= via /api/v1/discount and shows was/now + expiry; Wizard forwards the code to order creation. - Verified: code gen, expiry math, scope enforcement, discount API (40% off $79 = $47.40), site+api builds clean.
This commit is contained in:
parent
dd4ed3ea38
commit
5e9aec40d1
30 changed files with 216 additions and 31 deletions
|
|
@ -272,7 +272,7 @@ export const COMPLIANCE_SERVICES: Record<string, ComplianceService> = {
|
||||||
// ── DOT / FMCSA Motor Carrier Services ──────────────────────────────
|
// ── DOT / FMCSA Motor Carrier Services ──────────────────────────────
|
||||||
"mcs150-update": {
|
"mcs150-update": {
|
||||||
name: "MCS-150 Biennial Update",
|
name: "MCS-150 Biennial Update",
|
||||||
price_cents: 3900,
|
price_cents: 7900,
|
||||||
erpnext_item: "MCS150-UPDATE",
|
erpnext_item: "MCS150-UPDATE",
|
||||||
discountable: true,
|
discountable: true,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
BIN
docs/legal/Office-of-Attorney-General_Envelope-108633.pdf
Normal file
BIN
docs/legal/Office-of-Attorney-General_Envelope-108633.pdf
Normal file
Binary file not shown.
|
|
@ -135,6 +135,111 @@ def build_lp_link(campaign_type: str, phy_state: str | None) -> str:
|
||||||
slug = "ca-mcp-carb"
|
slug = "ca-mcp-carb"
|
||||||
return f"{SITE_DOMAIN}/order/{slug}"
|
return f"{SITE_DOMAIN}/order/{slug}"
|
||||||
|
|
||||||
|
|
||||||
|
def lp_slug_for(campaign_type: str, phy_state: str | None = None) -> str:
|
||||||
|
"""The order-page slug (== the discountable service slug) for a segment."""
|
||||||
|
seg = DEFICIENCY_SEGMENTS.get(campaign_type)
|
||||||
|
slug = seg["lp_slug"] if seg else "dot-full-compliance"
|
||||||
|
if campaign_type == "state_weight_tax" and phy_state in _WEIGHT_TAX_LP:
|
||||||
|
slug = _WEIGHT_TAX_LP[phy_state]
|
||||||
|
if campaign_type == "state_emissions" and phy_state == "CA":
|
||||||
|
slug = "ca-mcp-carb"
|
||||||
|
return slug
|
||||||
|
|
||||||
|
|
||||||
|
# ── Daily same-day coupon ───────────────────────────────────────────────────
|
||||||
|
# Every send day gets ONE random 5-letter coupon at COUPON_PCT off, valid only
|
||||||
|
# through 23:59:59 of the send date (America/New_York). The code is written to
|
||||||
|
# the app's `discount_codes` table; the existing /api/v1/discount validator and
|
||||||
|
# checkout enforce expiry + the service-fee-only scope (pass-through government
|
||||||
|
# fees are never discounted). The code + prices are merged into the email so the
|
||||||
|
# recipient sees a real, expiring deal.
|
||||||
|
COUPON_PCT = int(os.getenv("CAMPAIGN_COUPON_PCT", "40"))
|
||||||
|
# Eligible slugs = every discountable service a trucking campaign can link to.
|
||||||
|
# Pass-through-only slugs (boc3-filing $25 passthrough, etc.) are intentionally
|
||||||
|
# eligible too: the discount math only touches the service-fee portion, so a
|
||||||
|
# code scoped to them simply yields $0 off the passthrough and full off the fee.
|
||||||
|
COUPON_SLUGS = (
|
||||||
|
"mcs150-update,usdot-reactivation,dot-drug-alcohol,dot-full-compliance,"
|
||||||
|
"ucr-registration,state-trucking-bundle,intrastate-authority,irp-registration,"
|
||||||
|
"ifta-application,hazmat-phmsa,state-emissions,state-weight-tax,trucking-wrap-up,"
|
||||||
|
"boc3-filing"
|
||||||
|
)
|
||||||
|
_ET = timezone(timedelta(hours=-5)) # EST anchor; close enough for an end-of-day cutoff
|
||||||
|
_COUPON_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ" # no I/O to avoid confusion
|
||||||
|
|
||||||
|
|
||||||
|
def _random_coupon_code() -> str:
|
||||||
|
import secrets
|
||||||
|
return "".join(secrets.choice(_COUPON_ALPHABET) for _ in range(5))
|
||||||
|
|
||||||
|
|
||||||
|
def get_or_create_daily_coupon(conn, send_date: date) -> str:
|
||||||
|
"""Return the 5-letter coupon code for `send_date`, creating it if needed.
|
||||||
|
|
||||||
|
Idempotent: a marker in `description` (campaign-daily:<date>) lets a re-run
|
||||||
|
on the same day reuse the existing code instead of minting a duplicate.
|
||||||
|
"""
|
||||||
|
marker = f"campaign-daily:{send_date.isoformat()}"
|
||||||
|
cur = conn.cursor()
|
||||||
|
cur.execute("SELECT code FROM discount_codes WHERE description = %s LIMIT 1", (marker,))
|
||||||
|
row = cur.fetchone()
|
||||||
|
if row:
|
||||||
|
return row[0]
|
||||||
|
|
||||||
|
# 23:59:59 ET of the send date
|
||||||
|
expires = datetime.combine(send_date, datetime.min.time(), tzinfo=_ET) + timedelta(
|
||||||
|
hours=23, minutes=59, seconds=59
|
||||||
|
)
|
||||||
|
starts = datetime.combine(send_date, datetime.min.time(), tzinfo=_ET)
|
||||||
|
|
||||||
|
# Retry on the (rare) code collision against the UNIQUE constraint.
|
||||||
|
for _ in range(25):
|
||||||
|
code = _random_coupon_code()
|
||||||
|
try:
|
||||||
|
cur.execute(
|
||||||
|
"""
|
||||||
|
INSERT INTO discount_codes
|
||||||
|
(code, description, discount_type, discount_value, applies_to,
|
||||||
|
max_uses_per_email, active, starts_at, expires_at)
|
||||||
|
VALUES (%s, %s, 'percent', %s, %s, 1, TRUE, %s, %s)
|
||||||
|
ON CONFLICT (code) DO NOTHING
|
||||||
|
RETURNING code
|
||||||
|
""",
|
||||||
|
(code, marker, COUPON_PCT, COUPON_SLUGS, starts, expires),
|
||||||
|
)
|
||||||
|
r = cur.fetchone()
|
||||||
|
if r:
|
||||||
|
conn.commit()
|
||||||
|
LOG.info("[coupon] daily code %s (%d%% off, expires %s ET)",
|
||||||
|
code, COUPON_PCT, expires.isoformat())
|
||||||
|
return r[0]
|
||||||
|
except Exception:
|
||||||
|
conn.rollback()
|
||||||
|
raise RuntimeError("could not mint a unique daily coupon code")
|
||||||
|
|
||||||
|
|
||||||
|
def coupon_attribs(coupon_code: str | None) -> dict:
|
||||||
|
"""Merge fields for the same-day deal, blank when no coupon is active."""
|
||||||
|
if not coupon_code:
|
||||||
|
return {"coupon_code": "", "coupon_pct": "", "coupon_expires": ""}
|
||||||
|
return {
|
||||||
|
"coupon_code": coupon_code,
|
||||||
|
"coupon_pct": str(COUPON_PCT),
|
||||||
|
# Human-readable cutoff for the email body.
|
||||||
|
"coupon_expires": "11:59 PM ET tonight",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def lp_link_with_coupon(campaign_type: str, phy_state: str | None,
|
||||||
|
coupon_code: str | None) -> str:
|
||||||
|
"""build_lp_link + a ?code= query param so the LP pre-applies the deal."""
|
||||||
|
url = build_lp_link(campaign_type, phy_state)
|
||||||
|
if coupon_code:
|
||||||
|
sep = "&" if "?" in url else "?"
|
||||||
|
url = f"{url}{sep}code={coupon_code}"
|
||||||
|
return url
|
||||||
|
|
||||||
# ── TZ config: tz_key -> (states, send_hour_utc) ─────────────────────────────
|
# ── TZ config: tz_key -> (states, send_hour_utc) ─────────────────────────────
|
||||||
# 4AM EST = 09:00 UTC, each TZ +1hr so they get it at ~4AM local
|
# 4AM EST = 09:00 UTC, each TZ +1hr so they get it at ~4AM local
|
||||||
TIMEZONE_CONFIG = {
|
TIMEZONE_CONFIG = {
|
||||||
|
|
@ -653,6 +758,15 @@ def run(send_date: date, dry_run: bool = False, preview: bool = False,
|
||||||
warmup_cap: bool = True) -> None:
|
warmup_cap: bool = True) -> None:
|
||||||
conn = psycopg2.connect(DB_URL)
|
conn = psycopg2.connect(DB_URL)
|
||||||
|
|
||||||
|
# Mint (or reuse) the same-day coupon for this send date so every campaign
|
||||||
|
# in the run shares one expiring code. Preview/dry runs skip the write.
|
||||||
|
daily_coupon = None
|
||||||
|
if not dry_run and not preview:
|
||||||
|
try:
|
||||||
|
daily_coupon = get_or_create_daily_coupon(conn, send_date)
|
||||||
|
except Exception as exc: # noqa: BLE001
|
||||||
|
LOG.warning("[coupon] could not mint daily coupon: %s (sending without)", exc)
|
||||||
|
|
||||||
base_mcs150 = get_base_campaign(CAMPAIGN_MCS150_ID)
|
base_mcs150 = get_base_campaign(CAMPAIGN_MCS150_ID)
|
||||||
base_inactive = get_base_campaign(CAMPAIGN_INACTIVE_ID)
|
base_inactive = get_base_campaign(CAMPAIGN_INACTIVE_ID)
|
||||||
|
|
||||||
|
|
@ -788,7 +902,8 @@ def run(send_date: date, dry_run: bool = False, preview: bool = False,
|
||||||
"email": TEST_EMAIL,
|
"email": TEST_EMAIL,
|
||||||
"name": r0[2] or "Sample Carrier",
|
"name": r0[2] or "Sample Carrier",
|
||||||
"attribs": {"dot_number": r0[0], "company": r0[2] or "", "state": r0[3] or "",
|
"attribs": {"dot_number": r0[0], "company": r0[2] or "", "state": r0[3] or "",
|
||||||
"lp_link": build_lp_link(campaign_type, r0[4])},
|
"lp_link": lp_link_with_coupon(campaign_type, r0[4], daily_coupon),
|
||||||
|
**coupon_attribs(daily_coupon)},
|
||||||
}]
|
}]
|
||||||
else:
|
else:
|
||||||
subscribers = [
|
subscribers = [
|
||||||
|
|
@ -796,7 +911,8 @@ def run(send_date: date, dry_run: bool = False, preview: bool = False,
|
||||||
"email": row[1],
|
"email": row[1],
|
||||||
"name": row[2] or row[1],
|
"name": row[2] or row[1],
|
||||||
"attribs": {"dot_number": row[0], "company": row[2] or "", "state": row[3] or "",
|
"attribs": {"dot_number": row[0], "company": row[2] or "", "state": row[3] or "",
|
||||||
"lp_link": build_lp_link(campaign_type, row[4])},
|
"lp_link": lp_link_with_coupon(campaign_type, row[4], daily_coupon),
|
||||||
|
**coupon_attribs(daily_coupon)},
|
||||||
}
|
}
|
||||||
for row in rows
|
for row in rows
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -5,17 +5,29 @@ export interface Props {
|
||||||
priceCents?: number;
|
priceCents?: number;
|
||||||
govFeeLabel?: string;
|
govFeeLabel?: string;
|
||||||
note?: string;
|
note?: string;
|
||||||
|
serviceSlug?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { priceCents, govFeeLabel, note } = Astro.props;
|
const { priceCents, govFeeLabel, note, serviceSlug } = Astro.props;
|
||||||
const hasPrice = typeof priceCents === "number";
|
const hasPrice = typeof priceCents === "number";
|
||||||
|
const API = import.meta.env.PUBLIC_API_URL || "";
|
||||||
---
|
---
|
||||||
|
|
||||||
{hasPrice && (
|
{hasPrice && (
|
||||||
<aside class="pw-price-banner" aria-label="Service price">
|
<aside
|
||||||
|
class="pw-price-banner"
|
||||||
|
aria-label="Service price"
|
||||||
|
data-price-cents={priceCents}
|
||||||
|
data-service-slug={serviceSlug || ""}
|
||||||
|
data-api={API}
|
||||||
|
>
|
||||||
<div>
|
<div>
|
||||||
<p class="pw-price-label">Service fee</p>
|
<p class="pw-price-label">Service fee</p>
|
||||||
<p class="pw-price-value">{formatUSD(priceCents!)}</p>
|
<p class="pw-price-value">
|
||||||
|
<span class="pw-price-anchor" hidden></span>
|
||||||
|
<span class="pw-price-now">{formatUSD(priceCents!)}</span>
|
||||||
|
</p>
|
||||||
|
<p class="pw-price-deal" hidden></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="pw-price-copy">
|
<div class="pw-price-copy">
|
||||||
{govFeeLabel ? (
|
{govFeeLabel ? (
|
||||||
|
|
@ -28,6 +40,46 @@ const hasPrice = typeof priceCents === "number";
|
||||||
</aside>
|
</aside>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// Same-day campaign coupon: if the visitor arrived via ?code=XXXXX, validate
|
||||||
|
// it and surface the deal (struck-through anchor + discounted price + expiry).
|
||||||
|
// The discount applies to the service fee only; pass-through fees are unaffected.
|
||||||
|
(async () => {
|
||||||
|
const banner = document.querySelector<HTMLElement>(".pw-price-banner");
|
||||||
|
if (!banner) return;
|
||||||
|
const code = (new URLSearchParams(location.search).get("code") || "").toUpperCase().trim();
|
||||||
|
if (!code) return;
|
||||||
|
|
||||||
|
const priceCents = parseInt(banner.dataset.priceCents || "0", 10);
|
||||||
|
const slug = banner.dataset.serviceSlug || "";
|
||||||
|
const api = banner.dataset.api || "";
|
||||||
|
if (!priceCents) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const url = `${api}/api/v1/discount/${encodeURIComponent(code)}`
|
||||||
|
+ `?amount=${priceCents}${slug ? `&service=${encodeURIComponent(slug)}` : ""}`;
|
||||||
|
const r = await fetch(url);
|
||||||
|
if (!r.ok) return;
|
||||||
|
const d = await r.json();
|
||||||
|
if (!d || !d.valid || !d.discount_cents) return;
|
||||||
|
|
||||||
|
const now = priceCents - d.discount_cents;
|
||||||
|
const fmt = (c: number) => `$${(c / 100).toFixed(c % 100 === 0 ? 0 : 2)}`;
|
||||||
|
|
||||||
|
const anchor = banner.querySelector<HTMLElement>(".pw-price-anchor");
|
||||||
|
const nowEl = banner.querySelector<HTMLElement>(".pw-price-now");
|
||||||
|
const deal = banner.querySelector<HTMLElement>(".pw-price-deal");
|
||||||
|
if (anchor) { anchor.textContent = fmt(priceCents); anchor.hidden = false; }
|
||||||
|
if (nowEl) nowEl.textContent = fmt(now);
|
||||||
|
if (deal) {
|
||||||
|
const pct = d.discount_type === "percent" ? `${d.discount_value}% off` : `${fmt(d.discount_cents)} off`;
|
||||||
|
deal.innerHTML = `<strong>${pct}</strong> with code <strong>${code}</strong> · expires 11:59 PM ET tonight`;
|
||||||
|
deal.hidden = false;
|
||||||
|
}
|
||||||
|
} catch { /* no-op: fall back to full price */ }
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.pw-price-banner {
|
.pw-price-banner {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
@ -56,6 +108,19 @@ const hasPrice = typeof priceCents === "number";
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
font-weight: 900;
|
font-weight: 900;
|
||||||
}
|
}
|
||||||
|
.pw-price-anchor {
|
||||||
|
color: #9ca3af;
|
||||||
|
font-weight: 700;
|
||||||
|
text-decoration: line-through;
|
||||||
|
font-size: 0.55em;
|
||||||
|
margin-right: 0.4em;
|
||||||
|
}
|
||||||
|
.pw-price-deal {
|
||||||
|
margin: 0.45rem 0 0;
|
||||||
|
color: #b91c1c;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
.pw-price-copy {
|
.pw-price-copy {
|
||||||
max-width: 30rem;
|
max-width: 30rem;
|
||||||
color: #475569;
|
color: #475569;
|
||||||
|
|
|
||||||
|
|
@ -639,6 +639,10 @@ const STEP_LABELS: Record<string, string> = {
|
||||||
customer_name: name,
|
customer_name: name,
|
||||||
customer_phone: d.phone || "",
|
customer_phone: d.phone || "",
|
||||||
intake_data: state.intake_data,
|
intake_data: state.intake_data,
|
||||||
|
// Same-day promo code from the campaign email link (?code=XXXXX).
|
||||||
|
// The server validates it (expiry + scope) and discounts the
|
||||||
|
// service fee only -- government/pass-through fees are never reduced.
|
||||||
|
discount_code: (new URLSearchParams(window.location.search).get("code") || "").toUpperCase().trim() || undefined,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
if (!createResp.ok) {
|
if (!createResp.ok) {
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ export const SERVICE_META: Record<string, ServiceMeta> = {
|
||||||
"ky-kyu-registration": { name: "KY Weight-Distance Tax Setup", price_cents: 10900, gov_fee_label: "KYU weight-distance account fees (state, billed at cost)" },
|
"ky-kyu-registration": { name: "KY Weight-Distance Tax Setup", price_cents: 10900, gov_fee_label: "KYU weight-distance account fees (state, billed at cost)" },
|
||||||
"llc-formation": { name: "LLC Formation", price_cents: 19900 },
|
"llc-formation": { name: "LLC Formation", price_cents: 19900 },
|
||||||
"mc-authority": { name: "MC Operating Authority Application", price_cents: 19900, gov_fee_label: "FMCSA operating authority application fee" },
|
"mc-authority": { name: "MC Operating Authority Application", price_cents: 19900, gov_fee_label: "FMCSA operating authority application fee" },
|
||||||
"mcs150-update": { name: "MCS-150 Biennial Update", price_cents: 3900 },
|
"mcs150-update": { name: "MCS-150 Biennial Update", price_cents: 7900 },
|
||||||
"medicare-enrollment": { name: "Medicare Enrollment (PECOS)", price_cents: 69900 },
|
"medicare-enrollment": { name: "Medicare Enrollment (PECOS)", price_cents: 69900 },
|
||||||
"name-reservation-nv": { name: "Nevada Name Reservation (90 days)", price_cents: 7900, gov_fee_label: "Nevada SOS name reservation fee" },
|
"name-reservation-nv": { name: "Nevada Name Reservation (90 days)", price_cents: 7900, gov_fee_label: "Nevada SOS name reservation fee" },
|
||||||
"name-reservation-tx": { name: "Texas Name Reservation (Form 501, 120 days)", price_cents: 7900, gov_fee_label: "Texas SOS name reservation fee (Form 501)" },
|
"name-reservation-tx": { name: "Texas Name Reservation (Form 501, 120 days)", price_cents: 7900, gov_fee_label: "Texas SOS name reservation fee (Form 501)" },
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Designate a process agent in all 48 states plus DC.";
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TaxDeductibilityNotice />
|
<TaxDeductibilityNotice />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "California Motor Carrier Permit (MCP) plus CARB Clean Truck
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TruckingValueNotice slug={slug} />
|
<TruckingValueNotice slug={slug} />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Connecticut Highway Use Fee registration for heavy multi-un
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TruckingValueNotice slug={slug} />
|
<TruckingValueNotice slug={slug} />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Prepare for your 18-month FMCSA safety audit.";
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TaxDeductibilityNotice />
|
<TaxDeductibilityNotice />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Consortium enrollment, written policy, and DER designation.
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TaxDeductibilityNotice />
|
<TaxDeductibilityNotice />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "MCS-150 + BOC-3 + UCR + Drug & Alcohol + Audit Prep.";
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TaxDeductibilityNotice />
|
<TaxDeductibilityNotice />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Register a new USDOT number with FMCSA.";
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TaxDeductibilityNotice />
|
<TaxDeductibilityNotice />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "PHMSA hazardous-materials registration for carriers transpo
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TruckingValueNotice slug={slug} />
|
<TruckingValueNotice slug={slug} />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "International Fuel Tax Agreement (IFTA) license and decals
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TruckingValueNotice slug={slug} />
|
<TruckingValueNotice slug={slug} />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Quarterly IFTA fuel-tax return preparation and filing throu
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TruckingValueNotice slug={slug} />
|
<TruckingValueNotice slug={slug} />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Intrastate operating authority application for carriers hau
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TaxDeductibilityNotice />
|
<TaxDeductibilityNotice />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Apportioned (IRP) registration for interstate carriers —
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TruckingValueNotice slug={slug} />
|
<TruckingValueNotice slug={slug} />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Kentucky KYU weight-distance tax license for carriers opera
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TruckingValueNotice slug={slug} />
|
<TruckingValueNotice slug={slug} />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Apply for common or contract carrier operating authority.";
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TaxDeductibilityNotice />
|
<TaxDeductibilityNotice />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "FMCSA biennial update of company profile, fleet size, and m
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TruckingValueNotice slug={slug} />
|
<TruckingValueNotice slug={slug} />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "New Mexico Weight-Distance Tax permit and account setup.";
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TruckingValueNotice slug={slug} />
|
<TruckingValueNotice slug={slug} />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "New York Highway Use Tax (HUT) registration and decal for c
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TruckingValueNotice slug={slug} />
|
<TruckingValueNotice slug={slug} />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Oregon Weight-Mile Tax enrollment and account setup for car
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TruckingValueNotice slug={slug} />
|
<TruckingValueNotice slug={slug} />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Oversize / Overweight (OS/OW) trip permit acquisition for n
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TaxDeductibilityNotice />
|
<TaxDeductibilityNotice />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Intrastate (state) DOT number registration for carriers ope
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TaxDeductibilityNotice />
|
<TaxDeductibilityNotice />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "State clean-truck / emissions compliance (NY, CO, MD, NJ, M
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TruckingValueNotice slug={slug} />
|
<TruckingValueNotice slug={slug} />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "State Compliance Bundle — IRP, IFTA, state weight-distanc
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TaxDeductibilityNotice />
|
<TaxDeductibilityNotice />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Unified Carrier Registration for interstate carriers.";
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TruckingValueNotice slug={slug} />
|
<TruckingValueNotice slug={slug} />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["entity", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ const description = "Reactivate an inactive or revoked USDOT number and bring yo
|
||||||
|
|
||||||
<VerticalOrderHeader vertical="trucking" />
|
<VerticalOrderHeader vertical="trucking" />
|
||||||
|
|
||||||
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} note="Choose card, ACH, or PayPal at payment." />
|
<OrderPriceBanner priceCents={meta?.price_cents} govFeeLabel={meta?.gov_fee_label} serviceSlug={slug} note="Choose card, ACH, or PayPal at payment." />
|
||||||
<TruckingValueNotice slug={slug} />
|
<TruckingValueNotice slug={slug} />
|
||||||
|
|
||||||
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
<Wizard service_slug={slug} steps={steps ?? ["state-trucking", "review", "payment"]} title={meta?.name ?? slug} />
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue