From 92059a96d3e7403d75d3a6b5da5fd4d8c8a7eca0 Mon Sep 17 00:00:00 2001 From: slickstef11 Date: Tue, 6 Oct 2026 20:54:34 -0400 Subject: [PATCH 1/3] feat(console): capture monthly inference spend --- packages/console/app/src/i18n/en.ts | 9 ++++++++ .../console/app/src/lib/inference-spend.ts | 9 ++++++++ packages/console/app/src/lib/salesforce.ts | 6 ++++- .../console/app/src/routes/api/enterprise.ts | 9 ++++++++ .../app/src/routes/enterprise/index.css | 1 + .../app/src/routes/enterprise/index.tsx | 23 +++++++++++++++++-- 6 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 packages/console/app/src/lib/inference-spend.ts diff --git a/packages/console/app/src/i18n/en.ts b/packages/console/app/src/i18n/en.ts index 674fc67d7ca2..71e05da48c62 100644 --- a/packages/console/app/src/i18n/en.ts +++ b/packages/console/app/src/i18n/en.ts @@ -817,6 +817,14 @@ export const dict = { "enterprise.form.email.placeholder": "jeff@amazon.com", "enterprise.form.phone.label": "Phone number", "enterprise.form.phone.placeholder": "+1 234 567 8900", + "enterprise.form.inferenceSpend.label": "What is your current monthly inference spend (USD)?", + "enterprise.form.inferenceSpend.placeholder": "Select a range (optional)", + "enterprise.form.inferenceSpend.none": "Not spending yet", + "enterprise.form.inferenceSpend.under1k": "Under $1K", + "enterprise.form.inferenceSpend.1kTo10k": "$1K–$10K", + "enterprise.form.inferenceSpend.10kTo50k": "$10K–$50K", + "enterprise.form.inferenceSpend.50kTo100k": "$50K–$100K", + "enterprise.form.inferenceSpend.over100k": "$100K or more", "enterprise.form.message.label": "What problem are you trying to solve?", "enterprise.form.message.placeholder": "We need help with...", "enterprise.form.send": "Send", @@ -825,6 +833,7 @@ export const dict = { "enterprise.form.success.submitted": "Form submitted successfully.", "enterprise.form.error.allFieldsRequired": "All fields are required.", "enterprise.form.error.invalidEmailFormat": "Invalid email format.", + "enterprise.form.error.invalidInferenceSpend": "Select a valid inference spend range.", "enterprise.form.error.internalServer": "Internal server error.", "enterprise.faq.title": "FAQ", "enterprise.faq.q1": "What is OpenCode Enterprise?", diff --git a/packages/console/app/src/lib/inference-spend.ts b/packages/console/app/src/lib/inference-spend.ts new file mode 100644 index 000000000000..1c3b1c2392ee --- /dev/null +++ b/packages/console/app/src/lib/inference-spend.ts @@ -0,0 +1,9 @@ +// salesforceValue must match the restricted Lead picklist, independent of translated UI labels. +export const inferenceSpendOptions = [ + { value: "none", salesforceValue: "Not spending yet", key: "enterprise.form.inferenceSpend.none" }, + { value: "under-1k", salesforceValue: "Under $1K", key: "enterprise.form.inferenceSpend.under1k" }, + { value: "1k-10k", salesforceValue: "$1K–$10K", key: "enterprise.form.inferenceSpend.1kTo10k" }, + { value: "10k-50k", salesforceValue: "$10K–$50K", key: "enterprise.form.inferenceSpend.10kTo50k" }, + { value: "50k-100k", salesforceValue: "$50K–$100K", key: "enterprise.form.inferenceSpend.50kTo100k" }, + { value: "over-100k", salesforceValue: "$100K or more", key: "enterprise.form.inferenceSpend.over100k" }, +] as const diff --git a/packages/console/app/src/lib/salesforce.ts b/packages/console/app/src/lib/salesforce.ts index 48e0caee7d06..1ab19ef39ae7 100644 --- a/packages/console/app/src/lib/salesforce.ts +++ b/packages/console/app/src/lib/salesforce.ts @@ -44,6 +44,7 @@ export interface SalesforceLeadInput { company?: string email: string phone?: string + inferenceSpend?: string message: string } @@ -63,7 +64,10 @@ export async function createLead(input: SalesforceLeadInput): Promise { Email: input.email, Phone: input.phone ?? null, Title: input.role, - Description: input.message, + Description: input.inferenceSpend + ? `Current monthly inference spend: ${input.inferenceSpend}\n\n${input.message}` + : input.message, + Current_Monthly_Inference_Spend__c: input.inferenceSpend, LeadSource: "Website", }), }).catch((err) => { diff --git a/packages/console/app/src/routes/api/enterprise.ts b/packages/console/app/src/routes/api/enterprise.ts index 65f5c72b2311..6d7ac7a359a0 100644 --- a/packages/console/app/src/routes/api/enterprise.ts +++ b/packages/console/app/src/routes/api/enterprise.ts @@ -4,6 +4,7 @@ import { Resource } from "@opencode-ai/console-resource" import { i18n } from "~/i18n" import { localeFromRequest } from "~/lib/language" import { createLead } from "~/lib/salesforce" +import { inferenceSpendOptions } from "~/lib/inference-spend" interface EnterpriseFormData { name: string @@ -11,6 +12,7 @@ interface EnterpriseFormData { company?: string email: string phone?: string + inferenceSpend?: string alias?: string message: string } @@ -77,8 +79,14 @@ export async function POST(event: APIEvent) { return Response.json({ error: dict["enterprise.form.error.invalidEmailFormat"] }, { status: 400 }) } + const inferenceSpend = inferenceSpendOptions.find((option) => option.value === body.inferenceSpend) + if (body.inferenceSpend && !inferenceSpend) { + return Response.json({ error: dict["enterprise.form.error.invalidInferenceSpend"] }, { status: 400 }) + } + const emailContent = ` ${body.message}

+${inferenceSpend ? `Current monthly inference spend: ${inferenceSpend.salesforceValue}

` : ""} --
${body.name}
${body.role}
@@ -92,6 +100,7 @@ ${body.phone ? `${body.phone}
` : ""}`.trim() company: body.company, email: body.email, phone: body.phone, + inferenceSpend: inferenceSpend?.salesforceValue, message: body.message, }).catch((err) => { console.error("Failed to create Salesforce lead:", err) diff --git a/packages/console/app/src/routes/enterprise/index.css b/packages/console/app/src/routes/enterprise/index.css index 5c594bb51b01..d674f67bf527 100644 --- a/packages/console/app/src/routes/enterprise/index.css +++ b/packages/console/app/src/routes/enterprise/index.css @@ -396,6 +396,7 @@ } input, + select, textarea { width: 100%; padding: 0.75rem; diff --git a/packages/console/app/src/routes/enterprise/index.tsx b/packages/console/app/src/routes/enterprise/index.tsx index 216fb470fffd..f919fafa1c76 100644 --- a/packages/console/app/src/routes/enterprise/index.tsx +++ b/packages/console/app/src/routes/enterprise/index.tsx @@ -1,12 +1,13 @@ import "./index.css" import { Title, Meta } from "@solidjs/meta" -import { createSignal, Show } from "solid-js" +import { createSignal, For, Show } from "solid-js" import { Header } from "~/component/header" import { Footer } from "~/component/footer" import { Legal } from "~/component/legal" import { Faq } from "~/component/faq" import { useI18n } from "~/context/i18n" import { LocaleLinks } from "~/component/locale-links" +import { inferenceSpendOptions } from "~/lib/inference-spend" export default function Enterprise() { const i18n = useI18n() @@ -16,6 +17,7 @@ export default function Enterprise() { company: "", email: "", phone: "", + inferenceSpend: "", alias: "", message: "", }) @@ -24,7 +26,7 @@ export default function Enterprise() { const [error, setError] = createSignal("") const handleInputChange = (field: string) => (e: Event) => { - const target = e.target as HTMLInputElement | HTMLTextAreaElement + const target = e.target as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement setFormData((prev) => ({ ...prev, [field]: target.value })) } @@ -51,6 +53,7 @@ export default function Enterprise() { company: "", email: "", phone: "", + inferenceSpend: "", alias: "", message: "", }) @@ -232,6 +235,22 @@ export default function Enterprise() { /> +
+ + +
+