## Summary - Renames the `FieldMetadataType` enum key from `RICH_TEXT_V2` to `RICH_TEXT` across the entire codebase, while keeping the underlying string value as `'RICH_TEXT_V2'` to maintain PostgreSQL database compatibility - Renames all related types, guards, hooks, components, and files from `*RichTextV2*` / `*rich-text-v2*` to `*RichText*` / `*rich-text*` (e.g. `FormRichTextV2FieldInput` → `FormRichTextFieldInput`, `isFieldRichTextV2` → `isFieldRichText`) - Updates generated files (GraphQL schema, SDK types) to use the new key while preserving the `RICH_TEXT_V2` string value for DB/API layer - Updates i18n locale files, test snapshots, and integration tests to reflect the rename ## Context The legacy `RICH_TEXT` (V1) field type was deprecated and migrated to `TEXT` in a previous PR (#18623). With V1 gone, the `RICH_TEXT_V2` naming is no longer necessary — `RICH_TEXT` is now the canonical name. The DB enum value stays `'RICH_TEXT_V2'` to avoid confusion with the just-deprecated V1 type and to prevent a database migration. ## Test plan - [x] `twenty-server` typecheck passes - [x] `twenty-front` typecheck passes (only pre-existing Apollo client errors remain) - [x] `twenty-server` lint passes - [x] `twenty-front` lint passes - [x] `twenty-shared` build passes - [ ] CI passes Made with [Cursor](https://cursor.com)
🧠 AI-Powered Meeting Transcript to CRM Data Integration
Overview
This feature automatically transforms meeting transcripts into structured CRM data using AI. When unstructured meeting notes are received via a webhook, the system processes them and creates organized notes, tasks, and assignments directly in Twenty CRM.
Key Features
-
🤖 AI-Powered Analysis: Extracts summaries, action items, assignees, and due dates from natural language transcripts.
-
🗂 Smart Task Consolidation: Merges related sub-tasks into unified deliverables (e.g.,
"draft"+"review"+"present"→ one consolidated task). -
🧑🤝🧑 Intelligent Assignment: Uses GraphQL member lookup to match extracted assignee names to workspace member IDs with flexible string matching.
-
🔗 Automatic Linking: Links generated notes and tasks to relevant contacts using
noteTargetsandtaskTargets. -
📅 Date Parsing: Converts relative date expressions (e.g., “next Monday”, “end of week”) into ISO-formatted dates for accurate scheduling.
Requirements
- Twenty CLI - Install globally:
npm install -g twenty-cli - Twenty CRM instance with API access
- API key from Settings > API & Webhooks
- OpenAI API key or compatible service (Groq, etc.)
Installation
-
Authenticate with Twenty CLI:
twenty auth login -
Configure environment variables:
Copy
.env.exampleto.envand fill in your credentials:cp .env.example .envRequired environment variables:
AI_PROVIDER_API_KEY: Your OpenAI or Groq API keyTWENTY_API_KEY: Generated from your Twenty CRM instanceTWENTY_API_URL: Your Twenty CRM instance URL (e.g., https://your-instance.twenty.com)WEBHOOK_SECRET_TOKEN: Secret token for webhook authenticationAI_PROVIDER_API_BASE_URL: Base URL for OpenAI-compatible API (defaults to https://api.openai.com/v1)
-
Install dependencies:
yarn install -
Deploy to your Twenty workspace:
twenty app sync
Configuration
Using Groq Instead of OpenAI
To use Groq's API (which is compatible with OpenAI's SDK), set:
AI_PROVIDER_API_BASE_URL=https://api.groq.com/openai/v1
AI_PROVIDER_API_KEY=your-groq-api-key
Using OpenAI
To use OpenAI's official API:
AI_PROVIDER_API_BASE_URL=https://api.openai.com/v1
AI_PROVIDER_API_KEY=your-openai-api-key
🔗 Webhook Setup (inside Twenty)
Navigate to: Twenty → Workspace Settings → APIs & Webhook → + New Webhook
| Field | Value |
|---|---|
| Method | POST |
| URL | your deployed endpoint URL |
| Secret | Generate one & store same in .env |
Usage
Send a POST request to your webhook endpoint with the following payload:
{
"transcript": "During the Project Phoenix Kick-off on November 1st, 2025...",
"meetingTitle": "Project Phoenix Kick-off",
"meetingDate": "2025-11-01",
"participants": [
"Brian Chesky",
"Dario Amodei",
"Iqra Khan"
],
"token": "your-webhook-secret-token",
"relatedPersonId": "person-uuid-from-crm"
}
Response
{
"success": true,
"noteId": "note-uuid",
"taskIds": ["task-uuid-1", "task-uuid-2"],
"summary": {
"noteCreated": true,
"tasksCreated": 2,
"actionItemsProcessed": 2,
"commitmentsProcessed": 0
},
"executionLogs": [
"✅ Validation passed",
"🤖 Starting transcript analysis...",
"✅ Analysis complete"
]
}
Technical Stack
| Component | Description |
|---|---|
| AI Provider | Groq (via OpenAI SDK) using the GPT-OSS-20B model |
| APIs | Twenty CRM REST API + GraphQL (for member resolution) |
| Runtime | Webhook-triggered serverless function written in TypeScript |
Development
Build
yarn build
Type Check
yarn type-check
Environment Variables
| Variable | Required | Secret | Description |
|---|---|---|---|
AI_PROVIDER_API_KEY |
Yes | Yes | API key for OpenAI-compatible service |
TWENTY_API_KEY |
Yes | Yes | Twenty CRM API authentication token |
TWENTY_API_URL |
Yes | No | Base URL for Twenty CRM instance |
WEBHOOK_SECRET_TOKEN |
Yes | Yes | Secret for webhook request validation |
AI_PROVIDER_API_BASE_URL |
No | No | Base URL for AI service (defaults to OpenAI) |
Demo Preview
The demo below shows the full workflow where a raw meeting transcript is processed and automatically converted into structured Notes + Tasks inside Twenty CRM.