packages/twenty-apps/internal/twenty-partners/README.md
A Twenty app that turns the CRM into the operating system for the Twenty partner program: intake partner-eligible deals, match them to vetted marketplace partners, and track the matching pipeline end-to-end.
Built on Twenty with twenty-sdk v2.5.
Partner — slug, status, availability, served geos, languages spoken,
deployment expertise, Calendly link, last-match timestamp. See src/objects/partner.object.ts.matchStatus, designDocStatus,
introSentAt, lastRelanceSentAt, tftId, plus a partner relation.on-opportunity-auto-match — fires when matchStatus is set to AUTO_MATCH. Assigns the longest-idle available partner and flips status to MATCHED. If no partner is available, hands off to MANUAL_MATCH with an audit Note explaining why.list-available-partners — surfaces matchable partners for a given opportunity.post-install — first-run setup.src/roles/)
src/views/)
Waiting for match — opportunities awaiting human action (matchStatus is TO_BE_MATCHED or MANUAL_MATCH).Matches overview — full matching funnel grouped by matchStatus (configure Kanban
grouping manually in the UI).Opportunities — replacement of the native opportunities view with the partner columns.Partners and All matched deals — partner-side index and deal log.Waiting for match, All partner deals,
Matches overview, Partners, Opportunities.src/scripts/) — populate a fresh workspace with realistic demo data.matchStatus is a non-nullable SELECT field with a default of TO_BE_MATCHED. The 10 states follow the deal lifecycle:
| Status | Meaning |
|---|---|
TO_BE_MATCHED | Default — deal entered, awaiting assignment |
MANUAL_MATCH | Needs a human to pick a partner |
AUTO_MATCH | Triggers automatic partner assignment |
MATCHED | Partner assigned |
INTRODUCED_TO_A_PARTNER | Customer intro sent |
WORKING_WITH_A_PARTNER | Engagement underway |
IMPLEMENTING | Active implementation |
WON | Deal closed won |
RECONNECT_LATER | Paused — reconnect in future |
LOST | Deal closed lost |
Requires a local Twenty server at http://localhost:2020 and Node ^24.5.
yarn install
yarn twenty dev
Default dev credentials: [email protected] / [email protected].
Run yarn twenty help for the full CLI reference.
| Command | What it does |
|---|---|
yarn twenty dev | Start the dev server and sync the app on file changes |
yarn twenty server status | Check the local Twenty server |
yarn lint / yarn lint:fix | Run oxlint |
yarn test | Run integration tests (vitest.config.ts) |
Two idempotent seed scripts. Both run via the vitest.seed.config.ts config that skips
the global app uninstall/reinstall.
# 1. Marketplace partners (run first — pipeline seed wires opportunities to these by slug)
yarn vitest run --config vitest.seed.config.ts src/scripts/seed-marketplace-partners.ts
# 2. Pipeline demo: 3 companies, 3 people, 15 opportunities spread across matchStatus values
yarn vitest run --config vitest.seed.config.ts src/scripts/seed-pipeline-demo.ts
Both scripts skip records that already exist (by slug, name, or firstName+lastName),
so they are safe to re-run.
Current SDK gaps blocking further polish:
ViewType.KANBAN is currently ignored).