diff --git a/site/public/tools/corporation-check/index.html b/site/public/tools/corporation-check/index.html index ac58984..c1e44a6 100644 --- a/site/public/tools/corporation-check/index.html +++ b/site/public/tools/corporation-check/index.html @@ -21,7 +21,7 @@ window.__PW_API = (function() { - +
@@ -127,6 +127,20 @@ function usd(cents) { return "$" + (cents / 100).toLocaleString("en-US", {minimu btn.addEventListener("click", doCheck); nameInput.addEventListener("keydown", function(e) { if (e.key === "Enter") doCheck(); }); +// Deep-link support: an email/campaign link like ?name=ACME%20LLC&state=CT +// prefills the search and runs it automatically, so the recipient lands directly +// on their own result. +(function prefillFromUrl() { + try { + var params = new URLSearchParams(location.search); + var qName = params.get("name"); + var qState = (params.get("state") || "").toUpperCase(); + if (qName) nameInput.value = qName; + if (qState && stateNames[qState]) stateSelect.value = qState; + if (qName && qState) setTimeout(doCheck, 60); + } catch (e) { /* no-op */ } +})(); + function doCheck() { var name = nameInput.value.trim(); var state = stateSelect.value; @@ -222,7 +236,15 @@ function renderResult(data, state) { html += 'Registered agent (1 year)' + usd(data.ra_price_cents) + ''; html += 'Total' + usd(data.total_with_ra_cents) + ''; html += ''; - html += 'Get Back in Good Standing →'; + // Route to the matching self-serve order flow, seeding the entity name + + // state so the intake starts pre-filled. Dissolved -> reinstatement; anything + // else overdue -> annual report filing. + var orderSlug = (status === "DISSOLVED") ? "entity-reinstatement" : "annual-report-filing"; + var orderUrl = "/order/" + orderSlug + + "?legal_name=" + encodeURIComponent(data.entity_name || "") + + "&state=" + encodeURIComponent(state) + + (data.entity_number ? "&entity_number=" + encodeURIComponent(data.entity_number) : ""); + html += 'Get Back in Good Standing →'; html += '

State fees are passthrough at cost. No hidden markup.

'; html += ''; html += ''; diff --git a/site/src/components/intake/Wizard.astro b/site/src/components/intake/Wizard.astro index 855f963..f947aab 100644 --- a/site/src/components/intake/Wizard.astro +++ b/site/src/components/intake/Wizard.astro @@ -396,6 +396,34 @@ const STEP_LABELS: Record = { return; } + // ── Pre-fill from ?legal_name=&state= (corporate renewal CTA links) ── + // The /tools/corporation-check overdue result links to + // /order/annual-report-filing?legal_name=ACME%20LLC&state=CT&entity_number=... + // Seed the entity so the wizard opens pre-populated. Best-effort; only fills + // empties (loadState merge preserves anything the visitor types). + const legalNameParam = (params.get("legal_name") || "").trim(); + const stateParam = (params.get("state") || "").trim().toUpperCase(); + if (legalNameParam && !token && !orderParam) { + try { + const state = loadState(); + if (!state.name) state.name = legalNameParam; + state.intake_data = { + ...state.intake_data, + legal_name: state.intake_data?.legal_name || legalNameParam, + entity_name: state.intake_data?.entity_name || legalNameParam, + address_state: state.intake_data?.address_state || stateParam, + base_state: state.intake_data?.base_state || stateParam, + entity_number: state.intake_data?.entity_number || (params.get("entity_number") || "").trim(), + }; + state.entity = { + ...state.entity, + legal_name: state.entity?.legal_name || legalNameParam, + address_state: state.entity?.address_state || stateParam, + }; + saveState(state); + } catch { /* prefill is best-effort; never block the form */ } + } + if (!token && !orderParam) return; const API = (window as any).__PW_API || "";