examples/lets-talk.json mirrors the form schema returned by
https://www.topcoder.com/__api/forms/XpPgFzW8lmX8frlStzzg0 on 2026-09-28.
It preserves the six visible fields, their order and required flags, interest
labels, hidden attribution fields, and the HubSpot success message.
The stable Forms API key is lets_talk and the title is “Let’s talk” for reporting discovery. No historical HubSpot submissions are imported.
Option values are normalized to API-safe keys:
| HubSpot value | Forms API key |
|---|---|
Crowdsourcing |
crowdsourcing |
App Design & Development |
app_design_development |
Freelancers |
freelancers |
Landing Page (hidden lead source) |
landing_page |
The website supplies the existing hidden campaign defaults, including
source__c=/lets-talk; empty UTM fields remain empty. These are validated answers,
not trusted identity. sourcePage is the current pathname. The site submits
kafka: true so each accepted attempt publishes form.submitted through the
existing Bus API integration. Consumers must deduplicate by submissionId.
-
Deploy this API revision and the existing
SubmissionEventmigration. Configure outboundBUSAPI_URL,AUTH0_URL,AUTH0_AUDIENCE,AUTH0_CLIENT_ID,AUTH0_CLIENT_SECRET, andKAFKA_ERROR_TOPICas described in operations.md. -
Ensure
CORS_ORIGINS/ CloudFormationCorsOriginsincludes the exact website and reports origins (https://www.topcoder-dev.com,https://reports.topcoder-dev.com,https://platform-ui.topcoder-dev.comfor the combined portal). Existing stacks retain parameter values: update the parameter explicitly; changing the template default alone does not update a deployed stack. -
Publish the reviewed definition from this repository root, supplying an existing administrator bearer token or M2M token with
manage:formsthrough the environment:nvm use pnpm exec tsx scripts/publish-lets-talk.tsFORMS_ADMIN_TOKENmust be set without putting it in source control. The script defaults to the development API. SetFORMS_API_BASE_URL=https://api.topcoder.com/v6for production. It creates no submissions and fails on differing immutable content. Re-running an identical version is safe; subsequent schema changes require a reviewed next version. -
Deploy the companion
topcoder-websitedevelop change and theplatform-uidev change. No CMS content mutation is required: the website selects the known form component on the matching dev or production/lets-talkroute. Other routes continue using their existing forms. -
Verify the public schema, then submit an explicitly marked development test with Kafka configured. Confirm the receipt, event, table row, date filtering, and CSV. A Bus API outage returns 503 after saving; retry unchanged inputs to finish delivery.
The React integration accepts kafka (false by default) and hiddenAnswers
(empty by default). Hidden answers are merged into the API payload and omitted
from visible controls. They must match stored field types and validation rules.
The website maintains its analytics adapter around the same rendering contract.
- Release the API migration
20261013010000_lets_talk_processor_key. It corrects the initial flow'slets-talkkey tolets_talkwithout changing its enabled state or settings, and reroutes retained submissions missing a delivery receipt. The existing migration remains unchanged. Existing successful receipts are preserved. - Publish the reviewed version using the command above with
FORMS_API_BASE_URL=https://api.topcoder.com/v6and a production admin token. - Deploy forms-processor-v6 through its master pipeline. Set SecureStrings
/config/forms-processor-v6/appvar/LETS_TALK_RECIPIENTS(comma-separated emails) and/config/forms-processor-v6/appvar/LETS_TALK_SENDGRID_TEMPLATE_ID(dynamic template ID). Redeploy to load changed parameters, then enable the database flow after reviewing any queued submissions. See the processor rollout guide. - Release the website production selection. Confirm the public schema and exact
https://www.topcoder.comCORS origin before switching the live page. - Submit an identified test with
kafka: true, correlate its submission ID throughform.submittedandexternal.action.email, and verify the received email. ProcessordeliveredAtmeans Bus API acceptance; verify provider/inbox delivery separately. No historical HubSpot data is imported.