tally-intake-normalizer

Convert Tally form submissions into canonical broker intake data without fabricating missing values.

1|Updated Mar 4, 2026
One-click install
npx skills add https://github.com/JFeimster/moonshine-capital-portal --skill tally-intake-normalizer-jfeimster
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: tally-intake-normalizer
Source: https://github.com/JFeimster/moonshine-capital-portal/tree/main/skills/tally-intake-normalizer
Command: npx skills add https://github.com/JFeimster/moonshine-capital-portal --skill tally-intake-normalizer-jfeimster

SYSTEM DOCUMENTATION & REQUIREMENTS

What problem does it solve? Raw Tally webhook payloads use opaque question UUIDs and choice IDs that must be decoded into a canonical broker profile schema, and naive mapping risks inventing values, corrupting identity fields, or violating lifecycle rules for funding agent onboarding. ## Core Features & Use Cases - UUID and Choice-ID Decoding: Resolve Tally FORM_RESPONSE payloads against the live form mappings in lib/tally-webhook.ts for Join (rjM6do) and Profile Builder (9qjWEE) forms. - Conservative Field Mapping: Normalize email, URLs, arrays, and state codes with shared helpers while omitting missing fields instead of guessing names, agencies, locations, or URLs. - Lifecycle Enforcement: Create new funding agent identities only as needs_review plus draft, restrict Profile enrichment to existing records, and protect partnerId, referralCode, slug, and approval state from public overwrites. - Use Case: A Tally Join webhook arrives with raw question UUIDs; use this Skill to decode the payload, generate deterministic partner identity, persist provenance metadata, and return structured validation errors for any unmapped fields. ## Quick Start Use the tally-intake-normalizer skill to map this Tally FORM_RESPONSE payload into the canonical BrokerProfile onboarding schema while preserving missing values and lifecycle safeguards.

Frequently Asked Questions about tally-intake-normalizer

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I map Tally webhook payloads to a canonical schema?▼

Parse the FORM_RESPONSE event, resolve question UUIDs and choice IDs against the live mapping in lib/tally-webhook.ts, then apply shared normalizers for email, URL, array, and state fields. Never infer mappings from question labels when an executable UUID mapping exists.

How to normalize Tally form data without inventing missing values?▼

Omit missing fields entirely or use the schema's empty collection representation only when the target contract requires an array. Treat blank strings, null, undefined, and empty arrays as absent, and never manufacture names, agencies, locations, URLs, or consent values.

What is the difference between Tally Join and Profile Builder submissions?▼

Join submissions (form rjM6do) create a new canonical funding agent identity with needs_review and draft status. Profile Builder submissions (form 9qjWEE) are update-only and must match an existing partner record without altering lifecycle state or identity fields.

Can Tally Profile enrichment overwrite an existing partner ID or slug?▼

No. Profile enrichment must preserve partnerId, referralCode, persisted slug, and initial submission time. It is allowed only for records in needs_review plus draft state and cannot approve, publish, suspend, reject, or archive a partner.

What happens when a Tally submission has an unknown form or question ID?▼

Unknown form IDs stop processing with an explicit report rather than inferred mappings. Unmapped question or choice IDs produce a structured validation error or are ignored according to the existing parser contract, never silently coerced into plausible values.