diff --git a/packages/twenty-docs/docs.json b/packages/twenty-docs/docs.json
index a6d65aa339..9092b34278 100644
--- a/packages/twenty-docs/docs.json
+++ b/packages/twenty-docs/docs.json
@@ -471,7 +471,7 @@
"language": "fr",
"tabs": [
{
- "tab": "Guide de l'utilisateur",
+ "tab": "User Guide",
"groups": [
{
"group": "Discover Twenty",
@@ -497,7 +497,7 @@
]
},
{
- "group": "Modèle de données",
+ "group": "Data Model",
"icon": "database",
"pages": [
"l/fr/user-guide/data-model/overview",
@@ -579,7 +579,7 @@
]
},
{
- "group": "Flux de travail",
+ "group": "Workflows",
"icon": "bolt",
"pages": [
"l/fr/user-guide/workflows/overview",
@@ -750,7 +750,7 @@
]
},
{
- "group": "Paramètres",
+ "group": "Settings",
"icon": "gear",
"pages": [
"l/fr/user-guide/settings/overview",
@@ -776,10 +776,10 @@
]
},
{
- "tab": "Développeurs",
+ "tab": "Developers",
"groups": [
{
- "group": "Développeurs",
+ "group": "Developers",
"pages": [
"l/fr/developers/introduction"
]
@@ -827,7 +827,7 @@
"l/fr/developers/contribute/capabilities/local-setup",
"l/fr/developers/contribute/capabilities/bug-and-requests",
{
- "group": "Développement du frontend",
+ "group": "Frontend Development",
"pages": [
"l/fr/developers/contribute/capabilities/frontend-development/storybook",
{
@@ -835,7 +835,7 @@
"pages": [
"l/fr/twenty-ui/introduction",
{
- "group": "Afficher",
+ "group": "Display",
"pages": [
"l/fr/twenty-ui/display/checkmark",
"l/fr/twenty-ui/display/chip",
@@ -846,7 +846,7 @@
]
},
{
- "group": "Vos commentaires",
+ "group": "Feedback",
"pages": [
"l/fr/twenty-ui/progress-bar"
]
@@ -888,7 +888,7 @@
]
},
{
- "group": "Développement du backend",
+ "group": "Backend Development",
"pages": [
"l/fr/developers/contribute/capabilities/backend-development/server-commands",
"l/fr/developers/contribute/capabilities/backend-development/feature-flags",
@@ -2257,7 +2257,7 @@
]
},
{
- "group": "Modelo de datos",
+ "group": "Data Model",
"icon": "database",
"pages": [
"l/es/user-guide/data-model/overview",
@@ -2339,7 +2339,7 @@
]
},
{
- "group": "Flujos de trabajo",
+ "group": "Workflows",
"icon": "bolt",
"pages": [
"l/es/user-guide/workflows/overview",
@@ -2399,7 +2399,7 @@
]
},
{
- "group": "IA",
+ "group": "AI",
"icon": "robot",
"pages": [
"l/es/user-guide/ai/overview",
@@ -2450,7 +2450,7 @@
]
},
{
- "group": "Tableros",
+ "group": "Dashboards",
"icon": "chart-bar",
"pages": [
"l/es/user-guide/dashboards/overview",
@@ -2490,7 +2490,7 @@
]
},
{
- "group": "Facturación",
+ "group": "Billing",
"icon": "credit-card",
"pages": [
"l/es/user-guide/billing/overview",
@@ -2510,7 +2510,7 @@
]
},
{
- "group": "Configuración",
+ "group": "Settings",
"icon": "gear",
"pages": [
"l/es/user-guide/settings/overview",
@@ -2536,10 +2536,10 @@
]
},
{
- "tab": "Desarrolladores",
+ "tab": "Developers",
"groups": [
{
- "group": "Desarrolladores",
+ "group": "Developers",
"pages": [
"l/es/developers/introduction"
]
@@ -2587,7 +2587,7 @@
"l/es/developers/contribute/capabilities/local-setup",
"l/es/developers/contribute/capabilities/bug-and-requests",
{
- "group": "Desarrollo Frontend",
+ "group": "Frontend Development",
"pages": [
"l/es/developers/contribute/capabilities/frontend-development/storybook",
{
@@ -2595,7 +2595,7 @@
"pages": [
"l/es/twenty-ui/introduction",
{
- "group": "Mostrar",
+ "group": "Display",
"pages": [
"l/es/twenty-ui/display/checkmark",
"l/es/twenty-ui/display/chip",
@@ -2606,13 +2606,13 @@
]
},
{
- "group": "Retroalimentación",
+ "group": "Feedback",
"pages": [
"l/es/twenty-ui/progress-bar"
]
},
{
- "group": "Entrada",
+ "group": "Input",
"pages": [
"l/es/twenty-ui/input/buttons",
"l/es/twenty-ui/input/color-scheme",
@@ -2627,7 +2627,7 @@
]
},
{
- "group": "Navegación",
+ "group": "Navigation",
"pages": [
"l/es/twenty-ui/navigation",
"l/es/twenty-ui/navigation/breadcrumb",
@@ -2648,7 +2648,7 @@
]
},
{
- "group": "Desarrollo Backend",
+ "group": "Backend Development",
"pages": [
"l/es/developers/contribute/capabilities/backend-development/server-commands",
"l/es/developers/contribute/capabilities/backend-development/feature-flags",
@@ -3111,7 +3111,7 @@
"language": "ja",
"tabs": [
{
- "tab": "ユーザーガイド",
+ "tab": "User Guide",
"groups": [
{
"group": "Discover Twenty",
@@ -3137,7 +3137,7 @@
]
},
{
- "group": "データモデル",
+ "group": "Data Model",
"icon": "database",
"pages": [
"l/ja/user-guide/data-model/overview",
@@ -3219,7 +3219,7 @@
]
},
{
- "group": "ワークフロー",
+ "group": "Workflows",
"icon": "bolt",
"pages": [
"l/ja/user-guide/workflows/overview",
@@ -3390,7 +3390,7 @@
]
},
{
- "group": "設定",
+ "group": "Settings",
"icon": "gear",
"pages": [
"l/ja/user-guide/settings/overview",
@@ -3416,10 +3416,10 @@
]
},
{
- "tab": "開発者",
+ "tab": "Developers",
"groups": [
{
- "group": "開発者",
+ "group": "Developers",
"pages": [
"l/ja/developers/introduction"
]
@@ -3467,7 +3467,7 @@
"l/ja/developers/contribute/capabilities/local-setup",
"l/ja/developers/contribute/capabilities/bug-and-requests",
{
- "group": "フロントエンド開発",
+ "group": "Frontend Development",
"pages": [
"l/ja/developers/contribute/capabilities/frontend-development/storybook",
{
@@ -3475,7 +3475,7 @@
"pages": [
"l/ja/twenty-ui/introduction",
{
- "group": "表示",
+ "group": "Display",
"pages": [
"l/ja/twenty-ui/display/checkmark",
"l/ja/twenty-ui/display/chip",
@@ -3486,7 +3486,7 @@
]
},
{
- "group": "フィードバック",
+ "group": "Feedback",
"pages": [
"l/ja/twenty-ui/progress-bar"
]
@@ -3528,7 +3528,7 @@
]
},
{
- "group": "バックエンド開発",
+ "group": "Backend Development",
"pages": [
"l/ja/developers/contribute/capabilities/backend-development/server-commands",
"l/ja/developers/contribute/capabilities/backend-development/feature-flags",
@@ -3577,7 +3577,7 @@
]
},
{
- "group": "데이터 모델",
+ "group": "Data Model",
"icon": "database",
"pages": [
"l/ko/user-guide/data-model/overview",
@@ -3830,7 +3830,7 @@
]
},
{
- "group": "설정",
+ "group": "Settings",
"icon": "gear",
"pages": [
"l/ko/user-guide/settings/overview",
@@ -3856,10 +3856,10 @@
]
},
{
- "tab": "개발자",
+ "tab": "Developers",
"groups": [
{
- "group": "개발자",
+ "group": "Developers",
"pages": [
"l/ko/developers/introduction"
]
@@ -3907,7 +3907,7 @@
"l/ko/developers/contribute/capabilities/local-setup",
"l/ko/developers/contribute/capabilities/bug-and-requests",
{
- "group": "프론트엔드 개발",
+ "group": "Frontend Development",
"pages": [
"l/ko/developers/contribute/capabilities/frontend-development/storybook",
{
@@ -3915,7 +3915,7 @@
"pages": [
"l/ko/twenty-ui/introduction",
{
- "group": "표시",
+ "group": "Display",
"pages": [
"l/ko/twenty-ui/display/checkmark",
"l/ko/twenty-ui/display/chip",
@@ -3926,13 +3926,13 @@
]
},
{
- "group": "피드백",
+ "group": "Feedback",
"pages": [
"l/ko/twenty-ui/progress-bar"
]
},
{
- "group": "입력",
+ "group": "Input",
"pages": [
"l/ko/twenty-ui/input/buttons",
"l/ko/twenty-ui/input/color-scheme",
@@ -3947,7 +3947,7 @@
]
},
{
- "group": "네비게이션",
+ "group": "Navigation",
"pages": [
"l/ko/twenty-ui/navigation",
"l/ko/twenty-ui/navigation/breadcrumb",
@@ -3968,7 +3968,7 @@
]
},
{
- "group": "백엔드 개발",
+ "group": "Backend Development",
"pages": [
"l/ko/developers/contribute/capabilities/backend-development/server-commands",
"l/ko/developers/contribute/capabilities/backend-development/feature-flags",
@@ -3991,7 +3991,7 @@
"language": "pt",
"tabs": [
{
- "tab": "Manual do Usuário",
+ "tab": "User Guide",
"groups": [
{
"group": "Discover Twenty",
@@ -4017,7 +4017,7 @@
]
},
{
- "group": "Modelo de Dados",
+ "group": "Data Model",
"icon": "database",
"pages": [
"l/pt/user-guide/data-model/overview",
@@ -4270,7 +4270,7 @@
]
},
{
- "group": "Configurações",
+ "group": "Settings",
"icon": "gear",
"pages": [
"l/pt/user-guide/settings/overview",
@@ -4296,10 +4296,10 @@
]
},
{
- "tab": "Desenvolvedores",
+ "tab": "Developers",
"groups": [
{
- "group": "Desenvolvedores",
+ "group": "Developers",
"pages": [
"l/pt/developers/introduction"
]
@@ -4347,7 +4347,7 @@
"l/pt/developers/contribute/capabilities/local-setup",
"l/pt/developers/contribute/capabilities/bug-and-requests",
{
- "group": "Desenvolvimento Frontend",
+ "group": "Frontend Development",
"pages": [
"l/pt/developers/contribute/capabilities/frontend-development/storybook",
{
@@ -4355,7 +4355,7 @@
"pages": [
"l/pt/twenty-ui/introduction",
{
- "group": "Exibição",
+ "group": "Display",
"pages": [
"l/pt/twenty-ui/display/checkmark",
"l/pt/twenty-ui/display/chip",
@@ -4408,7 +4408,7 @@
]
},
{
- "group": "Desenvolvimento de backend",
+ "group": "Backend Development",
"pages": [
"l/pt/developers/contribute/capabilities/backend-development/server-commands",
"l/pt/developers/contribute/capabilities/backend-development/feature-flags",
@@ -5777,7 +5777,7 @@
]
},
{
- "group": "數據模型",
+ "group": "Data Model",
"icon": "database",
"pages": [
"l/zh/user-guide/data-model/overview",
@@ -5859,7 +5859,7 @@
]
},
{
- "group": "Workflow",
+ "group": "Workflows",
"icon": "bolt",
"pages": [
"l/zh/user-guide/workflows/overview",
@@ -6030,7 +6030,7 @@
]
},
{
- "group": "設置",
+ "group": "Settings",
"icon": "gear",
"pages": [
"l/zh/user-guide/settings/overview",
@@ -6056,10 +6056,10 @@
]
},
{
- "tab": "開發人員",
+ "tab": "Developers",
"groups": [
{
- "group": "開發人員",
+ "group": "Developers",
"pages": [
"l/zh/developers/introduction"
]
@@ -6107,7 +6107,7 @@
"l/zh/developers/contribute/capabilities/local-setup",
"l/zh/developers/contribute/capabilities/bug-and-requests",
{
- "group": "前端開發",
+ "group": "Frontend Development",
"pages": [
"l/zh/developers/contribute/capabilities/frontend-development/storybook",
{
@@ -6115,7 +6115,7 @@
"pages": [
"l/zh/twenty-ui/introduction",
{
- "group": "顯示",
+ "group": "Display",
"pages": [
"l/zh/twenty-ui/display/checkmark",
"l/zh/twenty-ui/display/chip",
@@ -6126,13 +6126,13 @@
]
},
{
- "group": "反饋",
+ "group": "Feedback",
"pages": [
"l/zh/twenty-ui/progress-bar"
]
},
{
- "group": "輸入",
+ "group": "Input",
"pages": [
"l/zh/twenty-ui/input/buttons",
"l/zh/twenty-ui/input/color-scheme",
@@ -6147,7 +6147,7 @@
]
},
{
- "group": "導航",
+ "group": "Navigation",
"pages": [
"l/zh/twenty-ui/navigation",
"l/zh/twenty-ui/navigation/breadcrumb",
@@ -6168,7 +6168,7 @@
]
},
{
- "group": "後端開發",
+ "group": "Backend Development",
"pages": [
"l/zh/developers/contribute/capabilities/backend-development/server-commands",
"l/zh/developers/contribute/capabilities/backend-development/feature-flags",
diff --git a/packages/twenty-docs/l/ar/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/ar/developers/contribute/capabilities/backend-development/queue.mdx
index 05f06fef0d..3173c1d9da 100644
--- a/packages/twenty-docs/l/ar/developers/contribute/capabilities/backend-development/queue.mdx
+++ b/packages/twenty-docs/l/ar/developers/contribute/capabilities/backend-development/queue.mdx
@@ -21,12 +21,12 @@ class Resolver {
constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
async onSomeAction() {
- //منطق العمل
+ //business logic
await this.queue.add(someData);
}
}
-//عامل غير متزامن
+//async worker
class CustomWorker {
constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
this.initWorker();
@@ -34,7 +34,7 @@ class CustomWorker {
async initWorker() {
await this.queue.work(async ({ id, data }) => {
- //منطق العامل
+ //worker logic
});
}
}
diff --git a/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/best-practices-front.mdx b/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
index 36b08657ef..624d78159e 100644
--- a/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
+++ b/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
@@ -40,7 +40,7 @@ export const MyComponent = () => {
تجنب استخدام `useRef` لتخزين الحالة.
-إذا كنت ترغب في تخزين الحالة، يجب أن تستخدم `useState` أو `useRecoilState`.
+If you want to store state, you should use `useState` or `useRecoilState`.
انظر [كيفية إدارة إعادة العرض](#managing-re-renders) إذا شعرت أنك بحاجة إلى `useRef` لمنع بعض إعادة العرض من الحدوث.
@@ -56,23 +56,23 @@ export const MyComponent = () => {
تجنب إعادة العرض في الميزات الجديدة أصبح سهلاً الآن عن طريق إزالتها على المستوى الجذري.
-مكون الجانب `PageChangeEffect` يحتوي فقط على `useEffect` واحد يقوم بعقد جميع المنطق لتنفيذه عند تغيير الصفحة.
+The `PageChangeEffect` sidecar component contains just one `useEffect` that holds all the logic to execute on a page change.
بهذه الطريقة، تعرف أن هناك مكان واحد فقط يمكنه تحفيز إعادة العرض.
-### فكر جيدًا قبل إضافة `useEffect` في قاعدة التعليمات البرمجية الخاصة بك
+### Always think twice before adding `useEffect` in your codebase
-غالبًا ما تكون إعادة العرض ناجمة عن `useEffect` غير ضروري.
+Re-renders are often caused by unnecessary `useEffect`.
-يجب أن تفكر في ما إذا كنت بحاجة إلى `useEffect`، أو ما إذا كان بإمكانك نقل المنطق إلى وظيفة معالج الحدث.
+You should think whether you need `useEffect`, or if you can move the logic in a event handler function.
-ستجد أنه من السهل عمومًا نقل المنطق إلى وظيفة `handleClick` أو `handleChange`.
+You'll find it generally easy to move the logic in a `handleClick` or `handleChange` function.
يمكنك أيضًا العثور عليها في المكتبات مثل Apollo: `onCompleted`، `onError`، إلخ.
-### استخدم مكونًا متماثلاً لاستخراج `useEffect` أو منطق استدعاء البيانات
+### Use a sibling component to extract `useEffect` or data fetching logic
-إذا شعرت أنك بحاجة إلى إضافة `useEffect` في مكون الجذر الخاص بك، يجب أن تفكر في استخراجه في مكون الجانب.
+If you feel like you need to add a `useEffect` in your root component, you should consider extracting it in a sidecar component.
يمكنك تطبيق نفس الشيء على منطق جلب البيانات، مع الخُطافات Apollo.
diff --git a/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
index 5b88f6bae7..43c3e73743 100644
--- a/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
+++ b/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -69,7 +69,7 @@ title: أوامر الواجهة الأمامية
"[React Router](https://reactrouter.com/) يتعامل مع التوجيه."
-"لتجنب [إعادة العرض](/l/ar/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) غير الضرورية، يوجد منطق التوجيه في `useEffect` في `PageChangeEffect`."
+To avoid unnecessary [re-renders](/l/ar/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) all the routing logic is in a `useEffect` in `PageChangeEffect`.
### "إدارة الحالة"
diff --git a/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/hotkeys.mdx
index 3a44fe9491..e95a59ba23 100644
--- a/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/hotkeys.mdx
+++ b/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -45,29 +45,29 @@ const PageListeningEnter = () => {
goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope();
- // 1. تعيين نطاق المفتاح في استخدام التأثير
+ // 1. Set the hotkey scope in a useEffect
useEffect(() => {
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleEnterPage,
);
- // العودة إلى نطاق المفتاح السابق عند إلغاء تركيب المكون
+ // Revert to the previous hotkey scope when the component is unmounted
return () => {
goBackToPreviousHotkeyScope();
};
}, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
- // 2. استخدام خطاف useScopedHotkeys
+ // 2. Use the useScopedHotkeys hook
useScopedHotkeys(
Key.Enter,
() => {
- // بعض المنطق المنفذ في هذه الصفحة عند ضغط المستخدم على Enter
+ // Some logic executed on this page when the user presses Enter
// ...
},
ExampleHotkeyScopes.ExampleEnterPage,
);
- return
صفحتي التي تستمع لمفتاح Enter
;
+ return My page that listens for Enter
;
};
```
@@ -87,7 +87,7 @@ const ExamplePageWithModal = () => {
} = usePreviousHotkeyScope();
const handleOpenModalClick = () => {
- // 1. تعيين نطاق المفتاح عند فتح المستخدم المودال
+ // 1. Set the hotkey scope when user opens the modal
setShowModal(true);
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleModal,
@@ -95,14 +95,14 @@ const ExamplePageWithModal = () => {
};
const handleModalClose = () => {
- // 1. العودة إلى نطاق المفتاح السابق عند إغلاق المودال
+ // 1. Revert to the previous hotkey scope when the modal is closed
setShowModal(false);
goBackToPreviousHotkeyScope();
};
return
-
صفحتي التي تحتوي على مودال
- فتح المودال
+ My page with a modal
+ Open modal
{showModal && }
;
};
@@ -112,9 +112,9 @@ const ExamplePageWithModal = () => {
```tsx
const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
- // 2. استخدام خطاف useScopedHotkeys للاستماع لمفتاح Escape.
- // لاحظ أن مفتاح Escape هو مفتاح اختصار شائع يمكن استخدامه من قبل مكونات أخرى كثيرة.
- // لذلك من المهم استخدام نطاق مفتاح لتجنب التعارضات.
+ // 2. Use the useScopedHotkeys hook to listen for Escape.
+ // Note that escape is a common hotkey that could be used by many other components
+ // So it's important to use a hotkey scope to avoid conflicts
useScopedHotkeys(
Key.Escape,
() => {
@@ -123,13 +123,13 @@ const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
ExampleHotkeyScopes.ExampleModal,
);
- return مكون المودال الخاص بي
;
+ return My modal component
;
};
```
-من المهم استخدام هذا النمط عندما لست متأكدًا من أن استخدام useEffect مع التركيب/إلغاء التركيب يكفي لتجنب التعارضات.
+It's important to use this pattern when you're not sure that just using a useEffect with mount/unmount will be enough to avoid conflicts.
-تلك التعارضات يمكن أن تكون صعبة التصحيح، وربما تحدث بشكل متكرر مع useEffects.
+Those conflicts can be hard to debug, and it might happen more often than not with useEffects.
## ما هو نطاق المفتاح؟
diff --git a/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/style-guide.mdx b/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/style-guide.mdx
index 99b54139ad..c0c406a51e 100644
--- a/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/style-guide.mdx
+++ b/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/style-guide.mdx
@@ -21,14 +21,14 @@ The goal here is to have a consistent codebase, which is easy to read and easy t
لا تستخدم `import` الافتراضي مع `const`، لأنه أصعب من حيث القراءة والدمج باستخدام إكمال التعليمات البرمجية.
```tsx
-// ❌ سيئ، أصعب في القراءة، أصعب في الدمج باستخدام إكمال التعليمات البرمجية
+// ❌ Bad, harder to read, harder to import with code completion
const MyComponent = () => {
return Hello World
;
};
export default MyComponent;
-// ✅ جيد، سهل القراءة، سهل الدمج باستخدام إكمال التعليمات البرمجية
+// ✅ Good, easy to read, easy to import with code completion
export function MyComponent() {
return Hello World
;
};
@@ -41,10 +41,10 @@ export function MyComponent() {
استخدام تفكيك الخصائص.
```tsx
-// ❌ سيئ، لا يوجد نوع
+// ❌ Bad, no type
export const MyComponent = (props) => Hello {props.name}
;
-// ✅ جيد، النوع
+// ✅ Good, type
type MyComponentProps = {
name: string;
};
@@ -55,11 +55,11 @@ export const MyComponent = ({ name }: MyComponentProps) => Hello {name} (
تجنب استخدام انتشار متغير فردي للخصائص في عناصر JSX، مثل `{...props}`. غالبًا ما تؤدي هذه الممارسة إلى شكل تعليمي أقل قابلية للقراءة وأصعب في الصيانة لأنه من غير الواضح أي الخصائص يتلقاها المكون.
```tsx
-/* ❌ - سيء، ينثر متغير فردي للخصائص في المكون الأساسي
+/* ❌ - Bad, spreads a single variable prop into the underlying component
*/
const MyComponent = (props: OwnProps) => {
return
;
@@ -137,12 +137,12 @@ onClick?.();
استخدم دائمًا `type` بدلاً من `interface`، لأنهما تقريبًا دائمًا متداخلين، و `type` أكثر مرونة.
```tsx
-// ❌ سيء
+// ❌ Bad
interface MyInterface {
name: string;
}
-// ✅ جيد
+// ✅ Good
type MyType = {
name: string;
};
@@ -155,7 +155,7 @@ type MyType = {
يمكنك معرفة السبب في أن TypeScript توصي بتجنب الأعداد [هنا](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
```tsx
-// ❌ سيء، يستخدم عدد مخصص
+// ❌ Bad, utilizes an enum
enum Color {
Red = "red",
Green = "green",
@@ -263,13 +263,13 @@ const StyledButton = styled.button`
تجنب استيراد الأنواع. للحد من هذه الممارسة، تتحقق قاعدة ESLint وتبلغ عن أي استيرادات من هذا النوع. يساعد هذا على الحفاظ على الاتساق وقابلية القراءة في كود TypeScript.
```tsx
-// ❌ سيء
+// ❌ Bad
import { type Meta, type StoryObj } from '@storybook/react';
-// ❌ سيء
+// ❌ Bad
import type { Meta, StoryObj } from '@storybook/react';
-// ✅ جيد
+// ✅ Good
import { Meta, StoryObj } from '@storybook/react';
```
diff --git a/packages/twenty-docs/l/ar/twenty-ui/input/image-input.mdx b/packages/twenty-docs/l/ar/twenty-ui/input/image-input.mdx
index 67e24b7e08..39c2398a67 100644
--- a/packages/twenty-docs/l/ar/twenty-ui/input/image-input.mdx
+++ b/packages/twenty-docs/l/ar/twenty-ui/input/image-input.mdx
@@ -12,10 +12,10 @@ image: /images/user-guide/objects/objects.png
```jsx
- 27332A4A31272F { 2A2F2E4A44 274435483129 } 4546 "@/ui/input/components/ImageInput";
+ import { ImageInput } from "@/ui/input/components/ImageInput";
- 27352F31 45434852464A 27442E2735 = () => {
- 39482F 2A2F2E44 274435483129/>
+ export const MyComponent = () => {
+ return ;
};
```
diff --git a/packages/twenty-docs/l/ar/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/ar/twenty-ui/navigation/breadcrumb.mdx
index 33f7c87e2f..34c6b00418 100644
--- a/packages/twenty-docs/l/ar/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/ar/twenty-ui/navigation/breadcrumb.mdx
@@ -17,10 +17,10 @@ Renders a breadcrumb navigation bar.
export const MyComponent = () => {
const breadcrumbLinks = [
- { children: "الصفحة الرئيسية", href: "/" },
- { children: "الفئة", href: "/category" },
- { children: "الفئة الفرعية", href: "/category/subcategory" },
- { children: "الصفحة الحالية" },
+ { children: "Home", href: "/" },
+ { children: "Category", href: "/category" },
+ { children: "Subcategory", href: "/category/subcategory" },
+ { children: "Current Page" },
];
return (
diff --git a/packages/twenty-docs/l/ar/twenty-ui/navigation/menu-item.mdx b/packages/twenty-docs/l/ar/twenty-ui/navigation/menu-item.mdx
index 8c3c4a1b67..f835efcfdb 100644
--- a/packages/twenty-docs/l/ar/twenty-ui/navigation/menu-item.mdx
+++ b/packages/twenty-docs/l/ar/twenty-ui/navigation/menu-item.mdx
@@ -71,13 +71,13 @@ image: /images/user-guide/kanban-views/kanban.png
export const MyComponent = () => {
const handleCommandClick = () => {
- console.log("تم النقر على الأمر!");
+ console.log("Command clicked!");
};
return (
{
const handleMenuItemClick = (event) => {
- console.log("تم النقر على عنصر القائمة!", event);
+ console.log("Menu item clicked!", event);
};
return (
@@ -125,7 +125,7 @@ image: /images/user-guide/kanban-views/kanban.png
iconButtons={[{ Icon: IconAlertCircle, onClick: handleButtonClick }]}
isTooltipOpen={false}
onClick={handleMenuItemClick}
- text="عنصر القائمة القابل للسحب"
+ text="Menu item draggable"
isDragDisabled={false}
className
/>
@@ -163,7 +163,7 @@ image: /images/user-guide/kanban-views/kanban.png
return (
@@ -198,8 +198,8 @@ image: /images/user-guide/kanban-views/kanban.png
return (
}
- text="الخيار الأول"
+ avatar={ }
+ text="First Option"
selected={false}
className
/>
@@ -231,13 +231,13 @@ A menu item featuring an optional left icon, textual content, and a right-chevro
export const MyComponent = () => {
const handleNavigation = () => {
- console.log("التنقل إلى صفحة أخرى");
+ console.log("Navigate to another page");
};
return (
@@ -268,13 +268,13 @@ A menu item featuring an optional left icon, textual content, and a right-chevro
export const MyComponent = () => {
const handleSelection = () => {
- console.log("تم اختيار عنصر القائمة");
+ console.log("Menu item selected");
};
return (
```jsx
- استيراد {MenuItemSelectColor} من "twenty-ui/display";
+ import { MenuItemSelectColor } from "twenty-ui/display";
- تصدير المكون الخاص بي = () => {
+ export const MyComponent = () => {
const handleSelection = () => {
- console.log("تم اختيار عنصر القائمة");
+ console.log("Menu item selected");
};
return (
@@ -396,18 +396,18 @@ A selectable menu item with a color sample for scenarios where you want users to
```jsx
- استيراد {IconBell} من '@tabler/icons-react';
+ import { IconBell } from '@tabler/icons-react';
- استيراد {MenuItemToggle} من 'twenty-ui/display';
+ import { MenuItemToggle } from 'twenty-ui/display';
- تصدير المكون الخاص بي = () => {
+ export const MyComponent = () => {
return (
);
diff --git a/packages/twenty-docs/l/ar/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/ar/twenty-ui/navigation/navigation-bar.mdx
index 6b232d5662..87115368e4 100644
--- a/packages/twenty-docs/l/ar/twenty-ui/navigation/navigation-bar.mdx
+++ b/packages/twenty-docs/l/ar/twenty-ui/navigation/navigation-bar.mdx
@@ -12,30 +12,30 @@ image: /images/user-guide/table-views/table.png
```jsx
- استيراد { IconHome, IconUser, IconSettings } من '@tabler/icons-react';
- استيراد { NavigationBar } من "@/ui/navigation/navigation-bar/components/NavigationBar";
+ import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
+ import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
export const MyComponent = () => {
const navigationItems = [
{
- name: "الصفحة الرئيسية",
+ name: "Home",
Icon: IconHome,
- onClick: () => console.log("تم النقر على الصفحة الرئيسية"),
+ onClick: () => console.log("Home clicked"),
},
{
- name: "الملف الشخصي",
+ name: "Profile",
Icon: IconUser,
- onClick: () => console.log("تم النقر على الملف الشخصي"),
+ onClick: () => console.log("Profile clicked"),
},
{
- name: "الإعدادات",
+ name: "Settings",
Icon: IconSettings,
- onClick: () => console.log("تم النقر على الإعدادات"),
+ onClick: () => console.log("Settings clicked"),
},
];
- return ;
+ return ;
};
```
diff --git a/packages/twenty-docs/l/ar/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/ar/twenty-ui/navigation/step-bar.mdx
index b639a94136..ddfe38c13a 100644
--- a/packages/twenty-docs/l/ar/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/ar/twenty-ui/navigation/step-bar.mdx
@@ -17,9 +17,9 @@ image: /images/user-guide/api/api.png
export const MyComponent = () => {
return (
- الخطوة 1
- الخطوة 2
- الخطوة 3
+ Step 1
+ Step 2
+ Step 3
);
};
diff --git a/packages/twenty-docs/l/ar/user-guide/billing/overview.mdx b/packages/twenty-docs/l/ar/user-guide/billing/overview.mdx
index 9d3da7812d..1527aa0735 100644
--- a/packages/twenty-docs/l/ar/user-guide/billing/overview.mdx
+++ b/packages/twenty-docs/l/ar/user-guide/billing/overview.mdx
@@ -1,6 +1,6 @@
---
title: الفوترة
-description: Understand Twenty pricing and manage your subscription.
+description: تعرّف على تسعير Twenty وأدِر اشتراكك.
image: /images/user-guide/setup/pricing.png
---
@@ -8,38 +8,38 @@ image: /images/user-guide/setup/pricing.png
-Twenty offers flexible pricing plans to fit your team's needs. Manage your subscription, track workflow credits, and access invoices all from **Settings → Billing**.
+تقدّم Twenty خطط تسعير مرنة لتلبية احتياجات فريقك. أدِر اشتراكك، وتتبع أرصدة سير العمل، واطّلع على الفواتير — وكل ذلك من **Settings → Billing**.
-## What's in this section
+## ما الذي يتضمنه هذا القسم
-
- Learn about Twenty's pricing plans and what's included.
+
+ تعرّف على خطط تسعير Twenty وما تتضمنه.
-
- Frequently asked questions about pricing and billing.
+
+ أسئلة شائعة حول التسعير والفوترة.
-## At a glance
+## نظرة سريعة
-| الخطة | Key Features |
-| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| **Free (Self-Hosted)** | All Pro features, community support |
-| **Pro (Cloud)** | Everything apart from the Premium features (SSO and row-level permissions), standard support |
-| **Organization (Cloud)** | All from Pro + the Premium features (SSO and row-level permissions), priority support |
-| **Organization (Self-Hosted)** | All from Pro + the Premium features (SSO, row-level permissions), Twenty team support, not required to publish your custom code as open-source before distributing |
+| الخطة | الميزات الرئيسية |
+| --------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
+| **مجانًا (مستضاف ذاتيًا)** | جميع ميزات Pro، ودعم المجتمع |
+| **Pro (سحابي)** | كل شيء باستثناء ميزات Premium (SSO وأذونات على مستوى الصف)، دعم قياسي |
+| **المؤسسة (سحابي)** | كل ما في Pro + ميزات Premium (SSO وأذونات على مستوى الصف)، دعم ذو أولوية |
+| **المؤسسة (مستضاف ذاتيًا)** | كل ما في Pro + ميزات Premium (SSO وأذونات على مستوى الصف)، دعم فريق Twenty، ولا يُشترط نشر شيفرتك المخصصة كمصدر مفتوح قبل التوزيع |
-## Quick answers
+## إجابات سريعة
-**Where do I manage billing?**
-Go to **Settings → Billing** to view your plan, update payment methods, and access invoices.
+**أين أدير الفوترة؟**
+انتقل إلى **Settings → Billing** لعرض خطتك، وتحديث طرق الدفع، والوصول إلى الفواتير.
-**Can I use Twenty for free?**
-Yes! Self-host Twenty and get all Pro features at no cost.
+**هل يمكنني استخدام Twenty مجانًا؟**
+نعم! استضف Twenty ذاتيًا واحصل على جميع ميزات Pro دون تكلفة.
-**How do I upgrade?**
-Go to **Settings → Billing** and click **Switch to Organization** or **Switch to Yearly**.
+**كيف أقوم بالترقية؟**
+انتقل إلى **Settings → Billing** ثم انقر **Switch to Organization** أو **Switch to Yearly**.
-For more questions, see the [Billing FAQ](/l/ar/user-guide/billing/how-tos/billing-faq).
+لمزيد من الأسئلة، راجع [الأسئلة الشائعة حول الفوترة](/l/ar/user-guide/billing/how-tos/billing-faq).
diff --git a/packages/twenty-docs/l/ar/user-guide/calendar-emails/capabilities/calendar.mdx b/packages/twenty-docs/l/ar/user-guide/calendar-emails/capabilities/calendar.mdx
index 620926b3aa..0591c83765 100644
--- a/packages/twenty-docs/l/ar/user-guide/calendar-emails/capabilities/calendar.mdx
+++ b/packages/twenty-docs/l/ar/user-guide/calendar-emails/capabilities/calendar.mdx
@@ -1,19 +1,19 @@
---
title: تقويم
-description: Understanding calendar integration features in Twenty.
+description: فهم ميزات تكامل التقويم في Twenty.
---
-**Note**: To connect your calendar and configure sync settings, visit [Email & Calendar Setup](/l/ar/user-guide/calendar-emails/overview).
+**ملاحظة**: لربط تقويمك وتكوين إعدادات المزامنة، قم بزيارة [إعدادات البريد الإلكتروني والتقويم](/l/ar/user-guide/calendar-emails/overview).
-## How Calendar Integration Works
+## كيف يعمل تكامل التقويم
-Twenty automatically syncs your calendar events and links them to the relevant CRM records, giving you a complete view of your meeting history with contacts and companies.
+يقوم Twenty بمزامنة أحداث تقويمك تلقائيًا وربطها بسجلات CRM ذات الصلة، ما يمنحك عرضًا كاملاً لسجل اجتماعاتك مع جهات الاتصال والشركات.
## علامة تبويب التقويم
-Next to the Emails tab on records, you'll find a `Calendar` tab that contains the history of meetings scheduled with the record.
+بجانب علامة تبويب البريد الإلكتروني في السجلات، ستجد علامة تبويب `التقويم` التي تحتوي على سجلّ الاجتماعات المجدولة المرتبطة بذلك السجل.
-### Available For
+### متاح لـ
* **الأشخاص**: عرض جميع الاجتماعات المجدولة مع جهة اتصال محددة
* **الشركات**: راجع جميع الاجتماعات المتعلقة بشركة وموظفيها
@@ -26,18 +26,18 @@ Next to the Emails tab on records, you'll find a `Calendar` tab that contains th
3. **تصفح تاريخ الاجتماعات**: عرض جميع الاجتماعات المجدولة وتفاصيلها
4. **الوصول إلى سياق الاجتماع**: شاهد المشاركين في الاجتماع، الأوقات، والمعلومات ذات الصلة
-## Visibility Settings
+## إعدادات الرؤية
-Calendar data follows the same visibility settings as emails, ensuring consistent privacy controls across both communication channels.
+تتبع بيانات التقويم نفس إعدادات الرؤية الخاصة بالبريد الإلكتروني، مما يضمن ضوابط خصوصية متسقة عبر كلتا قناتي التواصل.
-## What Gets Synced
+## ما الذي يتم مزامنته
-* **External Meetings**: All meetings with contacts outside your organization
-* **Automatic Linking**: Meetings connect to existing People and Company records based on attendee email addresses
-* **Meeting Details**: Subject, time, duration, and participants
-* **Updates**: New calendar events sync automatically
+* **الاجتماعات الخارجية**: جميع الاجتماعات مع جهات الاتصال خارج مؤسستك
+* **الربط التلقائي**: ترتبط الاجتماعات بسجلات الأشخاص والشركات الحالية بناءً على عناوين البريد الإلكتروني للحضور
+* **تفاصيل الاجتماع**: الموضوع، الوقت، المدة، والمشاركون
+* **التحديثات**: تتم مزامنة أحداث التقويم الجديدة تلقائيًا
## ما لا يتم مزامنته
-* **Internal Meetings**: Meetings with only colleagues (same domain) remain private
-* **Private Events**: Events marked as private in your calendar
+* **الاجتماعات الداخلية**: تبقى الاجتماعات مع الزملاء فقط (نفس النطاق) خاصة
+* **الأحداث الخاصة**: الأحداث المعلَّمة كخاصة في تقويمك
diff --git a/packages/twenty-docs/l/ar/user-guide/dashboards/how-tos/dashboards-faq.mdx b/packages/twenty-docs/l/ar/user-guide/dashboards/how-tos/dashboards-faq.mdx
index ed65d38510..4f5f85fb4b 100644
--- a/packages/twenty-docs/l/ar/user-guide/dashboards/how-tos/dashboards-faq.mdx
+++ b/packages/twenty-docs/l/ar/user-guide/dashboards/how-tos/dashboards-faq.mdx
@@ -1,59 +1,59 @@
---
title: Dashboards FAQ
-description: Frequently asked questions about dashboards in Twenty.
+description: أسئلة شائعة حول لوحات القيادة في Twenty.
---
-
- No, dashboards are currently visible to everyone with access to your Twenty workspace. Private dashboards are not yet available.
+
+ لا، لوحات القيادة مرئية حاليًا لجميع من لديهم صلاحية الوصول إلى مساحة العمل الخاصة بك على Twenty. لوحات القيادة الخاصة غير متاحة بعد.
-
- Dashboards currently display data based on the viewer's timezone. If you're in different regions (e.g., APAC vs. US), you may see slightly different numbers for the same dashboard. We're working on adding a timezone setting per dashboard to ensure consistent data across teams.
+
+ تعرض لوحات القيادة حاليًا البيانات بناءً على المنطقة الزمنية للعارض. إذا كنتم في مناطق مختلفة (على سبيل المثال، APAC مقابل US)، فقد ترون أرقامًا مختلفة قليلًا للوحة القيادة نفسها. نعمل على إضافة إعداد للمنطقة الزمنية لكل لوحة قيادة لضمان اتساق البيانات عبر الفرق.
-
- Exporting dashboards is not available at the moment. This feature is on our roadmap.
+
+ تصدير لوحات القيادة غير متاح في الوقت الحالي. هذه الميزة مدرَجة على خارطة الطريق لدينا.
-
- No, sharing dashboards with users outside your Twenty workspace (non-Twenty users) is not currently supported.
+
+ لا، مشاركة لوحات القيادة مع المستخدمين خارج مساحة العمل الخاصة بك على Twenty (غير مستخدمي Twenty) غير مدعومة حاليًا.
-
- Open the dashboard you want to favorite, then click the star icon. Favorites are personal—they won't affect other users.
+
+ افتح لوحة القيادة التي تريد إضافتها إلى المفضلة، ثم انقر على أيقونة النجمة. المفضلة شخصية — ولن تؤثر في المستخدمين الآخرين.
-
- * **Tabs** organize your dashboard into sections (like pages within the dashboard)
- * **Widgets** are the individual visualizations (charts, numbers, iFrames) within each tab
+
+ * **علامات التبويب** تنظّم لوحة القيادة إلى أقسام (مثل صفحات داخل لوحة القيادة)
+ * **عناصر واجهة المستخدم** هي التصورات الفردية (مخططات، أرقام، وإطارات iFrame) داخل كل علامة تبويب
- Structure: Dashboard → Tabs → Widgets
+ البنية: لوحة القيادة → علامات التبويب → عناصر واجهة المستخدم
-
- Bar charts have display limits: 100 bars for horizontal charts, 50 for vertical. If your data exceeds this, add filters to narrow down the results or change the grouping (e.g., group by week instead of day).
+
+ لمخططات الأعمدة حدود عرض: 100 عمود للمخططات الأفقية، و50 للعمودية. إذا تجاوزت بياناتك ذلك، فأضِف عوامل تصفية لحصر النتائج أو غيّر أسلوب التجميع (على سبيل المثال، التجميع حسب الأسبوع بدلًا من اليوم).
-
- Dashboard-level filters are not available yet, but this feature is on our roadmap. Currently, you need to apply filters to each widget individually.
+
+ عوامل التصفية على مستوى لوحة القيادة غير متاحة بعد، لكن هذه الميزة مدرَجة على خارطة الطريق لدينا. حاليًا، تحتاج إلى تطبيق عوامل التصفية على كل عنصر واجهة مستخدم على حدة.
-
- ليس بعد. Gauge charts and tables are on our roadmap and will be added in a future release.
+
+ ليس بعد. مخططات العدّاد والجداول مدرَجة على خارطة الطريق لدينا وسيتم إضافتها في إصدار لاحق.
-
- 1. Make sure you're in view mode (not editing)
- 2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
- 3. Select **Duplicate dashboard**
+
+ 1. تأكد من أنك في وضع العرض (وليس التحرير)
+ 2. افتح شريط الأوامر باستخدام **Cmd + K** (أو **Ctrl + K** على Windows)
+ 3. اختر **تكرار لوحة القيادة**
-
- Widgets update automatically as your CRM data changes:
+
+ تتحدّث عناصر واجهة المستخدم تلقائيًا مع تغيّر بيانات نظام إدارة علاقات العملاء (CRM):
- * Real-time updates for most metrics
- * Use the refresh button for a manual update if needed
- * Historical data is preserved for trend analysis
+ * تحديثات فورية لمعظم المقاييس
+ * استخدم زر التحديث لإجراء تحديث يدوي عند الحاجة
+ * تُحفَظ البيانات التاريخية لتحليل الاتجاهات
diff --git a/packages/twenty-docs/l/ar/user-guide/data-migration/capabilities/field-mapping.mdx b/packages/twenty-docs/l/ar/user-guide/data-migration/capabilities/field-mapping.mdx
index 903851b1a2..0b30414858 100644
--- a/packages/twenty-docs/l/ar/user-guide/data-migration/capabilities/field-mapping.mdx
+++ b/packages/twenty-docs/l/ar/user-guide/data-migration/capabilities/field-mapping.mdx
@@ -1,176 +1,176 @@
---
-title: Field Mapping
-description: How field mapping works during data import.
+title: تعيين الحقول
+description: كيف يعمل تعيين الحقول أثناء استيراد البيانات.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-## How Field Mapping Works
+## كيف يعمل تعيين الحقول
-When you upload a file, Twenty analyzes your columns and attempts to match them to existing fields.
+عند تحميل ملف، يقوم Twenty بتحليل أعمدتك ومحاولة مطابقتها مع الحقول الموجودة.
-### Automatic Mapping
+### التعيين التلقائي
-Twenty tries to match columns based on:
+يحاول Twenty مطابقة الأعمدة استنادًا إلى:
-* Column header names (exact or similar matches)
-* Data type detection (dates, numbers, emails)
-* Common field patterns
+* أسماء رؤوس الأعمدة (مطابقات دقيقة أو متشابهة)
+* اكتشاف نوع البيانات (تواريخ، أرقام، عناوين بريد إلكتروني)
+* أنماط الحقول الشائعة
-**Quick tip:** Export a few rows from the object you want to import. The exported file will have the exact column names Twenty expects, making automatic mapping seamless during import.
+**نصيحة سريعة:** صدِّر بضعة صفوف من الكائن الذي تريد استيراده. سيحتوي الملف المصدَّر على أسماء الأعمدة الدقيقة التي يتوقعها Twenty، مما يجعل التعيين التلقائي سلسًا أثناء الاستيراد.
-### Manual Mapping Options
+### خيارات التعيين اليدوي
-For each column, you can:
+لكل عمود، يمكنك:
-* **Map to a field**: Select the matching Twenty field from a dropdown
-* **Do not map**: Skip the column entirely (data won't be imported)
+* **تعيين إلى حقل**: اختر الحقل المطابق في Twenty من قائمة منسدلة
+* **عدم التعيين**: تخطَّ العمود بالكامل (لن يتم استيراد البيانات)
-**Fields must exist before import.** The import creates records, not fields. Create custom fields under **Settings → Data Model** before importing.
+**يجب أن تكون الحقول موجودة قبل الاستيراد.** الاستيراد يُنشئ السجلات، لا الحقول. أنشئ الحقول المخصصة ضمن **الإعدادات → نموذج البيانات** قبل الاستيراد.
-## Field Type Compatibility
+## توافق أنواع الحقول
-All field types available in the Data Model are supported for import.
+جميع أنواع الحقول المتاحة في نموذج البيانات مدعومة للاستيراد.
-You can also import `id` values to either assign a specific ID to new records or update existing ones.
+يمكنك أيضًا استيراد قيم `id` إما لتعيين معرّف محدد للسجلات الجديدة أو لتحديث السجلات القائمة.
-## Data Format Requirements
+## متطلبات تنسيق البيانات
-**Some fields have special syntax.** We recommend downloading the sample file before preparing your import to see the expected syntax for each field type.
+**لبعض الحقول صياغة خاصة.** نوصي بتنزيل الملف النموذجي قبل إعداد عملية الاستيراد للاطلاع على الصياغة المتوقعة لكل نوع حقل.
-### Address Fields
+### حقول العنوان
-Address is a nested field with multiple columns. Some can be left empty.
+العنوان حقل متداخل يضم عدة أعمدة. يمكن ترك بعضِها فارغًا.
-* **Address / Address 1**: Street address line 1
-* **Address / Address 2**: Street address line 2
-* **Address / City**: City name
-* **Address / State**: State or province
-* **Address / Country**: Country name
-* **Address / Post Code**: Postal/ZIP code
+* **Address / Address 1**: سطر عنوان الشارع 1
+* **Address / Address 2**: سطر عنوان الشارع 2
+* **Address / City**: اسم المدينة
+* **Address / State**: الولاية أو المقاطعة
+* **Address / Country**: اسم الدولة
+* **Address / Post Code**: الرمز البريدي/ZIP
-### Array Fields
+### حقول المصفوفة
-Use the following format:
+استخدم التنسيق التالي:
```
-["value1","value2"]
+[\"value1\",\"value2\"]
```
-### Boolean Fields
+### حقول القيم المنطقية
-Use `TRUE` or `FALSE` (uppercase) - not `true` or `false`
+استخدم `TRUE` أو `FALSE` (أحرف كبيرة) - وليس `true` أو `false`
-### Currency Fields
+### حقول العملة
-Currency is a nested field with two columns that **both must be filled**:
+العملة حقل متداخل يحتوي على عمودين يجب **ملؤهما كلاهما**:
-* **Amount / Amount**: The numeric value (e.g., `1234.56`)
-* **Amount / Currency**: The currency code (e.g., `USD`, `EUR`)
+* **Amount / Amount**: القيمة الرقمية (مثال: `1234.56`)
+* **Amount / Currency**: رمز العملة (مثال: `USD`، `EUR`)
-### Date Fields
+### حقول التاريخ
-Supported formats:
+التنسيقات المدعومة:
-* `YYYY-MM-DD` (recommended)
+* `YYYY-MM-DD` (موصى به)
* `MM/DD/YYYY`
* `DD/MM/YYYY`
-* ISO 8601 format
+* تنسيق ISO 8601
-### Domain Fields
+### حقول النطاق
-* It is recommended to use the format `https://domain.com` to avoid creating duplicates, as this is the format used for Companies created by the mailbox and calendar synchronizations
-* A `Domain Label` and `Domain URL` can be filled: best practice is to fill `domain.com` in the label and `https://domain.com` in the url
-* Domains must be unique within the Companies object
-* **Domains must be unique within the file to import**
+* يُوصى باستخدام التنسيق `https://domain.com` لتجنب إنشاء التكرارات، إذ إن هذا هو التنسيق المستخدم للشركات التي يتم إنشاؤها عبر مزامنة صندوق البريد والتقويم
+* يمكن ملء حقلي `Domain Label` و`Domain URL`: وأفضل ممارسة هي وضع `domain.com` في التسمية و`https://domain.com` في عنوان URL
+* يجب أن تكون النطاقات فريدة داخل كائن الشركات
+* **يجب أن تكون النطاقات فريدة داخل الملف المُراد استيراده**
-### Email Fields
+### حقول البريد الإلكتروني
-* Must be valid email format
-* Emails must be unique within the People object
-* **Emails must be unique within the file to import**
-* For additional emails: use **Emails / Primary Email** for the main email, and **Emails / Additional Emails** with this format:
+* يجب أن تكون بتنسيق بريد إلكتروني صحيح
+* يجب أن تكون عناوين البريد الإلكتروني فريدة داخل كائن الأشخاص
+* **يجب أن تكون عناوين البريد الإلكتروني فريدة داخل الملف المُراد استيراده**
+* للبريد الإلكتروني الإضافي: استخدم **Emails / Primary Email** للبريد الرئيسي، و**Emails / Additional Emails** بهذا التنسيق:
```
-["jane@twenty.com","jane.doe@twenty.com"]
+[\"jane@twenty.com\",\"jane.doe@twenty.com\"]
```
-### Id Fields
+### حقول المعرّف
-Specifying an `id` during import is optional. Twenty auto-generates one if not provided.
+تحديد `id` أثناء الاستيراد اختياري. يقوم Twenty بإنشاء واحد تلقائيًا إذا لم يتم توفيره.
-Use cases for mapping an `id` column:
+حالات استخدام لتعيين عمود `id`:
-* **Set a specific ID**: Choose the UUID for newly created records
-* **Update existing records**: Match against existing records to update them instead of creating duplicates. In that case, it is recommended to not map the other unique fields: mapping only one unique field ensures a smoother import.
+* **تعيين معرّف محدد**: اختر UUID للسجلات التي سيتم إنشاؤها
+* **تحديث السجلات الحالية**: طابِق السجلات الحالية لتحديثها بدلاً من إنشاء تكرارات. في هذه الحالة، يُنصح بعدم تعيين الحقول الفريدة الأخرى: فاقتصار التعيين على حقل فريد واحد يضمن عملية استيراد أكثر سلاسة.
-If you provide an `id`, it must be in UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
+إذا قدّمت قيمة `id`، فيجب أن تكون بتنسيق UUID (مثال: `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
-### JSON Fields
+### حقول JSON
-Use valid JSON format:
+استخدم تنسيق JSON صالحًا:
```
{"key":"value","key2":"value2"}
```
-### Links Fields
+### حقول الروابط
-Similar to Domain fields:
+مشابه لحقول النطاق:
-* Fill both the label and URL columns: **Links / Link URL** and **Links / Link Label**
-* Use full URL format: `https://example.com`
-* For secondary links, use **Links / Secondary Links** column with this format:
+* املأ عمودي التسمية والرابط معًا: **Links / Link URL** و**Links / Link Label**
+* استخدم تنسيق الرابط الكامل: `https://example.com`
+* للروابط الثانوية، استخدم عمود **Links / Secondary Links** بهذا التنسيق:
```
-[{"url":"https://twenty.com","label":"Twenty"}]
+[{\"url\":\"https://twenty.com\",\"label\":\"Twenty\"}]
```
-### Multi-Select Fields
+### حقول التحديد المتعدد
-Use the **API names** (not the display labels) in the following format:
+استخدم **أسماء واجهة برمجة التطبيقات (API)** (وليس تسميات العرض) بالتنسيق التالي:
```
-["VALUE1","VALUE2"]
+[\"VALUE1\",\"VALUE2\"]
```
-See [here](#finding-api-names-for-select-fields) where to find the API names.
+اطّلع [هنا](#finding-api-names-for-select-fields) لمعرفة مكان العثور على أسماء واجهة برمجة التطبيقات.
-New select options will not be created automatically by the import. They must be added under **Settings → Data Model** before importing.
+لن يتم إنشاء خيارات التحديد الجديدة تلقائيًا بواسطة الاستيراد. يجب إضافتها ضمن **الإعدادات → نموذج البيانات** قبل الاستيراد.
- **Import overwrites, it does not add.**
+ **الاستيراد يستبدل، لا يضيف.**
- If a record already has `VALUE2` and `VALUE3` selected, and you import `["VALUE1"]`, the record will only have `VALUE1` after import. The previous selections are replaced, not merged.
+ إذا كان السجل يحتوي بالفعل على `VALUE2` و`VALUE3` محدّدين، ثم استوردت `[\"VALUE1\"]`، فسيحتوي السجل على `VALUE1` فقط بعد الاستيراد. يتم استبدال التحديدات السابقة، وليس دمجها.
-### Number Fields
+### حقول الأرقام
-* Numbers only
-* Decimals use period: `1234.56`
-* No thousands separators
+* أرقام فقط
+* تُكتب الكسور العشرية بنقطة: `1234.56`
+* من دون فواصل آلاف
-### Phone Fields
+### حقول الهاتف
-Phone is a nested field with multiple columns that **must be filled**
+الهاتف حقل متداخل يضم عدة أعمدة يجب **ملؤها**
-* **Phones / Primary Phone Number**: The phone number (e.g., `4159095555`)
-* **Phones / Primary Phone Country Code**: Country code (e.g., `US`)
-* **Phones / Primary Phone Calling Code**: Dialing code (e.g., `+1`)
+* **Phones / Primary Phone Number**: رقم الهاتف (مثال: `4159095555`)
+* **Phones / Primary Phone Country Code**: رمز الدولة (مثال: `US`)
+* **Phones / Primary Phone Calling Code**: رمز الاتصال (مثال: `+1`)
-### Rating Fields
+### حقول التقييم
-Use the API name format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, `RATING_5`
+استخدم تنسيق اسم واجهة برمجة التطبيقات: `RATING_1`، `RATING_2`، `RATING_3`، `RATING_4`، `RATING_5`
### حقول العلاقات
-Please see our dedicated article: [Import Relations Between Objects](/l/ar/user-guide/data-migration/capabilities/import-relations)
+يرجى الاطّلاع على مقالتنا المخصّصة: [استيراد العلاقات بين الكائنات](/l/ar/user-guide/data-migration/capabilities/import-relations)
### حقول الاختيار
-Use the **API name** of the option (not the display label):
+استخدم **اسم واجهة برمجة التطبيقات** للخيار (وليس تسمية العرض):
```
VALUE1
diff --git a/packages/twenty-docs/l/ar/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx b/packages/twenty-docs/l/ar/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
index a6eed7611c..54e62c46c6 100644
--- a/packages/twenty-docs/l/ar/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
+++ b/packages/twenty-docs/l/ar/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
@@ -1,5 +1,5 @@
---
-title: التحويل من أنظمة إدارة علاقات العملاء الأخرى},{
+title: Migrating from Other CRMs
description: Step-by-step guide to migrate your data from any CRM to Twenty.
---
diff --git a/packages/twenty-docs/l/ar/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx b/packages/twenty-docs/l/ar/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
index 7db7a8b36e..150245ee0c 100644
--- a/packages/twenty-docs/l/ar/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
+++ b/packages/twenty-docs/l/ar/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
@@ -1,5 +1,5 @@
---
-title: حضِّر ملفات CSV الخاصة بك},{
+title: Prepare Your CSV Files
description: دليل كامل خطوة بخطوة لتنسيق بياناتك لاستيرادها إلى Twenty.
---
@@ -87,114 +87,114 @@ description: دليل كامل خطوة بخطوة لتنسيق بياناتك
| **Phones / Primary Phone Country Code** | `US` |
| **Phones / Primary Phone Calling Code** | `+1` |
-### Address Fields
+### حقول العنوان
-Address is a **nested field** with multiple columns (some can be left empty):
+العنوان هو **حقل متداخل** يحتوي على أعمدة متعددة (يمكن ترك بعضها فارغًا):
-* **Address / Address 1**: Street address line 1
-* **Address / Address 2**: Street address line 2 (optional)
-* **Address / City**: City name
-* **Address / State**: State or province
-* **Address / Country**: Country name
-* **Address / Post Code**: Postal/ZIP code
+* **العنوان / العنوان 1**: السطر الأول لعنوان الشارع
+* **العنوان / العنوان 2**: السطر الثاني لعنوان الشارع (اختياري)
+* **العنوان / المدينة**: اسم المدينة
+* **العنوان / الولاية**: ولاية أو مقاطعة
+* **العنوان / البلد**: اسم البلد
+* **العنوان / الرمز البريدي**: رمز بريدي/ZIP
-### Date Fields
+### حقول التاريخ
-Use consistent formatting throughout your file:
+استخدم تنسيقًا موحدًا في كامل ملفك:
-* `YYYY-MM-DD` (recommended): `2024-03-15`
+* `YYYY-MM-DD` (مُوصى به): `2024-03-15`
* `MM/DD/YYYY`: `03/15/2024`
* `DD/MM/YYYY`: `15/03/2024`
* ISO 8601: `2024-03-15T10:30:00Z`
-### Number Fields
+### حقول الأرقام
-* Numbers only (no text)
-* Use period for decimals: `1234.56`
-* No thousands separators (not `1,234.56`)
+* أرقام فقط (بدون نص)
+* استخدم النقطة للفواصل العشرية: `1234.56`
+* بدون فواصل لآلاف الأرقام (ليس `1,234.56`)
-### Currency Fields
+### حقول العملة
-Currency is a **nested field** requiring two columns that **both must be filled**:
+العملة هي **حقل متداخل** يتطلب عمودين يجب **ملؤهما كليهما**:
-| Column | مثال |
-| --------------------- | --------- |
-| **Amount / Amount** | `1234.56` |
-| **Amount / Currency** | `USD` |
+| العمود | مثال |
+| ------------------- | --------- |
+| **المبلغ / المبلغ** | `1234.56` |
+| **المبلغ / العملة** | `USD` |
-### Boolean Fields
+### حقول منطقية
-Use uppercase: `TRUE` or `FALSE`
+استخدم أحرفًا كبيرة: `TRUE` أو `FALSE`
-Lowercase `true` or `false` will not work.
+الأحرف الصغيرة `true` أو `false` لن تعمل.
### اختر الحقول
-Use the **API name** of the option, not the display label.
+استخدم **اسم واجهة برمجة التطبيقات (API)** للخيار، وليس اسم العرض.
-**How to find API names:**
+**كيفية العثور على أسماء واجهة برمجة التطبيقات (API):**
-1. Go to **Settings → Data Model**
-2. Select the object and field
-3. Enable **Advanced mode** (toggle at bottom right)
-4. Copy the API name (e.g., `OPTION_1`, not "Option 1")
+1. انتقل إلى **الإعدادات → نموذج البيانات**
+2. اختر الكائن والحقل
+3. فعّل **الوضع المتقدم** (المبدّل في أسفل اليمين)
+4. انسخ اسم واجهة برمجة التطبيقات (مثال: `OPTION_1`، وليس "Option 1")
-New select options are not created automatically. Add them in **Settings → Data Model** before importing.
+خيارات الاختيار الجديدة لا يتم إنشاؤها تلقائيًا. أضِفها في **الإعدادات → نموذج البيانات** قبل الاستيراد.
-### Multi-Select Fields
+### حقول متعددة الاختيار
-Use API names in array format:
+استخدم أسماء واجهة برمجة التطبيقات بصيغة المصفوفة:
```
["VALUE1","VALUE2"]
```
-### Array Fields
+### حقول المصفوفة
-Use JSON array format:
+استخدم صيغة مصفوفة JSON:
```
["value1","value2"]
```
-### Rating Fields
+### حقول التقييم
-Use the format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, or `RATING_5`
+استخدم الصيغة: `RATING_1` و`RATING_2` و`RATING_3` و`RATING_4` أو `RATING_5`
-### Links/URL Fields
+### حقول الروابط/عناوين URL
-Fill both columns:
+املأ كلا العمودين:
-* **Links / Link Label**: `Twenty`
-* **Links / Link URL**: `https://twenty.com`
+* **الروابط / تسمية الرابط**: `Twenty`
+* **الروابط / عنوان URL للرابط**: `https://twenty.com`
-For secondary links, use the **Links / Secondary Links** column:
+بالنسبة للروابط الثانوية، استخدم عمود **الروابط / الروابط الثانوية**:
```
[{"url":"https://twenty.com","label":"Twenty"}]
```
-### JSON Fields
+### حقول JSON
-Use valid JSON format:
+استخدم تنسيق JSON صالحًا:
```
{"key":"value","key2":"value2"}
```
-### ID Fields
+### حقول المعرّف
-* **Optional**: Twenty auto-generates IDs if not provided
-* **Format**: UUID (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`)
-* **Use case**: Include ID to update existing records instead of creating new ones
+* **اختياري**: يقوم Twenty بإنشاء المعرّفات تلقائيًا إذا لم تُوفَّر
+* **التنسيق**: UUID (مثلًا: `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`)
+* **حالة الاستخدام**: تضمين المعرّف لتحديث السجلات الموجودة بدلًا من إنشاء سجلات جديدة
-## Step 5: Add Relation Columns (If Linking Records)
+## الخطوة 5: إضافة أعمدة العلاقات (إذا كنت تربط السجلات)
-To link records to other objects (e.g., People to Companies), add a column with the unique identifier of the related record.
+لربط السجلات بكائنات أخرى (مثل الأشخاص بالشركات)، أضِف عمودًا يحتوي على المعرّف الفريد للسجل المرتبط.
-**Example**: Linking People to Companies
+**مثال**: ربط الأشخاص بالشركات
-Add a column to your People CSV:
+أضِف عمودًا إلى ملف CSV الخاص بالأشخاص:
```
firstName,lastName,email,companyDomain
@@ -202,69 +202,69 @@ John,Smith,john@acme.com,https://acme.com
Jane,Doe,jane@widgets.co,https://widgets.co
```
-**Important rules for relations:**
+**قواعد مهمة للعلاقات:**
-* The parent record must already exist in Twenty
-* Use the **Domain URL** format (`https://domain.com`), not the label
-* Map only ONE unique identifier (don't include both `companyId` AND `companyDomain`)
-* For Workspace Members, use their **email** (not name)
+* يجب أن يكون السجل الأب موجودًا مسبقًا في Twenty
+* استخدم صيغة **عنوان المجال (Domain URL)** (`https://domain.com`) وليس التسمية
+* قم بربط مُعرّف فريد واحد فقط (لا تُدرج كلاً من `companyId` و`companyDomain`)
+* بالنسبة لأعضاء مساحة العمل، استخدم **البريد الإلكتروني** الخاص بهم (وليس الاسم)
- **Import Order Matters!**
+ **ترتيب الاستيراد مهم!**
- Import the "one" side before the "many" side:
+ استورد طرف "الواحد" قبل طرف "الكثير":
- 1. **Companies** first
- 2. **People** second (with company reference)
- 3. **Opportunities** third
+ 1. **الشركات** أولاً
+ 2. **الأشخاص** ثانيًا (مع مرجع الشركة)
+ 3. **الفرص** ثالثًا
- The parent record must exist before you can reference it.
+ يجب أن يوجد السجل الأب قبل أن تتمكن من الإشارة إليه.
-See [How to Import Relations](/l/ar/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for detailed instructions.
+اطلع على [كيفية استيراد العلاقات](/l/ar/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) للحصول على تعليمات مفصلة.
-## Step 6: Ensure Fields Exist in Twenty
+## الخطوة 6: تأكد من وجود الحقول في Twenty
-The import creates **records**, not **fields**. All fields you want to import must already exist in your data model.
+تقوم عملية الاستيراد بإنشاء **سجلات**، وليس **حقولًا**. يجب أن تكون جميع الحقول التي تريد استيرادها موجودة مسبقًا في نموذج البيانات لديك.
-**Before importing:**
+**قبل الاستيراد:**
-1. Go to **Settings → Data Model**
-2. Select your object
-3. Create any custom fields you need
-4. Note the exact field names (they must match your column headers)
+1. انتقل إلى **الإعدادات → نموذج البيانات**
+2. اختر الكائن الخاص بك
+3. أنشئ أي حقول مخصصة تحتاجها
+4. دوّن أسماء الحقول بدقة (يجب أن تتطابق مع عناوين أعمدتك)
-## Step 7: Final Checklist
+## الخطوة 7: قائمة التحقق النهائية
-Before uploading your file, verify:
+قبل رفع ملفك، تحقّق مما يلي:
-File is CSV, XLSX, or XLS format
-File has fewer than 10,000 records
-Encoding is UTF-8
-No duplicate emails (for People) or domains (for Companies)
-Dates use consistent format throughout
-Domains use `https://domain.com` format
-Boolean fields use `TRUE` or `FALSE` (uppercase)
-Select fields use API names, not display labels
-All custom fields exist in Settings → Data Model
-Parent records imported before child records
-Relation columns reference existing records
+الملف بصيغة CSV أو XLSX أو XLS
+يحتوي الملف على أقل من 10,000 سجل
+الترميز UTF-8
+لا توجد رسائل بريد إلكتروني مكررة (للأشخاص) أو نطاقات (للشركات)
+التواريخ تستخدم تنسيقًا موحدًا طوال الملف
+النطاقات تستخدم الصيغة `https://domain.com`
+الحقول المنطقية تستخدم `TRUE` أو `FALSE` (أحرف كبيرة)
+حقول الاختيار تستخدم أسماء واجهة برمجة التطبيقات، وليس أسماء العرض
+جميع الحقول المخصصة موجودة في الإعدادات → نموذج البيانات
+تم استيراد السجلات الأصلية قبل السجلات الفرعية
+أعمدة العلاقات تشير إلى سجلات موجودة
-## Common Mistakes to Avoid
+## أخطاء شائعة يجب تجنبها
-| Mistake | Solution |
-| -------------------------------------------- | ------------------------------------- |
-| Using `true` instead of `TRUE` | Boolean values must be uppercase |
-| Using display labels for Select fields | Find and use API names in Settings |
-| Importing People before Companies | Always import parent objects first |
-| Missing currency code for Currency fields | Fill both Amount and Currency columns |
-| Wrong domain format | Use `https://domain.com` consistently |
-| Mapping multiple unique fields for relations | Map only ONE (domain OR id, not both) |
+| الخطأ | الحل |
+| ---------------------------------- | ----------------------------------------------------------- |
+| استخدام `true` بدلًا من `TRUE` | يجب أن تكون القيم المنطقية بأحرف كبيرة |
+| استخدام أسماء العرض لحقول الاختيار | اعثر على أسماء واجهة برمجة التطبيقات في الإعدادات واستخدمها |
+| استيراد الأشخاص قبل الشركات | احرص دائمًا على استيراد الكائنات الأصل أولًا |
+| رمز العملة مفقود لحقول العملة | املأ عمودي المبلغ والعملة معًا |
+| تنسيق نطاق غير صحيح | استخدم `https://domain.com` بصورة متسقة |
+| ربط عدة حقول فريدة للعلاقات | اربط حقلًا واحدًا فقط (النطاق أو المعرّف، وليس كليهما) |
## الخطوات التالية
-Your file is ready! Now:
+ملفك جاهز! الآن:
-* [Import Companies](/l/ar/user-guide/data-migration/how-tos/import-companies-via-csv) (import these first)
-* [Import Contacts](/l/ar/user-guide/data-migration/how-tos/import-contacts-via-csv)
-* [Fix any import errors](/l/ar/user-guide/data-migration/how-tos/fix-import-errors)
+* [استيراد الشركات](/l/ar/user-guide/data-migration/how-tos/import-companies-via-csv) (قم باستيرادها أولًا)
+* [استيراد جهات الاتصال](/l/ar/user-guide/data-migration/how-tos/import-contacts-via-csv)
+* [إصلاح أي أخطاء في الاستيراد](/l/ar/user-guide/data-migration/how-tos/fix-import-errors)
diff --git a/packages/twenty-docs/l/ar/user-guide/data-migration/overview.mdx b/packages/twenty-docs/l/ar/user-guide/data-migration/overview.mdx
index 4266ff2216..dacad8f3cf 100644
--- a/packages/twenty-docs/l/ar/user-guide/data-migration/overview.mdx
+++ b/packages/twenty-docs/l/ar/user-guide/data-migration/overview.mdx
@@ -1,5 +1,5 @@
---
-title: ترحيل البيانات},{
+title: Data Migration
description: استيراد وتصدير بيانات CRM عبر ملفات CSV أو عبر API.
image: /images/user-guide/import-export-data/cloud.png
---
diff --git a/packages/twenty-docs/l/ar/user-guide/data-model/how-tos/create-relation-fields.mdx b/packages/twenty-docs/l/ar/user-guide/data-model/how-tos/create-relation-fields.mdx
index a055bb05b1..b94e758037 100644
--- a/packages/twenty-docs/l/ar/user-guide/data-model/how-tos/create-relation-fields.mdx
+++ b/packages/twenty-docs/l/ar/user-guide/data-model/how-tos/create-relation-fields.mdx
@@ -1,60 +1,60 @@
---
title: Create Relation Fields
-description: Step-by-step guide to connecting objects with relation fields.
+description: دليل خطوة بخطوة لربط الكائنات باستخدام حقول العلاقة.
---
-Relation fields connect records from different objects—for example, linking People to Companies.
+تربط حقول العلاقة السجلات من كائنات مختلفة—على سبيل المثال، ربط الأشخاص بالشركات.
- **Relation names cannot be changed after creation** (they affect the API). Plan your names carefully.
+ **لا يمكن تغيير أسماء العلاقات بعد إنشائها** (إذ تؤثر في واجهة برمجة التطبيقات API). خطط لأسماء العلاقات بعناية.
## قبل أن تبدأ
-Decide:
+قرّر:
-* Which objects are you connecting? (e.g., People → Companies)
-* Which is the "one" side? (e.g., Company)
-* Which is the "many" side? (e.g., People — many people work at one company)
-* What should the field be named on each side?
+* ما الكائنات التي تقوم بربطها؟ (مثال: الأشخاص → الشركات)
+* أيّهما جانب "الواحد"؟ (مثال: شركة)
+* أيّهما جانب "المتعدد"؟ (مثال: الأشخاص — يعمل العديد من الأشخاص في شركة واحدة)
+* ما الاسم الذي يجب أن يحمله الحقل في كل جانب؟
-See [Relation Fields](/l/ar/user-guide/data-model/capabilities/relation-fields) for relation types explained.
+راجع [حقول العلاقة](/l/ar/user-guide/data-model/capabilities/relation-fields) لشرح أنواع العلاقات.
-## Steps
+## الخطوات
-1. Go to **Settings → Data Model**
-2. Select the object where you want the relation (typically the "many" side)
-3. Click **+ Add Field**
-4. Select **Relation** as the field type
-5. Choose the **target object**
-6. Select **One-to-Many** or **Many-to-One**
-7. Enter field names for **both sides** of the relation
+1. اذهب إلى **الإعدادات → نموذج البيانات**
+2. حدّد الكائن الذي تريد فيه العلاقة (عادةً جانب "المتعدد")
+3. انقر **+ إضافة حقل**
+4. اختر **علاقة** كنوع الحقل
+5. اختر **الكائن المستهدف**
+6. اختر **واحد إلى متعدد** أو **متعدد إلى واحد**
+7. أدخل أسماء الحقول ل**كلا الجانبين** من العلاقة
8. انقر على **حفظ**
-## Example: People → Companies
+## مثال: الأشخاص → الشركات
-* Go to **Settings → Data Model → People**
-* Add a Relation field
-* Target: **Companies**
-* Type: **Many-to-One**
-* Field on People: **Company**
-* Field on Companies: **Employees**
+* اذهب إلى **الإعدادات → نموذج البيانات → الأشخاص**
+* أضف حقل علاقة
+* الهدف: **الشركات**
+* النوع: **متعدد إلى واحد**
+* الحقل في الأشخاص: **الشركة**
+* الحقل في الشركات: **الموظفون**
-Now each Person can be linked to a Company, and each Company shows its People.
+يمكن الآن ربط كل شخص بشركة، وتعرض كل شركة موظفيها.
-## Deleting a Relation
+## حذف علاقة
-1. Go to **Settings → Data Model**
-2. Find the relation field
-3. Click **⋮ → Deactivate**
+1. اذهب إلى **الإعدادات → نموذج البيانات**
+2. اعثر على حقل العلاقة
+3. انقر **⋮ → إلغاء التنشيط**
-Links are preserved but hidden. Reactivate to restore.
+تظل الروابط محفوظة لكنها مخفية. أعد التنشيط لاستعادتها.
- **Deleting a relation doesn't delete records.** Only the link between them is removed.
+ **حذف العلاقة لا يحذف السجلات.** تتم إزالة الرابط بينهما فقط.
-## Related
+## ذات صلة
-* [Relation Fields](/l/ar/user-guide/data-model/capabilities/relation-fields) — types and limitations
-* [How to Import Relations](/l/ar/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) — bulk import linked records
+* [حقول العلاقة](/l/ar/user-guide/data-model/capabilities/relation-fields) — الأنواع والقيود
+* [كيفية استيراد العلاقات](/l/ar/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) — الاستيراد الدفعي للسجلات المرتبطة
diff --git a/packages/twenty-docs/l/ar/user-guide/data-model/how-tos/customize-your-data-model.mdx b/packages/twenty-docs/l/ar/user-guide/data-model/how-tos/customize-your-data-model.mdx
index 735c586544..c24cf962f2 100644
--- a/packages/twenty-docs/l/ar/user-guide/data-model/how-tos/customize-your-data-model.mdx
+++ b/packages/twenty-docs/l/ar/user-guide/data-model/how-tos/customize-your-data-model.mdx
@@ -1,5 +1,5 @@
---
-title: تخصيص نموذج البيانات الخاص بك},{
+title: Customize Your Data Model
description: نظرة عامة على خيارات تخصيص نموذج البيانات.
---
diff --git a/packages/twenty-docs/l/ar/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx b/packages/twenty-docs/l/ar/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
index 5e83a7ccd9..5d0cd4a2de 100644
--- a/packages/twenty-docs/l/ar/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
+++ b/packages/twenty-docs/l/ar/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
@@ -1,5 +1,5 @@
---
-title: إظهار المبلغ المتوقع في خط سير المبيعات لديك},{
+title: Show Expected Amount in Your Pipeline
description: احسب واعرض قيم الصفقات الموزونة استنادًا إلى احتمال المرحلة.
---
diff --git a/packages/twenty-docs/l/ar/user-guide/workflows/capabilities/workflow-runs.mdx b/packages/twenty-docs/l/ar/user-guide/workflows/capabilities/workflow-runs.mdx
index aeb2115223..25f679edb7 100644
--- a/packages/twenty-docs/l/ar/user-guide/workflows/capabilities/workflow-runs.mdx
+++ b/packages/twenty-docs/l/ar/user-guide/workflows/capabilities/workflow-runs.mdx
@@ -1,92 +1,92 @@
---
title: عمليات تشغيل سير العمل
-description: Monitor and manage workflow executions.
+description: راقِب وأدِر عمليات تنفيذ سير العمل.
image: /images/user-guide/workflows/workflow.png
---
-## About Runs
+## حول عمليات التشغيل
-A **Run** is a record of a workflow execution. Every time a workflow is triggered—whether by a record event, schedule, manual action, or webhook—a new run is created.
+**تشغيل** هو سجل لتنفيذ سير العمل. في كل مرة يتم فيها تشغيل سير عمل—سواءً بواسطة حدث سجل، أو جدول زمني، أو إجراء يدوي، أو خطاف ويب—يتم إنشاء عملية تشغيل جديدة.
-## Viewing Runs
+## عرض عمليات التشغيل
-### From the Workflow Editor
+### من محرر سير العمل
-1. Open the workflow you want to monitor
-2. Click the **Runs** panel on the right side
-3. See a list of recent runs with their status
+1. افتح سير العمل الذي تريد مراقبته
+2. انقر على لوحة **التشغيل** في الجانب الأيمن
+3. اطلع على قائمة بأحدث عمليات التشغيل مع حالتها
-### From the Workflow Runs View
+### من عرض عمليات تشغيل سير العمل
-1. Go to **Workflow Runs** in the sidebar
-2. View runs across all workflows
-3. Filter by status, workflow, or date
+1. انتقل إلى **عمليات تشغيل سير العمل** في الشريط الجانبي
+2. اعرض عمليات التشغيل عبر جميع سير العمل
+3. رشّح حسب الحالة أو سير العمل أو التاريخ
-## Run Statuses
+## حالات التشغيل
-| الحالة | الوصف |
-| ---------------- | ------------------------------------------------------------------------ |
-| **جارٍ التنفيذ** | Workflow is currently executing |
-| **Completed** | Workflow finished successfully |
-| **Failed** | Workflow encountered an error and stopped |
-| **Waiting** | Workflow is paused (e.g., waiting for a Delay action or Form submission) |
+| الحالة | الوصف |
+| ---------------- | ----------------------------------------------------------------- |
+| **جارٍ التنفيذ** | سير العمل قيد التنفيذ حاليًا |
+| **مكتمل** | انتهى سير العمل بنجاح |
+| **فشل** | واجه سير العمل خطأً وتوقّف |
+| **في انتظار** | سير العمل متوقف مؤقتًا (مثال: ينتظر إجراء التأخير أو إرسال نموذج) |
-## Run Details
+## تفاصيل عملية التشغيل
-Click on any run to see:
+انقر على أي عملية تشغيل للاطلاع على:
-* **Status**: Current state of the run
-* **Started at**: When the run began
-* **Duration**: How long the run took
-* **Trigger data**: The input that started the workflow
-* **Step outputs**: Data returned by each step
-* **Error messages**: If the run failed, what went wrong
+* **الحالة**: الوضع الحالي لعملية التشغيل
+* **وقت البدء**: وقت بدء عملية التشغيل
+* **المدة**: الوقت الذي استغرقته عملية التشغيل
+* **بيانات المُشغِّل**: المُدخل الذي بدأ سير العمل
+* **مخرجات الخطوة**: البيانات التي ترجعها كل خطوة
+* **رسائل الخطأ**: إذا فشلت عملية التشغيل، ما الخطأ الذي حدث
-## Step-by-Step Execution
+## تنفيذ خطوة بخطوة
-Each run shows the progression through your workflow:
+تعرض كل عملية تشغيل التقدم خلال سير عملك:
-1. See which steps completed successfully
-2. Identify where failures occurred
-3. View the data passed between steps
-4. Debug issues by examining step inputs and outputs
+1. اطلع على الخطوات التي اكتملت بنجاح
+2. حدّد مواضع حدوث الفشل
+3. اعرض البيانات الممررة بين الخطوات
+4. استكشف المشكلات وأصلحها بفحص مدخلات الخطوات ومخرجاتها
-## Error Handling
+## التعامل مع الأخطاء
-When a run fails:
+عند فشل عملية تشغيل:
-1. Open the failed run
-2. Find the step that caused the failure
-3. Check the error message for details
-4. Common issues:
- * Missing required fields
+1. افتح عملية التشغيل الفاشلة
+2. حدّد الخطوة التي تسببت في الفشل
+3. تحقق من رسالة الخطأ للتفاصيل
+4. مشكلات شائعة:
+ * حقول مطلوبة مفقودة
* تنسيق بيانات غير صالح
- * External API errors
- * Permission issues
+ * أخطاء واجهة برمجة التطبيقات الخارجية
+ * مشكلات الأذونات
-## Re-running Workflows
+## إعادة تشغيل سير العمل
-If a run fails, you can:
+إذا فشلت عملية تشغيل، يمكنك:
-* Fix the underlying issue and wait for the next trigger
-* For manual workflows, trigger again with the same or updated data
-* Review the workflow logic to prevent future failures
+* أصلح المشكلة الأساسية وانتظر المُشغِّل التالي
+* بالنسبة لسير العمل اليدوي، شغّل مرة أخرى باستخدام البيانات نفسها أو بيانات محدَّثة
+* راجع منطق سير العمل لمنع حالات الفشل المستقبلية
-## Performance Tips
+## نصائح الأداء
-### Managing Run History
+### إدارة محفوظات التشغيل
-* Runs are retained for historical reference
-* Very old runs may be archived automatically
-* Export run data if you need to keep records
+* تُحتفظ بعمليات التشغيل كمرجع تاريخي
+* قد تُؤرشف عمليات التشغيل القديمة جدًا تلقائيًا
+* صدّر بيانات التشغيل إذا كنت بحاجة إلى الاحتفاظ بسجلات
-### Monitoring Best Practices
+### أفضل ممارسات المراقبة
-* Check runs regularly after activating new workflows
-* Review failed runs to identify patterns
+* تحقق بانتظام من عمليات التشغيل بعد تفعيل سير عمل جديدة
+* راجع عمليات التشغيل الفاشلة لتحديد الأنماط
-## Related
+## ذات صلة
-* [Workflow Triggers](/l/ar/user-guide/workflows/capabilities/workflow-triggers)
-* [Workflow Actions](/l/ar/user-guide/workflows/capabilities/workflow-actions)
-* [Workflow Troubleshooting](/l/ar/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)
+* [مشغلات سير العمل](/l/ar/user-guide/workflows/capabilities/workflow-triggers)
+* [إجراءات سير العمل](/l/ar/user-guide/workflows/capabilities/workflow-actions)
+* [استكشاف مشكلات سير العمل وإصلاحها](/l/ar/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)
diff --git a/packages/twenty-docs/l/ar/user-guide/workflows/how-tos/need-more-help/professional-services.mdx b/packages/twenty-docs/l/ar/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
index 005a2a3a3c..d31930a93e 100644
--- a/packages/twenty-docs/l/ar/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
+++ b/packages/twenty-docs/l/ar/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
@@ -1,15 +1,15 @@
---
-title: Professional Services
-description: Get professional help building complex workflows and automations from Twenty's team and certified partners.
+title: خدمات احترافية
+description: احصل على مساعدة احترافية لبناء مسارات عمل وأتمتة معقدة من فريق Twenty وشركائه المعتمدين.
---
## متى تحتاج إلى مساعدة احترافية؟
-Consider professional services for:
+فكّر في الاستفادة من الخدمات الاحترافية من أجل:
* تكامل أنظمة متعددة ومعقدة
* منطق الأعمال المتقدم وقواعد الأتمتة
-* Large-scale data processing workflows
+* مسارات عمل لمعالجة البيانات على نطاق واسع
* تطوير واجهة برمجة التطبيقات المخصصة
* تدريب الفريق وتحسين سير العمل
* عندما تكون الموارد الداخلية غير متوفرة
@@ -18,7 +18,7 @@ Consider professional services for:
### حزم الانضمام
-Get help from our core team with our 4-hour [Onboarding packs](https://twenty.com/onboarding-packages):
+احصل على مساعدة من فريقنا الأساسي باستخدام [حزم الانضمام](https://twenty.com/onboarding-packages) لمدة 4 ساعات:
* **إنشاء سير العمل**: بناء سير عمل مخصصة لعمليات عملك
* **تصميم نموذج البيانات**: تحسين هيكل البيانات الخاصة بك لأتمتة سير العمل
@@ -26,4 +26,4 @@ Get help from our core team with our 4-hour [Onboarding packs](https://twenty.co
### شركاء التنفيذ
-Work with certified partners for advanced customizations. Contact us at contact@twenty.com to connect with our [implementation partners](https://twenty.com/partners).
+اعمل مع شركاء معتمدين من أجل تخصيصات متقدمة. تواصل معنا عبر contact@twenty.com للتواصل مع [شركائنا في التنفيذ](https://twenty.com/partners).
diff --git a/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/feature-flags.mdx b/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/feature-flags.mdx
index 1bb5e8640c..75a7ff07f1 100644
--- a/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/feature-flags.mdx
+++ b/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/feature-flags.mdx
@@ -18,7 +18,7 @@ Také jej přidejte do výčtu v `feature-flag.entity.ts`:
```ts
enum FeatureFlagKeys {
- IsFeatureNameEnabled = 'IS_FUNKCEPOVOLENA',
+ IsFeatureNameEnabled = 'IS_FEATURENAME_ENABLED',
...
}
```
diff --git a/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/best-practices-front.mdx b/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
index e1e5da752b..5737188086 100644
--- a/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
+++ b/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
@@ -19,7 +19,7 @@ Je dobrým zvykem vytvořit tolik atomů, kolik potřebujete ke správě stavu.
```tsx
export const myAtomState = atom({
key: 'myAtomState',
- výchozí: 'výchozí hodnota',
+ default: 'default value',
});
export const MyComponent = () => {
@@ -40,7 +40,7 @@ export const MyComponent = () => {
Vyhněte se používání `useRef` k ukládání stavu.
-Pokud chcete ukládat stav, měli byste použít `useState` nebo `useRecoilState`.
+If you want to store state, you should use `useState` or `useRecoilState`.
Podívejte se, jak spravovat překreslení, pokud máte pocit, že potřebujete `useRef`, abyste zabránili některým překreslením.
@@ -56,23 +56,23 @@ Pamatujte, že můžete **vždy** zabránit opakovanému renderování pochopen
Vyhýbání se překreslení v nových funkcích je nyní snadné tím, že je eliminujete na úrovni kořene.
-Komponenta sidecar `PageChangeEffect` obsahuje pouze jedno `useEffect`, kde drží veškerou logiku vykonávanou při změně stránky.
+The `PageChangeEffect` sidecar component contains just one `useEffect` that holds all the logic to execute on a page change.
Tímto způsobem víte, že existuje pouze jedno místo, které může spustit překreslování.
-### Vždy přemýšlejte dvakrát, než přidáte `useEffect` do svého kódu
+### Always think twice before adding `useEffect` in your codebase
-Překreslování je často způsobeno zbytečným `useEffect`.
+Re-renders are often caused by unnecessary `useEffect`.
-Měli byste přemýšlet, zda potřebujete `useEffect`, nebo jestli můžete logiku přesunout do funkce obsluhy událostí.
+You should think whether you need `useEffect`, or if you can move the logic in a event handler function.
-Obecně budete snadno moci přesunout logiku do funkce `handleClick` nebo `handleChange`.
+You'll find it generally easy to move the logic in a `handleClick` or `handleChange` function.
Můžete je také najít v knihovnách jako Apollo: `onCompleted`, `onError` atd.
-### Použijte sourozenou komponentu k extrakci logiky `useEffect` nebo získávání dat
+### Use a sibling component to extract `useEffect` or data fetching logic
-Pokud máte pocit, že potřebujete přidat `useEffect` do svého základního komponentu, měli byste zvážit jeho extrakci do sidecar komponenty.
+If you feel like you need to add a `useEffect` in your root component, you should consider extracting it in a sidecar component.
Stejný postup můžete aplikovat na logiku získávání dat pomocí Apollo hooks.
@@ -168,12 +168,13 @@ Jména proměnných by měla přesně zobrazovat účel nebo funkci proměnné.
Generická jména v programování nejsou ideální, protože postrádají specifikaci, což vede k nejednoznačnosti a snižuje čitelnost kódu. Taková jména neposkytnou informace o účelu proměnné nebo funkce, čímž ztěžují vývojářům pochopení záměru kódu bez hlubšího zkoumání. To může vést ke zvýšené době ladění, vyšší náchylnosti k chybám a obtížím při údržbě a spolupráci. Mezitím, použití popisných jmen činí kód samozřejmým a snadněji navigovatelným, čímž se zvyšuje jeho kvalita a produktivita vývojáře.
```tsx
-// ❌ Špatně, používá generický název, který jasně nekomunikuje svůj účel ani obsah
+// ❌ Bad, uses a generic name that doesn't communicate its
+// purpose or content clearly
const [value, setValue] = useState('');
```
```tsx
-// ✅ Dobře, používá popisný název
+// ✅ Good, uses a descriptive name
const [email, setEmail] = useState('');
```
@@ -186,14 +187,14 @@ const [email, setEmail] = useState('');
Jména obsluhovačů událostí by měla začínat `handle`, zatímco `on` je prefix používaný k pojmenování událostí v komponentech props.
```tsx
-// ❌ Špatně
+// ❌ Bad
const onEmailChange = (val: string) => {
// ...
};
```
```tsx
-// ✅ Dobře
+// ✅ Good
const handleEmailChange = (val: string) => {
// ...
};
@@ -221,12 +222,12 @@ const EmailField = ({ value, disabled = false }: EmailFieldProps) => (
**Použití**
```tsx
-// ❌ Špatně, předání stejné hodnoty jako výchozí nepřidává žádnou hodnotu
+// ❌ Bad, passing in the same value as the default value adds no value
const Form = () => ;
```
```tsx
-// ✅ Dobře, předpokládá výchozí hodnotu
+// ✅ Good, assumes the default value
const Form = () => ;
```
@@ -284,7 +285,7 @@ Při importu, upřednostněte určené aliasy před upřesňováním úplných
**Použití**
```tsx
-// ❌ Špatně, specifikuje celou relativní cestu
+// ❌ Bad, specifies the entire relative path
import {
CatalogDecorator
} from '../../../../../testing/decorators/CatalogDecorator';
@@ -309,10 +310,10 @@ const validationSchema = z
exist: z.boolean(),
email: z
.string()
- .email('Email musí být platný email'),
+ .email('Email must be a valid email'),
password: z
.string()
- .regex(PASSWORD_REGEX, 'Heslo musí obsahovat alespoň 8 znaků'),
+ .regex(PASSWORD_REGEX, 'Password must contain at least 8 characters'),
})
.required();
diff --git a/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
index c9cac72736..f0fe9d5634 100644
--- a/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
+++ b/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -73,7 +73,7 @@ Projekt má čistý a jednoduchý stack s minimálním počtem šablonových kó
[React Router](https://reactrouter.com/) zajišťuje směrování.
-Aby se předešlo zbytečnému [překreslování](/l/cs/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) je veškerá logika směrování v `useEffect` v `PageChangeEffect`.
+To avoid unnecessary [re-renders](/l/cs/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) all the routing logic is in a `useEffect` in `PageChangeEffect`.
### Správa stavu
diff --git a/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/hotkeys.mdx
index 53c860b687..2a566c2cbe 100644
--- a/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/hotkeys.mdx
+++ b/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -45,29 +45,29 @@ const PageListeningEnter = () => {
goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope();
- // 1. Nastavte rozsah klávesových zkratek v useEffect
+ // 1. Set the hotkey scope in a useEffect
useEffect(() => {
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleEnterPage,
);
- // Vraťte se k předchozímu rozsahu klávesových zkratek, když se komponenta odpojí
+ // Revert to the previous hotkey scope when the component is unmounted
return () => {
goBackToPreviousHotkeyScope();
};
}, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
- // 2. Použijte hook useScopedHotkeys
+ // 2. Use the useScopedHotkeys hook
useScopedHotkeys(
Key.Enter,
() => {
- // Nějaká logika vykonaná na této stránce, když uživatel stiskne Enter
+ // Some logic executed on this page when the user presses Enter
// ...
},
ExampleHotkeyScopes.ExampleEnterPage,
);
- return Moje stránka, která poslouchá Enter
;
+ return My page that listens for Enter
;
};
```
@@ -87,7 +87,7 @@ const ExamplePageWithModal = () => {
} = usePreviousHotkeyScope();
const handleOpenModalClick = () => {
- // 1. Nastavte rozsah klávesových zkratek, když uživatel otevře modal
+ // 1. Set the hotkey scope when user opens the modal
setShowModal(true);
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleModal,
@@ -95,14 +95,14 @@ const ExamplePageWithModal = () => {
};
const handleModalClose = () => {
- // 1. Vraťte se k předchozímu rozsahu klávesových zkratek, když se modal zavře
+ // 1. Revert to the previous hotkey scope when the modal is closed
setShowModal(false);
goBackToPreviousHotkeyScope();
};
return
-
Moje stránka s modálem
- Otevřít modal
+ My page with a modal
+ Open modal
{showModal && }
;
};
@@ -112,9 +112,9 @@ Pak v komponentě modalu :
```tsx
const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
- // 2. Použijte hook useScopedHotkeys k poslouchání Escape.
- // Všimněte si, že escape je běžná klávesová zkratka, kterou může použít mnoho jiných komponent
- // Je tedy důležité používat rozsah klávesových zkratek, aby se předešlo konfliktům
+ // 2. Use the useScopedHotkeys hook to listen for Escape.
+ // Note that escape is a common hotkey that could be used by many other components
+ // So it's important to use a hotkey scope to avoid conflicts
useScopedHotkeys(
Key.Escape,
() => {
@@ -123,13 +123,13 @@ const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
ExampleHotkeyScopes.ExampleModal,
);
- return Moje komponenta modalu
;
+ return My modal component
;
};
```
-Je důležité používat tento vzor, když si nejste jisti, že samotné použití useEffect pro nastavení a odebrání bude dostatečné k zabránění konfliktům.
+It's important to use this pattern when you're not sure that just using a useEffect with mount/unmount will be enough to avoid conflicts.
-Tyto konflikty mohou být těžké ladit a mohou se vyskytovat častěji než ne u useEffects.
+Those conflicts can be hard to debug, and it might happen more often than not with useEffects.
## Co je to hotkey scope?
@@ -143,20 +143,20 @@ Například rozsahy klávesových zkratek pro každou stránku jsou definovány
```tsx
export enum PageHotkeyScope {
- Nastavení = 'settings',
- VytvořitPracovníProstor = 'create-workspace',
- PřihlášeníRegistrace = 'sign-in-up',
- VytvořitProfil = 'create-profile',
- PožadovánoPlán = 'plan-required',
- ZobrazitStránku = 'show-page',
- OsobníZobrazitStránku = 'person-show-page',
- FiremníZobrazitStránku = 'company-show-page',
- FirmyStránka = 'companies-page',
- LidéStránka = 'people-page',
- PříležitostiStránka = 'opportunities-page',
- ProfilStránka = 'profile-page',
- ČlenPracovníhoProstoruStránka = 'workspace-member-page',
- ÚkolStránka = 'task-page',
+ Settings = 'settings',
+ CreateWorkspace = 'create-workspace',
+ SignInUp = 'sign-in-up',
+ CreateProfile = 'create-profile',
+ PlanRequired = 'plan-required',
+ ShowPage = 'show-page',
+ PersonShowPage = 'person-show-page',
+ CompanyShowPage = 'company-show-page',
+ CompaniesPage = 'companies-page',
+ PeoplePage = 'people-page',
+ OpportunitiesPage = 'opportunities-page',
+ ProfilePage = 'profile-page',
+ WorkspaceMemberPage = 'workspace-member-page',
+ TaskPage = 'task-page',
}
```
diff --git a/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/style-guide.mdx b/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/style-guide.mdx
index 35a95c6b21..8380443b28 100644
--- a/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/style-guide.mdx
+++ b/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/style-guide.mdx
@@ -21,16 +21,16 @@ Vždy používejte funkcionální komponenty TSX.
Nepoužívejte implicitní `import` s `const`, protože je obtížnější číst a importovat s automatickým dokončováním kódu.
```tsx
-// ❌ Špatné, obtížnější číst a importovat s automatickým doplňkem kódu
+// ❌ Bad, harder to read, harder to import with code completion
const MyComponent = () => {
- return Ahoj světe
;
+ return Hello World
;
};
export default MyComponent;
-// ✅ Dobré, snadné čtení a import s automatickým dokončováním kódu
+// ✅ Good, easy to read, easy to import with code completion
export function MyComponent() {
- return Ahoj světe
;
+ return Hello World
;
};
```
@@ -41,25 +41,25 @@ Create the type of the props and call it `(ComponentName)Props` if there's no ne
Use props destructuring.
```tsx
-// ❌ Špatné, žádný typ
-export const MyComponent = (props) => Ahoj {props.name}
;
+// ❌ Bad, no type
+export const MyComponent = (props) => Hello {props.name}
;
-// ✅ Dobré, typ
+// ✅ Good, type
type MyComponentProps = {
name: string;
};
-export const MyComponent = ({ name }: MyComponentProps) => Ahoj {name}
;
+export const MyComponent = ({ name }: MyComponentProps) => Hello {name}
;
```
#### Upusťte od používání `React.FC` nebo `React.FunctionComponent` k definování typů rekvizit
```tsx
-/* ❌ - Špatné, definuje anotace typů komponent s `FC`
- * - S `React.FC` komponent implicitně přijímá rekvizitu `children`
- * i když není definována v typu rekvizity. To nemusí být vždy
- * žádoucí, zejména pokud komponenta nemá v úmyslu vykreslovat
- * podřízené komponenty.
+/* ❌ - Bad, defines the component type annotations with `FC`
+ * - With `React.FC`, the component implicitly accepts a `children` prop
+ * even if it's not defined in the prop type. This might not always be
+ * desirable, especially if the component doesn't intend to render
+ * children.
*/
const EmailField: React.FC<{
value: string;
@@ -86,7 +86,7 @@ const EmailField = ({ value }: EmailFieldProps) => (
Avoid using single variable prop spreading in JSX elements, like `{...props}`. Tato praxe často vede k tomu, že kód je méně čitelný a obtížnější udržovat, protože není jasné, které rekvizity komponenta přijímá.
```tsx
-/* ❌ - Špatné, šíří jedinou proměnnou prop do základní komponenty
+/* ❌ - Bad, spreads a single variable prop into the underlying component
*/
const MyComponent = (props: OwnProps) => {
return ;
@@ -137,12 +137,12 @@ onClick?.();
Vždy používejte `type` místo `interface`, protože se téměř vždy překrývají a `type` je flexibilnější.
```tsx
-// ❌ Špatné
+// ❌ Bad
interface MyInterface {
name: string;
}
-// ✅ Dobré
+// ✅ Good
type MyType = {
name: string;
};
@@ -155,7 +155,7 @@ type MyType = {
Proč TypeScript doporučuje vyhnout se výčtům zjistíte [zde](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
```tsx
-// ❌ Špatné, využívá výčet
+// ❌ Bad, utilizes an enum
enum Color {
Red = "red",
Green = "green",
@@ -263,13 +263,13 @@ const StyledButton = styled.button`
Vyhýbejte se typovým importům. K prosazení tohoto standardu pravidlo ESLint kontroluje a hlásí jakékoli typové importy. To pomáhá udržovat konzistenci a čitelnost v TypeScript kódu.
```tsx
-// ❌ Špatné
+// ❌ Bad
import { type Meta, type StoryObj } from '@storybook/react';
-// ❌ Špatné
+// ❌ Bad
import type { Meta, StoryObj } from '@storybook/react';
-// ✅ Dobré
+// ✅ Good
import { Meta, StoryObj } from '@storybook/react';
```
diff --git a/packages/twenty-docs/l/cs/twenty-ui/input/checkbox.mdx b/packages/twenty-docs/l/cs/twenty-ui/input/checkbox.mdx
index 713fbaca44..447b3c598b 100644
--- a/packages/twenty-docs/l/cs/twenty-ui/input/checkbox.mdx
+++ b/packages/twenty-docs/l/cs/twenty-ui/input/checkbox.mdx
@@ -15,17 +15,17 @@ Používané, když uživatel potřebuje vybrat více hodnot z několika možnos
import { Checkbox } from "twenty-ui/display";
export const MyComponent = () => {
- return (
- console.log("onChange function fired")}
- onCheckedChange={() => console.log("onCheckedChange function fired")}
- variant="primary"
- size="small"
- shape="squared"
- />
- );
+ return (
+ console.log("onChange function fired")}
+ onCheckedChange={() => console.log("onCheckedChange function fired")}
+ variant="primary"
+ size="small"
+ shape="squared"
+ />
+ );
};
```
diff --git a/packages/twenty-docs/l/cs/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/cs/twenty-ui/navigation/breadcrumb.mdx
index 0b32596f2f..04e8a7d904 100644
--- a/packages/twenty-docs/l/cs/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/cs/twenty-ui/navigation/breadcrumb.mdx
@@ -17,10 +17,10 @@ Zobrazuje drobečkovou navigační lištu.
export const MyComponent = () => {
const breadcrumbLinks = [
- { children: "Domů", href: "/" },
- { children: "Kategorie", href: "/category" },
- { children: "Podkategorie", href: "/category/subcategory" },
- { children: "Aktuální stránka" },
+ { children: "Home", href: "/" },
+ { children: "Category", href: "/category" },
+ { children: "Subcategory", href: "/category/subcategory" },
+ { children: "Current Page" },
];
return (
diff --git a/packages/twenty-docs/l/cs/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/cs/twenty-ui/navigation/links.mdx
index ea3e720205..ebe45c4c1d 100644
--- a/packages/twenty-docs/l/cs/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/cs/twenty-ui/navigation/links.mdx
@@ -19,21 +19,21 @@ Stylizovaná komponenta odkazu pro zobrazení kontaktních informací.
import { ContactLink } from 'twenty-ui/navigation';
export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log('Odkaz na kontakt kliknut!', event);
- };
+ const handleLinkClick = (event) => {
+ console.log('Contact link clicked!', event);
+ };
- return (
-
-
- example@example.com
-
-
- );
+ return (
+
+
+ example@example.com
+
+
+ );
};
```
@@ -59,18 +59,19 @@ Stylizovaná komponenta odkazu pro zobrazení odkazů.
import { BrowserRouter as Router } from "react-router-dom";
export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Odkaz na kontakt kliknut!", event);
- };
+ const handleLinkClick = (event) => {
+ console.log("Contact link clicked!", event);
+ };
- return (
-
-
- Kontaktujte nás
-
-
- );
+ return (
+
+
+ Contact Us
+
+
+ );
};
+
```
@@ -95,17 +96,17 @@ Zaobleně stylizovaný odkaz s komponentou Chip pro odkazy.
import { BrowserRouter as Router } from "react-router-dom";
export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Odkaz na kontakt kliknut!", event);
- };
+ const handleLinkClick = (event) => {
+ console.log("Contact link clicked!", event);
+ };
- return (
-
-
- Kontaktujte nás
-
-
- );
+ return (
+
+
+ Contact Us
+
+
+ );
};
```
@@ -130,14 +131,14 @@ Stylizované sociální odkazy s podporou různých typů sociálních odkazů,
import { BrowserRouter as Router } from "react-router-dom";
export const MyComponent = () => {
- return (
-
-
-
- );
+ return (
+
+
+
+ );
};
```
diff --git a/packages/twenty-docs/l/cs/twenty-ui/navigation/menu-item.mdx b/packages/twenty-docs/l/cs/twenty-ui/navigation/menu-item.mdx
index c3a6eab483..8a3d25ba73 100644
--- a/packages/twenty-docs/l/cs/twenty-ui/navigation/menu-item.mdx
+++ b/packages/twenty-docs/l/cs/twenty-ui/navigation/menu-item.mdx
@@ -199,7 +199,7 @@ A multi-select menu item with an avatar, a checkbox for selection, and textual c
return (
}
- text="První možnost"
+ text="First Option"
selected={false}
className
/>
@@ -231,13 +231,13 @@ Položka menu s volitelnou levou ikonou, textovým obsahem a ikonou šipky vprav
export const MyComponent = () => {
const handleNavigation = () => {
- console.log("Přejít na jinou stránku");
+ console.log("Navigate to another page");
};
return (
@@ -268,13 +268,13 @@ Výběrová položka menu, s volitelným levým obsahem (ikonou a textem) a indi
export const MyComponent = () => {
const handleSelection = () => {
- console.log("Položka menu byla vybrána");
+ console.log("Menu item selected");
};
return (
{
- console.log("Položka menu vybrána");
+ console.log("Menu item selected");
};
return (
}
- text="První možnost"
+ text="First Option"
selected={true}
disabled={false}
hovered={false}
@@ -358,7 +358,7 @@ Volitelná položka menu s ukázkou barvy pro situace, kdy chcete, aby uživatel
export const MyComponent = () => {
const handleSelection = () => {
- console.log("Položka menu vybrána");
+ console.log("Menu item selected");
};
return (
@@ -405,7 +405,7 @@ Položka menu s přidruženým přepínačem k umožnění nebo zakázání urč
return (
console.log("Domů kliknuto"),
+ onClick: () => console.log("Home clicked"),
},
{
name: "Profile",
Icon: IconUser,
- onClick: () => console.log("Profil kliknuto"),
+ onClick: () => console.log("Profile clicked"),
},
{
name: "Settings",
Icon: IconSettings,
- onClick: () => console.log("Nastavení kliknuto"),
+ onClick: () => console.log("Settings clicked"),
},
];
diff --git a/packages/twenty-docs/l/cs/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/cs/twenty-ui/navigation/step-bar.mdx
index 227ff3c15a..e080d90dae 100644
--- a/packages/twenty-docs/l/cs/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/cs/twenty-ui/navigation/step-bar.mdx
@@ -17,9 +17,9 @@ Zobrazuje postup přes sekvenci číslovaných kroků zvýrazněním aktuálníh
export const MyComponent = () => {
return (
- Krok 1
- Krok 2
- Krok 3
+ Step 1
+ Step 2
+ Step 3
);
};
diff --git a/packages/twenty-docs/l/cs/user-guide/billing/overview.mdx b/packages/twenty-docs/l/cs/user-guide/billing/overview.mdx
index dd2219f27e..5db7137159 100644
--- a/packages/twenty-docs/l/cs/user-guide/billing/overview.mdx
+++ b/packages/twenty-docs/l/cs/user-guide/billing/overview.mdx
@@ -1,6 +1,6 @@
---
title: Fakturace
-description: Understand Twenty pricing and manage your subscription.
+description: Seznamte se s cenami Twenty a spravujte své předplatné.
image: /images/user-guide/setup/pricing.png
---
@@ -8,38 +8,38 @@ image: /images/user-guide/setup/pricing.png
-Twenty offers flexible pricing plans to fit your team's needs. Manage your subscription, track workflow credits, and access invoices all from **Settings → Billing**.
+Twenty nabízí flexibilní cenové plány, které vyhoví potřebám vašeho týmu. Spravujte své předplatné, sledujte kredity pracovních postupů a přistupujte k fakturám — to vše v **Nastavení → Fakturace**.
-## What's in this section
+## Co najdete v této sekci
-
- Learn about Twenty's pricing plans and what's included.
+
+ Zjistěte více o cenových plánech Twenty a o tom, co je zahrnuto.
-
- Frequently asked questions about pricing and billing.
+
+ Nejčastější dotazy k cenám a fakturaci.
-## At a glance
+## Stručný přehled
-| Plán | Key Features |
-| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| **Free (Self-Hosted)** | All Pro features, community support |
-| **Pro (Cloud)** | Everything apart from the Premium features (SSO and row-level permissions), standard support |
-| **Organization (Cloud)** | All from Pro + the Premium features (SSO and row-level permissions), priority support |
-| **Organization (Self-Hosted)** | All from Pro + the Premium features (SSO, row-level permissions), Twenty team support, not required to publish your custom code as open-source before distributing |
+| Plán | Klíčové funkce |
+| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Zdarma (vlastní hosting)** | Všechny funkce Pro, podpora komunity |
+| **Pro (Cloud)** | Vše kromě funkcí Premium (SSO a oprávnění na úrovni řádků), standardní podpora |
+| **Organizace (Cloud)** | Vše z Pro + funkce Premium (SSO a oprávnění na úrovni řádků), prioritní podpora |
+| **Organizace (vlastní hosting)** | Vše z Pro + funkce Premium (SSO, oprávnění na úrovni řádků), podpora týmu Twenty, není vyžadováno publikování vašeho vlastního kódu jako open-source před distribucí |
-## Quick answers
+## Rychlé odpovědi
-**Where do I manage billing?**
-Go to **Settings → Billing** to view your plan, update payment methods, and access invoices.
+**Kde spravuji fakturaci?**
+Přejděte do **Nastavení → Fakturace**, kde uvidíte svůj plán, aktualizujete platební metody a získáte přístup k fakturám.
-**Can I use Twenty for free?**
-Yes! Self-host Twenty and get all Pro features at no cost.
+**Mohu používat Twenty zdarma?**
+Ano! Hostujte Twenty sami a získejte všechny funkce Pro zdarma.
-**How do I upgrade?**
-Go to **Settings → Billing** and click **Switch to Organization** or **Switch to Yearly**.
+**Jak provedu upgrade?**
+Přejděte do **Nastavení → Fakturace** a klikněte na **Přepnout na Organizaci** nebo **Přepnout na Roční**.
-For more questions, see the [Billing FAQ](/l/cs/user-guide/billing/how-tos/billing-faq).
+Další otázky najdete v [FAQ k fakturaci](/l/cs/user-guide/billing/how-tos/billing-faq).
diff --git a/packages/twenty-docs/l/cs/user-guide/calendar-emails/capabilities/calendar.mdx b/packages/twenty-docs/l/cs/user-guide/calendar-emails/capabilities/calendar.mdx
index 7219da8969..960def2fa9 100644
--- a/packages/twenty-docs/l/cs/user-guide/calendar-emails/capabilities/calendar.mdx
+++ b/packages/twenty-docs/l/cs/user-guide/calendar-emails/capabilities/calendar.mdx
@@ -1,19 +1,19 @@
---
title: Kalendář
-description: Understanding calendar integration features in Twenty.
+description: Přehled funkcí integrace kalendáře v Twenty.
---
-**Note**: To connect your calendar and configure sync settings, visit [Email & Calendar Setup](/l/cs/user-guide/calendar-emails/overview).
+**Poznámka**: Chcete-li připojit svůj kalendář a konfigurovat nastavení synchronizace, navštivte [Nastavení Emailu a Kalendáře](/l/cs/user-guide/calendar-emails/overview).
-## How Calendar Integration Works
+## Jak funguje integrace kalendáře
-Twenty automatically syncs your calendar events and links them to the relevant CRM records, giving you a complete view of your meeting history with contacts and companies.
+Twenty automaticky synchronizuje vaše události v kalendáři a propojuje je s příslušnými záznamy v CRM, čímž poskytuje úplný přehled o historii vašich schůzek s kontakty a společnostmi.
## Záložka kalendáře
-Next to the Emails tab on records, you'll find a `Calendar` tab that contains the history of meetings scheduled with the record.
+Vedle záložky Emailů na záznamech najdete záložku `Kalendář`, která obsahuje historii naplánovaných schůzek se záznamem.
-### Available For
+### Dostupné pro
* **Osoby**: Prohlédněte si všechny naplánované schůzky s konkrétním kontaktem
* **Společnosti**: Zobrazte si všechny schůzky týkající se společnosti a jejích zaměstnanců
@@ -26,18 +26,18 @@ Next to the Emails tab on records, you'll find a `Calendar` tab that contains th
3. **Procházení historie schůzek**: Zobrazte si všechny naplánované schůzky a jejich detaily
4. **Přístup k detailům schůzek**: Zobrazte si účastníky schůzek, časy a související informace
-## Visibility Settings
+## Nastavení viditelnosti
-Calendar data follows the same visibility settings as emails, ensuring consistent privacy controls across both communication channels.
+Údaje kalendáře se řídí stejným nastavením viditelnosti jako emaily, což zajišťuje konzistentní kontrolu soukromí napříč oběma komunikačními kanály.
## Co se synchronizuje
-* **External Meetings**: All meetings with contacts outside your organization
-* **Automatic Linking**: Meetings connect to existing People and Company records based on attendee email addresses
-* **Meeting Details**: Subject, time, duration, and participants
-* **Updates**: New calendar events sync automatically
+* **Externí schůzky**: Všechny schůzky s kontakty mimo vaši organizaci
+* **Automatické propojení**: Schůzky se propojí s existujícími záznamy Osoby a Společnosti na základě emailových adres účastníků
+* **Podrobnosti schůzky**: Předmět, čas, délka a účastníci
+* **Aktualizace**: Nové události v kalendáři se synchronizují automaticky
## Co se nesynchronizuje
-* **Internal Meetings**: Meetings with only colleagues (same domain) remain private
-* **Private Events**: Events marked as private in your calendar
+* **Interní schůzky**: Schůzky pouze s kolegy (stejná doména) zůstávají soukromé
+* **Soukromé události**: Události označené jako soukromé ve vašem kalendáři
diff --git a/packages/twenty-docs/l/cs/user-guide/dashboards/how-tos/dashboards-faq.mdx b/packages/twenty-docs/l/cs/user-guide/dashboards/how-tos/dashboards-faq.mdx
index f0f017cb94..9c4e0c7335 100644
--- a/packages/twenty-docs/l/cs/user-guide/dashboards/how-tos/dashboards-faq.mdx
+++ b/packages/twenty-docs/l/cs/user-guide/dashboards/how-tos/dashboards-faq.mdx
@@ -1,59 +1,59 @@
---
-title: Dashboards FAQ
-description: Frequently asked questions about dashboards in Twenty.
+title: Nejčastější dotazy k panelům
+description: Nejčastější dotazy k panelům v Twenty.
---
-
- No, dashboards are currently visible to everyone with access to your Twenty workspace. Private dashboards are not yet available.
+
+ Ne, panely jsou nyní viditelné pro všechny, kteří mají přístup do vašeho pracovního prostoru Twenty. Soukromé panely zatím nejsou k dispozici.
-
- Dashboards currently display data based on the viewer's timezone. If you're in different regions (e.g., APAC vs. US), you may see slightly different numbers for the same dashboard. We're working on adding a timezone setting per dashboard to ensure consistent data across teams.
+
+ Panely v současnosti zobrazují data podle časového pásma uživatele, který je prohlíží. Pokud jste v různých regionech (např. APAC vs. USA), můžete u stejného panelu vidět mírně odlišná čísla. Pracujeme na přidání nastavení časového pásma pro každý panel, aby byla data napříč týmy konzistentní.
-
- Exporting dashboards is not available at the moment. This feature is on our roadmap.
+
+ Export panelů není v tuto chvíli k dispozici. Tato funkce je v našem plánu.
-
- No, sharing dashboards with users outside your Twenty workspace (non-Twenty users) is not currently supported.
+
+ Ne, sdílení panelů s uživateli mimo váš pracovní prostor Twenty (uživatelé mimo Twenty) zatím není podporováno.
-
- Open the dashboard you want to favorite, then click the star icon. Favorites are personal—they won't affect other users.
+
+ Otevřete panel, který chcete přidat mezi oblíbené, a klikněte na ikonu hvězdy. Oblíbené jsou osobní — neovlivní ostatní uživatele.
-
- * **Tabs** organize your dashboard into sections (like pages within the dashboard)
- * **Widgets** are the individual visualizations (charts, numbers, iFrames) within each tab
+
+ * **Karty** organizují váš panel do sekcí (jako stránky v rámci panelu)
+ * **Widgety** jsou jednotlivé vizualizace (grafy, čísla, iFramy) v rámci každé karty
- Structure: Dashboard → Tabs → Widgets
+ Struktura: Panel → Karty → Widgety
-
- Bar charts have display limits: 100 bars for horizontal charts, 50 for vertical. If your data exceeds this, add filters to narrow down the results or change the grouping (e.g., group by week instead of day).
+
+ Sloupcové grafy mají limity zobrazení: 100 sloupců pro vodorovné grafy, 50 pro svislé. Pokud vaše data tento limit překročí, přidejte filtry pro zúžení výsledků nebo změňte seskupení (např. seskupovat podle týdne namísto dne).
-
- Dashboard-level filters are not available yet, but this feature is on our roadmap. Currently, you need to apply filters to each widget individually.
+
+ Filtry na úrovni panelu zatím nejsou k dispozici, ale tato funkce je v našem plánu. Momentálně musíte filtry aplikovat na každý widget zvlášť.
-
- Ještě ne. Gauge charts and tables are on our roadmap and will be added in a future release.
+
+ Ještě ne. Ukazatelové grafy a tabulky jsou v našem plánu a budou přidány v některé z budoucích verzí.
-
- 1. Make sure you're in view mode (not editing)
- 2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
- 3. Select **Duplicate dashboard**
+
+ 1. Ujistěte se, že jste v režimu zobrazení (nikoli v režimu úprav)
+ 2. Otevřete příkazovou lištu pomocí **Cmd + K** (nebo **Ctrl + K** ve Windows)
+ 3. Vyberte **Duplikovat panel**
-
- Widgets update automatically as your CRM data changes:
+
+ Widgety se aktualizují automaticky, jakmile se změní vaše data v CRM:
- * Real-time updates for most metrics
- * Use the refresh button for a manual update if needed
- * Historical data is preserved for trend analysis
+ * Aktualizace v reálném čase pro většinu metrik
+ * V případě potřeby použijte tlačítko pro obnovení k ruční aktualizaci
+ * Historická data jsou zachována pro analýzu trendů
diff --git a/packages/twenty-docs/l/cs/user-guide/data-migration/capabilities/field-mapping.mdx b/packages/twenty-docs/l/cs/user-guide/data-migration/capabilities/field-mapping.mdx
index e4b4bd2f6b..2810a160a3 100644
--- a/packages/twenty-docs/l/cs/user-guide/data-migration/capabilities/field-mapping.mdx
+++ b/packages/twenty-docs/l/cs/user-guide/data-migration/capabilities/field-mapping.mdx
@@ -1,176 +1,176 @@
---
-title: Field Mapping
-description: How field mapping works during data import.
+title: Mapování polí
+description: Jak funguje mapování polí při importu dat.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-## How Field Mapping Works
+## Jak funguje mapování polí
-When you upload a file, Twenty analyzes your columns and attempts to match them to existing fields.
+Když nahrajete soubor, Twenty analyzuje vaše sloupce a pokusí se je spárovat s existujícími poli.
-### Automatic Mapping
+### Automatické mapování
-Twenty tries to match columns based on:
+Twenty se snaží spárovat sloupce na základě:
-* Column header names (exact or similar matches)
-* Data type detection (dates, numbers, emails)
-* Common field patterns
+* Názvů záhlaví sloupců (přesné nebo podobné shody)
+* Detekce typů dat (datumů, čísel, e‑mailů)
+* Běžné vzory polí
-**Quick tip:** Export a few rows from the object you want to import. The exported file will have the exact column names Twenty expects, making automatic mapping seamless during import.
+**Rychlý tip:** Exportujte několik řádků z objektu, který chcete importovat. Exportovaný soubor bude mít přesně takové názvy sloupců, jaké Twenty očekává, což při importu usnadní automatické mapování.
-### Manual Mapping Options
+### Možnosti ručního mapování
-For each column, you can:
+U každého sloupce můžete:
-* **Map to a field**: Select the matching Twenty field from a dropdown
-* **Do not map**: Skip the column entirely (data won't be imported)
+* **Namapovat na pole**: Vyberte odpovídající pole Twenty z rozbalovací nabídky
+* **Nemapovat**: Sloupec úplně přeskočte (data nebudou importována)
-**Fields must exist before import.** The import creates records, not fields. Create custom fields under **Settings → Data Model** before importing.
+**Pole musí existovat před importem.** Import vytváří záznamy, nikoli pole. Vytvořte vlastní pole v **Nastavení → Datový model** před importem.
-## Field Type Compatibility
+## Kompatibilita typů polí
-All field types available in the Data Model are supported for import.
+Všechny typy polí dostupné v Datovém modelu jsou pro import podporovány.
-You can also import `id` values to either assign a specific ID to new records or update existing ones.
+Můžete také importovat hodnoty `id` a přiřadit konkrétní ID novým záznamům nebo aktualizovat stávající.
-## Data Format Requirements
+## Požadavky na formát dat
-**Some fields have special syntax.** We recommend downloading the sample file before preparing your import to see the expected syntax for each field type.
+**Některá pole mají speciální syntaxi.** Před přípravou importu doporučujeme stáhnout ukázkový soubor, abyste viděli očekávanou syntaxi pro každý typ pole.
-### Address Fields
+### Adresová pole
-Address is a nested field with multiple columns. Some can be left empty.
+Adresa je vnořené pole s více sloupci. Některé lze ponechat prázdné.
-* **Address / Address 1**: Street address line 1
-* **Address / Address 2**: Street address line 2
-* **Address / City**: City name
-* **Address / State**: State or province
-* **Address / Country**: Country name
-* **Address / Post Code**: Postal/ZIP code
+* **Adresa / Adresa 1**: První řádek adresy (ulice)
+* **Adresa / Adresa 2**: Druhý řádek adresy (ulice)
+* **Adresa / Město**: Název města
+* **Adresa / Stát**: Stát nebo provincie
+* **Adresa / Země**: Název země
+* **Adresa / PSČ**: Poštovní směrovací číslo
-### Array Fields
+### Pole typu Array
-Use the following format:
+Použijte následující formát:
```
-["value1","value2"]
+[\"value1\",\"value2\"]
```
-### Boolean Fields
+### Booleovská pole
-Use `TRUE` or `FALSE` (uppercase) - not `true` or `false`
+Použijte `TRUE` nebo `FALSE` (velkými písmeny) – ne `true` ani `false`
-### Currency Fields
+### Měnová pole
-Currency is a nested field with two columns that **both must be filled**:
+Měna je vnořené pole se dvěma sloupci, které je nutné **vyplnit obě**:
-* **Amount / Amount**: The numeric value (e.g., `1234.56`)
-* **Amount / Currency**: The currency code (e.g., `USD`, `EUR`)
+* **Částka / Částka**: Číselná hodnota (např. `1234.56`)
+* **Částka / Měna**: Kód měny (např. `USD`, `EUR`)
-### Date Fields
+### Datumová pole
-Supported formats:
+Podporované formáty:
-* `YYYY-MM-DD` (recommended)
+* `YYYY-MM-DD` (doporučeno)
* `MM/DD/YYYY`
* `DD/MM/YYYY`
-* ISO 8601 format
+* Formát ISO 8601
-### Domain Fields
+### Doménová pole
-* It is recommended to use the format `https://domain.com` to avoid creating duplicates, as this is the format used for Companies created by the mailbox and calendar synchronizations
-* A `Domain Label` and `Domain URL` can be filled: best practice is to fill `domain.com` in the label and `https://domain.com` in the url
-* Domains must be unique within the Companies object
-* **Domains must be unique within the file to import**
+* Doporučujeme používat formát `https://domain.com`, abyste předešli vytváření duplicit, protože tento formát se používá u Společností vytvořených synchronizací poštovní schránky a kalendáře
+* Lze vyplnit `Domain Label` a `Domain URL`: osvědčený postup je zadat do popisku `domain.com` a do URL `https://domain.com`
+* Domény musí být v objektu Společnosti jedinečné
+* **Domény musí být jedinečné v rámci importovaného souboru**
-### Email Fields
+### E‑mailová pole
-* Must be valid email format
-* Emails must be unique within the People object
-* **Emails must be unique within the file to import**
-* For additional emails: use **Emails / Primary Email** for the main email, and **Emails / Additional Emails** with this format:
+* Musí mít platný formát e‑mailu
+* E‑maily musí být v objektu Osoby jedinečné
+* **E‑maily musí být jedinečné v rámci importovaného souboru**
+* Pro další e‑maily: použijte **E‑maily / Primární e‑mail** pro hlavní e‑mail a **E‑maily / Další e‑maily** v tomto formátu:
```
-["jane@twenty.com","jane.doe@twenty.com"]
+[\"jane@twenty.com\",\"jane.doe@twenty.com\"]
```
-### Id Fields
+### Pole ID
-Specifying an `id` during import is optional. Twenty auto-generates one if not provided.
+Zadání `id` při importu je volitelné. Pokud není uvedeno, Twenty jej automaticky vygeneruje.
-Use cases for mapping an `id` column:
+Příklady použití mapování sloupce `id`:
-* **Set a specific ID**: Choose the UUID for newly created records
-* **Update existing records**: Match against existing records to update them instead of creating duplicates. In that case, it is recommended to not map the other unique fields: mapping only one unique field ensures a smoother import.
+* **Nastavit konkrétní ID**: Zvolte UUID pro nově vytvářené záznamy
+* **Aktualizovat existující záznamy**: Spárujte je s existujícími záznamy, abyste je aktualizovali místo vytváření duplicit. V takovém případě doporučujeme nemapovat další jedinečná pole: mapování pouze jednoho jedinečného pole zajistí hladší import.
-If you provide an `id`, it must be in UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
+Pokud zadáte `id`, musí být ve formátu UUID (např. `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
-### JSON Fields
+### Pole JSON
-Use valid JSON format:
+Použijte platný formát JSON:
```
{"key":"value","key2":"value2"}
```
-### Links Fields
+### Pole odkazů
-Similar to Domain fields:
+Podobně jako u doménových polí:
-* Fill both the label and URL columns: **Links / Link URL** and **Links / Link Label**
-* Use full URL format: `https://example.com`
-* For secondary links, use **Links / Secondary Links** column with this format:
+* Vyplňte oba sloupce s popiskem a adresou URL: **Odkazy / URL odkazu** a **Odkazy / Popisek odkazu**
+* Použijte úplný formát URL: `https://example.com`
+* Pro sekundární odkazy použijte sloupec **Odkazy / Sekundární odkazy** v tomto formátu:
```
-[{"url":"https://twenty.com","label":"Twenty"}]
+[{\"url\":\"https://twenty.com\",\"label\":\"Twenty\"}]
```
-### Multi-Select Fields
+### Pole s vícenásobným výběrem
-Use the **API names** (not the display labels) in the following format:
+Použijte **názvy API** (nikoli zobrazované popisky) v následujícím formátu:
```
-["VALUE1","VALUE2"]
+[\"VALUE1\",\"VALUE2\"]
```
-See [here](#finding-api-names-for-select-fields) where to find the API names.
+Viz [zde](#finding-api-names-for-select-fields), kde najdete názvy API.
-New select options will not be created automatically by the import. They must be added under **Settings → Data Model** before importing.
+Nové možnosti výběru se importem automaticky nevytvoří. Před importem je musíte přidat v **Nastavení → Datový model**.
- **Import overwrites, it does not add.**
+ **Import přepisuje, nepřidává.**
- If a record already has `VALUE2` and `VALUE3` selected, and you import `["VALUE1"]`, the record will only have `VALUE1` after import. The previous selections are replaced, not merged.
+ Pokud má záznam již vybrány `VALUE2` a `VALUE3` a vy importujete `[\"VALUE1\"]`, bude mít po importu pouze `VALUE1`. Předchozí výběry se nahrazují, neslučují.
-### Number Fields
+### Číselná pole
-* Numbers only
-* Decimals use period: `1234.56`
-* No thousands separators
+* Pouze čísla
+* Desetinná místa se oddělují tečkou: `1234.56`
+* Bez oddělovačů tisíců
-### Phone Fields
+### Telefonní pole
-Phone is a nested field with multiple columns that **must be filled**
+Telefon je vnořené pole s více sloupci, které je **nutné vyplnit**
-* **Phones / Primary Phone Number**: The phone number (e.g., `4159095555`)
-* **Phones / Primary Phone Country Code**: Country code (e.g., `US`)
-* **Phones / Primary Phone Calling Code**: Dialing code (e.g., `+1`)
+* **Telefony / Primární telefonní číslo**: Telefonní číslo (např. `4159095555`)
+* **Telefony / Kód země primárního telefonu**: Kód země (např. `US`)
+* **Telefony / Mezinárodní předvolba primárního telefonu**: Volací kód (např. `+1`)
-### Rating Fields
+### Hodnoticí pole
-Use the API name format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, `RATING_5`
+Použijte název API ve formátu: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, `RATING_5`
### Relační pole
-Please see our dedicated article: [Import Relations Between Objects](/l/cs/user-guide/data-migration/capabilities/import-relations)
+Podívejte se prosím na náš samostatný článek: [Import relací mezi objekty](/l/cs/user-guide/data-migration/capabilities/import-relations)
### Výběrová Pole
-Use the **API name** of the option (not the display label):
+Použijte **název API** možnosti (nikoli zobrazovaný popisek):
```
VALUE1
diff --git a/packages/twenty-docs/l/cs/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx b/packages/twenty-docs/l/cs/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
index 4c088cb542..fca61fc2f7 100644
--- a/packages/twenty-docs/l/cs/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
+++ b/packages/twenty-docs/l/cs/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
@@ -87,114 +87,114 @@ Telefon je **vnořené pole**, které vyžaduje více sloupců:
| **Telefony / Kód země hlavního telefonu** | `US` |
| **Telefony / Mezinárodní předvolba hlavního telefonu** | `+1` |
-### Address Fields
+### Adresní pole
-Address is a **nested field** with multiple columns (some can be left empty):
+Adresa je **vnořené pole** s více sloupci (některé mohou zůstat prázdné):
-* **Address / Address 1**: Street address line 1
-* **Address / Address 2**: Street address line 2 (optional)
-* **Address / City**: City name
-* **Address / State**: State or province
-* **Address / Country**: Country name
-* **Address / Post Code**: Postal/ZIP code
+* **Adresa / Adresa 1**: Řádek adresy 1
+* **Adresa / Adresa 2**: Řádek adresy 2 (volitelné)
+* **Adresa / Město**: Název města
+* **Adresa / Stát**: Stát nebo provincie
+* **Adresa / Země**: Název země
+* **Adresa / PSČ**: Poštovní/ZIP kód
-### Date Fields
+### Datumová pole
-Use consistent formatting throughout your file:
+Používejte jednotný formát v celém souboru:
-* `YYYY-MM-DD` (recommended): `2024-03-15`
+* `YYYY-MM-DD` (doporučeno): `2024-03-15`
* `MM/DD/YYYY`: `03/15/2024`
* `DD/MM/YYYY`: `15/03/2024`
* ISO 8601: `2024-03-15T10:30:00Z`
-### Number Fields
+### Číselná pole
-* Numbers only (no text)
-* Use period for decimals: `1234.56`
-* No thousands separators (not `1,234.56`)
+* Pouze čísla (bez textu)
+* Pro desetinná místa použijte tečku: `1234.56`
+* Bez oddělovačů tisíců (ne `1,234.56`)
-### Currency Fields
+### Měnová pole
-Currency is a **nested field** requiring two columns that **both must be filled**:
+Měna je **vnořené pole** vyžadující dva sloupce, které musí být oba vyplněny:
-| Column | Příklad |
-| --------------------- | --------- |
-| **Amount / Amount** | `1234.56` |
-| **Amount / Currency** | `USD` |
+| Sloupec | Příklad |
+| ------------------- | --------- |
+| **Částka / Částka** | `1234.56` |
+| **Částka / Měna** | `USD` |
-### Boolean Fields
+### Booleovská pole
-Use uppercase: `TRUE` or `FALSE`
+Používejte velká písmena: `TRUE` nebo `FALSE`
-Lowercase `true` or `false` will not work.
+Malá písmena `true` nebo `false` nebudou fungovat.
### Výběrová Pole
-Use the **API name** of the option, not the display label.
+Použijte název API možnosti, nikoli zobrazovaný štítek.
-**How to find API names:**
+**Jak najít názvy API:**
-1. Go to **Settings → Data Model**
-2. Select the object and field
-3. Enable **Advanced mode** (toggle at bottom right)
-4. Copy the API name (e.g., `OPTION_1`, not "Option 1")
+1. Přejděte na **Nastavení → Datový model**
+2. Vyberte objekt a pole
+3. Zapněte **Pokročilý režim** (přepínač vpravo dole)
+4. Zkopírujte název API (např. `OPTION_1`, nikoli "Option 1")
-New select options are not created automatically. Add them in **Settings → Data Model** before importing.
+Nové možnosti výběru se nevytvářejí automaticky. Přidejte je v **Nastavení → Datový model** před importem.
-### Multi-Select Fields
+### Pole s vícenásobným výběrem
-Use API names in array format:
+Použijte názvy API ve formátu pole:
```
["VALUE1","VALUE2"]
```
-### Array Fields
+### Pole typu array
-Use JSON array format:
+Použijte formát JSON pole:
```
["value1","value2"]
```
-### Rating Fields
+### Hodnoticí pole
-Use the format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, or `RATING_5`
+Použijte formát: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4` nebo `RATING_5`
-### Links/URL Fields
+### Pole odkazů/URL
-Fill both columns:
+Vyplňte oba sloupce:
-* **Links / Link Label**: `Twenty`
-* **Links / Link URL**: `https://twenty.com`
+* **Odkazy / Štítek odkazu**: `Twenty`
+* **Odkazy / URL odkazu**: `https://twenty.com`
-For secondary links, use the **Links / Secondary Links** column:
+Pro sekundární odkazy použijte sloupec **Odkazy / Sekundární odkazy**:
```
[{"url":"https://twenty.com","label":"Twenty"}]
```
-### JSON Fields
+### JSON pole
-Use valid JSON format:
+Použijte platný formát JSON:
```
{"key":"value","key2":"value2"}
```
-### ID Fields
+### ID pole
-* **Optional**: Twenty auto-generates IDs if not provided
-* **Format**: UUID (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`)
-* **Use case**: Include ID to update existing records instead of creating new ones
+* **Volitelné**: Twenty automaticky generuje ID, pokud nejsou zadána
+* **Formát**: UUID (např. `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`)
+* **Využití**: Zahrňte ID pro aktualizaci existujících záznamů místo vytváření nových
-## Step 5: Add Relation Columns (If Linking Records)
+## Krok 5: Přidejte relační sloupce (pokud propojujete záznamy)
-To link records to other objects (e.g., People to Companies), add a column with the unique identifier of the related record.
+Chcete-li propojit záznamy s jinými objekty (např. lidi se společnostmi), přidejte sloupec s jedinečným identifikátorem souvisejícího záznamu.
-**Example**: Linking People to Companies
+**Příklad**: Propojení lidí se společnostmi
-Add a column to your People CSV:
+Přidejte do svého souboru CSV s lidmi sloupec:
```
firstName,lastName,email,companyDomain
@@ -202,69 +202,69 @@ John,Smith,john@acme.com,https://acme.com
Jane,Doe,jane@widgets.co,https://widgets.co
```
-**Important rules for relations:**
+**Důležitá pravidla pro relace:**
-* The parent record must already exist in Twenty
-* Use the **Domain URL** format (`https://domain.com`), not the label
-* Map only ONE unique identifier (don't include both `companyId` AND `companyDomain`)
-* For Workspace Members, use their **email** (not name)
+* Nadřazený záznam musí v Twenty již existovat
+* Použijte formát **Domain URL** (`https://domain.com`), nikoli štítek
+* Mapujte pouze JEDEN jedinečný identifikátor (nezahrnujte zároveň `companyId` i `companyDomain`)
+* U členů pracovního prostoru použijte jejich **e-mail** (ne jméno)
- **Import Order Matters!**
+ **Pořadí importu je důležité!**
- Import the "one" side before the "many" side:
+ Importujte stranu "one" před stranou "many":
- 1. **Companies** first
- 2. **People** second (with company reference)
- 3. **Opportunities** third
+ 1. **Společnosti** jako první
+ 2. **Lidé** jako druzí (s odkazem na společnost)
+ 3. **Příležitosti** jako třetí
- The parent record must exist before you can reference it.
+ Nadřazený záznam musí existovat dříve, než na něj můžete odkazovat.
-See [How to Import Relations](/l/cs/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for detailed instructions.
+Podrobné pokyny najdete v [Jak importovat relace](/l/cs/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv).
-## Step 6: Ensure Fields Exist in Twenty
+## Krok 6: Ujistěte se, že pole v Twenty existují
-The import creates **records**, not **fields**. All fields you want to import must already exist in your data model.
+Import vytváří záznamy, nikoli pole. Všechna pole, která chcete importovat, musí již existovat ve vašem datovém modelu.
-**Before importing:**
+**Před importem:**
-1. Go to **Settings → Data Model**
-2. Select your object
-3. Create any custom fields you need
-4. Note the exact field names (they must match your column headers)
+1. Přejděte na **Nastavení → Datový model**
+2. Vyberte požadovaný objekt
+3. Vytvořte všechna vlastní pole, která potřebujete
+4. Poznamenejte si přesné názvy polí (musí odpovídat názvům sloupců)
-## Step 7: Final Checklist
+## Krok 7: Závěrečný kontrolní seznam
-Before uploading your file, verify:
+Před nahráním souboru ověřte:
-File is CSV, XLSX, or XLS format
-File has fewer than 10,000 records
-Encoding is UTF-8
-No duplicate emails (for People) or domains (for Companies)
-Dates use consistent format throughout
-Domains use `https://domain.com` format
-Boolean fields use `TRUE` or `FALSE` (uppercase)
-Select fields use API names, not display labels
-All custom fields exist in Settings → Data Model
-Parent records imported before child records
-Relation columns reference existing records
+Soubor je ve formátu CSV, XLSX nebo XLS
+Soubor obsahuje méně než 10 000 záznamů
+Kódování je UTF-8
+Žádné duplicitní e-maily (pro lidi) nebo domény (pro společnosti)
+Data používají jednotný formát v celém souboru
+Domény používají formát `https://domain.com`
+Booleovská pole používají `TRUE` nebo `FALSE` (velká písmena)
+Výběrová pole používají názvy API, nikoli zobrazované štítky
+Všechna vlastní pole existují v Nastavení → Datový model
+Nadřazené záznamy byly importovány před podřízenými
+Relační sloupce odkazují na existující záznamy
-## Common Mistakes to Avoid
+## Časté chyby, kterým se vyhnout
-| Mistake | Solution |
-| -------------------------------------------- | ------------------------------------- |
-| Using `true` instead of `TRUE` | Boolean values must be uppercase |
-| Using display labels for Select fields | Find and use API names in Settings |
-| Importing People before Companies | Always import parent objects first |
-| Missing currency code for Currency fields | Fill both Amount and Currency columns |
-| Wrong domain format | Use `https://domain.com` consistently |
-| Mapping multiple unique fields for relations | Map only ONE (domain OR id, not both) |
+| Chyba | Řešení |
+| ---------------------------------------------- | ---------------------------------------------- |
+| Použití `true` místo `TRUE` | Booleovské hodnoty musí být velkými písmeny |
+| Použití zobrazovaných štítků u výběrových polí | V Nastavení najděte a používejte názvy API |
+| Importování lidí před společnostmi | Vždy nejprve importujte nadřazené objekty |
+| Chybějící kód měny u měnových polí | Vyplňte sloupce Částka i Měna |
+| Nesprávný formát domény | Používejte konzistentně `https://domain.com` |
+| Mapování více jedinečných polí pro relace | Mapujte pouze JEDNO (doména NEBO id, ne obojí) |
## Další kroky
-Your file is ready! Now:
+Váš soubor je připraven! Nyní:
-* [Import Companies](/l/cs/user-guide/data-migration/how-tos/import-companies-via-csv) (import these first)
-* [Import Contacts](/l/cs/user-guide/data-migration/how-tos/import-contacts-via-csv)
-* [Fix any import errors](/l/cs/user-guide/data-migration/how-tos/fix-import-errors)
+* [Importovat společnosti](/l/cs/user-guide/data-migration/how-tos/import-companies-via-csv) (importujte je jako první)
+* [Importovat kontakty](/l/cs/user-guide/data-migration/how-tos/import-contacts-via-csv)
+* [Opravit chyby importu](/l/cs/user-guide/data-migration/how-tos/fix-import-errors)
diff --git a/packages/twenty-docs/l/cs/user-guide/data-model/how-tos/create-relation-fields.mdx b/packages/twenty-docs/l/cs/user-guide/data-model/how-tos/create-relation-fields.mdx
index 2a750d4901..baefb270b6 100644
--- a/packages/twenty-docs/l/cs/user-guide/data-model/how-tos/create-relation-fields.mdx
+++ b/packages/twenty-docs/l/cs/user-guide/data-model/how-tos/create-relation-fields.mdx
@@ -1,60 +1,60 @@
---
-title: Create Relation Fields
-description: Step-by-step guide to connecting objects with relation fields.
+title: Vytvoření relačních polí
+description: Návod krok za krokem k propojení objektů pomocí relačních polí.
---
-Relation fields connect records from different objects—for example, linking People to Companies.
+Relační pole propojují záznamy z různých objektů — například propojení lidí se společnostmi.
- **Relation names cannot be changed after creation** (they affect the API). Plan your names carefully.
+ **Názvy relací nelze po vytvoření změnit** (ovlivňují rozhraní API). Názvy si pečlivě naplánujte.
## Než začnete
-Decide:
+Rozhodněte se:
-* Which objects are you connecting? (e.g., People → Companies)
-* Which is the "one" side? (e.g., Company)
-* Which is the "many" side? (e.g., People — many people work at one company)
-* What should the field be named on each side?
+* Které objekty propojujete? (např. Lidé → Společnosti)
+* Která strana je „jedna“? (např. Společnost)
+* Která strana je „mnoho“? (např. Lidé — mnoho lidí pracuje v jedné společnosti)
+* Jak se má pole jmenovat na každé straně?
-See [Relation Fields](/l/cs/user-guide/data-model/capabilities/relation-fields) for relation types explained.
+Viz [Relační pole](/l/cs/user-guide/data-model/capabilities/relation-fields) s vysvětlením typů relací.
-## Steps
+## Postup
-1. Go to **Settings → Data Model**
-2. Select the object where you want the relation (typically the "many" side)
-3. Click **+ Add Field**
-4. Select **Relation** as the field type
-5. Choose the **target object**
-6. Select **One-to-Many** or **Many-to-One**
-7. Enter field names for **both sides** of the relation
+1. Přejděte do **Nastavení → Datový model**
+2. Vyberte objekt, ve kterém chcete relaci (obvykle strana „mnoho“)
+3. Klikněte na **+ Přidat pole**
+4. Vyberte jako typ pole **Relace**
+5. Vyberte **cílový objekt**
+6. Vyberte **Jedna ku mnoha** nebo **Mnoho ku jedné**
+7. Zadejte názvy polí pro **obě strany** relace
8. Klikněte na **Uložit**
-## Example: People → Companies
+## Příklad: Lidé → Společnosti
-* Go to **Settings → Data Model → People**
-* Add a Relation field
-* Target: **Companies**
-* Type: **Many-to-One**
-* Field on People: **Company**
-* Field on Companies: **Employees**
+* Přejděte do **Nastavení → Datový model → Lidé**
+* Přidejte relační pole
+* Cíl: **Společnosti**
+* Typ: **Mnoho ku jedné**
+* Pole u lidí: **Společnost**
+* Pole u společností: **Zaměstnanci**
-Now each Person can be linked to a Company, and each Company shows its People.
+Nyní lze každou osobu propojit se společností a každá společnost zobrazuje své lidi.
-## Deleting a Relation
+## Smazání relace
-1. Go to **Settings → Data Model**
-2. Find the relation field
-3. Click **⋮ → Deactivate**
+1. Přejděte do **Nastavení → Datový model**
+2. Najděte relační pole
+3. Klikněte na **⋮ → Deaktivovat**
-Links are preserved but hidden. Reactivate to restore.
+Propojení se zachovají, ale jsou skrytá. Znovu aktivujte pro obnovení.
- **Deleting a relation doesn't delete records.** Only the link between them is removed.
+ **Smazání relace nemaže záznamy.** Odstraní se pouze propojení mezi nimi.
-## Related
+## Související
-* [Relation Fields](/l/cs/user-guide/data-model/capabilities/relation-fields) — types and limitations
-* [How to Import Relations](/l/cs/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) — bulk import linked records
+* [Relační pole](/l/cs/user-guide/data-model/capabilities/relation-fields) — typy a omezení
+* [Jak importovat relace](/l/cs/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) — hromadný import propojených záznamů
diff --git a/packages/twenty-docs/l/cs/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx b/packages/twenty-docs/l/cs/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
index 1a96069842..a3f1dc5bcd 100644
--- a/packages/twenty-docs/l/cs/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
+++ b/packages/twenty-docs/l/cs/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
@@ -1,5 +1,5 @@
---
-title: Omezte přístup ke svému zobrazení},{
+title: Restrict Access to Your View
description: Ovládejte, kdo může vidět vaše vlastní zobrazení.
---
diff --git a/packages/twenty-docs/l/cs/user-guide/views-pipelines/overview.mdx b/packages/twenty-docs/l/cs/user-guide/views-pipelines/overview.mdx
index b47e6d2eab..de28a7fb63 100644
--- a/packages/twenty-docs/l/cs/user-guide/views-pipelines/overview.mdx
+++ b/packages/twenty-docs/l/cs/user-guide/views-pipelines/overview.mdx
@@ -23,7 +23,7 @@ Zobrazení jsou uložená nastavení, která určují, jak se vaše data zobrazu
### Zobrazení tabulky
-Výchozí zobrazení podobné tabulkovému procesoru zobrazující záznamy v řádcích s přizpůsobitelnými sloupci.
+Výchozí zobrazení podobné tabulkovému procesoru zobrazující záznamy v řádcích s přizpůsobitelnými sloupci.
### Zobrazení Kanban
diff --git a/packages/twenty-docs/l/cs/user-guide/workflows/capabilities/workflow-runs.mdx b/packages/twenty-docs/l/cs/user-guide/workflows/capabilities/workflow-runs.mdx
index 1b356ac862..004fc9a5bd 100644
--- a/packages/twenty-docs/l/cs/user-guide/workflows/capabilities/workflow-runs.mdx
+++ b/packages/twenty-docs/l/cs/user-guide/workflows/capabilities/workflow-runs.mdx
@@ -1,92 +1,92 @@
---
title: Běhy průběhu práce
-description: Monitor and manage workflow executions.
+description: Sledujte a spravujte běhy pracovních postupů.
image: /images/user-guide/workflows/workflow.png
---
-## About Runs
+## O bězích
-A **Run** is a record of a workflow execution. Every time a workflow is triggered—whether by a record event, schedule, manual action, or webhook—a new run is created.
+**Běh** je záznam provedení pracovního postupu. Při každém spuštění pracovního postupu—ať už událostí záznamu, plánem, ruční akcí nebo webhookem—se vytvoří nový běh.
-## Viewing Runs
+## Zobrazení běhů
-### From the Workflow Editor
+### Z editoru pracovních postupů
-1. Open the workflow you want to monitor
-2. Click the **Runs** panel on the right side
-3. See a list of recent runs with their status
+1. Otevřete pracovní postup, který chcete sledovat
+2. Klikněte na panel **Běhů** na pravé straně
+3. Zobrazte seznam nedávných běhů s jejich stavem
-### From the Workflow Runs View
+### Ze zobrazení běhů pracovních postupů
-1. Go to **Workflow Runs** in the sidebar
-2. View runs across all workflows
-3. Filter by status, workflow, or date
+1. V postranním panelu přejděte na **Běhy pracovních postupů**
+2. Zobrazte běhy napříč všemi pracovními postupy
+3. Filtrujte podle stavu, pracovního postupu nebo data
-## Run Statuses
+## Stavy běhů
-| Stav | Popis |
-| ------------- | ------------------------------------------------------------------------ |
-| **Běží** | Workflow is currently executing |
-| **Completed** | Workflow finished successfully |
-| **Failed** | Workflow encountered an error and stopped |
-| **Waiting** | Workflow is paused (e.g., waiting for a Delay action or Form submission) |
+| Stav | Popis |
+| ------------- | ----------------------------------------------------------------------------------- |
+| **Běží** | Pracovní postup se právě provádí |
+| **Dokončeno** | Pracovní postup byl úspěšně dokončen |
+| **Selhalo** | Pracovní postup narazil na chybu a zastavil se |
+| **Čekání** | Pracovní postup je pozastaven (např. čeká na akci Zpoždění nebo odeslání formuláře) |
-## Run Details
+## Podrobnosti běhu
-Click on any run to see:
+Kliknutím na libovolný běh zobrazíte:
-* **Status**: Current state of the run
-* **Started at**: When the run began
-* **Duration**: How long the run took
-* **Trigger data**: The input that started the workflow
-* **Step outputs**: Data returned by each step
-* **Error messages**: If the run failed, what went wrong
+* **Stav**: Aktuální stav běhu
+* **Zahájeno**: Kdy běh začal
+* **Doba trvání**: Jak dlouho běh trval
+* **Data spouštěče**: Vstup, který spustil pracovní postup
+* **Výstupy kroků**: Data vrácená jednotlivými kroky
+* **Chybové zprávy**: Pokud běh selhal, co se pokazilo
-## Step-by-Step Execution
+## Provádění krok za krokem
-Each run shows the progression through your workflow:
+Každý běh ukazuje průchod vaším pracovním postupem:
-1. See which steps completed successfully
-2. Identify where failures occurred
-3. View the data passed between steps
-4. Debug issues by examining step inputs and outputs
+1. Zjistěte, které kroky byly úspěšně dokončeny
+2. Zjistěte, kde došlo k selhání
+3. Zobrazte data předávaná mezi kroky
+4. Laděte problémy zkoumáním vstupů a výstupů kroků
-## Error Handling
+## Zpracování chyb
-When a run fails:
+Když běh selže:
-1. Open the failed run
-2. Find the step that caused the failure
-3. Check the error message for details
-4. Common issues:
- * Missing required fields
+1. Otevřete neúspěšný běh
+2. Najděte krok, který selhání způsobil
+3. Zkontrolujte podrobnosti v chybové zprávě
+4. Běžné problémy:
+ * Chybí povinná pole
* Neplatný formát dat
- * External API errors
- * Permission issues
+ * Chyby externího rozhraní API
+ * Problémy s oprávněními
-## Re-running Workflows
+## Opětovné spuštění pracovních postupů
-If a run fails, you can:
+Pokud běh selže, můžete:
-* Fix the underlying issue and wait for the next trigger
-* For manual workflows, trigger again with the same or updated data
-* Review the workflow logic to prevent future failures
+* Odstraňte základní problém a počkejte na další spuštění
+* U ručních pracovních postupů spusťte znovu se stejnými nebo aktualizovanými daty
+* Zkontrolujte logiku pracovního postupu, abyste předešli budoucím selháním
-## Performance Tips
+## Tipy k výkonu
-### Managing Run History
+### Správa historie běhů
-* Runs are retained for historical reference
-* Very old runs may be archived automatically
-* Export run data if you need to keep records
+* Běhy jsou uchovávány pro historické účely
+* Velmi staré běhy mohou být automaticky archivovány
+* Exportujte data běhů, pokud potřebujete uchovávat záznamy
-### Monitoring Best Practices
+### Osvědčené postupy pro monitorování
-* Check runs regularly after activating new workflows
-* Review failed runs to identify patterns
+* Po aktivaci nových pracovních postupů pravidelně kontrolujte běhy
+* Prohlédněte si neúspěšné běhy a hledejte opakující se vzorce
-## Related
+## Související
-* [Workflow Triggers](/l/cs/user-guide/workflows/capabilities/workflow-triggers)
-* [Workflow Actions](/l/cs/user-guide/workflows/capabilities/workflow-actions)
-* [Workflow Troubleshooting](/l/cs/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)
+* [Spouštěče pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-triggers)
+* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions)
+* [Odstraňování problémů s pracovními postupy](/l/cs/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)
diff --git a/packages/twenty-docs/l/cs/user-guide/workflows/capabilities/workflow-versions.mdx b/packages/twenty-docs/l/cs/user-guide/workflows/capabilities/workflow-versions.mdx
index ec78c0cc27..e953646ddb 100644
--- a/packages/twenty-docs/l/cs/user-guide/workflows/capabilities/workflow-versions.mdx
+++ b/packages/twenty-docs/l/cs/user-guide/workflows/capabilities/workflow-versions.mdx
@@ -1,5 +1,5 @@
---
-title: Verze pracovního postupu},{
+title: Workflow Versions
description: Spravujte verze a koncepty pracovních postupů.
image: /images/user-guide/workflows/workflow.png
---
diff --git a/packages/twenty-docs/l/de/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/de/developers/contribute/capabilities/backend-development/queue.mdx
index 9552e9c144..c9d766d869 100644
--- a/packages/twenty-docs/l/de/developers/contribute/capabilities/backend-development/queue.mdx
+++ b/packages/twenty-docs/l/de/developers/contribute/capabilities/backend-development/queue.mdx
@@ -26,7 +26,7 @@ class Resolver {
}
}
-// async-WorKer
+//async worker
class CustomWorker {
constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
this.initWorker();
diff --git a/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/best-practices-front.mdx b/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
index 788012b39b..876600cdfd 100644
--- a/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
+++ b/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
@@ -18,21 +18,21 @@ Es ist eine gute Praxis, so viele Atome zu erstellen, wie Sie benötigen, um Ihr
```tsx
export const myAtomState = atom({
- key: 'myAtomState',
- default: 'Standardwert',
+ key: 'myAtomState',
+ default: 'default value',
});
export const MyComponent = () => {
- const [myAtom, setMyAtom] = useRecoilState(myAtomState);
+ const [myAtom, setMyAtom] = useRecoilState(myAtomState);
- return (
-
- setMyAtom(e.target.value)}
- />
-
- );
+ return (
+
+ setMyAtom(e.target.value)}
+ />
+
+ );
}
```
@@ -40,7 +40,7 @@ export const MyComponent = () => {
Vermeiden Sie die Verwendung von `useRef`, um den Zustand zu speichern.
-Wenn Sie den Zustand speichern möchten, sollten Sie `useState` oder `useRecoilState` verwenden.
+If you want to store state, you should use `useState` or `useRecoilState`.
Sehen Sie sich [an, wie Re-Renderings verwaltet werden können](#managing-re-renders), falls Sie das Gefühl haben, dass Sie `useRef` benötigen, um einige Re-Renderings zu verhindern.
@@ -56,23 +56,23 @@ Beachten Sie, dass Sie **immer** Re-Renderings vermeiden können, indem Sie dere
Das Vermeiden von Re-Renderings in neuen Funktionen wird jetzt erleichtert, indem sie auf Root-Ebene eliminiert werden.
-Die `PageChangeEffect`-Sidecar-Komponente enthält nur einen `useEffect`-Hook, der die gesamte Logik für den Seitenwechsel enthält.
+The `PageChangeEffect` sidecar component contains just one `useEffect` that holds all the logic to execute on a page change.
Auf diese Weise wissen Sie, dass es nur einen Ort gibt, der ein Re-Rendering auslösen kann.
-### Denken Sie immer zweimal nach, bevor Sie `useEffect` in Ihre Codebasis aufnehmen.
+### Always think twice before adding `useEffect` in your codebase
-Re-Renderings werden oft durch unnötige `useEffect`-Verwendungen verursacht.
+Re-renders are often caused by unnecessary `useEffect`.
-Sie sollten überlegen, ob Sie `useEffect` benötigen oder ob Sie die Logik in eine Event-Handler-Funktion verschieben können.
+You should think whether you need `useEffect`, or if you can move the logic in a event handler function.
-Es ist in der Regel einfach, die Logik in eine `handleClick` oder `handleChange`-Funktion zu verschieben.
+You'll find it generally easy to move the logic in a `handleClick` or `handleChange` function.
Sie können sie auch in Bibliotheken wie Apollo finden: `onCompleted`, `onError`, usw.
-### Verwenden Sie eine Geschwisterkomponente, um `useEffect`- oder Datenabruf-Logik auszulagern.
+### Use a sibling component to extract `useEffect` or data fetching logic
-Wenn Sie das Gefühl haben, Ihrer Root-Komponente einen `useEffect` hinzufügen zu müssen, sollten Sie erwägen, ihn in eine Sidecar-Komponente auszulagern.
+If you feel like you need to add a `useEffect` in your root component, you should consider extracting it in a sidecar component.
Dasselbe können Sie auch für die Datenabruflogik mit Apollo-Hooks anwenden.
@@ -187,16 +187,16 @@ const [email, setEmail] = useState('');
Ereignis-Handler-Namen sollten mit `handle` beginnen, während `on` als Präfix dient, um Ereignisse in Komponenten-Props zu benennen.
```tsx
-// ❌ Schlecht
+// ❌ Bad
const onEmailChange = (val: string) => {
- // ...
+ // ...
};
```
```tsx
-// ✅ Gut
+// ✅ Good
const handleEmailChange = (val: string) => {
- // ...
+ // ...
};
```
@@ -210,24 +210,24 @@ Betrachten Sie die unten definierte `EmailField`-Komponente:
```tsx
type EmailFieldProps = {
- value: string;
- disabled?: boolean;
+ value: string;
+ disabled?: boolean;
};
const EmailField = ({ value, disabled = false }: EmailFieldProps) => (
-
+
);
```
**Verwendung**
```tsx
-// ❌ Schlecht, den gleichen Wert wie den Standardwert übergeben, fügt keinen Wert hinzu
+// ❌ Bad, passing in the same value as the default value adds no value
const Form = () => ;
```
```tsx
-// ✅ Gut, nimmt den Standardwert an
+// ✅ Good, assumes the default value
const Form = () => ;
```
@@ -242,13 +242,13 @@ const SomeParentComponent = () => ;
// In MyComponent
const MyComponent = ({ MyIcon }: { MyIcon: IconComponent }) => {
- const theme = useTheme();
+ const theme = useTheme();
- return (
-
-
-
- )
+ return (
+
+
+
+ )
};
```
@@ -274,28 +274,28 @@ Beim Importieren sollten Sie die vorgesehenen Aliase anstelle der vollständigen
```js
{
- alias: {
- "~": path.resolve(__dirname, "src"),
- "@": path.resolve(__dirname, "src/modules"),
- "@testing": path.resolve(__dirname, "src/testing"),
- },
+ alias: {
+ "~": path.resolve(__dirname, "src"),
+ "@": path.resolve(__dirname, "src/modules"),
+ "@testing": path.resolve(__dirname, "src/testing"),
+ },
}
```
**Verwendung**
```tsx
-// ❌ Schlecht, gibt den vollständigen relativen Pfad an
+// ❌ Bad, specifies the entire relative path
import {
- CatalogDecorator
+ CatalogDecorator
} from '../../../../../testing/decorators/CatalogDecorator';
import {
- ComponentDecorator
+ ComponentDecorator
} from '../../../../../testing/decorators/ComponentDecorator';
```
```tsx
-// ✅ Gut, nutzt die vorgesehenen Aliase
+// ✅ Good, utilises the designated aliases
import { CatalogDecorator } from '~/testing/decorators/CatalogDecorator';
import { ComponentDecorator } from 'twenty-ui/testing';
```
@@ -306,16 +306,16 @@ import { ComponentDecorator } from 'twenty-ui/testing';
```js
const validationSchema = z
- .object({
- exist: z.boolean(),
- email: z
- .string()
- .email('Email muss eine gültige E-Mail sein'),
- password: z
- .string()
- .regex(PASSWORD_REGEX, 'Passwort muss mindestens 8 Zeichen enthalten'),
- })
- .required();
+ .object({
+ exist: z.boolean(),
+ email: z
+ .string()
+ .email('Email must be a valid email'),
+ password: z
+ .string()
+ .regex(PASSWORD_REGEX, 'Password must contain at least 8 characters'),
+ })
+ .required();
type Form = z.infer;
```
diff --git a/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
index 1501dab325..db7ee3f76e 100644
--- a/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
+++ b/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -73,7 +73,7 @@ Das Projekt hat einen sauberen und einfachen Stack mit minimalem Boilerplate-Cod
[React Router](https://reactrouter.com/) übernimmt das Routing.
-Um unnötige [Re-Renders](/l/de/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) zu vermeiden, befindet sich die gesamte Routing-Logik in einem `useEffect` in `PageChangeEffect`.
+To avoid unnecessary [re-renders](/l/de/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) all the routing logic is in a `useEffect` in `PageChangeEffect`.
### Zustandsverwaltung
diff --git a/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/hotkeys.mdx
index 510174523c..7b1ec7350e 100644
--- a/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/hotkeys.mdx
+++ b/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -45,29 +45,29 @@ const PageListeningEnter = () => {
goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope();
- // 1. Setze den Tastenkombinationsbereich in einem useEffect
+ // 1. Set the hotkey scope in a useEffect
useEffect(() => {
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleEnterPage,
);
- // Zurückkehren zum vorherigen Tastenkombinationsbereich, wenn die Komponente entfernt wird
+ // Revert to the previous hotkey scope when the component is unmounted
return () => {
goBackToPreviousHotkeyScope();
};
}, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
- // 2. Verwenden Sie den useScopedHotkeys Hook
+ // 2. Use the useScopedHotkeys hook
useScopedHotkeys(
Key.Enter,
() => {
- // Eine Logik, die auf dieser Seite ausgeführt wird, wenn der Benutzer Enter drückt
+ // Some logic executed on this page when the user presses Enter
// ...
},
ExampleHotkeyScopes.ExampleEnterPage,
);
- return Meine Seite, die auf Enter hört
;
+ return My page that listens for Enter
;
};
```
@@ -87,7 +87,7 @@ const ExamplePageWithModal = () => {
} = usePreviousHotkeyScope();
const handleOpenModalClick = () => {
- // 1. Setze den Tastenkombinationsbereich, wenn der Benutzer das Modal öffnet
+ // 1. Set the hotkey scope when user opens the modal
setShowModal(true);
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleModal,
@@ -95,14 +95,14 @@ const ExamplePageWithModal = () => {
};
const handleModalClose = () => {
- // 1. Zurückkehren zum vorherigen Tastenkombinationsbereich, wenn das Modal geschlossen wird
+ // 1. Revert to the previous hotkey scope when the modal is closed
setShowModal(false);
goBackToPreviousHotkeyScope();
};
return
-
Meine Seite mit einem Modal
- Modal öffnen
+ My page with a modal
+ Open modal
{showModal && }
;
};
@@ -112,9 +112,9 @@ Dann in der Modalkomponente:
```tsx
const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
- // 2. Verwenden Sie den useScopedHotkeys Hook, um auf Escape zu hören.
- // Beachten Sie, dass Escape eine gängige Tastenkombination ist, die von vielen anderen Komponenten verwendet werden könnte
- // Daher ist es wichtig, einen Tastenkombinationsbereich zu verwenden, um Konflikte zu vermeiden
+ // 2. Use the useScopedHotkeys hook to listen for Escape.
+ // Note that escape is a common hotkey that could be used by many other components
+ // So it's important to use a hotkey scope to avoid conflicts
useScopedHotkeys(
Key.Escape,
() => {
@@ -123,13 +123,13 @@ const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
ExampleHotkeyScopes.ExampleModal,
);
- return Meine Modalkomponente
;
+ return My modal component
;
};
```
-Es ist wichtig, dieses Muster zu verwenden, wenn Sie sich nicht sicher sind, ob das einfache Benutzen eines useEffect bei Ein-/Ausbindung ausreicht, um Konflikte zu vermeiden.
+It's important to use this pattern when you're not sure that just using a useEffect with mount/unmount will be enough to avoid conflicts.
-Diese Konflikte können schwer zu debuggen sein und treten möglicherweise häufiger auf, als man denkt, mit useEffects.
+Those conflicts can be hard to debug, and it might happen more often than not with useEffects.
## Was ist ein Tastenkombinationsbereich?
diff --git a/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/style-guide.mdx b/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/style-guide.mdx
index 4ce27c0680..9b0876df73 100644
--- a/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/style-guide.mdx
+++ b/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/style-guide.mdx
@@ -21,16 +21,16 @@ Verwenden Sie immer TSX-Funktionskomponenten.
Vermeiden Sie `import` mit `const`, da es schwieriger zu lesen und schwerer mit Code-Vervollständigung zu importieren ist.
```tsx
-// ❌ Schlecht, schwerer zu lesen, schwerer zu importieren mit Code-Vervollständigung
-const MeineKomponente = () => {
- return Hallo Welt
;
+// ❌ Bad, harder to read, harder to import with code completion
+const MyComponent = () => {
+ return Hello World
;
};
-export default MeineKomponente;
+export default MyComponent;
-// ✅ Gut, leicht zu lesen, leicht zu importieren mit Code-Vervollständigung
-export function MeineKomponente() {
- return Hallo Welt
;
+// ✅ Good, easy to read, easy to import with code completion
+export function MyComponent() {
+ return Hello World
;
};
```
@@ -41,26 +41,27 @@ Erstellen Sie den Typ der Eigenschaften (props) und nennen Sie ihn `(ComponentNa
Verwenden Sie Destrukturierung der Props.
```tsx
-// ❌ Schlecht, ohne Typ
-export const MeineKomponente = (props) => Hallo {props.name}
;
+// ❌ Bad, no type
+export const MyComponent = (props) => Hello {props.name}
;
-// ✅ Gut, mit Typ
-type MeineKomponenteProps = {
+// ✅ Good, type
+type MyComponentProps = {
name: string;
};
-export const MeineKomponente = ({ name }: MeineKomponenteProps) => Hallo {name}
;
+export const MyComponent = ({ name }: MyComponentProps) => Hello {name}
;
```
#### Vermeiden Sie die Verwendung von `React.FC` oder `React.FunctionComponent`, um Prop-Typen zu definieren
```tsx
-/* ❌ - Schlecht, definiert die Komponententyp-Anmerkungen mit `FC`
- * - Mit `React.FC` akzeptiert die Komponente implizit ein `children`-Prop,
- * selbst wenn es nicht im Prop-Typ definiert ist. Dies ist nicht immer gewünscht,
- * insbesondere wenn die Komponente nicht beabsichtigt, Kinder zu rendern.
+/* ❌ - Bad, defines the component type annotations with `FC`
+ * - With `React.FC`, the component implicitly accepts a `children` prop
+ * even if it's not defined in the prop type. This might not always be
+ * desirable, especially if the component doesn't intend to render
+ * children.
*/
-const EmailFeld: React.FC<{
+const EmailField: React.FC<{
value: string;
}> = ({ value }) => ;
```
@@ -85,10 +86,10 @@ const EmailField = ({ value }: EmailFieldProps) => (
Vermeiden Sie das Propspreading einzelner Variablen in JSX-Elementen, wie `{...props}`. Diese Praxis führt oft zu weniger lesbarem und schwer wartbarem Code, da unklar ist, welche Props die Komponente erhält.
```tsx
-/* ❌ - Schlecht, spreadet ein einzelnes Variablen-Prop in die darunterliegende Komponente
+/* ❌ - Bad, spreads a single variable prop into the underlying component
*/
-const MeineKomponente = (props: EigeneProps) => {
- return ;
+const MyComponent = (props: OwnProps) => {
+ return ;
}
```
@@ -136,13 +137,13 @@ onClick?.();
Verwenden Sie immer `type` anstelle von `interface`, da sie fast immer überlappen und `type` flexibler ist.
```tsx
-// ❌ Schlecht
-interface MeinInterface {
+// ❌ Bad
+interface MyInterface {
name: string;
}
-// ✅ Gut
-type MeinTyp = {
+// ✅ Good
+type MyType = {
name: string;
};
```
@@ -154,14 +155,14 @@ type MeinTyp = {
Warum TypeScript empfiehlt, Enums zu vermeiden, sehen Sie [hier](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
```tsx
-// ❌ Schlecht, verwendet ein Enum
-enum Farbe {
- Rot = "red",
- Grün = "green",
- Blau = "blue",
+// ❌ Bad, utilizes an enum
+enum Color {
+ Red = "red",
+ Green = "green",
+ Blue = "blue",
}
-let farbe = Farbe.Rot;
+let color = Color.Red;
```
```tsx
@@ -262,13 +263,13 @@ const StyledButton = styled.button`
Vermeiden Sie Typ-Importe. Um diesen Standard durchzusetzen, überprüft eine ESLint-Regel alle Typ-Importe und meldet sie. Dies trägt zur Konsistenz und Lesbarkeit des TypeScript-Codes bei.
```tsx
-// ❌ Schlecht
+// ❌ Bad
import { type Meta, type StoryObj } from '@storybook/react';
-// ❌ Schlecht
+// ❌ Bad
import type { Meta, StoryObj } from '@storybook/react';
-// ✅ Gut
+// ✅ Good
import { Meta, StoryObj } from '@storybook/react';
```
diff --git a/packages/twenty-docs/l/de/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/de/twenty-ui/input/icon-picker.mdx
index be505d335f..1c8797a8a4 100644
--- a/packages/twenty-docs/l/de/twenty-ui/input/icon-picker.mdx
+++ b/packages/twenty-docs/l/de/twenty-ui/input/icon-picker.mdx
@@ -20,7 +20,7 @@ A dropdown-based icon picker that allows users to select an icon from a list.
const [selectedIcon, setSelectedIcon] = useState("");
const handleIconChange = ({ iconKey, Icon }) => {
- console.log("Gewähltes Symbol:", iconKey);
+ console.log("Selected Icon:", iconKey);
setSelectedIcon(iconKey);
};
diff --git a/packages/twenty-docs/l/de/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/de/twenty-ui/navigation/breadcrumb.mdx
index 0c542e787d..995ccea198 100644
--- a/packages/twenty-docs/l/de/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/de/twenty-ui/navigation/breadcrumb.mdx
@@ -17,10 +17,10 @@ Erstellt eine Navigationsleiste mit Brotkrumen.
export const MyComponent = () => {
const breadcrumbLinks = [
- { children: "Startseite", href: "/" },
- { children: "Kategorie", href: "/category" },
- { children: "Unterkategorie", href: "/category/subcategory" },
- { children: "Aktuelle Seite" },
+ { children: "Home", href: "/" },
+ { children: "Category", href: "/category" },
+ { children: "Subcategory", href: "/category/subcategory" },
+ { children: "Current Page" },
];
return (
diff --git a/packages/twenty-docs/l/de/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/de/twenty-ui/navigation/links.mdx
index 359760d9a9..fc6cdc4a27 100644
--- a/packages/twenty-docs/l/de/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/de/twenty-ui/navigation/links.mdx
@@ -20,7 +20,7 @@ A stylized link component for displaying contact information.
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log('Kontaktlink geklickt!', event);
+ console.log('Contact link clicked!', event);
};
return (
@@ -60,13 +60,13 @@ A stylized link component for displaying links.
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log("Kontaktlink geklickt!", event);
+ console.log("Contact link clicked!", event);
};
return (
- Kontaktieren Sie uns
+ Contact Us
);
@@ -97,13 +97,13 @@ A rounded-styled link with a Chip component for links.
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log("Kontaktlink geklickt!", event);
+ console.log("Contact link clicked!", event);
};
return (
- Kontaktieren Sie uns
+ Contact Us
);
diff --git a/packages/twenty-docs/l/de/twenty-ui/navigation/menu-item.mdx b/packages/twenty-docs/l/de/twenty-ui/navigation/menu-item.mdx
index c92f61992e..57853dfd96 100644
--- a/packages/twenty-docs/l/de/twenty-ui/navigation/menu-item.mdx
+++ b/packages/twenty-docs/l/de/twenty-ui/navigation/menu-item.mdx
@@ -18,18 +18,18 @@ Ein vielseitiger Menüpunkt, der in einem Menü oder einer Navigationsliste verw
export const MyComponent = () => {
const handleMenuItemClick = (event) => {
- console.log("Menüpunkt angeklickt!", event);
+ console.log("Menu item clicked!", event);
};
const handleButtonClick = (event) => {
- console.log("Symbolschaltfläche angeklickt!", event);
+ console.log("Icon button clicked!", event);
};
return (
{
const handleCommandClick = () => {
- console.log("Befehl geklickt!");
+ console.log("Command clicked!");
};
return (
{
const handleMenuItemClick = (event) => {
- console.log("Menüelement geklickt!", event);
+ console.log("Menu item clicked!", event);
};
return (
@@ -125,7 +125,7 @@ Ein verschiebbares Menüelement, das in einem Menü oder einer Liste verwendet w
iconButtons={[{ Icon: IconAlertCircle, onClick: handleButtonClick }]}
isTooltipOpen={false}
onClick={handleMenuItemClick}
- text="Menüelement verschiebbar"
+ text="Menu item draggable"
isDragDisabled={false}
className
/>
@@ -163,7 +163,7 @@ Bietet eine Möglichkeit, eine Mehrfachauswahl-Funktionalität mit einem zugehö
return (
@@ -199,7 +199,7 @@ Ein Mehrfachauswahl-Menüelement mit einem Avatar, einem Kontrollkästchen zur A
return (
}
- text="Erste Option"
+ text="First Option"
selected={false}
className
/>
@@ -231,13 +231,13 @@ Ein Menüelement mit einem optionalen linken Symbol, Textinhalt und einem nach r
export const MyComponent = () => {
const handleNavigation = () => {
- console.log("Zu einer anderen Seite navigieren");
+ console.log("Navigate to another page");
};
return (
@@ -268,13 +268,13 @@ Ein auswählbares Menüelement mit optionalem linken Inhalt (Symbol und Text) un
export const MyComponent = () => {
const handleSelection = () => {
- console.log("Menüelement ausgewählt");
+ console.log("Menu item selected");
};
return (
{
- console.log("Menüpunkt ausgewählt");
+ console.log("Menu item selected");
};
return (
}
- text="Erste Option"
+ text="First Option"
selected={true}
disabled={false}
hovered={false}
@@ -358,7 +358,7 @@ Ein wählbares Menüelement mit Farbbeispiel für Situationen, in denen Benutzer
export const MyComponent = () => {
const handleSelection = () => {
- console.log("Menüpunkt ausgewählt");
+ console.log("Menu item selected");
};
return (
@@ -405,7 +405,7 @@ Ein Menüelement mit einem zugehörigen Umschalter, mit dem Benutzer eine bestim
return (
console.log("Home geklickt"),
+ onClick: () => console.log("Home clicked"),
},
{
- name: "Profil",
+ name: "Profile",
Icon: IconUser,
- onClick: () => console.log("Profil geklickt"),
+ onClick: () => console.log("Profile clicked"),
},
{
- name: "Einstellungen",
+ name: "Settings",
Icon: IconSettings,
- onClick: () => console.log("Einstellungen geklickt"),
+ onClick: () => console.log("Settings clicked"),
},
];
diff --git a/packages/twenty-docs/l/de/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/de/twenty-ui/navigation/step-bar.mdx
index c5dd7d17d0..24c1b4031f 100644
--- a/packages/twenty-docs/l/de/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/de/twenty-ui/navigation/step-bar.mdx
@@ -17,9 +17,9 @@ Zeigt den Fortschritt durch eine Folge von nummerierten Schritten, indem der akt
export const MyComponent = () => {
return (
- Schritt 1
- Schritt 2
- Schritt 3
+ Step 1
+ Step 2
+ Step 3
);
};
diff --git a/packages/twenty-docs/l/de/user-guide/ai/capabilities/permissions-access-control.mdx b/packages/twenty-docs/l/de/user-guide/ai/capabilities/permissions-access-control.mdx
index 9df712a10a..e60f7a3058 100644
--- a/packages/twenty-docs/l/de/user-guide/ai/capabilities/permissions-access-control.mdx
+++ b/packages/twenty-docs/l/de/user-guide/ai/capabilities/permissions-access-control.mdx
@@ -1,5 +1,5 @@
---
-title: Berechtigungen & Zugriffskontrolle},{
+title: Permissions & Access Control
description: Steuern Sie, auf welche Daten KI-Agenten in Ihrem Arbeitsbereich zugreifen und was sie dort ändern können.
---
diff --git a/packages/twenty-docs/l/de/user-guide/billing/overview.mdx b/packages/twenty-docs/l/de/user-guide/billing/overview.mdx
index ee12587e41..1b14036e26 100644
--- a/packages/twenty-docs/l/de/user-guide/billing/overview.mdx
+++ b/packages/twenty-docs/l/de/user-guide/billing/overview.mdx
@@ -1,6 +1,6 @@
---
title: Abrechnung
-description: Understand Twenty pricing and manage your subscription.
+description: Verstehen Sie die Preisgestaltung von Twenty und verwalten Sie Ihr Abonnement.
image: /images/user-guide/setup/pricing.png
---
@@ -8,38 +8,38 @@ image: /images/user-guide/setup/pricing.png
-Twenty offers flexible pricing plans to fit your team's needs. Manage your subscription, track workflow credits, and access invoices all from **Settings → Billing**.
+Twenty bietet flexible Preispläne, die den Bedürfnissen Ihres Teams entsprechen. Verwalten Sie Ihr Abonnement, verfolgen Sie Workflow-Guthaben und greifen Sie auf Rechnungen zu – alles über **Einstellungen → Abrechnung**.
-## What's in this section
+## Was enthält dieser Abschnitt
-
- Learn about Twenty's pricing plans and what's included.
+
+ Erfahren Sie mehr über die Preispläne von Twenty und was enthalten ist.
- Frequently asked questions about pricing and billing.
+ Häufig gestellte Fragen zu Preisen und Abrechnung.
-## At a glance
+## Auf einen Blick
-| Plan | Key Features |
-| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| **Free (Self-Hosted)** | All Pro features, community support |
-| **Pro (Cloud)** | Everything apart from the Premium features (SSO and row-level permissions), standard support |
-| **Organization (Cloud)** | All from Pro + the Premium features (SSO and row-level permissions), priority support |
-| **Organization (Self-Hosted)** | All from Pro + the Premium features (SSO, row-level permissions), Twenty team support, not required to publish your custom code as open-source before distributing |
+| Plan | Wichtige Funktionen |
+| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Kostenlos (Selbstgehostet)** | Alle Pro-Funktionen, Community-Support |
+| **Pro (Cloud)** | Alles außer den Premium-Funktionen (SSO und zeilenbezogene Berechtigungen), Standardsupport |
+| **Organisation (Cloud)** | Alles aus Pro + die Premium-Funktionen (SSO und zeilenbezogene Berechtigungen), priorisierter Support |
+| **Organisation (Selbstgehostet)** | Alles aus Pro + die Premium-Funktionen (SSO, zeilenbezogene Berechtigungen), Support durch das Twenty-Team, keine Pflicht, Ihren benutzerdefinierten Code vor der Verteilung als Open Source zu veröffentlichen |
-## Quick answers
+## Schnelle Antworten
-**Where do I manage billing?**
-Go to **Settings → Billing** to view your plan, update payment methods, and access invoices.
+**Wo verwalte ich die Abrechnung?**
+Gehen Sie zu **Einstellungen → Abrechnung**, um Ihren Plan anzusehen, Zahlungsmethoden zu aktualisieren und auf Rechnungen zuzugreifen.
-**Can I use Twenty for free?**
-Yes! Self-host Twenty and get all Pro features at no cost.
+**Kann ich Twenty kostenlos nutzen?**
+Ja! Hosten Sie Twenty selbst und erhalten Sie alle Pro-Funktionen kostenlos.
-**How do I upgrade?**
-Go to **Settings → Billing** and click **Switch to Organization** or **Switch to Yearly**.
+**Wie führe ich ein Upgrade durch?**
+Gehen Sie zu **Einstellungen → Abrechnung** und klicken Sie auf **Zu Organisation wechseln** oder **Zum Jahresplan wechseln**.
-For more questions, see the [Billing FAQ](/l/de/user-guide/billing/how-tos/billing-faq).
+Weitere Fragen finden Sie in den [Abrechnungs-FAQs](/l/de/user-guide/billing/how-tos/billing-faq).
diff --git a/packages/twenty-docs/l/de/user-guide/calendar-emails/capabilities/calendar.mdx b/packages/twenty-docs/l/de/user-guide/calendar-emails/capabilities/calendar.mdx
index a84a2165cb..2c814e601c 100644
--- a/packages/twenty-docs/l/de/user-guide/calendar-emails/capabilities/calendar.mdx
+++ b/packages/twenty-docs/l/de/user-guide/calendar-emails/capabilities/calendar.mdx
@@ -1,23 +1,23 @@
---
title: Kalender
-description: Understanding calendar integration features in Twenty.
+description: Die Funktionen der Kalenderintegration in Twenty verstehen.
---
-**Note**: To connect your calendar and configure sync settings, visit [Email & Calendar Setup](/l/de/user-guide/calendar-emails/overview).
+**Hinweis**: Um Ihren Kalender zu verbinden und die Synchronisierungseinstellungen zu konfigurieren, besuchen Sie [E-Mail- & Kalendereinrichtung](/l/de/user-guide/calendar-emails/overview).
-## How Calendar Integration Works
+## Wie die Kalenderintegration funktioniert
-Twenty automatically syncs your calendar events and links them to the relevant CRM records, giving you a complete view of your meeting history with contacts and companies.
+Twenty synchronisiert Ihre Kalendertermine automatisch und verknüpft sie mit den entsprechenden CRM-Datensätzen, sodass Sie einen vollständigen Überblick über Ihre Meeting-Historie mit Kontakten und Unternehmen erhalten.
## Kalender-Reiter
-Next to the Emails tab on records, you'll find a `Calendar` tab that contains the history of meetings scheduled with the record.
+Neben dem Reiter E-Mails in Datensätzen finden Sie einen Reiter `Kalender`, der die Historie der mit dem Datensatz geplanten Meetings enthält.
-### Available For
+### Verfügbar für
* **Personen**: Alle mit einem bestimmten Kontakt geplanten Meetings anzeigen
* **Unternehmen**: Alle Meetings im Zusammenhang mit einem Unternehmen und seinen Mitarbeitern anzeigen
-* **Opportunities**: Access meeting history related to the company linked to this opportunity
+* **Chancen**: Zugriff auf die Meeting-Historie zur Firma, die mit dieser Chance verknüpft ist
### Meeting-Historie anzeigen
@@ -26,18 +26,18 @@ Next to the Emails tab on records, you'll find a `Calendar` tab that contains th
3. **Durchsuchen Sie die Meeting-Historie**: Alle geplanten Meetings und deren Details anzeigen
4. **Auf Meeting-Kontext zugreifen**: Teilnehmer, Zeiten und verwandte Informationen einsehen
-## Visibility Settings
+## Sichtbarkeitseinstellungen
-Calendar data follows the same visibility settings as emails, ensuring consistent privacy controls across both communication channels.
+Kalenderdaten folgen denselben Sichtbarkeitseinstellungen wie E-Mails und gewährleisten konsistente Datenschutzkontrollen in beiden Kommunikationskanälen.
## Was synchronisiert wird
-* **External Meetings**: All meetings with contacts outside your organization
-* **Automatic Linking**: Meetings connect to existing People and Company records based on attendee email addresses
-* **Meeting Details**: Subject, time, duration, and participants
-* **Updates**: New calendar events sync automatically
+* **Externe Meetings**: Alle Meetings mit Kontakten außerhalb Ihrer Organisation
+* **Automatische Verknüpfung**: Meetings werden basierend auf den E-Mail-Adressen der Teilnehmer mit bestehenden Personen- und Firmendatensätzen verknüpft
+* **Meeting-Details**: Betreff, Uhrzeit, Dauer und Teilnehmer
+* **Aktualisierungen**: Neue Kalendertermine werden automatisch synchronisiert
## Was nicht synchronisiert wird
-* **Internal Meetings**: Meetings with only colleagues (same domain) remain private
-* **Private Events**: Events marked as private in your calendar
+* **Interne Meetings**: Meetings zwischen Kollegen (gleiche Domain) bleiben privat
+* **Private Termine**: Termine, die in Ihrem Kalender als privat markiert sind
diff --git a/packages/twenty-docs/l/de/user-guide/dashboards/how-tos/dashboards-faq.mdx b/packages/twenty-docs/l/de/user-guide/dashboards/how-tos/dashboards-faq.mdx
index 4f50185c4a..317355deca 100644
--- a/packages/twenty-docs/l/de/user-guide/dashboards/how-tos/dashboards-faq.mdx
+++ b/packages/twenty-docs/l/de/user-guide/dashboards/how-tos/dashboards-faq.mdx
@@ -1,59 +1,59 @@
---
title: Dashboards FAQ
-description: Frequently asked questions about dashboards in Twenty.
+description: Häufig gestellte Fragen zu Dashboards in Twenty.
---
-
- No, dashboards are currently visible to everyone with access to your Twenty workspace. Private dashboards are not yet available.
+
+ Nein, Dashboards sind derzeit für alle sichtbar, die Zugriff auf deinen Twenty-Arbeitsbereich haben. Private Dashboards sind noch nicht verfügbar.
-
- Dashboards currently display data based on the viewer's timezone. If you're in different regions (e.g., APAC vs. US), you may see slightly different numbers for the same dashboard. We're working on adding a timezone setting per dashboard to ensure consistent data across teams.
+
+ Dashboards zeigen derzeit Daten basierend auf der Zeitzone der betrachtenden Person. Befinden sich Personen in unterschiedlichen Regionen (z. B. APAC vs. USA), können für dasselbe Dashboard leicht unterschiedliche Zahlen angezeigt werden. Wir arbeiten daran, eine Zeitzonen-Einstellung pro Dashboard hinzuzufügen, um teamübergreifend konsistente Daten sicherzustellen.
-
- Exporting dashboards is not available at the moment. This feature is on our roadmap.
+
+ Das Exportieren von Dashboards ist derzeit nicht verfügbar. Diese Funktion steht auf unserer Roadmap.
-
- No, sharing dashboards with users outside your Twenty workspace (non-Twenty users) is not currently supported.
+
+ Nein, das Teilen von Dashboards mit Benutzerinnen und Benutzern außerhalb deines Twenty-Arbeitsbereichs (Nicht-Twenty-Benutzer) wird derzeit nicht unterstützt.
-
- Open the dashboard you want to favorite, then click the star icon. Favorites are personal—they won't affect other users.
+
+ Öffne das Dashboard, das du zu den Favoriten hinzufügen möchtest, und klicke dann auf das Sternsymbol. Favoriten sind persönlich – sie wirken sich nicht auf andere Benutzer aus.
-
- * **Tabs** organize your dashboard into sections (like pages within the dashboard)
- * **Widgets** are the individual visualizations (charts, numbers, iFrames) within each tab
+
+ * **Tabs** organisieren dein Dashboard in Abschnitte (ähnlich wie Seiten innerhalb des Dashboards)
+ * **Widgets** sind die einzelnen Visualisierungen (Diagramme, Zahlen, iFrames) innerhalb jedes Tabs
- Structure: Dashboard → Tabs → Widgets
+ Struktur: Dashboard → Tabs → Widgets
-
- Bar charts have display limits: 100 bars for horizontal charts, 50 for vertical. If your data exceeds this, add filters to narrow down the results or change the grouping (e.g., group by week instead of day).
+
+ Balkendiagramme haben Anzeigegrenzen: 100 Balken bei horizontalen Diagrammen, 50 bei vertikalen. Wenn deine Daten darüber hinausgehen, füge Filter hinzu, um die Ergebnisse einzugrenzen, oder ändere die Gruppierung (z. B. nach Woche statt nach Tag gruppieren).
-
- Dashboard-level filters are not available yet, but this feature is on our roadmap. Currently, you need to apply filters to each widget individually.
+
+ Filter auf Dashboard-Ebene sind noch nicht verfügbar, aber diese Funktion steht auf unserer Roadmap. Derzeit musst du Filter für jedes Widget einzeln anwenden.
-
- Noch nicht. Gauge charts and tables are on our roadmap and will be added in a future release.
+
+ Noch nicht. Tachometerdiagramme und Tabellen stehen auf unserer Roadmap und werden in einer zukünftigen Version hinzugefügt.
-
- 1. Make sure you're in view mode (not editing)
- 2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
- 3. Select **Duplicate dashboard**
+
+ 1. Stelle sicher, dass du im Ansichtsmodus bist (nicht im Bearbeitungsmodus)
+ 2. Öffne die Befehlspalette mit **Cmd + K** (oder **Strg + K** unter Windows)
+ 3. Wähle **Dashboard duplizieren**
-
- Widgets update automatically as your CRM data changes:
+
+ Widgets aktualisieren sich automatisch, wenn sich deine CRM-Daten ändern:
- * Real-time updates for most metrics
- * Use the refresh button for a manual update if needed
- * Historical data is preserved for trend analysis
+ * Echtzeitaktualisierungen für die meisten Kennzahlen
+ * Verwende bei Bedarf die Schaltfläche zum Aktualisieren für eine manuelle Aktualisierung
+ * Historische Daten bleiben für Trendanalysen erhalten
diff --git a/packages/twenty-docs/l/de/user-guide/data-migration/capabilities/field-mapping.mdx b/packages/twenty-docs/l/de/user-guide/data-migration/capabilities/field-mapping.mdx
index 487a955154..69d342f9bb 100644
--- a/packages/twenty-docs/l/de/user-guide/data-migration/capabilities/field-mapping.mdx
+++ b/packages/twenty-docs/l/de/user-guide/data-migration/capabilities/field-mapping.mdx
@@ -1,176 +1,176 @@
---
-title: Field Mapping
-description: How field mapping works during data import.
+title: Feldzuordnung
+description: Wie die Feldzuordnung beim Datenimport funktioniert.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-## How Field Mapping Works
+## Wie die Feldzuordnung funktioniert
-When you upload a file, Twenty analyzes your columns and attempts to match them to existing fields.
+Wenn Sie eine Datei hochladen, analysiert Twenty Ihre Spalten und versucht, sie bestehenden Feldern zuzuordnen.
-### Automatic Mapping
+### Automatische Zuordnung
-Twenty tries to match columns based on:
+Twenty versucht, Spalten anhand der folgenden Kriterien abzugleichen:
-* Column header names (exact or similar matches)
-* Data type detection (dates, numbers, emails)
-* Common field patterns
+* Spaltenüberschriften (genaue oder ähnliche Übereinstimmungen)
+* Erkennung des Datentyps (Datum, Zahlen, E-Mails)
+* Häufige Feldmuster
-**Quick tip:** Export a few rows from the object you want to import. The exported file will have the exact column names Twenty expects, making automatic mapping seamless during import.
+**Schneller Tipp:** Exportieren Sie ein paar Zeilen aus dem Objekt, das Sie importieren möchten. Die exportierte Datei enthält genau die Spaltennamen, die Twenty erwartet, sodass die automatische Zuordnung beim Import reibungslos funktioniert.
-### Manual Mapping Options
+### Optionen für die manuelle Zuordnung
-For each column, you can:
+Für jede Spalte können Sie:
-* **Map to a field**: Select the matching Twenty field from a dropdown
-* **Do not map**: Skip the column entirely (data won't be imported)
+* **Einem Feld zuordnen**: Wählen Sie das passende Twenty-Feld aus einem Dropdown aus
+* **Nicht zuordnen**: Überspringen Sie die Spalte vollständig (Daten werden nicht importiert)
-**Fields must exist before import.** The import creates records, not fields. Create custom fields under **Settings → Data Model** before importing.
+**Felder müssen vor dem Import existieren.** Der Import erzeugt Datensätze, nicht Felder. Erstellen Sie benutzerdefinierte Felder vor dem Import unter **Einstellungen → Datenmodell**.
-## Field Type Compatibility
+## Kompatibilität der Feldtypen
-All field types available in the Data Model are supported for import.
+Alle im Datenmodell verfügbaren Feldtypen werden für den Import unterstützt.
-You can also import `id` values to either assign a specific ID to new records or update existing ones.
+Sie können auch `id`-Werte importieren, um neuen Datensätzen eine bestimmte ID zuzuweisen oder vorhandene zu aktualisieren.
-## Data Format Requirements
+## Anforderungen an das Datenformat
-**Some fields have special syntax.** We recommend downloading the sample file before preparing your import to see the expected syntax for each field type.
+**Einige Felder haben eine spezielle Syntax.** Wir empfehlen, vor der Vorbereitung Ihres Imports die Beispieldatei herunterzuladen, um die erwartete Syntax für jeden Feldtyp zu sehen.
-### Address Fields
+### Adressfelder
-Address is a nested field with multiple columns. Some can be left empty.
+Adresse ist ein verschachteltes Feld mit mehreren Spalten. Einige können leer bleiben.
-* **Address / Address 1**: Street address line 1
-* **Address / Address 2**: Street address line 2
-* **Address / City**: City name
-* **Address / State**: State or province
-* **Address / Country**: Country name
-* **Address / Post Code**: Postal/ZIP code
+* **Adresse / Adresszeile 1**: Adresszeile 1
+* **Adresse / Adresszeile 2**: Adresszeile 2
+* **Adresse / Stadt**: Stadtname
+* **Adresse / Bundesland**: Bundesland oder Provinz
+* **Adresse / Land**: Ländername
+* **Adresse / Postleitzahl**: Postleitzahl/ZIP-Code
-### Array Fields
+### Array-Felder
-Use the following format:
+Verwenden Sie folgendes Format:
```
["value1","value2"]
```
-### Boolean Fields
+### Boolesche Felder
-Use `TRUE` or `FALSE` (uppercase) - not `true` or `false`
+Verwenden Sie `TRUE` oder `FALSE` (Großbuchstaben) – nicht `true` oder `false`
-### Currency Fields
+### Währungsfelder
-Currency is a nested field with two columns that **both must be filled**:
+Währung ist ein verschachteltes Feld mit zwei Spalten, die **beide ausgefüllt werden müssen**:
-* **Amount / Amount**: The numeric value (e.g., `1234.56`)
-* **Amount / Currency**: The currency code (e.g., `USD`, `EUR`)
+* **Betrag / Betrag**: Der Zahlenwert (z. B. `1234.56`)
+* **Betrag / Währung**: Der Währungscode (z. B. `USD`, `EUR`)
-### Date Fields
+### Datumsfelder
-Supported formats:
+Unterstützte Formate:
-* `YYYY-MM-DD` (recommended)
+* `YYYY-MM-DD` (empfohlen)
* `MM/DD/YYYY`
* `DD/MM/YYYY`
-* ISO 8601 format
+* ISO-8601-Format
-### Domain Fields
+### Domain-Felder
-* It is recommended to use the format `https://domain.com` to avoid creating duplicates, as this is the format used for Companies created by the mailbox and calendar synchronizations
-* A `Domain Label` and `Domain URL` can be filled: best practice is to fill `domain.com` in the label and `https://domain.com` in the url
-* Domains must be unique within the Companies object
-* **Domains must be unique within the file to import**
+* Es wird empfohlen, das Format `https://domain.com` zu verwenden, um Duplikate zu vermeiden, da dies das Format für Unternehmen ist, die durch die Postfach- und Kalender-Synchronisierungen erstellt werden.
+* Es können ein `Domain Label` und eine `Domain URL` ausgefüllt werden: Best Practice ist, im Label `domain.com` und in der URL `https://domain.com` anzugeben
+* Domains müssen im Objekt Unternehmen eindeutig sein
+* **Domains müssen innerhalb der zu importierenden Datei eindeutig sein**
-### Email Fields
+### E-Mail-Felder
-* Must be valid email format
-* Emails must be unique within the People object
-* **Emails must be unique within the file to import**
-* For additional emails: use **Emails / Primary Email** for the main email, and **Emails / Additional Emails** with this format:
+* Müssen ein gültiges E-Mail-Format haben
+* E-Mails müssen im Objekt Personen eindeutig sein
+* **E-Mails müssen innerhalb der zu importierenden Datei eindeutig sein**
+* Für zusätzliche E-Mails: Verwenden Sie **E-Mails / Primäre E-Mail** für die Haupt-E-Mail und **E-Mails / Zusätzliche E-Mails** mit diesem Format:
```
["jane@twenty.com","jane.doe@twenty.com"]
```
-### Id Fields
+### ID-Felder
-Specifying an `id` during import is optional. Twenty auto-generates one if not provided.
+Die Angabe einer `id` während des Imports ist optional. Twenty erzeugt automatisch eine, wenn keine angegeben wird.
-Use cases for mapping an `id` column:
+Anwendungsfälle für die Zuordnung einer `id`-Spalte:
-* **Set a specific ID**: Choose the UUID for newly created records
-* **Update existing records**: Match against existing records to update them instead of creating duplicates. In that case, it is recommended to not map the other unique fields: mapping only one unique field ensures a smoother import.
+* **Spezifische ID festlegen**: Wählen Sie die UUID für neu erstellte Datensätze
+* **Vorhandene Datensätze aktualisieren**: Gegen vorhandene Datensätze abgleichen, um sie zu aktualisieren, anstatt Duplikate zu erstellen. In diesem Fall wird empfohlen, die anderen eindeutigen Felder nicht zuzuordnen: Die Zuordnung nur eines eindeutigen Feldes sorgt für einen reibungsloseren Import.
-If you provide an `id`, it must be in UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
+Wenn Sie eine `id` angeben, muss sie im UUID-Format sein (z. B. `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
-### JSON Fields
+### JSON-Felder
-Use valid JSON format:
+Verwenden Sie gültiges JSON-Format:
```
{"key":"value","key2":"value2"}
```
-### Links Fields
+### Link-Felder
-Similar to Domain fields:
+Ähnlich wie Domain-Felder:
-* Fill both the label and URL columns: **Links / Link URL** and **Links / Link Label**
-* Use full URL format: `https://example.com`
-* For secondary links, use **Links / Secondary Links** column with this format:
+* Füllen Sie sowohl die Spalten für Label und URL aus: **Links / Link-URL** und **Links / Link-Label**
+* Verwenden Sie das vollständige URL-Format: `https://example.com`
+* Für sekundäre Links verwenden Sie die Spalte **Links / Sekundäre Links** mit diesem Format:
```
[{"url":"https://twenty.com","label":"Twenty"}]
```
-### Multi-Select Fields
+### Mehrfachauswahl-Felder
-Use the **API names** (not the display labels) in the following format:
+Verwenden Sie die **API-Namen** (nicht die Anzeigenamen) in folgendem Format:
```
["VALUE1","VALUE2"]
```
-See [here](#finding-api-names-for-select-fields) where to find the API names.
+Siehe [hier](#finding-api-names-for-select-fields), wo Sie die API-Namen finden.
-New select options will not be created automatically by the import. They must be added under **Settings → Data Model** before importing.
+Neue Auswahloptionen werden durch den Import nicht automatisch erstellt. Sie müssen vor dem Import unter **Einstellungen → Datenmodell** hinzugefügt werden.
- **Import overwrites, it does not add.**
+ **Der Import überschreibt, er fügt nichts hinzu.**
- If a record already has `VALUE2` and `VALUE3` selected, and you import `["VALUE1"]`, the record will only have `VALUE1` after import. The previous selections are replaced, not merged.
+ Wenn ein Datensatz bereits `VALUE2` und `VALUE3` ausgewählt hat und Sie `[\"VALUE1\"]` importieren, hat der Datensatz nach dem Import nur noch `VALUE1`. Die bisherigen Auswahlen werden ersetzt, nicht zusammengeführt.
-### Number Fields
+### Zahlenfelder
-* Numbers only
-* Decimals use period: `1234.56`
-* No thousands separators
+* Nur Zahlen
+* Dezimalzahlen verwenden einen Punkt: `1234.56`
+* Keine Tausendertrennzeichen
-### Phone Fields
+### Telefonfelder
-Phone is a nested field with multiple columns that **must be filled**
+Telefon ist ein verschachteltes Feld mit mehreren Spalten, die **ausgefüllt werden müssen**
-* **Phones / Primary Phone Number**: The phone number (e.g., `4159095555`)
-* **Phones / Primary Phone Country Code**: Country code (e.g., `US`)
-* **Phones / Primary Phone Calling Code**: Dialing code (e.g., `+1`)
+* **Telefone / Primäre Telefonnummer**: Die Telefonnummer (z. B. `4159095555`)
+* **Telefone / Ländercode der primären Telefonnummer**: Ländercode (z. B. `US`)
+* **Telefone / Vorwahl der primären Telefonnummer**: Vorwahl (z. B. `+1`)
-### Rating Fields
+### Bewertungsfelder
-Use the API name format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, `RATING_5`
+Verwenden Sie das API-Namensformat: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, `RATING_5`
### Relationsfelder
-Please see our dedicated article: [Import Relations Between Objects](/l/de/user-guide/data-migration/capabilities/import-relations)
+Weitere Informationen finden Sie in unserem dedizierten Artikel: [Beziehungen zwischen Objekten importieren](/l/de/user-guide/data-migration/capabilities/import-relations)
### Auswahlfelder
-Use the **API name** of the option (not the display label):
+Verwenden Sie den **API-Namen** der Option (nicht den Anzeigenamen):
```
VALUE1
diff --git a/packages/twenty-docs/l/de/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx b/packages/twenty-docs/l/de/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
index 8f0c3825e2..c6806c79ba 100644
--- a/packages/twenty-docs/l/de/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
+++ b/packages/twenty-docs/l/de/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
@@ -1,5 +1,5 @@
---
-title: Bereiten Sie Ihre CSV-Dateien vor},{
+title: Prepare Your CSV Files
description: Vollständige Schritt-für-Schritt-Anleitung zum Formatieren deiner Daten für den Import in Twenty.
---
@@ -87,114 +87,114 @@ Telefon ist ein **verschachteltes Feld**, das mehrere Spalten benötigt:
| **Phones / Primary Phone Country Code** | `US` |
| **Phones / Primary Phone Calling Code** | `+1` |
-### Address Fields
+### Adressfelder
-Address is a **nested field** with multiple columns (some can be left empty):
+Adresse ist ein **verschachteltes Feld** mit mehreren Spalten (einige können leer bleiben):
-* **Address / Address 1**: Street address line 1
-* **Address / Address 2**: Street address line 2 (optional)
-* **Address / City**: City name
-* **Address / State**: State or province
-* **Address / Country**: Country name
-* **Address / Post Code**: Postal/ZIP code
+* **Adresse / Adresse 1**: Straßenadresse Zeile 1
+* **Adresse / Adresse 2**: Straßenadresse Zeile 2 (optional)
+* **Adresse / Stadt**: Stadtname
+* **Adresse / Bundesland**: Bundesstaat oder Provinz
+* **Adresse / Land**: Name des Landes
+* **Adresse / Postleitzahl**: Postleitzahl/ZIP-Code
-### Date Fields
+### Datumsfelder
-Use consistent formatting throughout your file:
+Verwenden Sie in Ihrer Datei ein einheitliches Format:
-* `YYYY-MM-DD` (recommended): `2024-03-15`
+* `YYYY-MM-DD` (empfohlen): `2024-03-15`
* `MM/DD/YYYY`: `03/15/2024`
* `DD/MM/YYYY`: `15/03/2024`
* ISO 8601: `2024-03-15T10:30:00Z`
-### Number Fields
+### Zahlenfelder
-* Numbers only (no text)
-* Use period for decimals: `1234.56`
-* No thousands separators (not `1,234.56`)
+* Nur Zahlen (kein Text)
+* Verwenden Sie den Punkt für Dezimalstellen: `1234.56`
+* Keine Tausendertrennzeichen (nicht `1,234.56`)
-### Currency Fields
+### Währungsfelder
-Currency is a **nested field** requiring two columns that **both must be filled**:
+Währung ist ein **verschachteltes Feld** und erfordert zwei Spalten, die **beide ausgefüllt werden müssen**:
-| Column | Beispiel |
-| --------------------- | --------- |
-| **Amount / Amount** | `1234.56` |
-| **Amount / Currency** | `USD` |
+| Spalte | Beispiel |
+| -------------------- | --------- |
+| **Betrag / Betrag** | `1234.56` |
+| **Betrag / Währung** | `USD` |
-### Boolean Fields
+### Boolesche Felder
-Use uppercase: `TRUE` or `FALSE`
+Großschreibung verwenden: `TRUE` oder `FALSE`
-Lowercase `true` or `false` will not work.
+Kleinschreibung `true` oder `false` funktioniert nicht.
### Auswahlfelder
-Use the **API name** of the option, not the display label.
+Verwenden Sie den **API-Namen** der Option, nicht den Anzeigenamen.
-**How to find API names:**
+**So finden Sie API-Namen:**
-1. Go to **Settings → Data Model**
-2. Select the object and field
-3. Enable **Advanced mode** (toggle at bottom right)
-4. Copy the API name (e.g., `OPTION_1`, not "Option 1")
+1. Gehen Sie zu **Einstellungen → Datenmodell**
+2. Wählen Sie das Objekt und das Feld aus
+3. Aktivieren Sie den **Erweiterten Modus** (Schalter unten rechts)
+4. Kopieren Sie den API-Namen (z. B. `OPTION_1`, nicht "Option 1")
-New select options are not created automatically. Add them in **Settings → Data Model** before importing.
+Neue Auswahloptionen werden nicht automatisch erstellt. Fügen Sie sie vor dem Import unter **Einstellungen → Datenmodell** hinzu.
-### Multi-Select Fields
+### Mehrfachauswahlfelder
-Use API names in array format:
+Verwenden Sie API-Namen im Array-Format:
```
["VALUE1","VALUE2"]
```
-### Array Fields
+### Array-Felder
-Use JSON array format:
+Verwenden Sie das JSON-Array-Format:
```
["value1","value2"]
```
-### Rating Fields
+### Bewertungsfelder
-Use the format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, or `RATING_5`
+Verwenden Sie das Format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4` oder `RATING_5`
-### Links/URL Fields
+### Links/URL-Felder
-Fill both columns:
+Füllen Sie beide Spalten aus:
-* **Links / Link Label**: `Twenty`
-* **Links / Link URL**: `https://twenty.com`
+* **Links / Link-Label**: `Twenty`
+* **Links / Link-URL**: `https://twenty.com`
-For secondary links, use the **Links / Secondary Links** column:
+Für sekundäre Links verwenden Sie die Spalte **Links / Sekundäre Links**:
```
[{"url":"https://twenty.com","label":"Twenty"}]
```
-### JSON Fields
+### JSON-Felder
-Use valid JSON format:
+Verwenden Sie ein gültiges JSON-Format:
```
{"key":"value","key2":"value2"}
```
-### ID Fields
+### ID-Felder
-* **Optional**: Twenty auto-generates IDs if not provided
-* **Format**: UUID (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`)
-* **Use case**: Include ID to update existing records instead of creating new ones
+* **Optional**: Twenty erstellt IDs automatisch, wenn sie nicht angegeben werden
+* **Format**: UUID (z. B. `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`)
+* **Anwendungsfall**: ID angeben, um bestehende Datensätze zu aktualisieren, statt neue zu erstellen
-## Step 5: Add Relation Columns (If Linking Records)
+## Schritt 5: Beziehungsspalten hinzufügen (bei Verknüpfung von Datensätzen)
-To link records to other objects (e.g., People to Companies), add a column with the unique identifier of the related record.
+Um Datensätze mit anderen Objekten zu verknüpfen (z. B. Personen mit Unternehmen), fügen Sie eine Spalte mit dem eindeutigen Bezeichner des zugehörigen Datensatzes hinzu.
-**Example**: Linking People to Companies
+**Beispiel**: Verknüpfung von Personen mit Unternehmen
-Add a column to your People CSV:
+Fügen Sie Ihrer Personen-CSV eine Spalte hinzu:
```
firstName,lastName,email,companyDomain
@@ -202,69 +202,69 @@ John,Smith,john@acme.com,https://acme.com
Jane,Doe,jane@widgets.co,https://widgets.co
```
-**Important rules for relations:**
+**Wichtige Regeln für Beziehungen:**
-* The parent record must already exist in Twenty
-* Use the **Domain URL** format (`https://domain.com`), not the label
-* Map only ONE unique identifier (don't include both `companyId` AND `companyDomain`)
-* For Workspace Members, use their **email** (not name)
+* Der übergeordnete Datensatz muss bereits in Twenty vorhanden sein
+* Verwenden Sie das **Domain-URL**-Format (`https://domain.com`), nicht die Bezeichnung
+* Ordnen Sie nur EINEN eindeutigen Bezeichner zu (nicht sowohl `companyId` ALS AUCH `companyDomain`)
+* Für Workspace-Mitglieder verwenden Sie deren **E-Mail** (nicht den Namen)
- **Import Order Matters!**
+ **Die Importreihenfolge ist wichtig!**
- Import the "one" side before the "many" side:
+ Importieren Sie die "One"-Seite vor der "Many"-Seite:
- 1. **Companies** first
- 2. **People** second (with company reference)
- 3. **Opportunities** third
+ 1. **Unternehmen** zuerst
+ 2. **Personen** als Zweites (mit Unternehmensreferenz)
+ 3. **Opportunities** als Drittes
- The parent record must exist before you can reference it.
+ Der übergeordnete Datensatz muss vorhanden sein, bevor Sie darauf verweisen können.
-See [How to Import Relations](/l/de/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for detailed instructions.
+Siehe [Beziehungen importieren](/l/de/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) für detaillierte Anleitungen.
-## Step 6: Ensure Fields Exist in Twenty
+## Schritt 6: Sicherstellen, dass Felder in Twenty vorhanden sind
-The import creates **records**, not **fields**. All fields you want to import must already exist in your data model.
+Der Import erstellt **Datensätze**, nicht **Felder**. Alle Felder, die Sie importieren möchten, müssen bereits in Ihrem Datenmodell vorhanden sein.
-**Before importing:**
+**Vor dem Import:**
-1. Go to **Settings → Data Model**
-2. Select your object
-3. Create any custom fields you need
-4. Note the exact field names (they must match your column headers)
+1. Gehen Sie zu **Einstellungen → Datenmodell**
+2. Wählen Sie Ihr Objekt aus
+3. Erstellen Sie alle benötigten benutzerdefinierten Felder
+4. Notieren Sie die exakten Feldnamen (sie müssen mit Ihren Spaltenüberschriften übereinstimmen)
-## Step 7: Final Checklist
+## Schritt 7: Abschluss-Checkliste
-Before uploading your file, verify:
+Überprüfen Sie vor dem Hochladen Ihrer Datei:
-File is CSV, XLSX, or XLS format
-File has fewer than 10,000 records
-Encoding is UTF-8
-No duplicate emails (for People) or domains (for Companies)
-Dates use consistent format throughout
-Domains use `https://domain.com` format
-Boolean fields use `TRUE` or `FALSE` (uppercase)
-Select fields use API names, not display labels
-All custom fields exist in Settings → Data Model
-Parent records imported before child records
-Relation columns reference existing records
+Datei ist im CSV-, XLSX- oder XLS-Format
+Datei enthält weniger als 10.000 Datensätze
+Zeichencodierung ist UTF-8
+Keine doppelten E-Mails (für Personen) oder Domains (für Unternehmen)
+Datumsangaben verwenden durchgehend ein einheitliches Format
+Domains verwenden das Format `https://domain.com`
+Boolesche Felder verwenden `TRUE` oder `FALSE` (Großschreibung)
+Auswahlfelder verwenden API-Namen, nicht Anzeigenamen
+Alle benutzerdefinierten Felder existieren in Einstellungen → Datenmodell
+Übergeordnete Datensätze vor untergeordneten Datensätzen importiert
+Beziehungsspalten verweisen auf vorhandene Datensätze
-## Common Mistakes to Avoid
+## Häufige Fehler, die Sie vermeiden sollten
-| Mistake | Solution |
-| -------------------------------------------- | ------------------------------------- |
-| Using `true` instead of `TRUE` | Boolean values must be uppercase |
-| Using display labels for Select fields | Find and use API names in Settings |
-| Importing People before Companies | Always import parent objects first |
-| Missing currency code for Currency fields | Fill both Amount and Currency columns |
-| Wrong domain format | Use `https://domain.com` consistently |
-| Mapping multiple unique fields for relations | Map only ONE (domain OR id, not both) |
+| Fehler | Lösung |
+| ----------------------------------------------------- | -------------------------------------------------------------- |
+| Verwendung von `true` statt `TRUE` | Boolesche Werte müssen in Großbuchstaben sein |
+| Verwendung von Anzeigenamen für Auswahlfelder | API-Namen in den Einstellungen suchen und verwenden |
+| Import von Personen vor Unternehmen | Importieren Sie stets zuerst die übergeordneten Objekte |
+| Fehlender Währungscode für Währungsfelder | Sowohl die Spalte Betrag als auch die Spalte Währung ausfüllen |
+| Falsches Domain-Format | `https://domain.com` konsequent verwenden |
+| Zuordnung mehrerer eindeutiger Felder für Beziehungen | Nur EINES zuordnen (Domain ODER ID, nicht beides) |
## Nächste Schritte
-Your file is ready! Now:
+Ihre Datei ist bereit! Jetzt:
-* [Import Companies](/l/de/user-guide/data-migration/how-tos/import-companies-via-csv) (import these first)
-* [Import Contacts](/l/de/user-guide/data-migration/how-tos/import-contacts-via-csv)
-* [Fix any import errors](/l/de/user-guide/data-migration/how-tos/fix-import-errors)
+* [Unternehmen importieren](/l/de/user-guide/data-migration/how-tos/import-companies-via-csv) (diese zuerst importieren)
+* [Kontakte importieren](/l/de/user-guide/data-migration/how-tos/import-contacts-via-csv)
+* [Importfehler beheben](/l/de/user-guide/data-migration/how-tos/fix-import-errors)
diff --git a/packages/twenty-docs/l/de/user-guide/data-model/how-tos/create-relation-fields.mdx b/packages/twenty-docs/l/de/user-guide/data-model/how-tos/create-relation-fields.mdx
index 2e136e5bce..c8a369d79e 100644
--- a/packages/twenty-docs/l/de/user-guide/data-model/how-tos/create-relation-fields.mdx
+++ b/packages/twenty-docs/l/de/user-guide/data-model/how-tos/create-relation-fields.mdx
@@ -1,60 +1,60 @@
---
-title: Create Relation Fields
-description: Step-by-step guide to connecting objects with relation fields.
+title: Relationsfelder erstellen
+description: Schritt-für-Schritt-Anleitung zum Verbinden von Objekten mit Relationsfeldern.
---
-Relation fields connect records from different objects—for example, linking People to Companies.
+Relationsfelder verbinden Datensätze aus verschiedenen Objekten — zum Beispiel Personen mit Unternehmen.
- **Relation names cannot be changed after creation** (they affect the API). Plan your names carefully.
+ **Relationsnamen können nach dem Erstellen nicht geändert werden** (sie wirken sich auf die API aus). Planen Sie Ihre Namen sorgfältig.
## Bevor Sie beginnen
-Decide:
+Entscheiden Sie:
-* Which objects are you connecting? (e.g., People → Companies)
-* Which is the "one" side? (e.g., Company)
-* Which is the "many" side? (e.g., People — many people work at one company)
-* What should the field be named on each side?
+* Welche Objekte verbinden Sie? (z. B. Personen → Unternehmen)
+* Welche ist die "One"-Seite? (z. B. Unternehmen)
+* Welche ist die "Many"-Seite? (z. B. Personen — viele Personen arbeiten bei einem Unternehmen)
+* Wie soll das Feld auf beiden Seiten heißen?
-See [Relation Fields](/l/de/user-guide/data-model/capabilities/relation-fields) for relation types explained.
+Siehe [Relationsfelder](/l/de/user-guide/data-model/capabilities/relation-fields) für Erläuterungen zu Relationstypen.
-## Steps
+## Schritte
-1. Go to **Settings → Data Model**
-2. Select the object where you want the relation (typically the "many" side)
-3. Click **+ Add Field**
-4. Select **Relation** as the field type
-5. Choose the **target object**
-6. Select **One-to-Many** or **Many-to-One**
-7. Enter field names for **both sides** of the relation
+1. Gehen Sie zu **Einstellungen → Datenmodell**
+2. Wählen Sie das Objekt aus, in dem Sie die Relation benötigen (typischerweise die "Many"-Seite)
+3. Klicken Sie auf **+ Feld hinzufügen**
+4. Wählen Sie **Relation** als Feldtyp aus
+5. Wählen Sie das **Zielobjekt** aus
+6. Wählen Sie **One-to-Many** oder **Many-to-One**
+7. Geben Sie Feldnamen für **beide Seiten** der Relation ein
8. Klicken Sie auf **Speichern**
-## Example: People → Companies
+## Beispiel: Personen → Unternehmen
-* Go to **Settings → Data Model → People**
-* Add a Relation field
-* Target: **Companies**
-* Type: **Many-to-One**
-* Field on People: **Company**
-* Field on Companies: **Employees**
+* Gehen Sie zu **Einstellungen → Datenmodell → Personen**
+* Fügen Sie ein Relationsfeld hinzu
+* Ziel: **Unternehmen**
+* Typ: **Many-to-One**
+* Feld bei Personen: **Unternehmen**
+* Feld bei Unternehmen: **Mitarbeitende**
-Now each Person can be linked to a Company, and each Company shows its People.
+Jetzt kann jede Person mit einem Unternehmen verknüpft werden, und jedes Unternehmen zeigt seine Mitarbeitenden.
-## Deleting a Relation
+## Eine Relation löschen
-1. Go to **Settings → Data Model**
-2. Find the relation field
-3. Click **⋮ → Deactivate**
+1. Gehen Sie zu **Einstellungen → Datenmodell**
+2. Suchen Sie das Relationsfeld
+3. Klicken Sie auf **⋮ → Deaktivieren**
-Links are preserved but hidden. Reactivate to restore.
+Verknüpfungen bleiben erhalten, sind jedoch verborgen. Reaktivieren, um wiederherzustellen.
- **Deleting a relation doesn't delete records.** Only the link between them is removed.
+ **Das Löschen einer Relation löscht keine Datensätze.** Es wird nur die Verknüpfung zwischen ihnen entfernt.
-## Related
+## Verwandt
-* [Relation Fields](/l/de/user-guide/data-model/capabilities/relation-fields) — types and limitations
-* [How to Import Relations](/l/de/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) — bulk import linked records
+* [Relationsfelder](/l/de/user-guide/data-model/capabilities/relation-fields) — Typen und Einschränkungen
+* [Relationen importieren](/l/de/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) — verknüpfte Datensätze im Stapel importieren
diff --git a/packages/twenty-docs/l/de/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx b/packages/twenty-docs/l/de/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
index b6e2fd94ad..e5efacd032 100644
--- a/packages/twenty-docs/l/de/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
+++ b/packages/twenty-docs/l/de/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
@@ -1,5 +1,5 @@
---
-title: Zugriff auf Ihre Ansicht beschränken},{
+title: Restrict Access to Your View
description: Steuern Sie, wer Ihre benutzerdefinierten Ansichten sehen kann.
---
diff --git a/packages/twenty-docs/l/de/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx b/packages/twenty-docs/l/de/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
index a3e56b818f..1a3589270a 100644
--- a/packages/twenty-docs/l/de/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
+++ b/packages/twenty-docs/l/de/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
@@ -1,5 +1,5 @@
---
-title: Erwarteten Betrag in Ihrer Pipeline anzeigen},{
+title: Show Expected Amount in Your Pipeline
description: Gewichtete Deal‑Werte basierend auf der Phasenwahrscheinlichkeit berechnen und anzeigen.
---
@@ -45,7 +45,7 @@ Wenn Benutzer diese berechneten Felder nicht manuell bearbeiten sollen:
Dadurch können nur die Workflows diese Werte aktualisieren.
-## Schritt 2: Workflow #1 erstellen — Probability bei Phasenwechsel aktualisieren
+## Schritt 2: Workflow #1 erstellen — Probability bei Phasenwechsel aktualisieren
Dieser Workflow setzt die Probability automatisch, wenn eine Opportunity in eine neue Phase wechselt.
@@ -97,7 +97,7 @@ Nachdem die Verzweigungen wieder zusammengeführt wurden:
* Feld: Expected Amount
* Wert: Amount × Probability
-## Schritt 3: Workflow #2 erstellen — Bei Änderung von Amount neu berechnen
+## Schritt 3: Workflow #2 erstellen — Bei Änderung von Amount neu berechnen
Dieser Workflow aktualisiert den Expected Amount, wenn sich der Amount des Deals ändert.
@@ -138,8 +138,8 @@ Jede Spalte zeigt nun den insgesamt gewichteten Pipeline‑Wert für diese Phase
| -------------------------- | ----------------------------------------------------------------------------------------- |
| **Feld „Probability“** | Speichert die phasenbasierte Gewinnwahrscheinlichkeit |
| **Feld „Expected Amount“** | Speichert Amount × Probability |
-| **Workflow #1** | Aktualisiert Probability bei Phasenwechsel und berechnet anschließend Expected Amount neu |
-| **Workflow #2** | Berechnet Expected Amount neu, wenn sich Amount ändert |
+| **Workflow #1** | Aktualisiert Probability bei Phasenwechsel und berechnet anschließend Expected Amount neu |
+| **Workflow #2** | Berechnet Expected Amount neu, wenn sich Amount ändert |
| **Aggregation** | Zeigt die Summe des Expected Amount pro Phase an |
## Verwandt
diff --git a/packages/twenty-docs/l/de/user-guide/workflows/capabilities/workflow-runs.mdx b/packages/twenty-docs/l/de/user-guide/workflows/capabilities/workflow-runs.mdx
index 61d1572a06..2feeacd721 100644
--- a/packages/twenty-docs/l/de/user-guide/workflows/capabilities/workflow-runs.mdx
+++ b/packages/twenty-docs/l/de/user-guide/workflows/capabilities/workflow-runs.mdx
@@ -1,92 +1,92 @@
---
title: Workflow-Läufe
-description: Monitor and manage workflow executions.
+description: Workflow-Ausführungen überwachen und verwalten.
image: /images/user-guide/workflows/workflow.png
---
-## About Runs
+## Über Läufe
-A **Run** is a record of a workflow execution. Every time a workflow is triggered—whether by a record event, schedule, manual action, or webhook—a new run is created.
+Ein **Lauf** ist ein Protokoll einer Workflow-Ausführung. Jedes Mal, wenn ein Workflow ausgelöst wird – sei es durch ein Datensatzereignis, einen Zeitplan, eine manuelle Aktion oder einen Webhook – wird ein neuer Lauf erstellt.
-## Viewing Runs
+## Läufe anzeigen
-### From the Workflow Editor
+### Im Workflow-Editor
-1. Open the workflow you want to monitor
-2. Click the **Runs** panel on the right side
-3. See a list of recent runs with their status
+1. Öffnen Sie den Workflow, den Sie überwachen möchten
+2. Klicken Sie auf das **Läufe**-Panel auf der rechten Seite
+3. Sehen Sie eine Liste der letzten Läufe mit ihrem Status
-### From the Workflow Runs View
+### In der Ansicht Workflow-Läufe
-1. Go to **Workflow Runs** in the sidebar
-2. View runs across all workflows
-3. Filter by status, workflow, or date
+1. Gehen Sie in der Seitenleiste zu **Workflow-Läufe**
+2. Zeigen Sie Läufe über alle Workflows hinweg an
+3. Filtern Sie nach Status, Workflow oder Datum
-## Run Statuses
+## Laufstatus
-| Status | Beschreibung |
-| ------------------- | ------------------------------------------------------------------------ |
-| **Wird ausgeführt** | Workflow is currently executing |
-| **Completed** | Workflow finished successfully |
-| **Failed** | Workflow encountered an error and stopped |
-| **Waiting** | Workflow is paused (e.g., waiting for a Delay action or Form submission) |
+| Status | Beschreibung |
+| ------------------- | ------------------------------------------------------------------------------------------------- |
+| **Wird ausgeführt** | Workflow wird derzeit ausgeführt |
+| **Abgeschlossen** | Workflow wurde erfolgreich abgeschlossen |
+| **Fehlgeschlagen** | Beim Workflow ist ein Fehler aufgetreten und wurde angehalten |
+| **Wartend** | Workflow ist angehalten (z. B. wartet auf eine Verzögerungsaktion oder eine Formularübermittlung) |
-## Run Details
+## Laufdetails
-Click on any run to see:
+Klicken Sie auf einen beliebigen Lauf, um Folgendes zu sehen:
-* **Status**: Current state of the run
-* **Started at**: When the run began
-* **Duration**: How long the run took
-* **Trigger data**: The input that started the workflow
-* **Step outputs**: Data returned by each step
-* **Error messages**: If the run failed, what went wrong
+* **Status**: Aktueller Zustand des Laufs
+* **Gestartet am**: Wann der Lauf begonnen hat
+* **Dauer**: Wie lange der Lauf gedauert hat
+* **Triggerdaten**: Die Eingabe, die den Workflow gestartet hat
+* **Schrittausgaben**: Daten, die von jedem Schritt zurückgegeben wurden
+* **Fehlermeldungen**: Falls der Lauf fehlgeschlagen ist – was schiefgelaufen ist
-## Step-by-Step Execution
+## Ausführung Schritt für Schritt
-Each run shows the progression through your workflow:
+Jeder Lauf zeigt den Fortschritt in Ihrem Workflow:
-1. See which steps completed successfully
-2. Identify where failures occurred
-3. View the data passed between steps
-4. Debug issues by examining step inputs and outputs
+1. Sehen Sie, welche Schritte erfolgreich abgeschlossen wurden
+2. Ermitteln Sie, wo Fehler aufgetreten sind
+3. Sehen Sie sich die zwischen den Schritten übergebenen Daten an
+4. Beheben Sie Probleme, indem Sie die Eingaben und Ausgaben der Schritte untersuchen
-## Error Handling
+## Fehlerbehandlung
-When a run fails:
+Wenn ein Lauf fehlschlägt:
-1. Open the failed run
-2. Find the step that caused the failure
-3. Check the error message for details
-4. Common issues:
- * Missing required fields
+1. Öffnen Sie den fehlgeschlagenen Lauf
+2. Finden Sie den Schritt, der den Fehler verursacht hat
+3. Prüfen Sie die Fehlermeldung auf Details
+4. Häufige Probleme:
+ * Fehlende erforderliche Felder
* Ungültiges Datenformat
- * External API errors
- * Permission issues
+ * Externe API-Fehler
+ * Berechtigungsprobleme
-## Re-running Workflows
+## Workflows erneut ausführen
-If a run fails, you can:
+Wenn ein Lauf fehlschlägt, können Sie:
-* Fix the underlying issue and wait for the next trigger
-* For manual workflows, trigger again with the same or updated data
-* Review the workflow logic to prevent future failures
+* Beheben Sie das zugrunde liegende Problem und warten Sie auf den nächsten Trigger
+* Bei manuellen Workflows erneut auslösen – mit denselben oder aktualisierten Daten
+* Überprüfen Sie die Workflow-Logik, um künftige Fehler zu vermeiden
-## Performance Tips
+## Tipps zur Leistung
-### Managing Run History
+### Laufhistorie verwalten
-* Runs are retained for historical reference
-* Very old runs may be archived automatically
-* Export run data if you need to keep records
+* Läufe werden zu Referenzzwecken aufbewahrt
+* Sehr alte Läufe können automatisch archiviert werden
+* Exportieren Sie Laufdaten, wenn Sie Aufzeichnungen aufbewahren müssen
-### Monitoring Best Practices
+### Best Practices für das Monitoring
-* Check runs regularly after activating new workflows
-* Review failed runs to identify patterns
+* Überprüfen Sie Läufe regelmäßig, nachdem Sie neue Workflows aktiviert haben
+* Überprüfen Sie fehlgeschlagene Läufe, um Muster zu erkennen
-## Related
+## Verwandte Themen
-* [Workflow Triggers](/l/de/user-guide/workflows/capabilities/workflow-triggers)
-* [Workflow Actions](/l/de/user-guide/workflows/capabilities/workflow-actions)
-* [Workflow Troubleshooting](/l/de/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)
+* [Workflow-Trigger](/l/de/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow-Aktionen](/l/de/user-guide/workflows/capabilities/workflow-actions)
+* [Workflow-Fehlerbehebung](/l/de/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)
diff --git a/packages/twenty-docs/l/de/user-guide/workflows/how-tos/need-more-help/professional-services.mdx b/packages/twenty-docs/l/de/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
index 3e9ad2be4b..d3b484c049 100644
--- a/packages/twenty-docs/l/de/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
+++ b/packages/twenty-docs/l/de/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
@@ -18,7 +18,7 @@ Erwägen Sie professionelle Dienstleistungen für:
### Einführungspakete
-Get help from our core team with our 4-hour [Onboarding packs](https://twenty.com/onboarding-packages):
+Holen Sie sich Unterstützung von unserem Kernteam mit unseren 4-stündigen [Einführungspaketen](https://twenty.com/onboarding-packages):
* **Workflow-Erstellung**: Erstellen Sie benutzerdefinierte Workflows für Ihre Geschäftsprozesse
* **Datenmodell-Design**: Optimieren Sie Ihre Datenstruktur für Workflow-Automatisierung
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/best-practices-server.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/best-practices-server.mdx
index b476a16282..d8f5c5ea7c 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/best-practices-server.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/best-practices-server.mdx
@@ -1,22 +1,22 @@
---
-title: Mejores prácticas
+title: Best Practices
---
-Este documento describe las mejores prácticas que debe seguir al trabajar en el backend.
+This document outlines the best practices you should follow when working on the backend.
-## Siga un enfoque modular
+## Follow a modular approach
-El backend sigue un enfoque modular, que es un principio fundamental al trabajar con NestJS. Asegúrese de descomponer su código en módulos reutilizables para mantener una base de código limpia y organizada.
-Cada módulo debe encapsular una característica o funcionalidad particular y tener un alcance bien definido. Este enfoque modular permite una clara separación de responsabilidades y elimina complejidades innecesarias.
+The backend follows a modular approach, which is a fundamental principle when working with NestJS. Make sure you break down your code into reusable modules to maintain a clean and organized codebase.
+Each module should encapsulate a particular feature or functionality and have a well-defined scope. This modular approach enables clear separation of concerns and removes unnecessary complexities.
-## Exponer servicios para usar en módulos
+## Expose services to use in modules
-Siempre cree servicios que tengan una responsabilidad clara y única, lo que mejora la legibilidad y mantenibilidad del código. Nombre los servicios de manera descriptiva y consistente.
+Always create services that have a clear and single responsibility, which enhances code readability and maintainability. Name the services descriptively and consistently.
-También debe exponer servicios que desee usar en otros módulos. Exponer servicios a otros módulos es posible a través del poderoso sistema de inyección de dependencias de NestJS, y promueve un acoplamiento débil entre los componentes.
+You should also expose services that you want to use in other modules. Exposing services to other modules is possible through NestJS's powerful dependency injection system, and promotes loose coupling between components.
-## Evitar usar el tipo `any`
+## Avoid using `any` type
-Cuando declara una variable como `any`, el verificador de tipos de TypeScript no realiza ninguna comprobación de tipos, lo que hace posible asignar cualquier tipo de valores a la variable. TypeScript utiliza la inferencia de tipos para determinar el tipo de la variable a partir del valor. Al declararlo como `any`, TypeScript ya no puede inferir el tipo. Esto dificulta la captura de errores relacionados con el tipo durante el desarrollo, lo que lleva a errores en tiempo de ejecución y hace que el código sea menos mantenible, menos fiable y más difícil de entender para otros.
+When you declare a variable as `any`, TypeScript's type checker doesn't perform any type checking, making it possible to assign any type of values to the variable. TypeScript uses type inference to determine the type of variable based on the value. By declaring it as `any`, TypeScript can no longer infer the type. This makes it hard to catch type-related errors during development, leading to runtime errors and makes the code less maintainable, less reliable, and harder to understand for others.
-Por eso todo debe tener un tipo. Entonces, si crea un nuevo objeto con un nombre y apellido, debe crear una interfaz o tipo que contenga un nombre y apellido y defina la forma del objeto que está manipulando.
+This is why everything should have a type. So if you create a new object with a first name and last name, you should create an interface or type that contains a first name and last name that defines the shape of the object you are manipulating.
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/custom-objects.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/custom-objects.mdx
index 7ce5c14c0b..7feec7a639 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/custom-objects.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/custom-objects.mdx
@@ -1,39 +1,39 @@
---
-title: Objetos personalizados
+title: Custom Objects
---
-Los objetos son estructuras que te permiten almacenar datos (registros, atributos y valores) específicos de una organización. Twenty proporciona tanto objetos estándar como personalizados.
+Objects are structures that allow you to store data (records, attributes, and values) specific to an organization. Twenty provides both standard and custom objects.
-Los objetos estándar son objetos incorporados con un conjunto de atributos disponibles para todos los usuarios. Ejemplos de objetos estándar en Twenty incluyen Empresa y Persona. Los objetos estándar tienen campos estándar que también están disponibles para todos los usuarios de Twenty, como Company.displayName.
+Standard objects are in-built objects with a set of attributes available for all users. Examples of standard objects in Twenty include Company and Person. Standard objects have standard fields that are also available for all Twenty users, like Company.displayName.
-Los objetos personalizados son objetos que puedes crear para almacenar información que es única para tu organización. No están incorporados; los miembros de tu espacio de trabajo pueden crear y personalizar objetos personalizados para albergar información para la cual los objetos estándar no son aptos.
+Custom objects are objects that you can create to store information that is unique to your organization. They are not built-in; members of your workspace can create and customize custom objects to hold information that standard objects aren't suitable for.
-## Esquema de alto nivel
+## High-level schema
-
+
-## Cómo funciona
+## How it works
-Los objetos personalizados provienen de tablas de metadatos que determinan la forma, el nombre y el tipo de los objetos. Toda esta información está presente en la base de datos del esquema de metadatos, que consta de tablas:
+Custom objects come from metadata tables that determine the shape, name, and type of the objects. All this information is present in the metadata schema database, consisting of tables:
-* **DataSource**: Detalles de dónde se encuentra la información.
-* **Object**: Describe el objeto y lo vincula a un DataSource.
-* **Field**: Describe los campos de un objeto y lo conecta al objeto.
+* **DataSource**: Details where the data is present.
+* **Object**: Describes the object and links to a DataSource.
+* **Field**: Outlines an Object's fields and connects to the Object.
-Para añadir un objeto personalizado, el workspaceMember consultará la API de /metadata. Esto actualiza los metadatos de acuerdo y calcula un esquema GraphQL basado en los metadatos, almacenándolo en un caché de GQL para su uso posterior.
+To add a custom object, the workspaceMember will query the /metadata API. This updates the metadata accordingly and computes a GraphQL schema based on the metadata, storing it in a GQL cache for later use.
-
+
-Para obtener datos, el proceso implica hacer consultas a través del endpoint /graphql y pasarlos a través del Query Resolver.
+To fetch data, the process involves making queries through the /graphql endpoint and passing them through the Query Resolver.
-
+
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/feature-flags.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/feature-flags.mdx
index 94da2aedd2..a261cfec3c 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/feature-flags.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/feature-flags.mdx
@@ -2,7 +2,7 @@
title: Feature Flags
---
-Feature flags are used to hide experimental features. Para Twenty, se configuran a nivel de espacio de trabajo y no a nivel de usuario.
+Feature flags are used to hide experimental features. For Twenty, they are set on workspace level and not on a user level.
## Adding a new feature flag
@@ -14,7 +14,7 @@ type FeatureFlagKey =
| ...;
```
-También agrégalo al enum en `feature-flag.entity.ts`:
+Also add it to the enum in `feature-flag.entity.ts`:
```ts
enum FeatureFlagKeys {
@@ -39,8 +39,8 @@ const isFeatureNameEnabled = useIsFeatureEnabled('IS_FEATURENAME_ENABLED');
## Configure feature flags for the deployment
-Cambie el registro correspondiente en la Tabla `core.featureFlag`:
+Change the corresponding record in the Table `core.featureFlag`:
-| iD | clave | workspaceId | valor |
-| --------- | ------------------------ | ------------------------- | ----------- |
-| Aleatorio | `IS_FEATURENAME_ENABLED` | ID del espacio de trabajo | `verdadero` |
+| id | key | workspaceId | value |
+| ------ | ------------------------ | ----------- | ------ |
+| Random | `IS_FEATURENAME_ENABLED` | WorkspaceID | `true` |
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx
index 027471a869..233d92ac8a 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx
@@ -1,9 +1,9 @@
---
-title: Arquitectura de Carpetas
-info: Una mirada detallada a la arquitectura de carpetas de nuestro servidor
+title: Folder Architecture
+info: A detailed look into our server folder architecture
---
-La estructura del directorio backend es la siguiente:
+The backend directory structure is as follows:
```
server
@@ -23,35 +23,35 @@ server
## Ability
-Define permisos e incluye gestores para cada entidad.
+Defines permissions and includes handlers for each entity.
-## Decoradores
+## Decorators
-Define decoradores personalizados en NestJS para funcionalidad adicional.
+Defines custom decorators in NestJS for added functionality.
-Ver [decoradores personalizados](https://docs.nestjs.com/custom-decorators) para más detalles.
+See [custom decorators](https://docs.nestjs.com/custom-decorators) for more details.
-## Filtros
+## Filters
-Incluye filtros de excepciones para manejar excepciones que puedan ocurrir en endpoints de GraphQL.
+Includes exception filters to handle exceptions that might occur in GraphQL endpoints.
-## Guardias
+## Guards
-Ver [guardias](https://docs.nestjs.com/guards) para más detalles.
+See [guards](https://docs.nestjs.com/guards) for more details.
## Health
-Incluye una API REST públicamente disponible (healthz) que devuelve un JSON para confirmar si la base de datos está funcionando como se esperaba.
+Includes a publicly available REST API (healthz) that returns a JSON to confirm whether the database is working as expected.
-## Metadatos
+## Metadata
-Define objetos personalizados y hace disponible una API de GraphQL (graphql/metadata).
+Defines custom objects and makes available a GraphQL API (graphql/metadata).
-## Espacio de trabajo
+## Workspace
-Genera y sirve un esquema GraphQL personalizado basado en los metadatos.
+Generates and serves custom GraphQL schema based on the metadata.
-### Estructura del Directorio de Espacio de Trabajo
+### Workspace Directory Structure
```
workspace
@@ -83,43 +83,43 @@ workspace
└───workspace.factory.ts
```
-La raíz del directorio de espacio de trabajo incluye el `espacio.trabajo.factory.ts`, un archivo que contiene la función `createGraphQLSchema`. Esta función genera un esquema específico para el espacio de trabajo utilizando los metadatos para adaptar un esquema para espacios de trabajo individuales. By separating the schema and resolver construction, we use the `makeExecutableSchema` function, which combines these discrete elements.
+The root of the workspace directory includes the `workspace.factory.ts`, a file containing the `createGraphQLSchema` function. This function generates workspace-specific schema by using the metadata to tailor a schema for individual workspaces. By separating the schema and resolver construction, we use the `makeExecutableSchema` function, which combines these discrete elements.
-Esta estrategia no solo se trata de organización, sino que también ayuda con la optimización, como el almacenamiento en caché de definiciones de tipos generados para mejorar el rendimiento y la escalabilidad.
+This strategy is not just about organization, but also helps with optimization, such as caching generated type definitions to enhance performance and scalability.
-### Constructor de Esquema de Espacio de Trabajo
+### Workspace Schema builder
-Genera el esquema GraphQL, e incluye:
+Generates the GraphQL schema, and includes:
-#### Fábricas:
+#### Factories:
-Constructores especializados para generar constructos relacionados con GraphQL.
+Specialised constructors to generate GraphQL-related constructs.
-* La fábrica de tipos traduce los metadatos de los campos en tipos GraphQL utilizando `TypeMapperService`.
-* La fábrica de definiciones de tipos crea objetos de entrada o salida de GraphQL derivados de `objectMetadata`.
+* The type.factory translates field metadata into GraphQL types using `TypeMapperService`.
+* The type-definition.factory creates GraphQL input or output objects derived from `objectMetadata`.
-#### Tipos GraphQL
+#### GraphQL Types
-Incluye enumeraciones, entradas, objetos y escalares, y sirve como bloques de construcción para la construcción del esquema.
+Includes enumerations, inputs, objects, and scalars, and serves as the building blocks for the schema construction.
-#### Interfaces y Definiciones de Objetos
+#### Interfaces and Object Definitions
-Contiene los planos para entidades GraphQL, e incluye tanto tipos predefinidos como personalizados como `MONEY` o `URL`.
+Contains the blueprints for GraphQL entities, and includes both predefined and custom types like `MONEY` or `URL`.
-#### Servicios
+#### Services
-Contiene el servicio responsable de asociar FieldMetadataType con su escalar de GraphQL apropiado o modificadores de consulta.
+Contains the service responsible for associating FieldMetadataType with its appropriate GraphQL scalar or query modifiers.
-#### Almacenamiento
+#### Storage
-Incluye la clase `TypeDefinitionsStorage` que contiene definiciones de tipos reutilizables, previniendo duplicación de tipos GraphQL.
+Includes the `TypeDefinitionsStorage` class that contains reusable type definitions, preventing duplication of GraphQL types.
-### Constructor de Resolver de Espacio de Trabajo
+### Workspace Resolver Builder
-Crea funciones de resolutor para consultar y modificar el esquema GraphQL.
+Creates resolver functions for querying and mutating the GraphQL schema.
-Cada fábrica en este directorio es responsable de producir un tipo de resolutor distinto, como el `FindManyResolverFactory`, diseñado para aplicación adaptable a través de varias tablas.
+Each factory in this directory is responsible for producing a distinct resolver type, such as the `FindManyResolverFactory`, designed for adaptable application across various tables.
-### Ejecutor de Consultas de Espacio de Trabajo
+### Workspace Query Runner
-Ejecuta las consultas generadas en la base de datos y analiza el resultado.
+Runs the generated queries on the database and parses the result.
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/queue.mdx
index 886d867a5f..6148c0fbf0 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/queue.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/queue.mdx
@@ -1,32 +1,32 @@
---
-title: Cola de Mensajes
+title: Message Queue
---
-Las colas facilitan la realización de operaciones asíncronas. Se pueden utilizar para realizar tareas en segundo plano, como enviar un correo de bienvenida al registrarse.
-Cada caso de uso tendrá su propia clase de cola extendida de `MessageQueueServiceBase`.
+Queues facilitate async operations to be performed. They can be used for performing background tasks such as sending a welcome email on register.
+Each use case will have its own queue class extended from `MessageQueueServiceBase`.
-Actualmente, solo soportamos `bull-mq`[bull-mq](https://bullmq.io/) como el controlador de cola.
+Currently, we only support `bull-mq`[bull-mq](https://bullmq.io/) as the queue driver.
-## Pasos para crear y usar una nueva cola
+## Steps to create and use a new queue
-1. Agregue un nombre de cola para su nueva cola en la enumeración `MESSAGE_QUEUES`.
-2. Proporcione la implementación de fábrica de la cola con el nombre de la cola como el token de dependencia.
-3. Inyecte la cola que creó en el módulo/servicio requerido con el nombre de la cola como el token de dependencia.
-4. Agregue una clase de trabajador con inyección basada en token, al igual que el productor.
+1. Add a queue name for your new queue under enum `MESSAGE_QUEUES`.
+2. Provide the factory implementation of the queue with the queue name as the dependency token.
+3. Inject the queue that you created in the required module/service with the queue name as the dependency token.
+4. Add worker class with token based injection just like producer.
-### Ejemplo de uso
+### Example usage
```ts
class Resolver {
constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
async onSomeAction() {
- //lógica de negocio
+ //business logic
await this.queue.add(someData);
}
}
-//trabajador asíncrono
+//async worker
class CustomWorker {
constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
this.initWorker();
@@ -34,7 +34,7 @@ class CustomWorker {
async initWorker() {
await this.queue.work(async ({ id, data }) => {
- //lógica del trabajador
+ //worker logic
});
}
}
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/server-commands.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/server-commands.mdx
index 8ff23cd86e..6951909788 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/server-commands.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/server-commands.mdx
@@ -1,19 +1,19 @@
---
-title: Comandos de Backend
+title: Backend Commands
---
-## Comandos útiles
+## Useful commands
-Estos comandos deben ejecutarse desde la carpeta packages/twenty-server.
+These commands should be executed from packages/twenty-server folder.
From any other folder you can run `npx nx {command} twenty-server` (or `npx nx run twenty-server:{command}`).
-### Configuración inicial
+### First time setup
```
-npx nx database:reset twenty-server # configurar la base de datos con semillas de desarrollo
+npx nx database:reset twenty-server # setup the database with dev seeds
```
-### Iniciando el servidor
+### Starting the server
```
npx nx run twenty-server:start
@@ -22,55 +22,56 @@ npx nx run twenty-server:start
### Lint
```
-npx nx run twenty-server:lint # pasar --fix para corregir errores de lint
+npx nx run twenty-server:lint # pass --fix to fix lint errors
```
-### Prueba
+### Test
```
-npx nx run twenty-server:test:unit # ejecutar pruebas unitarias
-npx nx run twenty-server:test:integration # ejecutar pruebas de integración
+npx nx run twenty-server:test:unit # run unit tests
+npx nx run twenty-server:test:integration # run integration tests
```
-Nota: puedes ejecutar `npx nx run twenty-server:test:integration:with-db-reset` en caso de que necesites restablecer la base de datos antes de ejecutar las pruebas de integración.
+Note: you can run `npx nx run twenty-server:test:integration:with-db-reset` in case you need to reset the database before running the integration tests.
-### Restablecer la base de datos
+### Resetting the database
-Si deseas restablecer y sembrar la base de datos, puedes ejecutar el siguiente comando:
+If you want to reset and seed the database, you can run the following command:
```bash
npx nx run twenty-server:database:reset
```
-### Migraciones
+### Migrations
-#### Para objetos en esquemas Core/Metadata (TypeORM)
+#### For objects in Core/Metadata schemas (TypeORM)
```bash
npx nx run twenty-server:typeorm migration:generate src/database/typeorm/core/migrations/nameOfYourMigration -d src/database/typeorm/core/core.datasource.ts
```
-#### Para objetos de Workspace
+#### For Workspace objects
-No hay archivos de migraciones, las migraciones se generan automáticamente para cada espacio de trabajo, se almacenan en la base de datos y se aplican con este comando
+There are no migrations files, migration are generated automatically for each workspace,
+stored in the database, and applied with this command
```bash
npx nx run twenty-server:command workspace:sync-metadata -f
```
- Esto eliminará la base de datos y volverá a ejecutar las migraciones y semillas.
+ This will drop the database and re-run the migrations and seed.
- Asegúrate de respaldar cualquier dato que desees conservar antes de ejecutar este comando.
+ Make sure to back up any data you want to keep before running this command.
-## Stack Tecnológico
+## Tech Stack
-Twenty utiliza principalmente NestJS para el backend.
+Twenty primarily uses NestJS for the backend.
-Prisma fue el primer ORM que usamos. Pero para permitir a los usuarios crear campos y objetos personalizados, un nivel más bajo tenía más sentido ya que necesitamos tener un control detallado. El proyecto ahora usa TypeORM.
+Prisma was the first ORM we used. But in order to allow users to create custom fields and custom objects, a lower-level made more sense as we need to have fine-grained control. The project now uses TypeORM.
-Así es como se ve la pila tecnológica ahora.
+Here's what the tech stack now looks like.
**Core**
@@ -78,23 +79,23 @@ Así es como se ve la pila tecnológica ahora.
* [TypeORM](https://typeorm.io/)
* [GraphQL Yoga](https://the-guild.dev/graphql/yoga-server)
-**Base de datos**
+**Database**
* [Postgres](https://www.postgresql.org/)
-**Integraciones de terceros**
+**Third-party integrations**
-* [Sentry](https://sentry.io/welcome/) para rastrear errores
+* [Sentry](https://sentry.io/welcome/) for tracking bugs
-**Pruebas**
+**Testing**
* [Jest](https://jestjs.io/)
-**Herramientas**
+**Tooling**
* [Yarn](https://yarnpkg.com/)
* [ESLint](https://eslint.org/)
-**Desarrollo**
+**Development**
* [AWS EKS](https://aws.amazon.com/eks/)
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/zapier.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/zapier.mdx
index e48563c818..46bcd563fc 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/zapier.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/zapier.mdx
@@ -1,50 +1,52 @@
---
-title: Aplicación Zapier
+title: Zapier App
---
-Sincroniza sin esfuerzo Twenty con más de 3000 aplicaciones usando [Zapier](https://zapier.com/). ¡Automatiza tareas, mejora la productividad y potencia tus relaciones con los clientes!
+Effortlessly sync Twenty with 3000+ apps using [Zapier](https://zapier.com/). Automate tasks, boost productivity, and supercharge your customer relationships!
-## Acerca de Zapier
+## About Zapier
-Zapier is a tool that allows you to automate workflows by connecting the apps that your team uses every day. El concepto fundamental de Zapier son los flujos de trabajo automatizados, llamados Zaps, que incluyen desencadenantes y acciones.
+Zapier is a tool that allows you to automate workflows by connecting the apps that your team uses every day. The fundamental concept of Zapier is automation workflows, called Zaps, and include triggers and actions.
-Puedes aprender más sobre cómo funciona Zapier [aquí](https://zapier.com/how-it-works).
+You can learn more about how Zapier works [here](https://zapier.com/how-it-works).
-## Configuración
+## Setup
-### Paso 1: Instalar paquetes de Zapier
+### Step 1: Install Zapier packages
```bash
-cd packages/twenty-zapier\n\nyarn
+cd packages/twenty-zapier
+
+yarn
```
-### Paso 2: Iniciar sesión con la CLI
+### Step 2: Login with the CLI
-Utiliza tus credenciales de Zapier para iniciar sesión usando la CLI:
+Use your Zapier credentials to log in using the CLI:
```bash
zapier login
```
-### Paso 3: Configurar variables de entorno
+### Step 3: Set environment variables
-Desde la carpeta `packages/twenty-zapier`, ejecuta:
+From the `packages/twenty-zapier` folder, run:
```bash
cp .env.example .env
```
-Ejecuta la aplicación localmente, ve a [http://localhost:3000/settings/api-webhooks](http://localhost:3000/settings/api-webhooks) y genera una clave API.
+Run the application locally, go to [http://localhost:3000/settings/api-webhooks](http://localhost:3000/settings/api-webhooks), and generate an API key.
-Reemplaza el valor de **YOUR_API_KEY** en el archivo `.env` con la clave API que acabas de generar.
+Replace the **YOUR_API_KEY** value in the `.env` file with the API key you just generated.
-## Desarrollo
+## Development
- Asegúrate de ejecutar `yarn build` antes de cualquier comando `zapier`.
+ Make sure to run `yarn build` before any `zapier` command.
-### Prueba
+### Test
```bash
yarn test
@@ -56,25 +58,25 @@ yarn test
yarn format
```
-### Observa y compila mientras editas el código
+### Watch and compile as you edit code
```bash
yarn watch
```
-### Valida tu aplicación Zapier
+### Validate your Zapier app
```bash
yarn validate
```
-### Despliega tu aplicación Zapier
+### Deploy your Zapier app
```bash
yarn deploy
```
-### Lista todos los comandos de Zapier CLI
+### List all Zapier CLI commands
```bash
zapier
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/bug-and-requests.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/bug-and-requests.mdx
index 89beb92596..4db64b703d 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/bug-and-requests.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/bug-and-requests.mdx
@@ -3,21 +3,21 @@ title: Bugs, Requests & Pull Requests
info: Report issues, request features, and contribute code
---
-## Reportar errores
+## Reporting Bugs
-Para reportar un error, por favor [crea un problema en GitHub](https://github.com/twentyhq/twenty/issues/new).
+To report a bug, please [create an issue on GitHub](https://github.com/twentyhq/twenty/issues/new).
-También puedes pedir ayuda en [Discord](https://discord.gg/cx5n4Jzs57).
+You can also ask for help on [Discord](https://discord.gg/cx5n4Jzs57).
-## Solicitudes de funciones
+## Feature Requests
-Si no estás seguro de si es un error y sientes que está más cerca de una solicitud de función, entonces probablemente deberías [abrir una discusión en su lugar](https://github.com/twentyhq/twenty/discussions/new).
+If you're not sure if it's a bug, and you feel it's closer to a feature request, then you should probably [open a discussion instead](https://github.com/twentyhq/twenty/discussions/new).
## Submit a Pull Request
Contributing code to Twenty starts with a pull request (PR).
-### Antes de empezar
+### Before You Start
1. Check [existing issues](https://github.com/twentyhq/twenty/issues) for related work
2. For new features, open an issue first to discuss
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/best-practices-front.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
index 04ca6f0237..187c2d848c 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
@@ -1,19 +1,19 @@
---
-title: Mejores prácticas
+title: Best Practices
---
-Este documento describe las mejores prácticas que debes seguir al trabajar en el frontend.
+This document outlines the best practices you should follow when working on the frontend.
-## Gestión de estado
+## State management
-React y Recoil manejan la gestión de estado en la base de código.
+React and Recoil handle state management in the codebase.
-### Usa `useRecoilState` para almacenar el estado
+### Use `useRecoilState` to store state
-Es buena práctica crear tantos átomos como necesites para almacenar tu estado.
+It's good practice to create as many atoms as you need to store your state.
- Es mejor usar átomos adicionales que intentar ser demasiado concisos con la perforación de props.
+ It's better to use extra atoms than trying to be too concise with props drilling.
```tsx
@@ -36,45 +36,45 @@ export const MyComponent = () => {
}
```
-### No uses `useRef` para almacenar el estado
+### Do not use `useRef` to store state
-Evita usar `useRef` para almacenar el estado.
+Avoid using `useRef` to store state.
-Si deseas almacenar el estado, deberías usar `useState` o `useRecoilState`.
+If you want to store state, you should use `useState` or `useRecoilState`.
-Consulta [cómo gestionar las re-renderizaciones](#managing-re-renders) si sientes que necesitas `useRef` para evitar algunas re-renderizaciones.
+See [how to manage re-renders](#managing-re-renders) if you feel like you need `useRef` to prevent some re-renders from happening.
-## Gestión de las re-renderizaciones
+## Managing re-renders
-Las re-renderizaciones pueden ser difíciles de gestionar en React.
+Re-renders can be hard to manage in React.
-Aquí hay algunas reglas a seguir para evitar re-renderizaciones innecesarias.
+Here are some rules to follow to avoid unnecessary re-renders.
-Ten en cuenta que siempre puedes evitar re-renderizaciones comprendiendo su causa.
+Keep in mind that you can **always** avoid re-renders by understanding their cause.
-### Trabaja a nivel de raíz
+### Work at the root level
-Ahora es fácil evitar re-renderizaciones en nuevas funciones eliminándolas a nivel de raíz.
+Avoiding re-renders in new features is now made easy by eliminating them at the root level.
-El componente acompañante `PageChangeEffect` contiene solo un `useEffect` que alberga toda la lógica para ejecutar en un cambio de página.
+The `PageChangeEffect` sidecar component contains just one `useEffect` that holds all the logic to execute on a page change.
-De esa manera, sabes que solo hay un lugar que puede desencadenar una re-renderización.
+That way you know that there's just one place that can trigger a re-render.
-### Siempre piensa dos veces antes de añadir `useEffect` en tu base de código.
+### Always think twice before adding `useEffect` in your codebase
-Las re-renderizaciones son a menudo causadas por `useEffect` innecesarios.
+Re-renders are often caused by unnecessary `useEffect`.
-Deberías pensar si necesitas `useEffect`, o si puedes mover la lógica a una función manejadora de eventos.
+You should think whether you need `useEffect`, or if you can move the logic in a event handler function.
-Por lo general, encontrarás fácil mover la lógica a una función `handleClick` o `handleChange`.
+You'll find it generally easy to move the logic in a `handleClick` or `handleChange` function.
-También puedes encontrarlas en bibliotecas como Apollo: `onCompleted`, `onError`, etc.
+You can also find them in libraries like Apollo: `onCompleted`, `onError`, etc.
-### Usa un componente hermano para extraer `useEffect` o lógica de obtención de datos
+### Use a sibling component to extract `useEffect` or data fetching logic
-Si sientes que necesitas añadir un `useEffect` en tu componente raíz, deberías considerar extraerlo en un componente acompañante.
+If you feel like you need to add a `useEffect` in your root component, you should consider extracting it in a sidecar component.
-Puedes aplicar lo mismo para la lógica de obtención de datos, con hooks de Apollo.
+You can apply the same for data fetching logic, with Apollo hooks.
```tsx
// ❌ Bad, will cause re-renders even if data is not changing,
@@ -129,43 +129,43 @@ export const App = () => (
);
```
-### Usa estados de familia de recoil y selectores de familia de recoil
+### Use recoil family states and recoil family selectors
-Los estados y selectores de familia de recoil son una gran manera de evitar re-renderizaciones.
+Recoil family states and selectors are a great way to avoid re-renders.
-Son útiles cuando necesitas almacenar una lista de elementos.
+They are useful when you need to store a list of items.
-### No deberías usar `React.memo(MyComponent)`
+### You shouldn't use `React.memo(MyComponent)`
-Evita usar `React.memo()` porque no resuelve la causa de la re-renderización, sino que rompe la cadena de re-renderización, lo que puede llevar a un comportamiento inesperado y hacer que el código sea muy difícil de refactorizar.
+Avoid using `React.memo()` because it does not solve the cause of the re-render, but instead breaks the re-render chain, which can lead to unexpected behavior and make the code very hard to refactor.
-### Limita el uso de `useCallback` o `useMemo`
+### Limit `useCallback` or `useMemo` usage
-A menudo no son necesarios y harán que el código sea más difícil de leer y mantener para una ganancia de rendimiento que es imperceptible.
+They are often not necessary and will make the code harder to read and maintain for a gain of performance that is unnoticeable.
## Console.logs
-Las declaraciones `console.log` son valiosas durante el desarrollo, ofreciendo información en tiempo real sobre los valores de las variables y el flujo de código. Pero, dejarlas en el código de producción puede llevar a varios problemas:
+`console.log` statements are valuable during development, offering real-time insights into variable values and code flow. But, leaving them in production code can lead to several issues:
-1. **Rendimiento**: El registro excesivo puede afectar el rendimiento en tiempo de ejecución, especialmente en aplicaciones del lado del cliente.
+1. **Performance**: Excessive logging can affect the runtime performance, especially on client-side applications.
-2. **Seguridad**: Registrar datos sensibles puede exponer información crítica a cualquier persona que inspeccione la consola del navegador.
+2. **Security**: Logging sensitive data can expose critical information to anyone who inspects the browser's console.
-3. **Limpieza**: Llenar la consola con registros puede oscurecer advertencias o errores importantes que los desarrolladores o herramientas necesitan ver.
+3. **Cleanliness**: Filling up the console with logs can obscure important warnings or errors that developers or tools need to see.
-4. **Profesionalismo**: Los usuarios finales o clientes que revisen la consola y vean una miríada de declaraciones de registros podrían cuestionar la calidad y el acabado del código.
+4. **Professionalism**: End users or clients checking the console and seeing a myriad of log statements might question the code's quality and polish.
-Asegúrate de eliminar todos los `console.logs` antes de enviar el código a producción.
+Make sure you remove all `console.logs` before pushing the code to production.
-## Nomenclatura
+## Naming
-### Nombres de variables
+### Variable Naming
-Los nombres de variables deben describir con precisión el propósito o función de la variable.
+Variable names ought to precisely depict the purpose or function of the variable.
-#### El problema con los nombres genéricos
+#### The issue with generic names
-Los nombres genéricos en programación no son ideales porque carecen de especificidad, lo que lleva a la ambigüedad y reduce la legibilidad del código. Tales nombres no transmiten el propósito de la variable o función, lo que dificulta a los desarrolladores entender la intención del código sin una investigación más profunda. Esto puede resultar en un aumento del tiempo de depuración, una mayor susceptibilidad a errores y dificultades en el mantenimiento y colaboración. Mientras tanto, la nomenclatura descriptiva hace que el código sea autoexplicativo y más fácil de navegar, mejorando la calidad del código y la productividad del desarrollador.
+Generic names in programming are not ideal because they lack specificity, leading to ambiguity and reduced code readability. Such names fail to convey the variable or function's purpose, making it challenging for developers to understand the code's intent without deeper investigation. This can result in increased debugging time, higher susceptibility to errors, and difficulties in maintenance and collaboration. Meanwhile, descriptive naming makes the code self-explanatory and easier to navigate, enhancing code quality and developer productivity.
```tsx
// ❌ Bad, uses a generic name that doesn't communicate its
@@ -178,13 +178,13 @@ const [value, setValue] = useState('');
const [email, setEmail] = useState('');
```
-#### Algunas palabras a evitar en los nombres de variables
+#### Some words to avoid in variable names
* dummy
-### Manejadores de eventos
+### Event handlers
-Los nombres de manejadores de eventos deben comenzar con `handle`, mientras que `on` es un prefijo usado para nombrar eventos en las props de los componentes.
+Event handler names should start with `handle`, while `on` is a prefix used to name events in components props.
```tsx
// ❌ Bad
@@ -200,13 +200,13 @@ const handleEmailChange = (val: string) => {
};
```
-## Props opcionales
+## Optional Props
-Evita pasar el valor predeterminado para una prop opcional.
+Avoid passing the default value for an optional prop.
-**EJEMPLO**
+**EXAMPLE**
-Toma el componente `EmailField` definido a continuación:
+Take the`EmailField` component defined below:
```tsx
type EmailFieldProps = {
@@ -219,7 +219,7 @@ const EmailField = ({ value, disabled = false }: EmailFieldProps) => (
);
```
-**Uso**
+**Usage**
```tsx
// ❌ Bad, passing in the same value as the default value adds no value
@@ -231,11 +231,11 @@ const Form = () => ;
const Form = () => ;
```
-## Componente como props
+## Component as props
-Intenta tanto como sea posible pasar componentes no instanciados como propiedades, para que los hijos puedan decidir por sí mismos qué propiedades necesitan pasar.
+Try as much as possible to pass uninstantiated components as props, so children can decide on their own of what props they need to pass.
-El ejemplo más común de esto son los componentes de icono:
+The most common example for that is icon components:
```tsx
const SomeParentComponent = () => ;
@@ -252,25 +252,25 @@ const MyComponent = ({ MyIcon }: { MyIcon: IconComponent }) => {
};
```
-Para que React entienda que el componente es un componente, necesitas usar PascalCase, para luego instanciarlo con ``
+For React to understand that the component is a component, you need to use PascalCase, to later instantiate it with ``
-## Prop Drilling: Mantenlo Minimalista
+## Prop Drilling: Keep It Minimal
-El prop drilling, en el contexto de React, se refiere a la práctica de pasar variables de estado y sus setters a través de muchas capas de componentes, incluso si los componentes intermedios no los usan. Aunque a veces es necesario, el exceso de prop drilling puede llevar a:
+Prop drilling, in the React context, refers to the practice of passing state variables and their setters through many component layers, even if intermediary components don't use them. While sometimes necessary, excessive prop drilling can lead to:
-1. **Readabilidad Reducida**: Rastrear de dónde proviene una propiedad o dónde se utiliza puede volverse complicado en una estructura de componentes muy anidada.
+1. **Decreased Readability**: Tracing where a prop originates or where it's utilized can become convoluted in a deeply nested component structure.
-2. **Desafíos de Mantenimiento**: Los cambios en la estructura de propiedades de un componente podrían requerir ajustes en varios componentes, incluso si no utilizan directamente la propiedad.
+2. **Maintenance Challenges**: Changes in one component's prop structure might require adjustments in several components, even if they don't directly use the prop.
-3. **Reducción de la Reusabilidad del Componente**: Un componente que recibe muchas propiedades solo para pasarlas se vuelve menos general y más difícil de reutilizar en diferentes contextos.
+3. **Reduced Component Reusability**: A component receiving a lot of props solely for passing them down becomes less general-purpose and harder to reuse in different contexts.
-Si sientes que estás usando en exceso el prop drilling, consulta [mejores prácticas de gestión de estado](#state-management).
+If you feel that you are using excessive prop drilling, see [state management best practices](#state-management).
-## Importar
+## Imports
-Al importar, opta por los alias designados en lugar de especificar rutas completas o relativas.
+When importing, opt for the designated aliases rather than specifying complete or relative paths.
-**Alias del identificador**
+**The Aliases**
```js
{
@@ -282,7 +282,7 @@ Al importar, opta por los alias designados en lugar de especificar rutas complet
}
```
-**Uso**
+**Usage**
```tsx
// ❌ Bad, specifies the entire relative path
@@ -300,9 +300,9 @@ import { CatalogDecorator } from '~/testing/decorators/CatalogDecorator';
import { ComponentDecorator } from 'twenty-ui/testing';
```
-## Validación de Esquema
+## Schema Validation
-[Zod](https://github.com/colinhacks/zod) es el validador de esquemas para objetos no tipados:
+[Zod](https://github.com/colinhacks/zod) is the schema validator for untyped objects:
```js
const validationSchema = z
@@ -320,6 +320,6 @@ const validationSchema = z
type Form = z.infer;
```
-## Cambios Cruciales
+## Breaking Changes
-Siempre ejecuta pruebas manuales exhaustivas antes de proceder para garantizar que las modificaciones no hayan causado interrupciones en otras partes, dado que las pruebas aún no se han integrado extensivamente.
+Always perform thorough manual testing before proceeding to guarantee that modifications haven’t caused disruptions elsewhere, given that tests have not yet been extensively integrated.
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
index ae0c15a604..064ac5c256 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
@@ -1,11 +1,11 @@
---
-title: Arquitectura de Carpetas
+title: Folder Architecture
info: A detailed look into our folder architecture
---
-En esta guía, explorarás los detalles de la estructura del directorio del proyecto y cómo contribuye a la organización y mantenibilidad de Twenty.
+In this guide, you will explore the details of the project directory structure and how it contributes to the organization and maintainability of Twenty.
-Siguiendo esta convención de arquitectura de carpetas, es más fácil encontrar los archivos relacionados con funciones específicas y asegurar que la aplicación sea escalable y mantenible.
+By following this folder architecture convention, it's easier to find the files related to specific features and ensure that the application is scalable and maintainable.
```
front
@@ -22,14 +22,14 @@ front
└───...
```
-## Páginas
+## Pages
-Incluye los componentes de alto nivel definidos por las rutas de la aplicación. Importan más componentes de bajo nivel de la carpeta de módulos (más detalles abajo).
+Includes the top-level components defined by the application routes. They import more low-level components from the modules folder (more details below).
-## Módulos
+## Modules
-Cada módulo representa una función o un grupo de funciones, comprendiendo sus componentes específicos, estados y lógica operativa.
-Todos deberían seguir la estructura siguiente. Puedes anidar módulos dentro de módulos (denominados submódulos) y se aplicarán las mismas reglas.
+Each module represents a feature or a group of feature, comprising its specific components, states, and operational logic.
+They should all follow the structure below. You can nest modules within modules (referred to as submodules) and the same rules will apply.
```
module1
@@ -50,60 +50,60 @@ module1
└───utils
```
-### Contextos
+### Contexts
-Un contexto es una manera de pasar datos a través del árbol de componentes sin tener que pasar propiedades manualmente en cada nivel.
+A context is a way to pass data through the component tree without having to pass props down manually at every level.
-Ver [React Context](https://react.dev/reference/react#context-hooks) para más detalles.
+See [React Context](https://react.dev/reference/react#context-hooks) for more details.
### GraphQL
-Incluye fragmentos, consultas y mutaciones.
+Includes fragments, queries, and mutations.
-Ver [GraphQL](https://graphql.org/learn/) para más detalles.
+See [GraphQL](https://graphql.org/learn/) for more details.
-* Fragmentos
+* Fragments
-Un fragmento es una parte reutilizable de una consulta, que puedes usar en diferentes lugares. Usando fragmentos, es más fácil evitar la duplicación de código.
+A fragment is a reusable piece of a query, which you can use in different places. By using fragments, it's easier to avoid duplicating code.
-Ver [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) para más detalles.
+See [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) for more details.
-* Consultas
+* Queries
-Ver [GraphQL Queries](https://graphql.org/learn/queries/) para más detalles.
+See [GraphQL Queries](https://graphql.org/learn/queries/) for more details.
-* Mutaciones
+* Mutations
-Ver [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) para más detalles.
+See [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) for more details.
### Hooks
-Ver [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) para más detalles.
+See [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) for more details.
-### Estados
+### States
-Contiene la lógica de gestión de estado. [RecoilJS](https://recoiljs.org) maneja esto.
+Contains the state management logic. [RecoilJS](https://recoiljs.org) handles this.
-* Selectores: Ver [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) para más detalles.
+* Selectors: See [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) for more details.
-La gestión de estado incorporada de React todavía maneja el estado dentro de un componente.
+React's built-in state management still handles state within a component.
-### Utilidades
+### Utils
-Debería contener solo funciones puras reutilizables. De lo contrario, crea hooks personalizados en la carpeta `hooks`.
+Should just contain reusable pure functions. Otherwise, create custom hooks in the `hooks` folder.
-## Interfaz de usuario
+## UI
-Contiene todos los componentes de interfaz de usuario reutilizables utilizados en la aplicación.
+Contains all the reusable UI components used in the application.
-Esta carpeta puede contener subcarpetas, como `datos`, `visualización`, `retroalimentación` y `entrada` para tipos específicos de componentes. Cada componente debe ser autónomo y reutilizable, para que puedas usarlo en diferentes partes de la aplicación.
+This folder can contain sub-folders, like `data`, `display`, `feedback`, and `input` for specific types of components. Each component should be self-contained and reusable, so that you can use it in different parts of the application.
-Al separar los componentes de la interfaz de usuario de otros componentes en la carpeta `modules`, es más fácil mantener un diseño consistente y realizar cambios en la interfaz de usuario sin afectar otras partes (lógica de negocio) del código base.
+By separating the UI components from the other components in the `modules` folder, it's easier to maintain a consistent design and to make changes to the UI without affecting other parts (business logic) of the codebase.
-## Interfaz y dependencias
+## Interface and dependencies
-Puedes importar otro código de módulo desde cualquier módulo excepto desde la carpeta `ui`. Esto mantendrá su código fácil de probar.
+You can import other module code from any module except for the `ui` folder. This will keep its code easy to test.
-### Interno
+### Internal
-Cada parte (hooks, estados, ...) de un módulo puede tener una carpeta `internal`, que contiene partes que se usan solo dentro del módulo.
+Each part (hooks, states, ...) of a module can have an `internal` folder, which contains parts that are just used within the module.
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
index aa7771dbcc..dfbe97af88 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -1,22 +1,22 @@
---
-title: Comandos del Frontend
+title: Frontend Commands
---
-## Comandos útiles
+## Useful commands
-### Iniciando la aplicación
+### Starting the app
```bash
npx nx start twenty-front
```
-### Regenerar el esquema de graphql basado en el esquema API graphql
+### Regenerate graphql schema based on API graphql schema
```bash
npx nx run twenty-front:graphql:generate --configuration=metadata
```
-O
+OR
```bash
npx nx run twenty-front:graphql:generate
@@ -28,14 +28,14 @@ npx nx run twenty-front:graphql:generate
npx nx run twenty-front:lint # pass --fix to fix lint errors
```
-## Traducciones
+## Translations
```bash
npx nx run twenty-front:lingui:extract
npx nx run twenty-front:lingui:compile
```
-### Prueba
+### Test
```bash
npx nx run twenty-front:test # run jest tests
@@ -44,11 +44,11 @@ npx nx run twenty-front:storybook:test # run tests # (needs yarn storybook:serve
npx nx run twenty-front:storybook:coverage # (needs yarn storybook:serve:dev to be running)
```
-## Stack Tecnológico
+## Tech Stack
The project has a clean and simple stack, with minimal boilerplate code.
-**Aplicación**
+**App**
* [React](https://react.dev/)
* [Apollo](https://www.apollographql.com/docs/)
@@ -56,35 +56,35 @@ The project has a clean and simple stack, with minimal boilerplate code.
* [Recoil](https://recoiljs.org/docs/introduction/core-concepts)
* [TypeScript](https://www.typescriptlang.org/)
-**Pruebas**
+**Testing**
* [Jest](https://jestjs.io/)
* [Storybook](https://storybook.js.org/)
-**Herramientas**
+**Tooling**
* [Yarn](https://yarnpkg.com/)
* [Craco](https://craco.js.org/docs/)
* [ESLint](https://eslint.org/)
-## Arquitectura
+## Architecture
-### Enrutamiento
+### Routing
-[React Router](https://reactrouter.com/) maneja el enrutamiento.
+[React Router](https://reactrouter.com/) handles the routing.
-Para evitar [re-renderizados](/l/es/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) innecesarios toda la lógica de enrutamiento está en un `useEffect` en `PageChangeEffect`.
+To avoid unnecessary [re-renders](/l/es/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) all the routing logic is in a `useEffect` in `PageChangeEffect`.
-### Gestión del Estado
+### State Management
-[Recoil](https://recoiljs.org/docs/introduction/core-concepts) maneja la gestión del estado.
+[Recoil](https://recoiljs.org/docs/introduction/core-concepts) handles state management.
-Ver [mejores prácticas](/l/es/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) para más información sobre la gestión del estado.
+See [best practices](/l/es/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) for more information on state management.
-## Pruebas
+## Testing
-[Jest](https://jestjs.io/) sirve como la herramienta para pruebas unitarias mientras [Storybook](https://storybook.js.org/) es para pruebas de componentes.
+[Jest](https://jestjs.io/) serves as the tool for unit testing while [Storybook](https://storybook.js.org/) is for component testing.
-Jest es principalmente para probar funciones utilitarias, y no los componentes en sí mismos.
+Jest is mainly for testing utility functions, and not components themselves.
-Storybook es para probar el comportamiento de componentes aislados, así como mostrar el sistema de diseño.
+Storybook is for testing the behavior of isolated components, as well as displaying the design system.
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/hotkeys.mdx
index 4264b4afe0..43cde50e63 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/hotkeys.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -1,178 +1,178 @@
---
-title: Atajos de teclado
+title: Hotkeys
---
-## Introducción
+## Introduction
-Cuando necesitas escuchar una tecla de acceso rápido, normalmente usarías el evento `onKeyDown`.
+When you need to listen to a hotkey, you would normally use the `onKeyDown` event listener.
-En `twenty-front`, sin embargo, podrías tener conflictos entre los mismos atajos de teclado utilizados en diferentes componentes, montados al mismo tiempo.
+In `twenty-front` however, you might have conflicts between same hotkeys that are used in different components, mounted at the same time.
-Por ejemplo, si tienes una página que escucha la tecla Enter y un modal que escucha la tecla Enter, con un componente Select dentro de ese modal que también escucha la tecla Enter, podrías tener un conflicto cuando todos están montados al mismo tiempo.
+For example, if you have a page that listens for the Enter key, and a modal that listens for the Enter key, with a Select component inside that modal that listens for the Enter key, you might have a conflict when all are mounted at the same time.
-## El gancho `useScopedHotkeys`
+## The `useScopedHotkeys` hook
-Para manejar este problema, tenemos un gancho personalizado que hace posible escuchar atajos de teclado sin ningún conflicto.
+To handle this problem, we have a custom hook that makes it possible to listen to hotkeys without any conflict.
-Lo colocas en un componente, y escuchará los atajos de teclado solo cuando el componente está montado Y cuando el **ámbito del atajo de teclado** especificado está activo.
+You place it in a component, and it will listen to the hotkeys only when the component is mounted AND when the specified **hotkey scope** is active.
-## ¿Cómo escuchar atajos de teclado en la práctica?
+## How to listen for hotkeys in practice?
-Hay dos pasos involucrados en configurar la escucha de atajos de teclado:
+There are two steps involved in setting up hotkey listening :
-1. Establece el [ámbito del atajo de teclado](#qué-es-un-ambito-de-atajo-de-teclado-) que escuchará los atajos de teclado
-2. Usa el gancho `useScopedHotkeys` para escuchar atajos de teclado
+1. Set the [hotkey scope](#what-is-a-hotkey-scope-) that will listen to hotkeys
+2. Use the `useScopedHotkeys` hook to listen to hotkeys
-Configurar los ámbitos de atajos de teclado es necesario incluso en páginas simples, porque otros elementos de la interfaz de usuario como el menú lateral o el menú de comandos también podrían escuchar atajos de teclado.
+Setting up hotkey scopes is required even in simple pages, because other UI elements like left menu or command menu might also listen to hotkeys.
-## Casos de uso para atajos de teclado
+## Use cases for hotkeys
-En general, tendrás dos casos de uso que requieren atajos de teclado:
+In general, you'll have two use cases that require hotkeys :
-1. En una página o un componente montado en una página
-2. En un componente tipo modal que toma el enfoque debido a la acción del usuario
+1. In a page or a component mounted in a page
+2. In a modal-type component that takes the focus due to a user action
-El segundo caso de uso puede ocurrir recursivamente: un desplegable en un modal, por ejemplo.
+The second use case can happen recursively : a dropdown in a modal for example.
-### Escuchando atajos de teclado en una página
+### Listening to hotkeys in a page
-Ejemplo:
+Example :
```tsx
-const EscuchaEnterEnPagina = () => {
+const PageListeningEnter = () => {
const {
- estableceAmbitoDeAtajoYMemorizaAmbitoAnterior,
- regresaAlAmbitoDeAtajoAnterior,
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope();
- // 1. Establece el ámbito de atajo en un useEffect
+ // 1. Set the hotkey scope in a useEffect
useEffect(() => {
- estableceAmbitoDeAtajoYMemorizaAmbitoAnterior(
- EjemploAmbitosDeAtajo.EjemploEnterPagina,
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleEnterPage,
);
- // Revertir al ámbito de atajo anterior cuando se desmonte el componente
+ // Revert to the previous hotkey scope when the component is unmounted
return () => {
- regresaAlAmbitoDeAtajoAnterior();
+ goBackToPreviousHotkeyScope();
};
- }, [regresaAlAmbitoDeAtajoAnterior, estableceAmbitoDeAtajoYMemorizaAmbitoAnterior]);
+ }, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
- // 2. Usa el gancho useScopedHotkeys
+ // 2. Use the useScopedHotkeys hook
useScopedHotkeys(
Key.Enter,
() => {
- // Alguna lógica ejecutada en esta página cuando el usuario presiona Enter
+ // Some logic executed on this page when the user presses Enter
// ...
},
- EjemploAmbitosDeAtajo.EjemploEnterPagina,
+ ExampleHotkeyScopes.ExampleEnterPage,
);
- return Mi página que escucha Enter
;
+ return My page that listens for Enter
;
};
```
-### Escuchando atajos de teclado en un componente tipo modal
+### Listening to hotkeys in a modal-type component
-Para este ejemplo utilizaremos un componente modal que escucha la tecla Escape para indicar a su padre que lo cierre.
+For this example we'll use a modal component that listens for the Escape key to tell its parent to close it.
-Aquí la interacción del usuario está cambiando el ámbito.
+Here the user interaction is changing the scope.
```tsx
-const PaginaEjemploConModal = () => {
- const [mostrarModal, establecerMostrarModal] = useState(false);
+const ExamplePageWithModal = () => {
+ const [showModal, setShowModal] = useState(false);
const {
- estableceAmbitoDeAtajoYMemorizaAmbitoAnterior,
- regresaAlAmbitoDeAtajoAnterior,
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope();
- const manejarClicAbrirModal = () => {
- // 1. Establece el ámbito de atajo cuando el usuario abre el modal
- establecerMostrarModal(true);
- estableceAmbitoDeAtajoYMemorizaAmbitoAnterior(
- EjemploAmbitosDeAtajo.EjemploModal,
+ const handleOpenModalClick = () => {
+ // 1. Set the hotkey scope when user opens the modal
+ setShowModal(true);
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleModal,
);
};
- const manejarCierreModal = () => {
- // 1. Revertir al ámbito de atajo anterior cuando se cierra el modal
- establecerMostrarModal(false);
- regresaAlAmbitoDeAtajoAnterior();
+ const handleModalClose = () => {
+ // 1. Revert to the previous hotkey scope when the modal is closed
+ setShowModal(false);
+ goBackToPreviousHotkeyScope();
};
return
-
Mi página con un modal
- Abrir modal
- {mostrarModal && }
+ My page with a modal
+ Open modal
+ {showModal && }
;
};
```
-Luego, en el componente modal:
+Then in the modal component :
```tsx
-const MiComponenteDesplegable = ({ onClose }: { onClose: () => void }) => {
- // 2. Usa el gancho useScopedHotkeys para escuchar la tecla Escape.
- // Tenga en cuenta que Escape es una tecla de acceso rápido común que podría usarse en muchos otros componentes
- // Por lo tanto, es importante usar un ámbito de atajo para evitar conflictos
+const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
+ // 2. Use the useScopedHotkeys hook to listen for Escape.
+ // Note that escape is a common hotkey that could be used by many other components
+ // So it's important to use a hotkey scope to avoid conflicts
useScopedHotkeys(
Key.Escape,
() => {
onClose()
},
- EjemploAmbitosDeAtajo.EjemploModal,
+ ExampleHotkeyScopes.ExampleModal,
);
- return Mi componente modal
;
+ return My modal component
;
};
```
-Es importante usar este patrón cuando no estás seguro de que solo usar un useEffect con mount/unmount será suficiente para evitar conflictos.
+It's important to use this pattern when you're not sure that just using a useEffect with mount/unmount will be enough to avoid conflicts.
-Esos conflictos pueden ser difíciles de depurar, y puede suceder más a menudo de lo que crees con useEffects.
+Those conflicts can be hard to debug, and it might happen more often than not with useEffects.
-## ¿Qué es un ámbito de atajo de teclado?
+## What is a hotkey scope?
-Un ámbito de atajo de teclado es una cadena que representa un contexto en el que los atajos de teclado están activos. Por lo general, se codifica como un enum.
+A hotkey scope is a string that represents a context in which the hotkeys are active. It is generally encoded as an enum.
-Cuando cambias el ámbito del atajo de teclado, se habilitarán los atajos que están escuchando este ámbito y se deshabilitarán los atajos que escuchan otros ámbitos.
+When you change the hotkey scope, the hotkeys that are listening to this scope will be enabled and the hotkeys that are listening to other scopes will be disabled.
-Solo puedes establecer un ámbito a la vez.
+You can set only one scope at a time.
-Como ejemplo, los ámbitos de atajos de teclado para cada página se definen en el enum `PageHotkeyScope`:
+As an example, the hotkey scopes for each page are defined in the `PageHotkeyScope` enum:
```tsx
export enum PageHotkeyScope {
- Configuración = 'configuración',
- CrearEspacioTrabajo = 'crear-espacio-trabajo',
- IniciarSesion = 'iniciar-sesión',
- CrearPerfil = 'crear-perfil',
- PlanRequerido = 'plan-requerido',
- MostrarPagina = 'mostrar-pagina',
- MostrarPersonaPagina = 'mostrar-persona-pagina',
- MostrarEmpresaPagina = 'mostrar-empresa-pagina',
- PaginaEmpresas = 'pagina-empresas',
- PaginaPersonas = 'pagina-personas',
- PaginaOportunidades = 'pagina-oportunidades',
- PaginaPerfil = 'pagina-perfil',
- PaginaMiembroEspacioTrabajo = 'pagina-miembro-espacio-trabajo',
- PaginaTareas = 'pagina-tareas',
+ Settings = 'settings',
+ CreateWorkspace = 'create-workspace',
+ SignInUp = 'sign-in-up',
+ CreateProfile = 'create-profile',
+ PlanRequired = 'plan-required',
+ ShowPage = 'show-page',
+ PersonShowPage = 'person-show-page',
+ CompanyShowPage = 'company-show-page',
+ CompaniesPage = 'companies-page',
+ PeoplePage = 'people-page',
+ OpportunitiesPage = 'opportunities-page',
+ ProfilePage = 'profile-page',
+ WorkspaceMemberPage = 'workspace-member-page',
+ TaskPage = 'task-page',
}
```
-Internamente, el ámbito seleccionado se almacena en un estado de Recoil que se comparte en toda la aplicación:
+Internally, the currently selected scope is stored in a Recoil state that is shared across the application :
```tsx
-export const estadoActualDeAmbitoDeAtajo = createState({
- key: 'estadoActualDeAmbitoDeAtajo',
- defaultValue: AMBITO_INICIAL_ATAJOS,
+export const currentHotkeyScopeState = createState({
+ key: 'currentHotkeyScopeState',
+ defaultValue: INITIAL_HOTKEYS_SCOPE,
});
```
-¡Pero este estado de Recoil nunca debe manejarse manualmente! Veremos cómo usarlo en la siguiente sección.
+But this Recoil state should never be handled manually ! We'll see how to use it in the next section.
-## ¿Cómo funciona internamente?
+## How is it working internally?
-Hicimos un contenedor delgado sobre [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) que lo hace más eficiente y evita renders innecesarios.
+We made a thin wrapper on top of [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) that makes it more performant and avoids unnecessary re-renders.
-También creamos un estado de Recoil para manejar el estado del ámbito de atajos de teclado y hacerlo disponible en toda la aplicación.
+We also create a Recoil state to handle the hotkey scope state and make it available everywhere in the application.
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/storybook.mdx
index f6e770b67b..5c7f5fa52a 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/storybook.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -1,8 +1,8 @@
---
title: Storybook
-description: Navegar por la biblioteca de componentes de interfaz de Twenty
+description: Browse Twenty's UI component library
---
-Ver nuestra biblioteca completa de componentes y documentación en Storybook.
+View our complete component library and documentation in Storybook.
-[Abrir Storybook →](https://storybook.twenty.com)
+[Open Storybook →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/style-guide.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/style-guide.mdx
index cdfe35a132..e3ba4a44f0 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/style-guide.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/style-guide.mdx
@@ -1,64 +1,64 @@
---
-title: Guía de Estilo
+title: Style Guide
---
-Este documento incluye las reglas a seguir al escribir código.
+This document includes the rules to follow when writing code.
-El objetivo aquí es tener una base de código coherente, que sea fácil de leer y de mantener.
+The goal here is to have a consistent codebase, which is easy to read and easy to maintain.
-Para esto, es mejor ser un poco más detallado que ser demasiado conciso.
+For this, it's better to be a bit more verbose than to be too concise.
-Ten siempre en cuenta que la gente lee código más a menudo de lo que lo escribe, especialmente en un proyecto de código abierto, donde cualquiera puede contribuir.
+Always keep in mind that people read code more often than they write it, specially on an open source project, where anyone can contribute.
-Hay muchas reglas que no están definidas aquí, pero que son verificadas automáticamente por linters.
+There are a lot of rules that are not defined here, but that are automatically checked by linters.
## React
-### Usar componentes funcionales
+### Use functional components
-Siempre usa componentes funcionales TSX.
+Always use TSX functional components.
Do not use default `import` with `const`, because it's harder to read and harder to import with code completion.
```tsx
-// ❌ Malo, más difícil de leer, más difícil de importar con autocompletación de código
+// ❌ Bad, harder to read, harder to import with code completion
const MyComponent = () => {
- return Hola Mundo
;
+ return Hello World
;
};
export default MyComponent;
-// ✅ Bueno, fácil de leer, fácil de importar con autocompletación de código
+// ✅ Good, easy to read, easy to import with code completion
export function MyComponent() {
- return Hola Mundo
;
+ return Hello World
;
};
```
-### "Props"
+### Props
-Crea el tipo de las props y llámalo `(NombreDelComponente)Props` si no hay necesidad de exportarlo.
+Create the type of the props and call it `(ComponentName)Props` if there's no need to export it.
-Usa la desestructuración de props.
+Use props destructuring.
```tsx
-// ❌ Malo, sin tipo
-export const MyComponent = (props) => Hola {props.name}
;
+// ❌ Bad, no type
+export const MyComponent = (props) => Hello {props.name}
;
-// ✅ Bueno, con tipo
+// ✅ Good, type
type MyComponentProps = {
name: string;
};
-export const MyComponent = ({ name }: MyComponentProps) => Hola {name}
;
+export const MyComponent = ({ name }: MyComponentProps) => Hello {name}
;
```
-#### Evita usar `React.FC` o `React.FunctionComponent` para definir tipos de props
+#### Refrain from using `React.FC` or `React.FunctionComponent` to define prop types
```tsx
-/* ❌ - Malo, define las anotaciones de tipo de componente con `FC`
- * - Con `React.FC`, el componente acepta implícitamente una prop `children`
- * incluso si no está definida en el tipo de prop. Esto podría no ser siempre
- * deseable, especialmente si el componente no tiene la intención de renderizar
+/* ❌ - Bad, defines the component type annotations with `FC`
+ * - With `React.FC`, the component implicitly accepts a `children` prop
+ * even if it's not defined in the prop type. This might not always be
+ * desirable, especially if the component doesn't intend to render
* children.
*/
const EmailField: React.FC<{
@@ -81,12 +81,12 @@ const EmailField = ({ value }: EmailFieldProps) => (
);
```
-#### Sin Propagación de una sola variable de Props en Elementos JSX
+#### No Single Variable Prop Spreading in JSX Elements
-Evita usar la propagación de una sola variable de props en elementos JSX, como `{...props}`. Esta práctica a menudo resulta en un código que es menos legible y más difícil de mantener porque no está claro qué props está recibiendo el componente.
+Avoid using single variable prop spreading in JSX elements, like `{...props}`. This practice often results in code that is less readable and harder to maintain because it's unclear which props the component is receiving.
```tsx
-/* ❌ - Malo, propaga una sola variable de prop en el componente subyacente
+/* ❌ - Bad, spreads a single variable prop into the underlying component
*/
const MyComponent = (props: OwnProps) => {
return ;
@@ -102,25 +102,25 @@ const MyComponent = ({ prop1, prop2, prop3 }: MyComponentProps) => {
};
```
-Razonamiento:
+Rationale:
-* A simple vista, es más claro qué props se está pasando, lo que hace que sea más fácil de entender y mantener.
-* Ayuda a prevenir el acoplamiento estricto entre componentes mediante sus props.
-* Las herramientas de linting facilitan la identificación de props mal escritas o sin uso al listar props explícitamente.
+* At a glance, it's clearer which props the code passes down, making it easier to understand and maintain.
+* It helps to prevent tight coupling between components via their props.
+* Linting tools make it easier to identify misspelled or unused props when you list props explicitly.
## JavaScript
-### Usar el operador de fusión nula `??`
+### Use nullish-coalescing operator `??`
```tsx
-// ❌ Malo, puede devolver "default" incluso si el valor es 0 o ''
+// ❌ Bad, can return 'default' even if value is 0 or ''
const value = process.env.MY_VALUE || 'default';
-// ✅ Bueno, devolverá "default" sólo si el valor es null o undefined
+// ✅ Good, will return 'default' only if value is null or undefined
const value = process.env.MY_VALUE ?? 'default';
```
-### Usar encadenamiento opcional `?.`
+### Use optional chaining `?.`
```tsx
// ❌ Bad
@@ -132,30 +132,30 @@ onClick?.();
## TypeScript
-### Usar `type` en lugar de `interface`
+### Use `type` instead of `interface`
-Siempre usa `type` en lugar de `interface`, porque casi siempre se superponen y `type` es más flexible.
+Always use `type` instead of `interface`, because they almost always overlap, and `type` is more flexible.
```tsx
-// ❌ Malo
+// ❌ Bad
interface MyInterface {
name: string;
}
-// ✅ Bueno
+// ✅ Good
type MyType = {
name: string;
};
```
-### Usar literales de cadena en lugar de enums
+### Use string literals instead of enums
-[Los literales de cadena](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types) son la manera preferida para manejar valores tipo enum en TypeScript. Son más fáciles de extender con Pick y Omit, y ofrecen una mejor experiencia de desarrollo, especialmente con la autocompletación de código.
+[String literals](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types) are the go-to way to handle enum-like values in TypeScript. They are easier to extend with Pick and Omit, and offer a better developer experience, specially with code completion.
-Puedes ver por qué TypeScript recomienda evitar enums [aquí](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
+You can see why TypeScript recommends avoiding enums [here](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
```tsx
-// ❌ Malo, utiliza un enum
+// ❌ Bad, utilizes an enum
enum Color {
Red = "red",
Green = "green",
@@ -166,18 +166,18 @@ let color = Color.Red;
```
```tsx
-// ✅ Bueno, utiliza un literal de cadena
+// ✅ Good, utilizes a string literal
let color: "red" | "green" | "blue" = "red";
```
-#### GraphQL y bibliotecas internas
+#### GraphQL and internal libraries
-Deberías usar enums que genera el codegen de GraphQL.
+You should use enums that GraphQL codegen generates.
-También es mejor usar un enum al usar una biblioteca interna, para que la biblioteca interna no tenga que exponer un tipo de literal de cadena que no está relacionado con la API interna.
+It's also better to use an enum when using an internal library, so the internal library doesn't have to expose a string literal type that is not related to the internal API.
-Ejemplo:
+Example:
```TSX
const {
@@ -190,54 +190,54 @@ setHotkeyScopeAndMemorizePreviousScope(
);
```
-## Estilo
+## Styling
-### Usar StyledComponents
+### Use StyledComponents
-Estiliza los componentes con [styled-components](https://emotion.sh/docs/styled).
+Style the components with [styled-components](https://emotion.sh/docs/styled).
```tsx
-// ❌ Malo
-Hola Mundo
+// ❌ Bad
+Hello World
```
```tsx
-// ✅ Bueno
+// ✅ Good
const StyledTitle = styled.div`
color: red;
`;
```
-Prefija los componentes estilizados con "Styled" para diferenciarlos de los componentes "reales".
+Prefix styled components with "Styled" to differentiate them from "real" components.
```tsx
-// ❌ Malo
+// ❌ Bad
const Title = styled.div`
color: red;
`;
```
```tsx
-// ✅ Bueno
+// ✅ Good
const StyledTitle = styled.div`
color: red;
`;
```
-### Tematización
+### Theming
-Utilizar el tema para la mayor parte de la estilización de los componentes es el enfoque preferido.
+Utilizing the theme for the majority of component styling is the preferred approach.
-#### Unidades de medida
+#### Units of measurement
-Evita usar valores `px` o `rem` directamente dentro de los componentes estilizados. Los valores necesarios suelen estar ya definidos en el tema, por lo que se recomienda usar el tema para estos fines.
+Avoid using `px` or `rem` values directly within the styled components. The necessary values are generally already defined in the theme, so it’s recommended to make use of the theme for these purposes.
-#### Colores
+#### Colors
-Abstente de introducir nuevos colores; en su lugar, utiliza la paleta existente del tema. Si hay una situación en la que la paleta no se ajusta, deja un comentario para que el equipo pueda corregirlo.
+Refrain from introducing new colors; instead, use the existing palette from the theme. Should there be a situation where the palette does not align, please leave a comment so that the team can rectify it.
```tsx
-// ❌ Malo, especifica directamente los valores de estilo sin utilizar el tema
+// ❌ Bad, directly specifies style values without utilizing the theme
const StyledButton = styled.button`
color: #333333;
font-size: 1rem;
@@ -248,7 +248,7 @@ const StyledButton = styled.button`
```
```tsx
-// ✅ Bueno, utiliza el tema
+// ✅ Good, utilizes the theme
const StyledButton = styled.button`
color: ${({ theme }) => theme.font.color.primary};
font-size: ${({ theme }) => theme.font.size.md};
@@ -258,33 +258,33 @@ const StyledButton = styled.button`
`;
```
-## Aplicando No-Type Imports
+## Enforcing No-Type Imports
-Evita las importaciones de tipo. Para reforzar este estándar, una regla de ESLint verifica y reporta cualquier importación de tipo. Esto ayuda a mantener la consistencia y la legibilidad en el código TypeScript.
+Avoid type imports. To enforce this standard, an ESLint rule checks for and reports any type imports. This helps maintain consistency and readability in the TypeScript code.
```tsx
-// ❌ Malo
+// ❌ Bad
import { type Meta, type StoryObj } from '@storybook/react';
-// ❌ Malo
+// ❌ Bad
import type { Meta, StoryObj } from '@storybook/react';
-// ✅ Bueno
+// ✅ Good
import { Meta, StoryObj } from '@storybook/react';
```
-### Por qué No-Type Imports
+### Why No-Type Imports
-* **Consistencia**: Al evitar las importaciones de tipo y usar un solo enfoque tanto para las importaciones de tipo como de valor, la base de código se mantiene consistente en su estilo de importación de módulos.
+* **Consistency**: By avoiding type imports and using a single approach for both type and value imports, the codebase remains consistent in its module import style.
-* **Legibilidad**: Las no-importaciones de tipo mejoran la legibilidad del código al dejar claro cuándo se están importando valores o tipos. Esto reduce la ambigüedad y hace más fácil entender el propósito de los símbolos importados.
+* **Readability**: No-type imports improve code readability by making it clear when you're importing values or types. This reduces ambiguity and makes it easier to understand the purpose of imported symbols.
-* **Mantenibilidad**: Mejora la mantenibilidad de la base de código porque los desarrolladores pueden identificar y localizar importaciones solo de tipo al revisar o modificar el código.
+* **Maintainability**: It enhances codebase maintainability because developers can identify and locate type-only imports when reviewing or modifying code.
-### Regla de ESLint
+### ESLint Rule
-An ESLint rule, `@typescript-eslint/consistent-type-imports`, enforces the no-type import standard. Esta regla generará errores o advertencias sobre cualquier violación de importación de tipo.
+An ESLint rule, `@typescript-eslint/consistent-type-imports`, enforces the no-type import standard. This rule will generate errors or warnings for any type import violations.
-Por favor, ten en cuenta que esta regla específicamente aborda extraños casos límite donde ocurren importaciones de tipo no intencionadas. TypeScript en sí mismo desaconseja esta práctica, como se menciona en las [notas de lanzamiento de TypeScript 3.8](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). En la mayoría de situaciones, no deberías necesitar usar importaciones solo de tipo.
+Please note that this rule specifically addresses rare edge cases where unintentional type imports occur. TypeScript itself discourages this practice, as mentioned in the [TypeScript 3.8 release notes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). In most situations, you should not need to use type-only imports.
-Para asegurarte de que tu código cumpla con esta regla, asegúrate de ejecutar ESLint como parte de tu flujo de trabajo de desarrollo.
+To ensure your code complies with this rule, make sure to run ESLint as part of your development workflow.
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/work-with-figma.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
index 85382f32b1..6cffcc405e 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
@@ -1,59 +1,59 @@
---
-title: Trabajar con Figma
-info: Aprende cómo puedes colaborar con Twenty en Figma
+title: Work with Figma
+info: Learn how you can collaborate with Twenty's Figma
---
-Figma es una herramienta de diseño de interfaces colaborativa que ayuda a superar la barrera de comunicación entre diseñadores y desarrolladores.
-Esta guía explica cómo puedes colaborar con Figma.
+Figma is a collaborative interface design tool that aids in bridging the communication barrier between designers and developers.
+This guide explains how you can collaborate with Figma.
-## Acceso
+## Access
-1. **Accede al enlace compartido:** Puedes acceder al archivo de Figma del proyecto [aquí](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty).
-2. **Inicia sesión:** Si aún no has iniciado sesión, Figma te pedirá que lo hagas.
- Las características clave solo están disponibles para usuarios registrados, como el modo desarrollador y la capacidad de seleccionar un marco dedicado.
+1. **Access the shared link:** You can access the project's Figma file [here](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty).
+2. **Sign in:** If you're not already signed in, Figma will prompt you to do so.
+ Key features are only available to logged-in users, such as the developer mode and the ability to select a dedicated frame.
- No podrás colaborar efectivamente sin una cuenta.
+ You will not be able to collaborate effectively without an account.
-## Estructura de Figma
+## Figma structure
-En la barra lateral izquierda, puedes acceder a las diferentes páginas del Figma de Twenty. Así es como están organizadas:
+On the left sidebar, you can access the different pages of Twenty's Figma. This is how they're organized:
-* **Página de componentes:** Esta es la primera página. El diseñador la utiliza para crear y organizar los elementos de diseño reutilizables que se usan en todo el archivo de diseño. Por ejemplo, botones, íconos, símbolos u otros componentes reutilizables. Sirve para mantener la consistencia a lo largo del diseño.
-* **Página principal:** La segunda página es la página principal, que muestra la interfaz de usuario completa del proyecto. Puedes presionar ***Play*** para usar el prototipo completo de la aplicación.
-* **Páginas de características:** Las otras páginas están típicamente dedicadas a características en progreso. Contienen el diseño de características específicas o módulos de la aplicación o sitio web. Normalmente, aún están en desarrollo.
+* **Components page:** This is the first page. The designer uses it to create and organize the reusable design elements used throughout the design file. For example, buttons, icons, symbols, or any other reusable components. It serves to maintain consistency across the design.
+* **Main page:** The second page is the main page, which shows the complete user interface of the project. You can press ***Play*** to use the full app prototype.
+* **Features pages:** The other pages are typically dedicated to features in progress. They contain the design of specific features or modules of the application or website. They are typically still in progress.
-## Consejos útiles
+## Useful Tips
-Con acceso de solo lectura, no puedes editar el diseño, pero puedes acceder a todas las características que serán útiles para convertir los diseños en código.
+With read-only access, you can't edit the design, but you can access all features that will be useful to convert the designs into code.
-### Usa el modo Dev
+### Use the Dev mode
-El Modo Dev de Figma mejora la productividad de los desarrolladores al proporcionar una navegación fácil por el diseño, una gestión eficaz de assets, herramientas de comunicación eficientes, integraciones de caja de herramientas, fragmentos de código rápidos e información clave de capas, superando la brecha entre diseño y desarrollo. Puedes aprender más sobre el Modo Dev [aquí](https://www.figma.com/dev-mode/).
+Figma's Dev Mode enhances developers' productivity by providing easy design navigation, effective asset management, efficient communication tools, toolbox integrations, quick code snippets, and key layer information, bridging the gap between design and development. You can learn more about Dev Mode [here](https://www.figma.com/dev-mode/).
-Cambia al modo "Desarrollador" en la parte derecha de la barra de herramientas para ver las especificaciones de diseño, copiar CSS y acceder a los assets.
+Switch to the "Developer" mode in the right part of the toolbar to see design specs, copy CSS, and access assets.
-### Usar el prototipo
+### Use the Prototype
-Haz clic en cualquier elemento del lienzo y presiona el botón "Play" en el extremo superior derecho de la interfaz para acceder a la vista del prototipo. El modo de prototipo te permite interactuar con el diseño como si fuera el producto final. Demuestra el flujo entre pantallas y cómo los elementos de la interfaz, como botones, enlaces o menús, se comportan al interactuar con ellos.
+Click on any element on the canvas and press the “Play” button at the top right edge of the interface to access the prototype view. Prototype mode allows you to interact with the design as if it were the final product. It demonstrates the flow between screens and how interface elements like buttons, links, or menus behave when interacted with.
-1. **Entendiendo las transiciones y animaciones:** En el modo Prototipo, puedes ver cualquier transición o animación añadida por un diseñador entre pantallas o elementos de UI, proporcionando instrucciones visuales claras a los desarrolladores sobre la conducta y el estilo intencionados.
-2. **Aclaración de implementación:** Un prototipo también puede ayudar a reducir las ambigüedades. Los desarrolladores pueden interactuar con él para obtener una mejor comprensión de la funcionalidad o apariencia de elementos particulares.
+1. **Understanding transitions and animations:** In the Prototype mode, you can view any transitions or animations added by a designer between screens or UI elements, providing clear visual instructions to developers on the intended behavior and style.
+2. **Implementation clarification:** A prototype can also help reduce ambiguities. Developers can interact with it to gain a better understanding of the functionality or appearance of particular elements.
-Para más detalles y orientación sobre el aprendizaje de la plataforma Figma, puedes visitar la [Documentación Oficial de Figma](https://help.figma.com/hc/en-us).
+For more comprehensive details and guidance on learning the Figma platform, you can visit the official [Figma Documentation](https://help.figma.com/hc/en-us).
-### Medir distancias
+### Measure distances
-Selecciona un elemento, mantén presionada la tecla `Option` (Mac) o `Alt` (Windows), luego pasa el cursor sobre otro elemento para ver la distancia entre ellos.
+Select an element, hold `Option` key (Mac) or `Alt` key (Windows), then hover over another element to see the distance between them.
-### Extensión Figma para VSCode (Recomendado)
+### Figma extension for VSCode (Recommended)
-[Figma para VS Code](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension)
-te permite navegar e inspeccionar archivos de diseño, colaborar con diseñadores, rastrear cambios y acelerar la implementación, todo sin salir de tu editor de texto.
-Forma parte de nuestras extensiones recomendadas.
+[Figma for VS Code](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension)
+lets you navigate and inspect design files, collaborate with designers, track changes, and speed up implementation - all without leaving your text editor.
+It's part of our recommended extensions.
-## Colaboración
+## Collaboration
-1. **Uso de Comentarios:** Puedes utilizar la función de comentarios haciendo clic en el ícono de burbuja en la parte izquierda de la barra de herramientas.
-2. **Chat de Cursor:** Una característica agradable de Figma es el Chat de Cursor. Simplemente presiona `;` en Mac y `/` en Windows para enviar un mensaje si ves a alguien más usando Figma al mismo tiempo que tú.
+1. **Using Comments:** You are welcome to use the comment feature by clicking on the bubble icon in the left part of the toolbar.
+2. **Cursor chat:** A nice feature of Figma is the Cursor chat. Just press `;` on Mac and `/` on Windows to send a message if you see someone else using Figma as the same time as you.
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/local-setup.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/local-setup.mdx
index bdcd6f6b97..cabd274d46 100644
--- a/packages/twenty-docs/l/es/developers/contribute/capabilities/local-setup.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/local-setup.mdx
@@ -1,13 +1,13 @@
---
-title: Configuración Local
-description: La guía para los colaboradores (o desarrolladores curiosos) que quieren ejecutar Twenty localmente.
+title: Local Setup
+description: The guide for contributors (or curious developers) who want to run Twenty locally.
---
-## Prerrequisitos
+## Prerequisites
-
- Antes de que puedas instalar y usar Twenty, asegúrate de instalar lo siguiente en tu computadora:
+
+ Before you can install and use Twenty, make sure you install the following on your computer:
* [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
* [Node v24.5.0](https://nodejs.org/en/download)
@@ -15,38 +15,38 @@ description: La guía para los colaboradores (o desarrolladores curiosos) que qu
* [nvm](https://github.com/nvm-sh/nvm/blob/master/README.md)
- `npm` no funcionará, deberías usar `yarn` en su lugar. Yarn ahora se envía con Node.js, por lo que no necesitas instalarlo por separado.
- Solo tienes que ejecutar `corepack enable` para habilitar Yarn si aún no lo has hecho.
+ `npm` won't work, you should use `yarn` instead. Yarn is now shipped with Node.js, so you don't need to install it separately.
+ You only have to run `corepack enable` to enable Yarn if you haven't done it yet.
- 1. Instalar WSL
- Abre PowerShell como Administrador y ejecuta:
+ 1. Install WSL
+ Open PowerShell as Administrator and run:
```powershell
wsl --install
```
- Ahora deberías ver un aviso para reiniciar tu computadora. Si no, reiníciala manualmente.
+ You should now see a prompt to restart your computer. If not, restart it manually.
- Al reiniciar, se abrirá una ventana de PowerShell e instalará Ubuntu. Esto puede tomar algo de tiempo.
- Verás un aviso para crear un nombre de usuario y contraseña para tu instalación de Ubuntu.
+ Upon restart, a powershell window will open and install Ubuntu. This may take up some time.
+ You'll see a prompt to create a username and password for your Ubuntu installation.
- 2. Instalar y configurar git
+ 2. Install and configure git
```bash
sudo apt-get install git
- git config --global user.name "Tu Nombre"
+ git config --global user.name "Your Name"
- git config --global user.email "tuemail@dominio.com"
+ git config --global user.email "youremail@domain.com"
```
- 3. Instalar nvm, node.js y yarn
+ 3. Install nvm, node.js and yarn
- Usa `nvm` para instalar la versión correcta de `node`. El `.nvmrc` asegura que todos los colaboradores usen la misma versión.
+ Use `nvm` to install the correct `node` version. The `.nvmrc` ensures all contributors use the same version.
```bash
@@ -55,13 +55,13 @@ description: La guía para los colaboradores (o desarrolladores curiosos) que qu
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
```
- Cierra y vuelve a abrir tu terminal para usar nvm. Luego ejecuta los siguientes comandos.
+ Close and reopen your terminal to use nvm. Then run the following commands.
```bash
- nvm install # instala la versión recomendada de node
+ nvm install # installs recommended node version
- nvm use # usa la versión recomendada de node
+ nvm use # use recommended node version
corepack enable
```
@@ -70,13 +70,13 @@ description: La guía para los colaboradores (o desarrolladores curiosos) que qu
---
-## Paso 1: Clonar con Git
+## Step 1: Git Clone
-En tu terminal, ejecuta el siguiente comando.
+In your terminal, run the following command.
-
- Si aún no has configurado claves SSH, puedes aprender cómo hacerlo [aquí](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/about-ssh).
+
+ If you haven't already set up SSH keys, you can learn how to do so [here](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/about-ssh).
```bash
git clone git@github.com:twentyhq/twenty.git
@@ -90,28 +90,28 @@ En tu terminal, ejecuta el siguiente comando.
-## Paso 2: Ubícate en la raíz
+## Step 2: Position yourself at the root
```bash
cd twenty
```
-Debes ejecutar todos los comandos de los siguientes pasos desde la raíz del proyecto.
+You should run all commands in the following steps from the root of the project.
-## Paso 3: Configurar una Base de Datos PostgreSQL
+## Step 3: Set up a PostgreSQL Database
- **Opción 1 (preferido):** Para aprovisionar tu base de datos localmente:
- Usa el siguiente enlace para instalar PostgreSQL en tu máquina Linux: [Instalación de PostgreSQL](https://www.postgresql.org/download/linux/)
+ **Option 1 (preferred):** To provision your database locally:
+ Use the following link to install Postgresql on your Linux machine: [Postgresql Installation](https://www.postgresql.org/download/linux/)
```bash
psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
```
- Nota: Puede que necesites agregar `sudo -u postgres` antes del comando `psql` para evitar errores de permisos.
+ Note: You might need to add `sudo -u postgres` to the command before `psql` to avoid permission errors.
- **Opción 2:** Si tienes Docker instalado:
+ **Option 2:** If you have docker installed:
```bash
make postgres-on-docker
@@ -119,7 +119,7 @@ Debes ejecutar todos los comandos de los siguientes pasos desde la raíz del pro
- **Opción 1 (preferido):** Para aprovisionar tu base de datos localmente con `brew`:
+ **Option 1 (preferred):** To provision your database locally with `brew`:
```bash
brew install postgresql@16
@@ -128,49 +128,49 @@ Debes ejecutar todos los comandos de los siguientes pasos desde la raíz del pro
psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
```
- Puedes verificar si el servidor PostgreSQL está corriendo ejecutando:
+ You can verify if the PostgreSQL server is running by executing:
```bash
brew services list
```
- El instalador puede que no cree el usuario `postgres` por defecto al instalar
- vía Homebrew en macOS. En cambio, crea un rol de PostgreSQL que coincide con tu
- nombre de usuario de macOS (por ejemplo, "john").
- Para comprobar y crear el usuario `postgres` si es necesario, sigue estos pasos:
+ The installer might not create the `postgres` user by default when installing
+ via Homebrew on MacOS. Instead, it creates a PostgreSQL role that matches your macOS
+ username (e.g., "john").
+ To check and create the `postgres` user if necessary, follow these steps:
```bash
- # Conectar a PostgreSQL
+ # Connect to PostgreSQL
psql postgres
- o
+ or
psql -U $(whoami) -d postgres
```
- Una vez en el comando psql (postgres=#), ejecuta:
+ Once at the psql prompt (postgres=#), run:
```bash
- # Lista los roles de PostgreSQL existentes
+ # List existing PostgreSQL roles
\du
```
- Verás una salida similar a:
+ You'll see output similar to:
```bash
- Nombre del rol | Atributos | Miembro de
+ Role name | Attributes | Member of
-----------+-------------+-----------
john | Superuser | {}
```
- Si no ves un rol `postgres` listado, procede al siguiente paso.
- Crea el rol `postgres` manualmente:
+ If you do not see a `postgres` role listed, proceed to the next step.
+ Create the `postgres` role manually:
```bash
CREATE ROLE postgres WITH SUPERUSER LOGIN;
```
- Esto crea un rol de superusuario llamado `postgres` con acceso de inicio de sesión.
+ This creates a superuser role named `postgres` with login access.
- **Opción 2:** Si tienes Docker instalado:
+ **Option 2:** If you have docker installed:
```bash
make postgres-on-docker
@@ -178,20 +178,20 @@ Debes ejecutar todos los comandos de los siguientes pasos desde la raíz del pro
- Todos los siguientes pasos deben ejecutarse en la terminal de WSL (dentro de tu máquina virtual)
+ All the following steps are to be run in the WSL terminal (within your virtual machine)
- **Opción 1:** Para aprovisionar tu PostgreSQL localmente:
- Usa el siguiente enlace para instalar PostgreSQL en tu máquina virtual Linux: [Instalación de PostgreSQL](https://www.postgresql.org/download/linux/)
+ **Option 1:** To provision your Postgresql locally:
+ Use the following link to install Postgresql on your Linux virtual machine: [Postgresql Installation](https://www.postgresql.org/download/linux/)
```bash
psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
```
- Nota: Puede que necesites agregar `sudo -u postgres` antes del comando `psql` para evitar errores de permisos.
+ Note: You might need to add `sudo -u postgres` to the command before `psql` to avoid permission errors.
- **Opción 2:** Si tienes Docker instalado:
- Ejecutar Docker en WSL agrega una capa extra de complejidad.
- Solo usa esta opción si estás cómodo con los pasos extras involucrados, incluyendo activar [Docker Desktop WSL2](https://docs.docker.com/desktop/wsl).
+ **Option 2:** If you have docker installed:
+ Running Docker on WSL adds an extra layer of complexity.
+ Only use this option if you are comfortable with the extra steps involved, including turning on [Docker Desktop WSL2](https://docs.docker.com/desktop/wsl).
```bash
make postgres-on-docker
@@ -199,18 +199,18 @@ Debes ejecutar todos los comandos de los siguientes pasos desde la raíz del pro
-Ahora puedes acceder a la base de datos en [localhost:5432](localhost:5432), con usuario `postgres` y contraseña `postgres`.
+You can now access the database at [localhost:5432](localhost:5432), with user `postgres` and password `postgres` .
-## Paso 4: Configurar una Base de Datos Redis (cache)
+## Step 4: Set up a Redis Database (cache)
-Twenty requiere un caché de redis para proporcionar el mejor rendimiento
+Twenty requires a redis cache to provide the best performance
- **Opción 1:** Para aprovisionar tu Redis localmente:
- Usa el siguiente enlace para instalar Redis en tu máquina Linux: [Instalación de Redis](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)
+ **Option 1:** To provision your Redis locally:
+ Use the following link to install Redis on your Linux machine: [Redis Installation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)
- **Opción 2:** Si tienes Docker instalado:
+ **Option 2:** If you have docker installed:
```bash
make redis-on-docker
@@ -218,16 +218,16 @@ Twenty requiere un caché de redis para proporcionar el mejor rendimiento
- **Opción 1 (preferido):** Para aprovisionar tu Redis localmente con `brew`:
+ **Option 1 (preferred):** To provision your Redis locally with `brew`:
```bash
brew install redis
```
- Inicia tu servidor redis:
+ Start your redis server:
`brew services start redis`
- **Opción 2:** Si tienes Docker instalado:
+ **Option 2:** If you have docker installed:
```bash
make redis-on-docker
@@ -235,10 +235,10 @@ Twenty requiere un caché de redis para proporcionar el mejor rendimiento
- **Opción 1:** Para aprovisionar tu Redis localmente:
- Usa el siguiente enlace para instalar Redis en tu máquina virtual Linux: [Instalación de Redis](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)
+ **Option 1:** To provision your Redis locally:
+ Use the following link to install Redis on your Linux virtual machine: [Redis Installation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)
- **Opción 2:** Si tienes Docker instalado:
+ **Option 2:** If you have docker installed:
```bash
make redis-on-docker
@@ -248,11 +248,11 @@ Twenty requiere un caché de redis para proporcionar el mejor rendimiento
If you need a Client GUI, we recommend [redis insight](https://redis.io/insight/) (free version available)
-## Paso 5: Configurar las variables de entorno
+## Step 5: Setup environment variables
-Usa variables de entorno o archivos `.env` para configurar tu proyecto. Más información [aquí](/l/es/developers/self-host/capabilities/setup)
+Use environment variables or `.env` files to configure your project. More info [here](/l/es/developers/self-host/capabilities/setup)
-Copia los archivos `.env.example` en `/front` y `/server`:
+Copy the `.env.example` files in `/front` and `/server`:
```bash
cp ./packages/twenty-front/.env.example ./packages/twenty-front/.env
@@ -263,26 +263,26 @@ cp ./packages/twenty-server/.env.example ./packages/twenty-server/.env
**Multi-Workspace Mode:** By default, Twenty runs in single-workspace mode where only one workspace can be created. To enable multi-workspace support (useful for testing subdomain-based features), set `IS_MULTIWORKSPACE_ENABLED=true` in your server `.env` file. See [Multi-Workspace Mode](/l/es/developers/self-host/capabilities/setup#multi-workspace-mode) for details.
-## Paso 6: Instalación de dependencias
+## Step 6: Installing dependencies
-Para compilar el servidor de Twenty e ingresar algunos datos en tu base de datos, ejecuta el siguiente comando:
+To build Twenty server and seed some data into your database, run the following command:
```bash
yarn
```
-Ten en cuenta que `npm` o `pnpm` no funcionarán
+Note that `npm` or `pnpm` won't work
-## Paso 7: Ejecutar el proyecto
+## Step 7: Running the project
- Dependiendo de tu distribución de Linux, el servidor Redis podría iniciarse automáticamente.
- Si no, revisa la [guía de instalación de Redis](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) para tu distribución.
+ Depending on your Linux distribution, Redis server might be started automatically.
+ If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro.
- Redis ya debería estar funcionando. Si no, ejecuta:
+ Redis should already be running. If not, run:
```bash
brew services start redis
@@ -290,18 +290,18 @@ Ten en cuenta que `npm` o `pnpm` no funcionarán
- Dependiendo de tu distribución de Linux, el servidor Redis podría iniciarse automáticamente.
- Si no es así, consulte la [guía de instalación de Redis](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) para su distribución.
+ Depending on your Linux distribution, Redis server might be started automatically.
+ If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro.
-Configure su base de datos con el siguiente comando:
+Set up your database with the following command:
```bash
npx nx database:reset twenty-server
```
-Inicie el servidor, el trabajador y los servicios frontend:
+Start the server, the worker and the frontend services:
```bash
npx nx start twenty-server
@@ -309,25 +309,25 @@ npx nx worker twenty-server
npx nx start twenty-front
```
-Alternativamente, puede iniciar todos los servicios a la vez:
+Alternatively, you can start all services at once:
```bash
npx nx start
```
-## Paso 8: Use Twenty
+## Step 8: Use Twenty
**Frontend**
-El frontend de Twenty estará ejecutándose en [http://localhost:3001](http://localhost:3001).
-Puede iniciar sesión usando la cuenta demo por defecto: `tim@apple.dev` (contraseña: `tim@apple.dev`)
+Twenty's frontend will be running at [http://localhost:3001](http://localhost:3001).
+You can log in using the default demo account: `tim@apple.dev` (password: `tim@apple.dev`)
**Backend**
-* El servidor de Twenty estará operativo en [http://localhost:3000](http://localhost:3000)
-* La API GraphQL puede ser accedida en [http://localhost:3000/graphql](http://localhost:3000/graphql)
-* La API REST puede ser alcanzada en [http://localhost:3000/rest](http://localhost:3000/rest)
+* Twenty's server will be up and running at [http://localhost:3000](http://localhost:3000)
+* The GraphQL API can be accessed at [http://localhost:3000/graphql](http://localhost:3000/graphql)
+* The REST API can be reached at [http://localhost:3000/rest](http://localhost:3000/rest)
-## Solución de Problemas
+## Troubleshooting
-Si encuentras algún problema, consulta [Solución de Problemas](/l/es/developers/self-host/capabilities/troubleshooting) para ver soluciones.
+If you encounter any problem, check [Troubleshooting](/l/es/developers/self-host/capabilities/troubleshooting) for solutions.
diff --git a/packages/twenty-docs/l/es/developers/contribute/contribute.mdx b/packages/twenty-docs/l/es/developers/contribute/contribute.mdx
index b488f76c4a..79742b6f2c 100644
--- a/packages/twenty-docs/l/es/developers/contribute/contribute.mdx
+++ b/packages/twenty-docs/l/es/developers/contribute/contribute.mdx
@@ -4,10 +4,10 @@ description: Contribute to Twenty's open-source development.
---
-
+
-## Resumen
+## Overview
Twenty is open-source and welcomes contributions from the community. Whether you're fixing bugs, adding features, or improving documentation, your contributions help make Twenty better for everyone.
@@ -26,7 +26,7 @@ Twenty is open-source and welcomes contributions from the community. Whether you
Report issues or request features
-
+
Contribute to the UI
diff --git a/packages/twenty-docs/l/es/developers/extend/capabilities/apis.mdx b/packages/twenty-docs/l/es/developers/extend/capabilities/apis.mdx
index 880aeed794..b436ae7425 100644
--- a/packages/twenty-docs/l/es/developers/extend/capabilities/apis.mdx
+++ b/packages/twenty-docs/l/es/developers/extend/capabilities/apis.mdx
@@ -5,16 +5,16 @@ description: Query and modify your CRM data programmatically using REST or Graph
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-Twenty fue creado para ser amigable con los desarrolladores, ofreciendo APIs potentes que se adaptan a tu modelo de datos personalizado. Proveemos cuatro tipos de API distintos para satisfacer diferentes necesidades de integración.
+Twenty was built to be developer-friendly, offering powerful APIs that adapt to your custom data model. We provide four distinct API types to meet different integration needs.
-## Enfoque centrado en el desarrollador
+## Developer-First Approach
Twenty generates APIs specifically for your data model:
-* **No se requieren IDs largos**: Usa los nombres de tus objetos y campos directamente en los endpoints.
-* **Objetos estándar y personalizados tratados por igual**: Tus objetos personalizados reciben el mismo tratamiento de API que los incorporados.
-* **Endpoints dedicados**: Cada objeto y campo recibe su propio endpoint de API.
-* **Documentación personalizada**: Generada específicamente para el modelo de datos de tu espacio de trabajo.
+* **No long IDs required**: Use your object and field names directly in endpoints
+* **Standard and custom objects treated equally**: Your custom objects get the same API treatment as built-in ones
+* **Dedicated endpoints**: Each object and field gets its own API endpoint
+* **Custom documentation**: Generated specifically for your workspace's data model
Your personalized API documentation is available under **Settings → API & Webhooks** after creating an API key. Since Twenty generates APIs that match your custom data model, the documentation is unique to your workspace.
@@ -22,45 +22,45 @@ Twenty generates APIs specifically for your data model:
## The Two API Types
-### API Principal
+### Core API
-Accesible en `/rest/` o `/graphql/`
+Accessed on `/rest/` or `/graphql/`
Work with your actual **records** (the data):
* Create, read, update, delete People, Companies, Opportunities, etc.
* Query and filter data
-* Gestionar relaciones de registros
+* Manage record relationships
-### API de Metadatos
+### Metadata API
-Accesible en `/rest/metadata/` o `/metadata/`
+Accessed on `/rest/metadata/` or `/metadata/`
Manage your **workspace and data model**:
-* Crear, modificar o eliminar objetos y campos
-* Configurar ajustes del espacio de trabajo
+* Create, modify, or delete objects and fields
+* Configure workspace settings
* Define relationships between objects
## REST vs GraphQL
Both Core and Metadata APIs are available in REST and GraphQL formats:
-| Formato | Available Operations |
+| Format | Available Operations |
| ----------- | ---------------------------------------------------------- |
| **REST** | CRUD, batch operations, upserts |
| **GraphQL** | Same + **batch upserts**, relationship queries in one call |
Choose based on your needs — both formats access the same data.
-## Puntos de Acceso de API
+## API Endpoints
| Environment | Base URL |
| --------------- | ------------------------- |
| **Cloud** | `https://api.twenty.com/` |
| **Self-Hosted** | `https://{your-domain}/` |
-## Autenticación
+## Authentication
Every API request requires an API key in the header:
@@ -68,14 +68,14 @@ Every API request requires an API key in the header:
Authorization: Bearer YOUR_API_KEY
```
-### Crear una Clave de API
+### Create an API Key
-1. Ve a **Configuración → APIs y Webhooks**
+1. Go to **Settings → APIs & Webhooks**
2. Click **+ Create key**
-3. Configurar:
+3. Configure:
* **Name**: Descriptive name for the key
* **Expiration Date**: When the key expires
-4. Haga clic en **Guardar**
+4. Click **Save**
5. **Copy immediately** — the key is only shown once
@@ -90,13 +90,13 @@ For better security, assign a specific role to limit access:
1. Go to **Settings → Roles**
2. Click on the role to assign
-3. Abre la pestaña **Asignación**
+3. Open the **Assignment** tab
4. Under **API Keys**, click **+ Assign to API key**
5. Select the API key
The key will inherit that role's permissions. See [Permissions](/l/es/user-guide/permissions-access/capabilities/permissions) for details.
-### Gestionar Claves de API
+### Manage API Keys
**Regenerate**: Settings → APIs & Webhooks → Click key → **Regenerate**
@@ -108,7 +108,7 @@ Test your APIs directly in the browser with our built-in playground — availabl
### Access the Playground
-1. Ve a **Configuración → APIs y Webhooks**
+1. Go to **Settings → APIs & Webhooks**
2. Create an API key (required)
3. Click on **REST API** or **GraphQL API** to open the playground
@@ -121,11 +121,11 @@ Test your APIs directly in the browser with our built-in playground — availabl
The playground reflects your custom objects and fields, so documentation is always accurate for your workspace.
-## Operaciones por Lotes
+## Batch Operations
Both REST and GraphQL support batch operations:
-* **Tamaño del lote**: Hasta 60 registros por solicitud
+* **Batch size**: Up to 60 records per request
* **Operations**: Create, update, delete multiple records
**GraphQL-only features:**
@@ -137,7 +137,7 @@ Both REST and GraphQL support batch operations:
API requests are throttled to ensure platform stability:
-| Límite | Valor |
+| Limit | Value |
| -------------- | -------------------- |
| **Requests** | 100 calls per minute |
| **Batch size** | 60 records per call |
diff --git a/packages/twenty-docs/l/es/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/es/developers/extend/capabilities/apps.mdx
index e8b200e225..dc528fa780 100644
--- a/packages/twenty-docs/l/es/developers/extend/capabilities/apps.mdx
+++ b/packages/twenty-docs/l/es/developers/extend/capabilities/apps.mdx
@@ -21,7 +21,7 @@ Apps let you build and manage Twenty customizations **as code**. Instead of conf
* Custom UI layouts and components
-## Prerrequisitos
+## Prerequisites
* Node.js 24+ and Yarn 4
* A Twenty workspace and an API key (create one at https://app.twenty.com/settings/api-webhooks)
@@ -42,7 +42,7 @@ yarn auth
yarn dev
```
-Desde aquí usted puede:
+From here you can:
```bash filename="Terminal"
# Add a new entity to your application (guided)
@@ -115,7 +115,7 @@ Later commands will add more files and folders:
* `yarn generate` will create a `generated/` folder (typed Twenty client + workspace types).
* `yarn create-entity` will add entity definition files under `src/` for your custom objects.
-## Autenticación
+## Authentication
The first time you run `yarn auth`, you'll be prompted for:
@@ -124,7 +124,7 @@ The first time you run `yarn auth`, you'll be prompted for:
Your credentials are stored per-user in `~/.twenty/config.json`. You can maintain multiple profiles and switch using `--workspace `.
-Ejemplos:
+Examples:
```bash filename="Terminal"
# Login interactively (recommended)
@@ -512,7 +512,7 @@ Then add scripts like these:
Now you can run the same commands via Yarn, e.g. `yarn dev`, `yarn sync`, etc.
-## Solución de problemas
+## Troubleshooting
* Authentication errors: run `yarn auth` and ensure your API key has the required permissions.
* Cannot connect to server: verify the API URL and that the Twenty server is reachable.
diff --git a/packages/twenty-docs/l/es/developers/extend/capabilities/webhooks.mdx b/packages/twenty-docs/l/es/developers/extend/capabilities/webhooks.mdx
index 094b66f320..e8ee19e955 100644
--- a/packages/twenty-docs/l/es/developers/extend/capabilities/webhooks.mdx
+++ b/packages/twenty-docs/l/es/developers/extend/capabilities/webhooks.mdx
@@ -7,28 +7,28 @@ import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
Webhooks push data to your systems in real-time when events occur in Twenty — no polling required. Use them to keep external systems in sync, trigger automations, or send alerts.
-## Crear un Webhook
+## Create a Webhook
-1. Ve a **Configuración → APIs y Webhooks → Webhooks**
-2. Haga clic en **+ Crear webhook**
+1. Go to **Settings → APIs & Webhooks → Webhooks**
+2. Click **+ Create webhook**
3. Enter your webhook URL (must be publicly accessible)
-4. Haga clic en **Guardar**
+4. Click **Save**
The webhook activates immediately and starts sending notifications.
-### Gestionar Webhooks
+### Manage Webhooks
**Edit**: Click the webhook → Update URL → **Save**
**Delete**: Click the webhook → **Delete** → Confirm
-## Eventos
+## Events
Twenty sends webhooks for these event types:
-| Evento | Ejemplo |
+| Event | Example |
| ------------------ | ---------------------------------------------------------- |
| **Record Created** | `person.created`, `company.created`, `note.created` |
| **Record Updated** | `person.updated`, `company.updated`, `opportunity.updated` |
@@ -55,23 +55,23 @@ Each webhook sends an HTTP POST with a JSON body:
}
```
-| Campo | Descripción |
-| ----------------- | ------------------------------------------------ |
-| `evento` | What happened (e.g., `person.created`) |
-| `datos` | The full record that was created/updated/deleted |
-| `marca de tiempo` | When the event occurred (UTC) |
+| Field | Description |
+| ----------- | ------------------------------------------------ |
+| `event` | What happened (e.g., `person.created`) |
+| `data` | The full record that was created/updated/deleted |
+| `timestamp` | When the event occurred (UTC) |
Respond with a **2xx HTTP status** (200-299) to acknowledge receipt. Non-2xx responses are logged as delivery failures.
-## Validación de Webhook
+## Webhook Validation
Twenty signs each webhook request for security. Validate signatures to ensure requests are authentic.
### Headers
-| Encabezado | Descripción |
+| Header | Description |
| ---------------------------- | --------------------- |
| `X-Twenty-Webhook-Signature` | HMAC SHA256 signature |
| `X-Twenty-Webhook-Timestamp` | Request timestamp |
@@ -103,7 +103,7 @@ const isValid = expectedSignature === req.headers["x-twenty-webhook-signature"];
## Webhooks vs Workflows
-| Método | Dirección | Use Case |
+| Method | Direction | Use Case |
| ---------------------------- | --------- | ---------------------------------------------------------- |
| **Webhooks** | OUT | Automatically notify external systems of any record change |
| **Workflow + HTTP Request** | OUT | Send data out with custom logic (filters, transformations) |
diff --git a/packages/twenty-docs/l/es/developers/extend/extend.mdx b/packages/twenty-docs/l/es/developers/extend/extend.mdx
index 362e14f89c..5d5cedc184 100644
--- a/packages/twenty-docs/l/es/developers/extend/extend.mdx
+++ b/packages/twenty-docs/l/es/developers/extend/extend.mdx
@@ -4,10 +4,10 @@ description: Extend Twenty's functionality with APIs, webhooks, and custom apps.
---
-
+
-## Resumen
+## Overview
Twenty is designed to be extensible. Use our APIs, webhooks, and app framework to integrate with your existing tools and build custom functionality.
@@ -20,7 +20,7 @@ Twenty is designed to be extensible. Use our APIs, webhooks, and app framework t
## Getting Started
-
+
Connect to Twenty programmatically
diff --git a/packages/twenty-docs/l/es/developers/self-host/capabilities/cloud-providers.mdx b/packages/twenty-docs/l/es/developers/self-host/capabilities/cloud-providers.mdx
index 51726da414..809388612a 100644
--- a/packages/twenty-docs/l/es/developers/self-host/capabilities/cloud-providers.mdx
+++ b/packages/twenty-docs/l/es/developers/self-host/capabilities/cloud-providers.mdx
@@ -1,45 +1,45 @@
---
-title: Otros métodos
+title: Other methods
---
- Este documento es mantenido por la comunidad. Podría contener problemas.
+ This document is maintained by the community. It might contain issues.
-## Kubernetes vía Terraform y Manifests
+## Kubernetes via Terraform and Manifests
-Documentación comunitaria para la implementación de Kubernetes está disponible [aquí](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s)
+Community-led documentation for Kubernetes deployment is available [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s)
### Coolify
-Despliega Twenty en servidores usando Coolify. (la imagen oficial en Coolify estará disponible pronto)
+Deploy Twenty on servers using Coolify. (official image on Coolify will be available soon)
-[Documentación de Coolify](https://coolify.io/docs/get-started/introduction)
+[Coolify documentation](https://coolify.io/docs/get-started/introduction)
### EasyPanel
-Despliega Twenty en EasyPanel con la plantilla mantenida por la comunidad a continuación.
+Deploy Twenty on EasyPanel with the community maintained template below.
-[Desplegar en EasyPanel](https://easypanel.io/docs/templates/twenty)
+[Deploy on EasyPanel](https://easypanel.io/docs/templates/twenty)
### Elest.io
-Despliega Twenty en servidores con Elest.io utilizando el enlace a continuación.
+Deploy Twenty on servers with Elest.io using link below.
-[Desplegar en Elest.io](https://elest.io/open-source/twenty)
+[Deploy on Elest.io](https://elest.io/open-source/twenty)
-### Twenty en Railway
+### Twenty on Railway
-Despliega Twenty en Railway con la plantilla mantenida por la comunidad a continuación.
+Deploy Twenty on Railway with the community maintained template below.
-[](https://railway.com/deploy/nAL3hA)
+[](https://railway.com/deploy/nAL3hA)
-### Twenty en Sealos
+### Twenty on Sealos
-Despliega Twenty en Sealos con la plantilla mantenida por la comunidad a continuación.
+Deploy Twenty on Sealos with the community maintained template below.
-[](https://sealos.io/products/app-store/twenty)
+[](https://sealos.io/products/app-store/twenty)
-## Otros
+## Others
Please feel free to Open a PR to add more Cloud Provider options.
diff --git a/packages/twenty-docs/l/es/developers/self-host/capabilities/docker-compose.mdx b/packages/twenty-docs/l/es/developers/self-host/capabilities/docker-compose.mdx
index 5d5e66e1cb..3791b5e48b 100644
--- a/packages/twenty-docs/l/es/developers/self-host/capabilities/docker-compose.mdx
+++ b/packages/twenty-docs/l/es/developers/self-host/capabilities/docker-compose.mdx
@@ -1,207 +1,207 @@
---
-title: 1-Clic con Docker Compose
+title: 1-Click w/ Docker Compose
---
- Los contenedores de Docker son para alojamiento en producción o autoalojamiento, para la contribución por favor revise la [Configuración Local](/l/es/developers/contribute/capabilities/local-setup).
+ Docker containers are for production hosting or self-hosting, for the contribution please check the [Local Setup](/l/es/developers/contribute/capabilities/local-setup).
-## Resumen
+## Overview
-Esta guía proporciona instrucciones paso a paso para instalar y configurar la aplicación Twenty utilizando Docker Compose. El objetivo es simplificar el proceso y prevenir errores comunes que podrían arruinar tu configuración.
+This guide provides step-by-step instructions to install and configure the Twenty application using Docker Compose. The aim is to make the process straightforward and prevent common pitfalls that could break your setup.
-**Importante:** Solo modifica configuraciones explícitamente mencionadas en esta guía. Alterar otras configuraciones puede causar problemas.
+**Important:** Only modify settings explicitly mentioned in this guide. Altering other configurations may lead to issues.
-Consulta los documentos [Configurar Variables de Entorno](/l/es/developers/self-host/capabilities/setup) para configuraciones avanzadas. Todas las variables de entorno deben ser declaradas en el archivo docker-compose.yml en el nivel del servidor y/o trabajador dependiendo de la variable.
+See docs [Setup Environment Variables](/l/es/developers/self-host/capabilities/setup) for advanced configuration. All environment variables must be declared in the docker-compose.yml file at the server and / or worker level depending on the variable.
-## Requisitos del sistema
+## System Requirements
-* RAM: Asegúrate de que tu entorno tenga al menos 2GB de RAM. La memoria insuficiente puede causar que los procesos se bloqueen.
-* Docker & Docker Compose: Asegúrate de que ambos estén instalados y actualizados.
+* RAM: Ensure your environment has at least 2GB of RAM. Insufficient memory can cause processes to crash.
+* Docker & Docker Compose: Make sure both are installed and up-to-date.
-## Opción 1: Script de una línea
+## Option 1: One-line script
-Instala la última versión estable de Twenty con un solo comando:
+Install the latest stable version of Twenty with a single command:
```bash
bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
```
-Para instalar una versión o rama específica:
+To install a specific version or branch:
```bash
VERSION=vx.y.z BRANCH=branch-name bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
```
-* Reemplace x.y.z con el número de versión deseado.
-* Reemplace branch-name con el nombre de la rama que desea instalar.
+* Replace x.y.z with the desired version number.
+* Replace branch-name with the name of the branch you want to install.
-## Opción 2: Pasos manuales
+## Option 2: Manual steps
-Sigue estos pasos para una configuración manual.
+Follow these steps for a manual setup.
-### Paso 1: Configurar el archivo de entorno
+### Step 1: Set Up the Environment File
1. **Create the .env File**
- Copia el archivo de entorno de ejemplo a tu directorio de trabajo a un nuevo archivo .env:
+ Copy the example environment file to a new .env file in your working directory:
```bash
curl -o .env https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/.env.example
```
-2. **Generar tokens secretos**
+2. **Generate Secret Tokens**
- Ejecuta el siguiente comando para generar una cadena única aleatoria:
+ Run the following command to generate a unique random string:
```bash
openssl rand -base64 32
```
- **Importante:** Mantén este valor en secreto / no lo compartas.
+ **Important:** Keep this value secret / do not share it.
-3. **Actualiza el `.env`**
+3. **Update the `.env`**
- Reemplaza el valor de marcador de posición en tu archivo .env con el token generado:
+ Replace the placeholder value in your .env file with the generated token:
```ini
- APP_SECRET=primera_cadena_aleatoria
+ APP_SECRET=first_random_string
```
-4. **Establecer la contraseña de Postgres**
+4. **Set the Postgres Password**
- Actualiza el valor de `PG_DATABASE_PASSWORD` en el archivo .env con una contraseña fuerte sin caracteres especiales.
+ Update the `PG_DATABASE_PASSWORD` value in the .env file with a strong password without special characters.
```ini
- PG_DATABASE_PASSWORD=mi_contraseña_fuerte
+ PG_DATABASE_PASSWORD=my_strong_password
```
-### Paso 2: Obtener el archivo Docker Compose
+### Step 2: Obtain the Docker Compose File
-Descarga el archivo `docker-compose.yml` en tu directorio de trabajo:
+Download the `docker-compose.yml` file to your working directory:
```bash
curl -o docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/docker-compose.yml
```
-### Paso 3: Lanza la aplicación
+### Step 3: Launch the Application
-Inicia los contenedores Docker:
+Start the Docker containers:
```bash
docker compose up -d
```
-### Paso 4: Acceder a la aplicación
+### Step 4: Access the Application
-Si alojas twentyCRM en tu propia computadora, abre tu navegador y navega a [http://localhost:3000](http://localhost:3000).
+If you host twentyCRM on your own computer, open your browser and navigate to [http://localhost:3000](http://localhost:3000).
-Si lo alojas en un servidor, verifica que el servidor esté en funcionamiento y que todo esté bien con
+If you host it on a server, check that the server is running and that everything is ok with
```bash
curl http://localhost:3000
```
-## Configuración
+## Configuration
-### Exponer Twenty para acceso externo
+### Expose Twenty to External Access
-Por defecto, Twenty se ejecuta en `localhost` en el puerto `3000`. Para acceder a él mediante un dominio externo o dirección IP, necesitas configurar `SERVER_URL` en tu archivo `.env`.
+By default, Twenty runs on `localhost` at port `3000`. To access it via an external domain or IP address, you need to configure the `SERVER_URL` in your `.env` file.
-#### Entendiendo `SERVER_URL`
+#### Understanding `SERVER_URL`
-* **Protocolo:** Usa `http` o `https` dependiendo de tu configuración.
- * Usa `http` si no has configurado SSL.
- * Usa `https` si tienes SSL configurado.
-* **Dominio/IP:** Este es el nombre de dominio o dirección IP donde tu aplicación es accesible.
-* **Puerto:** Incluye el número de puerto si no estás usando los puertos predeterminados (`80` para `http`, `443` para `https`).
+* **Protocol:** Use `http` or `https` depending on your setup.
+ * Use `http` if you haven't set up SSL.
+ * Use `https` if you have SSL configured.
+* **Domain/IP:** This is the domain name or IP address where your application is accessible.
+* **Port:** Include the port number if you're not using the default ports (`80` for `http`, `443` for `https`).
-### Requisitos de SSL
+### SSL Requirements
-SSL (HTTPS) es requerido para que ciertas características del navegador funcionen correctamente. Aunque estas características podrían funcionar durante el desarrollo local (ya que los navegadores tratan localhost de manera diferente), se requiere una configuración SSL adecuada al alojar Twenty en un dominio regular.
+SSL (HTTPS) is required for certain browser features to work properly. While these features might work during local development (as browsers treat localhost differently), a proper SSL setup is needed when hosting Twenty on a regular domain.
-Por ejemplo, es posible que la API del portapapeles requiera un contexto seguro: algunas características como los botones de copia en toda la aplicación pueden no funcionar sin HTTPS habilitado.
+For example, the clipboard API might require a secure context - some features like copy buttons throughout the application might not work without HTTPS enabled.
-Recomendamos encarecidamente configurar Twenty detrás de un proxy inverso con terminación SSL para una seguridad y funcionalidad óptimas.
+We strongly recommend setting up Twenty behind a reverse proxy with SSL termination for optimal security and functionality.
-#### Configurando `SERVER_URL`
+#### Configuring `SERVER_URL`
-1. **Determine su URL de acceso**
- * **Sin proxy inverso (Acceso directo):**
+1. **Determine Your Access URL**
+ * **Without Reverse Proxy (Direct Access):**
- Si estás accediendo a la aplicación directamente sin un proxy inverso:
+ If you're accessing the application directly without a reverse proxy:
```ini
- SERVER_URL=http://tu-dominio-o-ip:3000
+ SERVER_URL=http://your-domain-or-ip:3000
```
- * **Con proxy inverso (Puertos estándar):**
+ * **With Reverse Proxy (Standard Ports):**
- Si estás usando un proxy inverso como Nginx o Traefik y tienes SSL configurado:
+ If you're using a reverse proxy like Nginx or Traefik and have SSL configured:
```ini
- SERVER_URL=https://tu-dominio-o-ip
+ SERVER_URL=https://your-domain-or-ip
```
- * **Con proxy inverso (Puertos personalizados):**
+ * **With Reverse Proxy (Custom Ports):**
- Si estás usando puertos no estándar:
+ If you're using non-standard ports:
```ini
- SERVER_URL=https://tu-dominio-o-ip:puerto-personalizado
+ SERVER_URL=https://your-domain-or-ip:custom-port
```
-2. **Actualiza el archivo `.env`**
+2. **Update the `.env` File**
- Abre tu archivo `.env` y actualiza el `SERVER_URL`:
+ Open your `.env` file and update the `SERVER_URL`:
```ini
- SERVER_URL=http(s)://tu-dominio-o-ip:tu-puerto
+ SERVER_URL=http(s)://your-domain-or-ip:your-port
```
- **Ejemplos:**
+ **Examples:**
- * Acceso directo sin SSL:
+ * Direct access without SSL:
```ini
SERVER_URL=http://123.45.67.89:3000
```
- * Acceso vía dominio con SSL:
+ * Access via domain with SSL:
```ini
- SERVER_URL=https://miappdetwenty.com
+ SERVER_URL=https://mytwentyapp.com
```
-3. **Reiniciar la aplicación**
+3. **Restart the Application**
- Para que los cambios surtan efecto, reinicia los contenedores Docker:
+ For changes to take effect, restart the Docker containers:
```bash
docker compose down
docker compose up -d
```
-#### Consideraciones
+#### Considerations
-* **Configuración del Proxy Inverso:**
+* **Reverse Proxy Configuration:**
- Asegúrese de que su proxy inverso envíe las solicitudes al puerto interno correcto (`3000` por defecto). Configure la terminación SSL y cualquier cabecera necesaria.
+ Ensure your reverse proxy forwards requests to the correct internal port (`3000` by default). Configure SSL termination and any necessary headers.
-* **Configuración del Cortafuegos:**
+* **Firewall Settings:**
- Abra los puertos necesarios en su cortafuegos para permitir el acceso externo.
+ Open necessary ports in your firewall to allow external access.
-* **Consistencia:**
+* **Consistency:**
- La `SERVER_URL` debe coincidir con cómo los usuarios acceden a su aplicación en sus navegadores.
+ The `SERVER_URL` must match how users access your application in their browsers.
-#### Persistencia
+#### Persistence
-* **Volúmenes de Datos:**
+* **Data Volumes:**
- La configuración de Docker Compose utiliza volúmenes para persistir datos para la base de datos y el almacenamiento del servidor.
+ The Docker Compose configuration uses volumes to persist data for the database and server storage.
-* **Entornos Sin Estado:**
+* **Stateless Environments:**
- Si se despliega en un entorno sin estado (por ejemplo, ciertos servicios en la nube), configure un almacenamiento externo para persistir los datos.
+ If deploying to a stateless environment (e.g., certain cloud services), configure external storage to persist data.
## Backup and Restore
@@ -248,6 +248,6 @@ docker compose up -d
* **Encrypt sensitive data** — protect backups with encryption
* **Retain multiple copies** — keep daily, weekly, and monthly backups
-## Solución de Problemas
+## Troubleshooting
-Si encuentras algún problema, consulta [Solución de Problemas](/l/es/developers/self-host/capabilities/troubleshooting) para ver soluciones.
+If you encounter any problem, check [Troubleshooting](/l/es/developers/self-host/capabilities/troubleshooting) for solutions.
diff --git a/packages/twenty-docs/l/es/developers/self-host/capabilities/setup.mdx b/packages/twenty-docs/l/es/developers/self-host/capabilities/setup.mdx
index 127d8f8003..f706378ad2 100644
--- a/packages/twenty-docs/l/es/developers/self-host/capabilities/setup.mdx
+++ b/packages/twenty-docs/l/es/developers/self-host/capabilities/setup.mdx
@@ -1,64 +1,64 @@
---
-title: Configuración
+title: Setup
---
-# Gestión de Configuración
+# Configuration Management
- **¿Instalando por primera vez?** Siga la [guía de instalación de Docker Compose](/l/es/developers/self-host/capabilities/docker-compose) para ejecutar Twenty, luego regrese aquí para la configuración.
+ **First time installing?** Follow the [Docker Compose installation guide](/l/es/developers/self-host/capabilities/docker-compose) to get Twenty running, then return here for configuration.
-Twenty ofrece **dos modos de configuración** para adaptarse a diferentes necesidades de implementación:
+Twenty offers **two configuration modes** to suit different deployment needs:
-**Acceso al panel de administración:** Solo los usuarios con privilegios de administrador (`canAccessFullAdminPanel: true`) pueden acceder a la interfaz de configuración.
+**Admin panel access:** Only users with admin privileges (`canAccessFullAdminPanel: true`) can access the configuration interface.
-## 1. Configuración del Panel de Administración (Predeterminado)
+## 1. Admin Panel Configuration (Default)
```bash
-IS_CONFIG_VARIABLES_IN_DB_ENABLED=true # predeterminado
+IS_CONFIG_VARIABLES_IN_DB_ENABLED=true # default
```
-**La mayoría de las configuraciones se realizan a través de la interfaz** después de la instalación:
+**Most configuration happens through the UI** after installation:
-1. Acceda a su instancia de Twenty (normalmente `http://localhost:3000`)
-2. Vaya a **Configuración / Panel de Administración / Variables de Configuración**
-3. Configure integraciones, correo electrónico, almacenamiento y más
-4. Los cambios se aplican inmediatamente (dentro de 15 segundos para implementaciones multicontenedor)
+1. Access your Twenty instance (usually `http://localhost:3000`)
+2. Go to **Settings / Admin Panel / Configuration Variables**
+3. Configure integrations, email, storage, and more
+4. Changes take effect immediately (within 15 seconds for multi-container deployments)
- **Implementaciones Multicontenedor:** Al usar la configuración de base de datos (`IS_CONFIG_VARIABLES_IN_DB_ENABLED=true`), tanto los contenedores del servidor como los de trabajo leen de la misma base de datos. Los cambios en el panel de administración afectan a ambos automáticamente, eliminando la necesidad de duplicar las variables de entorno entre contenedores (excepto para las variables de infraestructura).
+ **Multi-Container Deployments:** When using database configuration (`IS_CONFIG_VARIABLES_IN_DB_ENABLED=true`), both server and worker containers read from the same database. Admin panel changes affect both automatically, eliminating the need to duplicate environment variables between containers (except for infrastructure variables).
-**Qué se puede configurar a través del panel de administración:**
+**What you can configure through the admin panel:**
-* **Autenticación** - OAuth de Google/Microsoft, configuración de contraseñas
-* **Correo Electrónico** - Configuración de SMTP, plantillas, verificación
-* **Almacenamiento** - Configuración S3, rutas de almacenamiento local
-* **Integraciones** - Gmail, Google Calendar, servicios de Microsoft
-* **Flujo de Trabajo y Limitación de Tasas** - Límites de ejecución, restricción de API
-* **Y mucho más...**
+* **Authentication** - Google/Microsoft OAuth, password settings
+* **Email** - SMTP settings, templates, verification
+* **Storage** - S3 configuration, local storage paths
+* **Integrations** - Gmail, Google Calendar, Microsoft services
+* **Workflow & Rate Limiting** - Execution limits, API throttling
+* **And much more...**
-
+
- Cada variable está documentada con descripciones en su panel de administración en **Configuración → Panel de Administración → Variables de Configuración**.
- Algunas configuraciones de infraestructura como las conexiones de base de datos (`PG_DATABASE_URL`), URLs del servidor (`SERVER_URL`), y secretos de la aplicación (`APP_SECRET`) solo se pueden configurar a través del archivo `.env`.
+ Each variable is documented with descriptions in your admin panel at **Settings → Admin Panel → Configuration Variables**.
+ Some infrastructure settings like database connections (`PG_DATABASE_URL`), server URLs (`SERVER_URL`), and app secrets (`APP_SECRET`) can only be configured via `.env` file.
- [Referencia técnica completa →](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts)
+ [Complete technical reference →](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts)
-## 2. Configuración Solo de Entorno
+## 2. Environment-Only Configuration
```bash
IS_CONFIG_VARIABLES_IN_DB_ENABLED=false
```
-**Toda la configuración se gestiona a través de archivos `.env`:**
+**All configuration managed through `.env` files:**
-1. Establezca `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` en su archivo `.env`
-2. Agregue todas las variables de configuración a su archivo `.env`
-3. Reinicie los contenedores para que los cambios tengan efecto
-4. El panel de administración mostrará los valores actuales pero no podrá modificarlos
+1. Set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` in your `.env` file
+2. Add all configuration variables to your `.env` file
+3. Restart containers for changes to take effect
+4. Admin panel will show current values but cannot modify them
## Multi-Workspace Mode
@@ -116,31 +116,31 @@ IS_WORKSPACE_CREATION_LIMITED_TO_SERVER_ADMINS=true
When enabled, only users with `canAccessFullAdminPanel` can create additional workspaces. Users can still create their first workspace during initial signup.
-## Integración con Gmail y Google Calendar
+## Gmail & Google Calendar Integration
-### Crear Proyecto en Google Cloud
+### Create Google Cloud Project
-1. Vaya a [Google Cloud Console](https://console.cloud.google.com/)
-2. Cree un nuevo proyecto o seleccione uno existente
-3. Habilite estas APIs:
+1. Go to [Google Cloud Console](https://console.cloud.google.com/)
+2. Create a new project or select existing one
+3. Enable these APIs:
* [Gmail API](https://console.cloud.google.com/apis/library/gmail.googleapis.com)
* [Google Calendar API](https://console.cloud.google.com/apis/library/calendar-json.googleapis.com)
* [People API](https://console.cloud.google.com/apis/library/people.googleapis.com)
-### Configurar OAuth
+### Configure OAuth
-1. Vaya a [Credenciales](https://console.cloud.google.com/apis/credentials)
-2. Cree un ID de Cliente OAuth 2.0
-3. Agregue estas URIs de redirección:
+1. Go to [Credentials](https://console.cloud.google.com/apis/credentials)
+2. Create OAuth 2.0 Client ID
+3. Add these redirect URIs:
* `https://{your-domain}/auth/google/redirect` (for SSO)
* `https://{your-domain}/auth/google-apis/get-access-token` (for integrations)
-### Configurar en Twenty
+### Configure in Twenty
-1. Vaya a **Configuración → Panel de Administración → Variables de Configuración**
-2. Encuentre la sección **Google Auth**
-3. Establezca estas variables:
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Google Auth** section
+3. Set these variables:
* `MESSAGING_PROVIDER_GMAIL_ENABLED=true`
* `CALENDAR_PROVIDER_GOOGLE_ENABLED=true`
* `AUTH_GOOGLE_CLIENT_ID={client-id}`
@@ -149,35 +149,35 @@ When enabled, only users with `canAccessFullAdminPanel` can create additional wo
* `AUTH_GOOGLE_APIS_CALLBACK_URL=https://{your-domain}/auth/google-apis/get-access-token`
- **Modo solo de entorno:** Si establece `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, agregue estas variables a su archivo `.env` en su lugar.
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
-**Ámbitos requeridos** (configurados automáticamente):
-[Ver código fuente relevante](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes.ts#L4-L10)
+**Required scopes** (automatically configured):
+[See relevant source code](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes.ts#L4-L10)
* `https://www.googleapis.com/auth/calendar.events`
* `https://www.googleapis.com/auth/gmail.readonly`
* `https://www.googleapis.com/auth/profile.emails.read`
-### Si su aplicación está en modo de prueba
+### If your app is in test mode
-Si su aplicación está en modo de prueba, deberá agregar usuarios de prueba a su proyecto.
+If your app is in test mode, you will need to add test users to your project.
-En [Pantalla de consentimiento OAuth](https://console.cloud.google.com/apis/credentials/consent), agregue sus usuarios de prueba en la sección "Usuarios de prueba".
+Under [OAuth consent screen](https://console.cloud.google.com/apis/credentials/consent), add your test users to the "Test users" section.
-## Integración con Microsoft 365
+## Microsoft 365 Integration
- Los usuarios deben tener una [licencia de Microsoft 365](https://admin.microsoft.com/Adminportal/Home) para poder usar la API de Calendar y Messaging. No podrán sincronizar su cuenta en Twenty sin una.
+ Users must have a [Microsoft 365 Licence](https://admin.microsoft.com/Adminportal/Home) to be able to use the Calendar and Messaging API. They will not be able to sync their account on Twenty without one.
-### Cree un proyecto en Microsoft Azure
+### Create a project in Microsoft Azure
-Necesitará crear un proyecto en [Microsoft Azure](https://portal.azure.com/#view/Microsoft_AAD_IAM/AppGalleryBladeV2) y obtener las credenciales.
+You will need to create a project in [Microsoft Azure](https://portal.azure.com/#view/Microsoft_AAD_IAM/AppGalleryBladeV2) and get the credentials.
-### Habilitar APIs
+### Enable APIs
-En la Consola de Microsoft Azure habilite las siguientes APIs en "Permisos":
+On Microsoft Azure Console enable the following APIs in "Permissions":
* Microsoft Graph: Mail.ReadWrite
* Microsoft Graph: Mail.Send
@@ -188,20 +188,20 @@ En la Consola de Microsoft Azure habilite las siguientes APIs en "Permisos":
* Microsoft Graph: profile
* Microsoft Graph: offline_access
-Nota: "Mail.ReadWrite" y "Mail.Send" solo son obligatorios si desea enviar correos electrónicos usando nuestras acciones de flujo de trabajo. Puede usar "Mail.Read" en su lugar si solo desea recibir correos electrónicos.
+Note: "Mail.ReadWrite" and "Mail.Send" are only mandatory if you want to send emails using our workflow actions. You can use "Mail.Read" instead if you only want to receive emails.
-### URIs de redirección autorizadas
+### Authorized redirect URIs
-Necesita agregar las siguientes URIs de redirección a su proyecto:
+You need to add the following redirect URIs to your project:
* `https://{your-domain}/auth/microsoft/redirect` if you want to use Microsoft SSO
* `https://{your-domain}/auth/microsoft-apis/get-access-token`
-### Configurar en Twenty
+### Configure in Twenty
-1. Vaya a **Configuración → Panel de Administración → Variables de Configuración**
-2. Encuentre la sección **Microsoft Auth**
-3. Establezca estas variables:
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Microsoft Auth** section
+3. Set these variables:
* `MESSAGING_PROVIDER_MICROSOFT_ENABLED=true`
* `CALENDAR_PROVIDER_MICROSOFT_ENABLED=true`
* `AUTH_MICROSOFT_ENABLED=true`
@@ -211,35 +211,35 @@ Necesita agregar las siguientes URIs de redirección a su proyecto:
* `AUTH_MICROSOFT_APIS_CALLBACK_URL=https://{your-domain}/auth/microsoft-apis/get-access-token`
- **Modo solo de entorno:** Si establece `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, agregue estas variables a su archivo `.env` en su lugar.
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
-### Configurar ámbitos
+### Configure scopes
-[Ver código fuente relevante](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes.ts#L2-L9)
+[See relevant source code](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes.ts#L2-L9)
* 'openid'
-* 'correo Electrónico'
-* 'perfil'
+* 'email'
+* 'profile'
* 'offline_access'
* 'Mail.ReadWrite'
* 'Mail.Send'
* 'Calendars.Read'
-### Si su aplicación está en modo de prueba
+### If your app is in test mode
-Si su aplicación está en modo de prueba, deberá agregar usuarios de prueba a su proyecto.
+If your app is in test mode, you will need to add test users to your project.
-Agregue sus usuarios de prueba a la sección "Usuarios y grupos".
+Add your test users to the "Users and groups" section.
-## Trabajos en segundo plano para Calendarios y Mensajes
+## Background Jobs for Calendar & Messaging
-Después de configurar las integraciones de Gmail, Google Calendar, o Microsoft 365, necesita iniciar los trabajos en segundo plano que sincronizan los datos.
+After configuring Gmail, Google Calendar, or Microsoft 365 integrations, you need to start the background jobs that sync data.
-Registre los siguientes trabajos recurrentes en su contenedor de trabajo:
+Register the following recurring jobs in your worker container:
```bash
-# desde su contenedor de trabajo
+# from your worker container
yarn command:prod cron:messaging:messages-import
yarn command:prod cron:messaging:message-list-fetch
yarn command:prod cron:calendar:calendar-event-list-fetch
@@ -249,15 +249,15 @@ yarn command:prod cron:calendar:ongoing-stale
yarn command:prod cron:workflow:automated-cron-trigger
```
-## Configuración de Correo Electrónico
+## Email Configuration
-1. Vaya a **Configuración → Panel de Administración → Variables de Configuración**
-2. Encuentre la sección **Correo Electrónico**
-3. Configure su configuración SMTP:
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Email** section
+3. Configure your SMTP settings:
- Necesitará proporcionar una [Contraseña de Aplicación](https://support.google.com/accounts/answer/185833).
+ You will need to provision an [App Password](https://support.google.com/accounts/answer/185833).
* EMAIL_DRIVER=smtp
* EMAIL_SMTP_HOST=smtp.gmail.com
@@ -267,7 +267,7 @@ yarn command:prod cron:workflow:automated-cron-trigger
- Tenga en cuenta que si tiene la autenticación de dos factores habilitada, necesitará proporcionar una [Contraseña de Aplicación](https://support.microsoft.com/en-us/account-billing/manage-app-passwords-for-two-step-verification-d6dc8c6d-4bf7-4851-ad95-6d07799387e9).
+ Keep in mind that if you have 2FA enabled, you will need to provision an [App Password](https://support.microsoft.com/en-us/account-billing/manage-app-passwords-for-two-step-verification-d6dc8c6d-4bf7-4851-ad95-6d07799387e9).
* EMAIL_DRIVER=smtp
* EMAIL_SMTP_HOST=smtp.office365.com
@@ -277,11 +277,11 @@ yarn command:prod cron:workflow:automated-cron-trigger
- **smtp4dev** es un servidor de correo SMTP falso para desarrollo y pruebas.
+ **smtp4dev** is a fake SMTP email server for development and testing.
- * Ejecute la imagen de smtp4dev: `docker run --rm -it -p 8090:80 -p 2525:25 rnwood/smtp4dev`
- * Acceda a la interfaz de smtp4dev aquí: [http://localhost:8090](http://localhost:8090)
- * Establezca las siguientes variables:
+ * Run the smtp4dev image: `docker run --rm -it -p 8090:80 -p 2525:25 rnwood/smtp4dev`
+ * Access the smtp4dev ui here: [http://localhost:8090](http://localhost:8090)
+ * Set the following variables:
* EMAIL_DRIVER=smtp
* EMAIL_SMTP_HOST=localhost
* EMAIL_SMTP_PORT=2525
@@ -289,5 +289,5 @@ yarn command:prod cron:workflow:automated-cron-trigger
- **Modo solo de entorno:** Si establece `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, agregue estas variables a su archivo `.env` en su lugar.
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
diff --git a/packages/twenty-docs/l/es/developers/self-host/capabilities/troubleshooting.mdx b/packages/twenty-docs/l/es/developers/self-host/capabilities/troubleshooting.mdx
index 759c9b0f18..d2187aedac 100644
--- a/packages/twenty-docs/l/es/developers/self-host/capabilities/troubleshooting.mdx
+++ b/packages/twenty-docs/l/es/developers/self-host/capabilities/troubleshooting.mdx
@@ -1,33 +1,34 @@
---
-title: Solución de problemas
+title: Troubleshooting
---
-## Solución de Problemas
+## Troubleshooting
-Si encuentra algún problema al configurar el entorno para el desarrollo, al actualizar su instancia o al autoalojar, aquí hay algunas soluciones para problemas comunes.
+If you encounter any problem while setting up environment for development, upgrading your instance or self-hosting,
+here are some solutions for common problems.
### Self-hosting
-#### La primera instalación resulta en `fallo de autenticación de contraseña para el usuario "postgres"`
+#### First install results in `password authentication failed for user "postgres"`
-🚨 **IMPORTANTE: Esta solución es SOLO para instalaciones nuevas** 🚨
-Si tiene una instancia de Twenty existente con datos de producción, **NO** siga estos pasos ya que borrarán permanentemente su base de datos.
+🚨 **IMPORTANT: This solution is ONLY for fresh installations** 🚨
+If you have an existing Twenty instance with production data, **DO NOT** follow these steps as they will permanently delete your database!
-Al instalar Twenty por primera vez, es posible que desee cambiar la contraseña predeterminada de la base de datos.
-La contraseña que establezca durante la primera instalación se almacena permanentemente en el volumen de base de datos. Si más tarde intenta cambiar esta contraseña en su configuración sin eliminar el volumen anterior, obtendrá errores de autenticación porque la base de datos todavía está usando la contraseña original.
+While installing Twenty for the first time, you might want to change the default database password.
+The password you set during the first installation becomes permanently stored in the database volume. If you later try to change this password in your configuration without removing the old volume, you'll get authentication errors because the database is still using the original password.
-⚠️ ADVERTENCIA: ¡Seguir los pasos borrará PERMANENTEMENTE todos los datos de la base de datos! ⚠️
-Prosiga solo si se trata de una instalación nueva sin datos importantes.
+⚠️ WARNING: Following steps will PERMANENTLY DELETE all database data! ⚠️
+Only proceed if this is a fresh installation with no important data.
-Para actualizar el `PG_DATABASE_PASSWORD` necesita:
+In order to update the `PG_DATABASE_PASSWORD` you need to:
```sh
-# Actualizar el PG_DATABASE_PASSWORD en .env
+# Update the PG_DATABASE_PASSWORD in .env
docker compose down --volumes
docker compose up -d
```
-#### Rupturas de línea de CR encontradas [Windows]
+#### CR line breaks found [Windows]
This is due to the line break characters of Windows and the git configuration. Try running:
@@ -35,25 +36,25 @@ This is due to the line break characters of Windows and the git configuration. T
git config --global core.autocrlf false
```
-Luego elimine el repositorio y clónelo de nuevo.
+Then delete the repository and clone it again.
-#### Esquema de metadatos faltante
+#### Missing metadata schema
-Durante la instalación de Twenty, debe aprovisionar su base de datos postgres con los esquemas, extensiones y usuarios correctos.
-Si ha ejecutado con éxito este aprovisionamiento, debería tener esquemas `default` y `metadata` en su base de datos.
-Si no los tiene, asegúrese de no tener más de una instancia de postgres ejecutándose en su computadora.
+During Twenty installation, you need to provision your postgres database with the right schemas, extensions, and users.
+If you're successful in running this provisioning, you should have `default` and `metadata` schemas in your database.
+If you don't, make sure you don't have more than one postgres instance running on your computer.
-#### No se puede encontrar el módulo 'twenty-emails' o sus declaraciones de tipo correspondientes.
+#### Cannot find module 'twenty-emails' or its corresponding type declarations.
-Tienes que construir el paquete `twenty-emails` antes de ejecutar la inicialización de la base de datos con `npx nx run twenty-emails:build`
+You have to build the package `twenty-emails` before running the initialization of the database with `npx nx run twenty-emails:build`
#### Missing twenty-x package
-Asegúrese de ejecutar yarn en el directorio raíz y luego ejecute `npx nx server:dev twenty-server`. Si esto aún no funciona, intente construir el paquete faltante manualmente.
+Make sure to run yarn in the root directory and then run `npx nx server:dev twenty-server`. If this still doesn't work try building the missing package manually.
-#### Lint on Save no funciona
+#### Lint on Save not working
-This should work out of the box with the eslint extension installed. Si esto no funciona, intente agregar esto a su configuración de vscode (en el ámbito del contenedor de desarrollo):
+This should work out of the box with the eslint extension installed. If this doesn't work try adding this to your vscode setting (on the dev container scope):
```
"editor.codeActionsOnSave": {
@@ -65,83 +66,83 @@ This should work out of the box with the eslint extension installed. Si esto no
#### While running `npx nx start` or `npx nx start twenty-front`, Out of memory error is thrown
-En `packages/twenty-front/.env` descomente `VITE_DISABLE_TYPESCRIPT_CHECKER=true` y `VITE_DISABLE_ESLINT_CHECKER=true` para deshabilitar las comprobaciones en segundo plano y así reducir la cantidad de RAM necesaria.
+In `packages/twenty-front/.env` uncomment `VITE_DISABLE_TYPESCRIPT_CHECKER=true` to disable background checks thus reducing amount of needed RAM.
**If it does not work:**
-Run only the services you need, instead of `npx nx start`. Por ejemplo, si trabaja en el servidor, ejecute solo `npx nx worker twenty-server`
+Run only the services you need, instead of `npx nx start`. For instance, if you work on the server, run only `npx nx worker twenty-server`
**If it does not work:**
If you tried to run only `npx nx run twenty-server:start` on WSL and it's failing with the below memory error:
-`ERROR FATAL: Las marcas compactas ineficaces cercanas al límite del montón Falló la asignación - JavaScript heap out of memory`
+`FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory`
-La solución es ejecutar el siguiente comando en el terminal o agregarlo en el perfil .bashrc para configurarlo automáticamente:
+Workaround is to execute below command in terminal or add it in .bashrc profile to get setup automatically:
`export NODE_OPTIONS="--max-old-space-size=8192"`
-La bandera --max-old-space-size=8192 establece un límite superior de 8GB para el montón de Node.js; su uso escala con la demanda de la aplicación.
-Referencia: https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048
+The --max-old-space-size=8192 flag sets an upper limit of 8GB for the Node.js heap; usage scales with application demand.
+Reference: https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048
**If it does not work:**
-Investigate which processes are taking you most of your machine RAM. En Twenty, notamos que algunas extensiones de VScode estaban ocupando mucha RAM, por lo que las desactivamos temporalmente.
+Investigate which processes are taking you most of your machine RAM. At Twenty, we noticed that some VScode extensions were taking a lot of RAM so we temporarily disable them.
**If it does not work:**
Restart your machine helps to clean up ghost processes.
-#### Mientras ejecuta `npx nx start` hay [0] y [1] extraños en los registros
+#### While running `npx nx start` there are weird [0] and [1] in logs
-Es esperado, ya que el comando `npx nx start` está ejecutando más comandos detrás de escena.
+That's expected as command `npx nx start` is running more commands under the hood
-#### No se envían correos electrónicos
+#### No emails are sent
-La mayoría de las veces, se debe a que el `worker` no se está ejecutando en segundo plano. Intente ejecutar
+Most of the time, it's because the `worker` is not running in the background. Try to run
```
npx nx worker twenty-server
```
-#### No se puede conectar mi cuenta de Microsoft 365
+#### Cannot connect my Microsoft 365 account
-La mayoría de las veces, se debe a que su administrador no ha habilitado la licencia de Microsoft 365 para su cuenta. Verifique [https://admin.microsoft.com/](https://admin.microsoft.com/Adminportal/Home).
+Most of the time, it's because your admin has not enabled the Microsoft 365 Licence for your account. Check [https://admin.microsoft.com/](https://admin.microsoft.com/Adminportal/Home).
-Si tiene un código de error `AADSTS50020`, probablemente significa que está usando una cuenta de Microsoft personal. Esto aún no es compatible. Más información [aquí](https://learn.microsoft.com/fr-fr/troubleshoot/entra/entra-id/app-integration/error-code-aadsts50020-user-account-identity-provider-does-not-exist)
+If you have an error code `AADSTS50020`, it probably means that you are using a personal Microsoft account. This is not supported yet. More info [here](https://learn.microsoft.com/fr-fr/troubleshoot/entra/entra-id/app-integration/error-code-aadsts50020-user-account-identity-provider-does-not-exist)
-#### Mientras ejecuta `yarn` aparecen advertencias en la consola
+#### While running `yarn` warnings appear in console
-Las advertencias informan sobre la carga de dependencias adicionales que no están explicitadas en `package.json`, así que mientras no aparezca un error crítico, todo debería funcionar como se espera.
+Warnings are informing about pulling additional dependencies which aren't explicitly stated in `package.json`, so as long as no breaking error appears, everything should work as expected.
-#### Cuando el usuario accede a la página de inicio de sesión, aparece un error sobre un usuario no autorizado que intenta acceder al espacio de trabajo en los registros
+#### When user accesses login page, error about unauthorized user trying to access workspace appears in logs
-Es esperado ya que el usuario no está autorizado cuando cierra sesión porque su identidad no está verificada.
+That's expected as user is unauthorized when logged out since its identity is not verified.
-#### ¿Cómo comprobar si su worker está funcionando?
+#### How to check if your worker is running?
-* Vaya a [webhook-test.com](https://webhook-test.com/) y copie **Su URL de Webhook Única**.
+* Go to [webhook-test.com](https://webhook-test.com/) and copy **Your Unique Webhook URL**.
-
+
-* Abra la aplicación Twenty, navegue a `/settings` y active el interruptor **Avanzado** en la parte inferior izquierda de la pantalla.
-* Cree un nuevo webhook.
-* Pegue **Su URL de Webhook Única** en el campo **Url de EndPoint** en Twenty. Establezca los **Filtros** en `Companies` y `Created`.
+* Open your Twenty app, navigate to `/settings`, and enable the **Advanced** toggle at the bottom left of the screen.
+* Create a new webhook.
+* Paste **Your Unique Webhook URL** in the **Endpoint Url** field in Twenty. Set the **Filters** to `Companies` and `Created`.
-
+
-* Vaya a `/objects/companies` y cree un nuevo registro de empresa.
-* Regrese a [webhook-test.com](https://webhook-test.com/) y verifique si se ha recibido una nueva **solicitud POST**.
+* Go to `/objects/companies` and create a new company record.
+* Return to [webhook-test.com](https://webhook-test.com/) and check if a new **POST request** has been received.
-
+
-* Si se recibe una **solicitud POST**, su worker está funcionando con éxito. De lo contrario, debe solucionar problemas de su worker.
+* If a **POST request** is received, your worker is running successfully. Otherwise, you need to troubleshoot your worker.
-#### El front-end no comienza y devuelve el error TS5042: La opción 'project' no se puede mezclar con archivos fuente en una línea de comando
+#### Front-end fails to start and returns error TS5042: Option 'project' cannot be mixed with source files on a command line
-Comente el plugin checker en `packages/twenty-ui/vite-config.ts` como en el ejemplo a continuación
+Comment out checker plugin in `packages/twenty-ui/vite-config.ts` like in example below
```
plugins: [
@@ -165,62 +166,62 @@ plugins: [
],
```
-#### Panel de administración no accesible
+#### Admin panel not accessible
-Ejecute `UPDATE core."user" SET "canAccessFullAdminPanel" = TRUE WHERE email = 'you@yourdomain.com';` en el contenedor de la base de datos para obtener acceso al panel de administración.
+Run `UPDATE core."user" SET "canAccessFullAdminPanel" = TRUE WHERE email = 'you@yourdomain.com';` in database container to get access to admin panel.
### 1-click Docker compose
-#### No se puede iniciar sesión
+#### Unable to Log In
-Si no puedes iniciar sesión después de la configuración:
+If you can't log in after setup:
-1. Ejecución de los siguientes comandos:
+1. Run the following commands:
```bash
docker exec -it twenty-server-1 yarn
docker exec -it twenty-server-1 npx nx database:reset --configuration=no-seed
```
-2. Reinicie los contenedores de Docker:
+2. Restart the Docker containers:
```bash
docker compose down
docker compose up -d
```
-Tenga en cuenta que el comando database:reset borrará toda su base de datos y la recreará desde cero.
+Note the database:reset command will completely erase your database and recreate it from scratch.
-#### Problemas de conexión detrás de un Proxy Reverso
+#### Connection Issues Behind a Reverse Proxy
-Si está ejecutando Twenty detrás de un proxy inverso y experimenta problemas de conexión:
+If you're running Twenty behind a reverse proxy and experiencing connection issues:
-1. **Verifique SERVER_URL:**
+1. **Verify SERVER_URL:**
- Asegúrese de que `SERVER_URL` en su archivo `.env` coincida con su URL de acceso externa, incluyendo `https` si SSL está habilitado.
+ Ensure `SERVER_URL` in your `.env` file matches your external access URL, including `https` if SSL is enabled.
-2. **Verifique la configuración del Proxy Reverso:**
+2. **Check Reverse Proxy Settings:**
- * Confirme que su proxy reverso está reenviando correctamente las solicitudes al servidor de Twenty.
- * Asegúrese de que los encabezados como `X-Forwarded-For` y `X-Forwarded-Proto` estén configurados correctamente.
+ * Confirm that your reverse proxy is correctly forwarding requests to the Twenty server.
+ * Ensure headers like `X-Forwarded-For` and `X-Forwarded-Proto` are properly set.
-3. **Reinicie los Servicios:**
+3. **Restart Services:**
- Después de hacer cambios, reinicie tanto el proxy inverso como los contenedores de Twenty.
+ After making changes, restart both the reverse proxy and Twenty containers.
-#### Error al cargar una imagen - permiso denegado
+#### Error when uploading an image - permission denied
-Cambiar la propiedad de la carpeta de datos en el host de raíz a otro usuario y grupo resuelve este problema.
+Switching the data folder ownership on the host from root to another user and group resolves this problem.
-## Obtención de Ayuda
+## Getting Help
-Si enfrenta problemas no cubiertos en esta guía:
+If you encounter issues not covered in this guide:
-* Verifique los Registros:
+* Check Logs:
- Vea los registros del contenedor por mensajes de error:
+ View container logs for error messages:
```bash
docker compose logs
```
-* Soporte Comunitario:
+* Community Support:
- Póngase en contacto con la [comunidad de Twenty](https://github.com/twentyhq/twenty/issues) o [los canales de soporte](https://discord.gg/cx5n4Jzs57) para obtener asistencia.
+ Reach out to the [Twenty community](https://github.com/twentyhq/twenty/issues) or [support channels](https://discord.gg/cx5n4Jzs57) for assistance.
diff --git a/packages/twenty-docs/l/es/developers/self-host/capabilities/upgrade-guide.mdx b/packages/twenty-docs/l/es/developers/self-host/capabilities/upgrade-guide.mdx
index df79483163..03a53f5685 100644
--- a/packages/twenty-docs/l/es/developers/self-host/capabilities/upgrade-guide.mdx
+++ b/packages/twenty-docs/l/es/developers/self-host/capabilities/upgrade-guide.mdx
@@ -1,40 +1,40 @@
---
-title: Guía de actualización
+title: Upgrade guide
---
-## Guías generales
+## General guidelines
**Always make sure to back up your database before starting the upgrade process** by running `docker exec -it {db_container_name_or_id} pg_dumpall -U {postgres_user} > databases_backup.sql`.
To restore backup, run `cat databases_backup.sql | docker exec -i {db_container_name_or_id} psql -U {postgres_user}`.
-Si usó Docker Compose, siga estos pasos:
+If you used Docker Compose, follow these steps:
-1. En una terminal, en el host donde Twenty está funcionando, apague Twenty: `docker compose down`
+1. In a terminal, on the host where Twenty is running, turn off Twenty: `docker compose down`
-2. Actualice la versión cambiando el valor de `TAG` en el archivo .env cerca de su docker-compose. ( Recomendamos consumir la versión `major.minor` como `v0.53` )
+2. Upgrade the version by changing the `TAG` value in the .env file near your docker-compose. ( We recommend consuming `major.minor` version such as `v0.53` )
-3. Vuelva a conectar Twenty con `docker compose up -d`
+3. Bring Twenty back online with `docker compose up -d`
-Si desea actualizar su instancia por algunas versiones, por ejemplo de v0.33.0 a v0.35.0, debe actualizar su instancia secuencialmente, en este ejemplo de v0.33.0 a v0.34.0, luego de v0.34.0 a v0.35.0.
+If you want to upgrade your instance by few versions, e.g. from v0.33.0 to v0.35.0, you have to upgrade your instance sequentially, in this example from v0.33.0 to v0.34.0, then from v0.34.0 to v0.35.0.
-**Asegúrese de que después de cada versión actualizada tenga una copia de respaldo no corrupta.**
+**Make sure that after each upgraded version you have non-corrupted backup.**
-## Pasos de actualización específicos por versión
+## Version-specific upgrade steps
## v1.0
-¡Hola Twenty v1.0! 🎉
+Hello Twenty v1.0! 🎉
## v0.60
-### Mejoras de rendimiento
+### Performance Enhancements
-Todas las interacciones con la API de metadatos han sido optimizadas para un mejor rendimiento, particularmente para la manipulación de metadatos de objetos y operaciones de creación de espacios de trabajo.
+All interactions with the metadata API have been optimized for better performance, particularly for object metadata manipulation and workspace creation operations.
-Hemos reestructurado nuestra estrategia de almacenamiento en caché para priorizar los aciertos de caché sobre las consultas de base de datos cuando sea posible, mejorando significativamente el rendimiento de las operaciones de la API de metadatos.
+We've refactored our caching strategy to prioritize cache hits over database queries when possible, significantly improving the performance of metadata API operations.
-Si encuentra problemas de ejecución después de actualizar, es posible que deba vaciar su caché para asegurar que esté sincronizado con los cambios más recientes. Ejecute este comando en su contenedor del servidor de twenty:
+If you encounter any runtime issues after upgrading, you may need to flush your cache to ensure it's synchronized with the latest changes. Run this command in your twenty-server container:
```bash
yarn command:prod cache:flush
@@ -42,113 +42,113 @@ yarn command:prod cache:flush
### v0.55
-Actualice su instancia de Twenty para usar la imagen v0.55
+Upgrade your Twenty instance to use v0.55 image
-Ya no necesita ejecutar ningún comando, la nueva imagen se encargará automáticamente de ejecutar todas las migraciones necesarias.
+You don't need to run any command anymore, the new image will automatically care about running all required migrations.
-### Error: `El usuario no tiene permiso`
+### `User does not have permission` error
-Si encuentra errores de autorización en la mayoría de solicitudes después de actualizar, es posible que deba vaciar su caché para recalcular los permisos más recientes.
+If you encounter authorization errors on most requests after upgrading, you may need to flush your cache to recompute the latest permissions.
-En su contenedor `twenty-server`, ejecute:
+In your `twenty-server` container, run:
```bash
yarn command:prod cache:flush
```
-Este problema es específico de esta versión de Twenty y no debería ser necesario para futuras actualizaciones.
+This issue is specific to this Twenty version and should not be required for future upgrades.
### v0.54
-Desde la versión `0.53`, no se necesitan acciones manuales.
+Since version `0.53`, no manual actions needed.
-#### Desaparición del esquema de metadatos
+#### Metadata schema deprecation
-Hemos fusionado el esquema `metadata` en el esquema `core` para simplificar la recuperación de datos desde `TypeORM`.
-Hemos fusionado el paso del comando `migrate` dentro del comando `upgrade`. No recomendamos ejecutar `migrate` manualmente dentro de ninguno de sus contenedores de servidor/trabajador.
+We've merged the `metadata` schema into the `core` one to simplify data retrieval from `TypeORM`.
+We have merged the `migrate` command step within the `upgrade` command. We do not recommend running `migrate` manually within any of your server/worker containers.
-### Desde v0.53
+### Since v0.53
-A partir de `0.53`, la actualización se realiza de forma programática dentro del `DockerFile`, esto significa que de ahora en adelante, no debería necesitar ejecutar ningún comando manualmente.
+Starting from `0.53`, upgrade is programmatically done within the `DockerFile`, this means from now on, you shouldn't have to run any command manually anymore.
-Asegúrese de seguir actualizando su instancia secuencialmente, sin omitir ninguna versión principal (por ejemplo, de `0.43.3` a `0.44.0` está permitido, pero de `0.43.1` a `0.45.0` no lo está), de lo contrario, podría provocar un desincronización de la versión del espacio de trabajo que podría resultar en errores de ejecución y funciones faltantes.
+Make sure to keep upgrading your instance sequentially, without skipping any major version (e.g. `0.43.3` to `0.44.0` is allowed, but `0.43.1` to `0.45.0` isn't), else could lead to workspace version desynchronization that could result in runtime error and missing functionality.
-Para verificar si un espacio de trabajo se ha migrado correctamente, puede revisar su versión en la base de datos en la tabla `core.workspace`.
+To check if a workspace has been correctly migrated you can review its version in database in `core.workspace` table.
-Siempre debería estar dentro del rango de la versión `major.minor` actual de su instancia de Twenty; puede ver la versión de su instancia en el panel de administración (en `/settings/admin-panel`, accesible si su usuario tiene la propiedad `canAccessFullAdminPanel` establecida en verdadero en la base de datos) o ejecutando `echo $APP_VERSION` en su contenedor `twenty-server`.
+It should always be in the range of your current Twenty's instance `major.minor` version, you can view your instance version in the admin panel (at `/settings/admin-panel`, accessible if your user has `canAccessFullAdminPanel` property set to true in the database) or by running `echo $APP_VERSION` in your `twenty-server` container.
-Para corregir una versión de espacio de trabajo desincronizada, tendrá que actualizar desde la correspondiente versión de twenty siguiendo la guía de actualización relacionada secuencialmente, y así sucesivamente hasta alcanzar la versión deseada.
+To fix a desynchronized workspace version, you will have to upgrade from the corresponding twenty's version following related upgrade guide sequentially and so on until it reaches desired version.
-#### Eliminación de `auditLog`
+#### `auditLog` removal
-Hemos eliminado el objeto estándar auditLog, lo que significa que el tamaño de su copia de seguridad podría reducirse significativamente después de esta migración.
+We've removed the auditLog standard object, which means your backup size might be significantly reduced after this migration.
-### v0.51 a v0.52
+### v0.51 to v0.52
-Actualice su instancia de Twenty para usar la imagen v0.52
+Upgrade your Twenty instance to use v0.52 image
```
yarn database:migrate:prod
yarn command:prod upgrade
```
-#### Tengo un espacio de trabajo bloqueado en la versión entre `0.52.0` y `0.52.6`
+#### I have a workspace blocked in version between `0.52.0` and `0.52.6`
-Desafortunadamente, `0.52.0` y `0.52.6` se han eliminado completamente de dockerHub.
-Tendrá que actualizar manualmente la versión de su espacio de trabajo a `0.51.0` en la base de datos y actualizar usando la versión twenty `0.52.11` siguiendo su guía de actualización justo arriba.
+Unfortunately `0.52.0` and `0.52.6` have been completely removed from dockerHub.
+You will have to manually update your workspace version to `0.51.0` in database and upgrade using twenty version `0.52.11` following its just above upgrade guide.
-### v0.50 a v0.51
+### v0.50 to v0.51
-Actualice su instancia de Twenty para usar la imagen v0.51
+Upgrade your Twenty instance to use v0.51 image
```
yarn database:migrate:prod
yarn command:prod upgrade
```
-### v0.44.0 a v0.50.0
+### v0.44.0 to v0.50.0
-Actualice su instancia de Twenty para usar la imagen v0.50.0
+Upgrade your Twenty instance to use v0.50.0 image
```
yarn database:migrate:prod
yarn command:prod upgrade
```
-#### Mutación del docker-compose.yml
+#### Docker-compose.yml mutation
-Esta versión incluye una mutación del `docker-compose.yml` para dar acceso al servicio `worker` al volumen `server-local-data`.
-Actualice su `docker-compose.yml` local con el [docker-compose.yml de v0.50.0](https://github.com/twentyhq/twenty/blob/v0.50.0/packages/twenty-docker/docker-compose.yml)
+This version includes a `docker-compose.yml` mutation to give `worker` service access to the `server-local-data` volume.
+Please update your local `docker-compose.yml` with [v0.50.0 docker-compose.yml](https://github.com/twentyhq/twenty/blob/v0.50.0/packages/twenty-docker/docker-compose.yml)
-### v0.43.0 a v0.44.0
+### v0.43.0 to v0.44.0
-Actualice su instancia de Twenty para usar la imagen v0.44.0
+Upgrade your Twenty instance to use v0.44.0 image
```
yarn database:migrate:prod
yarn command:prod upgrade
```
-### v0.42.0 a v0.43.0
+### v0.42.0 to v0.43.0
-Actualice su instancia de Twenty para usar la imagen v0.43.0
+Upgrade your Twenty instance to use v0.43.0 image
```
yarn database:migrate:prod
yarn command:prod upgrade
```
-En esta versión, también hemos cambiado a la imagen de postgres:16 en docker-compose.yml.
+In this version, we have also switched to postgres:16 image in docker-compose.yml.
-#### (Opción 1) Migración de base de datos
+#### (Option 1) Database migration
-Mantener la imagen postgres-spilo existente está bien, pero tendrá que congelar la versión en su docker-compose.yml a 0.43.0.
+Keeping the existing postgres-spilo image is fine, but you will have to freeze the version in your docker-compose.yml to be 0.43.0.
-#### (Opción 2) Migración de base de datos
+#### (Option 2) Database migration
-Si desea migrar su base de datos a la nueva imagen de postgres:16, siga estos pasos:
+If you want to migrate your database to the new postgres:16 image, please follow these steps:
-1. Descargue su base de datos del contenedor antiguo de postgres-spilo
+1. Dump your database from the old postgres-spilo container
```
docker exec -it twenty-db-1 sh
@@ -157,11 +157,11 @@ exit
docker cp twenty-db-1:/home/postgres/databases_backup.sql .
```
-Asegúrese de que su archivo de respaldo no esté vacío.
+Make sure your dump file is not empty.
-2. Actualice su docker-compose.yml para usar la imagen de postgres:16 como en el archivo [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml).
+2. Upgrade your docker-compose.yml to use postgres:16 image as in the [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) file.
-3. Restaure la base de datos al nuevo contenedor postgres:16
+3. Restore the database to the new postgres:16 container
```
docker cp databases_backup.sql twenty-db-1:/databases_backup.sql
@@ -170,86 +170,86 @@ psql -U {YOUR_POSTGRES_USER} -d {YOUR_POSTGRES_DB} -f databases_backup.sql
exit
```
-### v0.41.0 a v0.42.0
+### v0.41.0 to v0.42.0
-Actualice su instancia de Twenty para usar la imagen v0.42.0
+Upgrade your Twenty instance to use v0.42.0 image
```
yarn database:migrate:prod
yarn command:prod upgrade-0.42
```
-**Variables del entorno**
+**Environment Variables**
-* Removidos: `FRONT_PORT`, `FRONT_PROTOCOL`, `FRONT_DOMAIN`, `PORT`
-* Agregados: `FRONTEND_URL`, `NODE_PORT`, `MAX_NUMBER_OF_WORKSPACES_DELETED_PER_EXECUTION`, `MESSAGING_PROVIDER_MICROSOFT_ENABLED`, `CALENDAR_PROVIDER_MICROSOFT_ENABLED`, `IS_MICROSOFT_SYNC_ENABLED`
+* Removed: `FRONT_PORT`, `FRONT_PROTOCOL`, `FRONT_DOMAIN`, `PORT`
+* Added: `FRONTEND_URL`, `NODE_PORT`, `MAX_NUMBER_OF_WORKSPACES_DELETED_PER_EXECUTION`, `MESSAGING_PROVIDER_MICROSOFT_ENABLED`, `CALENDAR_PROVIDER_MICROSOFT_ENABLED`, `IS_MICROSOFT_SYNC_ENABLED`
-### v0.40.0 a v0.41.0
+### v0.40.0 to v0.41.0
-Actualice su instancia de Twenty para usar la imagen v0.41.0
+Upgrade your Twenty instance to use v0.41.0 image
```
yarn database:migrate:prod
yarn command:prod upgrade-0.41
```
-**Variables del entorno**
+**Environment Variables**
-* Removido: `AUTH_MICROSOFT_TENANT_ID`
+* Removed: `AUTH_MICROSOFT_TENANT_ID`
-### v0.35.0 a v0.40.0
+### v0.35.0 to v0.40.0
-Actualice su instancia de Twenty para usar la imagen v0.40.0
+Upgrade your Twenty instance to use v0.40.0 image
```
yarn database:migrate:prod
yarn command:prod upgrade-0.40
```
-**Variables del entorno**
+**Environment Variables**
-* Agregados: `IS_EMAIL_VERIFICATION_REQUIRED`, `EMAIL_VERIFICATION_TOKEN_EXPIRES_IN`, `WORKFLOW_EXEC_THROTTLE_LIMIT`, `WORKFLOW_EXEC_THROTTLE_TTL`
+* Added: `IS_EMAIL_VERIFICATION_REQUIRED`, `EMAIL_VERIFICATION_TOKEN_EXPIRES_IN`, `WORKFLOW_EXEC_THROTTLE_LIMIT`, `WORKFLOW_EXEC_THROTTLE_TTL`
-### v0.34.0 a v0.35.0
+### v0.34.0 to v0.35.0
-Actualice su instancia de Twenty para usar la imagen v0.35.0
+Upgrade your Twenty instance to use v0.35.0 image
```
yarn database:migrate:prod
yarn command:prod upgrade-0.35
```
-El comando `yarn database:migrate:prod` aplicará las migraciones a la estructura de la base de datos (esquemas core y metadata)
-El `yarn command:prod upgrade-0.35` se encarga de la migración de datos de todos los espacios de trabajo.
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.35` takes care of the data migration of all workspaces.
-**Variables del entorno**
+**Environment Variables**
-* Reemplazamos `ENABLE_DB_MIGRATIONS` por `DISABLE_DB_MIGRATIONS` (valor predeterminado ahora es `false`, probablemente no tenga que establecer nada)
+* We replaced `ENABLE_DB_MIGRATIONS` with `DISABLE_DB_MIGRATIONS` (default value is now `false`, you probably don't have to set anything)
-### v0.33.0 a v0.34.0
+### v0.33.0 to v0.34.0
-Actualice su instancia de Twenty para usar la imagen v0.34.0
+Upgrade your Twenty instance to use v0.34.0 image
```
yarn database:migrate:prod
yarn command:prod upgrade-0.34
```
-El comando `yarn database:migrate:prod` aplicará las migraciones a la estructura de la base de datos (esquemas core y metadata)
-El `yarn command:prod upgrade-0.34` se encarga de la migración de datos de todos los espacios de trabajo.
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.34` takes care of the data migration of all workspaces.
-**Variables del entorno**
+**Environment Variables**
-* Removido: `FRONT_BASE_URL`
-* Agregados: `FRONT_DOMAIN`, `FRONT_PROTOCOL`, `FRONT_PORT`
+* Removed: `FRONT_BASE_URL`
+* Added: `FRONT_DOMAIN`, `FRONT_PROTOCOL`, `FRONT_PORT`
-Hemos actualizado la forma en que manejamos la URL del frontend.
-Ahora puede configurar la URL del frontend usando las variables `FRONT_DOMAIN`, `FRONT_PROTOCOL` y `FRONT_PORT`.
-Si FRONT_DOMAIN no está configurado, la URL del frontend volverá a `SERVER_URL`.
+We have updated the way we handle the frontend URL.
+You can now set the frontend URL using the `FRONT_DOMAIN`, `FRONT_PROTOCOL` and `FRONT_PORT` variables.
+If FRONT_DOMAIN is not set, the frontend URL will fall back to `SERVER_URL`.
-### v0.32.0 a v0.33.0
+### v0.32.0 to v0.33.0
-Actualice su instancia de Twenty para usar la imagen v0.33.0
+Upgrade your Twenty instance to use v0.33.0 image
```
yarn command:prod cache:flush
@@ -257,68 +257,68 @@ yarn database:migrate:prod
yarn command:prod upgrade-0.33
```
-El comando `yarn command:prod cache:flush` eliminará la caché de Redis.
-El comando `yarn database:migrate:prod` aplicará las migraciones a la estructura de la base de datos (esquemas core y metadata)
-El `yarn command:prod upgrade-0.33` se encarga de la migración de datos de todos los espacios de trabajo.
+The `yarn command:prod cache:flush` command will flush the Redis cache.
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.33` takes care of the data migration of all workspaces.
-A partir de esta versión, la imagen twenty-postgres para DB quedó obsoleta y ahora se usa twenty-postgres-spilo.
-Si desea seguir usando la imagen twenty-postgres, simplemente reemplace `twentycrm/twenty-postgres:${TAG}` con `twentycrm/twenty-postgres` en docker-compose.yml.
+Starting from this version, twenty-postgres image for DB became deprecated and twenty-postgres-spilo is used instead.
+If you want to keep using twenty-postgres image, simply replace `twentycrm/twenty-postgres:${TAG}` with `twentycrm/twenty-postgres` in docker-compose.yml.
-### v0.31.0 a v0.32.0
+### v0.31.0 to v0.32.0
-Actualice su instancia de Twenty para usar la imagen v0.32.0
+Upgrade your Twenty instance to use v0.32.0 image
-**Migración de esquemas y datos**
+**Schema and data migration**
```
yarn database:migrate:prod
yarn command:prod upgrade-0.32
```
-El comando `yarn database:migrate:prod` aplicará las migraciones a la estructura de la base de datos (esquemas core y metadata)
-El `yarn command:prod upgrade-0.32` se encarga de la migración de datos de todos los espacios de trabajo.
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.32` takes care of the data migration of all workspaces.
-**Variables del entorno**
+**Environment Variables**
-Hemos actualizado la forma en que manejamos la conexión Redis.
+We have updated the way we handle the Redis connection.
-* Removidos: `REDIS_HOST`, `REDIS_PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD`
-* Agregado: `REDIS_URL`
+* Removed: `REDIS_HOST`, `REDIS_PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD`
+* Added: `REDIS_URL`
-Actualice su archivo `.env` para usar la nueva variable `REDIS_URL` en lugar de los parámetros de conexión individuales de Redis.
+Update your `.env` file to use the new `REDIS_URL` variable instead of the individual Redis connection parameters.
-También hemos simplificado la forma en que manejamos los tokens JWT.
+We have also simplified the way we handle the JWT tokens.
-* Removidos: `ACCESS_TOKEN_SECRET`, `LOGIN_TOKEN_SECRET`, `REFRESH_TOKEN_SECRET`, `FILE_TOKEN_SECRET`
-* Agregado: `APP_SECRET`
+* Removed: `ACCESS_TOKEN_SECRET`, `LOGIN_TOKEN_SECRET`, `REFRESH_TOKEN_SECRET`, `FILE_TOKEN_SECRET`
+* Added: `APP_SECRET`
-Actualice su archivo `.env` para usar la nueva variable `APP_SECRET` en lugar de los secretos de tokens individuales (puede usar el mismo secreto que antes o generar una nueva cadena aleatoria)
+Update your `.env` file to use the new `APP_SECRET` variable instead of the individual tokens secrets (you can use the same secret as before or generate a new random string)
-**Cuenta conectada**
+**Connected Account**
-Si está utilizando cuentas conectadas para sincronizar sus correos electrónicos y calendarios de Google, deberá activar la [API de People](https://developers.google.com/people) en su consola de administración de Google.
+If you are using connected account to synchronize your Google emails and calendars, you will need to activate the [People API](https://developers.google.com/people) on your Google Admin console.
-### v0.30.0 a v0.31.0
+### v0.30.0 to v0.31.0
-Actualice su instancia de Twenty para usar la imagen v0.31.0
+Upgrade your Twenty instance to use v0.31.0 image
-**Migración de esquemas y datos:**
+**Schema and data migration**:
```
yarn database:migrate:prod
yarn command:prod upgrade-0.31
```
-El comando `yarn database:migrate:prod` aplicará las migraciones a la estructura de la base de datos (esquemas core y metadata)
-El `yarn command:prod upgrade-0.31` se encarga de la migración de datos de todos los espacios de trabajo.
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.31` takes care of the data migration of all workspaces.
-### v0.24.0 a v0.30.0
+### v0.24.0 to v0.30.0
-Actualice su instancia de Twenty para usar la imagen v0.30.0
+Upgrade your Twenty instance to use v0.30.0 image
**Breaking change**:
-To enhance performances, Twenty now requires redis cache to be configured. Hemos actualizado nuestro [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) para reflejar esto.
-Asegúrese de actualizar su configuración y sus variables de entorno en consecuencia:
+To enhance performances, Twenty now requires redis cache to be configured. We have updated our [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) to reflect this.
+Make sure to update your configuration and to update your environment variables accordingly:
```
REDIS_HOST={your-redis-host}
@@ -326,49 +326,49 @@ REDIS_PORT={your-redis-port}
CACHE_STORAGE_TYPE=redis
```
-**Migración de esquemas y datos:**
+**Schema and data migration**:
```
yarn database:migrate:prod
yarn command:prod upgrade-0.30
```
-El comando `yarn database:migrate:prod` aplicará las migraciones a la estructura de la base de datos (esquemas core y metadata)
-El `yarn command:prod upgrade-0.30` se encarga de la migración de datos de todos los espacios de trabajo.
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.30` takes care of the data migration of all workspaces.
-### v0.23.0 a v0.24.0
+### v0.23.0 to v0.24.0
-Actualice su instancia de Twenty para usar la imagen v0.24.0
+Upgrade your Twenty instance to use v0.24.0 image
-Ejecución de los siguientes comandos:
+Run the following commands:
```
yarn database:migrate:prod
yarn command:prod upgrade-0.24
```
-El comando `yarn database:migrate:prod` aplicará las migraciones a la estructura de la base de datos (esquemas core y metadata)
-El `yarn command:prod upgrade-0.24` se encarga de la migración de datos de todos los espacios de trabajo.
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.24` takes care of the data migration of all workspaces.
-### v0.22.0 a v0.23.0
+### v0.22.0 to v0.23.0
-Actualice su instancia de Twenty para usar la imagen v0.23.0
+Upgrade your Twenty instance to use v0.23.0 image
-Ejecución de los siguientes comandos:
+Run the following commands:
```
yarn database:migrate:prod
yarn command:prod upgrade-0.23
```
-El comando `yarn database:migrate:prod` aplicará las migraciones a la base de datos.
-El `yarn command:prod upgrade-0.23` se encarga de la migración de datos, incluyendo la transferencia de actividades a tareas/notas.
+The `yarn database:migrate:prod` command will apply the migrations to the Database.
+The `yarn command:prod upgrade-0.23` takes care of the data migration, including transferring activities to tasks/notes.
-### v0.21.0 a v0.22.0
+### v0.21.0 to v0.22.0
-Actualice su instancia de Twenty para usar la imagen v0.22.0
+Upgrade your Twenty instance to use v0.22.0 image
-Ejecución de los siguientes comandos:
+Run the following commands:
```
yarn database:migrate:prod
@@ -376,6 +376,6 @@ yarn command:prod workspace:sync-metadata -f
yarn command:prod upgrade-0.22
```
-El comando `yarn database:migrate:prod` aplicará las migraciones a la base de datos.
-El comando `yarn command:prod workspace:sync-metadata -f` sincronizará la definición de objetos estándar a las tablas de metadatos y aplicará las migraciones requeridas a los espacios de trabajo existentes.
-El comando `yarn command:prod upgrade-0.22` aplicará transformaciones de datos específicas para adaptarse a las nuevas opciones predeterminadas de instrumentación de solicitud de objetos.
+The `yarn database:migrate:prod` command will apply the migrations to the Database.
+The `yarn command:prod workspace:sync-metadata -f` command will sync the definition of standard objects to the metadata tables and apply to required migrations to existing workspaces.
+The `yarn command:prod upgrade-0.22` command will apply specific data transformations to adapt to the new object defaultRequestInstrumentationOptions.
diff --git a/packages/twenty-docs/l/es/developers/self-host/self-host.mdx b/packages/twenty-docs/l/es/developers/self-host/self-host.mdx
index 1c754825d1..86d3072999 100644
--- a/packages/twenty-docs/l/es/developers/self-host/self-host.mdx
+++ b/packages/twenty-docs/l/es/developers/self-host/self-host.mdx
@@ -4,10 +4,10 @@ description: Deploy and manage Twenty on your own infrastructure.
---
-
+
-## Resumen
+## Overview
Twenty can be self-hosted on your own infrastructure, giving you full control over your data and deployment.
diff --git a/packages/twenty-docs/l/es/navigation.json b/packages/twenty-docs/l/es/navigation.json
index f1eaf39da7..8096fbf4ac 100644
--- a/packages/twenty-docs/l/es/navigation.json
+++ b/packages/twenty-docs/l/es/navigation.json
@@ -15,7 +15,7 @@
}
},
"dataModel": {
- "label": "Modelo de datos",
+ "label": "Data Model",
"groups": {
"dataModelCapabilities": {
"label": "Capabilities"
@@ -48,7 +48,7 @@
}
},
"workflows": {
- "label": "Flujos de trabajo",
+ "label": "Workflows",
"groups": {
"workflowsCapabilities": {
"label": "Capabilities"
@@ -73,7 +73,7 @@
}
},
"ai": {
- "label": "IA",
+ "label": "AI",
"groups": {
"aiCapabilities": {
"label": "Capabilities"
@@ -95,7 +95,7 @@
}
},
"dashboards": {
- "label": "Tableros",
+ "label": "Dashboards",
"groups": {
"dashboardsCapabilities": {
"label": "Capabilities"
@@ -117,7 +117,7 @@
}
},
"billing": {
- "label": "Facturación",
+ "label": "Billing",
"groups": {
"billingCapabilities": {
"label": "Capabilities"
@@ -128,7 +128,7 @@
}
},
"settings": {
- "label": "Configuración",
+ "label": "Settings",
"groups": {
"settingsCapabilities": {
"label": "Capabilities"
@@ -141,10 +141,10 @@
}
},
"developers": {
- "label": "Desarrolladores",
+ "label": "Developers",
"groups": {
"developersGroup": {
- "label": "Desarrolladores"
+ "label": "Developers"
},
"extend": {
"label": "Extend",
@@ -169,29 +169,29 @@
"label": "Capabilities",
"groups": {
"frontendDevelopment": {
- "label": "Desarrollo Frontend",
+ "label": "Frontend Development",
"groups": {
"twentyUi": {
"label": "Twenty UI",
"groups": {
"display": {
- "label": "Mostrar"
+ "label": "Display"
},
"feedback": {
- "label": "Retroalimentación"
+ "label": "Feedback"
},
"input": {
- "label": "Entrada"
+ "label": "Input"
},
"navigation": {
- "label": "Navegación"
+ "label": "Navigation"
}
}
}
}
},
"backendDevelopment": {
- "label": "Desarrollo Backend"
+ "label": "Backend Development"
}
}
}
diff --git a/packages/twenty-docs/l/es/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/es/twenty-ui/display/app-tooltip.mdx
index ced09dc767..4e620eedc7 100644
--- a/packages/twenty-docs/l/es/twenty-ui/display/app-tooltip.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/display/app-tooltip.mdx
@@ -1,16 +1,16 @@
---
-title: Consejo de la aplicación
+title: App Tooltip
image: /images/user-guide/tips/light-bulb.png
---
-
+
-Un breve mensaje que muestra información adicional cuando un usuario interactúa con un elemento.
+A brief message that displays additional information when a user interacts with an element.
-
+
```jsx
import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
@@ -38,26 +38,26 @@ Un breve mensaje que muestra información adicional cuando un usuario interactú
- | Props | Tipo | Descripción |
- | ------------------ | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
- | nombreDeClase | cadena | Clase CSS opcional para estilo adicional |
- | anchorSelect | Selector CSS | Selector para el ancla del consejo (el elemento que activa el consejo) |
- | contenido | cadena | El contenido que desea mostrar dentro del consejo |
- | delayHide | número | The delay in seconds before hiding the tooltip after the cursor leaves the anchor |
- | desplazamiento | número | El desplazamiento en píxeles para posicionar el consejo |
- | sinFlecha | booleano | Si es `true`, oculta la flecha en el consejo |
- | estáAbierto | booleano | Si es `true`, el consejo está abierto por defecto |
- | lugar | Cadena `PlacesType` de `react-tooltip` | Especifica la colocación del consejo. Los valores incluyen `inferior`, `izquierda`, `derecha`, `superior`, `superior-inicio`, `superior-fin`, `derecha-inicio`, `derecha-fin`, `inferior-inicio`, `inferior-fin`, `izquierda-inicio` y `izquierda-fin` |
- | estrategiaPosicion | Cadena `PositionStrategy` de `react-tooltip` | Estrategia de posición para el consejo. Tiene dos valores: `absoluto` y `fijo` |
+ | Props | Type | Description |
+ | ---------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional CSS class for additional styling |
+ | anchorSelect | CSS selector | Selector for the tooltip anchor (the element that triggers the tooltip) |
+ | content | string | The content you want to display within the tooltip |
+ | delayHide | number | The delay in seconds before hiding the tooltip after the cursor leaves the anchor |
+ | offset | number | The offset in pixels for positioning the tooltip |
+ | noArrow | boolean | If `true`, hides the arrow on the tooltip |
+ | isOpen | boolean | If `true`, the tooltip is open by default |
+ | place | `PlacesType` string from `react-tooltip` | Specifies the placement of the tooltip. Values include `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, and `left-end` |
+ | positionStrategy | `PositionStrategy` string from `react-tooltip` | Position strategy for the tooltip. Has two values: `absolute` and `fixed` |
-## Texto Desbordante con Consejo
+## Overflowing Text with Tooltip
-Maneja texto desbordante y muestra un consejo cuando el texto se desborda.
+Handles overflowing text and displays a tooltip when the text overflows.
-
+
```jsx
import { OverflowingTextWithTooltip } from 'twenty-ui/display';
@@ -71,8 +71,8 @@ Maneja texto desbordante y muestra un consejo cuando el texto se desborda.
- | Props | Tipo | Descripción |
- | ----- | ------ | -------------------------------------------------------------- |
- | texto | cadena | El contenido que desea mostrar en el área de texto desbordante |
+ | Props | Type | Description |
+ | ----- | ------ | ------------------------------------------------------------ |
+ | text | string | The content you want to display in the overflowing text area |
diff --git a/packages/twenty-docs/l/es/twenty-ui/display/checkmark.mdx b/packages/twenty-docs/l/es/twenty-ui/display/checkmark.mdx
index 7726dabf92..ef84d5c2d5 100644
--- a/packages/twenty-docs/l/es/twenty-ui/display/checkmark.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/display/checkmark.mdx
@@ -1,16 +1,16 @@
---
-title: Marca de verificación
+title: Checkmark
image: /images/user-guide/tasks/tasks_header.png
---
-
+
-Representa una acción exitosa o completada.
+Represents a successful or completed action.
-
+
```jsx
import { Checkmark } from 'twenty-ui/display';
@@ -21,16 +21,16 @@ Representa una acción exitosa o completada.
- Extiende `React.ComponentPropsWithoutRef<'div'>` y acepta todas las propiedades de un elemento `div` regular.
+ Extends `React.ComponentPropsWithoutRef<'div'>` and accepts all the props of a regular `div` element.
-## Marca de verificación animada
+## Animated Checkmark
-Representa un ícono de marca de verificación con la característica adicional de animación.
+Represents a checkmark icon with the added feature of animation.
-
+
```jsx
import { AnimatedCheckmark } from 'twenty-ui/display';
@@ -48,11 +48,11 @@ Representa un ícono de marca de verificación con la característica adicional
- | Props | Tipo | Descripción | Predeterminado |
- | ----------- | -------- | -------------------------------------------------- | -------------- |
- | isAnimating | booleano | Controla si la marca de verificación está animando | falso |
- | color | cadena | Color de la marca de verificación | |
- | duración | número | La duración de la animación en segundos | 0.5 segundos |
- | tamaño | número | El tamaño de la marca de verificación | 28 píxeles |
+ | Props | Type | Description | Default |
+ | ----------- | ------- | ------------------------------------------- | ----------- |
+ | isAnimating | boolean | Controls whether the checkmark is animating | false |
+ | color | string | Color of the checkmark | |
+ | duration | number | The duration of the animation in seconds | 0.5 seconds |
+ | size | number | The size of the checkmark | 28 pixels |
diff --git a/packages/twenty-docs/l/es/twenty-ui/display/chip.mdx b/packages/twenty-docs/l/es/twenty-ui/display/chip.mdx
index 7fccdec997..ded2fd1c77 100644
--- a/packages/twenty-docs/l/es/twenty-ui/display/chip.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/display/chip.mdx
@@ -4,13 +4,13 @@ image: /images/user-guide/github/github-header.png
---
-
+
A visual element that you can use as a clickable or non-clickable container with a label, optional left and right components, and various styling options to display labels and tags.
-
+
```jsx
import { Chip } from 'twenty-ui/components';
@@ -34,21 +34,21 @@ A visual element that you can use as a clickable or non-clickable container with
- | Props | Tipo | Descripción |
- | ------------ | ------------------------ | ------------------------------------------------------------------------------------------------ |
- | linkToEntity | cadena | El enlace a la entidad |
- | entityId | cadena | El identificador único de la entidad |
- | nombre | cadena | El nombre de la entidad |
- | pictureUrl | cadena | s picture", |
- | avatarType | Tipo de Avatar | El tipo de avatar que quieres mostrar. Tiene dos opciones: `redondeado` y `cuadrado` |
- | variante | `EntityChipVariant` enum | Variante del chip de entidad que quieres mostrar. Tiene dos opciones: `regular` y `transparente` |
- | LeftIcon | IconComponent | Un componente de React que representa un ícono. Mostrado en el lado izquierdo del chip |
+ | Props | Type | Description |
+ | ------------ | ------------------------ | -------------------------------------------------------------------------------------------- |
+ | linkToEntity | string | The link to the entity |
+ | entityId | string | The unique identifier for the entity |
+ | name | string | The name of the entity |
+ | pictureUrl | string | s picture", |
+ | avatarType | Avatar Type | The type of avatar you want to display. Has two options: `rounded` and `squared` |
+ | variant | `EntityChipVariant` enum | Variant of the entity chip you want to display. Has two options: `regular` and `transparent` |
+ | LeftIcon | IconComponent | A React component representing an icon. Displayed on the left side of the chip |
-## Ejemplos
+## Examples
-### Chip Transparente Deshabilitado
+### Transparent Disabled Chip
```jsx
import { Chip } from 'twenty-ui/components';
@@ -73,7 +73,7 @@ export const MyComponent = () => {
-### Chip Deshabilitado con Tooltip
+### Disabled Chip with Tooltip
```jsx
import { Chip } from "twenty-ui/components";
@@ -95,12 +95,12 @@ export const MyComponent = () => {
};
```
-## Chip de Entidad
+## Entity Chip
-Un elemento tipo Chip para mostrar información sobre una entidad.
+A Chip-like element to display information about an entity.
-
+
```jsx
import { BrowserRouter as Router } from 'react-router-dom';
import { IconTwentyStar } from 'twenty-ui/display';
@@ -125,14 +125,14 @@ Un elemento tipo Chip para mostrar información sobre una entidad.
- | Props | Tipo | Descripción |
- | ------------ | ------------------------ | ------------------------------------------------------------------------------------------------ |
- | linkToEntity | cadena | El enlace a la entidad |
- | entityId | cadena | El identificador único de la entidad |
- | nombre | cadena | El nombre de la entidad |
- | pictureUrl | cadena | s picture", |
- | avatarType | Tipo de Avatar | El tipo de avatar que quieres mostrar. Tiene dos opciones: `redondeado` y `cuadrado` |
- | variante | `EntityChipVariant` enum | Variante del chip de entidad que quieres mostrar. Tiene dos opciones: `regular` y `transparente` |
- | LeftIcon | IconComponent | Un componente de React que representa un ícono. Mostrado en el lado izquierdo del chip |
+ | Props | Type | Description |
+ | ------------ | ------------------------ | -------------------------------------------------------------------------------------------- |
+ | linkToEntity | string | The link to the entity |
+ | entityId | string | The unique identifier for the entity |
+ | name | string | The name of the entity |
+ | pictureUrl | string | s picture", |
+ | avatarType | Avatar Type | The type of avatar you want to display. Has two options: `rounded` and `squared` |
+ | variant | `EntityChipVariant` enum | Variant of the entity chip you want to display. Has two options: `regular` and `transparent` |
+ | LeftIcon | IconComponent | A React component representing an icon. Displayed on the left side of the chip |
diff --git a/packages/twenty-docs/l/es/twenty-ui/display/icons.mdx b/packages/twenty-docs/l/es/twenty-ui/display/icons.mdx
index 9e7646d32e..2d73154c8d 100644
--- a/packages/twenty-docs/l/es/twenty-ui/display/icons.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/display/icons.mdx
@@ -1,20 +1,20 @@
---
-title: Iconos
+title: Icons
image: /images/user-guide/objects/objects.png
---
-
+
-Una lista de iconos utilizados en toda nuestra aplicación.
+A list of icons used throughout our app.
-## Iconos Tabler
+## Tabler Icons
-Usamos iconos Tabler para React en toda la aplicación.
+We use Tabler icons for React throughout the app.
-
+
```
@@ -22,8 +22,8 @@ Usamos iconos Tabler para React en toda la aplicación.
```
-
- Puede importar cada icono como un componente. Aquí hay un ejemplo:
+
+ You can import each icon as a component. Here's an example:
@@ -36,25 +36,25 @@ Usamos iconos Tabler para React en toda la aplicación.
```
-
- | Propiedades | Tipo | Descripción | Predeterminado |
- | ----------- | ------ | ----------------------------------------- | -------------- |
- | tamaño | número | La altura y el ancho del icono en píxeles | 24 |
- | color | cadena | El color de los iconos | currentColor |
- | trazo | número | El ancho del trazo del icono en píxeles | 2 |
+
+ | Props | Type | Description | Default |
+ | ------ | ------ | ------------------------------------------ | ------------ |
+ | size | number | The height and width of the icon in pixels | 24 |
+ | color | string | The color of the icons | currentColor |
+ | stroke | number | The stroke width of the icon in pixels | 2 |
-## Iconos Personalizados
+## Custom Icons
-Además de los iconos Tabler, la aplicación también utiliza algunos iconos personalizados.
+In addition to Tabler icons, the app also uses some custom icons.
-### Icono de Libreta de Direcciones
+### Icon Address Book
-Muestra un icono de libreta de direcciones.
+Displays an address book icon.
-
+
```jsx
import { IconAddressBook } from 'twenty-ui/display';
@@ -64,10 +64,10 @@ Muestra un icono de libreta de direcciones.
```
-
- | "Props" | Tipo | Descripción | Predeterminado |
- | ------- | ------ | ----------------------------------------- | -------------- |
- | tamaño | número | La altura y el ancho del icono en píxeles | 24 |
- | trazo | número | El ancho del trazo del icono en píxeles | 2 |
+
+ | Props | Type | Description | Default |
+ | ------ | ------ | ------------------------------------------ | ------- |
+ | size | number | The height and width of the icon in pixels | 24 |
+ | stroke | number | The stroke width of the icon in pixels | 2 |
diff --git a/packages/twenty-docs/l/es/twenty-ui/display/soon-pill.mdx b/packages/twenty-docs/l/es/twenty-ui/display/soon-pill.mdx
index 5c23b5b7e0..56ace0bae7 100644
--- a/packages/twenty-docs/l/es/twenty-ui/display/soon-pill.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/display/soon-pill.mdx
@@ -4,7 +4,7 @@ image: /images/user-guide/kanban-views/kanban.png
---
-
+
A small badge or "pill" to indicate something is coming soon.
diff --git a/packages/twenty-docs/l/es/twenty-ui/display/tag.mdx b/packages/twenty-docs/l/es/twenty-ui/display/tag.mdx
index 421e926bf9..a2226c88d4 100644
--- a/packages/twenty-docs/l/es/twenty-ui/display/tag.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/display/tag.mdx
@@ -1,16 +1,16 @@
---
-title: Etiqueta
+title: Tag
image: /images/user-guide/table-views/table.png
---
-
+
-Componente para categorizar o etiquetar contenido visualmente.
+Component to visually categorize or label content.
-
+
```jsx
import { Tag } from "@/ui/display/tag/components/Tag";
@@ -28,11 +28,11 @@ Componente para categorizar o etiquetar contenido visualmente.
- | Props | Tipo | Descripción |
- | ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
- | nombreDeClase | cadena | Nombre opcional para estilo adicional |
- | color | cadena | Color de la etiqueta. Las opciones incluyen: `verde`, `turquesa`, `cielo`, `azul`, `púrpura`, `rosa`, `rojo`, `naranja`, `amarillo`, `gris` |
- | texto | cadena | El contenido de la etiqueta |
- | enClic | función | Función opcional llamada cuando un usuario hace clic en la etiqueta |
+ | Props | Type | Description |
+ | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | color | string | Color of the tag. Options include: `green`, `turquoise`, `sky`, `blue`, `purple`, `pink`, `red`, `orange`, `yellow`, `gray` |
+ | text | string | The content of the tag |
+ | onClick | function | Optional function called when a user clicks on the tag |
diff --git a/packages/twenty-docs/l/es/twenty-ui/input.mdx b/packages/twenty-docs/l/es/twenty-ui/input.mdx
index a2550d107a..2da701caf5 100644
--- a/packages/twenty-docs/l/es/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/input.mdx
@@ -1,8 +1,8 @@
---
-title: Entrada
+title: Input
image: /images/user-guide/tips/light-bulb.png
---
-
+
diff --git a/packages/twenty-docs/l/es/twenty-ui/input/block-editor.mdx b/packages/twenty-docs/l/es/twenty-ui/input/block-editor.mdx
index 2934ad9fac..9943fa5f5d 100644
--- a/packages/twenty-docs/l/es/twenty-ui/input/block-editor.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/input/block-editor.mdx
@@ -1,16 +1,16 @@
---
-title: Editor de Bloques
+title: Block Editor
image: /images/user-guide/api/api.png
---
-
+
-Usa un editor de texto enriquecido basado en bloques de [BlockNote](https://www.blocknotejs.org/) para permitir a los usuarios editar y ver bloques de contenido.
+Uses a block-based rich text editor from [BlockNote](https://www.blocknotejs.org/) to allow users to edit and view blocks of content.
-
+
```jsx
import { useBlockNote } from "@blocknote/react";
import { BlockEditor } from "@/ui/input/editor/components/BlockEditor";
@@ -24,8 +24,8 @@ Usa un editor de texto enriquecido basado en bloques de [BlockNote](https://www.
- | Props | Tipo | Descripción |
- | ------ | ----------------- | -------------------------------------------------- |
- | editor | `BlockNoteEditor` | La instancia o configuración del editor de bloques |
+ | Props | Type | Description |
+ | ------ | ----------------- | ------------------------------------------ |
+ | editor | `BlockNoteEditor` | The block editor instance or configuration |
diff --git a/packages/twenty-docs/l/es/twenty-ui/input/buttons.mdx b/packages/twenty-docs/l/es/twenty-ui/input/buttons.mdx
index f56538997d..1c53eb1816 100644
--- a/packages/twenty-docs/l/es/twenty-ui/input/buttons.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/input/buttons.mdx
@@ -1,18 +1,18 @@
---
-title: Botones
+title: Buttons
image: /images/user-guide/views/filter.png
---
-
+
-Una lista de botones y grupos de botones utilizados en toda la aplicación.
+A list of buttons and button groups used throughout the app.
-## Botón
+## Button
-
+
```jsx
import { Button } from "@/ui/input/button/components/Button";
@@ -37,28 +37,28 @@ Una lista de botones y grupos de botones utilizados en toda la aplicación.
```
-
- | "Props" | Tipo | Descripción |
- | ------------- | --------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
- | "className" | string | Nombre de clase opcional para estilos adicionales |
- | Ícono | `React.ComponentType` | Un componente de ícono opcional que se muestra dentro del botón |
- | título | cadena | El contenido de texto del botón |
- | "fullWidth" | booleano | Define si el botón debe ocupar todo el ancho de su contenedor |
- | variante | cadena | La variante de estilo visual del botón. Las opciones incluyen `primario`, `secundario` y `terciario` |
- | tamaño | cadena | El tamaño del botón. Tiene dos opciones: `pequeño` y `mediano` |
- | posición | cadena | La posición del botón en relación con sus compañeros. Las opciones incluyen: `independiente`, `izquierda`, `derecha` y `central` |
- | acento | cadena | El color de acento del botón. Las opciones incluyen: `predeterminado`, `azul` y `peligro` |
- | próximamente | booleano | Indica si el botón está marcado como "pronto" (como para funciones próximas) |
- | deshabilitado | booleano | Especifica si el botón está deshabilitado o no |
- | enfoque | booleano | Determina si el botón tiene foco |
- | alHacerClic | función | Una función de callback que se activa cuando el usuario hace clic en el botón |
+
+ | Props | Type | Description |
+ | --------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional class name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | fullWidth | boolean | Defines whether the button should span the whole width of its container |
+ | variant | string | The visual style variant of the button. Options include `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` |
+ | accent | string | The accent color of the button. Options include: `default`, `blue`, and `danger` |
+ | soon | boolean | Indicates if the button is marked as "soon" (such as for upcoming features) |
+ | disabled | boolean | Specifies whether the button is disabled or not |
+ | focus | boolean | Determines if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
-## Grupo de Botones
+## Button Group
-
+
```jsx
import { Button } from "@/ui/input/button/components/Button";
import { ButtonGroup } from "@/ui/input/button/components/ButtonGroup";
@@ -116,20 +116,20 @@ Una lista de botones y grupos de botones utilizados en toda la aplicación.
- | Props | Tipo | Descripción |
- | --------- | --------- | -------------------------------------------------------------------------------------------------------------------------- |
- | variante | cadena | La variante de estilo visual de los botones dentro del grupo. Las opciones incluyen `primario`, `secundario` y `terciario` |
- | tamaño | cadena | El tamaño de los botones dentro del grupo. Tiene dos opciones: `mediano` y `pequeño` |
- | acento | cadena | El color de acento de los botones dentro del grupo. Las opciones incluyen `predeterminado`, `azul` y `peligro` |
- | className | cadena | Nombre de clase opcional para estilos adicionales |
- | hijos | ReactNode | Una matriz de elementos React que representan los botones individuales dentro del grupo |
+ | Props | Type | Description |
+ | --------- | --------- | ---------------------------------------------------------------------------------------------------------------- |
+ | variant | string | The visual style variant of the buttons within the group. Options include `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the buttons within the group. Has two options: `medium` and `small` |
+ | accent | string | The accent color of the buttons within the group. Options include `default`, `blue` and `danger` |
+ | className | string | Optional class name for additional styling |
+ | children | ReactNode | An array of React elements representing the individual buttons within the group |
-## Botón Flotante
+## Floating Button
-
+
```jsx
import { FloatingButton } from "@/ui/input/button/components/FloatingButton";
import { IconSearch } from "@tabler/icons-react";
@@ -153,24 +153,24 @@ Una lista de botones y grupos de botones utilizados en toda la aplicación.
- | Props | Tipo | Descripción |
- | ----------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
- | className | cadena | Nombre opcional para estilos adicionales |
- | Ícono | `React.ComponentType` | Un componente de ícono opcional que se muestra dentro del botón |
- | título | cadena | El contenido de texto del botón |
- | tamaño | cadena | El tamaño del botón. Tiene dos opciones: `pequeño` y `mediano` |
- | posición | cadena | La posición del botón en relación con sus compañeros. Las opciones incluyen: `independiente`, `izquierda`, `central`, `derecha` |
- | aplicarSombra | booleano | Determina si se aplica sombra a un botón |
- | aplicarDesenfoque | booleano | Determina si se aplica un efecto de desenfoque al botón |
- | deshabilitado | booleano | Determina si el botón está deshabilitado |
- | enfoque | booleano | Indica si el botón tiene foco |
+ | Props | Type | Description |
+ | ----------- | --------------------- | ---------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `middle`, `right` |
+ | applyShadow | boolean | Determines whether to apply shadow to a button |
+ | applyBlur | boolean | Determines whether to apply a blur effect to the button |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
-## Grupo de Botones Flotantes
+## Floating Button Group
-
+
```jsx
import { FloatingButton } from "@/ui/input/button/components/FloatingButton";
import { FloatingButtonGroup } from "@/ui/input/button/components/FloatingButtonGroup";
@@ -206,18 +206,18 @@ Una lista de botones y grupos de botones utilizados en toda la aplicación.
```
-
- | "Props" | Tipo | Descripción | Predeterminado |
- | ------- | --------- | --------------------------------------------------------------------------------------- | -------------- |
- | tamaño | cadena | El tamaño del botón. Tiene dos opciones: `pequeño` y `mediano` | pequeño |
- | hijos | ReactNode | Una matriz de elementos React que representan los botones individuales dentro del grupo | |
+
+ | Props | Type | Description | Default |
+ | -------- | --------- | ------------------------------------------------------------------------------- | ------- |
+ | size | string | The size of the button. Has two options: `small` and `medium` | small |
+ | children | ReactNode | An array of React elements representing the individual buttons within the group | |
-## Botón de Ícono Flotante
+## Floating Icon Button
-
+
```jsx
import { FloatingIconButton } from "@/ui/input/button/components/FloatingIconButton";
import { IconSearch } from "@tabler/icons-react";
@@ -242,25 +242,25 @@ Una lista de botones y grupos de botones utilizados en toda la aplicación.
- | Props | Tipo | Descripción |
- | ----------------- | --------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
- | className | cadena | "Nombre opcional para estilización adicional" |
- | Ícono | `React.ComponentType` | Un componente de ícono opcional que se muestra dentro del botón |
- | tamaño | cadena | El tamaño del botón. Tiene dos opciones: `pequeño` y `mediano` |
- | posición | cadena | La posición del botón en relación con sus compañeros. Las opciones incluyen: `independiente`, `izquierda`, `derecha` y `central` |
- | aplicarSombra | booleano | Determina si se aplica sombra a un botón |
- | aplicarDesenfoque | booleano | Determina si se aplica un efecto de desenfoque al botón |
- | deshabilitado | booleano | Determina si el botón está deshabilitado |
- | enfoque | booleano | Indica si el botón tiene foco |
- | alHacerClic | función | Una función de callback que se activa cuando el usuario hace clic en el botón |
- | esActivo | booleano | Determina si el botón está en estado activo |
+ | Props | Type | Description |
+ | ----------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` |
+ | applyShadow | boolean | Determines whether to apply shadow to a button |
+ | applyBlur | boolean | Determines whether to apply a blur effect to the button |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+ | isActive | boolean | Determines if the button is in an active state |
-## Grupo de Botones de Ícono Flotante
+## Floating Icon Button Group
-
+
```jsx
import { FloatingIconButtonGroup } from "@/ui/input/button/components/FloatingIconButtonGroup";
import { IconClipboardText, IconCheckbox } from "@tabler/icons-react";
@@ -291,18 +291,18 @@ Una lista de botones y grupos de botones utilizados en toda la aplicación.
- | Props | Tipo | Descripción |
- | ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
- | className | cadena | "Nombre opcional para estilización adicional" |
- | tamaño | cadena | El tamaño del botón. Tiene dos opciones: `pequeño` y `mediano` |
- | iconButtons | array | An array of objects, each representing an icon button in the group. Cada objeto debe incluir el componente de ícono que desea mostrar en el botón, la función que desea llamar cuando un usuario hace clic en el botón y si el botón debe estar activo o no. |
+ | Props | Type | Description |
+ | ----------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | iconButtons | array | An array of objects, each representing an icon button in the group. Each object should include the icon component you want to display in the button, the function you want to call when a user clicks on the button, and whether the button should be active or not. |
-## Botón Claro
+## Light Button
-
+
```jsx
import { LightButton } from "@/ui/input/button/components/LightButton";
@@ -322,23 +322,23 @@ Una lista de botones y grupos de botones utilizados en toda la aplicación.
- | Props | Tipo | Descripción |
- | ------------- | ----------------- | ------------------------------------------------------------------------------- |
- | className | cadena | "Nombre opcional para estilización adicional" |
- | ícono | `React.ReactNode` | El ícono que desea mostrar en el botón |
- | título | cadena | El contenido de texto del botón |
- | acento | "cadena" | El color de acento del botón. Las opciones incluyen: `secundario` y `terciario` |
- | activo | booleano | Determina si el botón está en estado activo |
- | deshabilitado | booleano | Determina si el botón está deshabilitado |
- | enfoque | booleano | Indica si el botón tiene foco |
- | alHacerClic | función | Una función de callback que se activa cuando el usuario hace clic en el botón |
+ | Props | Type | Description |
+ | --------- | ----------------- | --------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | icon | `React.ReactNode` | The icon you want to display in the button |
+ | title | string | The text content of the button |
+ | accent | string | The accent color of the button. Options include: `secondary` and `tertiary` |
+ | active | boolean | Determines if the button is in an active state |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
-## Botón de Ícono Claro
+## Light Icon Button
-
+
```jsx
import { LightIconButton } from "@/ui/input/button/components/LightIconButton";
import { IconSearch } from "@tabler/icons-react";
@@ -362,26 +362,26 @@ Una lista de botones y grupos de botones utilizados en toda la aplicación.
```
-
- | "Props" | Tipo | Descripción |
- | ------------- | --------------------- | ----------------------------------------------------------------------------- |
- | "className" | cadena | "Nombre opcional para estilización adicional" |
- | testId | "cadena" | Identificador de prueba para el botón |
- | Ícono | `React.ComponentType` | Un componente de ícono opcional que se muestra dentro del botón |
- | título | "cadena" | El contenido de texto del botón |
- | tamaño | "cadena" | El tamaño del botón. Tiene dos opciones: `pequeño` y `mediano` |
- | acento | "cadena" | El color de acento del botón. Opciones incluyen: `secundario` y `terciario` |
- | activo | booleano | Determina si el botón está en estado activo |
- | "desactivado" | booleano | Determina si el botón está deshabilitado |
- | enfoque | booleano | Indica si el botón tiene foco |
- | alHacerClic | función | Una función de callback que se activa cuando el usuario hace clic en el botón |
+
+ | Props | Type | Description |
+ | --------- | --------------------- | --------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | testId | string | Test identifier for the button |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | accent | string | The accent color of the button. Options include: `secondary` and `tertiary` |
+ | active | boolean | Determines if the button is in an active state |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
-## Botón Principal
+## Main Button
-
+
```jsx
import { MainButton } from "@/ui/input/button/components/MainButton";
import { IconCheckbox } from "@tabler/icons-react";
@@ -400,22 +400,22 @@ Una lista de botones y grupos de botones utilizados en toda la aplicación.
```
-
- | Propiedades | Tipo | Descripción |
- | -------------------------- | -------------------------------- | --------------------------------------------------------------------------------- |
- | título | "cadena" | El contenido de texto del botón |
- | anchoCompleto | booleano | Define si el botón debe abarcar todo el ancho de su contenedor |
- | variante | "cadena" | La variante de estilo visual del botón. Options include `primary` and `secondary` |
- | próximamente | booleano | Indica si el botón está marcado como "próximamente" (como para funciones futuras) |
- | Ícono | `React.ComponentType` | Un componente de ícono opcional que se muestra dentro del botón |
- | Propiedades React `button` | `React.ComponentProps<'button'>` | Se admiten todas las propiedades estándar del botón HTML |
+
+ | Props | Type | Description |
+ | -------------------- | -------------------------------- | --------------------------------------------------------------------------------- |
+ | title | string | The text content of the button |
+ | fullWidth | boolean | Defines whether the button should span the whole width of its container |
+ | variant | string | The visual style variant of the button. Options include `primary` and `secondary` |
+ | soon | boolean | Indicates if the button is marked as "soon" (such as for upcoming features) |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | React `button` props | `React.ComponentProps<'button'>` | All standard HTML button props are supported |
-## Botón de Icono Redondeado
+## Rounded Icon Button
-
+
```jsx
import { RoundedIconButton } from "@/ui/input/button/components/RoundedIconButton";
import { IconSearch } from "@tabler/icons-react";
@@ -430,10 +430,10 @@ Una lista de botones y grupos de botones utilizados en toda la aplicación.
```
-
- | "Props" | Tipo | Descripción |
- | -------------------------- | ----------------------------------------------- | ----------- |
- | Ícono | `React.ComponentType` | |
- | Propiedades React `button` | `React.ButtonHTMLAttributes` | |
+
+ | Props | Type | Description |
+ | -------------------- | ----------------------------------------------- | ----------- |
+ | Icon | `React.ComponentType` | |
+ | React `button` props | `React.ButtonHTMLAttributes` | |
diff --git a/packages/twenty-docs/l/es/twenty-ui/input/checkbox.mdx b/packages/twenty-docs/l/es/twenty-ui/input/checkbox.mdx
index f01ee51116..b25eeba052 100644
--- a/packages/twenty-docs/l/es/twenty-ui/input/checkbox.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/input/checkbox.mdx
@@ -1,16 +1,16 @@
---
-title: Caja de selección
+title: Checkbox
image: /images/user-guide/tasks/tasks_header.png
---
-
+
-Usado cuando un usuario necesita seleccionar múltiples valores entre varias opciones.
+Used when a user needs to select multiple values from several options.
-
+
```jsx
import { Checkbox } from "twenty-ui/display";
@@ -19,8 +19,8 @@ Usado cuando un usuario necesita seleccionar múltiples valores entre varias opc
console.log("función onChange ejecutada")}
- onCheckedChange={() => console.log("función onCheckedChange ejecutada")}
+ onChange={() => console.log("onChange function fired")}
+ onCheckedChange={() => console.log("onCheckedChange function fired")}
variant="primary"
size="small"
shape="squared"
@@ -31,14 +31,14 @@ Usado cuando un usuario necesita seleccionar múltiples valores entre varias opc
- | Props | Tipo | Descripción |
- | --------------- | -------- | ------------------------------------------------------------------------------------------------------ |
- | marcado | booleano | Indica si la caja de selección está marcada |
- | indeterminado | booleano | Indica si la caja de selección está en un estado indeterminado (ni marcada ni desmarcada) |
- | onChange | función | La función de devolución de llamada que desea activar cuando cambia el estado de la caja de selección |
- | onCheckedChange | función | La función de devolución de llamada que desea activar cuando cambia el estado `marcado` |
- | variante | cadena | La variante de estilo visual de la caja. Las opciones incluyen: `primario`, `secundario` y `terciario` |
- | tamaño | cadena | El tamaño de la caja de selección. Tiene dos opciones: `pequeño` y `grande` |
- | forma | cadena | La forma de la caja de selección. Tiene dos opciones: `cuadrado` y `redondeado` |
+ | Props | Type | Description |
+ | --------------- | -------- | -------------------------------------------------------------------------------------------- |
+ | checked | boolean | Indicates whether the checkbox is checked |
+ | indeterminate | boolean | Indicates whether the checkbox is in an indeterminate state (neither checked nor unchecked) |
+ | onChange | function | The callback function you want to trigger when the checkbox state changes |
+ | onCheckedChange | function | The callback function you want to trigger when the `checked` state changes |
+ | variant | string | The visual style variant of the box. Options include: `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the checkbox. Has two options: `small` and `large` |
+ | shape | string | The shape of the checkbox. Has two options: `squared` and `rounded` |
diff --git a/packages/twenty-docs/l/es/twenty-ui/input/color-scheme.mdx b/packages/twenty-docs/l/es/twenty-ui/input/color-scheme.mdx
index daedad71b2..1b1505d481 100644
--- a/packages/twenty-docs/l/es/twenty-ui/input/color-scheme.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/input/color-scheme.mdx
@@ -1,18 +1,18 @@
---
-title: Esquema de colores
+title: Color Scheme
image: /images/user-guide/fields/field.png
---
-
+
-## Tarjeta de Esquema de Color
+## Color Scheme Card
-Representa diferentes esquemas de color y está diseñado especialmente para temas claros y oscuros.
+Represents different color schemes and is specially tailored for light and dark themes.
-
+
```jsx
import { ColorSchemeCard } from "twenty-ui/display";
@@ -27,21 +27,21 @@ Representa diferentes esquemas de color y está diseñado especialmente para tem
```
-
- | "Props" | Tipo | Descripción | Predeterminado |
- | ----------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------- |
- | variante | string | La variante del esquema de color. Las opciones incluyen `Oscuro`, `Claro` y `Sistema` | claro |
- | seleccionado | booleano | Si es `verdadero`, muestra una marca de verificación para indicar el esquema de color seleccionado | |
- | props adicionales | `React.ComponentPropsWithoutRef<'div'>` | Props del elemento HTML estándar `div` | |
+
+ | Props | Type | Description | Default |
+ | ---------------- | --------------------------------------- | ----------------------------------------------------------------------- | ------- |
+ | variant | string | The color scheme variant. Options include `Dark`, `Light`, and `System` | light |
+ | selected | boolean | If `true`, displays a checkmark to indicate the selected color scheme | |
+ | additional props | `React.ComponentPropsWithoutRef<'div'>` | Standard HTML `div` element props | |
-## Selector de Esquema de Color
+## Color Scheme Picker
-Permite a los usuarios elegir entre diferentes esquemas de color.
+Allows users to choose between different color schemes.
-
+
```jsx
import { ColorSchemePicker } from "twenty-ui/display";
@@ -54,10 +54,10 @@ Permite a los usuarios elegir entre diferentes esquemas de color.
```
-
- | "Props" | Tipo | Descripción |
- | ---------- | -------------------- | ---------------------------------------------------------------------------- |
- | valor | `Esquema de colores` | El esquema de color actualmente seleccionado |
- | "onChange" | función | The callback function you want to trigger when a user selects a color scheme |
+
+ | Props | Type | Description |
+ | -------- | -------------- | ---------------------------------------------------------------------------- |
+ | value | `Color Scheme` | The currently selected color scheme |
+ | onChange | function | The callback function you want to trigger when a user selects a color scheme |
diff --git a/packages/twenty-docs/l/es/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/es/twenty-ui/input/icon-picker.mdx
index d006f718e0..59d269242e 100644
--- a/packages/twenty-docs/l/es/twenty-ui/input/icon-picker.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/input/icon-picker.mdx
@@ -1,16 +1,16 @@
---
-title: Selector de Íconos
+title: Icon Picker
image: /images/user-guide/github/github-header.png
---
-
+
-Un selector de íconos basado en un menú desplegable que permite a los usuarios seleccionar un ícono de una lista.
+A dropdown-based icon picker that allows users to select an icon from a list.
-
+
```jsx
import { RecoilRoot } from "recoil";
import React, { useState } from "react";
@@ -20,7 +20,7 @@ Un selector de íconos basado en un menú desplegable que permite a los usuarios
const [selectedIcon, setSelectedIcon] = useState("");
const handleIconChange = ({ iconKey, Icon }) => {
- console.log("Ícono Seleccionado:", iconKey);
+ console.log("Selected Icon:", iconKey);
setSelectedIcon(iconKey);
};
@@ -39,14 +39,14 @@ Un selector de íconos basado en un menú desplegable que permite a los usuarios
- | Props | Tipo | Descripción |
- | --------------- | -------- | ---------------------------------------------------------------------------------------------------------------------- |
- | deshabilitado | booleano | Desactiva el selector de íconos si está configurado en `true` |
- | "onChange" | función | The callback function triggered when the user selects an icon. Recibe un objeto con las propiedades `iconKey` y `Icon` |
- | selectedIconKey | cadena | La clave del ícono seleccionado inicialmente |
- | onClickOutside | función | Callback function triggered when the user clicks outside the dropdown |
- | onClose | función | Callback function triggered when the dropdown is closed |
- | onOpen | función | Callback function triggered when the dropdown is opened |
- | variante | cadena | La variante de estilo visual del ícono clicable. Las opciones incluyen: `primario`, `secundario` y `terciario` |
+ | Props | Type | Description |
+ | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------- |
+ | disabled | boolean | Disables the icon picker if set to `true` |
+ | onChange | function | The callback function triggered when the user selects an icon. It receives an object with `iconKey` and `Icon` properties |
+ | selectedIconKey | string | The key of the initially selected icon |
+ | onClickOutside | function | Callback function triggered when the user clicks outside the dropdown |
+ | onClose | function | Callback function triggered when the dropdown is closed |
+ | onOpen | function | Callback function triggered when the dropdown is opened |
+ | variant | string | The visual style variant of the clickable icon. Options include: `primary`, `secondary`, and `tertiary` |
diff --git a/packages/twenty-docs/l/es/twenty-ui/input/image-input.mdx b/packages/twenty-docs/l/es/twenty-ui/input/image-input.mdx
index c06de9c4a0..0d563d7c37 100644
--- a/packages/twenty-docs/l/es/twenty-ui/input/image-input.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/input/image-input.mdx
@@ -1,16 +1,16 @@
---
-title: Entrada de imagen
+title: Image Input
image: /images/user-guide/objects/objects.png
---
-
+
-Permite a los usuarios subir y eliminar una imagen.
+Allows users to upload and remove an image.
-
+
```jsx
import { ImageInput } from "@/ui/input/components/ImageInput";
@@ -21,14 +21,14 @@ Permite a los usuarios subir y eliminar una imagen.
- | Props | Tipo | Descripción |
- | ------------- | -------- | ---------------------------------------------------------------------------------------------------------- |
- | foto | cadena | La URL de origen de la imagen |
- | onUpload | función | La función que se llama cuando un usuario sube una nueva imagen. Recibe el objeto `File` como un parámetro |
- | onRemove | función | La función que se llama cuando el usuario hace clic en el botón eliminar |
- | onAbort | función | La función que se llama cuando un usuario hace clic en el botón de abortar durante la subida de imagen |
- | isUploading | booleano | Indica si una imagen se está cargando actualmente |
- | errorMessage | cadena | Un mensaje de error opcional para mostrar debajo de la entrada de imagen |
- | "desactivado" | booleano | Si es `true`, toda la entrada está deshabilitada y los botones no son clicables |
+ | Props | Type | Description |
+ | ------------ | -------- | ------------------------------------------------------------------------------------------------- |
+ | picture | string | The image source URL |
+ | onUpload | function | The function called when a user uploads a new image. It receives the `File` object as a parameter |
+ | onRemove | function | The function called when the user clicks on the remove button |
+ | onAbort | function | The function called when a user clicks on the abort button during image upload |
+ | isUploading | boolean | Indicates whether an image is currently being uploaded |
+ | errorMessage | string | An optional error message to display below the image input |
+ | disabled | boolean | If `true`, the entire input is disabled, and the buttons are not clickable |
diff --git a/packages/twenty-docs/l/es/twenty-ui/input/radio.mdx b/packages/twenty-docs/l/es/twenty-ui/input/radio.mdx
index 3574a906aa..e6246e631f 100644
--- a/packages/twenty-docs/l/es/twenty-ui/input/radio.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/input/radio.mdx
@@ -4,13 +4,13 @@ image: /images/user-guide/create-workspace/workspace-cover.png
---
-
+
-Usado cuando los usuarios solo pueden elegir una opción de una serie de opciones.
+Used when users may only choose one option from a series of options.
-
+
```jsx
import { Radio } from "twenty-ui/display";
@@ -42,26 +42,26 @@ Usado cuando los usuarios solo pueden elegir una opción de una serie de opcione
- | Props | Tipo | Descripción |
- | --------------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------- |
- | estilo | propiedades de `React.CSS` | Estilos en línea adicionales para el componente. |
- | "className" | cadena | Clase CSS opcional para estilo adicional. |
- | marcado | booleano | Indicates whether the radio button is checked |
- | valor | cadena | La etiqueta o texto asociado con el botón de opción. |
- | "onChange" | función | La función que se llama cuando se cambia el botón de opción seleccionado. |
- | onCheckedChange | función | La función que se llama cuando el estado de `seleccionado` del botón de opción cambia. |
- | tamaño | cadena | El tamaño del botón de opción. Las opciones incluyen: `grande` y `pequeño`. |
- | "desactivado" | booleano | Si es `verdadero`, el botón de opción está deshabilitado y no se puede hacer clic. |
- | labelPosition | cadena | La posición del texto de la etiqueta en relación con el botón de opción. Tiene dos opciones: `izquierda` y `derecha`. |
+ | Props | Type | Description |
+ | --------------- | ---------------------- | ------------------------------------------------------------------------------------------------ |
+ | style | `React.CSS` properties | Additional inline styles for the component |
+ | className | string | Optional CSS class for additional styling |
+ | checked | boolean | Indicates whether the radio button is checked |
+ | value | string | The label or text associated with the radio button |
+ | onChange | function | The function called when the selected radio button is changed |
+ | onCheckedChange | function | The function called when the `checked` state of the radio button changes |
+ | size | string | The size of the radio button. Options include: `large` and `small` |
+ | disabled | boolean | If `true`, the radio button is disabled and not clickable |
+ | labelPosition | string | The position of the label text relative to the radio button. Has two options: `left` and `right` |
-## Grupo de Radio
+## Radio Group
-Agrupa botones de opción relacionados.
+Groups together related radio buttons.
-
+
```jsx
import React, { useState } from "react";
import { Radio, RadioGroup } from "twenty-ui/display";
@@ -87,11 +87,11 @@ Agrupa botones de opción relacionados.
- | Props | Tipo | Descripción |
- | --------------- | ----------------- | ----------------------------------------------------------------------------------------------------- |
- | valor | cadena | El valor del botón de opción seleccionado actualmente. |
- | "onChange" | función | La función de devolución de llamada que se activa cuando se cambia el botón de opción. |
- | alCambioDeValor | función | La función de devolución de llamada que se activa cuando se cambia el valor seleccionado en el grupo. |
- | hijos | `React.ReactNode` | Allows you to pass React components (such as Radio) as children to the Radio Group |
+ | Props | Type | Description |
+ | ------------- | ----------------- | ---------------------------------------------------------------------------------- |
+ | value | string | The value of the currently selected radio button |
+ | onChange | function | The callback function triggered when the radio button is changed |
+ | onValueChange | function | The callback function triggered when the selected value in the group changes. |
+ | children | `React.ReactNode` | Allows you to pass React components (such as Radio) as children to the Radio Group |
diff --git a/packages/twenty-docs/l/es/twenty-ui/input/select.mdx b/packages/twenty-docs/l/es/twenty-ui/input/select.mdx
index 541050eaad..d685bf4012 100644
--- a/packages/twenty-docs/l/es/twenty-ui/input/select.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/input/select.mdx
@@ -1,16 +1,16 @@
---
-title: Seleccionar
+title: Select
image: /images/user-guide/what-is-twenty/20.png
---
-
+
-Permite a los usuarios seleccionar un valor de una lista de opciones predefinidas.
+Allows users to pick a value from a list of predefined options.
-
+
```jsx
import { RecoilRoot } from 'recoil';
import { IconTwentyStar } from 'twenty-ui/display';
@@ -39,13 +39,13 @@ Permite a los usuarios seleccionar un valor de una lista de opciones predefinida
- | Props | Tipo | Descripción |
- | ------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
- | nombreDeClase | cadena | Clase CSS opcional para estilo adicional |
- | "desactivado" | booleano | Cuando se establece en `true`, desactiva la interacción del usuario con el componente |
- | etiqueta | cadena | La etiqueta para describir el propósito del componente `Seleccionar` |
- | "onChange" | función | La función que se llama cuando los valores seleccionados cambian |
- | opciones | array | Represents the options available for the `Selected` component. Es un arreglo de objetos donde cada objeto tiene un `valor` (el identificador único), `etiqueta` (el identificador único), y un `Icono` opcional |
- | valor | cadena | Representa el valor actualmente seleccionado. Debe coincidir con una de las propiedades `valor` en el arreglo de `opciones`. |
+ | Props | Type | Description |
+ | --------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional CSS class for additional styling |
+ | disabled | boolean | When set to `true`, disables user interaction with the component |
+ | label | string | The label to describe the purpose of the `Select` component |
+ | onChange | function | The function called when the selected values change |
+ | options | array | Represents the options available for the `Selected` component. It's an array of objects where each object has a `value` (the unique identifier), `label` (the unique identifier), and an optional `Icon` |
+ | value | string | Represents the currently selected value. It should match one of the `value` properties in the `options` array |
diff --git a/packages/twenty-docs/l/es/twenty-ui/input/text.mdx b/packages/twenty-docs/l/es/twenty-ui/input/text.mdx
index bf03046bf1..8cad1352ae 100644
--- a/packages/twenty-docs/l/es/twenty-ui/input/text.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/input/text.mdx
@@ -1,18 +1,18 @@
---
-title: Texto
-image: '"/images/user-guide/notes/notes_header.png"'
+title: Text
+image: /images/user-guide/notes/notes_header.png
---
-
+
-## "Entrada de Texto"
+## Text Input
-"Permite a los usuarios ingresar y editar texto."
+Allows users to enter and edit text.
-
+
```jsx
import { RecoilRoot } from "recoil";
import { TextInput } from "@/ui/input/components/TextInput";
@@ -45,28 +45,28 @@ image: '"/images/user-guide/notes/notes_header.png"'
```
-
- | "Props" | Tipo | Descripción |
- | -------------- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
- | "className" | string | "Nombre opcional para estilización adicional" |
- | etiqueta | string | "Representa la etiqueta para la entrada" |
- | "onChange" | "función" | "La función que se llama cuando el valor de entrada cambia" |
- | "fullWidth" | booleano | "Indica si la entrada debe ocupar el 100% del ancho" |
- | disableHotkeys | booleano | "Indica si las teclas rápidas están habilitadas para la entrada" |
- | error | cadena | "Representa el mensaje de error que se mostrará." "Cuando se proporciona, también se añade un icono de error en el lado derecho de la entrada" |
- | "onKeyDown" | "función" | "Se llama cuando se presiona una tecla mientras el campo de entrada está enfocado." "Recibe un `React.KeyboardEvent` como argumento" |
- | RightIcon | "ComponenteIcono" | "Un componente opcional de icono que se muestra en el lado derecho de la entrada" |
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | label | string | Represents the label for the input |
+ | onChange | function | The function called when the input value changes |
+ | fullWidth | boolean | Indicates whether the input should take up 100% of the width |
+ | disableHotkeys | boolean | Indicates whether hotkeys are enabled for the input |
+ | error | string | Represents the error message to be displayed. When provided, it also adds an icon error on the right side of the input |
+ | onKeyDown | function | Called when a key is pressed down while the input field is focused. Receives a `React.KeyboardEvent` as an argument |
+ | RightIcon | IconComponent | An optional icon component displayed on the right side of the input |
- "El componente también acepta otras props de elementos de entrada HTML."
+ The component also accepts other HTML input element props.
-## "Entrada de Texto que se ajusta automáticamente"
+## Autosize Text Input
-"Componente de entrada de texto que ajusta automáticamente su altura según el contenido."
+Text input component that automatically adjusts its height based on the content.
-
+
```jsx
import { RecoilRoot } from "recoil";
import { AutosizeTextInput } from "@/ui/input/components/AutosizeTextInput";
@@ -89,25 +89,25 @@ image: '"/images/user-guide/notes/notes_header.png"'
```
-
- | "Props" | Tipo | Descripción |
- | -------------------- | --------- | ---------------------------------------------------------------------------------------- |
- | "onValidate" | "función" | The callback function you want to trigger when the user validates the input |
- | minRows | número | "El número mínimo de filas para el área de texto" |
- | marcador de posición | "cadena" | "El texto de marcador de posición que deseas mostrar cuando el área de texto está vacía" |
- | onFocus | "función" | "La función de retorno que deseas activar cuando el área de texto gana el foco" |
- | variante | "cadena" | "La variante de la entrada." "Las opciones incluyen: `default`, `icon`, y `button`" |
- | buttonTitle | "cadena" | "El título para el botón (solo aplicable para la variante de botón)" |
- | valor | "cadena" | "El valor inicial para el área de texto" |
+
+ | Props | Type | Description |
+ | ----------- | -------- | --------------------------------------------------------------------------- |
+ | onValidate | function | The callback function you want to trigger when the user validates the input |
+ | minRows | number | The minimum number of rows for the text area |
+ | placeholder | string | The placeholder text you want to display when the text area is empty |
+ | onFocus | function | The callback function you want to trigger when the text area gains focus |
+ | variant | string | The variant of the input. Options include: `default`, `icon`, and `button` |
+ | buttonTitle | string | The title for the button (only applicable for the button variant) |
+ | value | string | The initial value for the text area |
-## "Área de Texto"
+## Text Area
-"Te permite crear entradas de texto de varias líneas."
+Allows you to create multi-line text inputs.
-
+
```jsx
import { TextArea } from "@/ui/input/components/TextArea";
@@ -125,13 +125,13 @@ image: '"/images/user-guide/notes/notes_header.png"'
```
-
- | "Props" | Tipo | Descripción |
- | -------------------- | --------- | --------------------------------------------------------------------------- |
- | "desactivado" | booleano | "Indica si el área de texto está desactivada" |
- | minRows | número | "Número mínimo de filas visibles para el área de texto." |
- | "onChange" | "función" | Función de llamada activada cuando cambia el contenido del área de texto. |
- | marcador de posición | cadena | Texto del marcador de posición mostrado cuando el área de texto está vacía. |
- | valor | cadena | El valor actual del área de texto. |
+
+ | Props | Type | Description |
+ | ----------- | -------- | -------------------------------------------------------------- |
+ | disabled | boolean | Indicates whether the text area is disabled |
+ | minRows | number | Minimum number of visible rows for the text area. |
+ | onChange | function | Callback function triggered when the text area content changes |
+ | placeholder | string | Placeholder text displayed when the text area is empty |
+ | value | string | The current value of the text area |
diff --git a/packages/twenty-docs/l/es/twenty-ui/input/toggle.mdx b/packages/twenty-docs/l/es/twenty-ui/input/toggle.mdx
index 26abf5b35b..39f1645abd 100644
--- a/packages/twenty-docs/l/es/twenty-ui/input/toggle.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/input/toggle.mdx
@@ -1,14 +1,14 @@
---
-title: Cambiar
+title: Toggle
image: /images/user-guide/table-views/table.png
---
-
+
-
+
```jsx
import { Toggle } from "twenty-ui/input";
@@ -25,12 +25,12 @@ image: /images/user-guide/table-views/table.png
```
-
- | "Props" | Tipo | Descripción | Predeterminado |
- | --------------- | -------- | ----------------------------------------------------------------------------------------------- | -------------- |
- | valor | booleano | The current state of the toggle | `falso` |
- | "onChange" | función | Callback function triggered when the toggle state changes | |
- | color | cadena | Color of the toggle when it\ | s blue color |
- | tamañoConmutado | cadena | Size of the toggle, affecting both height and weight. Tiene dos opciones: `pequeño` y `mediano` | mediano |
+
+ | Props | Type | Description | Default |
+ | ---------- | -------- | ------------------------------------------------------------------------------------------- | ------------ |
+ | value | boolean | The current state of the toggle | `false` |
+ | onChange | function | Callback function triggered when the toggle state changes | |
+ | color | string | Color of the toggle when it\ | s blue color |
+ | toggleSize | string | Size of the toggle, affecting both height and weight. Has two options: `small` and `medium` | medium |
diff --git a/packages/twenty-docs/l/es/twenty-ui/introduction.mdx b/packages/twenty-docs/l/es/twenty-ui/introduction.mdx
index 26fa6a0704..bb7bec7ea8 100644
--- a/packages/twenty-docs/l/es/twenty-ui/introduction.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/introduction.mdx
@@ -1,11 +1,11 @@
---
-title: Resumen
-description: Biblioteca de componentes para Twenty CRM
+title: Overview
+description: Component library for Twenty CRM
---
import { CardTitle } from "/snippets/card-title.mdx"
-## Componentes
+## Components
diff --git a/packages/twenty-docs/l/es/twenty-ui/navigation.mdx b/packages/twenty-docs/l/es/twenty-ui/navigation.mdx
index d604ffba0c..b17dad4220 100644
--- a/packages/twenty-docs/l/es/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/navigation.mdx
@@ -1,8 +1,8 @@
---
-title: Navegación
+title: Navigation
image: /images/user-guide/tasks/tasks_header.png
---
-
+
diff --git a/packages/twenty-docs/l/es/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/es/twenty-ui/navigation/breadcrumb.mdx
index bf908a95df..aadbee8ee4 100644
--- a/packages/twenty-docs/l/es/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/navigation/breadcrumb.mdx
@@ -1,26 +1,26 @@
---
-title: Migaja de pan
+title: Breadcrumb
image: /images/user-guide/fields/field.png
---
-
+
-Renderiza una barra de navegación de migas de pan.
+Renders a breadcrumb navigation bar.
-
+
```jsx
import { BrowserRouter } from "react-router-dom";
import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
export const MyComponent = () => {
const breadcrumbLinks = [
- { children: "Inicio", href: "/" },
- { children: "Categoría", href: "/category" },
- { children: "Subcategoría", href: "/category/subcategory" },
- { children: "Página Actual" },
+ { children: "Home", href: "/" },
+ { children: "Category", href: "/category" },
+ { children: "Subcategory", href: "/category/subcategory" },
+ { children: "Current Page" },
];
return (
@@ -33,9 +33,9 @@ Renderiza una barra de navegación de migas de pan.
- | Props | Tipo | Descripción |
- | ------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
- | nombreDeClase | cadena | Nombre de clase opcional para estilos adicionales |
- | enlaces | matriz | An array of objects, each representing a breadcrumb link. Cada objeto tiene una propiedad `children` (el contenido de texto del enlace) y una propiedad `href` opcional (la URL a la que navegar cuando se hace clic en el enlace) |
+ | Props | Type | Description |
+ | --------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional class name for additional styling |
+ | links | array | An array of objects, each representing a breadcrumb link. Each object has a `children` property (the text content of the link) and an optional `href` property (the URL to navigate to when the link is clicked) |
diff --git a/packages/twenty-docs/l/es/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/es/twenty-ui/navigation/links.mdx
index 03e007339a..e9f7e3d80f 100644
--- a/packages/twenty-docs/l/es/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/navigation/links.mdx
@@ -1,18 +1,18 @@
---
-title: Enlaces
+title: Links
image: /images/user-guide/what-is-twenty/20.png
---
-
+
-## Enlace de Contacto
+## Contact Link
-Un componente de enlace estilizado para mostrar información de contacto.
+A stylized link component for displaying contact information.
-
+
```jsx
import { BrowserRouter as Router } from 'react-router-dom';
@@ -20,7 +20,7 @@ Un componente de enlace estilizado para mostrar información de contacto.
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log('¡Enlace de contacto pulsado!', event);
+ console.log('Contact link clicked!', event);
};
return (
@@ -38,71 +38,72 @@ Un componente de enlace estilizado para mostrar información de contacto.
```
-
- | "Props" | Tipo | Descripción |
- | ----------- | ----------------- | ------------------------------------------------------------------------------- |
- | "className" | string | "Nombre opcional para estilización adicional" |
- | href | string | La URL o ruta objetivo del enlace |
- | onClick | "función" | Función de devolución de llamada que se activa cuando se hace clic en el enlace |
- | hijos | `React.ReactNode` | El contenido que se mostrará dentro del enlace |
+
+ | Props | Type | Description |
+ | --------- | ----------------- | ---------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | href | string | The target URL or path for the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
-## Enlace Sin Estilo
+## Raw Link
-Un componente de enlace estilizado para mostrar enlaces.
+A stylized link component for displaying links.
-
+
```jsx
import { RawLink } from "/navigation";
import { BrowserRouter as Router } from "react-router-dom";
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log("¡Enlace de contacto pulsado!", event);
+ console.log("Contact link clicked!", event);
};
return (
- Contáctanos
+ Contact Us
);
};
+
```
-
- | "Props" | Tipo | Descripción |
- | ------------- | ----------------- | ------------------------------------------------------------------------------- |
- | nombreDeClase | string | Nombre opcional para estilo adicional |
- | href | string | La URL o ruta objetivo del enlace |
- | onClick | función | Función de devolución de llamada que se activa cuando se hace clic en el enlace |
- | hijos | `React.ReactNode` | El contenido que se mostrará dentro del enlace |
+
+ | Props | Type | Description |
+ | --------- | ----------------- | ---------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | href | string | The target URL or path for the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
-## Enlace Redondeado
+## Rounded Link
-Un enlace de estilo redondeado con un componente Chip para enlaces.
+A rounded-styled link with a Chip component for links.
-
+
```jsx
import { RoundedLink } from "/navigation";
import { BrowserRouter as Router } from "react-router-dom";
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log("¡Enlace de contacto pulsado!", event);
+ console.log("Contact link clicked!", event);
};
return (
- Contáctanos
+ Contact Us
);
@@ -110,21 +111,21 @@ Un enlace de estilo redondeado con un componente Chip para enlaces.
```
-
- | "Props" | Tipo | Descripción |
- | ------- | ----------------- | ------------------------------------------------------------------------------- |
- | href | cadena | La URL o ruta objetivo del enlace |
- | hijos | `React.ReactNode` | El contenido que se mostrará dentro del enlace |
- | onClick | "función" | Función de devolución de llamada que se activa cuando se hace clic en el enlace |
+
+ | Props | Type | Description |
+ | -------- | ----------------- | ---------------------------------------------------------- |
+ | href | string | The target URL or path for the link |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
-## Enlace Social
+## Social Link
-Enlaces sociales estilizados, con soporte para varios tipos de enlaces sociales, como URLs, LinkedIn y X (o Twitter).
+Stylized social links, with support for various social link types, such as URLs, LinkedIn, and X (or Twitter).
-
+
```jsx
import { SocialLink } from "twenty-ui/navigation";
import { BrowserRouter as Router } from "react-router-dom";
@@ -143,11 +144,11 @@ Enlaces sociales estilizados, con soporte para varios tipos de enlaces sociales,
- | Props | Tipo | Descripción |
- | ------- | ----------------- | ---------------------------------------------------------------------------------- |
- | href | string | La URL o ruta objetivo del enlace |
- | hijos | `React.ReactNode` | El contenido que se mostrará dentro del enlace |
- | tipo | string | El tipo de enlaces sociales. Las opciones incluyen: `url`, `LinkedIn`, y `Twitter` |
- | onClick | función | Función de devolución de llamada que se activa cuando se hace clic en el enlace |
+ | Props | Type | Description |
+ | -------- | ----------------- | --------------------------------------------------------------------------- |
+ | href | string | The target URL or path for the link |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
+ | type | string | The type of social links. Options include: `url`, `LinkedIn`, and `Twitter` |
+ | onClick | function | Callback function to be triggered when the link is clicked |
diff --git a/packages/twenty-docs/l/es/twenty-ui/navigation/menu-item.mdx b/packages/twenty-docs/l/es/twenty-ui/navigation/menu-item.mdx
index a8aafdc7d5..209c6270ea 100644
--- a/packages/twenty-docs/l/es/twenty-ui/navigation/menu-item.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/navigation/menu-item.mdx
@@ -1,16 +1,16 @@
---
-title: Elemento del menú
+title: Menu Item
image: /images/user-guide/kanban-views/kanban.png
---
-
+
-Un elemento de menú versátil diseñado para ser utilizado en un menú o lista de navegación.
+A versatile menu item designed to be used in a menu or navigation list.
-
+
```jsx
import { IconBell } from "@tabler/icons-react";
import { IconAlertCircle } from "@tabler/icons-react";
@@ -18,18 +18,18 @@ Un elemento de menú versátil diseñado para ser utilizado en un menú o lista
export const MyComponent = () => {
const handleMenuItemClick = (event) => {
- console.log("¡Elemento de menú clicado!", event);
+ console.log("Menu item clicked!", event);
};
const handleButtonClick = (event) => {
- console.log("¡Botón de icono clicado!", event);
+ console.log("Icon button clicked!", event);
};
return (
- | Props | Tipo | Descripción |
- | -------------- | ----------------- | --------------------------------------------------------------------------------------------------------------- |
- | IconoIzquierdo | "ComponenteIcono" | Un icono izquierdo opcional que se muestra antes del texto en el elemento de menú |
- | acento | cadena | Especifica el color de acento del elemento de menú. Las opciones incluyen: `default`, `danger`, y `placeholder` |
- | texto | cadena | El contenido de texto del elemento de menú |
- | iconButtons | array | An array of objects representing additional icon buttons associated with the menu item |
- | isToolTipOpen | booleano | Controls the visibility of the tooltip associated with the menu item |
- | testId | cadena | El atributo data-testid para propósitos de prueba |
- | alHacerClic | función | Callback function triggered when the menu item is clicked |
- | nombreDeClase | cadena | Nombre opcional para el estilo adicional |
+ | Props | Type | Description |
+ | ------------- | ------------- | ---------------------------------------------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | accent | string | Specifies the accent color of the menu item. Options include: `default`, `danger`, and `placeholder` |
+ | text | string | The text content of the menu item |
+ | iconButtons | array | An array of objects representing additional icon buttons associated with the menu item |
+ | isTooltipOpen | boolean | Controls the visibility of the tooltip associated with the menu item |
+ | testId | string | The data-testid attribute for testing purposes |
+ | onClick | function | Callback function triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
-## Variantes
+## Variants
-Las diferentes variantes del componente de elemento de menú incluyen las siguientes:
+The different variants of the menu item component include the following:
-### Comando
+### Command
-Un elemento de menú estilo comando en un menú para indicar atajos de teclado.
+A command-style menu item within a menu to indicate keyboard shortcuts.
-
+
```jsx
import { IconBell } from "@tabler/icons-react";
import { MenuItemCommand } from "twenty-ui/display";
- export const MiComponente = () => {
- const manejarClicDeComando = () => {
- console.log("¡Comando clicado!");
+ export const MyComponent = () => {
+ const handleCommandClick = () => {
+ console.log("Command clicked!");
};
return (
);
@@ -90,32 +90,32 @@ Un elemento de menú estilo comando en un menú para indicar atajos de teclado.
- | Props | Tipo | Descripción |
- | -------------- | ------------- | ---------------------------------------------------------------------------------- |
- | IconoIzquierdo | IconComponent | Un icono izquierdo opcional que se muestra antes del texto en el elemento del menú |
- | texto | "cadena" | El contenido de texto del elemento del menú |
- | firstHotKey | cadena | El primer atajo de teclado asociado con el comando |
- | secondHotKey | cadena | El segundo atajo de teclado asociado con el comando |
- | isSelected | booleano | Indica si el elemento del menú está seleccionado o resaltado |
- | alHacerClic | función | Callback function triggered when the menu item is clicked |
- | nombreDeClase | cadena | Nombre opcional para estilo adicional |
+ | Props | Type | Description |
+ | ------------ | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | firstHotKey | string | The first keyboard shortcut associated with the command |
+ | secondHotKey | string | The second keyboard shortcut associated with the command |
+ | isSelected | boolean | Indicates whether the menu item is selected or highlighted |
+ | onClick | function | Callback function triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
### Draggable
-Un componente de elemento de menú arrastrable diseñado para ser utilizado en un menú o lista donde los elementos se pueden arrastrar y se pueden realizar acciones adicionales a través de botones de iconos.
+A draggable menu item component designed to be used in a menu or list where items can be dragged, and additional actions can be performed through icon buttons.
-
+
```jsx
import { IconBell } from "@tabler/icons-react";
import { IconAlertCircle } from "@tabler/icons-react";
import { MenuItemDraggable } from "twenty-ui/display";
- export const MiComponente = () => {
- const manejarClicDeElementoDeMenú = (event) => {
- console.log("¡Elemento del menú clicado!", event);
+ export const MyComponent = () => {
+ const handleMenuItemClick = (event) => {
+ console.log("Menu item clicked!", event);
};
return (
@@ -124,8 +124,8 @@ Un componente de elemento de menú arrastrable diseñado para ser utilizado en u
accent="default"
iconButtons={[{ Icon: IconAlertCircle, onClick: handleButtonClick }]}
isTooltipOpen={false}
- onClick={manejarClicDeElementoDeMenú}
- text="Elemento del menú arrastrable"
+ onClick={handleMenuItemClick}
+ text="Menu item draggable"
isDragDisabled={false}
className
/>
@@ -134,36 +134,36 @@ Un componente de elemento de menú arrastrable diseñado para ser utilizado en u
```
-
- | Propiedades | Tipo | Descripción |
- | -------------- | ------------- | --------------------------------------------------------------------------------------- |
- | IconoIzquierdo | IconComponent | Un icono izquierdo opcional que se muestra antes del texto en el elemento del menú |
- | accent | cadena | El color de acento del elemento del menú. Puede ser `default`, `placeholder` y `danger` |
- | iconButtons | matriz | An array of objects representing additional icon buttons associated with the menu item |
- | isTooltipOpen | booleano | Controls the visibility of the tooltip associated with the menu item |
- | alHacerClic | función | Función de devolución de llamada para activar cuando se haga clic en el enlace |
- | texto | cadena | El contenido de texto del elemento del menú |
- | isDragDisabled | booleano | Indica si el arrastre está desactivado |
- | nombreDeClase | cadena | Nombre opcional para estilo adicional |
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ------------------------------------------------------------------------------------------ |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | accent | string | The accent color of the menu item. It can either be `default`, `placeholder`, and `danger` |
+ | iconButtons | array | An array of objects representing additional icon buttons associated with the menu item |
+ | isTooltipOpen | boolean | Controls the visibility of the tooltip associated with the menu item |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | text | string | The text content of the menu item |
+ | isDragDisabled | boolean | Indicates whether dragging is disabled |
+ | className | string | Optional name for additional styling |
-### Multi Selección
+### Multi Select
-Proporciona una manera para implementar la funcionalidad de selección múltiple con una casilla de verificación asociada.
+Provides a way to implement multi-select functionality with an associated checkbox.
-
+
```jsx
import { IconBell } from "@tabler/icons-react";
import { MenuItemMultiSelect } from "twenty-ui/display";
- export const MiComponente = () => {
+ export const MyComponent = () => {
return (
@@ -173,33 +173,33 @@ Proporciona una manera para implementar la funcionalidad de selección múltiple
- | Props | Tipo | Descripción |
- | -------------- | ------------- | ----------------------------------------------------------------------------------------------- |
- | LeftIcon | IconComponent | Un icono opcional a la izquierda mostrado antes del texto en el elemento del menú |
- | texto | cadena | El contenido de texto del elemento del menú |
- | selected | booleano | Indica si el elemento del menú está seleccionado (marcado) |
- | onSelectChange | función | Función de devolución de llamada activada cuando el estado de la casilla de verificación cambia |
- | nombreDeClase | cadena | Nombre opcional para estilo adicional |
+ | Props | Type | Description |
+ | -------------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | onSelectChange | function | Callback function triggered when the checkbox state changes |
+ | className | string | Optional name for additional styling |
-### Multi Selección con Avatar
+### Multi Select Avatar
-Un elemento de menú de selección múltiple con un avatar, una casilla para selección y contenido textual.
+A multi-select menu item with an avatar, a checkbox for selection, and textual content.
-
+
```jsx
import { MenuItemMultiSelectAvatar } from "twenty-ui/display";
- export const MiComponente = () => {
+ export const MyComponent = () => {
const imageUrl =
"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
return (
}
- text="Primera Opción"
+ text="First Option"
selected={false}
className
/>
@@ -208,37 +208,37 @@ Un elemento de menú de selección múltiple con un avatar, una casilla para sel
```
-
- | Propiedades | Tipo | Descripción |
- | -------------- | ----------- | ----------------------------------------------------------------------------------------------- |
- | avatar | `ReactNode` | El avatar o icono que se mostrará en el lado izquierdo del elemento del menú |
- | texto | cadena | El contenido de texto del elemento del menú |
- | selected | booleano | Indica si el elemento del menú está seleccionado (marcado) |
- | onSelectChange | función | Función de devolución de llamada activada cuando el estado de la casilla de verificación cambia |
- | nombreDeClase | cadena | Nombre opcional para estilo adicional |
+
+ | Props | Type | Description |
+ | -------------- | ----------- | -------------------------------------------------------------------- |
+ | avatar | `ReactNode` | The avatar or icon to be displayed on the left side of the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | onSelectChange | function | Callback function triggered when the checkbox state changes |
+ | className | string | Optional name for additional styling |
-### Navegar
+### Navigate
-Un elemento de menú que presenta un icono opcional a la izquierda, contenido textual y un icono de chevron a la derecha.
+A menu item featuring an optional left icon, textual content, and a right-chevron icon.
-
+
```jsx
import { IconBell } from "@tabler/icons-react";
import { MenuItemNavigate } from "twenty-ui/display";
- export const MiComponente = () => {
- const manejarNavegación = () => {
- console.log("Navegar a otra página");
+ export const MyComponent = () => {
+ const handleNavigation = () => {
+ console.log("Navigate to another page");
};
return (
);
@@ -246,39 +246,39 @@ Un elemento de menú que presenta un icono opcional a la izquierda, contenido te
```
-
- | Propiedades | Tipo | Descripción |
- | ------------- | ------------- | ---------------------------------------------------------------------------------------------- |
- | LeftIcon | IconComponent | Un icono opcional a la izquierda mostrado antes del texto en el elemento del menú |
- | texto | cadena | El contenido de texto del elemento del menú |
- | enClic | función | Función de devolución de llamada para ser activada cuando se haga clic en el elemento del menú |
- | nombreDeClase | cadena | Nombre opcional para estilo adicional |
+
+ | Props | Type | Description |
+ | --------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
-### Seleccionar
+### Select
-Un elemento de menú seleccionable, que presenta contenido opcional a la izquierda (icono y texto) y un indicador (icono de verificación) para el estado seleccionado.
+A selectable menu item, featuring optional left content (icon and text) and an indicator (check icon) for the selected state.
-
+
```jsx
import { IconBell } from "@tabler/icons-react";
import { MenuItemSelect } from "twenty-ui/display";
- export const MiComponente = () => {
- const manejarSelección = () => {
- console.log("Elemento del menú seleccionado");
+ export const MyComponent = () => {
+ const handleSelection = () => {
+ console.log("Menu item selected");
};
return (
);
@@ -286,25 +286,25 @@ Un elemento de menú seleccionable, que presenta contenido opcional a la izquier
```
-
- | Propiedades | Tipo | Descripción |
- | ------------- | ------------- | ---------------------------------------------------------------------------------------------- |
- | LeftIcon | IconComponent | Un icono opcional a la izquierda mostrado antes del texto en el elemento del menú |
- | texto | cadena | El contenido de texto del elemento del menú |
- | selected | booleano | Indica si el elemento del menú está seleccionado (marcado) |
- | disabled | booleano | Indica si el elemento del menú está desactivado |
- | hovered | booleano | Indica si el elemento del menú está actualmente siendo sobrevolado |
- | enClic | función | Función de devolución de llamada para ser activada cuando se haga clic en el elemento del menú |
- | nombreDeClase | cadena | Nombre opcional para estilo adicional |
+
+ | Props | Type | Description |
+ | --------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
### Select Avatar
-Un elemento de menú seleccionable con un avatar, que presenta contenido opcional a la izquierda (avatar y texto) y un indicador (icono de verificación) para el estado seleccionado.
+A selectable menu item with an avatar, featuring optional left content (avatar and text) and an indicator (check icon) for the selected state.
-
+
```jsx
import { MenuItemSelectAvatar } from "twenty-ui/display";
@@ -313,13 +313,13 @@ Un elemento de menú seleccionable con un avatar, que presenta contenido opciona
"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
const handleSelection = () => {
- console.log("Elemento de menú seleccionado");
+ console.log("Menu item selected");
};
return (
}
- text="Primera Opción"
+ text="First Option"
selected={true}
disabled={false}
hovered={false}
@@ -333,37 +333,37 @@ Un elemento de menú seleccionable con un avatar, que presenta contenido opciona
```
-
- | Propiedades | Tipo | Descripción |
- | ------------- | ----------- | ------------------------------------------------------------------------------ |
- | avatar | `ReactNode` | El avatar o icono que se mostrará en el lado izquierdo del elemento del menú |
- | texto | cadena | El contenido de texto del elemento del menú |
- | seleccionado | booleano | Indica si el elemento del menú está seleccionado (marcado) |
- | deshabilitado | booleano | Indica si el elemento del menú está deshabilitado |
- | hovered | booleano | Indica si el elemento del menú está actualmente siendo sobrevolado |
- | idPrueba | cadena | El atributo data-testid para propósitos de prueba |
- | enClic | función | Función de retorno que se activará cuando se haga clic en el elemento del menú |
- | nombreDeClase | cadena | Nombre opcional para estilo adicional |
+
+ | Props | Type | Description |
+ | --------- | ----------- | -------------------------------------------------------------------- |
+ | avatar | `ReactNode` | The avatar or icon to be displayed on the left side of the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | testId | string | The data-testid attribute for testing purposes |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
-### Seleccionar Color
+### Select Color
-Un elemento de menú seleccionable con una muestra de color para situaciones donde se desea que los usuarios elijan un color del menú.
+A selectable menu item with a color sample for scenarios where you want users to choose a color from a menu.
-
+
```jsx
- import { MenuItemSelectColor } desde "twenty-ui/display";
+ import { MenuItemSelectColor } from "twenty-ui/display";
export const MyComponent = () => {
const handleSelection = () => {
- console.log("Elemento de menú seleccionado");
+ console.log("Menu item selected");
};
return (
-
- | Propiedades | Tipo | Descripción |
- | ------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
- | color | cadena | The theme color to be displayed as a sample in the menu item. Las opciones incluyen: `verde`, `turquesa`, `cielo`, `azul`, `púrpura`, `rosa`, `rojo`, `naranja`, `amarillo`, `gris` |
- | seleccionado | booleano | Indica si el elemento del menú está seleccionado (marcado) |
- | deshabilitado | booleano | Indica si el elemento del menú está deshabilitado |
- | hovered | booleano | Indica si el elemento del menú está actualmente siendo sobrevolado |
- | variante | cadena | La variante de la muestra de color. Puede ser `default` o `pipeline` |
- | enClic | función | Función de retorno que se activará cuando se haga clic en el elemento del menú |
- | nombreDeClase | cadena | Nombre opcional para estilo adicional |
+
+ | Props | Type | Description |
+ | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | color | string | The theme color to be displayed as a sample in the menu item. Options include: `green`, `turquoise`, `sky`, `blue`, `purple`, `pink`, `red`, `orange`, `yellow`, and `gray` |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | variant | string | The variant of the color sample. It can either be `default` or `pipeline` |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
-### Conmutar
+### Toggle
-Un elemento de menú con un interruptor de palanca asociado para permitir a los usuarios habilitar o deshabilitar una característica específica
+A menu item with an associated toggle switch to allow users to enable or disable a specific feature
-
+
```jsx
import { IconBell } from '@tabler/icons-react';
@@ -405,7 +405,7 @@ Un elemento de menú con un interruptor de palanca asociado para permitir a los
return (
-
- | Propiedades | Tipo | Descripción |
- | --------------- | --------------- | ----------------------------------------------------------------------------------- |
- | IconoIzquierdo | ComponenteIcono | Un icono izquierdo opcional que se muestra antes del texto en el elemento del menú |
- | texto | cadena | El contenido de texto del elemento del menú |
- | conmutado | booleano | Indica si el interruptor de palanca está en el estado "encendido" o "apagado" |
- | cambioConmutado | función | Función de retorno que se activa cuando el estado del interruptor de palanca cambia |
- | tamañoConmutado | cadena | El tamaño del interruptor de palanca. It can be either \ |
- | nombreDeClase | cadena | Nombre opcional para estilo adicional |
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ----------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | toggled | boolean | Indicates whether the toggle switch is in the "on" or "off" state |
+ | onToggleChange | function | Callback function triggered when the toggle switch state changes |
+ | toggleSize | string | The size of the toggle switch. It can be either \ |
+ | className | string | Optional name for additional styling |
diff --git a/packages/twenty-docs/l/es/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/es/twenty-ui/navigation/navigation-bar.mdx
index 191b6504f7..a77e9f34e6 100644
--- a/packages/twenty-docs/l/es/twenty-ui/navigation/navigation-bar.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/navigation/navigation-bar.mdx
@@ -1,16 +1,16 @@
---
-title: Barra de navegación
+title: Navigation Bar
image: /images/user-guide/table-views/table.png
---
-
+
-Renderiza una barra de navegación que contiene varios componentes `NavigationBarItem`.
+Renders a navigation bar that contains multiple `NavigationBarItem` components.
-
+
```jsx
import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
@@ -41,9 +41,9 @@ Renderiza una barra de navegación que contiene varios componentes `NavigationBa
- | Props | Tipo | Descripción |
- | ----------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
- | nombreDelElementoActivo | cadena | El nombre del elemento de navegación actualmente activo |
- | elementos | matriz | Una matriz de objetos que representan cada elemento de navegación. Cada objeto contiene el `nombre` del elemento, el componente `Icono` a mostrar y una función `cuandoHagaClick` que se llamará al hacer clic en el elemento |
+ | Props | Type | Description |
+ | -------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | activeItemName | string | The name of the currently active navigation item |
+ | items | array | An array of objects representing each navigation item. Each object contains the `name` of the item, the `Icon` component to display, and an `onClick` function to be called when the item is clicked |
diff --git a/packages/twenty-docs/l/es/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/es/twenty-ui/navigation/step-bar.mdx
index 80fc8c89e4..66c420f561 100644
--- a/packages/twenty-docs/l/es/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/navigation/step-bar.mdx
@@ -1,25 +1,25 @@
---
-title: Barra de Paso
+title: Step Bar
image: /images/user-guide/api/api.png
---
-
+
-Muestra el progreso a través de una secuencia de pasos numerados resaltando el paso activo. Renderiza un contenedor con pasos, cada uno representado por el componente `Step`.
+Displays progress through a sequence of numbered steps by highlighting the active step. It renders a container with steps, each represented by the `Step` component.
-
+
```jsx
import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
export const MyComponent = () => {
return (
- Paso 1
- Paso 2
- Paso 3
+ Step 1
+ Step 2
+ Step 3
);
};
@@ -27,8 +27,8 @@ Muestra el progreso a través de una secuencia de pasos numerados resaltando el
- | Props | Tipo | Descripción |
- | ---------- | ------ | ------------------------------------------------------------------------------------------ |
- | activeStep | número | El índice del paso actualmente activo. Esto determina qué paso debe resaltarse visualmente |
+ | Props | Type | Description |
+ | ---------- | ------ | ------------------------------------------------------------------------------------------------- |
+ | activeStep | number | The index of the currently active step. This determines which step should be visually highlighted |
diff --git a/packages/twenty-docs/l/es/twenty-ui/progress-bar.mdx b/packages/twenty-docs/l/es/twenty-ui/progress-bar.mdx
index 87c450d275..2e4735ab30 100644
--- a/packages/twenty-docs/l/es/twenty-ui/progress-bar.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/progress-bar.mdx
@@ -1,16 +1,16 @@
---
-title: Retroalimentación
+title: Feedback
image: /images/user-guide/emails/emails_header.png
---
-
+
-Indica el progreso o la cuenta regresiva y se mueve de derecha a izquierda.
+Indicates progress or countdown and moves from right to left.
-
+
```jsx
import { ProgressBar } from "twenty-ui/feedback";
@@ -30,23 +30,23 @@ Indica el progreso o la cuenta regresiva y se mueve de derecha a izquierda.
- | Props | Tipo | Descripción | Predeterminado |
- | ---------------- | -------- | --------------------------------------------------------------------------------------------------------- | -------------- |
- | duración | número | La duración total de la animación de la barra de progreso en milisegundos | 3 |
- | retraso | número | El retraso en el inicio de la animación de la barra de progreso en milisegundos | 0 |
- | aceleración | cadena | Función de aceleración para la animación de la barra de progreso | easeInOut |
- | alturaDeBarra | número | La altura de la barra en píxeles | 24 |
- | colorDeBarra | cadena | El color de la barra | gray80 |
- | inicioAutomático | booleano | Si es `true`, la animación de la barra de progreso comienza automáticamente cuando el componente se monta | `verdadero` |
+ | Props | Type | Description | Default |
+ | --------- | ------- | ------------------------------------------------------------------------------------ | --------- |
+ | duration | number | The total duration of the progress bar animation in milliseconds | 3 |
+ | delay | number | The delay in starting the progress bar animation in milliseconds | 0 |
+ | easing | string | Easing function for the progress bar animation | easeInOut |
+ | barHeight | number | The height of the bar in pixels | 24 |
+ | barColor | string | The color of the bar | gray80 |
+ | autoStart | boolean | If `true`, the progress bar animation starts automatically when the component mounts | `true` |
-## Barra de Progreso Circular
+## Circular Progress Bar
-Indica el progreso de una tarea, a menudo se usa en pantallas de carga o áreas donde se desea comunicar procesos en curso al usuario.
+Indicates the progress of a task, often used in loading screens or areas where you want to communicate ongoing processes to the user.
-
+
```jsx
import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
@@ -57,10 +57,10 @@ Indica el progreso de una tarea, a menudo se usa en pantallas de carga o áreas
- | Props | Tipo | Descripción | Predeterminado |
- | ------------ | ------ | -------------------------------------------- | -------------- |
- | tamaño | número | El tamaño de la barra de progreso circular | 50 |
- | anchoDeBarra | número | El ancho de la línea de la barra de progreso | 5 |
- | colorDeBarra | cadena | El color de la barra de progreso | currentColor |
+ | Props | Type | Description | Default |
+ | -------- | ------ | ------------------------------------- | ------------ |
+ | size | number | The size of the circular progress bar | 50 |
+ | barWidth | number | The width of the progress bar line | 5 |
+ | barColor | string | The color of the progress bar | currentColor |
diff --git a/packages/twenty-docs/l/es/user-guide/ai/capabilities/ai-agents.mdx b/packages/twenty-docs/l/es/user-guide/ai/capabilities/ai-agents.mdx
index f624db4b90..4bb94d05c4 100644
--- a/packages/twenty-docs/l/es/user-guide/ai/capabilities/ai-agents.mdx
+++ b/packages/twenty-docs/l/es/user-guide/ai/capabilities/ai-agents.mdx
@@ -7,13 +7,13 @@ description: Integrate AI capabilities directly into your automation workflows.
This feature is in development and will be available in beta soon.
-## Resumen
+## Overview
Integrate AI capabilities directly into your automation workflows for intelligent data processing and decision-making.
## Capabilities
-| Feature | Descripción |
+| Feature | Description |
| ------------------- | ------------------------------------------------ |
| **AI actions** | Add AI-powered steps to any workflow |
| **Data enrichment** | Automatically enhance records with external data |
diff --git a/packages/twenty-docs/l/es/user-guide/ai/capabilities/ai-chatbot.mdx b/packages/twenty-docs/l/es/user-guide/ai/capabilities/ai-chatbot.mdx
index 5bac35365f..d7cbbc04fc 100644
--- a/packages/twenty-docs/l/es/user-guide/ai/capabilities/ai-chatbot.mdx
+++ b/packages/twenty-docs/l/es/user-guide/ai/capabilities/ai-chatbot.mdx
@@ -7,13 +7,13 @@ description: An intelligent assistant that helps you interact with your CRM data
This feature is in development and will be available in beta soon.
-## Resumen
+## Overview
An intelligent assistant that helps you interact with your CRM data using natural language.
## Capabilities
-| Feature | Descripción |
+| Feature | Description |
| ---------------------------- | ------------------------------------------------------------------------- |
| **Natural language queries** | Ask questions in plain English instead of building filters |
| **Full data access** | Query records, relationships, and metrics across your workspace |
diff --git a/packages/twenty-docs/l/es/user-guide/ai/capabilities/permissions-access-control.mdx b/packages/twenty-docs/l/es/user-guide/ai/capabilities/permissions-access-control.mdx
index d007828250..9684098eb3 100644
--- a/packages/twenty-docs/l/es/user-guide/ai/capabilities/permissions-access-control.mdx
+++ b/packages/twenty-docs/l/es/user-guide/ai/capabilities/permissions-access-control.mdx
@@ -1,35 +1,35 @@
---
-title: Permisos y control de acceso
-description: Controla a qué pueden acceder y qué pueden modificar los agentes de IA en tu espacio de trabajo.
+title: Permissions & Access Control
+description: Control what AI agents can access and modify in your workspace.
---
-## Resumen
+## Overview
-Los agentes de IA respetan tu estructura de permisos existente. Esto es especialmente importante para los equipos que desean controlar exactamente a qué pueden acceder o qué pueden modificar los procesos de IA automatizados en su espacio de trabajo.
+AI agents respect your existing permission structure. This is particularly important for teams who want to control exactly what automated AI processes can access or modify in their workspace.
-## Asignar un rol a un agente de IA
+## Assign a Role to an AI Agent
-1. Ir a **Ajustes → Roles**
-2. Haz clic en el rol que deseas asignar
-3. Abre la pestaña **Asignación**
-4. En **Agentes de IA**, haz clic en **+ Asignar a agente de IA**
-5. Selecciona el agente de IA de la lista
-6. Confirma la asignación
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **AI Agents**, click **+ Assign to AI agent**
+5. Select the AI agent from the list
+6. Confirm the assignment
-## ¿Por qué asignar roles a los agentes de IA?
+## Why Assign Roles to AI Agents?
-| Beneficio | Descripción |
-| ----------------- | --------------------------------------------------------------- |
-| **Seguridad** | Limita a qué datos pueden acceder o modificar los agentes de IA |
-| **Cumplimiento** | Garantiza que la IA solo procese los datos que necesita |
-| **Control** | Evita acciones no deseadas de las automatizaciones de IA |
-| **Auditabilidad** | Haz un seguimiento de qué acciones realizó cada agente |
+| Benefit | Description |
+| ---------------- | ------------------------------------------------- |
+| **Security** | Limit what data AI agents can access or modify |
+| **Compliance** | Ensure AI only processes the data it needs |
+| **Control** | Prevent unintended actions from AI automations |
+| **Auditability** | Track which actions were performed by which agent |
- Para los agentes de IA que se ejecutan dentro de flujos de trabajo, la asignación de roles garantiza que el agente no pueda acceder ni modificar datos fuera de su ámbito previsto—incluso si el flujo de trabajo tiene permisos más amplios.
+ For AI agents running within workflows, role assignment ensures the agent cannot access or modify data outside its intended scope—even if the workflow has broader permissions.
-## Relacionado
+## Related
-* [Permisos](/l/es/user-guide/permissions-access/capabilities/permissions) — información detallada sobre la creación y gestión de roles
-* [Agentes de IA](/l/es/user-guide/ai/capabilities/ai-agents) — capacidades de IA en flujos de trabajo
+* [Permissions](/l/es/user-guide/permissions-access/capabilities/permissions) — detailed information on creating and managing roles
+* [AI Agents](/l/es/user-guide/ai/capabilities/ai-agents) — AI capabilities in workflows
diff --git a/packages/twenty-docs/l/es/user-guide/ai/overview.mdx b/packages/twenty-docs/l/es/user-guide/ai/overview.mdx
index c1c467099e..bd4ee68a79 100644
--- a/packages/twenty-docs/l/es/user-guide/ai/overview.mdx
+++ b/packages/twenty-docs/l/es/user-guide/ai/overview.mdx
@@ -1,13 +1,13 @@
---
-title: IA
+title: AI
description: AI-powered features coming soon to Twenty.
---
-
+
-## Lo que Viene
+## What's Coming
Twenty is building AI capabilities to help your team work smarter. We're focusing on two major areas:
@@ -37,7 +37,7 @@ Extend your workflows with AI-powered actions and autonomous agents.
* **Autonomous agents**: Let agents execute multi-step tasks within a workflow
* **Custom prompts**: Define exactly how AI should process your data
-**Casos de uso:**
+**Use cases:**
* Automatically categorize inbound leads
* Enrich company data from public sources
@@ -54,7 +54,7 @@ AI agents will be managed through the existing permissions system:
This ensures AI agents respect your data governance policies and only access what they need.
-## Manténgase Actualizado
+## Stay Updated
We'll update this section as AI features become available. In the meantime:
diff --git a/packages/twenty-docs/l/es/user-guide/billing/capabilities/pricing-plans.mdx b/packages/twenty-docs/l/es/user-guide/billing/capabilities/pricing-plans.mdx
index 1de0d238e1..90bf7e7cbb 100644
--- a/packages/twenty-docs/l/es/user-guide/billing/capabilities/pricing-plans.mdx
+++ b/packages/twenty-docs/l/es/user-guide/billing/capabilities/pricing-plans.mdx
@@ -1,79 +1,79 @@
---
-title: Planes de precios},{
-description: Obtén información sobre los planes de precios de Twenty y cómo cambiar entre ellos.
+title: Pricing Plans
+description: Learn about Twenty's pricing plans and how to switch between them.
---
-## Resumen
+## Overview
-Twenty ofrece precios flexibles para adaptarse a equipos de todos los tamaños, tanto si prefieres alojamiento en la nube como autoalojamiento.
+Twenty offers flexible pricing to fit teams of all sizes, whether you prefer cloud hosting or self-hosting.
-## Planes en la nube
+## Cloud Plans
-### Pro (Nube)
+### Pro (Cloud)
-Para equipos listos para escalar:
+For teams ready to scale:
-* Todas las funciones principales de CRM
-* Sincronización de correo electrónico y calendario
-* Flujos de trabajo y automatizaciones
-* Soporte estándar
+* All core CRM features
+* Email and calendar sync
+* Workflows and automations
+* Standard support
- Las funciones premium (SSO y permisos a nivel de fila) no están incluidas en el plan Pro.
+ Premium features (SSO and row-level permissions) are not included in the Pro plan.
-### Organización (Nube)
+### Organization (Cloud)
-Para equipos más grandes con necesidades avanzadas:
+For larger teams with advanced needs:
-* Todo lo de Pro
-* **Funciones premium**: integración de SSO y permisos a nivel de fila
-* Soporte prioritario
+* Everything in Pro
+* **Premium features**: SSO integration and row-level permissions
+* Priority support
-## Planes de autoalojamiento
+## Self-Hosted Plans
-### Gratis (Autoalojado)
+### Free (Self-Hosted)
-Aloja Twenty en tu propia infraestructura sin costo:
+Host Twenty on your own infrastructure at no cost:
-* Incluye todas las funciones de Pro
-* Soporte de la comunidad a través de Discord
-* Control total sobre tus datos
+* All Pro features included
+* Community support via Discord
+* Full control over your data
-### Organización (Autoalojado)
+### Organization (Self-Hosted)
-Para equipos que necesitan funciones premium mientras se autoalojan:
+For teams who need premium features while self-hosting:
-* Todas las funciones de Pro
-* **Funciones premium**: integración de SSO y permisos a nivel de fila
-* Soporte del equipo de Twenty
-* No es obligatorio publicar el código personalizado como código abierto antes de distribuirlo
+* All Pro features
+* **Premium features**: SSO integration and row-level permissions
+* Twenty team support
+* No requirement to publish custom code as open-source before distributing
-## Funciones premium
+## Premium Features
-Las funciones premium solo están disponibles en los planes de Organización (Nube o Autoalojado):
+Premium features are only available on the Organization plans (Cloud or Self-Hosted):
-* **Integración de SSO**: inicio de sesión único con tu proveedor de identidad
-* **Permisos a nivel de fila**: control de acceso granular a nivel de registro
+* **SSO integration**: Single Sign-On with your identity provider
+* **Row-level permissions**: Fine-grained access control at the record level
-## Cambiar de plan
+## Switching Plans
-### Actualizar a Organización
+### Upgrade to Organization
-1. Ir a **Ajustes → Facturación**
-2. Haz clic en **Cambiar a Organización**
-3. Confirma tu actualización
+1. Go to **Settings → Billing**
+2. Click **Switch to Organization**
+3. Confirm your upgrade
-### Reducir a Pro
+### Downgrade to Pro
-Contacta al equipo de soporte para reducir tu plan.
+Contact support to downgrade your plan.
-### Cambiar a facturación anual
+### Switch to Yearly Billing
-1. Ir a **Ajustes → Facturación**
-2. Haz clic en **Cambiar a anual**
-3. Ahorra con la facturación anual
+1. Go to **Settings → Billing**
+2. Click **Switch to Yearly**
+3. Save with annual billing
-### Cambiar a facturación mensual
+### Switch to Monthly Billing
-Contacta al equipo de soporte para volver a la facturación mensual.
+Contact support to switch back to monthly billing.
diff --git a/packages/twenty-docs/l/es/user-guide/billing/capabilities/workflow-credits.mdx b/packages/twenty-docs/l/es/user-guide/billing/capabilities/workflow-credits.mdx
index f4691c1ab1..0ce8e3be72 100644
--- a/packages/twenty-docs/l/es/user-guide/billing/capabilities/workflow-credits.mdx
+++ b/packages/twenty-docs/l/es/user-guide/billing/capabilities/workflow-credits.mdx
@@ -1,9 +1,9 @@
---
-title: Créditos de Workflow
+title: Workflow Credits
description: Understanding workflow credits, consumption, and how to purchase more.
---
-## Resumen
+## Overview
Credits power your workflow automations in Twenty. Every workflow action consumes credits based on its complexity.
@@ -13,8 +13,8 @@ Credits are based on your billing cycle, not your plan:
| Billing Cycle | Credits |
| ------------- | --------------- |
-| Mensual | 5 million/month |
-| Anual | 50 million/year |
+| Monthly | 5 million/month |
+| Yearly | 50 million/year |
The 5 million monthly credits are designed to empower you to run automations without worrying about costs. For most workflows using standard actions, this is more than enough. You'll only need additional credits when running advanced code nodes or AI-powered features.
@@ -24,26 +24,26 @@ Credits are based on your billing cycle, not your plan:
Different actions consume different amounts of credits:
-| Action Type | Uso de Crédito |
+| Action Type | Credit Usage |
| ------------------------------------------------------- | ----------------------- |
| **Basic operations** (search, update, create records) | Minimal |
| **Complex operations** (code nodes, external API calls) | More credits |
| **AI prompts** (coming soon) | Variable based on usage |
-Los créditos se deducen en tiempo real cuando se ejecutan los flujos de trabajo.
+Credits are deducted in real-time when workflows execute.
## Monitoring Usage
Track your credit consumption:
-1. Ir a **Ajustes → Facturación**
+1. Go to **Settings → Billing**
2. View your current usage and remaining credits
3. Monitor trends to plan for additional credits if needed
-## Adquirir Créditos Adicionales
+## Purchasing Additional Credits
Need more credits?
-1. Ir a **Ajustes → Facturación**
+1. Go to **Settings → Billing**
2. Click on the option to purchase additional credit packs
3. Select the amount you need
diff --git a/packages/twenty-docs/l/es/user-guide/billing/how-tos/billing-faq.mdx b/packages/twenty-docs/l/es/user-guide/billing/how-tos/billing-faq.mdx
index 6024a3db08..ee1d560cb1 100644
--- a/packages/twenty-docs/l/es/user-guide/billing/how-tos/billing-faq.mdx
+++ b/packages/twenty-docs/l/es/user-guide/billing/how-tos/billing-faq.mdx
@@ -3,11 +3,11 @@ title: Billing FAQ
description: Frequently asked questions about Twenty pricing and billing.
---
-## Precios
+## Pricing
-
- Sí, puedes usar Twenty gratis mientras lo alojas por tu cuenta. You will get access to everything included in the Pro (Cloud) plan, except the support from our core-team. El soporte está disponible a través de nuestra comunidad en Discord.
+
+ Yes, you can use Twenty for free while self-hosting. You will get access to everything included in the Pro (Cloud) plan, except the support from our core-team. Support is accessible via our Discord community.
If you want to self-host and need the Premium features (SSO and row-level permissions), you can choose the paid Organization (Self-Hosted) license. This also includes support from the Twenty team and removes the requirement to publish custom code as open-source before distributing.
@@ -20,67 +20,67 @@ description: Frequently asked questions about Twenty pricing and billing.
- No ofrecemos asientos gratuitos. El precio es por usuario y cada usuario necesita una licencia para acceder a Twenty.
+ We do not offer free seats. Pricing is per user and each user needs a licence to access Twenty.
-
- Puedes hacerlo en `Configuración → Facturación`. Luego haz clic en `Cambiar a Organización`.
+
+ You can do so under `Settings → Billing`. Then click on `Switch to Organization`.
-
- Por favor, comunícate directamente con nuestro equipo a través del Soporte, no hay una forma sencilla de hacer esto utilizando la IU en este momento.
+
+ Please reach out to our team directly via the Support, there is no easy way to do this using the UI at the moment.
-
- Puedes hacerlo en `Configuración → Facturación`. Luego haz clic en `Cambiar a Anual`.
+
+ You can do so under `Settings → Billing`. Then click on `Switch to Yearly`.
-
- Por favor, comunícate directamente con nuestro equipo a través del Soporte, no hay una forma sencilla de hacer esto utilizando la IU en este momento.
+
+ Please reach out to our team directly via the Support, there is no easy way to do this using the UI at the moment.
-
- Lo encontrarás en `Configuración → Facturación`.
+
+ You will find this under `Settings → Billing`.
-
+
The number of credits depends on your billing cycle, not your plan:
* **Monthly subscriptions**: 5 million credits per month
* **Yearly subscriptions**: 50 million credits per year
-
- Cada acción de flujo de trabajo consume créditos según su complejidad:
+
+ Each workflow action consumes credits based on its complexity:
- * Las **operaciones internas básicas** (como búsqueda, actualización, creación de registros) consumen muy pocos créditos.
- * Las **operaciones más complejas** como nodos de código y solicitudes a servicios externos consumen más créditos.
- * **Consultas de IA** (próximamente) también consumirán más créditos según el uso.
+ * **Basic internal operations** (such as search, update, create records) consume very few credits
+ * **More complex operations** like code nodes and requests to external services consume more credits
+ * **AI prompts** (coming soon!) will also consume more credits based on usage
- Los créditos se deducen en tiempo real cuando se ejecutan los flujos de trabajo. Puedes monitorear tu uso en **Configuración → Facturación** para seguir el consumo y los créditos restantes.
+ Credits are deducted in real-time when workflows execute. You can monitor your usage in **Settings → Billing** to track consumption and remaining credits.
-
- Puedes comprar créditos adicionales en `Configuración → Facturación`.
+
+ You can buy additional credits under `Settings → Billing`.
-## Facturación
+## Billing
-
- Puedes hacerlo en `Configuración → Facturación`.
+
+ You can do so under `Settings → Billing`.
-
- Puedes hacerlo en `Configuración → Facturación`. Luego haz clic en `Ver detalles de facturación`. Allí podrás agregar un nuevo método de pago.
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll be able to add a new payment method there.
-
- Puedes hacerlo en `Configuración → Facturación`. Luego haz clic en `Ver detalles de facturación`. Allí podrás editar la información de facturación.
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll be able to edit the billing information there.
-
- Puedes hacerlo en `Configuración → Facturación`. Luego haz clic en `Ver detalles de facturación`. Verás todas tus facturas al final de la pantalla.
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll see all your invoices at the bottom of the screen.
diff --git a/packages/twenty-docs/l/es/user-guide/billing/overview.mdx b/packages/twenty-docs/l/es/user-guide/billing/overview.mdx
index 062d2b3289..604b9bb11d 100644
--- a/packages/twenty-docs/l/es/user-guide/billing/overview.mdx
+++ b/packages/twenty-docs/l/es/user-guide/billing/overview.mdx
@@ -1,11 +1,11 @@
---
-title: Facturación
+title: Billing
description: Understand Twenty pricing and manage your subscription.
image: /images/user-guide/setup/pricing.png
---
-
+
Twenty offers flexible pricing plans to fit your team's needs. Manage your subscription, track workflow credits, and access invoices all from **Settings → Billing**.
diff --git a/packages/twenty-docs/l/es/user-guide/calendar-emails/capabilities/calendar.mdx b/packages/twenty-docs/l/es/user-guide/calendar-emails/capabilities/calendar.mdx
index 1176e261ec..ace7c62f10 100644
--- a/packages/twenty-docs/l/es/user-guide/calendar-emails/capabilities/calendar.mdx
+++ b/packages/twenty-docs/l/es/user-guide/calendar-emails/capabilities/calendar.mdx
@@ -1,5 +1,5 @@
---
-title: Calendario
+title: Calendar
description: Understanding calendar integration features in Twenty.
---
@@ -9,35 +9,35 @@ description: Understanding calendar integration features in Twenty.
Twenty automatically syncs your calendar events and links them to the relevant CRM records, giving you a complete view of your meeting history with contacts and companies.
-## Pestaña de Calendario
+## Calendar Tab
Next to the Emails tab on records, you'll find a `Calendar` tab that contains the history of meetings scheduled with the record.
### Available For
-* **Personas**: Vea todas las reuniones programadas con un contacto específico
-* **Empresas**: Vea todas las reuniones relacionadas con una empresa y sus empleados
-* **Oportunidades**: Acceda al historial de reuniones relacionadas con la empresa conectada a esta oportunidad
+* **People**: View all meetings scheduled with a specific contact
+* **Companies**: See all meetings related to a company and its employees
+* **Opportunities**: Access meeting history related to the company linked to this opportunity
-### Visualización del Historial de Reuniones
+### Viewing Meeting History
-1. **Navegue hacia un Registro**: Vaya a cualquier registro de Persona, Empresa u Oportunidad
-2. **Seleccione la Pestaña de Calendario**: Haga clic en la pestaña `Calendario` junto a la pestaña de Correos Electrónicos
-3. **Explore el Historial de Reuniones**: Vea todas las reuniones programadas y sus detalles
-4. **Acceda al Contexto de la Reunión**: Vea los participantes, horarios e información relacionada
+1. **Navigate to a Record**: Go to any Person, Company, or Opportunity record
+2. **Select the Calendar Tab**: Click on the `Calendar` tab next to the Emails tab
+3. **Browse Meeting History**: View all scheduled meetings and their details
+4. **Access Meeting Context**: See meeting participants, times, and related information
## Visibility Settings
Calendar data follows the same visibility settings as emails, ensuring consistent privacy controls across both communication channels.
-## Qué Se Sincroniza
+## What Gets Synced
* **External Meetings**: All meetings with contacts outside your organization
* **Automatic Linking**: Meetings connect to existing People and Company records based on attendee email addresses
* **Meeting Details**: Subject, time, duration, and participants
* **Updates**: New calendar events sync automatically
-## Qué No Se Sincroniza
+## What Doesn't Get Synced
* **Internal Meetings**: Meetings with only colleagues (same domain) remain private
* **Private Events**: Events marked as private in your calendar
diff --git a/packages/twenty-docs/l/es/user-guide/calendar-emails/capabilities/mailbox.mdx b/packages/twenty-docs/l/es/user-guide/calendar-emails/capabilities/mailbox.mdx
index 7730c39072..eea8346340 100644
--- a/packages/twenty-docs/l/es/user-guide/calendar-emails/capabilities/mailbox.mdx
+++ b/packages/twenty-docs/l/es/user-guide/calendar-emails/capabilities/mailbox.mdx
@@ -3,83 +3,83 @@ title: Mailbox
description: Understanding email integration features in Twenty.
---
-**Nota**: Para conectar sus cuentas de correo electrónico y configurar los ajustes de sincronización, visite [Configuración de Correo Electrónico y Calendario](/l/es/user-guide/calendar-emails/overview).
+**Note**: To connect your email accounts and configure sync settings, visit [Email & Calendar Setup](/l/es/user-guide/calendar-emails/overview).
-## Cómo Funciona la Integración del Correo Electrónico
+## How Email Integration Works
-Twenty vincula automáticamente los correos electrónicos de sus buzones conectados a los registros CRM relevantes, manteniendo todo el historial de comunicación en un solo lugar.
+Twenty automatically links emails from your connected mailboxes to the relevant CRM records, keeping all communication history in one place.
### Objects Where Emails Can Be Found
-Las conversaciones de correo electrónico aparecen en tres objetos principales:
+Email conversations appear in three main objects:
-* **Personas**: Vea todos los correos electrónicos intercambiados con un contacto específico
-* **Empresas**: Vea todos los correos electrónicos relacionados con una empresa y sus empleados
-* **Oportunidades**: Acceda a hilos de correo electrónico relacionados con la empresa vinculada a esta oportunidad. Aún no se muestran los hilos de correo electrónico de personas individuales en la oportunidad.
+* **People**: View all emails exchanged with a specific contact
+* **Companies**: See all emails related to a company and its employees
+* **Opportunities**: Access email threads related to the company linked to this opportunity. Email threads from individual people on the opportunity are not shown yet.
-### Visualización de Conversaciones de Correo Electrónico
+### Viewing Email Threads
-1. **Navegue hacia un Registro**: Vaya a cualquier registro de Persona, Empresa u Oportunidad
-2. **Seleccione la Pestaña de Correos Electrónicos**: Haga clic en la pestaña `Correos Electrónicos` para ver los correos sincronizados
-3. **Abra un Hilo de Correo Electrónico**: Haga clic en cualquier correo electrónico para abrir y leer la conversación completa
-4. **Explorar el Historial**: Desplácese por el historial completo de correos electrónicos con ese contacto
+1. **Navigate to a Record**: Go to any Person, Company, or Opportunity record
+2. **Select the Emails Tab**: Click on the `Emails` tab to view synced emails
+3. **Open an Email Thread**: Click on any email to open and read the full conversation
+4. **Browse History**: Scroll through the complete email history with that contact
-## Lo Que Verás
+## What You'll See
-### Vista de Hilo de Correo Electrónico
+### Email Thread View
-Cuando abres un hilo de correo electrónico, puedes:
+When you open an email thread, you can:
-* **Leer Conversaciones Completas**: Vea el intercambio completo de correos electrónicos
-* **Ver Participantes**: Vea a todas las personas involucradas en el hilo de correo electrónico
-* **Verificar Tiempos**: Sepa exactamente cuándo se envió cada correo electrónico
-* **Acceder al Contexto**: Comprenda todo el historial de comunicación
+* **Read Full Conversations**: See the complete email exchange
+* **View Participants**: See all people involved in the email thread
+* **Check Timestamps**: Know exactly when each email was sent
+* **Access Context**: Understand the full communication history
-### Visibilidad del Correo Electrónico
+### Email Visibility
-Dependiendo de las configuraciones de su buzón, puede ver:
+Depending on your mailbox settings, you might see:
-* **Contenido Completo**: Texto completo del correo electrónico y detalles
-* **Asunto + Metadata**: Línea de asunto, remitente, destinatario y hora
-* **Solo Metadata**: Información básica sin contenido de correo electrónico
+* **Full Content**: Complete email text and details
+* **Subject + Metadata**: Subject line, sender, recipient, and timestamp
+* **Metadata Only**: Basic information without email content
-## Comportamiento de Sincronización de Correos Electrónicos
+## Email Sync Behavior
-### Qué Se Sincroniza
+### What Gets Synced
-* **Correos Externos**: Todos los correos con contactos fuera de su organización
-* **Vinculación Automática**: Los correos se conectan a los registros de Personas y Empresas existentes
-* **Direcciones Múltiples**: Los correos de cualquier dirección se vinculan al mismo registro de contacto
-* **Actualizaciones**: Los nuevos correos aparecen en 5 minutos
+* **External Emails**: All emails with contacts outside your organization
+* **Automatic Linking**: Emails connect to existing People and Company records
+* **Multiple Addresses**: Emails from any address link to the same contact record
+* **Updates**: New emails appear within 5 minutes
-### Qué No Se Sincroniza
+### What Doesn't Get Synced
-* **Correos Internos**: Los correos entre colegas (mismo dominio) permanecen privados
-* **Correos Grupales**: No se incluyen las listas de distribución y correos grupales
-* **Carpetas Excluidas**: Carpetas que ha elegido no sincronizar (configuradas en Configuración → Cuentas → Correo Electrónico)
+* **Internal Emails**: Emails between colleagues (same domain) remain private
+* **Group Emails**: Distribution lists and group emails are excluded
+* **Excluded Folders**: Folders you've chosen not to sync (configured under Settings → Accounts → Email)
-### Sincronización Selectiva de Carpetas (Función de Laboratorio)
+### Selective Folder Sync (Lab Feature)
-Controle qué carpetas de correo electrónico se sincronizan con Twenty:
+Control which email folders sync with Twenty:
-1. Habilitar `Carpeta de Mensajes` en Configuración → Lanzamientos → Laboratorio
-2. Configure las carpetas en Configuración → Cuentas → Correo Electrónico
-3. Elija carpetas específicas para incluir o excluir (Bandeja de entrada, Enviados, Archivo, carpetas personalizadas)
+1. Enable `Message Folder` in Settings → Releases → Lab
+2. Configure folders under Settings → Accounts → Email
+3. Choose specific folders to include or exclude (Inbox, Sent, Archive, custom folders)
-## Resolución de Problemas de Sincronización de Correos Electrónicos
+## Troubleshooting Email Sync
-### Problemas Comunes de Sincronización
+### Common Sync Issues
-* **Retrasos en la Sincronización**: Los correos aparecen en 5 minutos, pero las importaciones iniciales tardan más
-* **Correos Faltantes**: Compruebe si:
- * Las carpetas están excluidas en la configuración del Carpeta de Mensajes
- * La creación automática de contactos está desactivada (los correos necesitan registros existentes de Twenty)
- * El correo es de colegas (mismo dominio) o listas grupales
- * El buzón aún está completando la sincronización inicial
+* **Sync Delays**: Emails appear within 5 minutes, but initial imports take longer
+* **Missing Emails**: Check if:
+ * Folders are excluded in Message Folder settings
+ * Contact auto-creation is disabled (emails need existing Twenty records)
+ * Email is from colleagues (same domain) or group lists
+ * Mailbox is still completing initial sync
-### Limitaciones del Correo Electrónico
+### Email Limitations
-* **Carpetas del Sistema**: Algunas carpetas de correo no están disponibles para sincronización
-* **Alias**: Solo se pueden conectar buzones verdaderos (no alias de correo electrónico)
+* **System Folders**: Some email folders may not be available for sync
+* **Aliases**: Only true mailboxes can be connected (not email aliases)
diff --git a/packages/twenty-docs/l/es/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx b/packages/twenty-docs/l/es/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx
index bf2da6e184..de258baef3 100644
--- a/packages/twenty-docs/l/es/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx
+++ b/packages/twenty-docs/l/es/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx
@@ -7,11 +7,11 @@ description: Understanding email activity tracking across different objects.
Email activity is currently available on **three standard objects**:
-| Objeto | What You See |
+| Object | What You See |
| ----------------- | ---------------------------------------------------------------- |
| **People** | All emails exchanged with that specific contact |
| **Companies** | All emails with anyone from that company (based on email domain) |
-| **Oportunidades** | Emails related to the company linked to the opportunity |
+| **Opportunities** | Emails related to the company linked to the opportunity |
## Why Only These Objects?
@@ -21,7 +21,7 @@ People, Companies, and Opportunities are the core relationship objects where ema
* **Email domain** → matched to Company records
* **Company relation** → linked to Opportunities
-## Objetos personalizados
+## Custom Objects
**Email tracking is not available on custom objects** at this time.
diff --git a/packages/twenty-docs/l/es/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx b/packages/twenty-docs/l/es/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx
index ed2000c365..83da30bd83 100644
--- a/packages/twenty-docs/l/es/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx
+++ b/packages/twenty-docs/l/es/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx
@@ -3,7 +3,7 @@ title: Connect Several Mailboxes per User
description: Connect multiple email accounts for a single user.
---
-## Resumen
+## Overview
Twenty supports **unlimited email accounts per user**. This is useful if you manage multiple inboxes, such as:
diff --git a/packages/twenty-docs/l/es/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx b/packages/twenty-docs/l/es/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
index 46fb847661..9569d2651a 100644
--- a/packages/twenty-docs/l/es/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
+++ b/packages/twenty-docs/l/es/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
@@ -1,52 +1,52 @@
---
-title: Limitar los correos electrónicos importados},{
-description: Controla qué correos electrónicos se importan en Twenty.
+title: Limit Emails Imported
+description: Control which emails are imported into Twenty.
---
-## Resumen
+## Overview
-De forma predeterminada, Twenty sincroniza todos los correos electrónicos externos de tu buzón conectado. Puedes limitar lo que se importa usando la **selección de carpetas** y los **ajustes de visibilidad**.
+By default, Twenty syncs all external emails from your connected mailbox. You can limit what gets imported using **folder selection** and **visibility settings**.
-## Método 1: Selección de carpetas (Recomendado)
+## Method 1: Folder Selection (Recommended)
-Controle qué carpetas de correo electrónico se sincronizan con Twenty:
+Control which email folders sync with Twenty:
-1. Ir a **Ajustes → Releases → Lab**
-2. Activa **Carpeta de mensajes**
-3. Volver a **Ajustes → Cuentas**
-4. Selecciona tu cuenta de correo conectada
-5. Elige qué carpetas sincronizar:
+1. Go to **Settings → Releases → Lab**
+2. Enable **Message Folder**
+3. Return to **Settings → Accounts**
+4. Select your connected email account
+5. Choose which folders to sync:
-| Carpeta | Descripción |
-| --------------------------- | ---------------------------------------- |
-| **Bandeja de entrada** | Correos entrantes principales |
-| **Enviados** | Correos salientes que has enviado |
-| **Archivo** | Mensajes archivados |
-| **Carpetas personalizadas** | Cualquier carpeta específica que quieras |
+| Folder | Description |
+| ------------------ | ----------------------------- |
+| **Inbox** | Primary incoming emails |
+| **Sent** | Outgoing emails you've sent |
+| **Archive** | Archived messages |
+| **Custom Folders** | Any specific folders you want |
-6. Excluye las carpetas que no quieras sincronizar (Spam, Papelera, carpetas personales)
+6. Exclude folders you don't want synced (Spam, Trash, personal folders)
-Esto te da un control preciso sobre qué correos aparecen en tu CRM sin sincronizar todo.
+This gives you precise control over which emails appear in your CRM without syncing everything.
-## Método 2: Ajustes de creación automática de contactos
+## Method 2: Contact Auto-Creation Settings
-Controla cuándo se crean contactos a partir de correos:
+Control when contacts are created from emails:
-1. Ir a **Ajustes → Cuentas**
-2. Selecciona tu buzón conectado
-3. Elige una opción:
- * **Desactivado**: No se crean contactos, pero los correos siguen sincronizándose con los contactos existentes
- * **Enviados y recibidos**: Crea contactos a partir de todos los correos externos
- * **Solo enviados**: Crea contactos únicamente a partir de los correos que envías
+1. Go to **Settings → Accounts**
+2. Select your connected mailbox
+3. Choose an option:
+ * **Deactivated**: No contacts created, but emails still sync to existing contacts
+ * **Sent & Received**: Create contacts from all external emails
+ * **Sent Only**: Only create contacts from emails you send
-## Qué se excluye siempre
+## What's Always Excluded
-Estos correos nunca se sincronizan, independientemente de los ajustes:
+These emails are never synced, regardless of settings:
-* **Correos internos**: Mensajes entre colegas (mismo dominio)
-* **Correos grupales**: Listas de distribución y mensajes de grupo
-* **Spam/Papelera**: Las carpetas del sistema generalmente se excluyen
+* **Internal emails**: Messages between colleagues (same domain)
+* **Group emails**: Distribution lists and group messages
+* **Spam/Trash**: System folders are typically excluded
-## Nota importante
+## Important Note
-No proporcionamos una dirección de correo electrónico en CC para la sincronización selectiva. Usa la función de selección de carpetas anterior para lograr el mismo nivel de control.
+We don't provide a CC email address for selective syncing. Use the folder selection feature above to achieve the same level of control.
diff --git a/packages/twenty-docs/l/es/user-guide/calendar-emails/overview.mdx b/packages/twenty-docs/l/es/user-guide/calendar-emails/overview.mdx
index d0ded1b874..fd6d928dd0 100644
--- a/packages/twenty-docs/l/es/user-guide/calendar-emails/overview.mdx
+++ b/packages/twenty-docs/l/es/user-guide/calendar-emails/overview.mdx
@@ -8,125 +8,125 @@ image: /images/user-guide/emails/emails_header.png
-## Opciones de conexión
+## Connection Options
-### Cuenta de Google (Gmail y Calendario de Google)
+### Google Account (Gmail & Google Calendar)
1. Go to **Settings → Accounts**
2. Click **Add account**
-3. Seleccionar **Continuar con Google**
-4. Autorizar a Twenty para acceder a tu Gmail y Calendario de Google
+3. Select **Continue with Google**
+4. Authorize Twenty to access your Gmail and Google Calendar
5. Configure email sync settings (visibility, auto-creation) → click **Next**
6. Configure calendar sync settings (visibility, auto-creation) → click **Add Account**
-7. Tus correos y eventos del calendario comenzarán a sincronizarse automáticamente
+7. Your emails and calendar events will start syncing automatically
-### Cuenta de Microsoft (Outlook y Calendario de Microsoft)
+### Microsoft Account (Outlook & Microsoft Calendar)
1. Go to **Settings → Accounts**
2. Click **Add account**
-3. Seleccionar **Continuar con Microsoft**
-4. Autorizar a Twenty para acceder a tu Outlook y Calendario de Microsoft
+3. Select **Continue with Microsoft**
+4. Authorize Twenty to access your Outlook and Microsoft Calendar
5. Configure email sync settings (visibility, auto-creation) → click **Next**
6. Configure calendar sync settings (visibility, auto-creation) → click **Add Account**
-7. Tus correos y eventos del calendario comenzarán a sincronizarse automáticamente
+7. Your emails and calendar events will start syncing automatically
-### Configuración SMTP/CalDAV (Otros Proveedores)
+### SMTP/CalDAV Setup (Other Providers)
-Para otros proveedores de correo y calendario:
+For other email and calendar providers:
-1. Ir a **Ajustes → Lanzamientos → Lab** para habilitar la función
-2. Volver a **Ajustes → Cuentas**
-3. Configurar los ajustes SMTP para el correo
-4. Configurar los ajustes CalDAV para el calendario
-5. Probar la conexión
+1. Go to **Settings → Releases → Lab** to enable the feature
+2. Return to **Settings → Accounts**
+3. Configure SMTP settings for email
+4. Configure CalDAV settings for calendar
+5. Test the connection
-### Múltiples Buzones
+### Multiple Mailboxes
-* **Cuentas Ilimitadas**: Conecta múltiples cuentas de correo por usuario
-* **Gestión de Cuentas**: Cambiar entre diferentes buzones
-* **Ajustes de Sincronización**: Configura diferentes ajustes por buzón
+* **Unlimited Accounts**: Connect multiple email accounts per user
+* **Account Management**: Switch between different mailboxes
+* **Sync Settings**: Configure different settings per mailbox
- Solo se pueden conectar verdaderos buzones (por ejemplo, soporte@dominio.com con su propia bandeja de entrada). Email aliases that forward to another mailbox cannot be connected to Twenty.
+ Only true mailboxes can be connected (e.g., support@domain.com with its own inbox). Email aliases that forward to another mailbox cannot be connected to Twenty.
-## Configuración de Correo
+## Email Configuration
-### Visibilidad del Mensaje
+### Message Visibility
-Elige diferentes niveles de visibilidad para tus correos:
+Choose different levels of visibility for your emails:
-* **Solo Metadatos**: Comparte solo información básica (remitente, destinatario, fecha, hora)
-* **Asunto y Metadatos**: Comparte la línea de asunto junto con los metadatos
-* **Todo el Contenido del Correo**: Comparte todo el contenido del correo incluyendo adjuntos
+* **Metadata Only**: Share only basic information (sender, recipient, date, time)
+* **Subject and Metadata**: Share subject line along with metadata
+* **All Email Content**: Share entire email content including attachments
-### Creación Automática de Contactos
+### Contact Auto-Creation
-* **Desactivado**: No se crean contactos automáticamente
-* **Para mensajes enviados y recibidos**: Crea contactos para todas las interacciones externas por correo electrónico
-* **Solo para mensajes enviados**: Crea contactos solo para los correos que envías
-* **Nota**: Los correos internos (mismo dominio) nunca se sincronizan para mantener la privacidad
+* **Deactivated**: No automatic contact creation
+* **For messages sent & received**: Create contacts for all external email interactions
+* **For messages sent only**: Create contacts only for emails you send
+* **Note**: Internal emails (same domain) are never synced to maintain privacy
When enabled, contacts are automatically linked to their Company records based on their email domain. If the company doesn't exist yet, Twenty creates it for you.
-### Controla qué correos se sincronizan con la selección de carpetas de mensajes (Función Lab)
+### Control which emails get sync with Message Folder Selection (Lab Feature)
-Controle qué carpetas de correo electrónico se sincronizan con Twenty:
+Control which email folders sync with Twenty:
-1. Ir a **Ajustes → Lanzamientos → Lab** y habilitar la **Carpeta de Mensajes**
-2. Volver a **Ajustes → Cuentas** y seleccionar la cuenta de correo conectada
-3. Elige qué carpetas sincronizar:
- * **Bandeja de Entrada**: Correos entrantes principales
- * **Enviados**: Correos salientes que has enviado
- * **Carpetas Personalizadas**: Cualquier carpeta específica que desees incluir
- * **Excluir Carpetas**: Omitir carpetas como Spam, Papelera o carpetas personales
+1. Go to **Settings → Releases → Lab** and enable **Message Folder**
+2. Return to **Settings → Accounts** and select your connected email account
+3. Choose which folders to sync:
+ * **Inbox**: Primary incoming emails
+ * **Sent**: Outgoing emails you've sent
+ * **Custom Folders**: Any specific folders you want to include
+ * **Exclude Folders**: Skip folders like Spam, Trash, or personal folders
-Esto te da un control preciso sobre qué correos aparecen en tu CRM sin sincronizar todo.
+This gives you precise control over which emails appear in your CRM without syncing everything.
-**Qué se Sincroniza:**
+**What Gets Synced:**
-* **Correos Externos**: Todos los correos con contactos externos de carpetas seleccionadas
-* **Correos Internos**: No se sincronizan (los correos del mismo dominio permanecen privados)
-* **Adjuntos**: Se incluyen en la actualización del H1 2026
+* **External Emails**: All emails with external contacts from selected folders
+* **Internal Emails**: Not synced (same domain emails remain private)
+* **Attachments**: Coming in H1 2026
-**Nota**: No proporcionamos una dirección de correo CC para la sincronización selectiva. En su lugar, usa la función de carpeta de mensajes para lograr el mismo nivel de control sobre qué correos sincronizar con Twenty.
+**Note**: We don't provide a CC email address for selective syncing. Instead, use the Message Folder feature above to achieve the same level of control over which emails sync with Twenty.
-## Configuración del Calendario
+## Calendar Configuration
-### Visibilidad del Evento
+### Event Visibility
-Elige qué será visible para otros usuarios en tu espacio de trabajo:
+Choose what will be visible to other users in your workspace:
-* **Todo**: Los detalles completos del evento se compartirán con tu equipo
-* **Metadatos**: Solo se compartirán con tu equipo la fecha y los participantes
+* **Everything**: The whole event details will be shared with your team
+* **Metadata**: Only date & participants will be shared with your team
-### Creación Automática de Contactos para Reuniones
+### Contact Auto-Creation for Meetings
-* **Sí**: Crea automáticamente contactos para participantes de reuniones que no están en tu CRM
-* **No**: Solo vincule reuniones a contactos existentes
+* **Yes**: Automatically create contacts for meeting participants not in your CRM
+* **No**: Only link meetings to existing contacts
When enabled, contacts are automatically linked to their Company records based on their email domain. If the company doesn't exist yet, Twenty creates it for you.
-### Controla qué eventos se sincronizan
+### Control which events get sync
-* **Importación de Reuniones**: Importa automáticamente los eventos del calendario
-* **Enlace de Contactos**: Vincula las reuniones a los registros de Personas y Empresas
+* **Meeting Import**: Automatically import calendar events
+* **Contact Linking**: Link meetings to People and Company records
-**Qué se Sincroniza:**
+**What Gets Synced:**
-* **Reuniones**: Eventos de calendario con participantes externos
-* **Enlace de Contactos**: Eventos vinculados automáticamente a los registros del CRM
-* **Eventos de Equipos**: Visibilidad compartida del calendario
+* **Meetings**: Calendar events with external participants
+* **Contact Linking**: Events automatically linked to CRM records
+* **Team Events**: Shared calendar visibility
-## Frecuencia de Sincronización
+## Sync Frequency
-**Actualizaciones cada 5 minutos**: Tanto el correo como el calendario se sincronizan automáticamente cada 5 minutos después de la importación inicial.
+**Updates every 5 minutes**: Both email and calendar data sync automatically every 5 minutes after the initial import.
**Initial sync timing**: Calendar sync completes quickly (usually within minutes), while email sync takes longer for large mailboxes—up to a few hours depending on volume. Don't worry if you see contacts from calendar events appearing before your email contacts; this is normal behavior.
-## Próximos Pasos
+## Next Steps
* [Mailbox capabilities](/l/es/user-guide/calendar-emails/capabilities/mailbox)
* [Troubleshoot missing emails](/l/es/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records)
diff --git a/packages/twenty-docs/l/es/user-guide/dashboards/capabilities/dashboards.mdx b/packages/twenty-docs/l/es/user-guide/dashboards/capabilities/dashboards.mdx
index 58fe0e83a5..b3d731e668 100644
--- a/packages/twenty-docs/l/es/user-guide/dashboards/capabilities/dashboards.mdx
+++ b/packages/twenty-docs/l/es/user-guide/dashboards/capabilities/dashboards.mdx
@@ -1,9 +1,9 @@
---
-title: Tableros
+title: Dashboards
description: Create and organize dashboards with tabs to visualize your CRM data.
---
-## Resumen
+## Overview
Dashboards in Twenty are organized in a hierarchy: **Dashboards → Tabs → Widgets**. Each dashboard can contain multiple tabs, and each tab contains widgets (charts, numbers, iFrames).
@@ -43,7 +43,7 @@ Tabs help you organize your dashboard into logical sections.
2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
3. Select **Duplicate dashboard**
-### Mejores prácticas
+### Best Practices
* **Logical flow**: Arrange from overview to detail
* **Visual hierarchy**: Larger charts for key metrics
@@ -55,7 +55,7 @@ Tabs help you organize your dashboard into logical sections.
Dashboards are visible to everyone who has access to your Twenty workspace. There is no private dashboard option at the moment.
-### Favoritos
+### Favorites
You can add dashboards to your favorites for quick access. This is a personal setting—your favorites are not visible to other users.
diff --git a/packages/twenty-docs/l/es/user-guide/dashboards/capabilities/widgets.mdx b/packages/twenty-docs/l/es/user-guide/dashboards/capabilities/widgets.mdx
index 5826d77a5a..fc12e61339 100644
--- a/packages/twenty-docs/l/es/user-guide/dashboards/capabilities/widgets.mdx
+++ b/packages/twenty-docs/l/es/user-guide/dashboards/capabilities/widgets.mdx
@@ -116,7 +116,7 @@ Group data by:
* Time periods (day, week, month, quarter)
* Custom segments
-### Estilo
+### Styling
Customize your charts with:
diff --git a/packages/twenty-docs/l/es/user-guide/dashboards/how-tos/dashboards-faq.mdx b/packages/twenty-docs/l/es/user-guide/dashboards/how-tos/dashboards-faq.mdx
index 2067d298d0..7af41b4efa 100644
--- a/packages/twenty-docs/l/es/user-guide/dashboards/how-tos/dashboards-faq.mdx
+++ b/packages/twenty-docs/l/es/user-guide/dashboards/how-tos/dashboards-faq.mdx
@@ -40,7 +40,7 @@ description: Frequently asked questions about dashboards in Twenty.
- Aún no. Gauge charts and tables are on our roadmap and will be added in a future release.
+ Not yet. Gauge charts and tables are on our roadmap and will be added in a future release.
diff --git a/packages/twenty-docs/l/es/user-guide/dashboards/overview.mdx b/packages/twenty-docs/l/es/user-guide/dashboards/overview.mdx
index 1dfc31ae6f..d4fa305650 100644
--- a/packages/twenty-docs/l/es/user-guide/dashboards/overview.mdx
+++ b/packages/twenty-docs/l/es/user-guide/dashboards/overview.mdx
@@ -1,22 +1,22 @@
---
-title: Tableros
+title: Dashboards
description: Learn the basics of reporting and dashboards in Twenty.
image: /images/user-guide/reporting/pie-chart.png
---
-
+
## Understanding Dashboards
Dashboards in Twenty provide a visual way to track your key performance metrics and gain insights from your CRM data.
-
+
## Key Concepts
-### Tableros
+### Dashboards
A dashboard is a collection of tabs that display your CRM data at a glance. You can create multiple dashboards for different purposes:
@@ -25,7 +25,7 @@ A dashboard is a collection of tabs that display your CRM data at a glance. You
* Pipeline health
* Custom metrics
-### Pestañas
+### Tabs
Tabs allow you to organize your dashboard into sections. Each tab contains one or more widgets.
@@ -55,7 +55,7 @@ Widgets are individual visualizations that display specific data. Types include:
3. Give your dashboard a name
4. Add tabs to organize your content
5. Add widgets to display your data
-6. Guardar
+6. Save
### Adding Widgets
@@ -66,14 +66,14 @@ Widgets are individual visualizations that display specific data. Types include:
5. Configure the widget settings
6. Save and view your widget
-## Mejores prácticas
+## Best Practices
* **Start simple**: Begin with a few key metrics and add more over time
* **Focus on actionable data**: Display metrics that drive decisions
* **Regular review**: Check your dashboards regularly to spot trends
* **Share with team**: Make dashboards visible to relevant team members
-## Próximos Pasos
+## Next Steps
* [Widgets and visualizations](/l/es/user-guide/dashboards/capabilities/widgets)
* [Dashboards FAQ](/l/es/user-guide/dashboards/how-tos/dashboards-faq)
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/error-handling.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/error-handling.mdx
index 86e2ed15e2..38a1217311 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/error-handling.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/error-handling.mdx
@@ -9,7 +9,7 @@ import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
After uploading your file and mapping fields, Twenty validates your data **before** importing. This allows you to catch and fix errors without affecting your existing data.
-## Cómo Funciona
+## How It Works
1. **Upload** your CSV file
2. **Map** your columns to Twenty fields
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/field-mapping.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/field-mapping.mdx
index edae49b93e..f369554bee 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/field-mapping.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/field-mapping.mdx
@@ -164,11 +164,11 @@ Phone is a nested field with multiple columns that **must be filled**
Use the API name format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, `RATING_5`
-### Campos de Relación
+### Relation Fields
Please see our dedicated article: [Import Relations Between Objects](/l/es/user-guide/data-migration/capabilities/import-relations)
-### Campos de Selección
+### Select Fields
Use the **API name** of the option (not the display label):
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/file-formats.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/file-formats.mdx
index ad37266af9..7187faa960 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/file-formats.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/file-formats.mdx
@@ -1,48 +1,48 @@
---
-title: Formatos de archivo compatibles
-description: Formatos de archivo compatibles para la importación de datos en Twenty.
+title: Supported File Formats
+description: File formats supported for data import in Twenty.
---
-## Formatos compatibles
+## Supported Formats
-Twenty admite tres formatos de archivo para la importación:
+Twenty supports three file formats for import:
-| Formato | Extensión | Notas |
-| -------------------- | --------- | ------------------------------ |
-| **CSV** | .csv | Recomendado, el más compatible |
-| **Excel** | .xlsx | Formato de Excel moderno |
-| **Excel (heredado)** | .xls | Formato de Excel antiguo |
+| Format | Extension | Notes |
+| ------------------ | --------- | ---------------------------- |
+| **CSV** | .csv | Recommended, most compatible |
+| **Excel** | .xlsx | Modern Excel format |
+| **Excel (Legacy)** | .xls | Older Excel format |
-## Requisitos del archivo
+## File Requirements
-| Requisito | Valor |
-| ----------------------- | -------------------------------------------------------- |
-| **Codificación** | Se recomienda UTF-8 |
-| **Límite de registros** | 10.000 registros por archivo |
-| **Estructura** | La primera fila debe contener los encabezados de columna |
-| **Contenido** | Un tipo de objeto por archivo |
+| Requirement | Value |
+| ---------------- | ------------------------------------- |
+| **Encoding** | UTF-8 recommended |
+| **Record limit** | 10,000 records per file |
+| **Structure** | First row must contain column headers |
+| **Content** | One object type per file |
-## Mejores prácticas para CSV
+## CSV Best Practices
-* **Delimitador**: Use coma (`,`) o punto y coma (`;`)
-* **Calificador de texto**: Use comillas dobles (`"`) para texto que contenga comas
-* **Finales de línea**: Windows (CRLF) o Unix (LF), ambos compatibles
-* **Valores vacíos**: Deje las celdas vacías; no use "NULL" ni "N/A"
+* **Delimiter**: Use comma (`,`) or semicolon (`;`)
+* **Text qualifier**: Use double quotes (`"`) for text containing commas
+* **Line endings**: Windows (CRLF) or Unix (LF) both supported
+* **Empty values**: Leave cells empty, don't use "NULL" or "N/A"
-## Mejores prácticas para Excel
+## Excel Best Practices
-Al exportar desde Excel:
+When exporting from Excel:
-* Elimine las fórmulas (exporte solo valores)
-* Elimine las filas vacías al final
-* Asegúrese de que no haya celdas combinadas
-* Use solo la primera hoja
+* Remove formulas (export values only)
+* Delete empty rows at the end
+* Ensure no merged cells
+* Use the first sheet only
-## Conjuntos de datos grandes
+## Large Datasets
-Para conjuntos de datos de más de 10.000 registros:
+For datasets larger than 10,000 records:
-* Divídalos en varios archivos
-* O use la [importación mediante API](/l/es/user-guide/data-migration/how-tos/import-data-via-api) para registros ilimitados
+* Split into multiple files
+* Or use the [API import](/l/es/user-guide/data-migration/how-tos/import-data-via-api) for unlimited records
-Para migraciones muy grandes (100.000+ registros), la API es significativamente más rápida y más fiable que las importaciones CSV.
+For very large migrations (100,000+ records), the API is significantly faster and more reliable than CSV imports.
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/import-relations.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/import-relations.mdx
index 148b2d2ce1..a7f21e5e86 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/import-relations.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/import-relations.mdx
@@ -3,7 +3,7 @@ title: Import Relations Between Objects
description: Import relationships between records via CSV.
---
-## Resumen
+## Overview
Twenty supports importing relationships between objects during CSV import. This allows you to link records (e.g., attach People to Companies) as part of your data migration.
@@ -121,11 +121,11 @@ If it doesn't exist:
### Available Unique Fields for Relations
-| Objeto | Unique Fields Available |
+| Object | Unique Fields Available |
| ------------------------------------- | --------------------------------------- |
| **Companies** | `id`, `domain`, any custom unique field |
| **People** | `id`, `email`, any custom unique field |
-| **Miembros del espacio de trabajo** | `id`, `email` (not name) |
+| **Workspace Members** | `id`, `email` (not name) |
| **Other standard and custom objects** | `id`, any field marked as unique |
**Linking to Workspace Members**: When the relation points to Workspace Members (your team logging into Twenty), reference them by their **email address**, not their name.
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/uniqueness-constraints.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/uniqueness-constraints.mdx
index b10945dce0..5f6d05701b 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/uniqueness-constraints.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/capabilities/uniqueness-constraints.mdx
@@ -5,17 +5,17 @@ description: How Twenty enforces data uniqueness during import.
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-## Resumen
+## Overview
Twenty enforces uniqueness on certain fields to prevent duplicate records and ensure data integrity. Understanding these constraints is essential for successful imports.
## Default Unique Fields
-| Objeto | Unique Fields |
-| -------------------------- | ---------------------- |
-| **People** | `id`, `email` |
-| **Companies** | `id`, `domain` |
-| **Objetos personalizados** | `id` only (by default) |
+| Object | Unique Fields |
+| ------------------ | ---------------------- |
+| **People** | `id`, `email` |
+| **Companies** | `id`, `domain` |
+| **Custom objects** | `id` only (by default) |
The `id` field is Twenty's internal identifier, auto-generated for each record. It uses UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
@@ -64,7 +64,7 @@ During the validation phase:
-## Mejores prácticas
+## Best Practices
1. **Remove duplicates** from your file before importing
2. **Check for existing records** in Twenty before importing
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/export-your-data.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/export-your-data.mdx
index 6c2f3dde84..0b4ba0781e 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/export-your-data.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/export-your-data.mdx
@@ -5,11 +5,11 @@ description: Complete step-by-step guide to exporting data from Twenty.
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-## Resumen
+## Overview
Export your workspace data to CSV for backups, reporting, or migration.
-**Casos de uso:**
+**Use cases:**
* **Regular backups** — keep copies of your data
* **External reporting** — analyze data in Excel, Google Sheets, or BI tools
@@ -26,7 +26,7 @@ Export your workspace data to CSV for backups, reporting, or migration.
For larger exports (20,000+ records), use filters to export in batches or use the [API](/l/es/developers/extend/capabilities/apis).
-### Permisos
+### Permissions
You need the **"Export CSV"** permission to export data. Contact your workspace admin if you don't have this option.
@@ -81,7 +81,7 @@ If you only need a subset of data:
| Record IDs | File attachments |
| Relation IDs | Images |
-### Campos de Relación
+### Relation Fields
Relation IDs are only exported on the **"many" side** of a relationship:
@@ -202,7 +202,7 @@ Exported files may contain sensitive data:
-## Próximos Pasos
+## Next Steps
* [How to Update Existing Records](/l/es/user-guide/data-migration/how-tos/update-existing-records-via-import) — edit and re-import your export
* [How to Import Data via API](/l/es/user-guide/data-migration/how-tos/import-data-via-api) — for large datasets
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/fix-import-errors.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/fix-import-errors.mdx
index a1accce61a..b23783baa6 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/fix-import-errors.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/fix-import-errors.mdx
@@ -3,7 +3,7 @@ title: Fix Import Errors
description: Complete troubleshooting guide for resolving CSV import errors.
---
-## Resumen
+## Overview
Import not working? This guide helps you identify and fix common import errors step by step.
@@ -24,7 +24,7 @@ After uploading your file and mapping columns, Twenty validates your data:
Click on a highlighted row to see the specific error message. Common error types:
-| Mensaje de error | What It Means |
+| Error Message | What It Means |
| --------------------------------------------------------------------- | ------------------------------------------------------------ |
| Duplicate values highlighted in yellow | Value already exists in Twenty or appears twice in your file |
| `{field} is not a valid {type}` (hover on yellow cell) | Data doesn't match expected format |
@@ -40,7 +40,7 @@ Follow the specific instructions below for each error type.
## Error: Duplicate Value
-### Lo Que Verás
+### What You'll See
Rows with duplicate values are **highlighted in yellow** in the import UI before the import starts.
@@ -99,7 +99,7 @@ For more details: [Uniqueness Constraints](/l/es/user-guide/data-migration/capab
## Error: Invalid Format
-### Lo Que Verás
+### What You'll See
The cell value is highlighted in yellow. Hover over it to see the error message:
@@ -113,7 +113,7 @@ The data doesn't match the expected format for that field type.
### How to Fix — By Field Type
-#### Correo electrónico
+#### Email
**Problem:** Invalid email format
**Solution:** Use format `name@domain.com`
@@ -124,7 +124,7 @@ The data doesn't match the expected format for that field type.
✓ john.smith@acme.com
```
-#### Dominio
+#### Domain
**Problem:** Inconsistent format may cause duplicates
**Solution:** Use `https://domain.com` format (recommended)
@@ -137,7 +137,7 @@ The data doesn't match the expected format for that field type.
All formats are valid, but `https://domain.com` is recommended because it matches the format used by email/calendar sync. Using other formats may create duplicate companies.
-#### Fecha
+#### Date
**Problem:** Unrecognized date format
**Solution:** Use consistent format throughout file
@@ -148,18 +148,18 @@ The data doesn't match the expected format for that field type.
✓ 15/03/2024 (DD/MM/YYYY)
```
-#### Teléfono
+#### Phone
**Problem:** Missing required columns
**Solution:** Include all phone columns
-| Column | Ejemplo |
+| Column | Example |
| --------------------------------------- | ------------ |
| **Phones / Primary Phone Number** | `4159095555` |
| **Phones / Primary Phone Country Code** | `US` |
| **Phones / Primary Phone Calling Code** | `+1` |
-#### Booleano
+#### Boolean
**Problem:** Wrong boolean value
**Solution:** Use uppercase `TRUE` or `FALSE`
@@ -189,17 +189,17 @@ How to find API names:
✓ HIGH_PRIORITY
```
-#### Moneda
+#### Currency
**Problem:** Missing amount or currency code
**Solution:** Fill both columns
-| Column | Ejemplo |
+| Column | Example |
| --------------------- | --------- |
| **Amount / Amount** | `1234.56` |
| **Amount / Currency** | `USD` |
-#### Número
+#### Number
**Problem:** Non-numeric characters
**Solution:** Numbers only, period for decimals
@@ -216,7 +216,7 @@ For complete format reference: [Field Mapping](/l/es/user-guide/data-migration/c
## Error: Required Field Missing
-### Lo Que Verás
+### What You'll See
The row is highlighted in yellow with the required field cell marked.
@@ -248,7 +248,7 @@ Before importing, identify required fields:
## Error: Relation Not Found
-### Lo Que Verás
+### What You'll See
This error appears **after the import starts** — the import fails with a message like:
@@ -307,7 +307,7 @@ For more details: [Import Relations](/l/es/user-guide/data-migration/capabilitie
## Error: File Too Large
-### Lo Que Verás
+### What You'll See
This error appears **when uploading your file** — the upload is blocked entirely:
@@ -403,13 +403,13 @@ Avoid errors by checking these before importing:
Phone fields have all required columns
Currency fields have both Amount and Currency Code
-### Relaciones
+### Relations
Parent records imported before child records
Relation columns reference existing records
Domain format matches Twenty's format exactly
-### Modelo de datos
+### Data Model
All custom fields exist in Settings → Data Model
Select options exist before importing
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-companies-via-csv.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
index a67c126503..204aacffe1 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
@@ -3,11 +3,11 @@ title: Import Companies via CSV
description: Complete step-by-step guide to importing companies into Twenty.
---
-## Resumen
+## Overview
This guide walks you through importing your companies into Twenty. **Companies should be imported first** because People and Opportunities link to Companies.
-## Antes de empezar
+## Before You Start
### Prerequisites Checklist
@@ -35,12 +35,12 @@ This guide walks you through importing your companies into Twenty. **Companies s
### Required and Recommended Fields
-| Campo | Required? | Formato | Notas |
+| Field | Required? | Format | Notes |
| ----------------- | ----------- | -------------------- | ------------------------ |
-| **Name** | Recommended | Texto | Company display name |
+| **Name** | Recommended | Text | Company display name |
| **Domain** | Recommended | `https://domain.com` | Unique identifier |
| **Address** | Optional | Multiple columns | See below |
-| **Employees** | Optional | Número | Employee count |
+| **Employees** | Optional | Number | Employee count |
| **Custom fields** | Optional | Varies | Must exist in Data Model |
### Domain Format
@@ -180,7 +180,7 @@ See [How to Update Existing Records](/l/es/user-guide/data-migration/how-tos/upd
- ¡Sí! You can import companies first, then import People later and link them using the company domain.
+ Yes! You can import companies first, then import People later and link them using the company domain.
@@ -192,7 +192,7 @@ See [How to Update Existing Records](/l/es/user-guide/data-migration/how-tos/upd
-## Solución de Problemas
+## Troubleshooting
Having issues? Check:
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
index 7432ddd138..c40355c0d6 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
@@ -3,11 +3,11 @@ title: Import Contacts via CSV
description: Complete step-by-step guide to importing people/contacts into Twenty.
---
-## Resumen
+## Overview
This guide walks you through importing your contacts (People) into Twenty. **Import Companies first** if you want to link People to Companies.
-## Antes de empezar
+## Before You Start
### Prerequisites Checklist
@@ -41,15 +41,15 @@ This guide walks you through importing your contacts (People) into Twenty. **Imp
### Required and Recommended Fields
-| Campo | Required? | Formato | Notas |
-| ---------------------- | ----------- | ----------------- | ------------------------- |
-| **Correo Electrónico** | Recommended | `name@domain.com` | Must be unique |
-| **First Name** | Recommended | Texto | |
-| **Last Name** | Recommended | Texto | |
-| **Company** | Optional | Domain or ID | Links to existing Company |
-| **Phone** | Optional | Multiple columns | See below |
-| **Job Title** | Optional | Texto | |
-| **Custom fields** | Optional | Varies | Must exist in Data Model |
+| Field | Required? | Format | Notes |
+| ----------------- | ----------- | ----------------- | ------------------------- |
+| **Email** | Recommended | `name@domain.com` | Must be unique |
+| **First Name** | Recommended | Text | |
+| **Last Name** | Recommended | Text | |
+| **Company** | Optional | Domain or ID | Links to existing Company |
+| **Phone** | Optional | Multiple columns | See below |
+| **Job Title** | Optional | Text | |
+| **Custom fields** | Optional | Varies | Must exist in Data Model |
### Email Format
@@ -65,7 +65,7 @@ This guide walks you through importing your contacts (People) into Twenty. **Imp
Phone is a **nested field** requiring multiple columns:
-| Column | Ejemplo |
+| Column | Example |
| --------------------------------------- | ------------ |
| **Phones / Primary Phone Number** | `4159095555` |
| **Phones / Primary Phone Country Code** | `US` |
@@ -75,7 +75,7 @@ Phone is a **nested field** requiring multiple columns:
Add a column with the Company's unique identifier:
-| Column Name | Formato | Ejemplo |
+| Column Name | Format | Example |
| --------------- | ---------- | -------------------------------------- |
| `companyDomain` | URL format | `https://acme.com` |
| `companyId` | UUID | `c776ee49-f608-4a77-8cc8-6fe96ae1e43f` |
@@ -127,12 +127,12 @@ Twenty automatically tries to match your columns to fields. Review and adjust:
### Important Mapping Rules
-| Column Type | Map To | Notas |
-| ------------------ | ------------------------------ | ---------------------------------- |
-| Company reference | **Company** relation field | Use domain OR id, not both |
-| Correo electrónico | **Correo Electrónico** | Primary email address |
-| Additional emails | **Emails / Additional Emails** | Array format |
-| Teléfono | Separate columns | Number, Country Code, Calling Code |
+| Column Type | Map To | Notes |
+| ----------------- | ------------------------------ | ---------------------------------- |
+| Company reference | **Company** relation field | Use domain OR id, not both |
+| Email | **Email** | Primary email address |
+| Additional emails | **Emails / Additional Emails** | Array format |
+| Phone | Separate columns | Number, Country Code, Calling Code |
@@ -225,7 +225,7 @@ See [How to Update Existing Records](/l/es/user-guide/data-migration/how-tos/upd
- ¡Sí! Create a custom field marked as "unique" in your data model to store the external ID. Note: the field name `id` is reserved for Twenty's internal ID.
+ Yes! Create a custom field marked as "unique" in your data model to store the external ID. Note: the field name `id` is reserved for Twenty's internal ID.
@@ -233,7 +233,7 @@ See [How to Update Existing Records](/l/es/user-guide/data-migration/how-tos/upd
-## Solución de Problemas
+## Troubleshooting
Having issues? Check:
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-data-via-api.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-data-via-api.mdx
index 426081f264..6318a32a6d 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-data-via-api.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-data-via-api.mdx
@@ -3,7 +3,7 @@ title: Import Data via API
description: When and how to use Twenty's APIs for large-scale data imports.
---
-## Resumen
+## Overview
Twenty provides both **GraphQL** and **REST APIs** for programmatic data import. Use the API when CSV import isn't practical for your data volume or when you need automated, recurring imports.
@@ -25,7 +25,7 @@ Twenty provides both **GraphQL** and **REST APIs** for programmatic data import.
Twenty enforces rate limits to ensure system stability:
-| Límite | Valor |
+| Limit | Value |
| -------------------------- | --------------------- |
| **Requests per minute** | 100 |
| **Records per batch call** | 60 |
@@ -57,7 +57,7 @@ Twenty enforces rate limits to ensure system stability:
Twenty supports two API types:
-| API | Best For | Documentación |
+| API | Best For | Documentation |
| ----------- | ----------------------------------------------------------- | ------------------------------------------------ |
| **GraphQL** | Flexible queries, fetching related data, complex operations | [API Docs](/l/es/developers/extend/capabilities/apis) |
| **REST** | Simple CRUD operations, familiar REST patterns | [API Docs](/l/es/developers/extend/capabilities/apis) |
@@ -79,7 +79,7 @@ Just like CSV imports, **order matters** for relations:
4. **Tasks/Notes** (can link to any of the above)
5. **Custom objects** (following their dependencies)
-## Mejores prácticas
+## Best Practices
### Batch Your Requests
@@ -153,7 +153,7 @@ Contact us at [contact@twenty.com](mailto:contact@twenty.com) or explore our [Im
- ¡Sí! Use update mutations (GraphQL) or PUT/PATCH requests (REST) with the record's `id`.
+ Yes! Use update mutations (GraphQL) or PUT/PATCH requests (REST) with the record's `id`.
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx
index e05d11e73e..2ad12f1c89 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx
@@ -3,7 +3,7 @@ title: Import Relations Between Objects via CSV
description: Complete step-by-step guide to linking records during CSV import.
---
-## Resumen
+## Overview
This guide walks you through importing relations between objects—for example, linking People to Companies, or Opportunities to People.
@@ -23,12 +23,12 @@ The "one" side is the **parent**. The "many" side is the **child**.
### Common Relations in Twenty
-| Relación | "One" Side (Parent) | "Many" Side (Child) |
+| Relation | "One" Side (Parent) | "Many" Side (Child) |
| ------------------------- | ------------------- | ------------------- |
-| Companies → People | Empresa | Personas |
-| Companies → Opportunities | Empresa | Oportunidades |
-| People → Tasks | Persona | Tareas |
-| People → Notes | Persona | Notas |
+| Companies → People | Company | People |
+| Companies → Opportunities | Company | Opportunities |
+| People → Tasks | Person | Tasks |
+| People → Notes | Person | Notes |
## Step 1: Identify the "One" and "Many" Sides
@@ -60,12 +60,12 @@ The parent ("one" side) must exist in Twenty before you can reference it.
You need to reference the parent record using a **unique identifier**. Available options:
-| Parent Object | Available Unique Identifiers |
-| ----------------------------------- | --------------------------------------------------------------- |
-| **Companies** | `id` (UUID), `domain` (recommended), or any custom unique field |
-| **People** | `id` (UUID), `email`, or any custom unique field |
-| **Miembros del espacio de trabajo** | `id` (UUID), `email` (not name) |
-| **Objetos personalizados** | `id` (UUID), or any field marked as unique |
+| Parent Object | Available Unique Identifiers |
+| --------------------- | --------------------------------------------------------------- |
+| **Companies** | `id` (UUID), `domain` (recommended), or any custom unique field |
+| **People** | `id` (UUID), `email`, or any custom unique field |
+| **Workspace Members** | `id` (UUID), `email` (not name) |
+| **Custom Objects** | `id` (UUID), or any field marked as unique |
**Recommended:** Use `domain` for Companies and `email` for People. These are human-readable and easy to verify in your spreadsheet.
@@ -110,11 +110,11 @@ The `companyDomain` column references the Company's domain.
### Format Requirements
-| Identificador | Formato | Ejemplo |
-| ------------------ | -------------- | -------------------------------------- |
-| Dominio | URL format | `https://acme.com` |
-| Correo electrónico | Standard email | `john@acme.com` |
-| ID | UUID | `c776ee49-f608-4a77-8cc8-6fe96ae1e43f` |
+| Identifier | Format | Example |
+| ---------- | -------------- | -------------------------------------- |
+| Domain | URL format | `https://acme.com` |
+| Email | Standard email | `john@acme.com` |
+| ID | UUID | `c776ee49-f608-4a77-8cc8-6fe96ae1e43f` |
**Domain format matters!**
@@ -184,7 +184,7 @@ Review proposal,jane@yourcompany.com
- ¡Sí! Include the child record's unique identifier (e.g., `email` for People) and the new relation value. The import will update the relation.
+ Yes! Include the child record's unique identifier (e.g., `email` for People) and the new relation value. The import will update the relation.
@@ -196,7 +196,7 @@ Review proposal,jane@yourcompany.com
- The import will show an error for that row. Puedes hacerlo de las siguientes maneras:
+ The import will show an error for that row. You can either:
* Import the parent record first, then re-import
* Fix the reference value
@@ -219,7 +219,7 @@ Review proposal,jane@yourcompany.com
If you're getting "not found" errors but the record seems to exist, check Command Menu → See deleted records. The parent may have been soft-deleted.
-## Solución de Problemas
+## Troubleshooting
Having issues? Check:
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
index 667ce1a133..5a845ead29 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
@@ -1,9 +1,9 @@
---
-title: Migración desde otros CRM
+title: Migrating from Other CRMs
description: Step-by-step guide to migrate your data from any CRM to Twenty.
---
-## Resumen
+## Overview
This guide walks you through migrating your data from any CRM to Twenty. The process involves auditing your data, preparing your Twenty workspace, exporting from your current system, and importing into Twenty.
@@ -72,7 +72,7 @@ Before importing data, prepare your Twenty workspace:
If your data includes user references (Account Owner, Assignee, etc.), those users must exist in Twenty before import. Otherwise, those relations cannot be mapped.
-1. Ir a **Ajustes → Miembros**
+1. Go to **Settings → Members**
2. Invite all team members
3. **Wait for everyone to accept** their invitation
4. Verify all users appear in your Members list
@@ -92,7 +92,7 @@ Export your data from your current CRM:
2. Contacts / People
3. Deals / Opportunities
4. Notes and Activities
-5. Objetos personalizados
+5. Custom objects
## Step 5: Clean and Format Your Data
@@ -106,14 +106,14 @@ Open each exported CSV in a spreadsheet application and prepare it for Twenty.
### Format Fields Correctly
-| Field Type | Required Format |
-| ---------------------- | ------------------------------------------------- |
-| **Domain** | `https://domain.com` |
-| **Correo Electrónico** | `name@domain.com` (must be unique) |
-| **Date** | `YYYY-MM-DD` |
-| **Phone** | Three columns: Number, Country Code, Calling Code |
-| **Boolean** | `TRUE` or `FALSE` (uppercase) |
-| **Select fields** | Use API names, not display labels |
+| Field Type | Required Format |
+| ----------------- | ------------------------------------------------- |
+| **Domain** | `https://domain.com` |
+| **Email** | `name@domain.com` (must be unique) |
+| **Date** | `YYYY-MM-DD` |
+| **Phone** | Three columns: Number, Country Code, Calling Code |
+| **Boolean** | `TRUE` or `FALSE` (uppercase) |
+| **Select fields** | Use API names, not display labels |
**Domain format is critical.**
@@ -207,7 +207,7 @@ After importing data, complete your workspace configuration:
* Set up saved views with filters, sorts, and column configurations
* Create any kanban or calendar views you need
-### Recrear flujos de trabajo
+### Recreate Workflows
* Rebuild your automations in **Settings → Workflows**
* Start with the most critical workflows
@@ -229,7 +229,7 @@ After importing data, complete your workspace configuration:
* Walk through the new interface together
* Document any team-specific processes
-## Problemas Comunes y Soluciones
+## Common Issues and Solutions
| Issue | Cause | Solution |
| ----------------------- | --------------------------- | ------------------------------------------------------------------------------------ |
@@ -241,7 +241,7 @@ After importing data, complete your workspace configuration:
See [How to Fix Import Errors](/l/es/user-guide/data-migration/how-tos/fix-import-errors) for detailed troubleshooting steps.
-## Lista de verificación post-migración
+## Post-Migration Checklist
### Data Integrity
@@ -251,7 +251,7 @@ See [How to Fix Import Errors](/l/es/user-guide/data-migration/how-tos/fix-impor
Custom fields populated
No unexpected duplicates
-### Configuración
+### Configuration
Views recreated
Workflows recreated and tested
@@ -283,7 +283,7 @@ See [How to Fix Import Errors](/l/es/user-guide/data-migration/how-tos/fix-impor
-## ¿Necesitas Ayuda?
+## Need Help?
For complex migrations or large datasets:
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx
index 57584facbe..56a4be072a 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx
@@ -1,9 +1,9 @@
---
-title: Migración de autogestionado a la nube
+title: Migrating from Self-Hosted to Cloud
description: Step-by-step guide to migrate your Twenty self-hosted instance to Twenty Cloud.
---
-## Resumen
+## Overview
This guide walks you through migrating your data from a Twenty self-hosted instance to Twenty Cloud. The process involves setting up your cloud workspace, exporting your data, and re-importing it.
@@ -50,9 +50,9 @@ Export each object from your self-hosted instance:
**Export in this order** (for reference when importing):
-1. Empresas
-2. Personas
-3. Oportunidades
+1. Companies
+2. People
+3. Opportunities
4. Custom objects (following their dependencies)
5. Tasks, Notes
@@ -69,14 +69,14 @@ The exported CSVs contain user IDs from your self-hosted instance. These IDs won
**Example:**
-Antes:
+Before:
```csv
name,domain,accountOwnerId
Acme Corp,https://acme.com,old-uuid-123
```
-Después:
+After:
```csv
name,domain,accountOwnerEmail
@@ -115,12 +115,12 @@ For each CSV file, in order:
After importing data, manually recreate:
-### Vistas
+### Views
* Recreate saved views with filters, sorts, and column configurations
* Set up any kanban or calendar views
-### Flujos de trabajo
+### Workflows
* Recreate automations in **Settings → Workflows**
* Test each workflow before relying on it
@@ -130,12 +130,12 @@ After importing data, manually recreate:
* Configure roles in **Settings → Roles**
* Assign users to appropriate roles
-### Integraciones
+### Integrations
* Reconnect email and calendar sync for each user
* Reconfigure any API integrations with new API keys
-## Lista de verificación post-migración
+## Post-Migration Checklist
All data imported successfully
Relations between objects working correctly
@@ -166,6 +166,6 @@ After importing data, manually recreate:
-## ¿Necesitas Ayuda?
+## Need Help?
For complex migrations or large datasets, contact us at [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/es/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
index a2d96203ce..f8793eaf22 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
@@ -1,87 +1,87 @@
---
-title: Prepara tus archivos CSV},{
-description: Guía completa paso a paso para dar formato a tus datos para importarlos en Twenty.
+title: Prepare Your CSV Files
+description: Complete step-by-step guide to format your data for import into Twenty.
---
-## Resumen
+## Overview
-Esta guía te explica cómo preparar tu archivo CSV para una importación exitosa. Sigue estos pasos para evitar errores.
+This guide walks you through preparing your CSV file for a successful import. Follow these steps in order to avoid errors.
-## Paso 1: Comprueba los requisitos del archivo
+## Step 1: Check File Requirements
-Antes de empezar, asegúrate de que tu archivo cumpla estos requisitos:
+Before you start, ensure your file meets these requirements:
-| Requisito | Detalles |
-| -------------------- | ----------------------------- |
-| **Formato** | CSV, XLSX o XLS |
-| **Límite de tamaño** | 10.000 registros por archivo |
-| **Codificación** | Se recomienda UTF-8 |
-| **Estructura** | Un tipo de objeto por archivo |
+| Requirement | Details |
+| -------------- | ------------------------ |
+| **Format** | CSV, XLSX, or XLS |
+| **Size limit** | 10,000 records per file |
+| **Encoding** | UTF-8 recommended |
+| **Structure** | One object type per file |
-Para conjuntos de datos de más de 10.000 registros, divídelos en varios archivos o usa la [importación por API](/l/es/user-guide/data-migration/how-tos/import-data-via-api).
+For datasets larger than 10,000 records, split into multiple files or use the [API import](/l/es/user-guide/data-migration/how-tos/import-data-via-api).
-## Paso 2: Descarga el archivo de ejemplo
+## Step 2: Download the Sample File
-**Este es el paso más importante.** El archivo de ejemplo te muestra los nombres de columna y el formato exactos que Twenty espera.
+**This is the most important step.** The sample file shows you the exact column names and format Twenty expects.
-1. Ve a la vista del objeto (Personas, Empresas, etc.)
-2. Haz clic en **⋮** → **Importar registros**
-3. Haz clic en **Descargar archivo de ejemplo**
-4. Utiliza este archivo como plantilla
+1. Go to the object view (People, Companies, etc.)
+2. Click **⋮** → **Import records**
+3. Click **Download sample file**
+4. Use this file as your template
-**Consejo práctico:** En su lugar, exporta algunos registros existentes. Esto te proporciona ejemplos reales de cómo debe darse formato a los datos, y los nombres de las columnas se asignarán automáticamente durante la importación.
+**Pro tip:** Export a few existing records instead. This gives you real examples of how data should be formatted, and the column names will map automatically during import.
-## Paso 3: Eliminar valores duplicados
+## Step 3: Remove Duplicate Values
-Twenty exige unicidad en determinados campos. Los duplicados provocarán errores de importación.
+Twenty enforces uniqueness on certain fields. Duplicates will cause import errors.
-| Objeto | Campos únicos |
-| -------------------------- | ------------------------------------------------------------ |
-| **Personas** | `id`, `email` |
-| **Empresas** | `id`, `domain` |
-| **Objetos personalizados** | `id`, además de cualquier campo que hayas marcado como único |
+| Object | Unique Fields |
+| ------------------ | ----------------------------------------- |
+| **People** | `id`, `email` |
+| **Companies** | `id`, `domain` |
+| **Custom objects** | `id`, plus any field you marked as unique |
-**Antes de importar:**
+**Before importing:**
-1. Ordena tu hoja de cálculo por el campo único (correo electrónico o dominio)
-2. Elimina o fusiona las filas duplicadas
-3. Comprueba si hay duplicados que ya existan en Twenty
+1. Sort your spreadsheet by the unique field (email or domain)
+2. Remove or merge duplicate rows
+3. Check for duplicates that already exist in Twenty
-**Los registros eliminados lógicamente cuentan para la unicidad.** Los registros en Menú de comandos → Ver registros eliminados provocarán errores de duplicados. Elimínalos de forma permanente o restáuralos y actualízalos.
+**Soft-deleted records count toward uniqueness.** Records in Command Menu → See deleted records will cause duplicate errors. Delete them permanently or restore and update them.
-## Paso 4: Formatea correctamente cada tipo de campo
+## Step 4: Format Each Field Type Correctly
-Los distintos tipos de campos requieren formatos específicos. Aquí tienes la referencia completa:
+Different field types require specific formats. Here's the complete reference:
-### Campos de texto
+### Text Fields
-* No se requiere un formato especial
-* Los espacios iniciales y finales se eliminan automáticamente
+* No special formatting required
+* Leading/trailing spaces are automatically trimmed
-### Campos de correo electrónico
+### Email Fields
-* Debe tener un formato de correo electrónico válido: `name@domain.com`
-* Debe ser único (sin duplicados en el archivo ni en Twenty)
-* Para correos electrónicos adicionales, utiliza este formato en la columna **Emails / Additional Emails**:
+* Must be valid email format: `name@domain.com`
+* Must be unique (no duplicates in file or in Twenty)
+* For additional emails, use this format in the **Emails / Additional Emails** column:
```
-[\"jane@twenty.com\",\"jane.doe@twenty.com\"]
+["jane@twenty.com","jane.doe@twenty.com"]
```
-### Campos de dominio
+### Domain Fields
-* **Formato recomendado**: `https://domain.com`
-* Esto coincide con el formato usado por la sincronización del buzón/calendario (evita duplicados)
-* Rellena ambas columnas:
+* **Recommended format**: `https://domain.com`
+* This matches the format used by mailbox/calendar sync (prevents duplicates)
+* Fill both columns:
* **Domain / Domain Label**: `domain.com`
* **Domain / Domain URL**: `https://domain.com`
-* Debe ser único dentro de tu archivo y en Twenty
+* Must be unique within your file and in Twenty
-### Campos de teléfono
+### Phone Fields
-El campo de teléfono es un **campo anidado** que requiere varias columnas:
+Phone is a **nested field** requiring multiple columns:
-| Columna | Ejemplo |
+| Column | Example |
| --------------------------------------- | ------------ |
| **Phones / Primary Phone Number** | `4159095555` |
| **Phones / Primary Phone Country Code** | `US` |
@@ -117,7 +117,7 @@ Use consistent formatting throughout your file:
Currency is a **nested field** requiring two columns that **both must be filled**:
-| Column | Ejemplo |
+| Column | Example |
| --------------------- | --------- |
| **Amount / Amount** | `1234.56` |
| **Amount / Currency** | `USD` |
@@ -128,7 +128,7 @@ Use uppercase: `TRUE` or `FALSE`
Lowercase `true` or `false` will not work.
-### Campos de Selección
+### Select Fields
Use the **API name** of the option, not the display label.
@@ -261,7 +261,7 @@ Before uploading your file, verify:
| Wrong domain format | Use `https://domain.com` consistently |
| Mapping multiple unique fields for relations | Map only ONE (domain OR id, not both) |
-## Próximos Pasos
+## Next Steps
Your file is ready! Now:
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx
index 3834b6fcf2..8fc9a9c108 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx
@@ -3,18 +3,18 @@ title: Update Existing Records via Import
description: Complete step-by-step guide to bulk updating records using CSV import.
---
-## Resumen
+## Overview
Need to update many records at once? Instead of editing them one by one, use the CSV import to bulk update existing records.
-**Casos de uso:**
+**Use cases:**
* Update job titles for multiple people
* Change company information in bulk
* Add data to new custom fields
* Correct data errors across many records
-## Cómo Funciona
+## How It Works
When you import a file containing a **unique identifier** that matches an existing record, Twenty updates that record instead of creating a duplicate.
@@ -99,11 +99,11 @@ Twenty matches records by the unique identifier and updates them with new values
## Choosing the Right Unique Identifier
-| Objeto | Recommended | Alternative | Notas |
-| -------------------------- | -------------------- | ----------- | ---------------------------- |
-| **People** | `correo Electrónico` | `id` | Email is human-readable |
-| **Companies** | `dominio` | `id` | Domain is human-readable |
-| **Objetos personalizados** | Any unique field | `id` | Use your custom unique field |
+| Object | Recommended | Alternative | Notes |
+| ------------------ | ---------------- | ----------- | ---------------------------- |
+| **People** | `email` | `id` | Email is human-readable |
+| **Companies** | `domain` | `id` | Domain is human-readable |
+| **Custom objects** | Any unique field | `id` | Use your custom unique field |
**Use only ONE unique identifier.** Don't map both `email` AND `id`. This can cause confusion and errors.
@@ -127,7 +127,7 @@ After importing:
**Fields not included in your import file remain unchanged.**
-| Your file includes... | Resultado |
+| Your file includes... | Result |
| ---------------------------- | ------------------------------------------------------ |
| `email`, `jobTitle` | Only `jobTitle` is updated; other fields stay the same |
| `email`, `jobTitle`, `phone` | `jobTitle` and `phone` are updated |
@@ -146,7 +146,7 @@ newperson@acme.com,New,Person,Analyst ← Creates new (email doesn't match)
## Common Mistakes to Avoid
-| Mistake | Problem | Resultado | Solution |
+| Mistake | Problem | Result | Solution |
| ------------------------------ | ------------------------------------------------------- | -------------------------------------- | ----------------------------------------- |
| **Changing unique identifier** | Changed `john@acme.com` to `john.smith@acme.com` | Creates new record instead of updating | Keep unique identifiers unchanged |
| **Multiple unique fields** | Mapping both `email` AND `id` | Potential matching conflicts | Map only ONE unique identifier |
@@ -169,7 +169,7 @@ newperson@acme.com,New,Person,Analyst ← Creates new (email doesn't match)
- ¡Sí! Include the relation's unique identifier (e.g., `companyDomain`) and map it to the relation field. The relation will be updated.
+ Yes! Include the relation's unique identifier (e.g., `companyDomain`) and map it to the relation field. The relation will be updated.
@@ -181,7 +181,7 @@ newperson@acme.com,New,Person,Analyst ← Creates new (email doesn't match)
-## Mejores prácticas
+## Best Practices
1. **Export first** — always start from an export to ensure correct format
2. **Backup before updating** — export your data before making bulk changes
@@ -189,7 +189,7 @@ newperson@acme.com,New,Person,Analyst ← Creates new (email doesn't match)
4. **Use human-readable identifiers** — `email` and `domain` are easier to verify than `id`
5. **Only include necessary columns** — fewer columns means less chance for errors
-## Solución de Problemas
+## Troubleshooting
Having issues? Check:
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/overview.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/overview.mdx
index 2500fd7da2..ed05000a51 100644
--- a/packages/twenty-docs/l/es/user-guide/data-migration/overview.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/overview.mdx
@@ -1,89 +1,89 @@
---
-title: Migración de datos
-description: Importe y exporte sus datos de CRM mediante archivos CSV o la API.
+title: Data Migration
+description: Import and export your CRM data via CSV files or API.
image: /images/user-guide/import-export-data/cloud.png
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-
+
-## Métodos de importación
+## Import Methods
-Twenty admite dos métodos principales para importar datos:
+Twenty supports two main methods for importing data:
-| Método | Ideal para | Límite de volumen |
-| ---------------------------- | ------------------------------------------------ | ---------------------------- |
-| **Importación CSV** | Migraciones estándar, actualizaciones periódicas | 10.000 registros por archivo |
-| **Importación mediante API** | Migraciones a gran escala, automatización | Ilimitado |
+| Method | Best For | Volume Limit |
+| -------------- | ------------------------------------ | ----------------------- |
+| **CSV Import** | Standard migrations, regular updates | 10,000 records per file |
+| **API Import** | Large-scale migrations, automation | Unlimited |
-Para conjuntos de datos muy grandes (cientos de miles de registros), use la API. Nuestros [socios de implementación](/l/es/user-guide/getting-started/capabilities/implementation-services) pueden ayudar a ejecutar estos scripts si es necesario.
+For very large datasets (hundreds of thousands of records), use the API. Our [implementation partners](/l/es/user-guide/getting-started/capabilities/implementation-services) can help run these scripts if needed.
-## Conceptos básicos de la importación CSV
+## CSV Import Basics
-Puede importar datos de cualquier objeto mediante archivos CSV, XLSX o XLS. Cada archivo debe contener **solo un tipo de objeto** (por ejemplo, solo registros de Personas).
+You can import data for any object using CSV, XLSX, or XLS files. Each file should contain **only one type of object** (e.g., only People records).
-**Los campos deben existir antes de la importación.** Cargar un CSV crea registros, pero no crea campos. Si necesita campos personalizados, créelos primero en **Configuración → Modelo de datos**.
+**Fields must exist before import.** Uploading a CSV creates records but does not create fields. If you need custom fields, create them first under **Settings → Data Model**.
-### Pasos
+### Steps
-1. Vaya al objeto en el que desea importar datos
-2. Haga clic en el icono **⋮** en la esquina superior derecha (este es el Menú de comandos) y haga clic en **Importar registros**
-3. Descargue el archivo de plantilla para asegurarse de que sus datos estén en el formato esperado
-4. Cargue su archivo CSV con el formato correcto
-5. Asigne sus columnas a los campos de Twenty
-6. Revise los errores (resaltados en amarillo) y corríjalos, editando directamente en la interfaz de usuario
-7. Confirme la importación
+1. Navigate to the object where you want to import data
+2. Click the **⋮** icon on the top right (this is the Command Menu) and click on **Import records**
+3. Download the template file to ensure your data is in the expected format
+4. Upload your formatted CSV file
+5. Map your columns to Twenty fields
+6. Review errors (highlighted in yellow) and fix them, directly editing in the UI
+7. Confirm the import
-### Importación de relaciones entre objetos
+### Importing relations between objects
-Puede importar relaciones entre objetos utilizando la función de importación CSV. Debe hacer referencia al objeto relacionado utilizando un campo único de ese objeto: el `id`, el `email` para Personas y Miembros del espacio de trabajo, el `domain` para empresas, cualquier otro campo establecido como único en el modelo de datos para cualquier otro objeto.
+You can import relations between objects using the csv import function. You need to reference the related object using a unique field from this object: the `id`, the `email` for People and Workspace Members, the `domain` for companies, any other field set as unique in the data model for any other object.
-**Los registros eliminados cuentan para la unicidad.** Los registros eliminados lógicamente (visibles en Menú de comandos → Ver registros eliminados) se incluyen en las comprobaciones de unicidad. Si importa un registro con el mismo valor único que un registro eliminado, el registro eliminado se restaurará.
+**Deleted records count toward uniqueness.** Soft-deleted records (visible under Command Menu → See deleted records) are included in uniqueness checks. If you import a record with the same unique value as a deleted record, the deleted record will be restored.
- **¡Importa el orden de importación!**
+ **Import Order Matters!**
- Al importar objetos relacionados, cargue los archivos en este orden:
+ When importing related objects, upload files in this order:
- 1. **Empresas** primero (el lado "uno" de las relaciones)
- 2. **Personas** segundo (vinculadas a empresas mediante companyId)
- 3. **Oportunidades** tercero (vinculadas a empresas/personas)
- 4. **Objetos personalizados** con relaciones al final
+ 1. **Companies** first (the "one" side of relationships)
+ 2. **People** second (linked to companies via companyId)
+ 3. **Opportunities** third (linked to companies/people)
+ 4. **Custom objects** with relations last
- ¿Por qué? El lado "uno" de una relación de uno a muchos debe existir antes de que pueda hacer referencia a él. Por ejemplo, el registro de Empresa debe existir antes de importar una Persona con el ID de esa empresa.
+ Why? The "one" side of a one-to-many relationship must exist before you can reference it. For example, the Company record must exist before you import a Person with that company's ID.
-Consulte [este artículo](/l/es/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) para ver una guía paso a paso sobre cómo proceder.
+Please refer to [this article](/l/es/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for a step-by-step guide on how to proceed.
-## Exportar Datos
+## Export Data
-Exporte los datos de su espacio de trabajo para copias de seguridad, informes o migración.
+Export your workspace data for backups, reporting, or migration.
-### Pasos
+### Steps
-1. Vaya al objeto que desea exportar
-2. Configure la vista con las columnas que necesita
-3. Haga clic en **⋮** → **Exportar vista**
-4. Guarde el archivo CSV
+1. Navigate to the object you want to export
+2. Configure the view with the columns you need
+3. Click **⋮** → **Export view**
+4. Save the CSV file
-**Solo se exportan las columnas visibles.** El archivo CSV contendrá únicamente las columnas que se muestran en su vista actual. Agregue u oculte columnas antes de exportar para controlar qué datos se incluyen.
+**Only visible columns are exported.** The CSV file will only contain the columns displayed in your current view. Add or hide columns before exporting to control what data is included.
-**Límites de exportación**: hasta 20.000 registros por exportación.
+**Export limits**: Up to 20,000 records per export.
-## Permisos
+## Permissions
-La importación y exportación de datos requieren permisos específicos:
+Data import and export require specific permissions:
-* **Importación**: requiere el permiso "Importar CSV"
-* **Exportación**: requiere el permiso "Exportar CSV"
+* **Import**: Requires "Import CSV" permission
+* **Export**: Requires "Export CSV" permission
-Póngase en contacto con el administrador de su espacio de trabajo si no tiene estos permisos.
+Contact your workspace admin if you don't have these permissions.
-## Próximos Pasos
+## Next Steps
-* [Prepare sus archivos CSV](/l/es/user-guide/data-migration/how-tos/prepare-your-csv-files)
-* [Importe relaciones entre objetos](/l/es/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
-* [Importe mediante API para conjuntos de datos grandes](/l/es/user-guide/data-migration/how-tos/import-data-via-api)
+* [Prepare your CSV files](/l/es/user-guide/data-migration/how-tos/prepare-your-csv-files)
+* [Import relations between objects](/l/es/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+* [Import via API for large datasets](/l/es/user-guide/data-migration/how-tos/import-data-via-api)
diff --git a/packages/twenty-docs/l/es/user-guide/data-model/capabilities/fields.mdx b/packages/twenty-docs/l/es/user-guide/data-model/capabilities/fields.mdx
index 0166d8e489..ef477158c2 100644
--- a/packages/twenty-docs/l/es/user-guide/data-model/capabilities/fields.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-model/capabilities/fields.mdx
@@ -1,122 +1,122 @@
---
-title: Campos
-description: Comprenda el papel de los campos y cómo gestionarlos.
+title: Fields
+description: Understand the role of fields and how to manage them.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-## Acerca de los Campos
+## About Fields
-Los campos son como columnas en una hoja de cálculo. Almacenan diferentes tipos de datos como texto, números o fechas. Los campos pueden ser estándar (integrados) o personalizados (los que usted crea).
+Fields are like columns in a spreadsheet. They store different types of data like text, numbers, or dates. Fields can be standard (built-in) or custom (the ones you create).
-### Campos Estándar
+### Standard Fields
-Los campos estándar vienen integrados con Twenty para cubrir necesidades empresariales comunes.
+Standard fields come built-in with Twenty to handle common business needs.
-Por ejemplo, `Nombre` y `Apellido` son campos estándar en el objeto `Personas`. Almacenan datos de texto para nombres individuales.
+For example, `First Name` and `Last Name` are standard fields in the `People` object. They store text data for individual names.
-No puede eliminar campos estándar, pero puede desactivarlos si no los necesita.
+You cannot delete standard fields, but you can deactivate them if you don't need them.
-También puede personalizar las opciones de los campos estándar de tipo `SELECT`, por ejemplo, las opciones para la `Etapa` en Oportunidades.
+You can also customize the options of the standard `SELECT` type fields, for example the options for the `Stage` on Opportunities.
-### Campos Personalizados
+### Custom Fields
-Se pueden añadir campos personalizados a cualquier objeto. Puede almacenar texto, números, fechas, selecciones desplegables y más. Utilice campos personalizados para rastrear información específica de su negocio.
+Custom fields can be added to any object. You can store text, numbers, dates, dropdown selections, and more. Use custom fields to track information that's specific to your business.
-Por ejemplo, un campo personalizado para SpaceX podría ser `Estado Activo del Cohete`, indicando si un cohete está operativo.
+For instance, a custom field for SpaceX could be `Rocket Active Status`, indicating if a rocket is operational.
-## Tipos de campo
+## Field Types
-Twenty admite varios tipos de campo:
+Twenty supports various field types:
-| Tipo | Descripción | Ejemplo |
-| ------------------ | --------------------------------------------------------------------- | ------------------------------- |
-| Dirección | Dirección estructurada con calle, ciudad, estado, país, código postal | Dirección de la oficina |
-| Array | Lista de valores de texto | Etiquetas |
-| Booleano | Casilla de verificación verdadero/falso | Activo |
-| Moneda | Valor monetario con código de moneda | Importe del acuerdo (USD) |
-| Fecha | Valores de fecha | Fecha de cierre |
-| Fecha y hora | Fecha con hora | Hora de la reunión |
-| Dominio | Dominio del sitio web (usado para Empresas) | acme.com |
-| Correo electrónico | Direcciones de correo electrónico (con principal + adicionales) | Correo electrónico del contacto |
-| JSON | Datos JSON estructurados | Metadatos personalizados |
-| Enlaces | URLs con etiquetas (principal + secundaria) | Sitio web, LinkedIn |
-| Texto largo | Texto multilínea | Descripción, notas |
-| Selección múltiple | Varias opciones de una lista predefinida | Etiquetas, categorías |
-| Número | Valores numéricos (enteros o decimales) | Cantidad, puntuación |
-| Teléfono | Números de teléfono con código de país | Teléfono del trabajo |
-| Valoración | Valoración por estrellas (1-5) | Prioridad, puntuación |
-| Relación | Enlaces a registros en otros objetos | Empresa → Personas |
-| Selección | Una sola opción de una lista predefinida | Etapa, estado |
-| Texto | Una sola línea de texto | Nombre, título |
+| Type | Description | Example |
+| ------------ | ----------------------------------------------------------------- | ------------------ |
+| Address | Structured address with street, city, state, country, postal code | Office Address |
+| Array | List of text values | Tags |
+| Boolean | True/false checkbox | Is Active |
+| Currency | Monetary value with currency code | Deal Amount (USD) |
+| Date | Date values | Close Date |
+| Date & Time | Date with time | Meeting Time |
+| Domain | Website domain (used for Companies) | acme.com |
+| Email | Email addresses (with primary + additional) | Contact Email |
+| JSON | Structured JSON data | Custom metadata |
+| Links | URLs with labels (primary + secondary) | Website, LinkedIn |
+| Long Text | Multi-line text | Description, Notes |
+| Multi-Select | Multiple choices from a predefined list | Tags, Categories |
+| Number | Numeric values (integers or decimals) | Quantity, Score |
+| Phone | Phone numbers with country code | Work Phone |
+| Rating | Star rating (1-5) | Priority, Score |
+| Relation | Links to records in other objects | Company → People |
+| Select | Single choice from a predefined list | Stage, Status |
+| Text | Single line of text | Name, Title |
-## Crear un Campo Personalizado
+## Create a Custom Field
-Para agregar un campo personalizado a cualquier objeto, siga estos pasos:
+To add a custom field to any object, follow these steps:
-1. Vaya a `Configuración` en la barra lateral izquierda.
-2. Vaya a `Modelo de Datos`, luego seleccione el objeto que desea personalizar.
-3. Proceda haciendo clic en `Agregar Campo`.
-4. Elija un nombre de campo y tipo que se adapten a sus requisitos. Considere agregar una descripción de campo para una mejor comprensión.
+1. Go to `Settings` in the left sidebar.
+2. Go to `Data Model`, then select the object you wish to customize.
+3. Proceed by clicking on `Add Field`.
+4. Choose a field name and type that suits your requirements. Consider adding a field description for better understanding.
-Su nuevo campo creado ahora está disponible dentro de los campos de la aplicación. Para mostrarlo en una vista específica, haga clic en el menú de opciones, luego seleccione `Campos`.
+Your newly created field is now available within the application's fields. To display it on a specific view, click on the options menu, then select `Fields`.
-
+
-**Forma rápida:** Haga clic en el botón **+** en la esquina superior derecha de cualquier tabla de objetos, luego seleccione `Personalizar campos`. Esto lo lleva directamente a la configuración del Modelo de Datos.
+**Quick way:** Click the **+** button at the top right of any object table, then select `Customize fields`. This takes you directly to the Data Model settings.
-## Desactivar un campo
+## Deactivate a Field
-Puede desactivar un campo para ocultarlo de la aplicación sin perder sus datos. Piense en ello como ocultar el campo en lugar de eliminarlo.
+You can deactivate a field to hide it from the app without losing your data. Think of it as hiding the field rather than deleting it.
-Así es como puede hacerlo:
+Here's how you can do it:
-1. Encuentre el campo que desea desactivar en la configuración de su objeto.
+1. Find the field you want to deactivate in your object settings.
-2. Haga clic en los tres puntos `⋮` junto al campo para abrir el menú.
+2. Click the three dots `⋮` next to the field to open the menu.
-3. Seleccione `Desactivar` en el menú desplegable.
+3. Select `Deactivate` from the dropdown.
-¿Qué ocurre cuando desactiva un campo?
+What happens when you deactivate a field?
-1. **En la aplicación:** El campo desaparece y no puede añadir nuevos valores.
+1. **In the app:** The field disappears and you can't add new values to it.
-2. **Relaciones existentes:** Si es un campo de relación, las conexiones existentes permanecen, pero no puede crear nuevas.
+2. **Existing relationships:** If it's a relation field, existing connections stay but you can't create new ones.
-3. **Acceso API:** Aún puede acceder al campo y sus datos a través de la API.
+3. **API access:** You can still access the field and its data through the API.
-Puede reactivar los Campos Estándar y Personalizados o tener la opción de eliminarlos permanentemente.
+You can reactivate Standard and Custom Fields or have the option to permanently delete them.
-## Hacer Campos Únicos
+## Make Fields Unique
-Haga un campo único para asegurar que registros distintos no puedan tener el mismo valor. Por ejemplo, las direcciones de correo electrónico son únicas para cada persona.
+Make a field unique to ensure distinct records cannot have the same value. For example, email addresses are unique for each person.
-Si recibe un error al establecer la unicidad, verifique los valores duplicados en sus datos (incluso registros eliminados).
+If you get an error when setting uniqueness, check for duplicate values in your data (including deleted records).
-## Mejores Prácticas de Configuración de Campos
+## Field Configuration Best Practices
-### Convenciones y Limitaciones de Nombres
+### Naming Conventions and Limitations
-* **Los nombres singulares y plurales deben ser distintos**: Nuestra API GraphQL necesita nombres distintos para mutaciones
-* **Nombres de campos protegidos**: algunos nombres están reservados para uso del sistema (p. ej., `Type`, `Application`)
+* **Singular and plural named must be distinct**: Our GraphQL API needs distinct names for mutations
+* **Protected field names**: some names are reserved for system usage (e.g., `Type`, `Application`)
-### Campos de Moneda y Teléfono
+### Currency and Phone Fields
-* **Moneda predeterminada:** se puede configurar a través del modelo de datos
-* **Códigos de país predeterminados:** se pueden configurar para campos de teléfono a través del modelo de datos
+* **Default currency**: can be configured via the data model
+* **Default country codes**: can be configured for phone fields via the data model
-### Campos de Selección
+### Select Fields
-* **Se puede seleccionar una opción predeterminada** para cada campo de Selección
+* **A default option can be selected** for each Select field
-### Campos de Texto del Registro
+### Record Text Fields
-* **Cada objeto tiene un campo principal de visualización**: Este campo aparece en la columna más a la izquierda y representa el registro cuando se vincula a otros objetos. Debe ser un campo de texto. Por ejemplo, las Personas utilizan `Nombre` como el campo principal, por lo que cuando vincula una persona a una empresa, verá su nombre en la vista de la empresa.
+* **Each object has one main display field**: This field appears in the leftmost column and represents the record when linked to other objects. It must be a text field. For example, People uses `Name` as the main field, so when you link a person to a company, you'll see their name in the company's view.
diff --git a/packages/twenty-docs/l/es/user-guide/data-model/capabilities/objects.mdx b/packages/twenty-docs/l/es/user-guide/data-model/capabilities/objects.mdx
index 7259a445ef..f2f1105277 100644
--- a/packages/twenty-docs/l/es/user-guide/data-model/capabilities/objects.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-model/capabilities/objects.mdx
@@ -1,5 +1,5 @@
---
-title: Objetos
+title: Objects
description: Learn about standard and custom objects in Twenty.
---
@@ -7,46 +7,46 @@ import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
## Standard Objects
-Objetos estándar son entidades predefinidas en tu espacio de trabajo para ayudarte a comenzar. Forman parte de un modelo de datos compartido accesible para todos los usuarios de Twenty. Puedes usarlos tal cual, personalizarlos o desactivarlos.
+Standard objects are predefined entities in your workspace to help you get started. They're part of a shared data model accessible to all users of Twenty. You can use them as-is, customize them or deactivate them.
-### Personas
+### People
-El objeto `Personas` almacena tus contactos. Incluye detalles de contacto y el historial de interacciones, para que puedas ver todas tus interacciones con clientes en un solo lugar.
+The `People` object stores your contacts. It includes contact details and interaction history, so you can see all your customer interactions in one place.
-### Empresa
+### Company
-El objeto `Empresas` almacena las cuentas de tu negocio. Incluye detalles como industria, tamaño y ubicación. Las empresas se conectan tanto a los objetos `Personas` como `Oportunidades`.
+The `Companies` object stores your business accounts. It includes details like industry, size and location. Companies connect to both `People` and `Opportunities` objects.
-### Oportunidades
+### Opportunities
-El objeto `Oportunidades` almacena datos relacionados con acuerdos. It tracks the progression of potential sales, from prospecting to closure, recording stages, deal sizes, associated account, and expected close date. Puedes ver tu canal de ventas en un diseño kanban.
+The `Opportunities` object stores deal-related data. It tracks the progression of potential sales, from prospecting to closure, recording stages, deal sizes, associated account, and expected close date. You can view your sales pipeline in a kanban layout.
-### Notas
+### Notes
The `Notes` object stores free-form notes that can be attached to People, Companies, Opportunities, and other records. Use notes to capture meeting summaries, important details, or any contextual information.
-### Tareas
+### Tasks
The `Tasks` object stores to-dos and action items. Tasks can be linked to People, Companies, Opportunities, and other records. Track due dates, assignees, and completion status to stay on top of your follow-ups.
-## Objetos personalizados
+## Custom Objects
-Los objetos personalizados te permiten almacenar información que es única para tu organización y que los objetos estándar no pueden manejar. Por ejemplo, si eres SpaceX, puedes querer crear un objeto personalizado para Cohetes y Lanzamientos.
+Custom objects let you store information that's unique to your organization and that standard objects can't handle. For example, if you're SpaceX, you may want to create a custom object for Rockets and Launches.
### Creating a New Custom Object
-Para crear un nuevo objeto personalizado:
+To create a new custom object:
-1. Ve a Configuración en la barra lateral a la izquierda.
-2. Under Workspace, go to Data model. Aquí podrás ver una visión general de todos tus objetos Estándar y Personalizados (tanto activos como desactivados).
+1. Go to Settings in the sidebar on the left.
+2. Under Workspace, go to Data model. Here you'll be able to see an overview of all your existing Standard and Custom objects (both active and disabled).
-3. Haz clic en `+ Nuevo objeto` en la parte superior. Ingresa el nombre (tanto singular como plural), elige un ícono y añade una descripción para tu objeto personalizado y presiona Guardar (en la parte superior derecha). Usando Listado como un ejemplo de objeto personalizado, el singular sería "listado" y el plural sería "listados" junto con una descripción como "Listados que los anfitriones crearon para mostrar sus propiedades."
+3. Click on `+ New object` at the top. Enter the name (both singular and plural), choose an icon, and add a description for your custom object and hit Save (at the top right). Using Listing as an example of custom object, the singular would be "listing" and the plural would be "listings" along with a description like "Listings that hosts created to showcase their property."
4. Your custom object is now created and will appear in your sidebar. You can start adding records to it right away.
@@ -70,7 +70,7 @@ To bring back a deactivated object:
3. Click the toggle to reactivate it
4. The object and all its data will be restored
-## Mejores prácticas
+## Best Practices
### When to Create Custom Objects
diff --git a/packages/twenty-docs/l/es/user-guide/data-model/capabilities/relation-fields.mdx b/packages/twenty-docs/l/es/user-guide/data-model/capabilities/relation-fields.mdx
index 6d68918b34..ddcd3c709e 100644
--- a/packages/twenty-docs/l/es/user-guide/data-model/capabilities/relation-fields.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-model/capabilities/relation-fields.mdx
@@ -1,5 +1,5 @@
---
-title: Campos de Relación
+title: Relation Fields
description: Connect records across different objects using relation fields.
---
@@ -56,7 +56,7 @@ Many records in Object A can be linked to many records in Object B.
* **Field name on source object**: The name of the relation field on the object you're editing
* **Field name on destination object**: The name of the relation field that will appear on the target object
* Relation type (one-to-many, many-to-one)
-7. Haga clic en **Guardar**
+7. Click **Save**
## Standard Relations
@@ -64,11 +64,11 @@ Twenty comes with pre-built relations between standard objects:
| From Object | To Object | Relation Type |
| ------------- | --------- | ------------- |
-| Personas | Empresas | Many-to-One |
-| Oportunidades | Empresas | Many-to-One |
-| Oportunidades | Personas | Many-to-One |
+| People | Companies | Many-to-One |
+| Opportunities | Companies | Many-to-One |
+| Opportunities | People | Many-to-One |
-## Mejores prácticas
+## Best Practices
### Planning Relations
diff --git a/packages/twenty-docs/l/es/user-guide/data-model/how-tos/create-custom-fields.mdx b/packages/twenty-docs/l/es/user-guide/data-model/how-tos/create-custom-fields.mdx
index be0e5f9a40..5d4e98bc80 100644
--- a/packages/twenty-docs/l/es/user-guide/data-model/how-tos/create-custom-fields.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-model/how-tos/create-custom-fields.mdx
@@ -13,7 +13,7 @@ Custom fields let you capture information specific to your business. Add them to
4. Choose a **field type** (see [Fields](/l/es/user-guide/data-model/capabilities/fields) for all types)
5. Enter the **field name** and optional description
6. Configure field-specific settings (see below)
-7. Haga clic en **Guardar**
+7. Click **Save**
**Quick method:** Click the **+** at the end of column headers in any table view → **Customize fields**.
diff --git a/packages/twenty-docs/l/es/user-guide/data-model/how-tos/create-custom-objects.mdx b/packages/twenty-docs/l/es/user-guide/data-model/how-tos/create-custom-objects.mdx
index a7cde059e2..eee722f9dc 100644
--- a/packages/twenty-docs/l/es/user-guide/data-model/how-tos/create-custom-objects.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-model/how-tos/create-custom-objects.mdx
@@ -18,7 +18,7 @@ Custom objects let you store information unique to your business that standard o
* **Plural name** (e.g., "Listings")
* **Icon**
* **Description** (optional)
-4. Haga clic en **Guardar**
+4. Click **Save**
Your object appears in the sidebar immediately.
diff --git a/packages/twenty-docs/l/es/user-guide/data-model/how-tos/create-relation-fields.mdx b/packages/twenty-docs/l/es/user-guide/data-model/how-tos/create-relation-fields.mdx
index 553f883996..8c153c3962 100644
--- a/packages/twenty-docs/l/es/user-guide/data-model/how-tos/create-relation-fields.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-model/how-tos/create-relation-fields.mdx
@@ -9,7 +9,7 @@ Relation fields connect records from different objects—for example, linking Pe
**Relation names cannot be changed after creation** (they affect the API). Plan your names carefully.
-## Antes de empezar
+## Before You Start
Decide:
@@ -29,7 +29,7 @@ See [Relation Fields](/l/es/user-guide/data-model/capabilities/relation-fields)
5. Choose the **target object**
6. Select **One-to-Many** or **Many-to-One**
7. Enter field names for **both sides** of the relation
-8. Haga clic en **Guardar**
+8. Click **Save**
## Example: People → Companies
diff --git a/packages/twenty-docs/l/es/user-guide/data-model/how-tos/customize-your-data-model.mdx b/packages/twenty-docs/l/es/user-guide/data-model/how-tos/customize-your-data-model.mdx
index ef09faddb6..aff43da0a3 100644
--- a/packages/twenty-docs/l/es/user-guide/data-model/how-tos/customize-your-data-model.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-model/how-tos/customize-your-data-model.mdx
@@ -1,22 +1,22 @@
---
-title: Personaliza tu modelo de datos
-description: Descripción general de las opciones de personalización del modelo de datos.
+title: Customize Your Data Model
+description: Overview of data model customization options.
---
-El modelo de datos de Twenty es totalmente personalizable. Crea objetos, campos y relaciones que se ajusten a tu empresa.
+Twenty's data model is fully customizable. Create objects, fields, and relations to match your business.
-## Enlaces rápidos
+## Quick Links
-| Quiero... | Guía |
-| -------------------------- | ----------------------------------------------------------------------------------------- |
-| Crear un nuevo objeto | [Cómo crear objetos personalizados](/l/es/user-guide/data-model/how-tos/create-custom-objects) |
-| Agregar campos a un objeto | [Cómo crear campos personalizados](/l/es/user-guide/data-model/how-tos/create-custom-fields) |
-| Conectar objetos entre sí | [Cómo crear campos de relación](/l/es/user-guide/data-model/how-tos/create-relation-fields) |
+| I want to... | Guide |
+| ------------------------ | -------------------------------------------------------------------------------------- |
+| Create a new object | [How to Create Custom Objects](/l/es/user-guide/data-model/how-tos/create-custom-objects) |
+| Add fields to an object | [How to Create Custom Fields](/l/es/user-guide/data-model/how-tos/create-custom-fields) |
+| Connect objects together | [How to Create Relation Fields](/l/es/user-guide/data-model/how-tos/create-relation-fields) |
-## Más información
+## Learn More
-* [Comprender tu modelo de datos](/l/es/user-guide/data-model/overview) — conceptos clave y consejos de planificación
-* [Objetos](/l/es/user-guide/data-model/capabilities/objects) — objetos estándar vs personalizados
-* [Campos](/l/es/user-guide/data-model/capabilities/fields) — todos los tipos de campo
-* [Campos de relación](/l/es/user-guide/data-model/capabilities/relation-fields) — conectar objetos
-* [Preguntas frecuentes sobre el modelo de datos](/l/es/user-guide/data-model/how-tos/data-model-faq) — preguntas comunes
+* [Understanding Your Data Model](/l/es/user-guide/data-model/overview) — key concepts and planning tips
+* [Objects](/l/es/user-guide/data-model/capabilities/objects) — standard vs custom objects
+* [Fields](/l/es/user-guide/data-model/capabilities/fields) — all field types
+* [Relation Fields](/l/es/user-guide/data-model/capabilities/relation-fields) — connecting objects
+* [Data Model FAQ](/l/es/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/es/user-guide/data-model/how-tos/data-model-faq.mdx b/packages/twenty-docs/l/es/user-guide/data-model/how-tos/data-model-faq.mdx
index 59b01a0e1f..39baa4df9c 100644
--- a/packages/twenty-docs/l/es/user-guide/data-model/how-tos/data-model-faq.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-model/how-tos/data-model-faq.mdx
@@ -1,16 +1,16 @@
---
-title: Preguntas Frecuentes del Modelo de Datos
+title: Data Model FAQ
description: Frequently asked questions about Twenty's data model.
---
-## Gestión de Objetos
+## Object Management
Yes, custom objects can be deleted. You can also deactivate them first, which hides the object and its data from the interface while preserving the data.
-
+
No, standard objects cannot be deleted. You can only deactivate them, which hides them from the interface but preserves the data.
@@ -26,33 +26,33 @@ description: Frequently asked questions about Twenty's data model.
Yes, you can change the icon for both standard and custom objects in **Settings → Data Model**.
-
- Aún no. La ordenación de objetos en la navegación está actualmente fijada, pero esta función está prevista para una futura versión.
+
+ Not yet. Object ordering in the navigation is currently fixed, but this feature is planned for a future release.
-
- Todos los objetos activos aparecen en la navegación. Puedes desactivar los objetos que no necesites en **Configuración → Modelo de Datos**.
+
+ All active objects appear in the navigation. You can deactivate objects you don't need under **Settings → Data Model**.
-## Capacidades de Campos
+## Field Capabilities
No, field types cannot be changed after creation. If you need a different type, create a new field with the correct type, migrate your data, then deactivate the old field.
-
- Nuestra API de GraphQL usa ambas formas para diferentes operaciones:
+
+ Our GraphQL API uses both forms for different operations:
- * `createPerson` (singular) para acciones de registro único
- * `createPeople` (plural) para operaciones en masa
+ * `createPerson` (singular) for single record actions
+ * `createPeople` (plural) for bulk operations
- Esto crea limitaciones cuando las formas singulares y plurales son iguales, pero mejora la experiencia del desarrollador.
+ This creates limitations when singular and plural forms are the same, but it improves the developer experience.
-
- Ciertos nombres de campo como `Tipo` o `Aplicación` están reservados para uso del sistema. Elige nombres alternativos como `Categoría` o `Clasificación`.
+
+ Certain field names like `Type` or `Application` are reserved for system use. Choose alternative names like `Category` or `Classification` instead.
@@ -72,27 +72,27 @@ description: Frequently asked questions about Twenty's data model.
* **Required**: The field must have a value (not currently supported for custom fields)
-
- Los campos de fórmula llegarán en **Q1 2026**. Mientras tanto, puedes usar flujos de trabajo para calcular y actualizar automáticamente los valores de los campos.
+
+ Formula fields are coming in **Q1 2026**. In the meantime, you can use workflows to calculate and update field values automatically.
-
- Los campos anidados llegarán en **Q1 2026**. Actualmente, puedes usar flujos de trabajo para traer valores de campo de objetos relacionados. Por ejemplo, para mostrar la industria de una empresa en un registro de Persona, crea un campo personalizado en Personas y usa un flujo de trabajo para sincronizar el valor.
+
+ Nested fields are coming in **Q1 2026**. Currently, you can use workflows to bring field values from related objects. For example, to display a company's industry on a Person record, create a custom field on People and use a workflow to synchronize the value.
-
- El reordenamiento de campos estará disponible con diseños personalizados en **Q4 2025**. Currently, fields appear in alphabetical order.
+
+ Field reordering will be available with custom layouts in **Q4 2025**. Currently, fields appear in alphabetical order.
-## Relaciones
+## Relations
- ¡Sí! Self-referencing relations are supported and recommended for use cases like account hierarchies. For example, create a relation from Companies to Companies to track parent/child accounts.
+ Yes! Self-referencing relations are supported and recommended for use cases like account hierarchies. For example, create a relation from Companies to Companies to track parent/child accounts.
-
+
Many-to-many relationships are coming in **H1 2026**. Currently, create an intermediate object with two one-to-many relationships as a workaround.
For example, to link People and Projects (many-to-many), create a "Project Assignments" object with:
@@ -122,15 +122,15 @@ description: Frequently asked questions about Twenty's data model.
-## Acceso y Permisos
+## Access and Permissions
-
+
Go to **Settings → Data Model** to view and edit all your objects and fields.
-
- Comunícate con tu administrador de espacio de trabajo. El acceso al modelo de datos suele estar restringido solo a administradores.
+
+ Reach out to your workspace administrator. Data model access is usually restricted to administrators only.
@@ -150,6 +150,6 @@ description: Frequently asked questions about Twenty's data model.
-## ¿Necesitas más ayuda?
+## Need More Help?
Check our [Implementation Services](/l/es/user-guide/getting-started/capabilities/implementation-services) for help with complex data model design.
diff --git a/packages/twenty-docs/l/es/user-guide/data-model/overview.mdx b/packages/twenty-docs/l/es/user-guide/data-model/overview.mdx
index 7aae118500..f60f73ba25 100644
--- a/packages/twenty-docs/l/es/user-guide/data-model/overview.mdx
+++ b/packages/twenty-docs/l/es/user-guide/data-model/overview.mdx
@@ -1,20 +1,20 @@
---
-title: Modelo de datos
+title: Data Model
description: Learn what a data model is and how to design one that fits your business.
image: /images/user-guide/fields/custom_data_model.png
---
-
+
## What is a Data Model?
-Un modelo de datos es la estructura que define cómo se organiza la información en tu CRM. Think of it as the **blueprint** of your customer data — you design it once, then fill it with your actual data.
+A data model is the structure that defines how information is organized in your CRM. Think of it as the **blueprint** of your customer data — you design it once, then fill it with your actual data.
## Key Concepts
-### Objetos
+### Objects
**Objects** are the main categories of data in your CRM. Each object represents a type of thing you want to track.
@@ -28,25 +28,25 @@ Twenty comes with standard objects:
You can also create **custom objects** for anything specific to your business (e.g., Projects, Subscriptions, Events).
-### Campos
+### Fields
**Fields** are the properties or attributes that describe each object. They store the actual information.
For example, the **People** object has fields like:
-* Nombre
-* Correo electrónico
-* Teléfono
-* Título del puesto
+* Name
+* Email
+* Phone
+* Job Title
* Company (a relation to the Companies object)
Fields have different **types**: text, number, date, select, multi-select, relation, and more. You can add custom fields to any object.
-### Registros
+### Records
**Records** are the individual entries within an object — the actual data you create and manage.
-Por ejemplo:
+For example:
* "John Smith" is a **record** in the People object
* "Acme Corp" is a **record** in the Companies object
@@ -56,14 +56,14 @@ Por ejemplo:
| Data Model Concept | Real-World Analogy |
| ------------------ | ------------------------------------------ |
| **Objects** | Sections in a book (the categories) |
-| **Campos** | Columns in a spreadsheet (the properties) |
+| **Fields** | Columns in a spreadsheet (the properties) |
| **Records** | Rows in a spreadsheet (the actual entries) |
You design the data model (objects + fields) once, then create many records within that structure.
## Why Customize Your Data Model?
-Cada empresa funciona de manera diferente. Customizing your data model means you can shape Twenty around **your** processes instead of forcing yours into a rigid system.
+Every business works differently. Customizing your data model means you can shape Twenty around **your** processes instead of forcing yours into a rigid system.
Twenty offers full flexibility:
@@ -107,7 +107,7 @@ If the concept has its own lifecycle, properties, or relationships, it deserves
* **Subscriptions** — connect companies, products, and invoices
* **Events** — involve attendees and follow-up actions
-Estos van más allá de un solo campo porque tienen su propio conjunto de datos y relaciones.
+These go beyond a single field because they carry their own data and relationships.
### 4. Create an Object When Records Are Open-Ended
@@ -145,7 +145,7 @@ Start with fields. Move to new objects only when you feel the limits:
## Questions to Guide Your Choice
-Pregúntate:
+Ask yourself:
Is this just a property of something I already have, or does it need its own properties?
Will I ever need to track multiple of these per record, without knowing how many?
@@ -167,7 +167,7 @@ If the answer is "yes" to one or more, it's probably time for a new object.
Access to the data model is usually restricted to administrators. Contact your workspace admin if you need access.
-## Próximos Pasos
+## Next Steps
Once you've planned your data model:
@@ -175,6 +175,6 @@ Once you've planned your data model:
* [How to Create Custom Fields](/l/es/user-guide/data-model/how-tos/create-custom-fields)
* [How to Create Relation Fields](/l/es/user-guide/data-model/how-tos/create-relation-fields)
-## ¿Necesitas Ayuda?
+## Need Help?
Our team can help you design and create the data model you need. Discover our [Implementation Services](/l/es/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/es/user-guide/getting-started/capabilities/glossary.mdx b/packages/twenty-docs/l/es/user-guide/getting-started/capabilities/glossary.mdx
index cab9b4c39f..71ac91622f 100644
--- a/packages/twenty-docs/l/es/user-guide/getting-started/capabilities/glossary.mdx
+++ b/packages/twenty-docs/l/es/user-guide/getting-started/capabilities/glossary.mdx
@@ -1,11 +1,11 @@
---
-title: Glosario
-description: Familiarízate con la terminología esencial utilizada en Twenty.
+title: Glossary
+description: Get familiar with essential terminology used in Twenty.
---
## API
-La API (Interfaz de Programación de Aplicaciones) permite conectar Twenty con otros sistemas de software y construir integraciones personalizadas.
+API (Application Programming Interface) allows you to connect Twenty with other software systems and build custom integrations.
## Apps
@@ -15,76 +15,76 @@ Apps are custom extensions built as code that can define data models and serverl
Code Actions are workflow steps that let you write custom JavaScript to transform data, make calculations, or perform complex logic that isn't possible with built-in actions.
-## Menú de Comandos
+## Command Menu
-El Menú de Comandos es una interfaz de acceso rápido (se abre con `Cmd + K` en Mac y `Ctrl + K` en Windows) que te permite realizar acciones, crear registros y navegar por tu espacio de trabajo de manera eficiente.
+The Command Menu is a quick-access interface (opened with `Cmd + K` on Mac and `Ctrl + K` on Windows) that lets you perform actions, create records, and navigate your workspace efficiently.
-## Empresa y Personas
+## Company & People
-El CRM tiene dos tipos fundamentales de registros:
+The CRM has two fundamental types of records:
-* Una `Empresa` representa un negocio u organización.
-* `Personas` representan los clientes o prospectos actuales de tu empresa.
+* A `Company` represents a business or organization.
+* `People` represent your company's current and prospective customers or clients.
-## Campos Personalizados
+## Custom Fields
-Los Campos Personalizados son campos de datos que creas para capturar información específica según las necesidades y procesos de tu negocio.
+Custom Fields are data fields you create to capture information specific to your business needs and processes.
-## Modelo de datos
+## Data Model
-Un Modelo de Datos es la estructura que define cómo se organiza la información en tu CRM, incluyendo qué objetos existen, sus propiedades (campos) y cómo se relacionan entre ellos.
+A Data Model is the structure that defines how information is organized in your CRM, including what objects exist, their properties (fields), and how they relate to each other.
-## Favoritos
+## Favorites
-Los Favoritos son registros que has marcado para acceso rápido, apareciendo en tu barra lateral para una navegación instantánea a datos importantes.
+Favorites are records you've marked for quick access, appearing in your sidebar for instant navigation to important data.
-## Campo
+## Field
-Un campo se refiere a un área específica donde se almacenan datos particulares de una entidad.
+A field refers to a specific area where particular data is stored for an entity.
## Integration
Integrations are built-in tools that allow you to link Twenty with other software or systems.
-## Iterador
+## Iterator
An Iterator is a workflow action that loops through an array of items, executing subsequent actions for each item in the list.
## Kanban
-Un `Kanban` es una manera visual de rastrear los procesos de tu negocio utilizando tarjetas y columnas. Cada columna representa una etapa en tu proceso (por ejemplo: nuevo, en curso, ganado, perdido), y se mueven los registros a través de estas etapas a medida que progresan.
+A `Kanban` is a visual way to track your business processes using cards and columns. Each column represents a stage in your process (for example: new, ongoing, won, lost), and you move records through these stages as they progress.
-## Objeto
+## Object
-Un Objeto es una estructura de datos que representa un tipo específico de entidad en tu CRM (como Personas, Empresas u Oportunidades). Los Objetos pueden ser estándar (integrados) o personalizados (creados por ti).
+An Object is a data structure that represents a specific type of entity in your CRM (like People, Companies, or Opportunities). Objects can be standard (built-in) or custom (created by you).
-## Oportunidades
+## Opportunities
-Las Oportunidades en el CRM de Twenty son posibles tratos o ventas con cuentas o contactos.
+Opportunities in Twenty CRM are potential deals or sales with accounts or contacts.
-## Registro
+## Record
-Un Registro indica una instancia de un objeto, como una cuenta o contacto específico.
+A Record indicates an instance of an object, like a specific account or contact.
-## Campos de Relación
+## Relation Fields
-Los Campos de Relación crean conexiones entre diferentes objetos, permitiendo vincular registros (como conectar una Persona a una Empresa).
+Relation Fields create connections between different objects, allowing you to link records together (like connecting a Person to a Company).
-## Campos Estándar
+## Standard Fields
-Los Campos Estándar son campos de datos preconstruidos que vienen con los objetos por defecto y proporcionan funcionalidad común en todos los espacios de trabajo.
+Standard Fields are pre-built data fields that come with objects by default and provide common functionality across all workspaces.
-## Tareas
+## Tasks
-Las Tareas en el CRM de Twenty son actividades asignadas relacionadas con contactos, cuentas u oportunidades.
+Tasks in Twenty CRM are assigned activities relating to contacts, accounts, or opportunities.
-## Disparadores
+## Triggers
Triggers are the starting point of a workflow — the event or condition that initiates the automation. Examples include record creation, record updates, webhooks, or scheduled times.
-## Vistas
+## Views
-Puedes personalizar la visualización de tus registros usando vistas, configurando diferentes filtros, diseños y opciones de clasificación para cada vista.
+You can customize the display of your records using views, setting different filters, layouts and sorting options for each view.
## Upsert
@@ -92,17 +92,17 @@ Upsert is an operation that combines "update" and "insert" — it updates an exi
## Webhooks
-Los Webhooks son mensajes automatizados que se envían desde Twenty a otras aplicaciones cuando ocurren eventos específicos, habilitando la sincronización de datos en tiempo real.
+Webhooks are automated messages sent from Twenty to other applications when specific events occur, enabling real-time data synchronization.
-## Flujos de trabajo
+## Workflows
-Los Flujos de Trabajo son procesos automatizados que desencadenan acciones basadas en condiciones específicas, ayudándote a automatizar tareas repetitivas y procesos empresariales.
+Workflows are automated processes that trigger actions based on specific conditions, helping you automate repetitive tasks and business processes.
-## Espacio de trabajo
+## Workspace
-Un `Espacio de Trabajo` típicamente representa una empresa que usa Twenty. Contiene todos los registros y datos que tú y los miembros de tu equipo añaden a Twenty.
-Tiene un único nombre de dominio, que generalmente es el nombre de dominio que tu empresa utiliza para las direcciones de correo electrónico de los empleados.
+A `Workspace` typically represents a company using Twenty. It holds all the records and data that you and your team members add to Twenty.
+It has a single domain name, which is typically the domain name your company uses for employee email addresses.
-## Miembros del espacio de trabajo
+## Workspace Members
-Los Miembros del Espacio de Trabajo son los usuarios de Twenty de tu equipo que tienen acceso a tu espacio de trabajo. Pueden asignarse como propietarios o responsables de registros.
+Workspace Members are the Twenty users from your team who have access to your workspace. They can be assigned as owners or assignees for records.
diff --git a/packages/twenty-docs/l/es/user-guide/getting-started/capabilities/implementation-services.mdx b/packages/twenty-docs/l/es/user-guide/getting-started/capabilities/implementation-services.mdx
index c466d96332..706de4d2a0 100644
--- a/packages/twenty-docs/l/es/user-guide/getting-started/capabilities/implementation-services.mdx
+++ b/packages/twenty-docs/l/es/user-guide/getting-started/capabilities/implementation-services.mdx
@@ -1,16 +1,16 @@
---
-title: Servicios de Implementación
-description: Ya sea que necesites ayuda para comenzar o crear personalizaciones avanzadas, tenemos una solución.
+title: Implementation Services
+description: Whether you need help getting started or creating advanced customizations, we have a solution.
---
-## Paquetes de Incorporación
+## Onboarding Packs
Get help from our core team to set up your Twenty workspace with our 4-hour Onboarding packs:
-* **Diseño del Modelo de Datos**: Diseña y crea tu modelo de datos personalizado con objetos, campos y relaciones
-* **Migración de Datos**: Migra tus datos existentes desde tu CRM actual a Twenty
-* **Creación de Flujos de Trabajo**: Crea flujos de trabajo personalizados para apoyar tus procesos de negocio
+* **Data Model Design**: Design and create your custom data model with objects, fields, and relationships
+* **Data Migration**: Migrate your existing data from your current CRM to Twenty
+* **Workflow Creation**: Create custom workflows to support your business processes
-## Socios de Implementación
+## Implementation Partners
-Trabaja con socios certificados de Twenty para personalizaciones e integraciones más avanzadas. Reach out to our team via [contact@twenty.com](mailto:contact@twenty.com) to be matched with our partners.
+Work with certified Twenty partners for more advanced customizations and integrations. Reach out to our team via [contact@twenty.com](mailto:contact@twenty.com) to be matched with our partners.
diff --git a/packages/twenty-docs/l/es/user-guide/getting-started/capabilities/what-is-twenty.mdx b/packages/twenty-docs/l/es/user-guide/getting-started/capabilities/what-is-twenty.mdx
index 70c1f56ad0..102a0860c2 100644
--- a/packages/twenty-docs/l/es/user-guide/getting-started/capabilities/what-is-twenty.mdx
+++ b/packages/twenty-docs/l/es/user-guide/getting-started/capabilities/what-is-twenty.mdx
@@ -1,42 +1,42 @@
---
-title: ¿Qué es Twenty
+title: What is Twenty
description: Twenty is an open-source CRM that gives you the building blocks to create exactly what your business needs.
---
-## Visión
+## Vision
-Crear un buen CRM es difícil porque es un acto de equilibrio.
-Para cada negocio, los requisitos parecen sencillos, pero las necesidades de todos son distintas.
-El resultado es un CRM que es demasiado básico, o uno que intenta ser un todoterreno pero termina siendo un maestro de nada.
+Creating a good CRM is hard because it's a balancing act.
+For each business, the requirements seem straightforward, yet everyone's needs are distinct.
+The result is a CRM that's either too basic, or one that's attempting to be a jack-of-all-trades but ending up as a master of none.
-Al principio, Twenty parece como la mayoría de los CRMs que ya conoces: puedes rastrear ofertas, organizar contactos, gestionar tareas y notas.
-**Pero lo que lo distingue es nuestro enfoque de extensibilidad. Estamos construyendo una plataforma abierta que proporciona los bloques de construcción para que resuelvas los problemas únicos de tu negocio.**
+At first, Twenty looks like most CRMs you already know: you can track deals, organize contacts, manage tasks and notes.
+**But what sets it apart is our approach to extensibility. We are building an open platform that provides the building blocks for you to solve your unique business problems.**
-Priorizamos principios universales y patrones comunes sobre las listas de características.
-No intentamos tener todas las respuestas, sino que empoderamos a los usuarios para encontrar lo que mejor les funciona.
-El código abierto es la base de nuestro enfoque, asegurando que Twenty evoluciona con su comunidad, para su comunidad.
+We prioritize universal principles and common patterns over feature lists.
+We don't try to have all the answers and instead empower users to find what works best for them.
+Open-source is the bedrock of our approach, ensuring that Twenty evolves with its community, for its community.
-## Beneficios
+## Benefits
-**Personalizable:** Diseñado para adaptarse a las necesidades de tu negocio.
+**Customizable:** Designed to fit your business needs.
-**Impulsado por la comunidad:** Construido y mantenido por una gran comunidad de código abierto.
+**Community-driven:** Built and maintained by a large open-source community.
-**Económico:** Nunca estará atado a un proveedor, porque siempre puede autoalojar.
+**Cost-effective:** You'll never be vendor-locked, because you can always self-host.
-## Características principales
+## Main Features
-* **Calendar & Emails:** Sync your mailbox and calendar to see all communications on your CRM records. [Más información](/l/es/user-guide/calendar-emails/overview).
+* **Calendar & Emails:** Sync your mailbox and calendar to see all communications on your CRM records. [Learn more](/l/es/user-guide/calendar-emails/overview).
* **Data Model:** Create custom objects and fields to match your unique business processes. [Explore](/l/es/user-guide/data-model/overview).
-* **Data Migration:** Import and export your data via CSV or API. [Comienza aquí](/l/es/user-guide/data-migration/overview).
+* **Data Migration:** Import and export your data via CSV or API. [Get started](/l/es/user-guide/data-migration/overview).
* **Views & Pipelines:** Organize your data with table views, kanban boards, and sales pipelines. [Discover](/l/es/user-guide/views-pipelines/overview).
* **Workflows:** Automate your business processes and integrate with external tools. [Build automations](/l/es/user-guide/workflows/overview).
* **AI:** Enhance your CRM with AI-powered features and agents. [Explore AI](/l/es/user-guide/ai/overview).
* **Dashboards:** Track performance with custom reports and visualizations. [View dashboards](/l/es/user-guide/dashboards/overview).
* **Permissions & Access:** Control who can view, edit, and manage your data with role-based permissions. [Configure access](/l/es/user-guide/permissions-access/overview).
* **Notes & Tasks:** Create notes and tasks linked to your records for better collaboration.
-* **API & Webhooks:** Connect to other apps and build custom integrations. [Comienza a integrar](/l/es/developers/extend/capabilities/apis).
+* **API & Webhooks:** Connect to other apps and build custom integrations. [Start integrating](/l/es/developers/extend/capabilities/apis).
-## Únete ahora
+## Join now
-[Regístrate aquí](https://app.twenty.com) o [conviértete en un colaborador en GitHub](https://github.com/twentyhq/twenty).
+[Register here](https://app.twenty.com) or [become a contributor on GitHub](https://github.com/twentyhq/twenty).
diff --git a/packages/twenty-docs/l/es/user-guide/getting-started/how-tos/configure-your-workspace.mdx b/packages/twenty-docs/l/es/user-guide/getting-started/how-tos/configure-your-workspace.mdx
index 5fb2d27fb6..df430b7660 100644
--- a/packages/twenty-docs/l/es/user-guide/getting-started/how-tos/configure-your-workspace.mdx
+++ b/packages/twenty-docs/l/es/user-guide/getting-started/how-tos/configure-your-workspace.mdx
@@ -1,77 +1,77 @@
---
title: Configure Your Workspace
-description: Cada empresa funciona de manera diferente. Start with these 3 steps to shape Twenty around your needs.
+description: Every business works differently. Start with these 3 steps to shape Twenty around your needs.
---
-**Quick Win**: Start with connecting your mailbox. Esto te brinda un valor inmediato y ayuda a tu equipo a ver Twenty en acción con datos reales. You can do so under Settings → Accounts.
+**Quick Win**: Start with connecting your mailbox. This gives you immediate value and helps your team see Twenty in action with real data. You can do so under Settings → Accounts.
-## 1. Personaliza tu modelo de datos
+## 1. Customize your data model
-Twenty ofrece la flexibilidad que necesitas para moldear el modelo de datos que mejor apoyará tu día a día.
-Crea objetos y campos de cualquier tipo, incluyendo relaciones entre tus diferentes objetos. Puedes hacerlo en Configuración → Modelo de Datos.
+Twenty offers the flexibility you need to shape the data model that will best support your day-to-day.
+Create objects and fields of any type, including relations between your different objects. You can do so under Settings → Data Model.
Here are a few tips:
-* **No estás limitado en la cantidad de campos personalizados ni en los objetos personalizados**. Agregar objetos y campos personalizados no llevará a la actualización de tu plan.
-* **People, Companies and Opportunities are the three objects from where you can access the emails and meetings synchronized from your mailbox and calendar**. Recomendamos usarlas tanto como sea posible, añadiendo campos para categorizar tus registros si es necesario. Aquí tienes un ejemplo:
- * Es mejor usar el objeto Personas para tus prospectos y socios, creando un campo en el objeto Personas llamado `Tipo de Persona`, en lugar de crear un objeto personalizado Socio. Porque no podrías acceder a los correos electrónicos intercambiados con esta persona desde los registros de Socio.
- * Crea diferentes vistas bajo Personas, una para mostrar socios y otra para mostrar prospectos.
-* Dos personas no pueden tener la misma dirección de correo electrónico. Dos empresas no pueden tener el mismo dominio.
-* Puedes desactivar campos y objetos estándar que no quieras usar.
-* Puedes ocultar campos de las vistas: no dudes en crear campos, no tendrás que mostrarlos todos.
+* **You are not limited in the number of custom fields nor custom objects**. Adding custom objects and fields will not lead to upgrading your plan.
+* **People, Companies and Opportunities are the three objects from where you can access the emails and meetings synchronized from your mailbox and calendar**. We recommend using those as much as possible, adding fields to categorize your records if need be. Here is an example:
+ * It is best to use the People object for your prospects and partners, creating a field on the People object named `Person Type`, instead of creating a Partner custom object. Because you would not be able to access the emails exchanged with this person from the Partner records.
+ * Create different views under People, one to display partners and one to display prospects.
+* Two People cannot have the same email address. Two Companies cannot have the same domain.
+* You can deactivate standard fields and objects you do not want to use.
+* You can hide fields from views: don't be afraid of creating fields, you won't have to display all of them.
-Lee [este artículo](/l/es/user-guide/data-model/overview) para aprender cómo diseñar tu modelo de datos.
+Read [this article](/l/es/user-guide/data-model/overview) to learn how to design your data model.
-## 2. Trae tus datos
+## 2. Bring your data in
-Llevar tus datos existentes a Twenty da a tu equipo contexto desde el principio.
+Bringing your existing data into Twenty gives your team context from the start.
-### Conecta tu buzón de correo
+### Connect your mailbox
-Si no lo hiciste al crear tu espacio de trabajo, conecta tu **cuenta de Google o Microsoft** en Configuración → Cuentas. Esto permite a Twenty:
+If you have not done so when creating your workspace, connect your **Google or Microsoft account** under Settings → Accounts. This allows Twenty to:
-* Importar tus mensajes y reuniones
-* Crear automáticamente contactos basados en interacciones (opcional)
-* Mantener el historial de comunicación visible para tu equipo
+* Import your messages and meetings
+* Auto-create contacts based on interactions (optional)
+* Keep communication history visible for your team
-**¿Usando otro proveedor?**
-Puedes agregar otro buzón de correo a través de SMTP o otro calendario a través de CalDAV. Necesitarás activar la función en Configuración → Lanzamientos → Laboratorio, y luego regresar a la pestaña Configuración → Cuentas.
+**Using another provider?**
+You can add another mailbox via SMTP or another calendar via CalDAV. You will need to activate the feature under Settings → Releases → Lab, and then go back to the Settings → Accounts tab.
### Import data via csv
-Usa el menú de comandos (`Cmd + K` o `Ctrl + K`) para importar Personas, Empresas, Oportunidades o cualquier objeto personalizado vía CSV.
+Use the Command menu (`Cmd + K` or `Ctrl + K`) to import People, Companies, Opportunities, or any custom objects via CSV.
-**Directrices clave**:
+**Key guidelines**:
-* Descarga el archivo de muestra para entender el formato esperado
-* Limita cada archivo a 10,000 registros
-* Elimina correos electrónicos duplicados para Personas o dominios duplicados para Empresas
-* Revisa y corrige errores (resaltados en amarillo) antes de importar
+* Download the sample file to understand the expected format
+* Limit each file to 10k records
+* Remove duplicate emails for People or duplicate domains for Companies
+* Review and fix errors (highlighted in yellow) before importing
-Lee [este artículo](/l/es/user-guide/data-migration/overview) para aprender más sobre la importación de datos.
+Read [this article](/l/es/user-guide/data-migration/overview) to learn more about data import.
-## 3. Crea tu primera vista
+## 3. Create your first view
-Crear diferentes vistas es clave para que los datos sean accionables para tu equipo.
+Creating different views is key to make the data actionable for your team.
Here is how to proceed:
-* **Agregar u ocultar columnas**
- Gestiona los campos visibles en una vista dada haciendo clic en Opciones → Campos (desde la parte superior derecha). Puedes mostrar/ocultar campos desde allí.
+* **Add or hide columns**
+ Manage the fields visible in a given view clicking on Options → Fields (from the top right). You can show/hide fields from there.
-* **Reordenar campos**
- Reordena los campos de una vista dada haciendo clic en Opciones → Campos (desde la parte superior derecha). Arrastra y suelta los campos para reordenarlos.
+* **Reorder fields**
+ Reorder the fields from a given view clicking on Options → Fields (from the top right). Drag and drop the fields to reorder them.
-* **Filtra tu vista**
- Reduce los registros mostrados usando los Filtros desde la parte superior derecha.
+* **Filter your view**
+ Narrow down the records displayed using the Filters from the top right.
-* **Ordena los registros**
- Reordena los registros mostrados usando la función de Ordenar desde la parte superior derecha, o haciendo clic directamente en el nombre de la columna.
+* **Sort records**
+ Reorder records displayed using the Sort function from the top right, or by clicking directly on the column name.
-* **Elige el diseño**
- Puedes cambiar a un diseño de **Kanban** o un diseño de lista **Agrupar por**, siempre que el objeto tenga un campo select type `Etapa` o similar.
+* **Choose the layout**
+ You can switch to a **Kanban layout** or a list **Group By** layout, as long as the object has a `Stage` or similar select-type field.
-* **Guarda tu vista como Favoritos**
- Esto se puede hacer utilizando el menú desplegable que muestra las diferentes vistas.
+* **Save your view as Favorites**
+ This can be done using the dropdown menu showing the different views.
-## ¿Qué sigue?
+## What's next?
-Comienza a crear automatizaciones utilizando [flujos de trabajo](/l/es/user-guide/workflows/overview).
+Start creating automations using [workflows](/l/es/user-guide/workflows/overview).
diff --git a/packages/twenty-docs/l/es/user-guide/getting-started/how-tos/create-workspace.mdx b/packages/twenty-docs/l/es/user-guide/getting-started/how-tos/create-workspace.mdx
index 5a235227b0..f93617f83f 100644
--- a/packages/twenty-docs/l/es/user-guide/getting-started/how-tos/create-workspace.mdx
+++ b/packages/twenty-docs/l/es/user-guide/getting-started/how-tos/create-workspace.mdx
@@ -1,48 +1,48 @@
---
-title: Crear un Espacio de Trabajo
+title: Create a Workspace
description: Follow a step-by-step guide on how to register on Twenty, choose a subscription plan, and set up your account.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-## Paso 1: Registro
+## Step 1: Registration
-1. Dirígete a [Twenty Sign Up](https://app.twenty.com).
-2. Selecciona tu método de registro preferido:
- * **Continuar con Google** para registro con cuenta de Google.
- * **Continuar con Microsoft** para registro con cuenta de Microsoft.
- * O, **Continuar con Email** para registro vía correo electrónico.
+1. Navigate to [Twenty Sign Up](https://app.twenty.com).
+2. Select your preferred sign-up method:
+ * **Continue with Google** for Google account registration.
+ * **Continue with Microsoft** for Microsoft account registration.
+ * Or, **Continue With Email** for email registration.
-## Paso 2: Elección de Período de Prueba
+## Step 2: Choosing a Trial Period
-Elija entre dos períodos de prueba:
+Choose between two trial periods:
-### 30 días
+### 30 days
-Con tarjeta de crédito
+With credit card
-### 7 días
+### 7 days
-Sin tarjeta de crédito
+Without credit card
-Ambas pruebas incluyen:
+Both trials include:
-* Acceso total
-* Contactos ilimitados
-* Integración de correo electrónico
-* Objetos personalizados
-* API y Webhooks
+* Full access
+* Unlimited contacts
+* Email integration
+* Custom objects
+* API & Webhooks
-Puedes hacer clic en "Cambiar plan" para elegir un plan diferente o un intervalo de facturación.
+You can click on "Change plan" to choose a different plan or billing interval.
-## Paso 3: Confirmación de Pago y Configuración de Cuenta
+## Step 3: Payment Confirmation & Account Setup
-Después de la aprobación del pago a través de Stripe, se le dirige a crear su espacio de trabajo y perfil de usuario. Recuerda que puedes cancelar tu suscripción en cualquier momento.
+Post payment approval via Stripe, you're directed to create your workspace and user profile. Remember that you can cancel your subscription anytime.
-## Soporte
+## Support
-Para consultas o ayuda, contacta con el equipo de soporte dedicado en [contact@twenty.com](mailto:contact@twenty.com) o envía un mensaje por [Discord](https://discord.gg/cx5n4Jzs57).
+For queries or help, connect with the dedicated support team at [contact@twenty.com](mailto:contact@twenty.com) or send a message on [Discord](https://discord.gg/cx5n4Jzs57).
diff --git a/packages/twenty-docs/l/es/user-guide/getting-started/how-tos/navigate-around-twenty.mdx b/packages/twenty-docs/l/es/user-guide/getting-started/how-tos/navigate-around-twenty.mdx
index 01666e86e2..2dfc6ef10a 100644
--- a/packages/twenty-docs/l/es/user-guide/getting-started/how-tos/navigate-around-twenty.mdx
+++ b/packages/twenty-docs/l/es/user-guide/getting-started/how-tos/navigate-around-twenty.mdx
@@ -1,41 +1,41 @@
---
title: Navigate Around Twenty
-description: Obtén una descripción general rápida de cómo navegar por la plataforma y dónde realizar diferentes tipos de acciones.
+description: Get a quick overview of how to navigate through the platform and where to take different types of actions.
---
-## El diseño principal
+## The Main Layout
-The center of the screen is **where your records live**: people, companies, opportunities, tasks, notes, dashboards, workflows and any other object you created. Aquí es donde ocurre el trabajo diario.
-Puedes **ver, editar, eliminar registros** desde allí así como **crear nuevas vistas**.
+The center of the screen is **where your records live**: people, companies, opportunities, tasks, notes, dashboards, workflows and any other object you created. This is where the day-to-day work happens.
+You can **view, edit, delete records** from there as well as **creating new views**.
-## Barra de navegación
+## The Navigation Bar
On the left side, from the top to the bottom, you'll be able to:
-* Alterna entre tus diferentes espacios de trabajo usando el menú desplegable o crea uno nuevo
-* Usa la barra de búsqueda (presiona `/` para enfocarla al instante)
-* Abre la sección de Configuración
-* Accede directamente a tus vistas favoritas. Las vistas favoritas son únicas para cada usuario.
-* Alterna entre diferentes objetos
-* **Crea automatizaciones** usando flujos de trabajo
-* Contacta con Soporte y abre nuestra guía del usuario.
+* Switch between your **several workspaces** using the dropdown menu or create a new workspace
+* Use the **search bar** (press `/` to focus on it instantly)
+* Open the **Settings** section
+* Have direct access to your **Favourites views**. Favourites are unique for each user.
+* Switch between different objects
+* **Create automations** using workflows
+* Reach out to Support and open our User Guide.
## The Command Menu
-The command menu gives you **quick access to actions** in Twenty. Puedes acceder de dos maneras:
+The command menu gives you **quick access to actions** in Twenty. You can access it in two ways:
-* **Atajo de teclado**: Presiona `Cmd + K` (Mac) o `Ctrl + K` (Windows)
+* **Keyboard shortcut**: Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
* **Mouse**: Click the three dots in the top right corner
From there, you can:
-* Crea nuevos registros
-* **Importa y exporta datos en formato CSV**
-* Crea nuevas vistas
-* Accede a los registros eliminados (Twenty admite eliminaciones lógicas y definitivas)
-* Consulta los atajos de teclado para acceder rápidamente a los objetos de tu espacio de trabajo
+* Create new records
+* **Import and export data via csv**
+* Create new views
+* Access deleted records (Twenty supports soft and hard deletes)
+* See the keyboard shortcuts to quickly access objects in your workspace
@@ -51,33 +51,33 @@ When you click on a record, the side panel appears on the right. This gives you
-## Vistas
+## Views
-Cada objeto (como Oportunidades o Personas) admite múltiples vistas. No estás limitado en cuanto al número de vistas por objeto.
+Every object (like Opportunities or People) supports multiple views. You're not limited in the number of views per object.
-Usa el menú desplegable en la parte superior izquierda del diseño principal para alternar entre las diferentes vistas. Por ejemplo:
+Use the dropdown menu at the top left of the main layout to switch between the different views. For example:
-* Usa una vista Kanban para hacer seguimiento de las oportunidades por etapa
-* Usa la vista Agrupar por para crear secciones y mejorar la eficiencia
-* Usa filtros para centrarte en registros específicos (por ejemplo, clientes potenciales creados la semana pasada)
-* Guarda vistas filtradas para reutilizarlas más tarde
-* Vistas favoritas para un acceso rápido
+* Use a Kanban view to track opportunities by stage
+* Use Group By view to create sections and improve efficiency
+* Use filters to focus on specific records (e.g. leads created last week)
+* Save filtered views to reuse them later
+* Favourite views for fast access
If you're new to Views, read our [Views & Pipelines guide](/l/es/user-guide/views-pipelines/overview) to learn how to create and customize them.
-## Configuración
+## Settings
-Abre la Configuración desde la parte superior izquierda para:
+Open your Settings from the top left to:
-* **Conecta tu buzón y tus cuentas de calendario** para una sincronización perfecta del correo electrónico y el calendario
-* Personaliza tu **modelo de datos**: crea objetos personalizados, campos y relaciones
-* **Accede al área de pruebas de la API y configura webhooks**
-* **Gestiona los permisos de usuario** y los controles de acceso al espacio de trabajo
-* Invita a los miembros del equipo y gestiona los roles de usuario
-* Edita tu perfil y las preferencias del espacio de trabajo
-* Configura la facturación y supervisa el uso de créditos de flujos de trabajo
-* Descubre los últimos lanzamientos y las próximas funciones (en Lanzamientos → pestaña Lab)
+* **Connect your mailbox and calendar** accounts for seamless email and calendar sync
+* Customize your **data model**: create custom objects, fields, and relationships
+* **Access the API playground and configure webhooks**
+* **Manage user permissions** and workspace access controls
+* Invite team members and manage user roles
+* Edit your profile and workspace preferences
+* Configure billing and monitor workflow credits usage
+* Discover the latest releases and upcoming features (under Releases → Lab tab)
If you do not see all those sections under Settings, reach out to your workspace administrator - some of them have restricted access.
diff --git a/packages/twenty-docs/l/es/user-guide/permissions-access/capabilities/permissions.mdx b/packages/twenty-docs/l/es/user-guide/permissions-access/capabilities/permissions.mdx
index d5cf02df39..5b9fce088a 100644
--- a/packages/twenty-docs/l/es/user-guide/permissions-access/capabilities/permissions.mdx
+++ b/packages/twenty-docs/l/es/user-guide/permissions-access/capabilities/permissions.mdx
@@ -1,69 +1,69 @@
---
-title: Permisos
+title: Permissions
description: Control access to objects, fields, and settings with role-based permissions.
image: /images/user-guide/permissions/permissions.png
---
-El sistema de permisos de Twenty te permite controlar el acceso a tres áreas principales:
+Twenty's permission system allows you to control access to three main areas:
-* **Objetos y Campos**: Controla quién puede ver, editar o eliminar registros y campos individuales
-* **Configuraciones**: Gestiona el acceso a la configuración del espacio de trabajo y a las funciones administrativas
-* **Acciones**: Controla acciones generales del espacio de trabajo como importar datos o enviar correos electrónicos
+* **Objects and Fields**: Control who can view, edit, or delete records and individual fields
+* **Settings**: Manage access to workspace configuration and administrative functions
+* **Actions**: Control general workspace actions like importing data or sending emails
## Create a Role
-Para crear un nuevo rol:
+To create a new role:
1. Go to **Settings → Roles**
-2. En **Todos los Roles**, haz clic en **+ Crear Rol**
-3. Introduce un nombre para el rol
+2. Under **All Roles**, click on **+ Create Role**
+3. Enter a role name
4. In the default **Permissions** tab, [configure permissions](#customize-permissions)
-5. Haz clic en **Guardar** para finalizar
+5. Click **Save** to finish
## Delete a Role
-Para eliminar un rol:
+To delete a role:
1. Go to **Settings → Roles**
-2. Haz clic en el rol que deseas eliminar
+2. Click on the role you want to remove
3. Open the **Settings** tab, then click **Delete Role**
-4. Haz clic en **Confirmar** en el modal
+4. Click **Confirm** in the modal
- If a role is deleted, any workspace member assigned to it will be automatically reassigned to the default role. Todos excepto el rol **Admin** pueden eliminarse. Siempre debe haber al menos un miembro asignado al rol **Admin**.
+ If a role is deleted, any workspace member assigned to it will be automatically reassigned to the default role. All except the **Admin** role can be deleted. There must always be at least one member assigned to the **Admin** role.
## Assign Roles to Members
-### Ver Asignaciones Actuales
+### View Current Assignments
* Go to **Settings → Roles**
-* Ver todos los roles y cuántos miembros están asignados a cada uno
-* Ver qué miembros tienen qué roles
+* See all roles and how many members are assigned to each
+* View which members have which roles
### Assign a Role to a Member
1. Go to **Settings → Roles**
-2. Haz clic en el rol que deseas asignar
-3. Abre la pestaña **Asignación**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
4. Click **+ Assign to member**
-5. Selecciona al miembro del espacio de trabajo de la lista
-6. Confirma la asignación
+5. Select the workspace member from the list
+6. Confirm the assignment
### Set Default Role
1. Go to **Settings → Roles**
-2. En la sección **Opciones**, encuentra **Rol Predeterminado**
-3. Selecciona qué rol deberían recibir automáticamente los nuevos miembros
-4. Los nuevos miembros del espacio de trabajo serán asignados a este rol cuando se unan
+2. In the **Options** section, find **Default Role**
+3. Select which role new members should automatically receive
+4. New workspace members will be assigned this role when they join
- You can only assign roles to existing workspace members. Para invitar a nuevos miembros, utiliza [Gestión de Miembros](/l/es/user-guide/settings/capabilities/member-management).
+ You can only assign roles to existing workspace members. To invite new members, use [Member Management](/l/es/user-guide/settings/capabilities/member-management).
-## Personalizar Permisos
+## Customize Permissions
-Los permisos determinan qué puede acceder o modificar cada rol dentro de tu espacio de trabajo, incluidos registros de objetos, configuraciones y acciones del espacio de trabajo.
+Permissions determine what each role can access or modify within your workspace, including workspace objects records, settings, and actions.
### Object Permissions
@@ -73,12 +73,12 @@ The **Objects** section controls what this role can do with records across your
First, configure the baseline permissions that apply to **all objects** by default:
-| Permission | Descripción |
-| ------------------------------------------- | -------------------------------------- |
-| **Ver registros en todos los objetos** | View records in lists and detail pages |
-| **Editar registros en todos los objetos** | Modify existing records |
-| **Eliminar registros en todos los objetos** | Soft-delete records (can be restored) |
-| **Destruir registros en todos los objetos** | Permanently delete records |
+| Permission | Description |
+| ---------------------------------- | -------------------------------------- |
+| **See Records on All Objects** | View records in lists and detail pages |
+| **Edit Records on All Objects** | Modify existing records |
+| **Delete Records on All Objects** | Soft-delete records (can be restored) |
+| **Destroy Records on All Objects** | Permanently delete records |
Select or unselect based on what should be the default behavior for this role.
@@ -103,7 +103,7 @@ Click **+ Add rule** and select an object to create an exception.
Within each object-level rule, you can go further and configure **field-level permissions** to control access to specific fields.
-| Permission | Descripción |
+| Permission | Description |
| -------------- | -------------------------- |
| **See Field** | View the field value |
| **Edit Field** | Modify the field value |
@@ -128,33 +128,33 @@ Permissions cascade from general to specific:
More specific settings always take precedence.
-### Gestión de Excepciones de Permisos
+### Managing Permission Overrides
To override inherited permissions:
-1. Haz clic en **X** para eliminar la regla heredada
+1. Click **X** to remove the inherited rule
2. Select the specific permissions you want
-3. Haz clic en el ícono naranja de **Deshacer** (flecha circular) para revertir los cambios
+3. Click the orange **Undo** icon (circular arrow) to revert changes
-Cuando termines, haz clic en **Finalizar**, luego en **Guardar** una vez que seas redirigido a la página del rol.
+When done, click **Finish**, then **Save** once redirected to the role page.
-### Permisos de Configuraciones del Espacio de Trabajo
+### Workspace Settings Permissions
-Controla el acceso a configuraciones del espacio de trabajo de dos maneras:
+Control access to workspace settings in two ways:
-* Activa **Acceso Completo a Configuraciones** para otorgar acceso completo
+* Toggle **Settings All Access** to grant full access
* Or enable specific permissions (e.g., API key generation, workspace preferences, role assignment, data model configuration, security settings, and workflow management)
**Current limitation**: Access to workflow management is currently required to manually trigger workflows. This behavior may change in future releases.
-### Permisos de Acción del Espacio de Trabajo
+### Workspace Action Permissions
-Controla el acceso a acciones generales del espacio de trabajo:
+Control access to general workspace actions:
-* Activa **Acceso Completo a la Aplicación** para otorgar permisos completos
-* O habilita acciones individuales como **Enviar Email**, **Importar CSV** y **Exportar CSV**
+* Toggle **Application All Access** to grant full permissions
+* Or enable individual actions such as **Send Email**, **Import CSV**, and **Export CSV**
## Assigning Roles to API Keys and AI Agents
@@ -170,11 +170,11 @@ Beyond workspace members, roles can also be assigned to **API Keys** and **AI Ag
### Assign a Role to an API Key
1. Go to **Settings → Roles**
-2. Haz clic en el rol que deseas asignar
-3. Abre la pestaña **Asignación**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
4. Under **API Keys**, click **+ Assign to API key**
5. Select the API key from the list
-6. Confirma la asignación
+6. Confirm the assignment
The API key will now inherit all permissions defined by that role. Any API calls made with this key will be restricted accordingly.
@@ -185,11 +185,11 @@ The API key will now inherit all permissions defined by that role. Any API calls
### Assign a Role to an AI Agent
1. Go to **Settings → Roles**
-2. Haz clic en el rol que deseas asignar
-3. Abre la pestaña **Asignación**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
4. Under **AI Agents**, click **+ Assign to AI agent**
5. Select the AI agent from the list
-6. Confirma la asignación
+6. Confirm the assignment
The AI agent will only be able to access data and perform actions allowed by its assigned role.
diff --git a/packages/twenty-docs/l/es/user-guide/permissions-access/capabilities/sso-configuration.mdx b/packages/twenty-docs/l/es/user-guide/permissions-access/capabilities/sso-configuration.mdx
index 0508319d14..310c161605 100644
--- a/packages/twenty-docs/l/es/user-guide/permissions-access/capabilities/sso-configuration.mdx
+++ b/packages/twenty-docs/l/es/user-guide/permissions-access/capabilities/sso-configuration.mdx
@@ -21,7 +21,7 @@ Twenty supports SSO with:
## Setting Up SSO
-### Prerrequisitos
+### Prerequisites
* Organization plan (cloud and self-hosted workspaces)
* Admin access to your identity provider
@@ -83,7 +83,7 @@ You'll need to configure your identity provider with:
SSO users can be assigned roles like regular users:
-1. Ir a **Ajustes → Miembros**
+1. Go to **Settings → Members**
2. Find the user
3. Change their role as needed
@@ -94,9 +94,9 @@ To remove access for SSO users:
* Remove them from your identity provider, or
* Remove them from the Twenty workspace
-## Mejores prácticas
+## Best Practices
-### Seguridad
+### Security
* **Require SSO**: Disable password login for SSO users
* **Regular audits**: Review access periodically
@@ -108,7 +108,7 @@ To remove access for SSO users:
* **Group mapping**: Map IdP groups to Twenty roles (if available)
* **Offboarding process**: Include Twenty in your deprovisioning workflow
-## Solución de Problemas
+## Troubleshooting
### Common Issues
@@ -116,7 +116,7 @@ To remove access for SSO users:
* **URL mismatches**: Verify ACS URL matches exactly
* **User not found**: Check JIT provisioning settings
-### Obtención de Ayuda
+### Getting Help
If you encounter issues, contact support with:
diff --git a/packages/twenty-docs/l/es/user-guide/permissions-access/how-tos/permissions-faq.mdx b/packages/twenty-docs/l/es/user-guide/permissions-access/how-tos/permissions-faq.mdx
index b997c9900c..6700b48297 100644
--- a/packages/twenty-docs/l/es/user-guide/permissions-access/how-tos/permissions-faq.mdx
+++ b/packages/twenty-docs/l/es/user-guide/permissions-access/how-tos/permissions-faq.mdx
@@ -27,7 +27,7 @@ description: Frequently asked questions about roles and permissions.
-## Permisos
+## Permissions
diff --git a/packages/twenty-docs/l/es/user-guide/permissions-access/overview.mdx b/packages/twenty-docs/l/es/user-guide/permissions-access/overview.mdx
index 07ff71b19f..b904c2fba9 100644
--- a/packages/twenty-docs/l/es/user-guide/permissions-access/overview.mdx
+++ b/packages/twenty-docs/l/es/user-guide/permissions-access/overview.mdx
@@ -1,40 +1,40 @@
---
-title: Permisos y acceso
-description: Administra roles, permisos y el control de acceso en tu espacio de trabajo.
+title: Permissions & Access
+description: Manage roles, permissions, and access control in your workspace.
---
-
+
-El sistema de permisos de Twenty te permite controlar quién puede acceder y modificar los datos en tu espacio de trabajo. Crea roles, asigna permisos y configura SSO para un acceso seguro.
+Twenty's permission system lets you control who can access and modify data in your workspace. Create roles, assign permissions, and configure SSO for secure access.
-## Qué incluye esta sección
+## What's in this section
-
- Crea roles y configura permisos de objetos, campos y configuración.
+
+ Create roles and configure object, field, and settings permissions.
-
- Configura el inicio de sesión único (SSO) con tu proveedor de identidad.
+
+ Set up Single Sign-On with your identity provider.
-
- Preguntas comunes sobre roles, permisos y SSO.
+
+ Common questions about roles, permissions, and SSO.
-## Características clave
+## Key features
-* **Acceso basado en roles**: Crea roles personalizados con permisos específicos
-* **Permisos de objetos**: Controla quién puede ver, editar o eliminar registros
-* **Permisos de campos**: Restringe el acceso a campos sensibles
-* **Permisos de configuración**: Controla el acceso a la configuración del espacio de trabajo
-* **Integración con SSO**: Configura el inicio de sesión único para seguridad a nivel empresarial (plan Organization)
+* **Role-based access**: Create custom roles with specific permissions
+* **Object permissions**: Control who can view, edit, or delete records
+* **Field permissions**: Restrict access to sensitive fields
+* **Settings permissions**: Control access to workspace configuration
+* **SSO integration**: Configure single sign-on for enterprise security (Organization plan)
-## Enlaces rápidos
+## Quick links
-* [Crear un rol](/l/es/user-guide/permissions-access/capabilities/permissions#create-a-role)
-* [Configurar SSO](/l/es/user-guide/permissions-access/capabilities/sso-configuration)
-* [Administrar miembros del equipo](/l/es/user-guide/settings/capabilities/member-management)
+* [Create a role](/l/es/user-guide/permissions-access/capabilities/permissions#create-a-role)
+* [Configure SSO](/l/es/user-guide/permissions-access/capabilities/sso-configuration)
+* [Manage team members](/l/es/user-guide/settings/capabilities/member-management)
diff --git a/packages/twenty-docs/l/es/user-guide/settings/capabilities/domains-settings.mdx b/packages/twenty-docs/l/es/user-guide/settings/capabilities/domains-settings.mdx
index 563f47e82b..b2c49c5ae2 100644
--- a/packages/twenty-docs/l/es/user-guide/settings/capabilities/domains-settings.mdx
+++ b/packages/twenty-docs/l/es/user-guide/settings/capabilities/domains-settings.mdx
@@ -5,11 +5,11 @@ description: Configure workspace domain, approved access domains, and public dom
Configure domain settings under **Settings → Domains**.
-## Dominio del espacio de trabajo
+## Workspace Domain
Edit your subdomain name or set a custom domain for your workspace.
-### Personalizar dominio
+### Customize Domain
1. Click **Customize Domain**
2. Edit your subdomain (e.g., `yourcompany.twenty.com`)
@@ -17,15 +17,15 @@ Edit your subdomain name or set a custom domain for your workspace.
For custom domains, you'll need to configure DNS settings with your domain provider.
-## Dominios Aprobados
+## Approved Domains
Anyone with an email address at these domains is allowed to sign up for this workspace automatically.
-### Añadir Dominio de Acceso Aprobado
+### Add Approved Access Domain
1. Click **Add Approved Access Domain**
2. Enter your company domain (e.g., `yourcompany.com`)
-3. Guardar
+3. Save
Once configured, anyone with an email address at that domain can join your workspace without needing a direct invitation.
@@ -33,11 +33,11 @@ Once configured, anyone with an email address at that domain can join your works
This is useful for allowing your entire team to self-register while keeping the workspace restricted to your organization.
-## Dominios Públicos
+## Public Domains
-Provisiona un entorno de alojamiento completo y seguro en estos dominios.
+Provision a complete and secure hosting environment on these domains.
-### Agregar Dominio Público
+### Add Public Domain
1. Click **Add Public Domain**
2. Enter the domain you want to use
diff --git a/packages/twenty-docs/l/es/user-guide/settings/capabilities/experience-settings.mdx b/packages/twenty-docs/l/es/user-guide/settings/capabilities/experience-settings.mdx
index aa9cd288ad..e279f7d88b 100644
--- a/packages/twenty-docs/l/es/user-guide/settings/capabilities/experience-settings.mdx
+++ b/packages/twenty-docs/l/es/user-guide/settings/capabilities/experience-settings.mdx
@@ -1,38 +1,38 @@
---
-title: Ajustes de experiencia
-description: Personaliza el tema de tu interfaz y las preferencias regionales.
+title: Experience Settings
+description: Customize your interface theme and regional preferences.
---
-Personaliza tu experiencia con Twenty en **Ajustes → Experiencia**.
+Personalize your Twenty experience under **Settings → Experience**.
-## Apariencia
+## Appearance
-Elige tu tema visual:
+Choose your visual theme:
-* **Claro**: Interfaz limpia y luminosa
-* **Oscuro**: Más fácil para la vista en condiciones de poca luz
-* **Ajustes del sistema**: Se ajusta automáticamente al tema de tu dispositivo
+* **Light**: Clean, bright interface
+* **Dark**: Easier on the eyes in low-light conditions
+* **System settings**: Automatically matches your device's theme
-## Idioma
+## Language
-Selecciona tu idioma preferido para la interfaz de Twenty en el menú desplegable.
+Select your preferred language for the Twenty interface from the dropdown menu.
-## Formatos
+## Formats
-Configurar fecha, hora, número, zona horaria y día de inicio del calendario.
+Configure date, time, number, timezone, and calendar start day.
-| Ajuste | Descripción |
-| -------------------------------- | ------------------------------------------------------------------- |
-| **Zona horaria** | Tu zona horaria local para marcas de tiempo y programación precisas |
-| **Formato de fecha** | Cómo se muestran las fechas (p. ej., 12 dic 2025) |
-| **Formato de hora** | Formato de 12 horas (7:22 p. m.) o de 24 horas |
-| **Formato de número** | Separadores de decimales y de miles (p. ej., 1.234,56) |
-| **Día de inicio del calendario** | Primer día de la semana (domingo o lunes) |
+| Setting | Description |
+| ---------------------- | ---------------------------------------------------------- |
+| **Time zone** | Your local timezone for accurate timestamps and scheduling |
+| **Date format** | How dates appear (e.g., Dec 12, 2025) |
+| **Time format** | 12-hour (7:22 PM) or 24-hour format |
+| **Number format** | Decimal and thousands separators (e.g., 1,234.56) |
+| **Calendar start day** | First day of the week (Sunday or Monday) |
-Cada ajuste puede configurarse en **Ajustes del sistema** para coincidir automáticamente con las preferencias de tu dispositivo, o puedes elegir un formato específico.
+Each setting can be set to **System settings** to automatically match your device preferences, or you can choose a specific format.
-## Cómo actualizar
+## How to Update
-1. Ve a **Ajustes ���� �� Experiencia**
-2. Ajusta tus preferencias en cada sección
-3. Los cambios se guardan automáticamente
+1. Go to **Settings → Experience**
+2. Adjust your preferences in each section
+3. Changes save automatically
diff --git a/packages/twenty-docs/l/es/user-guide/settings/capabilities/member-management.mdx b/packages/twenty-docs/l/es/user-guide/settings/capabilities/member-management.mdx
index 5af4f4c7aa..168b63c133 100644
--- a/packages/twenty-docs/l/es/user-guide/settings/capabilities/member-management.mdx
+++ b/packages/twenty-docs/l/es/user-guide/settings/capabilities/member-management.mdx
@@ -1,17 +1,17 @@
---
-title: Gestión de Miembros
+title: Member Management
description: Invite team members and manage workspace access.
---
Manage who has access to your workspace under **Settings → Members**.
-## Invitar Nuevos Miembros
+## Invite New Members
### Using Email Invitation
-1. Ir a **Ajustes → Miembros**
+1. Go to **Settings → Members**
2. Click **+ Invite**
-3. Introduce la dirección de correo electrónico de la persona
+3. Enter the person's email address
4. Select a role for the new member
5. Click **Send invite**
@@ -19,10 +19,10 @@ The invited person will receive an email with a link to join your workspace.
### Using Invite Link
-1. Ir a **Ajustes → Miembros**
-2. Copiar el enlace de invitación a la área de trabajo
-3. Compartir el enlace con nuevos miembros del equipo
-4. Obtendrán acceso una vez que se registren
+1. Go to **Settings → Members**
+2. Copy the workspace invite link
+3. Share the link with new team members
+4. They'll receive access once they sign up
## View and Manage Members
@@ -73,11 +73,11 @@ Manage invitations that haven't been accepted:
* **Resend**: Send the invitation email again
* **Cancel**: Revoke the invitation before it's accepted
-## Dominios de Acceso Aprobado
+## Approved Access Domains
Allow team members to join automatically based on their email domain:
-1. Ve a **Configuración → Dominios**
+1. Go to **Settings → Domains**
2. Add your company domain (e.g., `yourcompany.com`)
3. Anyone with that email domain can join without an invitation
diff --git a/packages/twenty-docs/l/es/user-guide/settings/capabilities/profile-settings.mdx b/packages/twenty-docs/l/es/user-guide/settings/capabilities/profile-settings.mdx
index 93593df485..febfa4a86f 100644
--- a/packages/twenty-docs/l/es/user-guide/settings/capabilities/profile-settings.mdx
+++ b/packages/twenty-docs/l/es/user-guide/settings/capabilities/profile-settings.mdx
@@ -1,43 +1,43 @@
---
-title: Ajustes del perfil
-description: Gestiona tu perfil personal y los ajustes de seguridad.
+title: Profile Settings
+description: Manage your personal profile and security settings.
---
-## Información personal
+## Personal Information
-### Nombre y correo electrónico
+### Name and Email
-* **Nombre para mostrar**: Actualiza cómo aparece tu nombre a otros miembros del espacio de trabajo
-* **Correo electrónico**: Cambia tu correo de inicio de sesión (requiere verificación)
-* **Foto de perfil**: Carga un avatar personalizado o utiliza tus iniciales
+* **Display Name**: Update how your name appears to other workspace members
+* **Email Address**: Change your login email (requires verification)
+* **Profile Picture**: Upload a custom avatar or use your initials
-## Configuración de seguridad
+## Security Settings
-### Autenticación de dos factores (2FA)
+### Two-Factor Authentication (2FA)
-Habilita 2FA para agregar una capa extra de seguridad a tu cuenta.
+Enable 2FA to add an extra layer of security to your account:
-1. Ve a **Configuración → Configuración del perfil**
-2. Haz clic en **Habilitar 2FA**
-3. Escanea el código QR con tu aplicación de autenticación
-4. Introduce el código de verificación para confirmar
+1. Go to **Settings → Profile Settings**
+2. Click **Enable 2FA**
+3. Scan the QR code with your authenticator app
+4. Enter the verification code to confirm
-### Gestión de contraseñas
+### Password Management
-* **Cambiar contraseña**: Actualiza tu contraseña actual
-* **Requisitos de la contraseña**: Debe tener al menos 8 caracteres
+* **Change Password**: Update your current password
+* **Password Requirements**: Must be at least 8 characters long
-## Gestión del perfil
+## Profile Management
-### Eliminar cuenta
+### Delete Account
- Eliminar tu cuenta eliminará permanentemente tu acceso a todos los espacios de trabajo. Esta acción no se puede deshacer; perderás el acceso a todos los espacios de trabajo de los que eres miembro, y deberías considerar salir de espacios de trabajo individuales si solo quieres salir de equipos específicos.
+ Deleting your account will permanently remove your access to all workspaces. This action cannot be undone, you'll lose access to all workspaces where you're a member, and you should consider leaving individual workspaces instead if you only want to exit specific teams.
-Para eliminar tu cuenta:
+To delete your account:
-1. Ve a **Configuración → Configuración del perfil**
-2. Desplázate hasta **Zona de peligro**
-3. Haz clic en **Eliminar cuenta**
-4. Confirma escribiendo tu dirección de correo electrónico
+1. Go to **Settings → Profile Settings**
+2. Scroll to **Danger Zone**
+3. Click **Delete Account**
+4. Confirm by typing your email address
diff --git a/packages/twenty-docs/l/es/user-guide/settings/capabilities/releases-settings.mdx b/packages/twenty-docs/l/es/user-guide/settings/capabilities/releases-settings.mdx
index 5e663eab5e..4180b67161 100644
--- a/packages/twenty-docs/l/es/user-guide/settings/capabilities/releases-settings.mdx
+++ b/packages/twenty-docs/l/es/user-guide/settings/capabilities/releases-settings.mdx
@@ -1,5 +1,5 @@
---
-title: Configuración de Lanzamientos
+title: Releases Settings
description: Enable experimental features in Twenty.
---
@@ -7,7 +7,7 @@ description: Enable experimental features in Twenty.
The Releases section allows you to enable experimental features before they're generally available.
-## Características del Laboratorio
+## Lab Features
Lab features are experimental capabilities that are still being developed. They may change or be removed without notice.
diff --git a/packages/twenty-docs/l/es/user-guide/settings/capabilities/workspace-settings.mdx b/packages/twenty-docs/l/es/user-guide/settings/capabilities/workspace-settings.mdx
index fe5479aa79..f72f71a814 100644
--- a/packages/twenty-docs/l/es/user-guide/settings/capabilities/workspace-settings.mdx
+++ b/packages/twenty-docs/l/es/user-guide/settings/capabilities/workspace-settings.mdx
@@ -1,30 +1,30 @@
---
-title: Configuración del Espacio de Trabajo
-description: Personaliza el nombre y la marca de tu espacio de trabajo.
+title: Workspace Settings
+description: Customize your workspace name and branding.
---
Those are accessible under **Settings → General**.
-## Imagen del Espacio de Trabajo
+## Workspace Picture
-* **Subir Logo**: Añade un logo personalizado para el espacio de trabajo
-* **Formatos admitidos**: Archivos PNG, JPEG y GIF de menos de 10MB
-* **Eliminar**: Elimina el logo actual del espacio de trabajo
+* **Upload Logo**: Add a custom workspace logo
+* **Supported formats**: PNG, JPEG, and GIF files under 10MB
+* **Remove**: Delete the current workspace logo
-## Nombre del espacio de trabajo
+## Workspace Name
-* **Nombre**: Cambia el nombre visible de tu espacio de trabajo
-* Este nombre aparece para todos los miembros del espacio de trabajo
+* **Name**: Change your workspace display name
+* This name appears to all workspace members
-## Zona de Peligro
+## Danger Zone
- Eliminar tu espacio de trabajo elimina permanentemente todos los datos y no se puede deshacer. Todos los datos del espacio de trabajo se perderán para siempre, todos los miembros perderán el acceso inmediatamente, y esta acción no se puede revertir.
+ Deleting your workspace permanently removes all data and cannot be undone. All workspace data will be lost forever, all members will lose access immediately, and this action cannot be reversed.
-Para eliminar tu espacio de trabajo:
+To delete your workspace:
-1. Haz clic en el botón **Eliminar espacio de trabajo**
-2. Confirma la eliminación cuando se te solicite
+1. Click **Delete workspace** button
+2. Confirm the deletion when prompted
-**Nota**: Solo los administradores del espacio de trabajo pueden eliminar espacios de trabajo.
+**Note**: Only workspace administrators can delete workspaces.
diff --git a/packages/twenty-docs/l/es/user-guide/settings/how-tos/settings-faq.mdx b/packages/twenty-docs/l/es/user-guide/settings/how-tos/settings-faq.mdx
index 5861fb7f6e..19aa50e5a0 100644
--- a/packages/twenty-docs/l/es/user-guide/settings/how-tos/settings-faq.mdx
+++ b/packages/twenty-docs/l/es/user-guide/settings/how-tos/settings-faq.mdx
@@ -1,10 +1,10 @@
---
-title: Preguntas frecuentes sobre configuración
+title: Settings FAQ
description: Frequently asked questions about Twenty settings.
image: /images/user-guide/setup/settings.png
---
-## Configuración del Espacio de Trabajo
+## Workspace Settings
@@ -34,7 +34,7 @@ image: /images/user-guide/setup/settings.png
Note: This permanently deletes all data and cannot be undone.
-
+
Delete the workspaces you no longer need under **Settings → General → Delete workspace**.
@@ -61,8 +61,8 @@ image: /images/user-guide/setup/settings.png
1. Go to **Settings → Profile**
2. Find the 2FA section
- 3. Haz clic en **Habilitar 2FA**
- 4. Escanea el código QR con tu aplicación de autenticación
+ 3. Click **Enable 2FA**
+ 4. Scan the QR code with your authenticator app
5. Enter the verification code
@@ -73,14 +73,14 @@ image: /images/user-guide/setup/settings.png
1. Go to **Settings → Profile**
2. Scroll to Danger Zone
- 3. Haz clic en **Eliminar cuenta**
+ 3. Click **Delete Account**
4. Confirm by typing your email
Note: This removes your access to all workspaces and deletes all emails synced from your connected accounts.
-## Ajustes de experiencia
+## Experience Settings
@@ -134,11 +134,11 @@ image: /images/user-guide/setup/settings.png
-## Dominios
+## Domains
-
- ¡Sí! Go to **Settings → Domains** and click **Customize Domain**. You have two options:
+
+ Yes! Go to **Settings → Domains** and click **Customize Domain**. You have two options:
* **Subdomain**: Use a Twenty subdomain like `yourcompany.twenty.com`
* **Custom domain**: Use your own domain like `crm.yourcompany.com` (requires DNS configuration)
@@ -151,7 +151,7 @@ image: /images/user-guide/setup/settings.png
-## Características del Laboratorio
+## Lab Features
diff --git a/packages/twenty-docs/l/es/user-guide/settings/overview.mdx b/packages/twenty-docs/l/es/user-guide/settings/overview.mdx
index 53965a13ed..eeb3db029a 100644
--- a/packages/twenty-docs/l/es/user-guide/settings/overview.mdx
+++ b/packages/twenty-docs/l/es/user-guide/settings/overview.mdx
@@ -1,11 +1,11 @@
---
-title: Configuración
+title: Settings
description: Set up your Twenty workspace with essential configurations.
image: /images/user-guide/setup/settings.png
---
-
+
## Initial Setup
@@ -43,7 +43,7 @@ Set up email and calendar sync:
Add team members to your workspace:
-1. Ir a **Ajustes → Miembros**
+1. Go to **Settings → Members**
2. Click **+ Invite**
3. Enter email addresses
4. Assign appropriate roles
@@ -60,7 +60,7 @@ Add team members to your workspace:
* Team members invited
* Roles and permissions configured
-## Próximos Pasos
+## Next Steps
* [Workspace settings](/l/es/user-guide/settings/capabilities/workspace-settings)
* [Profile settings](/l/es/user-guide/settings/capabilities/profile-settings)
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/calendar-view.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/calendar-view.mdx
index ebdbb61b16..5bd118300d 100644
--- a/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/calendar-view.mdx
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/calendar-view.mdx
@@ -1,5 +1,5 @@
---
-title: Vista del calendario
+title: Calendar View
description: Display records with date fields on a calendar.
---
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/fields-and-columns.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/fields-and-columns.mdx
index 68455c4499..f49f2dbff3 100644
--- a/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/fields-and-columns.mdx
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/fields-and-columns.mdx
@@ -23,12 +23,12 @@ Change the order fields appear in your view:
## Field Display by View Type
-### Vistas de Tabla
+### Table Views
* Fields appear as columns
* Resize columns by dragging borders
-### Vistas Kanban
+### Kanban Views
* Fields appear on cards
* Reorder via Options → Fields
@@ -39,7 +39,7 @@ Change the order fields appear in your view:
* Selected fields show on calendar events
* Configure via Options → Fields
-## Mejores prácticas
+## Best Practices
* **Show only what's needed** — too many fields clutters the view
* **Put important fields first** — most-used columns on the left
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx
index 76910a3191..cac10c42bc 100644
--- a/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx
@@ -17,14 +17,14 @@ Filters help you focus on specific records by showing only those that match your
### Filter Operators
-| Field Type | Available Operators |
-| ----------------- | -------------------------------------------------- |
-| Texto | Equals, Contains, Starts with, Ends with, Is empty |
-| Número | Equals, Greater than, Less than, Between, Is empty |
-| Fecha | Equals, Before, After, Between, Is empty |
-| Selección | Equals, Is any of, Is empty |
-| Caja de selección | Is true, Is false |
-| Relación | Equals, Is empty |
+| Field Type | Available Operators |
+| ---------- | -------------------------------------------------- |
+| Text | Equals, Contains, Starts with, Ends with, Is empty |
+| Number | Equals, Greater than, Less than, Between, Is empty |
+| Date | Equals, Before, After, Between, Is empty |
+| Select | Equals, Is any of, Is empty |
+| Checkbox | Is true, Is false |
+| Relation | Equals, Is empty |
### Multiple Filters
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/kanban-views.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/kanban-views.mdx
index 3bbd75308b..fa616d2f3d 100644
--- a/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/kanban-views.mdx
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/kanban-views.mdx
@@ -6,39 +6,39 @@ image: /images/user-guide/kanban-views/kanban.png
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-## Acerca de las vistas Kanban
+## About Kanban Views
-Las vistas Kanban mapean visualmente los flujos de proceso, donde cada columna representa una etapa distinta y cada tarjeta representa un registro.
+Kanban views visually map out process flows, where each column stands for a distinct stage and each card represents a record.
-## Mover tarjetas entre etapas
+## Move Cards between Stages
-Puedes mover cada tarjeta entre etapas a medida que pasa por tu flujo de trabajo arrastrando y soltando. Para continuar, mantén presionado el clic en una tarjeta y muévela a la siguiente etapa.
+You can move each card between stages as it goes through your workflow by dragging and dropping. To proceed, hold your click on a card and move it to the next stage.
## Add and Delete Stages
-Puedes adaptar tu flujo de trabajo a tus necesidades usando etapas, que representan un valor en un campo de selección:
+You can tailor your workflow to suit your needs using stages, which represent a value in a Select Field:
-### Agregar Etapas
+### Add Stages
-Para agregar una etapa, accede a la configuración del campo de selección navegando a Configuración > Modelo de Datos, seleccionando tu objeto, y luego el campo del que depende tu tablero Kanban.
+To add a stage, access the Select field settings by navigating to Settings > Data Model, selecting your object, and then the field your Kanban board depends on.
-### Eliminar Etapas
+### Remove Stages
To remove a stage, hover the stage name or the `⋮` icon, click `Edit from settings` in the Select field settings, and then click **Delete** next to the relevant stage.
## Display Fields
-Puedes configurar tu tablero Kanban para mostrar algunos campos y ocultar otros. To hide a field, click on **Options** on the top right, then on **Fields** to bring up the list of options. Look for the field needed in the Hidden Fields section and click on the eye button to display the field.
+You can configure your Kanban board to display some fields and hide others. To hide a field, click on **Options** on the top right, then on **Fields** to bring up the list of options. Look for the field needed in the Hidden Fields section and click on the eye button to display the field.
-También puedes reorganizar el orden de los campos manteniendo presionado el nombre del campo y arrastrándolo a donde desees.
+You can also rearrange the order of fields by holding down the field name and dragging it to where you want it.
-## Vista compacta
+## Compact View
You can hide all the fields and get an overview of all records at a glance. To enable:
@@ -53,7 +53,7 @@ Each column in a Kanban view can display aggregated values at the top, helping y
### Available Aggregations
-| Aggregation | Descripción |
+| Aggregation | Description |
| ----------- | --------------------------------------------- |
| **Count** | Number of records in the column |
| **Sum** | Total of a numeric field (e.g., deal amounts) |
@@ -78,7 +78,7 @@ Kanban views are ideal for:
* **Recruitment**: Track candidates through hiring stages
* **Any staged process**: Visualize any workflow with defined stages
-## Mejores prácticas
+## Best Practices
### Organize Your Stages
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/table-views.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/table-views.mdx
index 4e4f05c514..3cbd115aa2 100644
--- a/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/table-views.mdx
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/table-views.mdx
@@ -1,9 +1,9 @@
---
-title: Vistas de Tabla
+title: Table Views
description: Display your data in a spreadsheet-like list format.
---
-## Acerca de las Vistas de Tabla
+## About Table Views
Table views display records in rows with customizable columns—like a spreadsheet. This is the default view type for most objects.
@@ -31,7 +31,7 @@ Organize records into collapsible groups based on a field of select type.
* **Manual order**: Drag groups under "Visible groups" to reorder
* Click the **eye icon** next to a group to hide it
-**Casos de uso:**
+**Use cases:**
* Group Company by Type
* Group Opportunities by Stage
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/view-settings.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/view-settings.mdx
index b77ed8aaba..82ae18b783 100644
--- a/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/view-settings.mdx
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/capabilities/view-settings.mdx
@@ -47,7 +47,7 @@ Change the order views appear in the dropdown:
3. Drop in the desired position
4. Order saves automatically
-## Favoritos
+## Favorites
Pin frequently used views for quick access:
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
index 09328d7bac..8a8c463178 100644
--- a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
@@ -5,7 +5,7 @@ description: Visualize your tasks and deadlines on a calendar.
-## Prerrequisitos
+## Prerequisites
Your Tasks object needs a **Due Date** field (Date or Date & Time type).
@@ -17,7 +17,7 @@ Your Tasks object needs a **Due Date** field (Date or Date & Time type).
4. Click **Create**
5. Click **Options** and select **Calendar** as the layout
6. Choose **Due Date** as the date field
-7. Haga clic en **Guardar**
+7. Click **Save**
## Configure Your Calendar
@@ -43,9 +43,9 @@ Create focused views:
## Other Calendar Use Cases
-| Objeto | Date Field | Purpose |
+| Object | Date Field | Purpose |
| ------------- | ---------- | ------------------------- |
-| Oportunidades | Close Date | Track expected closes |
+| Opportunities | Close Date | Track expected closes |
| Custom Events | Event Date | Plan activities |
| Projects | Deadline | Monitor project timelines |
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
index 1982837f2d..e8c6d1ed13 100644
--- a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
@@ -9,7 +9,7 @@ Use a Kanban view to visualize your projects (or any object with stages) as card
-## Prerrequisitos
+## Prerequisites
Your object needs a **Select field** to use as columns (e.g., Status, Stage, Phase).
@@ -27,7 +27,7 @@ If you don't have one:
4. Click **Create**
5. Click **Options** and select **Kanban** as the layout
6. The view uses your Select field for columns automatically
-7. Haga clic en **Guardar**
+7. Click **Save**
## Configure Your Board
@@ -72,7 +72,7 @@ Drag and drop cards between columns to update their status.
| **To Do** | New tasks |
| **In Progress** | Active work |
| **Review** | Awaiting approval |
-| **Done** | Completado |
+| **Done** | Completed |
## Related
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx
index 4ae52e77e4..a47967e9be 100644
--- a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx
@@ -17,13 +17,13 @@ Group your table view by a Select field to organize records into collapsible sec
4. Click **Create**
5. Click **Options → Group**
6. Choose a Select field to group by
-7. Haga clic en **Guardar**
+7. Click **Save**
## Configure Group Order
Under **Options → Group → Sort**, choose how groups are ordered:
-| Opción | Descripción |
+| Option | Description |
| ------------------------ | --------------------------------------------- |
| **Alphabetical** | A to Z |
| **Reverse alphabetical** | Z to A |
@@ -41,7 +41,7 @@ Click the **eye icon** next to a group to hide it from the view.
2. Create a new view named "By Industry"
3. Click **Options → Group**
4. Select the **Industry** field
-5. Guardar
+5. Save
Now your companies are organized by industry, making it easy to focus on one segment at a time.
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
index f2fbaf5201..cd6745664e 100644
--- a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
@@ -1,32 +1,32 @@
---
-title: Restringir el acceso a tu vista
-description: Controla quién puede ver tus vistas personalizadas.
+title: Restrict Access to Your View
+description: Control who can see your custom views.
---
-Cada vista (excepto las vistas predeterminadas "Todas las [Object Name]") tiene su propia configuración de visibilidad.
+Each view (except the default "All [Object Name]" views) has its own visibility setting.
-## Pasos
+## Steps
-1. Abre la vista que deseas restringir
-2. Haz clic en **Opciones** en la esquina superior derecha
-3. Haz clic en **Visibilidad**
-4. Selecciona **No listada**
+1. Open the view you want to restrict
+2. Click **Options** in the top right
+3. Click **Visibility**
+4. Select **Unlisted**
-Tu vista ahora es visible solo para ti.
+Your view is now visible only to you.
-## Opciones de visibilidad
+## Visibility Options
-| Configuración | Quién puede ver |
-| ---------------------- | ----------------------------------------- |
-| **Espacio de trabajo** | Todos los miembros del espacio de trabajo |
-| **No listada** | Solo tú |
+| Setting | Who Can See |
+| ------------- | --------------------- |
+| **Workspace** | All workspace members |
+| **Unlisted** | Only you |
-## Notas
+## Notes
-* Las vistas predeterminadas "Todas las [Object Name]" no se pueden establecer como no listadas
-* Las vistas no listadas no aparecen en los menús desplegables de vistas de otros usuarios
-* Puedes cambiar la visibilidad de nuevo a Espacio de trabajo en cualquier momento
+* The default "All [Object Name]" views cannot be made unlisted
+* Unlisted views don't appear in other users' view dropdowns
+* You can change visibility back to Workspace at any time
-## Relacionado
+## Related
-* [Configuración de vistas](/l/es/user-guide/views-pipelines/capabilities/view-settings) — todas las opciones de configuración de vistas
+* [View Settings](/l/es/user-guide/views-pipelines/capabilities/view-settings) — all view configuration options
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx
index b163a1a931..33f4f13187 100644
--- a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx
@@ -20,7 +20,7 @@ Stages are defined in the Opportunities object's **Stage** field.
### Recommended Stages
-| Etapa | Purpose |
+| Stage | Purpose |
| --------------- | ----------------------------------- |
| **New** | Fresh opportunities just identified |
| **Qualified** | Confirmed as a good fit |
@@ -100,7 +100,7 @@ Drag and drop opportunity cards between columns to update their stage.
-## Mejores prácticas
+## Best Practices
### Pipeline Hygiene
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
index 87a253c0c1..e8542f8364 100644
--- a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
@@ -1,149 +1,149 @@
---
-title: Mostrar el Importe previsto en tu pipeline
-description: Calcula y muestra valores ponderados de las oportunidades según la probabilidad de la etapa.
+title: Show Expected Amount in Your Pipeline
+description: Calculate and display weighted deal values based on stage probability.
---
-El Importe previsto es un valor calculado: **Importe × Probabilidad**. Esto te ayuda a pronosticar ingresos ponderando las oportunidades según la probabilidad de que se cierren.
+The Expected Amount is a calculated value: **Amount × Probability**. This helps you forecast revenue by weighting deals based on how likely they are to close.
- Este es un ejemplo de creación de [Campos de fórmula](/l/es/user-guide/workflows/how-tos/crm-automations/formula-fields) usando flujos de trabajo.
+ This is an example of creating [Formula Fields](/l/es/user-guide/workflows/how-tos/crm-automations/formula-fields) using workflows.
-Esta guía te acompaña para configurar los campos personalizados y los flujos de trabajo necesarios para calcular y mostrar importes previstos en tu pipeline.
+This guide walks you through setting up the custom fields and workflows needed to calculate and display expected amounts in your pipeline.
-## Paso 1: Crear campos personalizados
+## Step 1: Create Custom Fields
-Necesitas dos campos personalizados en el objeto Oportunidades.
+You need two custom fields on the Opportunities object.
-### Crear el campo Probabilidad
+### Create the Probability Field
-1. Ve a **Ajustes → Modelo de datos → Oportunidades**
-2. Haz clic en **+ Añadir campo**
-3. Configurar:
- * **Nombre**: Probabilidad
- * **Tipo**: Número
- * **Descripción**: Probabilidad según etapa (0-100%)
-4. Haga clic en **Guardar**
+1. Go to **Settings → Data Model → Opportunities**
+2. Click **+ Add Field**
+3. Configure:
+ * **Name**: Probability
+ * **Type**: Number
+ * **Description**: Stage-based probability (0-100%)
+4. Click **Save**
-### Crear el campo Importe previsto
+### Create the Expected Amount Field
-1. Haz clic en **+ Añadir campo**
-2. Configurar:
- * **Nombre**: Importe previsto
- * **Tipo**: Moneda
- * **Descripción**: Calculado: Importe × Probabilidad
-3. Haga clic en **Guardar**
+1. Click **+ Add Field**
+2. Configure:
+ * **Name**: Expected Amount
+ * **Type**: Currency
+ * **Description**: Calculated: Amount × Probability
+3. Click **Save**
-### Opcional: Hacer que los campos sean de solo lectura para los usuarios
+### Optional: Make Fields Read-Only for Users
-Si no quieres que los usuarios editen manualmente estos campos calculados:
+If you don't want users manually editing these calculated fields:
-1. Ve a **Ajustes → Roles**
-2. Selecciona el rol a configurar
-3. Busca el objeto Oportunidades
-4. Establece los campos **Probabilidad** e **Importe previsto** como de solo lectura
+1. Go to **Settings → Roles**
+2. Select the role to configure
+3. Find the Opportunities object
+4. Set **Probability** and **Expected Amount** fields to read-only
-Esto garantiza que solo los flujos de trabajo puedan actualizar estos valores.
+This ensures only the workflows can update these values.
-## Paso 2: Crear el flujo de trabajo #1 — Actualizar la Probabilidad al cambiar de etapa
+## Step 2: Create Workflow #1 — Update Probability on Stage Change
-Este flujo de trabajo establece automáticamente la Probabilidad cuando una oportunidad pasa a una nueva etapa.
+This workflow automatically sets the Probability when an opportunity moves to a new stage.
-### Crear el flujo de trabajo
+### Create the Workflow
-1. Ve a **Flujos de trabajo**
-2. Haz clic en **+ Nuevo flujo de trabajo**
-3. Ponle el nombre "Actualizar la Probabilidad al cambiar de etapa"
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Update Probability on Stage Change"
-### Configurar el desencadenador
+### Configure the Trigger
-1. Añade un desencadenador **Registro creado o actualizado**
-2. Selecciona **Oportunidades** como objeto
-3. Filtrar en: se actualiza el campo **Etapa**
+1. Add a **Record Created or Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Stage** field is updated
-### Añadir ramas para cada etapa
+### Add Branches for Each Stage
-Crea una rama para cada etapa con su probabilidad:
+Create a branch for each stage with its probability:
-| Etapa | Probabilidad |
-| --------------- | ------------ |
-| Nuevo | 10% |
-| Calificado | 25% |
-| Reunión | 40% |
-| Propuesta | 60% |
-| Negociación | 80% |
-| Cerrado ganado | 100% |
-| Cerrado perdido | 0% |
+| Stage | Probability |
+| ----------- | ----------- |
+| New | 10% |
+| Qualified | 25% |
+| Meeting | 40% |
+| Proposal | 60% |
+| Negotiation | 80% |
+| Closed Won | 100% |
+| Closed Lost | 0% |
- Para crear una nueva rama, haz clic derecho en el lienzo del flujo de trabajo y haz clic en **Nueva acción**. Luego, vincula esta acción al nodo anterior arrastrando la flecha desde el nodo anterior hasta esta nueva acción.
+ To create a new branch, right click on the workflow canvas and click **New action**. Then, link this action to the previous node by dragging the arrow from the previous node to this new action.
-Para cada etapa:
+For each stage:
-1. Añade un nodo **Filtro**: Etapa = [nombre de la etapa]
-2. Añade una acción **Actualizar registro**:
- * Registro: la Oportunidad desencadenante
- * Campo: Probabilidad
- * Valor: [probabilidad para esa etapa]
+1. Add a **Filter** node: Stage = [stage name]
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Probability
+ * Value: [probability for that stage]
-### Calcular el Importe previsto
+### Calculate Expected Amount
-Después de que las ramas se vuelvan a unir:
+After the branches rejoin:
-1. Añade un nodo **Filtro**: el Importe no está vacío
-2. Añade una acción **Actualizar registro**:
- * Registro: la Oportunidad desencadenante
- * Campo: Importe previsto
- * Valor: Importe × Probabilidad
+1. Add a **Filter** node: Amount is not empty
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Expected Amount
+ * Value: Amount × Probability
-## Paso 3: Crear el flujo de trabajo #2 — Recalcular al cambiar el Importe
+## Step 3: Create Workflow #2 — Recalculate on Amount Change
-Este flujo de trabajo actualiza el Importe previsto cuando cambia el Importe de la oportunidad.
+This workflow updates the Expected Amount when the deal Amount changes.
-### Crear el flujo de trabajo
+### Create the Workflow
-1. Ve a **Flujos de trabajo**
-2. Haz clic en **+ Nuevo flujo de trabajo**
-3. Ponle el nombre "Recalcular el Importe previsto al cambiar el Importe"
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Recalculate Expected Amount on Amount Change"
-### Configurar el desencadenador
+### Configure the Trigger
-1. Añade un desencadenador **Registro creado o actualizado**
-2. Selecciona **Oportunidades** como objeto
-3. Filtrar en: se actualiza el campo **Importe**
+1. Add a **Record Created or Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Amount** field is updated
-### Añadir la lógica
+### Add the Logic
-1. Añade un nodo **Filtro**: el Importe no está vacío
-2. Añade una acción **Actualizar registro**:
- * Registro: la Oportunidad desencadenante
- * Campo: Importe previsto
- * Valor: Importe × Probabilidad
+1. Add a **Filter** node: Amount is not empty
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Expected Amount
+ * Value: Amount × Probability
-## Paso 4: Mostrarlo en tu pipeline
+## Step 4: Display in Your Pipeline
-Ahora muestra los totales de Importe previsto en tu vista Kanban:
+Now show the Expected Amount totals in your Kanban view:
-1. Abre tu vista Kanban de Pipeline de ventas
-2. Haz clic en el número junto al nombre de cualquier etapa en la parte superior de una columna
-3. Selecciona **Suma**
-4. Elige **Importe previsto**
+1. Open your **Sales Pipeline** Kanban view
+2. Click the **number** next to any Stage name at the top of a column
+3. Select **Sum**
+4. Choose **Expected Amount**
-Cada columna ahora muestra el valor total ponderado del pipeline para esa etapa.
+Each column now shows the total weighted pipeline value for that stage.
-## Resumen
+## Summary
-| Componente | Propósito |
-| ----------------------------- | -------------------------------------------------------------------------------------- |
-| **Campo de Probabilidad** | Almacena la probabilidad de ganar según la etapa |
-| **Campo de Importe previsto** | Almacena Importe × Probabilidad |
-| **Flujo de trabajo #1** | Actualiza la Probabilidad cuando cambia la Etapa y luego recalcula el Importe previsto |
-| **Flujo de trabajo #2** | Recalcula el Importe previsto cuando cambia el Importe |
-| **Agregación** | Muestra la suma del Importe previsto por etapa |
+| Component | Purpose |
+| ------------------------- | ------------------------------------------------------------------------- |
+| **Probability field** | Stores the stage-based win probability |
+| **Expected Amount field** | Stores Amount × Probability |
+| **Workflow #1** | Updates Probability when Stage changes, then recalculates Expected Amount |
+| **Workflow #2** | Recalculates Expected Amount when Amount changes |
+| **Aggregation** | Displays Sum of Expected Amount per stage |
-## Relacionado
+## Related
-* [Campos de fórmula](/l/es/user-guide/workflows/how-tos/crm-automations/formula-fields) — crea campos calculados usando flujos de trabajo
-* [Vistas Kanban](/l/es/user-guide/views-pipelines/capabilities/kanban-views) — agregaciones por columna
-* [Cómo crear campos personalizados](/l/es/user-guide/data-model/how-tos/create-custom-fields) — configuración de campos
+* [Formula Fields](/l/es/user-guide/workflows/how-tos/crm-automations/formula-fields) — create calculated fields using workflows
+* [Kanban Views](/l/es/user-guide/views-pipelines/capabilities/kanban-views) — column aggregations
+* [How to Create Custom Fields](/l/es/user-guide/data-model/how-tos/create-custom-fields) — field configuration
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
index 9269fb8de1..c56e7caf0e 100644
--- a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
@@ -1,104 +1,104 @@
---
-title: Realiza un seguimiento de cuánto tiempo permanecen las oportunidades en cada etapa.
-description: Supervisa la velocidad de las oportunidades registrando cuándo ingresan a cada etapa.
+title: Track How Long Opportunities Stay in Each Stage
+description: Monitor deal velocity by tracking when opportunities enter each stage.
---
- Este es un ejemplo de cómo crear [Campos de fórmula](/l/es/user-guide/workflows/how-tos/crm-automations/formula-fields) usando flujos de trabajo — específicamente cálculos de fechas.
+ This is an example of creating [Formula Fields](/l/es/user-guide/workflows/how-tos/crm-automations/formula-fields) using workflows — specifically date calculations.
-Registrar cuándo las oportunidades ingresan a cada etapa te ayuda a identificar cuellos de botella y medir la velocidad de las oportunidades.
+Tracking when opportunities enter each stage helps you identify bottlenecks and measure deal velocity.
-Esta guía te muestra cómo configurar campos personalizados y un flujo de trabajo para registrar automáticamente cuándo una oportunidad pasa a cada etapa y calcular cuántos días pasó en la etapa anterior.
+This guide walks you through setting up custom fields and a workflow to automatically record when an opportunity moves to each stage, and calculate how many days it spent in the previous stage.
-## Paso 1: Crear campos personalizados
+## Step 1: Create Custom Fields
-Necesitas dos tipos de campos para cada etapa:
+You need two types of fields for each stage:
-* **Campos de fecha y hora**: Registran cuándo la oportunidad ingresó a cada etapa
-* **Campos numéricos**: Almacenan cuántos días pasó la oportunidad en cada etapa
+* **Date & Time fields**: Record when the opportunity entered each stage
+* **Number fields**: Store how many days the opportunity spent in each stage
-### Crea los campos "Última entrada"
+### Create the "Last Entered" Fields
-1. Ve a **Ajustes → Modelo de datos → Oportunidades**
-2. Para cada etapa, haz clic en **+ Agregar campo** y configura:
- * **Nombre**: Última entrada en [Nombre de la etapa] (p. ej., "Última entrada en Nuevo", "Última entrada en Calificado")
- * **Tipo**: Fecha y hora
- * **Descripción**: Marca de tiempo cuando la oportunidad ingresó a esta etapa
-3. Haga clic en **Guardar**
+1. Go to **Settings → Data Model → Opportunities**
+2. For each stage, click **+ Add Field** and configure:
+ * **Name**: Last Entered [Stage Name] (e.g., "Last Entered New", "Last Entered Qualified")
+ * **Type**: Date & Time
+ * **Description**: Timestamp when opportunity entered this stage
+3. Click **Save**
-Crea estos campos:
+Create these fields:
-* Última entrada en Nuevo
-* Última entrada en Calificado
-* Última entrada en Reunión
-* Última entrada en Propuesta
-* Última entrada en Negociación
-* Última entrada en Cerrado ganado
-* Última entrada en Cerrado perdido
+* Last Entered New
+* Last Entered Qualified
+* Last Entered Meeting
+* Last Entered Proposal
+* Last Entered Negotiation
+* Last Entered Closed Won
+* Last Entered Closed Lost
-### Crea los campos "Días en la etapa"
+### Create the "Days in Stage" Fields
-1. Para cada etapa, haz clic en **+ Agregar campo** y configura:
- * **Nombre**: Días en [Nombre de la etapa] (p. ej., "Días en Nuevo", "Días en Calificado")
- * **Tipo**: Número
- * **Descripción**: Número de días que pasó en esta etapa
-2. Haga clic en **Guardar**
+1. For each stage, click **+ Add Field** and configure:
+ * **Name**: Days in [Stage Name] (e.g., "Days in New", "Days in Qualified")
+ * **Type**: Number
+ * **Description**: Number of days spent in this stage
+2. Click **Save**
-Crea estos campos:
+Create these fields:
-* Días en Nuevo
-* Días en Calificado
-* Días en Reunión
-* Días en Propuesta
-* Días en Negociación
+* Days in New
+* Days in Qualified
+* Days in Meeting
+* Days in Proposal
+* Days in Negotiation
- No necesitas campos "Días en" para Cerrado ganado y Cerrado perdido, ya que son etapas finales.
+ You don't need "Days in" fields for Closed Won and Closed Lost since those are final stages.
-### Opcional: Hacer que los campos sean de solo lectura
+### Optional: Make Fields Read-Only
-Si no quieres que los usuarios editen manualmente estos campos calculados:
+If you don't want users manually editing these calculated fields:
-1. Ve a **Ajustes → Roles**
-2. Selecciona el rol que deseas configurar
-3. Busca el objeto Oportunidades
-4. Configura los campos "Última entrada" y "Días en" como de solo lectura
+1. Go to **Settings → Roles**
+2. Select the role to configure
+3. Find the Opportunities object
+4. Set the "Last Entered" and "Days in" fields to read-only
-## Paso 2: Crear el flujo de trabajo
+## Step 2: Create the Workflow
-Este único flujo de trabajo gestiona ambas tareas:
+This single workflow handles both tasks:
-* Registra la marca de tiempo al entrar en una nueva etapa
-* Calcula los días que se pasaron en la etapa anterior
+* Records the timestamp when entering a new stage
+* Calculates days spent in the previous stage
-### Crea el flujo de trabajo
+### Create the Workflow
-1. Ve a **Flujos de trabajo**
-2. Haz clic en **+ Nuevo flujo de trabajo**
-3. Ponle el nombre "Seguimiento del tiempo por etapa"
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Track Stage Time"
-### Configura el disparador
+### Configure the Trigger
-1. Agrega un disparador **Registro actualizado**
-2. Selecciona **Oportunidades** como objeto
-3. Filtrar por: el campo **Etapa** se actualiza
+1. Add a **Record Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Stage** field is updated
-### Agrega ramas para cada etapa
+### Add Branches for Each Stage
- Para crear una nueva rama, haz clic derecho en el lienzo del flujo de trabajo y haz clic en **Nueva acción**. Luego, vincula esta acción al nodo anterior arrastrando la flecha desde el nodo anterior hasta esta nueva acción.
+ To create a new branch, right click on the workflow canvas and click **New action**. Then, link this action to the previous node by dragging the arrow from the previous node to this new action.
---
-**Rama 1: Etapa = Nuevo (primera etapa)**
+**Branch 1: Stage = New (first stage)**
-Como esta es la primera etapa, solo registramos la marca de tiempo de entrada; no hay una etapa anterior que calcular.
+Since this is the first stage, we only record the entry timestamp—no previous stage to calculate.
-1. Agrega un nodo **Filtro**: Etapa = Nuevo
-2. Agrega una acción de **Código**:
+1. Add a **Filter** node: Stage = New
+2. Add a **Code** action:
```javascript
export const main = async (): Promise => {
@@ -106,19 +106,19 @@ export const main = async (): Promise => {
};
```
-3. Agrega una acción **Actualizar registro**:
- * Registro: la Oportunidad que activó el evento
- * Campo: Última entrada en Nuevo
- * Valor: `now` del nodo de Código
+3. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Last Entered New
+ * Value: `now` from Code node
---
-**Rama 2: Etapa = Calificado**
+**Branch 2: Stage = Qualified**
-Al pasar a Calificado, registra la hora de entrada Y calcula los días que se pasaron en Nuevo.
+When moving to Qualified, record entry time AND calculate days spent in New.
-1. Agrega un nodo **Filtro**: Etapa = Calificado
-2. Agrega una acción de **Código**:
+1. Add a **Filter** node: Stage = Qualified
+2. Add a **Code** action:
```javascript
export const main = async (params: {
@@ -138,21 +138,21 @@ export const main = async (params: {
};
```
-3. Configura la entrada del nodo de Código: mapea `lastEnteredPreviousStage` al campo **Última entrada en Nuevo**
-4. Agrega una acción **Actualizar registro**:
- * Registro: la Oportunidad que activó el evento
- * Campos a actualizar:
- * Última entrada en Calificado = `now`
- * Días en Nuevo = `daysInPreviousStage`
+3. Configure the Code node input: map `lastEnteredPreviousStage` to the **Last Entered New** field
+4. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Fields to update:
+ * Last Entered Qualified = `now`
+ * Days in New = `daysInPreviousStage`
---
-**Rama 3: Etapa = Reunión**
+**Branch 3: Stage = Meeting**
-Al pasar a Reunión, registra la hora de entrada Y calcula los días que se pasaron en Calificado.
+When moving to Meeting, record entry time AND calculate days spent in Qualified.
-1. Agrega un nodo **Filtro**: Etapa = Reunión
-2. Agrega una acción de **Código**:
+1. Add a **Filter** node: Stage = Meeting
+2. Add a **Code** action:
```javascript
export const main = async (params: {
@@ -172,60 +172,60 @@ export const main = async (params: {
};
```
-3. Configura la entrada del nodo de Código: mapea `lastEnteredPreviousStage` al campo **Última entrada en Calificado**
-4. Agrega una acción **Actualizar registro**:
- * Registro: la Oportunidad que activó el evento
- * Campos a actualizar:
- * Última entrada en Reunión = `now`
- * Días en Calificado = `daysInPreviousStage`
+3. Configure the Code node input: map `lastEnteredPreviousStage` to the **Last Entered Qualified** field
+4. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Fields to update:
+ * Last Entered Meeting = `now`
+ * Days in Qualified = `daysInPreviousStage`
---
-**Continúa con las etapas restantes:**
+**Continue for remaining stages:**
-| Etapa | Registros | Calcula |
-| --------------- | --------------------------------- | ------------------- |
-| Propuesta | Última entrada en Propuesta | Días en Reunión |
-| Negociación | Última entrada en Negociación | Días en Propuesta |
-| Cerrado ganado | Última entrada en Cerrado ganado | Días en Negociación |
-| Cerrado perdido | Última entrada en Cerrado perdido | Días en Negociación |
+| Stage | Records | Calculates |
+| ----------- | ------------------------ | ------------------- |
+| Proposal | Last Entered Proposal | Days in Meeting |
+| Negotiation | Last Entered Negotiation | Days in Proposal |
+| Closed Won | Last Entered Closed Won | Days in Negotiation |
+| Closed Lost | Last Entered Closed Lost | Days in Negotiation |
-Las ramas no necesitan volver a unirse; cada una se ejecuta de forma independiente cuando se cumple su condición de etapa.
+The branches do not need to rejoin—each runs independently when its stage condition is met.
-## Paso 3: Analizar el tiempo en la etapa
+## Step 3: Analyze Time in Stage
-Con las marcas de tiempo y los recuentos de días registrados, ahora puedes analizar la velocidad de las oportunidades.
+With timestamps and day counts recorded, you can now analyze deal velocity.
-### Crea una vista "Oportunidades lentas"
+### Create a "Slow Deals" View
-1. Crea una vista de tabla de Oportunidades
-2. Agrega columnas: Nombre, Etapa, Días en [etapa anterior], Importe
-3. Ordena por el campo "Días en" (descendente)
-4. Filtra por Etapa para centrarte en una etapa a la vez
+1. Create a Table view of Opportunities
+2. Add columns: Name, Stage, Days in [previous stage], Amount
+3. Sort by "Days in" field (descending)
+4. Filter by Stage to focus on one stage at a time
-Las oportunidades en la parte superior pasaron más tiempo en la etapa anterior.
+Deals at the top spent the most time in the previous stage.
-### Usa agregaciones
+### Use Aggregations
-En tu vista Kanban del pipeline:
+In your pipeline Kanban view:
-1. Haz clic en el número junto al nombre de una Etapa
-2. Selecciona **Promedio**
-3. Elige un campo "Días en"
+1. Click the number next to a Stage name
+2. Select **Average**
+3. Choose a "Days in" field
-Esto muestra el tiempo promedio que las oportunidades pasan en cada etapa.
+This shows the average time deals spend in each stage.
-## Resumen
+## Summary
-| Componente | Propósito |
-| --------------------------- | ------------------------------------------------------------------------- |
-| **Campos "Última entrada"** | Almacenan cuándo la oportunidad ingresó a cada etapa |
-| **Campos "Días en"** | Almacenan cuántos días se pasaron en cada etapa |
-| **Flujo de trabajo** | Registra la marca de tiempo Y calcula los días en una sola pasada |
-| **Vistas y agregaciones** | Analiza la velocidad de las oportunidades e identifica cuellos de botella |
+| Component | Purpose |
+| ------------------------ | ------------------------------------------------- |
+| **Last Entered fields** | Store when opportunity entered each stage |
+| **Days in fields** | Store how many days spent in each stage |
+| **Workflow** | Records timestamp AND calculates days in one pass |
+| **Views & Aggregations** | Analyze deal velocity and identify bottlenecks |
-## Relacionado
+## Related
-* [Flujos de trabajo](/l/es/user-guide/workflows/overview) — conceptos básicos de automatización
-* [Cómo crear campos personalizados](/l/es/user-guide/data-model/how-tos/create-custom-fields) — configuración de campos
-* [Vistas Kanban](/l/es/user-guide/views-pipelines/capabilities/kanban-views) — agregaciones
+* [Workflows](/l/es/user-guide/workflows/overview) — automation basics
+* [How to Create Custom Fields](/l/es/user-guide/data-model/how-tos/create-custom-fields) — field configuration
+* [Kanban Views](/l/es/user-guide/views-pipelines/capabilities/kanban-views) — aggregations
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/overview.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/overview.mdx
index 6bd2218717..9f652fe48c 100644
--- a/packages/twenty-docs/l/es/user-guide/views-pipelines/overview.mdx
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/overview.mdx
@@ -1,137 +1,137 @@
---
-title: Vistas y embudos
-description: Aprende a crear y gestionar vistas en Twenty.
+title: Views & Pipelines
+description: Learn how to create and manage views in Twenty.
image: /images/user-guide/table-views/table.png
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-
+
-## Comprender las vistas
+## Understanding Views
-Las vistas son configuraciones guardadas que determinan cómo se muestran tus datos. Cada vista puede tener sus propios:
+Views are saved configurations that determine how your data is displayed. Each view can have its own:
-* **Diseño**: Tabla, Kanban o Calendario
-* **Filtros**: Qué registros mostrar
-* **Ordenación**: Cómo se ordenan los registros
-* **Campos**: Qué columnas son visibles
+* **Layout**: Table, Kanban, or Calendar
+* **Filters**: Which records to show
+* **Sorting**: How records are ordered
+* **Fields**: Which columns are visible
-## Tipos de vista
+## View Types
-### Vista de tabla
+### Table View
-La vista predeterminada tipo hoja de cálculo que muestra los registros en filas con columnas personalizables.
+The default spreadsheet-like view showing records in rows with customizable columns.
-### Vista Kanban
+### Kanban View
-Una vista de tablero visual en la que los registros aparecen como tarjetas organizadas por etapas. Ideal para:
+A visual board view where records appear as cards organized by stages. Ideal for:
-* Embudos de ventas
-* Seguimiento de proyectos
-* Cualquier flujo de trabajo con etapas definidas
+* Sales pipelines
+* Project tracking
+* Any workflow with defined stages
-### Vista del calendario
+### Calendar View
-Muestra los registros con campos de fecha en un calendario. Perfecto para:
+Display records with date fields on a calendar. Perfect for:
-* Reuniones y eventos
-* Fechas límite y vencimientos
-* Planificación basada en el tiempo
+* Meetings and events
+* Deadlines and due dates
+* Time-based planning
-## Creación de una Vista
+## Creating a View
-Hay dos maneras de crear una nueva vista.
+There are two ways to create a new view.
-### Usa el menú desplegable de vistas
+### Use the View Dropdown Menu
-1. Ve a cualquier objeto (Personas, Empresas, etc.)
-2. Haz clic en el nombre de la vista en la parte superior izquierda (muestra la vista actual con una flecha desplegable)
-3. Haz clic en **+ Añadir vista**
-4. Asigna un nombre a tu vista y haz clic en **Crear**
-5. Elige un diseño (Tabla, Kanban o Calendario) en **Opciones**
-6. Añade filtros y ordenación según sea necesario
-7. Selecciona qué campos mostrar y reordénalos
-8. Haga clic en **Guardar**
+1. Navigate to any object (People, Companies, etc.)
+2. Click the view name at the top left (shows current view with a dropdown arrow)
+3. Click **+ Add view**
+4. Name your view and click **Create**
+5. Choose a layout (Table, Kanban, or Calendar) under **Options**
+6. Add filters and sorting as needed
+7. Select which fields to display and reorder them
+8. Click **Save**
-
+
-### Comienza editando una vista existente
+### Start by editting an existing view
-1. Ve a cualquier objeto (Personas, Empresas, etc.)
-2. Elige un diseño (Tabla, Kanban o Calendario) en **Opciones** o añade filtros y ordenación según sea necesario
-3. Haz clic en **Guardar como nueva vista**
-4. Asigna un nombre a tu vista y haz clic en **Crear**
-5. Sigue editando tu nueva vista
-6. Haz clic en **Actualizar vista** para guardar tus ajustes adicionales
+1. Navigate to any object (People, Companies, etc.)
+2. Choose a layout (Table, Kanban, or Calendar) under **Options** or Add filters and sorting as needed
+3. Click on **Save as new view**
+4. Name your view and click **Create**
+5. Keep editing your new view
+6. Click on **Update view** to save your additional configurations
-
+
-## Administrar vistas
+## Managing Views
-### Editar una vista
+### Edit a View
-1. Selecciona la vista en el menú desplegable
-2. Realiza tus cambios (filtros, ordenación, columnas)
-3. Haz clic en **Guardar** para actualizar la vista
+1. Select the view from the dropdown
+2. Make your changes (filters, sorting, columns)
+3. Click **Save** to update the view
-### Cambiar el nombre de una vista o su icono
+### Rename a View or Change Its Icon
-1. Abre el menú desplegable de la vista
-2. Haz clic en el menú **⋮** junto al nombre de la vista
-3. Selecciona **Editar**
-4. Cambia el nombre o el icono
-5. Haga clic en **Guardar**
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view name
+3. Select **Edit**
+4. Change the name or icon
+5. Click **Save**
-### Reordenar vistas
+### Reorder Views
-1. Abre el menú desplegable de la vista
-2. Haz clic y arrastra una vista por su controlador
-3. Suéltala en la posición deseada
-4. El nuevo orden se guarda automáticamente
+1. Open the view dropdown
+2. Click and drag a view by its handle
+3. Drop it in the desired position
+4. The new order is saved automatically
-### Añadir a favoritos
+### Add to Favorites
-Fija las vistas que usas con frecuencia para un acceso rápido:
+Pin frequently used views for quick access:
-1. Abre el menú desplegable de la vista
-2. Haz clic en el menú **⋮** junto a una vista
-3. Selecciona **Añadir a favoritos**
-4. La vista aparece en tu sección de favoritos
+1. Open the view dropdown
+2. Click the **⋮** menu next to a view
+3. Select **Add to favorites**
+4. The view appears in your favorites section
-### Eliminar una vista
+### Delete a View
-1. Selecciona la vista que deseas eliminar
-2. Haz clic en el menú desplegable de la vista
-3. Haz clic en el menú **⋮** junto a la vista
-4. Selecciona **Eliminar**
-5. Confirma la eliminación
+1. Select the view to delete
+2. Click the view dropdown
+3. Click the **⋮** menu next to the view
+4. Select **Delete**
+5. Confirm deletion
- Las vistas eliminadas no se pueden recuperar. Asegúrate de que deseas eliminarla antes de confirmar.
+ Deleted views cannot be recovered. Make sure you want to remove it before confirming.
-## Visibilidad de la vista
+## View Visibility
-Cada vista (excepto las vistas predeterminadas "All [Object Name]") tiene su propia configuración de visibilidad.
+Each view (except the default "All [Object Name]" views) has its own visibility setting.
-Para cambiar la visibilidad:
+To change visibility:
-1. Abre la vista
-2. Haz clic en **Opciones → Visibilidad**
-3. Elige:
- * **Espacio de trabajo**: Visible para todos los miembros del espacio de trabajo
- * **No listado**: Visible solo para ti
+1. Open the view
+2. Click **Options → Visibility**
+3. Choose:
+ * **Workspace**: Visible to all workspace members
+ * **Unlisted**: Visible only to you
- No se puede cambiar la visibilidad de las vistas predeterminadas "All [Object Name]".
+ The default "All [Object Name]" views cannot have their visibility changed.
-## Próximos Pasos
+## Next Steps
-* [Vistas de tabla](/l/es/user-guide/views-pipelines/capabilities/table-views)
-* [Vistas Kanban](/l/es/user-guide/views-pipelines/capabilities/kanban-views)
-* [Filtros y ordenación](/l/es/user-guide/views-pipelines/capabilities/filters-and-sorting)
-* [Configuración de la vista](/l/es/user-guide/views-pipelines/capabilities/view-settings)
+* [Table Views](/l/es/user-guide/views-pipelines/capabilities/table-views)
+* [Kanban Views](/l/es/user-guide/views-pipelines/capabilities/kanban-views)
+* [Filters and Sorting](/l/es/user-guide/views-pipelines/capabilities/filters-and-sorting)
+* [View Settings](/l/es/user-guide/views-pipelines/capabilities/view-settings)
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/send-emails-from-workflows.mdx b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/send-emails-from-workflows.mdx
index eb4dfe985d..97ebd0b948 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/send-emails-from-workflows.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/send-emails-from-workflows.mdx
@@ -6,7 +6,7 @@ image: /images/user-guide/workflows/workflow.png
Automatically send emails when specific events occur in your CRM—welcome new contacts, follow up on opportunities, or notify team members.
-## Prerrequisitos
+## Prerequisites
Before you can send emails from workflows:
@@ -19,7 +19,7 @@ Before you can send emails from workflows:
**Goal**: Send a welcome email when a new person is added to the CRM.
-**Configuración**:
+**Setup**:
1. **Create workflow**: Go to **Settings → Workflows** and click **+ New Workflow**
@@ -30,10 +30,10 @@ Before you can send emails from workflows:
* Select **Send Email**
* Configure the email:
-| Campo | Valor |
+| Field | Value |
| ----------- | -------------------------------------- |
| **To** | `{{trigger.object.email}}` |
-| **Subject** | `Bienvenido a {{Your Company Name}}` |
+| **Subject** | `Welcome to {{Your Company Name}}` |
| **Body** | `Hi {{trigger.object.firstName}}, ...` |
4. **Test and activate**: Test with a sample record, then activate
@@ -55,7 +55,7 @@ The Team
### Available Variables from Triggers
-| Tipo de disparador | Common Variables |
+| Trigger Type | Common Variables |
| -------------------------- | -------------------------------------- |
| **Record Created/Updated** | `{{trigger.object.fieldName}}` |
| **Manual** | `{{trigger.selectedRecord.fieldName}}` |
@@ -67,7 +67,7 @@ The Team
**Goal**: Send different welcome emails based on where the lead came from.
-**Configuración**:
+**Setup**:
1. **Trigger**: Record is Created (People)
@@ -85,7 +85,7 @@ The Team
**Goal**: Email the sales rep and their manager when an opportunity is won.
-**Configuración**:
+**Setup**:
1. **Trigger**: Record is Updated (Opportunities, Stage = "Closed Won")
@@ -105,7 +105,7 @@ The Team
**Goal**: Send a follow-up email 3 days after a meeting is logged.
-**Configuración**:
+**Setup**:
1. **Trigger**: Record is Created (Activities, Type = "Meeting")
@@ -116,7 +116,7 @@ The Team
* Subject: Following up on our conversation
* Body: Reference meeting details from trigger
-## Mejores prácticas
+## Best Practices
### Email Content
@@ -132,7 +132,7 @@ The Team
* Avoid spam trigger words
* Ensure unsubscribe options for marketing emails
-### Solución de Problemas
+### Troubleshooting
* Verify email account is connected and active
* Check recipient email address is valid
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/use-branches-in-workflows.mdx b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
index 7dfe893a36..a5e103e71a 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
@@ -76,7 +76,7 @@ Trigger
The confirmation email sends only after both the customer update and ticket creation are done.
-## Mejores prácticas
+## Best Practices
* Always use **Filter nodes** at the start of branches when you want conditional execution
* Keep branch conditions **mutually exclusive** to avoid duplicate actions
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/use-iterator.mdx b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/use-iterator.mdx
index 17ab5149c6..88767106ff 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/use-iterator.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/use-iterator.mdx
@@ -12,7 +12,7 @@ Iterator lets you loop through an array of records and perform actions on each o
## When to Use Iterator
-| Scenario | Ejemplo |
+| Scenario | Example |
| -------------------------- | ---------------------------------------------- |
| **Process search results** | Send email to each person found |
| **Handle webhook arrays** | Create records for each item in order |
@@ -62,7 +62,7 @@ Actions placed after Iterator run for each item:
3. Subject: Hello `{{iterator.currentItem.firstName}}`!
4. Body: Personalized message using current item fields
-### Resultado
+### Result
If Search Records returns 5 people, the Iterator:
@@ -74,7 +74,7 @@ If Search Records returns 5 people, the Iterator:
Inside Iterator, use `{{iterator.currentItem}}` to access the current record:
-| Variable | Descripción |
+| Variable | Description |
| --------------------------------------- | ----------------------------------- |
| `{{iterator.currentItem}}` | The entire current record object |
| `{{iterator.currentItem.id}}` | Record ID |
@@ -125,7 +125,7 @@ Inside Iterator, use `{{iterator.currentItem}}` to access the current record:
- To: {{iterator.currentItem.email}}
```
-## Solución de Problemas
+## Troubleshooting
### "Iterator expects an array"
@@ -165,7 +165,7 @@ Filter: {{searchRecords.length}} > 0
* **Limits**: Consider batching very large operations
* **Rate limits**: External API calls may hit rate limits with many iterations
-## Mejores prácticas
+## Best Practices
1. **Always check array length** before Iterator to avoid errors
2. **Add filters inside loops** when not all items need processing
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-actions.mdx b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-actions.mdx
index aefa4a752a..8ec579b01d 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-actions.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-actions.mdx
@@ -1,5 +1,5 @@
---
-title: Acciones del Flujo de Trabajo
+title: Workflow Actions
description: Learn about the actions available in Twenty workflows.
---
@@ -7,7 +7,7 @@ import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
## About Actions
-Las acciones definen lo que ocurre después de que se dispara un activador. You can chain multiple actions together to build complex automations.
+Actions define what happens after a trigger fires. You can chain multiple actions together to build complex automations.
* Use the variable picker (click the `(x+)` icon) to browse available data from previous steps
@@ -19,56 +19,56 @@ Las acciones definen lo que ocurre después de que se dispara un activador. You
-### Crear un Registro
+### Create a Record
-Agrega un nuevo registro a un objeto seleccionado.
+Adds a new record to a selected object.
-**Configuración**:
+**Configuration**:
-* Seleccione el objeto de destino
-* Complete los campos obligatorios y opcionales
+* Select the target object
+* Fill out the required and optional fields
* Use data from previous steps or input values manually to populate fields
-**Salida**: Los datos del registro recién creado están disponibles para su uso en pasos posteriores.
+**Output**: The newly created record data is available for use in subsequent steps.
-### Actualizar Registro
+### Update Record
-Modifica un registro existente en un objeto seleccionado.
+Modifies an existing record in a selected object.
-**Configuración**:
+**Configuration**:
-* Seleccione el objeto de destino
-* Elija el registro específico a actualizar.
+* Select the target object
+* Choose the specific record to update.
* You can either choose a fixed record, using the drop down menu displaying all available records.
* Or you can have the record dynamically selected, by designating a record found in a previous step, using the `(x+)`. You cannot search for the record based on different criteria at this stage. If you've not yet identified the record, add a `Search Record` step before this `Update Record` step.
-* Seleccione campos a modificar e ingrese nuevos valores
+* Select fields to modify and enter new values
-**Salida**: Los datos del registro actualizado están disponibles para su uso en pasos posteriores.
+**Output**: The updated record data is available for use in subsequent steps.
-### Eliminar Registro
+### Delete Record
-Elimina un registro de un objeto seleccionado.
+Removes a record from a selected object.
-**Configuración**:
+**Configuration**:
-* Seleccione el objeto de destino
-* Elija el registro específico a eliminar
+* Select the target object
+* Choose the specific record to delete
-**Salida**: Los datos del registro eliminado permanecen disponibles para su uso en pasos posteriores.
+**Output**: The deleted record data remains available for use in subsequent steps.
-### Buscar Registros
+### Search Records
-Encuentra registros dentro de un objeto seleccionado usando condiciones de filtro.
+Finds records within a selected object using filter conditions.
-**Configuración**:
+**Configuration**:
-* Seleccione el objeto a buscar
-* Establezca criterios de filtro para restringir resultados
-* Configure la clasificación y los límites
+* Select the object to search
+* Set filter criteria to narrow results
+* Configure sorting and limits
-**Salida**: Devuelve registros coincidentes que se pueden usar en pasos posteriores.
+**Output**: Returns matching records that can be used in subsequent steps.
**Limit**: Search Records returns a maximum of **200 records**. If you need to process more, add specific filters to reduce results or use scheduled workflows to process in batches.
@@ -82,9 +82,9 @@ Creates a new record or updates an existing one based on matching criteria. This
-**Configuración**:
+**Configuration**:
-* Seleccione el objeto de destino
+* Select the target object
* Note which fields can be used for matching: email for People, domain for Companies, ID for any object, or any field marked as Unique. You'll need to populate at least one of these below.
* Fill out the field values. Do not forget to populate at least one of the unique identifiers.
@@ -94,7 +94,7 @@ Creates a new record or updates an existing one based on matching criteria. This
-* Utilice datos de pasos anteriores para completar los campos
+* Use data from previous steps to populate fields
**How it works**:
@@ -106,14 +106,14 @@ Creates a new record or updates an existing one based on matching criteria. This
## Flow Actions
-### Iterador
+### Iterator
**Loops through an array of records** returned from a previous step, allowing you to perform actions on each record individually.
-**Configuración**:
+**Configuration**:
* Select the array of records from a previous step (e.g., results from Search Records, from a Manual trigger with Bulk availability, from a code node)
-* Defina las acciones a realizar en cada registro en el bucle.
+* Define the actions to perform on each record in the loop.
- You can add several actions within an iterator.
@@ -124,15 +124,15 @@ Creates a new record or updates an existing one based on matching criteria. This
-### Filtro
+### Filter
Filters records based on specified conditions, allowing only records that meet the criteria to pass through.
-**Configuración**:
+**Configuration**:
* Select the record to filter
-* Defina condiciones y criterios de filtro
-* Configure qué registros deben pasar a pasos posteriores
+* Define filter conditions and criteria
+* Configure which records should pass through to subsequent steps
1. **Output**: Filter nodes don't return data—they act as gates. If the conditions are met, the workflow continues. If not, the workflow stops at that branch.
@@ -145,7 +145,7 @@ Pauses workflow execution for a specified duration or until a specific date/time
**Delay Types**:
-| Tipo | Descripción |
+| Type | Description |
| ------------------ | ------------------------------------------------------------------ |
| **Duration** | Wait for a specific amount of time (days, hours, minutes, seconds) |
| **Scheduled Date** | Wait until a specific date and time |
@@ -160,7 +160,7 @@ Pauses workflow execution for a specified duration or until a specific date/time
* Select a date and time
* Can reference a date field from a previous step (e.g., follow up 3 days after a meeting)
-**Casos de uso**:
+**Use cases**:
* Wait 24 hours before sending a follow-up email
* Pause until an opportunity's close date
@@ -178,14 +178,14 @@ Pauses workflow execution for a specified duration or until a specific date/time
## Communication Actions
-### Enviar correo electrónico
+### Send Email
-Envía un correo electrónico desde su flujo de trabajo. This is great for templated group emails. Emails will look like the ones you send from your mailbox.
+Sends an email from your workflow. This is great for templated group emails. Emails will look like the ones you send from your mailbox.
Not suited for newsletters (which require richer formatting) or automated email sequences.
**Prerequisites**: Add an email account in Settings → Accounts
-**Configuración**:
+**Configuration**:
* Select the sender email account
@@ -195,28 +195,28 @@ Not suited for newsletters (which require richer formatting) or automated email
For all the following steps, you can reference variables from previous steps for personalization.
-* Ingrese la dirección de correo electrónico del destinatario.
+* Enter recipient email address.
Only one recipient is possible at the moment.
-* Establezca la línea de asunto.
-* Redacte el cuerpo del mensaje. You can format links, create numbered list, bullet point lists, add attachments.
+* Set subject line.
+* Compose message body. You can format links, create numbered list, bullet point lists, add attachments.
Adding HTML signatures is not possible at the moment.
-### Formulario
+### Form
-Solicita un formulario durante la ejecución del flujo de trabajo para recopilar la entrada del usuario. The responses can then be used in subsequent steps to create records, send emails, or execute any other action based on the input.
+Prompts a form during workflow execution to collect user input. The responses can then be used in subsequent steps to create records, send emails, or execute any other action based on the input.
- **Forms are designed for manual triggers only**. Para flujos de trabajo con otros disparadores (Registro Creado, Actualizado, etc.), los formularios solo son accesibles a través de la interfaz de ejecución de flujos de trabajo, lo cual no es la experiencia de usuario esperada. Un centro de notificaciones se lanzará en 2026 para soportar adecuadamente los formularios en flujos de trabajo automatizados.
+ **Forms are designed for manual triggers only**. For workflows with other triggers (Record Created, Updated, etc.), forms are only accessible via the workflow run interface, which is not the expected user experience. A notifications center will be released in 2026 to properly support forms in automated workflows.
-**Configuración**:
+**Configuration**:
* Configure the fields that users will be asked to fill. For each field, choose
* a type among text, number, date, a given record, a select field. Select fields from all objects are available.
@@ -224,7 +224,7 @@ Solicita un formulario durante la ejecución del flujo de trabajo para recopilar
* a default value under `Placeholder` (optional)
* Edit the form title
-**Salida**: Las respuestas del formulario están disponibles para su uso en pasos posteriores.
+**Output**: Form responses are available for use in subsequent steps.
**Example**: The "Quick Lead" workflow is available by default in all workspaces, available anywhere in the Command Menu `Cmd + K`.
@@ -241,19 +241,19 @@ Solicita un formulario durante la ejecución del flujo de trabajo para recopilar
## Integration Actions
-### Código
+### Code
-Ejecuta JavaScript personalizado dentro de su flujo de trabajo.
+Runs custom JavaScript within your workflow.
-**Configuración**:
+**Configuration**:
-* Acceda a variables de pasos anteriores. You can edit the variables names dynamically.
+* Access variables from previous steps. You can edit the variables names dynamically.
-* Escriba el código JavaScript en el editor
-* Devuelva variables para su uso en pasos posteriores
-* Pruebe el código directamente en el paso
+* Write JavaScript code in the editor
+* Return variables for use in subsequent steps
+* Test code directly in the step
If you need to use external API keys in your code, you must input them directly in the function body. You cannot configure API keys elsewhere and reference them in the serverless function.
@@ -267,18 +267,18 @@ Ejecuta JavaScript personalizado dentro de su flujo de trabajo.
Click the square icon at the top right of the code editor to display it in full screen — helpful since the default editor width is limited.
-### Solicitud HTTP
+### HTTP Request
-Envía una solicitud a un API externo como parte de su flujo de trabajo.
+Sends a request to an external API as part of your workflow.
-**Configuración**:
+**Configuration**:
-* Ingrese la URL del extremo de la API. Using parameters from previous steps is possible.
-* Seleccione el método HTTP (GET, POST, PUT, PATCH, DELETE)
-* Agregue encabezados y valores necesarios
-* Proporcione una respuesta de muestra para vista previa de estructura
+* Enter the API endpoint URL. Using parameters from previous steps is possible.
+* Select HTTP method (GET, POST, PUT, PATCH, DELETE)
+* Add required headers and values
+* Provide sample response for structure preview
## AI Actions
@@ -286,7 +286,7 @@ Envía una solicitud a un API externo como parte de su flujo de trabajo.
Runs an AI agent within your workflow to perform intelligent tasks.
-**Configuración**:
+**Configuration**:
* **Agent**: Select an existing AI agent or use the default agent
* **Prompt**: Write the instruction for the AI agent
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-branches.mdx b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-branches.mdx
index 8680e51cbd..1966f64242 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-branches.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-branches.mdx
@@ -1,66 +1,66 @@
---
-title: Ramas del flujo de trabajo},{
-description: Crea rutas paralelas y lógica condicional en tus flujos de trabajo.
+title: Workflow Branches
+description: Create parallel paths and conditional logic in your workflows.
---
-Las ramas te permiten dividir tu flujo de trabajo en varias rutas que pueden ejecutarse simultáneamente o de forma condicional según tus datos.
+Branches allow you to split your workflow into multiple paths that can run simultaneously or conditionally based on your data.
-## Cómo funcionan las ramas
+## How Branches Work
-Cuando creas varias conexiones desde un único nodo, cada ruta se convierte en una rama. De forma predeterminada, **todas las ramas se ejecutan en paralelo**—no esperan unas a otras.
+When you create multiple connections from a single node, each path becomes a branch. By default, **all branches execute in parallel**—they don't wait for each other.
-## Crear ramas
+## Creating Branches
-### Añadir una nueva rama
+### Add a New Branch
-1. Haz **clic con el botón derecho en el lienzo principal** del flujo de trabajo (no en un nodo existente)
-2. Haz clic en **Añadir nodo**
-3. Elige el tipo de nodo para tu nueva rama
-4. Arrastra una flecha desde la parte inferior del paso anterior hasta la parte superior de esta nueva acción
-5. Repite para añadir más ramas desde el mismo nodo
+1. **Right-click on the main canvas** of the workflow (not on an existing node)
+2. Click **Add node**
+3. Choose the node type for your new branch
+4. Drag an arrow from the bottom of the previous step to the top of this new action
+5. Repeat to add more branches from the same node
- Cada rama es independiente. Añadir una rama no afecta a otras rutas existentes desde ese nodo.
+ Each branch is independent. Adding a branch doesn't affect other existing paths from that node.
-### Diseño visual
+### Visual Layout
-Las ramas aparecen como rutas paralelas en el editor de flujos de trabajo. Puedes arrastrar nodos para reorganizar el diseño visual sin afectar la ejecución.
+Branches appear as parallel paths in the workflow editor. You can drag nodes to rearrange the visual layout without affecting execution.
-## Ramas condicionales
+## Conditional Branches
-Dado que todas las ramas se ejecutan de forma predeterminada, usa nodos **Filter** para controlar qué rutas se ejecutan realmente:
+Since all branches run by default, use **Filter** nodes to control which paths actually execute:
-| Rama | Condición del filtro | Acción |
-| ---- | --------------------- | ----------------------------- |
-| A | Etapa = "Ganada" | Enviar correo de felicitación |
-| B | Etapa = "Perdida" | Crear tarea de seguimiento |
-| C | Etapa = "Negociación" | Notificar al gerente |
+| Branch | Filter Condition | Action |
+| ------ | --------------------- | -------------------------- |
+| A | Stage = "Won" | Send congratulations email |
+| B | Stage = "Lost" | Create follow-up task |
+| C | Stage = "Negotiation" | Notify manager |
-1. Crea ramas desde tu disparador o acción
-2. Añade un nodo **Filter** como el primer paso de cada rama
-3. Configura cada filtro con condiciones mutuamente excluyentes
-4. Añade tus acciones después de cada filtro
+1. Create branches from your trigger or action
+2. Add a **Filter** node as the first step of each branch
+3. Configure each filter with mutually exclusive conditions
+4. Add your actions after each filter
-Solo continuarán ejecutándose las ramas en las que se cumpla la condición del filtro.
+Only the branch(es) where the filter condition is met will continue executing.
-## Combinar ramas
+## Merging Branches
-**Las ramas no se combinan automáticamente.** Cada rama se ejecuta de forma independiente hasta que termina. Tienes total flexibilidad para gestionar esto:
+**Branches don't automatically merge.** Each branch runs independently until it ends. You have full flexibility in how you handle this:
-* **Opción 1: Mantener las ramas separadas**
- Cada rama gestiona sus propias acciones de seguimiento de forma independiente. Este es el enfoque más sencillo cuando las ramas no necesitan converger.
+* **Option 1: Keep branches separate**
+ Each branch handles its own follow-up actions independently. This is the simplest approach when branches don't need to converge.
-* **Opción 2: Combinar ramas manualmente**
- Al crear tu flujo de trabajo, puedes conectar manualmente varias ramas a la misma acción posterior. Simplemente arrastra flechas desde el final de cada rama hasta un nodo común.
+* **Option 2: Merge branches manually**
+ When creating your workflow, you can manually connect multiple branches to the same downstream action. Simply drag arrows from the end of each branch to a common node.
- Aunque puedes usar un nodo [Delay](/l/es/user-guide/workflows/capabilities/workflow-actions#delay) para pausar la ejecución, actualmente no se puede configurar para esperar "hasta que otra rama termine".
+ While you can use a [Delay](/l/es/user-guide/workflows/capabilities/workflow-actions#delay) node to pause execution, it's not currently configurable to wait "until another branch ends."
-## Relacionado
+## Related
-* [Cómo usar las ramas en flujos de trabajo](/l/es/user-guide/workflows/capabilities/use-branches-in-workflows) - Guía paso a paso
-* [Acciones de flujo de trabajo](/l/es/user-guide/workflows/capabilities/workflow-actions) - Acciones disponibles, incluyendo Filter
+* [How to Use Branches in Workflows](/l/es/user-guide/workflows/capabilities/use-branches-in-workflows) - Step-by-step guide
+* [Workflow Actions](/l/es/user-guide/workflows/capabilities/workflow-actions) - Available actions including Filter
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-credits.mdx b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-credits.mdx
index e8135b57fc..437aee5822 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-credits.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-credits.mdx
@@ -1,9 +1,9 @@
---
-title: Créditos de Workflow
+title: Workflow Credits
description: Understand workflow credit consumption and management.
---
-Los créditos de workflow potencian tus automatizaciones en Twenty. Comprender cómo funcionan te ayuda a optimizar costos y gestionar de manera efectiva tu presupuesto de automatización.
+Workflow credits power your automations in Twenty. Understanding how they work helps you optimize costs and manage your automation budget effectively.
## Credit Allocation
@@ -18,22 +18,22 @@ Workflow credits are allocated based on your billing cycle, not your plan tier:
5 million monthly credits are generous for standard automations. Most teams won't exceed this limit with typical workflow usage. Additional credits are primarily needed for advanced Code actions and AI-powered workflows.
-## Cómo Funciona el Consumo de Créditos
+## How Credit Consumption Works
-Los créditos se consumen cuando se ejecutan los workflows, no cuando los creas. Cada acción de workflow consume créditos en base a su complejidad:
+Credits are consumed when workflows execute, not when you create them. Each workflow action consumes credits based on its complexity:
-### Consumo de Créditos por Tipo de Acción
+### Credit Consumption by Action Type
-* **Operaciones internas básicas**: Consumo de créditos muy bajo
- * Buscar Registros
- * Crear Registro
- * Actualizar Registro
- * Eliminar Registro
- * Acciones de formulario
+* **Basic internal operations**: Very low credit consumption
+ * Search Records
+ * Create Record
+ * Update Record
+ * Delete Record
+ * Form actions
-* **Operaciones complejas**: Mayor consumo de créditos
- * Acciones de código (ejecución de JavaScript)
- * Solicitudes HTTP a servicios externos
+* **Complex operations**: Higher credit consumption
+ * Code actions (JavaScript execution)
+ * HTTP Requests to external services
* **AI features**: Higher credit consumption
* AI Agent actions consume credits based on the AI model used
@@ -44,33 +44,33 @@ Los créditos se consumen cuando se ejecutan los workflows, no cuando los creas.
* **No credits are consumed** during the wait period
* A 5-minute delay costs the same as a 5-day delay
-### Deducción en Tiempo Real
+### Real-Time Deduction
-Los créditos se deducen en tiempo real a medida que se ejecutan los workflows. Esto significa:
+Credits are deducted in real-time as workflows execute. This means:
-* Los workflows en borrador no consumen créditos
-* Solo los workflows activos y en ejecución utilizan la asignación de créditos
-* Los workflows fallidos aún consumen créditos para los pasos completados
+* Draft workflows don't consume credits
+* Only active, running workflows use your credit allocation
+* Failed workflows still consume credits for completed steps
-## Gestión de Créditos
+## Managing Credits
-### Verificar Uso de Créditos
+### Check Credit Usage
-1. Ir a **Ajustes → Facturación**
-2. Ve tu consumo actual de créditos y saldo restante
-3. Monitorea patrones de uso para optimizar tus workflows
+1. Go to **Settings → Billing**
+2. View your current credit consumption and remaining balance
+3. Monitor usage patterns to optimize your workflows
-### Adquirir Créditos Adicionales
+### Purchasing Additional Credits
-Si necesitas más créditos adicionales a la asignación de tu plan:
+If you need more credits beyond your plan allocation:
-1. Ir a **Ajustes → Facturación**
-2. Haz clic en la opción para adquirir créditos adicionales. Hay paquetes de diferentes tamaños disponibles.
-3. Los créditos se suman a tu saldo actual
+1. Go to **Settings → Billing**
+2. Click on the option to purchase additional credits. Packages of different sizes are available.
+3. Credits are added to your current balance
-## Mejores prácticas
+## Best Practices
-* **Procesamiento en Lote**: Usa operaciones masivas y acciones de Iterador eficientemente
+* **Batch Processing**: Use bulk operations and Iterator actions efficiently
* **Manual Trigger Optimization**: For manual triggers, choose `Bulk` availability to process multiple records in a single workflow run
-* Optimiza acciones de Código para eficiencia
-* Agrupa operaciones para reducir llamadas individuales de acciones
+* Optimize Code actions for efficiency
+* Batch operations to reduce individual action calls
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-runs.mdx b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-runs.mdx
index bd49c7d708..94f3dfbbac 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-runs.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-runs.mdx
@@ -1,5 +1,5 @@
---
-title: Ejecuciones de flujos de trabajo
+title: Workflow Runs
description: Monitor and manage workflow executions.
image: /images/user-guide/workflows/workflow.png
---
@@ -24,12 +24,12 @@ A **Run** is a record of a workflow execution. Every time a workflow is triggere
## Run Statuses
-| Estado | Descripción |
-| ---------------- | ------------------------------------------------------------------------ |
-| **En ejecución** | Workflow is currently executing |
-| **Completed** | Workflow finished successfully |
-| **Failed** | Workflow encountered an error and stopped |
-| **Waiting** | Workflow is paused (e.g., waiting for a Delay action or Form submission) |
+| Status | Description |
+| ------------- | ------------------------------------------------------------------------ |
+| **Running** | Workflow is currently executing |
+| **Completed** | Workflow finished successfully |
+| **Failed** | Workflow encountered an error and stopped |
+| **Waiting** | Workflow is paused (e.g., waiting for a Delay action or Form submission) |
## Run Details
@@ -60,7 +60,7 @@ When a run fails:
3. Check the error message for details
4. Common issues:
* Missing required fields
- * Formato de datos no válido
+ * Invalid data format
* External API errors
* Permission issues
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-triggers.mdx b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-triggers.mdx
index 1c700e2618..822f9b6368 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-triggers.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-triggers.mdx
@@ -1,18 +1,18 @@
---
-title: Disparadores de Flujos de Trabajo
+title: Workflow Triggers
description: Learn about the different triggers that start your workflows.
---
## About Triggers
-Los flujos de trabajo siempre comienzan con un solo disparador que define cuándo debe ejecutarse la automatización.
+Workflows always start with a single trigger that defines when the automation should run.
**Advanced objects are supported!** Beyond standard CRM objects (People, Companies, Opportunities), you can also trigger workflows and perform actions on:
- * Miembros del espacio de trabajo
+ * Workspace Members
* Calendar Events
* Messages (Emails)
* Tasks, Notes, and many other system objects
@@ -20,11 +20,11 @@ Los flujos de trabajo siempre comienzan con un solo disparador que define cuánd
This opens up powerful automations like notifying team members when calendar events are created, or processing incoming emails automatically.
-## Se crea un registro
+## Record is Created
-Inicia el flujo de trabajo cuando se crea un nuevo registro en un objeto seleccionado (Personas, Empresas, Oportunidades o cualquier objeto personalizado).
+Starts the workflow when a new record is created in a selected object (People, Companies, Opportunities, or any custom object).
-**Configuración**: Selecciona el tipo de objeto para monitorear nuevos registros.
+**Configuration**: Select the object type to monitor for new records.
* This trigger is great for records created by csv, mailbox and calendar synchronization, API.
@@ -32,54 +32,54 @@ Inicia el flujo de trabajo cuando se crea un nuevo registro en un objeto selecci
To trigger this workflow on records created manually, it is recommended to use the trigger `Record is created or updated` instead.
-## Se actualiza un registro
+## Record is Updated
-Inicia el flujo de trabajo cuando se realizan cambios en un registro existente.
+Starts the workflow when changes are made to an existing record.
-**Configuración**:
+**Configuration**:
-* Selecciona el tipo de objeto
-* Opcionalmente especifica qué campos monitorear para cambios
+* Select the object type
+* Optionally specify which fields to monitor for changes
-## Se actualiza o se crea un registro
+## Record is Updated or Created
-Inicia el flujo de trabajo cuando un registro es creado o actualizado en un objeto seleccionado.
+Starts the workflow when a record is either created or updated in a selected object.
-**¿Por qué esto es importante?**:
+**Why This Matters**: This trigger is particularly helpful because records created via different methods behave differently:
-* **Importaciones API/CSV**: Los registros se crean con todos los campos poblados inmediatamente
-* **Creación manual**: Los registros se crean primero, luego los campos se agregan en actualizaciones posteriores
+* **API/CSV imports**: Records are created with all fields populated immediately
+* **Manual creation**: Records are created first, then fields are added in subsequent updates
-**Configuración**:
+**Configuration**:
-* Selecciona el tipo de objeto para monitorear
-* Opcionalmente especifica qué campos monitorear para cambios
-* El flujo de trabajo se activará tanto en la creación inicial como en cualquier actualización posterior
+* Select the object type to monitor
+* Optionally specify which fields to monitor for changes
+* The workflow will trigger both on initial creation and any subsequent updates
-## Se elimina un registro
+## Record is Deleted
-Inicia el flujo de trabajo cuando un registro es eliminado de un objeto.
+Starts the workflow when a record is removed from an object.
-**Configuración**: Selecciona el tipo de objeto para monitorear eliminaciones.
+**Configuration**: Select the object type to monitor for deletions.
## Manual Trigger
-Inicia el flujo de trabajo cuando es desencadenado por una acción del usuario. This trigger can be accessed through the `Cmd+K` menu or via a custom button that will be displayed in the top navbar after selecting record(s).
+Starts the workflow when triggered by a user action. This trigger can be accessed through the `Cmd+K` menu or via a custom button that will be displayed in the top navbar after selecting record(s).
-**Configuración de Disponibilidad**:
-Elige cómo debe manejar el flujo de trabajo la selección de registros:
+**Availability Configuration**:
+Choose how the workflow should handle record selection:
* **Global**: No record is required to trigger this workflow. The workflow is triggered from the command menu `Cmd + K` anywhere (from any object) and does not use record(s) as input.
-* **Individual**: El/los registro(s) seleccionado(s) se pasará(n) a tu flujo de trabajo. Esto está configurado para un objeto dado. Se pueden seleccionar varios registros antes de iniciar el flujo de trabajo. The workflow will run from beginning to end as many times as there are records selected.
+* **Single**: The selected record(s) will be passed to your workflow. This is configured for a given object. Several records can be selected before triggering the workflow. The workflow will run from beginning to end as many times as there are records selected.
**Soft limit: 100 runs/minute**. Beyond this, workflows remain in "Not Started" status and are processed gradually—either by a background job or when another workflow enters the queue. This means you can select more than 100 records with a Single trigger; execution will just be slower.
-* **En masa**: El/los registro(s) seleccionado(s) se pasará(n) a tu flujo de trabajo. Esto está configurado para un objeto dado. Se pueden seleccionar varios registros antes de iniciar el flujo de trabajo. El flujo de trabajo se ejecutará una vez, proporcionando como entrada toda la lista de registros. This means the workflow needs to contain an [Iterator action](/l/es/user-guide/workflows/capabilities/workflow-actions#iterator).
+* **Bulk**: The selected record(s) will be passed to your workflow. This is configured for a given object. Several records can be selected before triggering the workflow. The workflow will run once, providing the entire list of records as input. This means the workflow needs to contain an [Iterator action](/l/es/user-guide/workflows/capabilities/workflow-actions#iterator).
This is more advanced, and best for people who want to optimize the number of workflow runs.
@@ -87,25 +87,25 @@ Elige cómo debe manejar el flujo de trabajo la selección de registros:
-**Configuración Adicional**:
+**Additional Configuration**:
-* Selecciona el objeto de destino (para disponibilidad individual y en masa)
-* Elige un ícono de comando para el disparador del flujo de trabajo
-* Configura la ubicación en la barra de navegación (fijado o no fijado)
+* Select the target object (for Single and Bulk availability)
+* Choose a command icon for the workflow trigger
+* Configure navbar placement (Pinned or Not Pinned)
-**Métodos de Acceso**:
+**Access Methods**:
* `Cmd+K` menu to find and launch manual workflows
-* Botón personalizado en la barra de navegación superior (si está configurado)
+* Custom button in the top navbar (if configured)
## Time-Based Trigger: On a Schedule
-Inicia el flujo de trabajo de forma recurrente según lo defina.
+Starts the workflow on a recurring basis you define.
-**Configuración**:
+**Configuration**:
-* Selecciona la unidad de tiempo (minutos, horas, días)
-* Ingresa un valor o usa expresiones cron personalizadas para una programación avanzada
+* Select time unit (minutes, hours, days)
+* Enter a value or use custom cron expressions for advanced scheduling
**Timezone**: Scheduled workflows run in **UTC**. When setting hours for daily schedules, convert your local time to UTC.
@@ -113,11 +113,11 @@ Inicia el flujo de trabajo de forma recurrente según lo defina.
## External Trigger: Webhook
-Inicia el flujo de trabajo cuando se recibe una solicitud GET o POST de un servicio externo.
+Starts the workflow when a GET or POST request is received from an external service.
-**Configuración**:
+**Configuration**:
* The workflow provides a unique webhook URL—copy this and add it to your external system as the endpoint to call.
* For POST requests, define the expected body structure so Twenty knows what data to expect. Add here the fields you will receive that will be needed below in your workflow.
@@ -125,12 +125,12 @@ Inicia el flujo de trabajo cuando se recibe una solicitud GET o POST de un servi
## Choosing the Right Trigger
-| Use Case | Recommended Trigger |
-| --------------------------- | ---------------------------------- |
-| New leads need processing | Se crea un registro |
-| Data changes need sync | Se actualiza un registro |
-| Import/manual data handling | Se actualiza o se crea un registro |
-| Cleanup after deletion | Se elimina un registro |
-| User-initiated action | Iniciar manualmente |
-| Recurring reports | Según una programación |
-| External integration | Webhook or On a Schedule |
+| Use Case | Recommended Trigger |
+| --------------------------- | ---------------------------- |
+| New leads need processing | Record is Created |
+| Data changes need sync | Record is Updated |
+| Import/manual data handling | Record is Updated or Created |
+| Cleanup after deletion | Record is Deleted |
+| User-initiated action | Launch Manually |
+| Recurring reports | On a Schedule |
+| External integration | Webhook or On a Schedule |
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-versions.mdx b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-versions.mdx
index bd93029571..18af71f346 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-versions.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/capabilities/workflow-versions.mdx
@@ -1,85 +1,85 @@
---
-title: Versiones del flujo de trabajo
-description: Gestiona versiones y borradores de flujos de trabajo.
+title: Workflow Versions
+description: Manage workflow versions and drafts.
image: /images/user-guide/workflows/workflow.png
---
-## Acerca de las versiones
+## About Versions
-Cada vez que activas un flujo de trabajo, se crea una nueva versión. Esto te permite hacer un seguimiento de los cambios a lo largo del tiempo y revertir a configuraciones anteriores si es necesario.
+Every time you activate a workflow, a new version is created. This allows you to track changes over time and revert to previous configurations if needed.
-## Estados de la versión
+## Version Statuses
-| Estado | Descripción |
-| --------------- | ---------------------------------------------- |
-| **Borrador** | En edición, aún no publicado |
-| **Activo** | Versión en vivo respondiendo a activadores |
-| **Desactivado** | Anteriormente activo pero detenido manualmente |
-| **Archivado** | Versiones pasadas guardadas para historial |
+| Status | Description |
+| --------------- | -------------------------------------- |
+| **Draft** | Being edited, not yet published |
+| **Active** | Live version responding to triggers |
+| **Deactivated** | Previously active but manually stopped |
+| **Archived** | Past versions kept for history |
-## Trabajar con borradores
+## Working with Drafts
-Cuando editas un flujo de trabajo activo, tus cambios se guardan como un **borrador**. La versión activa sigue ejecutándose mientras trabajas en las actualizaciones.
+When you edit an active workflow, your changes are saved as a **draft**. The active version continues to run while you work on updates.
-Cuando termines de editar, puedes:
+Once you're done editing, you can:
-* **Activar**: Publica el borrador como la nueva versión activa (la versión anterior se archiva)
-* **Descartar**: Elimina el borrador y conserva la versión activa actual
+* **Activate**: Publish the draft as the new active version (the previous version is archived)
+* **Discard**: Delete the draft and keep the current active version
-## Historial de versiones
+## Version History
-### Ver versiones anteriores
+### Viewing Past Versions
-1. Abre el flujo de trabajo
-2. Haz clic en la pestaña **Versiones**
-3. Consulta todas las versiones anteriores con marcas de tiempo
+1. Open the workflow
+2. Click the **Versions** tab
+3. See all previous versions with timestamps
-### Restaurar una versión
+### Restoring a Version
-1. Encuentra la versión que quieres restaurar
-2. Haz clic en **Usar como borrador**
-3. La versión se copia a un nuevo borrador
-4. Realiza las actualizaciones necesarias
-5. Activa cuando esté lista
+1. Find the version you want to restore
+2. Click **Use as draft**
+3. The version is copied to a new draft
+4. Make any necessary updates
+5. Activate when ready
-## Mejores prácticas
+## Best Practices
-### Gestión de versiones
+### Version Management
-* Activa solo cuando esté lista para producción
-* Mantén cambios significativos entre versiones
-* Documenta los cambios importantes en los nombres o descripciones de los flujos de trabajo
-* Prueba en modo borrador antes de activar
+* Activate only when ready for production
+* Keep meaningful changes between versions
+* Document major changes in workflow names or descriptions
+* Test in draft mode before activating
-### Revertir cambios
+### Reverting Changes
-* Si una nueva versión causa problemas, restaura la versión anterior
-* Usa el historial de versiones para ver qué cambió
-* Siempre prueba las versiones restauradas antes de activar
+* If a new version causes issues, restore the previous version
+* Use the version history to track what changed
+* Always test restored versions before activating
-## Flujos de Trabajo comunes
+## Common Workflows
-### Edición rápida
+### Quick Edit
-1. Realiza cambios menores en un flujo de trabajo activo
-2. Prueba en modo borrador
-3. Activa la nueva versión
+1. Make minor changes to an active workflow
+2. Test in draft mode
+3. Activate the new version
-### Revisión importante
+### Major Revision
-1. Usa la versión anterior como punto de partida
-2. Realiza cambios significativos en el borrador
-3. Prueba a fondo todos los escenarios
-4. Activa cuando estés seguro
+1. Use the previous version as a starting point
+2. Make significant changes in draft
+3. Thoroughly test all scenarios
+4. Activate when confident
-### Reversión
+### Rollback
-1. Identifica el problema con la versión actual
-2. Encuentra la última versión funcional en el historial
-3. Haz clic en **Usar como borrador**
-4. Activa para restaurar el comportamiento anterior
+1. Identify the issue with the current version
+2. Find the last working version in history
+3. Click **Use as draft**
+4. Activate to restore the old behavior
-## Relacionado
+## Related
-* [Primeros pasos con Flujos de Trabajo](/l/es/user-guide/workflows/overview)
-* [Ejecuciones de flujos de trabajo](/l/es/user-guide/workflows/capabilities/workflow-runs)
+* [Getting Started with Workflows](/l/es/user-guide/workflows/overview)
+* [Workflow Runs](/l/es/user-guide/workflows/capabilities/workflow-runs)
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx
index e3b868e629..4132ef89bd 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx
@@ -133,7 +133,7 @@ export const main = async (params: { deals: any }) => {
### Common Transformations
-| Source Format | Target Format | Código |
+| Source Format | Target Format | Code |
| -------------------- | ---------------- | ---------------------------------------- |
| `"true"` / `"false"` | `true` / `false` | `v === true \|\| v === "true"` |
| `"123.45"` | `123.45` | `parseFloat(value)` |
@@ -154,7 +154,7 @@ This loops through each product in the array.
Inside the iterator, add an **Upsert Record** action:
-| Setting | Valor |
+| Setting | Value |
| ------------ | -------------------------------------- |
| **Object** | Your custom Product object |
| **Match by** | External ID or SKU (unique identifier) |
@@ -168,7 +168,7 @@ Inside the iterator, add an **Upsert Record** action:
## Example Use Cases
-| Fuente | Datos |
+| Source | Data |
| ----------------------- | ----------------------------------- |
| **ERP system** | Product catalog, pricing, inventory |
| **E-commerce platform** | Orders, customers, product updates |
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx
index d6af0911e1..e4d40d8c30 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx
@@ -17,7 +17,7 @@ For standard webhook setup, see [Set Up a Webhook Trigger](/l/es/user-guide/work
1. In Typeform, open your form
2. Go to **Connect → Webhooks**
3. Paste your Twenty webhook URL
-4. Guardar
+4. Save
### Step 3: Understand the Typeform Payload
@@ -110,9 +110,9 @@ Now in subsequent steps, you can select `contact.firstName`, `contact.email`, et
Add a **Create Record** action:
-| Campo | Valor |
+| Field | Value |
| -------------- | ---------------------------------------------------- |
-| **Object** | Personas |
+| **Object** | People |
| **First Name** | `{{code.contact.firstName}}` |
| **Last Name** | `{{code.contact.lastName}}` |
| **Email** | `{{code.contact.email}}` |
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx
index 71be70962e..bd22a7cd85 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx
@@ -23,9 +23,9 @@ Automatically send deal data to your invoicing system (Stripe, QuickBooks, Xero,
Add a **Filter** action to only continue when the deal is won:
-| Setting | Valor |
+| Setting | Value |
| ------------- | --------------------------------- |
-| **Field** | Etapa |
+| **Field** | Stage |
| **Condition** | Equals |
| **Value** | `CLOSED_WON` (or your stage name) |
@@ -37,9 +37,9 @@ Add a **Filter** action to only continue when the deal is won:
The Opportunity record may not include all Company fields you need for the invoice. Add a **Search Record** action:
-| Setting | Valor |
+| Setting | Value |
| ------------ | ---------------------------------------- |
-| **Object** | Empresa |
+| **Object** | Company |
| **Match by** | ID equals `{{trigger.object.companyId}}` |
This retrieves the full Company record with billing address, tax ID, etc.
@@ -88,7 +88,7 @@ export const main = async (params: {
Add an **HTTP Request** action:
-| Setting | Valor |
+| Setting | Value |
| ----------- | ----------------------------------------- |
| **Method** | POST |
| **URL** | Your invoicing API endpoint |
@@ -122,13 +122,13 @@ Body: {{code.invoice}}
## Complete Workflow Summary
-| Step | Acción | Purpose |
+| Step | Action | Purpose |
| ---- | ----------------------- | ------------------------------------ |
| 1 | Trigger: Record Updated | Fires when any Opportunity changes |
-| 2 | Filtro | Only proceed if Stage = Closed Won |
+| 2 | Filter | Only proceed if Stage = Closed Won |
| 3 | Search Record | Get full Company details for billing |
-| 4 | Código | Format data for invoicing API |
-| 5 | Solicitud HTTP | Create invoice in external system |
+| 4 | Code | Format data for invoicing API |
+| 5 | HTTP Request | Create invoice in external system |
## Tips
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx
index 2d708d6fcb..59392d4915 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx
@@ -8,7 +8,7 @@ Webhook triggers allow external services to start your workflows by sending data
## When to Use Webhooks
-| Use Case | Ejemplo |
+| Use Case | Example |
| ----------------------- | --------------------------------------- |
| **Web forms** | Contact form submissions create leads |
| **Third-party apps** | Stripe payment → create customer record |
@@ -62,12 +62,12 @@ Now add actions that use the webhook data:
2. Select **People** object
3. Map fields:
-| Campo | Valor |
-| ------------------ | ---------------------------------------------------- |
-| Nombre | `{{trigger.body.firstName}}` |
-| Apellidos | `{{trigger.body.lastName}}` |
-| Correo electrónico | `{{trigger.body.email}}` |
-| Empresa | Search or create based on `{{trigger.body.company}}` |
+| Field | Value |
+| ---------- | ---------------------------------------------------- |
+| First Name | `{{trigger.body.firstName}}` |
+| Last Name | `{{trigger.body.lastName}}` |
+| Email | `{{trigger.body.email}}` |
+| Company | Search or create based on `{{trigger.body.company}}` |
### Step 5: Test the Webhook
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx
index 95409cc0d4..5fdd8772a7 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx
@@ -42,24 +42,24 @@ Create a workflow that handles all post-win activities automatically.
### Step 4: Update Company Type
1. Add **Update Record** action
-2. Configurar:
+2. Configure:
-| Campo | Valor |
-| ---------------------------- | ------------------------------- |
-| **Object** | Empresas |
-| **Record** | `{{trigger.object.company.id}}` |
-| **Tipo** | Cliente |
-| **First Deal Date** | `{{trigger.object.closedAt}}` |
-| **Propietario de la cuenta** | `{{trigger.object.owner.id}}` |
+| Field | Value |
+| ------------------- | ------------------------------- |
+| **Object** | Companies |
+| **Record** | `{{trigger.object.company.id}}` |
+| **Type** | Customer |
+| **First Deal Date** | `{{trigger.object.closedAt}}` |
+| **Account Owner** | `{{trigger.object.owner.id}}` |
### Step 5: Create Onboarding Task
1. Add **Create Record** action
-2. Configurar:
+2. Configure:
-| Campo | Valor |
+| Field | Value |
| ----------------------- | ---------------------------------------------------------------------------------------------------- |
-| **Object** | Tareas |
+| **Object** | Tasks |
| **Title** | `Onboarding: {{trigger.object.name}}` |
| **Assignee** | Customer Success team member |
| **Due Date** | 3 days from now |
@@ -71,9 +71,9 @@ Create a workflow that handles all post-win activities automatically.
### Step 6: Notify Customer Success
1. Add **Send Email** action
-2. Configurar:
+2. Configure:
-| Campo | Valor |
+| Field | Value |
| ----------- | -------------------------------------------------- |
| **To** | customer-success@yourcompany.com |
| **Subject** | `🎉 New Customer: {{trigger.object.company.name}}` |
@@ -100,9 +100,9 @@ Let's give them a great start!
### Step 7: Confirm to Sales Rep
1. Add another **Send Email** action
-2. Configurar:
+2. Configure:
-| Campo | Valor |
+| Field | Value |
| ----------- | -------------------------------------------------------------------------------------------------------------------- |
| **To** | `{{trigger.object.owner.email}}` |
| **Subject** | `✅ Deal Closed: {{trigger.object.name}}` |
@@ -111,7 +111,7 @@ Let's give them a great start!
### Step 8: Test and Activate
1. Test by moving a test opportunity to "Closed Won"
-2. Verificar:
+2. Verify:
* Company type changed to "Customer"
* Onboarding task created
* CS team received email
@@ -126,7 +126,7 @@ Create a similar workflow for lost deals:
* Record is Updated (Opportunities, Stage = "Closed Lost")
-### Acciones
+### Actions
1. **Create Record**: Task for "Lost Deal Analysis"
2. **Update Record**: Add lost reason to company record
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx
index ed2f66e8fc..0eeeb7271b 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx
@@ -33,11 +33,11 @@ Create a scheduled workflow that finds stale opportunities and emails their mana
### Step 3: Search for Stale Opportunities
1. Add **Search Records** action
-2. Configurar:
+2. Configure:
-| Campo | Valor |
+| Field | Value |
| ---------- | ----------------------------------------------- |
-| **Object** | Oportunidades |
+| **Object** | Opportunities |
| **Filter** | Updated At is before (today - 7 days) |
| **Filter** | Stage is not "Closed Won" AND not "Closed Lost" |
| **Limit** | 100 |
@@ -92,7 +92,7 @@ export const main = async (params) => {
Add **Send Email** action:
-| Campo | Valor |
+| Field | Value |
| ----------- | ----------------------------------------------------------- |
| **To** | sales-manager@yourcompany.com |
| **Subject** | `🚨 {{code.totalCount}} Stale Opportunities Need Attention` |
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
index 88606cf717..3e3057e280 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
@@ -7,11 +7,11 @@ import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-## Resumen
+## Overview
This workflow triggers every time a new email is received and updates a custom field on the Person record with the total count of emails from that sender.
-## Prerrequisitos
+## Prerequisites
Before setting up this workflow, create a custom field on the **People** object:
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx
index 36a1e32fb2..e24d1bcf0d 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx
@@ -5,13 +5,13 @@ description: Show data from related records (e.g., Company info on Opportunities
Display data from related records directly on your records — for example, show the employee count from a Company on its Opportunities. This workflow workaround is useful until nested fields are natively available.
-## Casos de Uso Comunes
+## Common Use Cases
-| Fuente | Destination | Fields to Copy |
+| Source | Destination | Fields to Copy |
| ----------- | ----------- | ------------------------------- |
-| Empresa | Oportunidad | Industry, Company Size, ARR |
-| Persona | Oportunidad | Email, Phone, Title |
-| Oportunidad | Empresa | Last Deal Amount, Last Won Date |
+| Company | Opportunity | Industry, Company Size, ARR |
+| Person | Opportunity | Email, Phone, Title |
+| Opportunity | Company | Last Deal Amount, Last Won Date |
## Basic Field Copy
@@ -26,7 +26,7 @@ Create the destination fields in **Settings → Data Model → Opportunities** b
* Contact Email (type: Email)
* Contact Phone (type: Phone)
-### Configuración
+### Setup
1. **Trigger**: Record is Updated (Opportunities, Point of Contact field)
@@ -48,7 +48,7 @@ Create the destination fields in **Settings → Data Model → Opportunities** b
**Goal**: When company details change, update all related opportunities.
-### Configuración
+### Setup
1. **Trigger**: Record is Updated (Companies)
* Fields: Industry, Company Size, Annual Revenue
@@ -79,7 +79,7 @@ Create the destination fields in **Settings → Data Model → Opportunities**:
* Company Industry (type: Text)
* Company Size (type: Number)
-### Configuración
+### Setup
1. **Trigger**: Record is Created (Opportunities)
* Filter: Company is not empty
@@ -144,7 +144,7 @@ export const main = async (params) => {
};
```
-## Mejores prácticas
+## Best Practices
### Avoid Loops
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx
index e467dd76aa..16a4495a5e 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx
@@ -5,7 +5,7 @@ description: Create formula fields using workflows until native support is avail
Twenty doesn't yet support native formula fields yet (coming in 2026), but you can achieve the same result using workflows. This workaround lets you automatically calculate and populate field values—from simple concatenations to complex business logic.
-## Casos de Uso Comunes
+## Common Use Cases
| Use Case | Formula Example |
| ------------------- | --------------------------------- |
@@ -25,7 +25,7 @@ Twenty doesn't yet support native formula fields yet (coming in 2026), but you c
**Goal**: Automatically combine first and last name into a full name field.
-### Configuración
+### Setup
1. **Trigger**: Record is Updated or Created (People)
@@ -79,7 +79,7 @@ export const main = async (params) => {
**Goal**: Calculate how many days remain until a task's due date.
-### Configuración
+### Setup
1. **Trigger**: Record is Updated or Created (Tasks, Due Date field)
@@ -114,7 +114,7 @@ export const main = async (params) => {
**Goal**: Score leads based on company size, industry, and engagement.
-### Configuración
+### Setup
1. **Trigger**: Record is Updated (People or Companies)
@@ -155,7 +155,7 @@ export const main = async (params) => {
**Goal**: Automatically extract and store the email domain.
-### Configuración
+### Setup
1. **Trigger**: Record is Updated (People, Email field)
@@ -175,7 +175,7 @@ export const main = async (params) => {
3. **Update Record**: Set Domain field to `{{code.domain}}`
-## Mejores prácticas
+## Best Practices
### Performance
@@ -189,7 +189,7 @@ export const main = async (params) => {
* Use default values when data is missing
* Return clear error messages when calculations fail
-### Pruebas
+### Testing
* Test with edge cases (empty fields, zero values)
* Verify calculations manually before activating
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
index be62b995cf..bc0d8c92b5 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
@@ -9,7 +9,7 @@ import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
Send daily email reminders to each team member about their tasks due today.
-## Resumen
+## Overview
This workflow runs on a schedule and:
@@ -85,9 +85,9 @@ export const main = async (params: {
### Step 6: Send Email (Inside Iterator)
1. Add a **Send Email** action (still inside the iterator)
-2. Configurar:
+2. Configure:
-| Campo | Valor |
+| Field | Value |
| ----------- | --------------------------------------------------------------- |
| **To** | `{{iterator.currentItem.userEmail}}` (workspace member's email) |
| **Subject** | Your Tasks Due Today |
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/need-more-help/professional-services.mdx b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
index a386e14ea7..674ca6229f 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
@@ -1,29 +1,29 @@
---
title: Professional Services
-description: Obtenga ayuda profesional para construir flujos de trabajo complejos y automatizaciones del equipo de Twenty y socios certificados.
+description: Get professional help building complex workflows and automations from Twenty's team and certified partners.
---
-## ¿Cuándo Necesita Ayuda Profesional?
+## When Do You Need Professional Help?
-Considere servicios profesionales para:
+Consider professional services for:
-* Integraciones complejas de múltiples sistemas
-* Lógica empresarial avanzada y reglas de automatización
-* Flujos de trabajo de procesamiento de datos a gran escala
+* Complex multi-system integrations
+* Advanced business logic and automation rules
+* Large-scale data processing workflows
* Custom API development
-* Capacitación del equipo y optimización del flujo de trabajo
-* Cuando no tiene recursos internos
+* Team training and workflow optimization
+* When you don't have internal resources
-## Opciones de Servicio
+## Service Options
-### Paquetes de Incorporación
+### Onboarding Packs
-Obtenga ayuda de nuestro equipo central con nuestros [Paquetes de incorporación](https://twenty.com/onboarding-packages) de 4 horas:
+Get help from our core team with our 4-hour [Onboarding packs](https://twenty.com/onboarding-packages):
-* **Creación de Flujos de Trabajo**: Construya flujos de trabajo personalizados para sus procesos de negocio
-* **Diseño del Modelo de Datos**: Optimice su estructura de datos para la automatización de flujos de trabajo
-* **Migración de Datos**: Importe datos existentes con la integración adecuada de flujos de trabajo
+* **Workflow Creation**: Build custom workflows for your business processes
+* **Data Model Design**: Optimize your data structure for workflow automation
+* **Data Migration**: Import existing data with proper workflow integration
-### Socios de Implementación
+### Implementation Partners
-Trabaje con socios certificados para personalizaciones avanzadas. Contáctenos en contact@twenty.com para conectarse con nuestros [socios de implementación](https://twenty.com/partners).
+Work with certified partners for advanced customizations. Contact us at contact@twenty.com to connect with our [implementation partners](https://twenty.com/partners).
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx
index 9c6eda7ec8..b243fc4acb 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx
@@ -1,11 +1,11 @@
---
-title: Resolución de problemas de flujo de trabajo
+title: Workflow Troubleshooting
description: Common workflow issues and how to resolve them.
---
-## Problemas Comunes y Soluciones
+## Common Issues and Solutions
-### Flujo de trabajo no se activa
+### Workflow Not Triggering
**Symptoms**: Your workflow doesn't run when you expect it to.
@@ -16,7 +16,7 @@ description: Common workflow issues and how to resolve them.
3. **Field not monitored**: For "Record is Updated" triggers, ensure the specific field is being watched
4. **Permissions**: Check you have permission to run workflows
-**Soluciones**:
+**Solutions**:
* Verify workflow status in the workflow list
* Test with the specific action you expect to trigger it
@@ -55,7 +55,7 @@ description: Common workflow issues and how to resolve them.
3. **API errors**: External services returning errors
4. **Permission issues**: Action requires permissions you don't have
-**Soluciones**:
+**Solutions**:
* Check the workflow run details for error messages
* Verify all required fields have values
@@ -75,7 +75,7 @@ description: Common workflow issues and how to resolve them.
* **429**: Too many requests - implement rate limiting
* **500**: Server error - external service issue
-**Soluciones**:
+**Solutions**:
* Verify API endpoint URL
* Check authentication headers
@@ -93,7 +93,7 @@ description: Common workflow issues and how to resolve them.
3. **Type errors**: Operations on wrong data types
4. **Timeouts**: Code taking too long to execute
-**Soluciones**:
+**Solutions**:
* Use the built-in code editor validation
* Test code logic in a JavaScript console first
@@ -111,7 +111,7 @@ description: Common workflow issues and how to resolve them.
3. **Sending limits**: Email provider rate limits reached
4. **Spam filters**: Emails being blocked
-**Soluciones**:
+**Solutions**:
* Verify email account connection
* Validate recipient email addresses
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx
index f9a3a0bc52..d523f56b2a 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx
@@ -25,8 +25,8 @@ description: Frequently asked questions about workflows in Twenty.
- | Tipo | Records Required | Ejecuciones de flujos de trabajo |
- | ---- | ---------------- | -------------------------------- |
+ | Type | Records Required | Workflow Runs |
+ | ---- | ---------------- | ------------- |
\| **Global** | None | Once, no record input |
\| **Single** | One or more selected | Once per selected record |
@@ -39,7 +39,7 @@ description: Frequently asked questions about workflows in Twenty.
See [Workflow Triggers](/l/es/user-guide/workflows/capabilities/workflow-triggers) for details.
-
+
An explicit If/Else node is not yet available but is on our roadmap.
**Current workaround**: Create multiple branches from your step, each starting with a **Filter** action:
@@ -106,7 +106,7 @@ description: Frequently asked questions about workflows in Twenty.
* Use the variable picker when configuring a field
* Or type `{{stepName.fieldName}}` directly
- **Ejemplos**:
+ **Examples**:
* Trigger data: `{{trigger.object.email}}`
* Search results: `{{searchRecords[0].name}}`
@@ -176,7 +176,7 @@ description: Frequently asked questions about workflows in Twenty.
* Multiple workflows running simultaneously across your workspace
* High-frequency automated triggers (e.g., Record Updated on a busy object)
- **Soluciones**:
+ **Solutions**:
* Use **Bulk** triggers instead of Single to process many records in one run
* Space out large batch operations
@@ -187,8 +187,8 @@ description: Frequently asked questions about workflows in Twenty.
Twenty has two rate limits to ensure system stability:
- | Límite | Valor | Behavior |
- | ------ | ----- | -------- |
+ | Limit | Value | Behavior |
+ | ----- | ----- | -------- |
\| **Soft limit** | 100 runs/minute | Runs queue in "Not Started" status, processed gradually |
\| **Hard limit** | 5,000 runs/hour | Runs immediately fail |
diff --git a/packages/twenty-docs/l/es/user-guide/workflows/overview.mdx b/packages/twenty-docs/l/es/user-guide/workflows/overview.mdx
index 076ea3398e..f8ba3cc6c9 100644
--- a/packages/twenty-docs/l/es/user-guide/workflows/overview.mdx
+++ b/packages/twenty-docs/l/es/user-guide/workflows/overview.mdx
@@ -1,25 +1,25 @@
---
-title: Flujos de trabajo
+title: Workflows
description: Learn how to build automations in Twenty.
image: /images/user-guide/workflows/workflow.png
---
-
+
## Why Workflows Matter
-Twenty was built to bring maximum flexibility to its users. En lugar de obligarte a adaptar tus procesos empresariales a características rígidas y preconstruidas, los workflows te permiten crear automatizaciones que configuran el CRM que mejor respalda los casos de uso únicos de tu negocio.
+Twenty was built to bring maximum flexibility to its users. Rather than forcing you to adapt your business processes to rigid, pre-built features, workflows enable you to build automations that create the CRM that best supports your unique business use cases.
-Workflows es la función integrada de Twenty para desarrollar estas automatizaciones. Te ofrecen los bloques para crear exactamente lo que tu negocio necesita, cuando lo necesita.
+Workflows are Twenty's in-app feature for building these automations. They give you the building blocks to create exactly what your business needs, when it needs it.
-## ¿Qué puedo hacer con los workflows?
+## What can I do with workflows?
-Recomendamos construir automatizaciones con dos propósitos principales:
+We recommend building automations for two main purposes:
-1. **Automatizaciones internas para facilitar el día a día de tu equipo**: Reduce la cantidad de entradas manuales y tareas repetitivas que ralentizan a tu equipo.
-2. **Incorporar datos dentro y fuera de Twenty**: Conecta Twenty mediante llamadas API y webhooks a tu base de datos y otras herramientas.
+1. **Internal automations to facilitate your team's day-to-day**: Reduce the amount of manual entries and repetitive tasks that slow down your team.
+2. **Bring data in and out of Twenty**: Connect Twenty via API calls and webhooks to your database and other tools.
## Building Your First Workflow
@@ -66,14 +66,14 @@ After your trigger, add one or more actions:
2. Review the results to ensure it works as expected
3. Toggle the workflow **Active** when ready
-## Mejores prácticas de flujo de trabajo
+## Workflow Best Practices
-* **Editar nombres de pasos**: Renombre los pasos de su flujo de trabajo para describir claramente lo que hace cada uno. Esto ayuda con el mantenimiento y facilita la transferencia a compañeros de trabajo
-* **Aprovechar los datos de pasos anteriores**: Puede usar campos de registros devueltos por cualquier paso anterior en su flujo de trabajo
-* **Comenzar simple**: Inicie con flujos de trabajo básicos y agregue complejidad con el tiempo a medida que se sienta más cómodo con el sistema
-* **Planificar antes de construir**: Trace la lógica de su flujo de trabajo antes de comenzar a construir para evitar quedarse atascado a mitad de camino
+* **Edit step names**: Rename your workflow steps to clearly describe what each one does. This helps with maintenance and makes it easier to hand off to coworkers
+* **Leverage previous step data**: You can use fields from records returned by any previous step in your workflow
+* **Start simple**: Begin with basic workflows and add complexity over time as you become more comfortable with the system
+* **Plan before building**: Map out your workflow logic before you start building to avoid getting stuck halfway through
-## Próximos Pasos
+## Next Steps
* [Workflow Triggers](/l/es/user-guide/workflows/capabilities/workflow-triggers)
* [Workflow Actions](/l/es/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/best-practices-server.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/best-practices-server.mdx
index c5d7388c5d..d8f5c5ea7c 100644
--- a/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/best-practices-server.mdx
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/best-practices-server.mdx
@@ -1,22 +1,22 @@
---
-title: Meilleures pratiques
+title: Best Practices
---
-Ce document décrit les meilleures pratiques à suivre lors de travaux sur le backend.
+This document outlines the best practices you should follow when working on the backend.
-## Suivez une approche modulaire
+## Follow a modular approach
-Le backend suit une approche modulaire, qui est un principe fondamental lors de l'utilisation de NestJS. Assurez-vous de décomposer votre code en modules réutilisables pour maintenir une base de code propre et organisée.
-Chaque module doit encapsuler une fonctionnalité particulière et avoir un périmètre bien défini. Cette approche modulaire permet une séparation claire des préoccupations et supprime les complexités inutiles.
+The backend follows a modular approach, which is a fundamental principle when working with NestJS. Make sure you break down your code into reusable modules to maintain a clean and organized codebase.
+Each module should encapsulate a particular feature or functionality and have a well-defined scope. This modular approach enables clear separation of concerns and removes unnecessary complexities.
-## Exposez des services à utiliser dans les modules
+## Expose services to use in modules
-Créez toujours des services avec une responsabilité claire et unique, ce qui améliore la lisibilité et la maintenabilité du code. Nommez les services de manière descriptive et cohérente.
+Always create services that have a clear and single responsibility, which enhances code readability and maintainability. Name the services descriptively and consistently.
-Vous devez également exposer les services que vous souhaitez utiliser dans d'autres modules. Exposer des services à d'autres modules est possible grâce au puissant système d'injection de dépendance de NestJS, et favorise un couplage lâche entre les composants.
+You should also expose services that you want to use in other modules. Exposing services to other modules is possible through NestJS's powerful dependency injection system, and promotes loose coupling between components.
-## Évitez d'utiliser le type `any`
+## Avoid using `any` type
-Lorsque vous déclarez une variable comme `any`, le vérificateur de types de TypeScript ne procède à aucune vérification de type, ce qui permet d'affecter n'importe quel type de valeur à la variable. TypeScript utilise l'inférence de type pour déterminer le type d'une variable en fonction de sa valeur. En le déclarant comme `any`, TypeScript ne peut plus inférer le type. Cela rend difficile la détection des erreurs liées aux types pendant le développement, conduisant à des erreurs d'exécution et rendant le code moins maintenable, moins fiable et plus difficile à comprendre pour d'autres.
+When you declare a variable as `any`, TypeScript's type checker doesn't perform any type checking, making it possible to assign any type of values to the variable. TypeScript uses type inference to determine the type of variable based on the value. By declaring it as `any`, TypeScript can no longer infer the type. This makes it hard to catch type-related errors during development, leading to runtime errors and makes the code less maintainable, less reliable, and harder to understand for others.
-C'est pourquoi tout devrait avoir un type. Donc si vous créez un nouvel objet avec un prénom et un nom, vous devriez créer une interface ou un type contenant un prénom et un nom qui définit la forme de l'objet que vous manipulez.
+This is why everything should have a type. So if you create a new object with a first name and last name, you should create an interface or type that contains a first name and last name that defines the shape of the object you are manipulating.
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/custom-objects.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/custom-objects.mdx
new file mode 100644
index 0000000000..7feec7a639
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/custom-objects.mdx
@@ -0,0 +1,39 @@
+---
+title: Custom Objects
+---
+
+Objects are structures that allow you to store data (records, attributes, and values) specific to an organization. Twenty provides both standard and custom objects.
+
+Standard objects are in-built objects with a set of attributes available for all users. Examples of standard objects in Twenty include Company and Person. Standard objects have standard fields that are also available for all Twenty users, like Company.displayName.
+
+Custom objects are objects that you can create to store information that is unique to your organization. They are not built-in; members of your workspace can create and customize custom objects to hold information that standard objects aren't suitable for.
+
+## High-level schema
+
+
+
+
+
+
+
+## How it works
+
+Custom objects come from metadata tables that determine the shape, name, and type of the objects. All this information is present in the metadata schema database, consisting of tables:
+
+* **DataSource**: Details where the data is present.
+* **Object**: Describes the object and links to a DataSource.
+* **Field**: Outlines an Object's fields and connects to the Object.
+
+To add a custom object, the workspaceMember will query the /metadata API. This updates the metadata accordingly and computes a GraphQL schema based on the metadata, storing it in a GQL cache for later use.
+
+
+
+
+
+
+
+To fetch data, the process involves making queries through the /graphql endpoint and passing them through the Query Resolver.
+
+
+
+
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/feature-flags.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/feature-flags.mdx
new file mode 100644
index 0000000000..a261cfec3c
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/feature-flags.mdx
@@ -0,0 +1,46 @@
+---
+title: Feature Flags
+---
+
+Feature flags are used to hide experimental features. For Twenty, they are set on workspace level and not on a user level.
+
+## Adding a new feature flag
+
+In `FeatureFlagKey.ts` add the feature flag:
+
+```ts
+type FeatureFlagKey =
+ | 'IS_FEATURENAME_ENABLED'
+ | ...;
+```
+
+Also add it to the enum in `feature-flag.entity.ts`:
+
+```ts
+enum FeatureFlagKeys {
+ IsFeatureNameEnabled = 'IS_FEATURENAME_ENABLED',
+ ...
+}
+```
+
+To apply a feature flag on a **backend** feature use:
+
+```ts
+@Gate({
+ featureFlag: 'IS_FEATURENAME_ENABLED',
+})
+```
+
+To apply a feature flag on a **frontend** feature use:
+
+```ts
+const isFeatureNameEnabled = useIsFeatureEnabled('IS_FEATURENAME_ENABLED');
+```
+
+## Configure feature flags for the deployment
+
+Change the corresponding record in the Table `core.featureFlag`:
+
+| id | key | workspaceId | value |
+| ------ | ------------------------ | ----------- | ------ |
+| Random | `IS_FEATURENAME_ENABLED` | WorkspaceID | `true` |
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx
new file mode 100644
index 0000000000..233d92ac8a
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx
@@ -0,0 +1,125 @@
+---
+title: Folder Architecture
+info: A detailed look into our server folder architecture
+---
+
+The backend directory structure is as follows:
+
+```
+server
+ └───ability
+ └───constants
+ └───core
+ └───database
+ └───decorators
+ └───filters
+ └───guards
+ └───health
+ └───integrations
+ └───metadata
+ └───workspace
+ └───utils
+```
+
+## Ability
+
+Defines permissions and includes handlers for each entity.
+
+## Decorators
+
+Defines custom decorators in NestJS for added functionality.
+
+See [custom decorators](https://docs.nestjs.com/custom-decorators) for more details.
+
+## Filters
+
+Includes exception filters to handle exceptions that might occur in GraphQL endpoints.
+
+## Guards
+
+See [guards](https://docs.nestjs.com/guards) for more details.
+
+## Health
+
+Includes a publicly available REST API (healthz) that returns a JSON to confirm whether the database is working as expected.
+
+## Metadata
+
+Defines custom objects and makes available a GraphQL API (graphql/metadata).
+
+## Workspace
+
+Generates and serves custom GraphQL schema based on the metadata.
+
+### Workspace Directory Structure
+
+```
+workspace
+
+ └───workspace-schema-builder
+ └───factories
+ └───graphql-types
+ └───database
+ └───interfaces
+ └───object-definitions
+ └───services
+ └───storage
+ └───utils
+ └───workspace-resolver-builder
+ └───factories
+ └───interfaces
+ └───workspace-query-builder
+ └───factories
+ └───interfaces
+ └───workspace-query-runner
+ └───interfaces
+ └───utils
+ └───workspace-datasource
+ └───workspace-manager
+ └───workspace-migration-runner
+ └───utils
+ └───workspace.module.ts
+ └───workspace.factory.spec.ts
+ └───workspace.factory.ts
+```
+
+The root of the workspace directory includes the `workspace.factory.ts`, a file containing the `createGraphQLSchema` function. This function generates workspace-specific schema by using the metadata to tailor a schema for individual workspaces. By separating the schema and resolver construction, we use the `makeExecutableSchema` function, which combines these discrete elements.
+
+This strategy is not just about organization, but also helps with optimization, such as caching generated type definitions to enhance performance and scalability.
+
+### Workspace Schema builder
+
+Generates the GraphQL schema, and includes:
+
+#### Factories:
+
+Specialised constructors to generate GraphQL-related constructs.
+
+* The type.factory translates field metadata into GraphQL types using `TypeMapperService`.
+* The type-definition.factory creates GraphQL input or output objects derived from `objectMetadata`.
+
+#### GraphQL Types
+
+Includes enumerations, inputs, objects, and scalars, and serves as the building blocks for the schema construction.
+
+#### Interfaces and Object Definitions
+
+Contains the blueprints for GraphQL entities, and includes both predefined and custom types like `MONEY` or `URL`.
+
+#### Services
+
+Contains the service responsible for associating FieldMetadataType with its appropriate GraphQL scalar or query modifiers.
+
+#### Storage
+
+Includes the `TypeDefinitionsStorage` class that contains reusable type definitions, preventing duplication of GraphQL types.
+
+### Workspace Resolver Builder
+
+Creates resolver functions for querying and mutating the GraphQL schema.
+
+Each factory in this directory is responsible for producing a distinct resolver type, such as the `FindManyResolverFactory`, designed for adaptable application across various tables.
+
+### Workspace Query Runner
+
+Runs the generated queries on the database and parses the result.
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/queue.mdx
new file mode 100644
index 0000000000..6148c0fbf0
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/queue.mdx
@@ -0,0 +1,41 @@
+---
+title: Message Queue
+---
+
+Queues facilitate async operations to be performed. They can be used for performing background tasks such as sending a welcome email on register.
+Each use case will have its own queue class extended from `MessageQueueServiceBase`.
+
+Currently, we only support `bull-mq`[bull-mq](https://bullmq.io/) as the queue driver.
+
+## Steps to create and use a new queue
+
+1. Add a queue name for your new queue under enum `MESSAGE_QUEUES`.
+2. Provide the factory implementation of the queue with the queue name as the dependency token.
+3. Inject the queue that you created in the required module/service with the queue name as the dependency token.
+4. Add worker class with token based injection just like producer.
+
+### Example usage
+
+```ts
+class Resolver {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
+
+ async onSomeAction() {
+ //business logic
+ await this.queue.add(someData);
+ }
+}
+
+//async worker
+class CustomWorker {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
+ this.initWorker();
+ }
+
+ async initWorker() {
+ await this.queue.work(async ({ id, data }) => {
+ //worker logic
+ });
+ }
+}
+```
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/server-commands.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/server-commands.mdx
new file mode 100644
index 0000000000..6951909788
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/server-commands.mdx
@@ -0,0 +1,101 @@
+---
+title: Backend Commands
+---
+
+## Useful commands
+
+These commands should be executed from packages/twenty-server folder.
+From any other folder you can run `npx nx {command} twenty-server` (or `npx nx run twenty-server:{command}`).
+
+### First time setup
+
+```
+npx nx database:reset twenty-server # setup the database with dev seeds
+```
+
+### Starting the server
+
+```
+npx nx run twenty-server:start
+```
+
+### Lint
+
+```
+npx nx run twenty-server:lint # pass --fix to fix lint errors
+```
+
+### Test
+
+```
+npx nx run twenty-server:test:unit # run unit tests
+npx nx run twenty-server:test:integration # run integration tests
+```
+
+Note: you can run `npx nx run twenty-server:test:integration:with-db-reset` in case you need to reset the database before running the integration tests.
+
+### Resetting the database
+
+If you want to reset and seed the database, you can run the following command:
+
+```bash
+npx nx run twenty-server:database:reset
+```
+
+### Migrations
+
+#### For objects in Core/Metadata schemas (TypeORM)
+
+```bash
+npx nx run twenty-server:typeorm migration:generate src/database/typeorm/core/migrations/nameOfYourMigration -d src/database/typeorm/core/core.datasource.ts
+```
+
+#### For Workspace objects
+
+There are no migrations files, migration are generated automatically for each workspace,
+stored in the database, and applied with this command
+
+```bash
+npx nx run twenty-server:command workspace:sync-metadata -f
+```
+
+
+ This will drop the database and re-run the migrations and seed.
+
+ Make sure to back up any data you want to keep before running this command.
+
+
+## Tech Stack
+
+Twenty primarily uses NestJS for the backend.
+
+Prisma was the first ORM we used. But in order to allow users to create custom fields and custom objects, a lower-level made more sense as we need to have fine-grained control. The project now uses TypeORM.
+
+Here's what the tech stack now looks like.
+
+**Core**
+
+* [NestJS](https://nestjs.com/)
+* [TypeORM](https://typeorm.io/)
+* [GraphQL Yoga](https://the-guild.dev/graphql/yoga-server)
+
+**Database**
+
+* [Postgres](https://www.postgresql.org/)
+
+**Third-party integrations**
+
+* [Sentry](https://sentry.io/welcome/) for tracking bugs
+
+**Testing**
+
+* [Jest](https://jestjs.io/)
+
+**Tooling**
+
+* [Yarn](https://yarnpkg.com/)
+* [ESLint](https://eslint.org/)
+
+**Development**
+
+* [AWS EKS](https://aws.amazon.com/eks/)
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/zapier.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/zapier.mdx
new file mode 100644
index 0000000000..46bcd563fc
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/zapier.mdx
@@ -0,0 +1,83 @@
+---
+title: Zapier App
+---
+
+Effortlessly sync Twenty with 3000+ apps using [Zapier](https://zapier.com/). Automate tasks, boost productivity, and supercharge your customer relationships!
+
+## About Zapier
+
+Zapier is a tool that allows you to automate workflows by connecting the apps that your team uses every day. The fundamental concept of Zapier is automation workflows, called Zaps, and include triggers and actions.
+
+You can learn more about how Zapier works [here](https://zapier.com/how-it-works).
+
+## Setup
+
+### Step 1: Install Zapier packages
+
+```bash
+cd packages/twenty-zapier
+
+yarn
+```
+
+### Step 2: Login with the CLI
+
+Use your Zapier credentials to log in using the CLI:
+
+```bash
+zapier login
+```
+
+### Step 3: Set environment variables
+
+From the `packages/twenty-zapier` folder, run:
+
+```bash
+cp .env.example .env
+```
+
+Run the application locally, go to [http://localhost:3000/settings/api-webhooks](http://localhost:3000/settings/api-webhooks), and generate an API key.
+
+Replace the **YOUR_API_KEY** value in the `.env` file with the API key you just generated.
+
+## Development
+
+
+ Make sure to run `yarn build` before any `zapier` command.
+
+
+### Test
+
+```bash
+yarn test
+```
+
+### Lint
+
+```bash
+yarn format
+```
+
+### Watch and compile as you edit code
+
+```bash
+yarn watch
+```
+
+### Validate your Zapier app
+
+```bash
+yarn validate
+```
+
+### Deploy your Zapier app
+
+```bash
+yarn deploy
+```
+
+### List all Zapier CLI commands
+
+```bash
+zapier
+```
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/bug-and-requests.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/bug-and-requests.mdx
new file mode 100644
index 0000000000..4db64b703d
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/bug-and-requests.mdx
@@ -0,0 +1,78 @@
+---
+title: Bugs, Requests & Pull Requests
+info: Report issues, request features, and contribute code
+---
+
+## Reporting Bugs
+
+To report a bug, please [create an issue on GitHub](https://github.com/twentyhq/twenty/issues/new).
+
+You can also ask for help on [Discord](https://discord.gg/cx5n4Jzs57).
+
+## Feature Requests
+
+If you're not sure if it's a bug, and you feel it's closer to a feature request, then you should probably [open a discussion instead](https://github.com/twentyhq/twenty/discussions/new).
+
+## Submit a Pull Request
+
+Contributing code to Twenty starts with a pull request (PR).
+
+### Before You Start
+
+1. Check [existing issues](https://github.com/twentyhq/twenty/issues) for related work
+2. For new features, open an issue first to discuss
+3. Review our [Code of Conduct](https://github.com/twentyhq/twenty/blob/main/CODE_OF_CONDUCT.md)
+
+### Fork and Clone
+
+1. Fork the repository on GitHub
+2. Clone your fork:
+
+```bash
+git clone https://github.com/YOUR_USERNAME/twenty.git
+cd twenty
+```
+
+3. Add upstream remote:
+
+```bash
+git remote add upstream https://github.com/twentyhq/twenty.git
+```
+
+### Create a Branch
+
+```bash
+git checkout -b feature/your-feature-name
+```
+
+Use descriptive branch names:
+
+* `feature/add-export-button`
+* `fix/login-redirect-issue`
+* `docs/update-api-guide`
+
+### Make Your Changes
+
+1. Write clean, well-documented code
+2. Follow existing code style
+3. Add tests for new functionality
+4. Update documentation if needed
+
+### Submit Your PR
+
+1. Push your branch:
+
+```bash
+git push origin feature/your-feature-name
+```
+
+2. Open a PR on GitHub
+3. Fill in the PR template
+4. Link related issues
+
+### PR Checklist
+
+* [ ] Code follows project style guidelines
+* [ ] Tests pass locally
+* [ ] Documentation is updated
+* [ ] PR description explains the changes
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/best-practices-front.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
new file mode 100644
index 0000000000..187c2d848c
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
@@ -0,0 +1,325 @@
+---
+title: Best Practices
+---
+
+This document outlines the best practices you should follow when working on the frontend.
+
+## State management
+
+React and Recoil handle state management in the codebase.
+
+### Use `useRecoilState` to store state
+
+It's good practice to create as many atoms as you need to store your state.
+
+
+ It's better to use extra atoms than trying to be too concise with props drilling.
+
+
+```tsx
+export const myAtomState = atom({
+ key: 'myAtomState',
+ default: 'default value',
+});
+
+export const MyComponent = () => {
+ const [myAtom, setMyAtom] = useRecoilState(myAtomState);
+
+ return (
+
+ setMyAtom(e.target.value)}
+ />
+
+ );
+}
+```
+
+### Do not use `useRef` to store state
+
+Avoid using `useRef` to store state.
+
+If you want to store state, you should use `useState` or `useRecoilState`.
+
+See [how to manage re-renders](#managing-re-renders) if you feel like you need `useRef` to prevent some re-renders from happening.
+
+## Managing re-renders
+
+Re-renders can be hard to manage in React.
+
+Here are some rules to follow to avoid unnecessary re-renders.
+
+Keep in mind that you can **always** avoid re-renders by understanding their cause.
+
+### Work at the root level
+
+Avoiding re-renders in new features is now made easy by eliminating them at the root level.
+
+The `PageChangeEffect` sidecar component contains just one `useEffect` that holds all the logic to execute on a page change.
+
+That way you know that there's just one place that can trigger a re-render.
+
+### Always think twice before adding `useEffect` in your codebase
+
+Re-renders are often caused by unnecessary `useEffect`.
+
+You should think whether you need `useEffect`, or if you can move the logic in a event handler function.
+
+You'll find it generally easy to move the logic in a `handleClick` or `handleChange` function.
+
+You can also find them in libraries like Apollo: `onCompleted`, `onError`, etc.
+
+### Use a sibling component to extract `useEffect` or data fetching logic
+
+If you feel like you need to add a `useEffect` in your root component, you should consider extracting it in a sidecar component.
+
+You can apply the same for data fetching logic, with Apollo hooks.
+
+```tsx
+// ❌ Bad, will cause re-renders even if data is not changing,
+// because useEffect needs to be re-evaluated
+export const PageComponent = () => {
+ const [data, setData] = useRecoilState(dataState);
+ const [someDependency] = useRecoilState(someDependencyState);
+
+ useEffect(() => {
+ if(someDependency !== data) {
+ setData(someDependency);
+ }
+ }, [someDependency]);
+
+ return {data}
;
+};
+
+export const App = () => (
+
+
+
+);
+```
+
+```tsx
+// ✅ Good, will not cause re-renders if data is not changing,
+// because useEffect is re-evaluated in another sibling component
+export const PageComponent = () => {
+ const [data, setData] = useRecoilState(dataState);
+
+ return {data}
;
+};
+
+export const PageData = () => {
+ const [data, setData] = useRecoilState(dataState);
+ const [someDependency] = useRecoilState(someDependencyState);
+
+ useEffect(() => {
+ if(someDependency !== data) {
+ setData(someDependency);
+ }
+ }, [someDependency]);
+
+ return <>>;
+};
+
+export const App = () => (
+
+
+
+
+);
+```
+
+### Use recoil family states and recoil family selectors
+
+Recoil family states and selectors are a great way to avoid re-renders.
+
+They are useful when you need to store a list of items.
+
+### You shouldn't use `React.memo(MyComponent)`
+
+Avoid using `React.memo()` because it does not solve the cause of the re-render, but instead breaks the re-render chain, which can lead to unexpected behavior and make the code very hard to refactor.
+
+### Limit `useCallback` or `useMemo` usage
+
+They are often not necessary and will make the code harder to read and maintain for a gain of performance that is unnoticeable.
+
+## Console.logs
+
+`console.log` statements are valuable during development, offering real-time insights into variable values and code flow. But, leaving them in production code can lead to several issues:
+
+1. **Performance**: Excessive logging can affect the runtime performance, especially on client-side applications.
+
+2. **Security**: Logging sensitive data can expose critical information to anyone who inspects the browser's console.
+
+3. **Cleanliness**: Filling up the console with logs can obscure important warnings or errors that developers or tools need to see.
+
+4. **Professionalism**: End users or clients checking the console and seeing a myriad of log statements might question the code's quality and polish.
+
+Make sure you remove all `console.logs` before pushing the code to production.
+
+## Naming
+
+### Variable Naming
+
+Variable names ought to precisely depict the purpose or function of the variable.
+
+#### The issue with generic names
+
+Generic names in programming are not ideal because they lack specificity, leading to ambiguity and reduced code readability. Such names fail to convey the variable or function's purpose, making it challenging for developers to understand the code's intent without deeper investigation. This can result in increased debugging time, higher susceptibility to errors, and difficulties in maintenance and collaboration. Meanwhile, descriptive naming makes the code self-explanatory and easier to navigate, enhancing code quality and developer productivity.
+
+```tsx
+// ❌ Bad, uses a generic name that doesn't communicate its
+// purpose or content clearly
+const [value, setValue] = useState('');
+```
+
+```tsx
+// ✅ Good, uses a descriptive name
+const [email, setEmail] = useState('');
+```
+
+#### Some words to avoid in variable names
+
+* dummy
+
+### Event handlers
+
+Event handler names should start with `handle`, while `on` is a prefix used to name events in components props.
+
+```tsx
+// ❌ Bad
+const onEmailChange = (val: string) => {
+ // ...
+};
+```
+
+```tsx
+// ✅ Good
+const handleEmailChange = (val: string) => {
+ // ...
+};
+```
+
+## Optional Props
+
+Avoid passing the default value for an optional prop.
+
+**EXAMPLE**
+
+Take the`EmailField` component defined below:
+
+```tsx
+type EmailFieldProps = {
+ value: string;
+ disabled?: boolean;
+};
+
+const EmailField = ({ value, disabled = false }: EmailFieldProps) => (
+
+);
+```
+
+**Usage**
+
+```tsx
+// ❌ Bad, passing in the same value as the default value adds no value
+const Form = () => ;
+```
+
+```tsx
+// ✅ Good, assumes the default value
+const Form = () => ;
+```
+
+## Component as props
+
+Try as much as possible to pass uninstantiated components as props, so children can decide on their own of what props they need to pass.
+
+The most common example for that is icon components:
+
+```tsx
+const SomeParentComponent = () => ;
+
+// In MyComponent
+const MyComponent = ({ MyIcon }: { MyIcon: IconComponent }) => {
+ const theme = useTheme();
+
+ return (
+
+
+
+ )
+};
+```
+
+For React to understand that the component is a component, you need to use PascalCase, to later instantiate it with ``
+
+## Prop Drilling: Keep It Minimal
+
+Prop drilling, in the React context, refers to the practice of passing state variables and their setters through many component layers, even if intermediary components don't use them. While sometimes necessary, excessive prop drilling can lead to:
+
+1. **Decreased Readability**: Tracing where a prop originates or where it's utilized can become convoluted in a deeply nested component structure.
+
+2. **Maintenance Challenges**: Changes in one component's prop structure might require adjustments in several components, even if they don't directly use the prop.
+
+3. **Reduced Component Reusability**: A component receiving a lot of props solely for passing them down becomes less general-purpose and harder to reuse in different contexts.
+
+If you feel that you are using excessive prop drilling, see [state management best practices](#state-management).
+
+## Imports
+
+When importing, opt for the designated aliases rather than specifying complete or relative paths.
+
+**The Aliases**
+
+```js
+{
+ alias: {
+ "~": path.resolve(__dirname, "src"),
+ "@": path.resolve(__dirname, "src/modules"),
+ "@testing": path.resolve(__dirname, "src/testing"),
+ },
+}
+```
+
+**Usage**
+
+```tsx
+// ❌ Bad, specifies the entire relative path
+import {
+ CatalogDecorator
+} from '../../../../../testing/decorators/CatalogDecorator';
+import {
+ ComponentDecorator
+} from '../../../../../testing/decorators/ComponentDecorator';
+```
+
+```tsx
+// ✅ Good, utilises the designated aliases
+import { CatalogDecorator } from '~/testing/decorators/CatalogDecorator';
+import { ComponentDecorator } from 'twenty-ui/testing';
+```
+
+## Schema Validation
+
+[Zod](https://github.com/colinhacks/zod) is the schema validator for untyped objects:
+
+```js
+const validationSchema = z
+ .object({
+ exist: z.boolean(),
+ email: z
+ .string()
+ .email('Email must be a valid email'),
+ password: z
+ .string()
+ .regex(PASSWORD_REGEX, 'Password must contain at least 8 characters'),
+ })
+ .required();
+
+type Form = z.infer;
+```
+
+## Breaking Changes
+
+Always perform thorough manual testing before proceeding to guarantee that modifications haven’t caused disruptions elsewhere, given that tests have not yet been extensively integrated.
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
index fd0c45d576..064ac5c256 100644
--- a/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
@@ -1,22 +1,22 @@
---
-title: Architecture des Dossiers
-info: Un aperçu détaillé de notre architecture de dossiers
+title: Folder Architecture
+info: A detailed look into our folder architecture
---
-Dans ce guide, vous explorerez les détails de la structure du répertoire de projet et comment elle contribue à l'organisation et à la maintenabilité de Twenty.
+In this guide, you will explore the details of the project directory structure and how it contributes to the organization and maintainability of Twenty.
-En suivant cette convention d'architecture de dossiers, il est plus facile de trouver les fichiers liés à des fonctionnalités spécifiques et de s'assurer que l'application est évolutive et maintenable.
+By following this folder architecture convention, it's easier to find the files related to specific features and ensure that the application is scalable and maintainable.
```
front
└───modules
│ └───module1
-│ │ └───sous-module1
+│ │ └───submodule1
│ └───module2
│ └───ui
-│ │ └───affichage
-│ │ └───entrées
-│ │ │ └───boutons
+│ │ └───display
+│ │ └───inputs
+│ │ │ └───buttons
│ │ └───...
└───pages
└───...
@@ -24,86 +24,86 @@ front
## Pages
-Comprend les composants de haut niveau définis par les routes de l'application. Ils importent des composants de plus bas niveau depuis le dossier `modules` (plus de détails ci-dessous).
+Includes the top-level components defined by the application routes. They import more low-level components from the modules folder (more details below).
## Modules
-Chaque module représente une fonctionnalité ou un groupe de fonctionnalités, comprenant ses composants spécifiques, ses états, et sa logique opérationnelle.
-Ils doivent tous suivre la structure ci-dessous. Vous pouvez imbriquer des modules dans des modules (appelés sous-modules) et les mêmes règles s'appliqueront.
+Each module represents a feature or a group of feature, comprising its specific components, states, and operational logic.
+They should all follow the structure below. You can nest modules within modules (referred to as submodules) and the same rules will apply.
```
module1
- └───composants
- │ └───composant1
- │ └───composant2
- └───constantes
- └───contextes
+ └───components
+ │ └───component1
+ │ └───component2
+ └───constants
+ └───contexts
└───graphql
│ └───fragments
- │ └───requêtes
+ │ └───queries
│ └───mutations
└───hooks
- │ └───interne
- └───états
- │ └───sélecteurs
+ │ └───internal
+ └───states
+ │ └───selectors
└───types
- └───utilitaires
+ └───utils
```
-### Contextes
+### Contexts
-Un contexte est un moyen de transmettre des données à travers l'arborescence de composants sans avoir à transmettre les propriétés manuellement à chaque niveau.
+A context is a way to pass data through the component tree without having to pass props down manually at every level.
-Voir [React Context](https://react.dev/reference/react#context-hooks) pour plus de détails.
+See [React Context](https://react.dev/reference/react#context-hooks) for more details.
### GraphQL
-Comprend des fragments, des requêtes et des mutations.
+Includes fragments, queries, and mutations.
-Voir [GraphQL](https://graphql.org/learn/) pour plus de détails.
+See [GraphQL](https://graphql.org/learn/) for more details.
* Fragments
-Un fragment est une partie réutilisable d'une requête, que vous pouvez utiliser dans différents endroits. En utilisant des fragments, il est plus facile d'éviter de dupliquer du code.
+A fragment is a reusable piece of a query, which you can use in different places. By using fragments, it's easier to avoid duplicating code.
-Voir [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) pour plus de détails.
+See [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) for more details.
-* Requêtes
+* Queries
-Voir [GraphQL Queries](https://graphql.org/learn/queries/) pour plus de détails.
+See [GraphQL Queries](https://graphql.org/learn/queries/) for more details.
* Mutations
-Voir [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) pour plus de détails.
+See [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) for more details.
### Hooks
-Voir [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) pour plus de détails.
+See [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) for more details.
-### États
+### States
-Contient la logique de gestion des états. [RecoilJS](https://recoiljs.org) gère cela.
+Contains the state management logic. [RecoilJS](https://recoiljs.org) handles this.
-* Sélecteurs : Voir [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) pour plus de détails.
+* Selectors: See [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) for more details.
-La gestion de l'état intégrée de React gère toujours l'état au sein d'un composant.
+React's built-in state management still handles state within a component.
-### Utilitaires
+### Utils
-Devrait juste contenir des fonctions pures réutilisables. Autrement, créez des hooks personnalisés dans le dossier `hooks`.
+Should just contain reusable pure functions. Otherwise, create custom hooks in the `hooks` folder.
## UI
-Contient tous les composants d'interface utilisateur réutilisables utilisés dans l'application.
+Contains all the reusable UI components used in the application.
-Ce dossier peut contenir des sous-dossiers, comme `data`, `display`, `feedback`, et `input` pour des types de composants spécifiques. Chaque composant doit être autonome et réutilisable, de sorte que vous puissiez l'utiliser dans différentes parties de l'application.
+This folder can contain sub-folders, like `data`, `display`, `feedback`, and `input` for specific types of components. Each component should be self-contained and reusable, so that you can use it in different parts of the application.
-En séparant les composants UI des autres composants dans le dossier `modules`, il est plus facile de maintenir un design cohérent et d'effectuer des changements de l'interface utilisateur sans affecter d'autres parties (logique métier) de la base de code.
+By separating the UI components from the other components in the `modules` folder, it's easier to maintain a consistent design and to make changes to the UI without affecting other parts (business logic) of the codebase.
-## Interface et dépendances
+## Interface and dependencies
-Vous pouvez importer le code d'autres modules depuis n'importe quel module, sauf le dossier `ui`. Cela permettra de garder son code facile à tester.
+You can import other module code from any module except for the `ui` folder. This will keep its code easy to test.
-### Interne
+### Internal
-Chaque partie (hooks, états, ...) d'un module peut avoir un dossier `internal`, qui contient des parties utilisées uniquement au sein du module.
+Each part (hooks, states, ...) of a module can have an `internal` folder, which contains parts that are just used within the module.
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
index 9921f33a18..0d5638d440 100644
--- a/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -1,50 +1,54 @@
---
-title: Commandes Frontend
+title: Frontend Commands
---
-## Commandes utiles
+## Useful commands
-### Lancement de l'application
+### Starting the app
```bash
npx nx start twenty-front
```
-### Régénérer le schéma GraphQL basé sur le schéma API GraphQL
+### Regenerate graphql schema based on API graphql schema
```bash
npx nx run twenty-front:graphql:generate --configuration=metadata
```
-OU
+OR
```bash
npx nx run twenty-front:graphql:generate
```
-### Analyse
+### Lint
```bash
-npx nx run twenty-front:lint # passez --fix pour corriger les erreurs de lint
+npx nx run twenty-front:lint # pass --fix to fix lint errors
```
-## Traductions
+## Translations
```bash
-npx nx run twenty-front:lingui:extract\nnpx nx run twenty-front:lingui:compile
+npx nx run twenty-front:lingui:extract
+npx nx run twenty-front:lingui:compile
```
### Test
```bash
-npx nx run twenty-front:test # exécuter les tests jest\nnpx nx run twenty-front:storybook:serve:dev # exécuter storybook\nnpx nx run twenty-front:storybook:test # exécuter les tests # (besoin de yarn storybook:serve:dev pour fonctionner)\nnpx nx run twenty-front:storybook:coverage # (besoin de yarn storybook:serve:dev pour fonctionner)
+npx nx run twenty-front:test # run jest tests
+npx nx run twenty-front:storybook:serve:dev # run storybook
+npx nx run twenty-front:storybook:test # run tests # (needs yarn storybook:serve:dev to be running)
+npx nx run twenty-front:storybook:coverage # (needs yarn storybook:serve:dev to be running)
```
-## Écosystème Tech
+## Tech Stack
-Le projet a une stack simple et propre, avec un code boilerplate minimal.
+The project has a clean and simple stack, with minimal boilerplate code.
-**Application**
+**App**
* [React](https://react.dev/)
* [Apollo](https://www.apollographql.com/docs/)
@@ -52,12 +56,12 @@ Le projet a une stack simple et propre, avec un code boilerplate minimal.
* [Recoil](https://recoiljs.org/docs/introduction/core-concepts)
* [TypeScript](https://www.typescriptlang.org/)
-**Tests**
+**Testing**
* [Jest](https://jestjs.io/)
* [Storybook](https://storybook.js.org/)
-**Outils**
+**Tooling**
* [Yarn](https://yarnpkg.com/)
* [Craco](https://craco.js.org/docs/)
@@ -65,22 +69,22 @@ Le projet a une stack simple et propre, avec un code boilerplate minimal.
## Architecture
-### Routage
+### Routing
-[React Router](https://reactrouter.com/) gère le routage.
+[React Router](https://reactrouter.com/) handles the routing.
-Pour éviter les [re-renders](/l/fr/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) inutiles, toute la logique de routage est dans un `useEffect` dans `PageChangeEffect`.
+To avoid unnecessary [re-renders](/l/fr/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) all the routing logic is in a `useEffect` in `PageChangeEffect`.
-### Gestion de l'État
+### State Management
-[Recoil](https://recoiljs.org/docs/introduction/core-concepts) gère la gestion de l'état.
+[Recoil](https://recoiljs.org/docs/introduction/core-concepts) handles state management.
-Voir [les meilleures pratiques](/l/fr/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) pour plus d'informations sur la gestion de l'état.
+See [best practices](/l/fr/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) for more information on state management.
-## Tests
+## Testing
-[Jest](https://jestjs.io/) sert de guide pour les tests unitaires tandis que [Storybook](https://storybook.js.org/) est utilisé pour les tests de composants.
+[Jest](https://jestjs.io/) serves as the tool for unit testing while [Storybook](https://storybook.js.org/) is for component testing.
-Jest est principalement utilisé pour tester les fonctions utilitaires, et non les composants eux-mêmes.
+Jest is mainly for testing utility functions, and not components themselves.
-Storybook est utilisé pour tester le comportement des composants isolés, ainsi que pour afficher le système de design.
+Storybook is for testing the behavior of isolated components, as well as displaying the design system.
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/hotkeys.mdx
new file mode 100644
index 0000000000..43cde50e63
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -0,0 +1,178 @@
+---
+title: Hotkeys
+---
+
+## Introduction
+
+When you need to listen to a hotkey, you would normally use the `onKeyDown` event listener.
+
+In `twenty-front` however, you might have conflicts between same hotkeys that are used in different components, mounted at the same time.
+
+For example, if you have a page that listens for the Enter key, and a modal that listens for the Enter key, with a Select component inside that modal that listens for the Enter key, you might have a conflict when all are mounted at the same time.
+
+## The `useScopedHotkeys` hook
+
+To handle this problem, we have a custom hook that makes it possible to listen to hotkeys without any conflict.
+
+You place it in a component, and it will listen to the hotkeys only when the component is mounted AND when the specified **hotkey scope** is active.
+
+## How to listen for hotkeys in practice?
+
+There are two steps involved in setting up hotkey listening :
+
+1. Set the [hotkey scope](#what-is-a-hotkey-scope-) that will listen to hotkeys
+2. Use the `useScopedHotkeys` hook to listen to hotkeys
+
+Setting up hotkey scopes is required even in simple pages, because other UI elements like left menu or command menu might also listen to hotkeys.
+
+## Use cases for hotkeys
+
+In general, you'll have two use cases that require hotkeys :
+
+1. In a page or a component mounted in a page
+2. In a modal-type component that takes the focus due to a user action
+
+The second use case can happen recursively : a dropdown in a modal for example.
+
+### Listening to hotkeys in a page
+
+Example :
+
+```tsx
+const PageListeningEnter = () => {
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ // 1. Set the hotkey scope in a useEffect
+ useEffect(() => {
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ // Revert to the previous hotkey scope when the component is unmounted
+ return () => {
+ goBackToPreviousHotkeyScope();
+ };
+ }, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
+
+ // 2. Use the useScopedHotkeys hook
+ useScopedHotkeys(
+ Key.Enter,
+ () => {
+ // Some logic executed on this page when the user presses Enter
+ // ...
+ },
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ return My page that listens for Enter
;
+};
+```
+
+### Listening to hotkeys in a modal-type component
+
+For this example we'll use a modal component that listens for the Escape key to tell its parent to close it.
+
+Here the user interaction is changing the scope.
+
+```tsx
+const ExamplePageWithModal = () => {
+ const [showModal, setShowModal] = useState(false);
+
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ const handleOpenModalClick = () => {
+ // 1. Set the hotkey scope when user opens the modal
+ setShowModal(true);
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleModal,
+ );
+ };
+
+ const handleModalClose = () => {
+ // 1. Revert to the previous hotkey scope when the modal is closed
+ setShowModal(false);
+ goBackToPreviousHotkeyScope();
+ };
+
+ return
+
My page with a modal
+ Open modal
+ {showModal && }
+ ;
+};
+```
+
+Then in the modal component :
+
+```tsx
+const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
+ // 2. Use the useScopedHotkeys hook to listen for Escape.
+ // Note that escape is a common hotkey that could be used by many other components
+ // So it's important to use a hotkey scope to avoid conflicts
+ useScopedHotkeys(
+ Key.Escape,
+ () => {
+ onClose()
+ },
+ ExampleHotkeyScopes.ExampleModal,
+ );
+
+ return My modal component
;
+};
+```
+
+It's important to use this pattern when you're not sure that just using a useEffect with mount/unmount will be enough to avoid conflicts.
+
+Those conflicts can be hard to debug, and it might happen more often than not with useEffects.
+
+## What is a hotkey scope?
+
+A hotkey scope is a string that represents a context in which the hotkeys are active. It is generally encoded as an enum.
+
+When you change the hotkey scope, the hotkeys that are listening to this scope will be enabled and the hotkeys that are listening to other scopes will be disabled.
+
+You can set only one scope at a time.
+
+As an example, the hotkey scopes for each page are defined in the `PageHotkeyScope` enum:
+
+```tsx
+export enum PageHotkeyScope {
+ Settings = 'settings',
+ CreateWorkspace = 'create-workspace',
+ SignInUp = 'sign-in-up',
+ CreateProfile = 'create-profile',
+ PlanRequired = 'plan-required',
+ ShowPage = 'show-page',
+ PersonShowPage = 'person-show-page',
+ CompanyShowPage = 'company-show-page',
+ CompaniesPage = 'companies-page',
+ PeoplePage = 'people-page',
+ OpportunitiesPage = 'opportunities-page',
+ ProfilePage = 'profile-page',
+ WorkspaceMemberPage = 'workspace-member-page',
+ TaskPage = 'task-page',
+}
+```
+
+Internally, the currently selected scope is stored in a Recoil state that is shared across the application :
+
+```tsx
+export const currentHotkeyScopeState = createState({
+ key: 'currentHotkeyScopeState',
+ defaultValue: INITIAL_HOTKEYS_SCOPE,
+});
+```
+
+But this Recoil state should never be handled manually ! We'll see how to use it in the next section.
+
+## How is it working internally?
+
+We made a thin wrapper on top of [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) that makes it more performant and avoids unnecessary re-renders.
+
+We also create a Recoil state to handle the hotkey scope state and make it available everywhere in the application.
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/storybook.mdx
index 456c270679..5c7f5fa52a 100644
--- a/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/storybook.mdx
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -1,8 +1,8 @@
---
title: Storybook
-description: Parcourir la bibliothèque de composants UI de Twenty
+description: Browse Twenty's UI component library
---
-Consultez notre bibliothèque de composants complète et la documentation dans Storybook.
+View our complete component library and documentation in Storybook.
-[Ouvrir Storybook →](https://storybook.twenty.com)
+[Open Storybook →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/style-guide.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/style-guide.mdx
new file mode 100644
index 0000000000..e3ba4a44f0
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/style-guide.mdx
@@ -0,0 +1,290 @@
+---
+title: Style Guide
+---
+
+This document includes the rules to follow when writing code.
+
+The goal here is to have a consistent codebase, which is easy to read and easy to maintain.
+
+For this, it's better to be a bit more verbose than to be too concise.
+
+Always keep in mind that people read code more often than they write it, specially on an open source project, where anyone can contribute.
+
+There are a lot of rules that are not defined here, but that are automatically checked by linters.
+
+## React
+
+### Use functional components
+
+Always use TSX functional components.
+
+Do not use default `import` with `const`, because it's harder to read and harder to import with code completion.
+
+```tsx
+// ❌ Bad, harder to read, harder to import with code completion
+const MyComponent = () => {
+ return Hello World
;
+};
+
+export default MyComponent;
+
+// ✅ Good, easy to read, easy to import with code completion
+export function MyComponent() {
+ return Hello World
;
+};
+```
+
+### Props
+
+Create the type of the props and call it `(ComponentName)Props` if there's no need to export it.
+
+Use props destructuring.
+
+```tsx
+// ❌ Bad, no type
+export const MyComponent = (props) => Hello {props.name}
;
+
+// ✅ Good, type
+type MyComponentProps = {
+ name: string;
+};
+
+export const MyComponent = ({ name }: MyComponentProps) => Hello {name}
;
+```
+
+#### Refrain from using `React.FC` or `React.FunctionComponent` to define prop types
+
+```tsx
+/* ❌ - Bad, defines the component type annotations with `FC`
+ * - With `React.FC`, the component implicitly accepts a `children` prop
+ * even if it's not defined in the prop type. This might not always be
+ * desirable, especially if the component doesn't intend to render
+ * children.
+ */
+const EmailField: React.FC<{
+ value: string;
+}> = ({ value }) => ;
+```
+
+```tsx
+/* ✅ - Good, a separate type (OwnProps) is explicitly defined for the
+ * component's props
+ * - This method doesn't automatically include the children prop. If
+ * you want to include it, you have to specify it in OwnProps.
+ */
+type EmailFieldProps = {
+ value: string;
+};
+
+const EmailField = ({ value }: EmailFieldProps) => (
+
+);
+```
+
+#### No Single Variable Prop Spreading in JSX Elements
+
+Avoid using single variable prop spreading in JSX elements, like `{...props}`. This practice often results in code that is less readable and harder to maintain because it's unclear which props the component is receiving.
+
+```tsx
+/* ❌ - Bad, spreads a single variable prop into the underlying component
+ */
+const MyComponent = (props: OwnProps) => {
+ return ;
+}
+```
+
+```tsx
+/* ✅ - Good, Explicitly lists all props
+ * - Enhances readability and maintainability
+ */
+const MyComponent = ({ prop1, prop2, prop3 }: MyComponentProps) => {
+ return ;
+};
+```
+
+Rationale:
+
+* At a glance, it's clearer which props the code passes down, making it easier to understand and maintain.
+* It helps to prevent tight coupling between components via their props.
+* Linting tools make it easier to identify misspelled or unused props when you list props explicitly.
+
+## JavaScript
+
+### Use nullish-coalescing operator `??`
+
+```tsx
+// ❌ Bad, can return 'default' even if value is 0 or ''
+const value = process.env.MY_VALUE || 'default';
+
+// ✅ Good, will return 'default' only if value is null or undefined
+const value = process.env.MY_VALUE ?? 'default';
+```
+
+### Use optional chaining `?.`
+
+```tsx
+// ❌ Bad
+onClick && onClick();
+
+// ✅ Good
+onClick?.();
+```
+
+## TypeScript
+
+### Use `type` instead of `interface`
+
+Always use `type` instead of `interface`, because they almost always overlap, and `type` is more flexible.
+
+```tsx
+// ❌ Bad
+interface MyInterface {
+ name: string;
+}
+
+// ✅ Good
+type MyType = {
+ name: string;
+};
+```
+
+### Use string literals instead of enums
+
+[String literals](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types) are the go-to way to handle enum-like values in TypeScript. They are easier to extend with Pick and Omit, and offer a better developer experience, specially with code completion.
+
+You can see why TypeScript recommends avoiding enums [here](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
+
+```tsx
+// ❌ Bad, utilizes an enum
+enum Color {
+ Red = "red",
+ Green = "green",
+ Blue = "blue",
+}
+
+let color = Color.Red;
+```
+
+```tsx
+// ✅ Good, utilizes a string literal
+
+let color: "red" | "green" | "blue" = "red";
+```
+
+#### GraphQL and internal libraries
+
+You should use enums that GraphQL codegen generates.
+
+It's also better to use an enum when using an internal library, so the internal library doesn't have to expose a string literal type that is not related to the internal API.
+
+Example:
+
+```TSX
+const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+} = usePreviousHotkeyScope();
+
+setHotkeyScopeAndMemorizePreviousScope(
+ RelationPickerHotkeyScope.RelationPicker,
+);
+```
+
+## Styling
+
+### Use StyledComponents
+
+Style the components with [styled-components](https://emotion.sh/docs/styled).
+
+```tsx
+// ❌ Bad
+Hello World
+```
+
+```tsx
+// ✅ Good
+const StyledTitle = styled.div`
+ color: red;
+`;
+```
+
+Prefix styled components with "Styled" to differentiate them from "real" components.
+
+```tsx
+// ❌ Bad
+const Title = styled.div`
+ color: red;
+`;
+```
+
+```tsx
+// ✅ Good
+const StyledTitle = styled.div`
+ color: red;
+`;
+```
+
+### Theming
+
+Utilizing the theme for the majority of component styling is the preferred approach.
+
+#### Units of measurement
+
+Avoid using `px` or `rem` values directly within the styled components. The necessary values are generally already defined in the theme, so it’s recommended to make use of the theme for these purposes.
+
+#### Colors
+
+Refrain from introducing new colors; instead, use the existing palette from the theme. Should there be a situation where the palette does not align, please leave a comment so that the team can rectify it.
+
+```tsx
+// ❌ Bad, directly specifies style values without utilizing the theme
+const StyledButton = styled.button`
+ color: #333333;
+ font-size: 1rem;
+ font-weight: 400;
+ margin-left: 4px;
+ border-radius: 50px;
+`;
+```
+
+```tsx
+// ✅ Good, utilizes the theme
+const StyledButton = styled.button`
+ color: ${({ theme }) => theme.font.color.primary};
+ font-size: ${({ theme }) => theme.font.size.md};
+ font-weight: ${({ theme }) => theme.font.weight.regular};
+ margin-left: ${({ theme }) => theme.spacing(1)};
+ border-radius: ${({ theme }) => theme.border.rounded};
+`;
+```
+
+## Enforcing No-Type Imports
+
+Avoid type imports. To enforce this standard, an ESLint rule checks for and reports any type imports. This helps maintain consistency and readability in the TypeScript code.
+
+```tsx
+// ❌ Bad
+import { type Meta, type StoryObj } from '@storybook/react';
+
+// ❌ Bad
+import type { Meta, StoryObj } from '@storybook/react';
+
+// ✅ Good
+import { Meta, StoryObj } from '@storybook/react';
+```
+
+### Why No-Type Imports
+
+* **Consistency**: By avoiding type imports and using a single approach for both type and value imports, the codebase remains consistent in its module import style.
+
+* **Readability**: No-type imports improve code readability by making it clear when you're importing values or types. This reduces ambiguity and makes it easier to understand the purpose of imported symbols.
+
+* **Maintainability**: It enhances codebase maintainability because developers can identify and locate type-only imports when reviewing or modifying code.
+
+### ESLint Rule
+
+An ESLint rule, `@typescript-eslint/consistent-type-imports`, enforces the no-type import standard. This rule will generate errors or warnings for any type import violations.
+
+Please note that this rule specifically addresses rare edge cases where unintentional type imports occur. TypeScript itself discourages this practice, as mentioned in the [TypeScript 3.8 release notes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). In most situations, you should not need to use type-only imports.
+
+To ensure your code complies with this rule, make sure to run ESLint as part of your development workflow.
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/work-with-figma.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
new file mode 100644
index 0000000000..6cffcc405e
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
@@ -0,0 +1,59 @@
+---
+title: Work with Figma
+info: Learn how you can collaborate with Twenty's Figma
+---
+
+Figma is a collaborative interface design tool that aids in bridging the communication barrier between designers and developers.
+This guide explains how you can collaborate with Figma.
+
+## Access
+
+1. **Access the shared link:** You can access the project's Figma file [here](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty).
+2. **Sign in:** If you're not already signed in, Figma will prompt you to do so.
+ Key features are only available to logged-in users, such as the developer mode and the ability to select a dedicated frame.
+
+
+ You will not be able to collaborate effectively without an account.
+
+
+## Figma structure
+
+On the left sidebar, you can access the different pages of Twenty's Figma. This is how they're organized:
+
+* **Components page:** This is the first page. The designer uses it to create and organize the reusable design elements used throughout the design file. For example, buttons, icons, symbols, or any other reusable components. It serves to maintain consistency across the design.
+* **Main page:** The second page is the main page, which shows the complete user interface of the project. You can press ***Play*** to use the full app prototype.
+* **Features pages:** The other pages are typically dedicated to features in progress. They contain the design of specific features or modules of the application or website. They are typically still in progress.
+
+## Useful Tips
+
+With read-only access, you can't edit the design, but you can access all features that will be useful to convert the designs into code.
+
+### Use the Dev mode
+
+Figma's Dev Mode enhances developers' productivity by providing easy design navigation, effective asset management, efficient communication tools, toolbox integrations, quick code snippets, and key layer information, bridging the gap between design and development. You can learn more about Dev Mode [here](https://www.figma.com/dev-mode/).
+
+Switch to the "Developer" mode in the right part of the toolbar to see design specs, copy CSS, and access assets.
+
+### Use the Prototype
+
+Click on any element on the canvas and press the “Play” button at the top right edge of the interface to access the prototype view. Prototype mode allows you to interact with the design as if it were the final product. It demonstrates the flow between screens and how interface elements like buttons, links, or menus behave when interacted with.
+
+1. **Understanding transitions and animations:** In the Prototype mode, you can view any transitions or animations added by a designer between screens or UI elements, providing clear visual instructions to developers on the intended behavior and style.
+2. **Implementation clarification:** A prototype can also help reduce ambiguities. Developers can interact with it to gain a better understanding of the functionality or appearance of particular elements.
+
+For more comprehensive details and guidance on learning the Figma platform, you can visit the official [Figma Documentation](https://help.figma.com/hc/en-us).
+
+### Measure distances
+
+Select an element, hold `Option` key (Mac) or `Alt` key (Windows), then hover over another element to see the distance between them.
+
+### Figma extension for VSCode (Recommended)
+
+[Figma for VS Code](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension)
+lets you navigate and inspect design files, collaborate with designers, track changes, and speed up implementation - all without leaving your text editor.
+It's part of our recommended extensions.
+
+## Collaboration
+
+1. **Using Comments:** You are welcome to use the comment feature by clicking on the bubble icon in the left part of the toolbar.
+2. **Cursor chat:** A nice feature of Figma is the Cursor chat. Just press `;` on Mac and `/` on Windows to send a message if you see someone else using Figma as the same time as you.
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/local-setup.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/local-setup.mdx
new file mode 100644
index 0000000000..3442846637
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/local-setup.mdx
@@ -0,0 +1,333 @@
+---
+title: Local Setup
+description: The guide for contributors (or curious developers) who want to run Twenty locally.
+---
+
+## Prerequisites
+
+
+
+ Before you can install and use Twenty, make sure you install the following on your computer:
+
+ * [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+ * [Node v24.5.0](https://nodejs.org/en/download)
+ * [yarn v4](https://yarnpkg.com/getting-started/install)
+ * [nvm](https://github.com/nvm-sh/nvm/blob/master/README.md)
+
+
+ `npm` won't work, you should use `yarn` instead. Yarn is now shipped with Node.js, so you don't need to install it separately.
+ You only have to run `corepack enable` to enable Yarn if you haven't done it yet.
+
+
+
+
+ 1. Install WSL
+ Open PowerShell as Administrator and run:
+
+ ```powershell
+ wsl --install
+ ```
+
+ You should now see a prompt to restart your computer. If not, restart it manually.
+
+ Upon restart, a powershell window will open and install Ubuntu. This may take up some time.
+ You'll see a prompt to create a username and password for your Ubuntu installation.
+
+ 2. Install and configure git
+
+ ```bash
+ sudo apt-get install git
+
+ git config --global user.name "Your Name"
+
+ git config --global user.email "youremail@domain.com"
+ ```
+
+ 3. Install nvm, node.js and yarn
+
+
+ Use `nvm` to install the correct `node` version. The `.nvmrc` ensures all contributors use the same version.
+
+
+ ```bash
+ sudo apt-get install curl
+
+ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
+ ```
+
+ Close and reopen your terminal to use nvm. Then run the following commands.
+
+ ```bash
+
+ nvm install # installs recommended node version
+
+ nvm use # use recommended node version
+
+ corepack enable
+ ```
+
+
+
+---
+
+## Step 1: Git Clone
+
+In your terminal, run the following command.
+
+
+
+ If you haven't already set up SSH keys, you can learn how to do so [here](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/about-ssh).
+
+ ```bash
+ git clone git@github.com:twentyhq/twenty.git
+ ```
+
+
+
+ ```bash
+ git clone https://github.com/twentyhq/twenty.git
+ ```
+
+
+
+## Step 2: Position yourself at the root
+
+```bash
+cd twenty
+```
+
+You should run all commands in the following steps from the root of the project.
+
+## Step 3: Set up a PostgreSQL Database
+
+
+
+ **Option 1 (preferred):** To provision your database locally:
+ Use the following link to install Postgresql on your Linux machine: [Postgresql Installation](https://www.postgresql.org/download/linux/)
+
+ ```bash
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ Note: You might need to add `sudo -u postgres` to the command before `psql` to avoid permission errors.
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+ **Option 1 (preferred):** To provision your database locally with `brew`:
+
+ ```bash
+ brew install postgresql@16
+ export PATH="/opt/homebrew/opt/postgresql@16/bin:$PATH"
+ brew services start postgresql@16
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ You can verify if the PostgreSQL server is running by executing:
+
+ ```bash
+ brew services list
+ ```
+
+ The installer might not create the `postgres` user by default when installing
+ via Homebrew on MacOS. Instead, it creates a PostgreSQL role that matches your macOS
+ username (e.g., "john").
+ To check and create the `postgres` user if necessary, follow these steps:
+
+ ```bash
+ # Connect to PostgreSQL
+ psql postgres
+ or
+ psql -U $(whoami) -d postgres
+ ```
+
+ Once at the psql prompt (postgres=#), run:
+
+ ```bash
+ # List existing PostgreSQL roles
+ \du
+ ```
+
+ You'll see output similar to:
+
+ ```bash
+ Role name | Attributes | Member of
+ -----------+-------------+-----------
+ john | Superuser | {}
+ ```
+
+ If you do not see a `postgres` role listed, proceed to the next step.
+ Create the `postgres` role manually:
+
+ ```bash
+ CREATE ROLE postgres WITH SUPERUSER LOGIN;
+ ```
+
+ This creates a superuser role named `postgres` with login access.
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+ All the following steps are to be run in the WSL terminal (within your virtual machine)
+
+ **Option 1:** To provision your Postgresql locally:
+ Use the following link to install Postgresql on your Linux virtual machine: [Postgresql Installation](https://www.postgresql.org/download/linux/)
+
+ ```bash
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ Note: You might need to add `sudo -u postgres` to the command before `psql` to avoid permission errors.
+
+ **Option 2:** If you have docker installed:
+ Running Docker on WSL adds an extra layer of complexity.
+ Only use this option if you are comfortable with the extra steps involved, including turning on [Docker Desktop WSL2](https://docs.docker.com/desktop/wsl).
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+You can now access the database at [localhost:5432](localhost:5432), with user `postgres` and password `postgres` .
+
+## Step 4: Set up a Redis Database (cache)
+
+Twenty requires a redis cache to provide the best performance
+
+
+
+ **Option 1:** To provision your Redis locally:
+ Use the following link to install Redis on your Linux machine: [Redis Installation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+ **Option 1 (preferred):** To provision your Redis locally with `brew`:
+
+ ```bash
+ brew install redis
+ ```
+
+ Start your redis server:
+ `brew services start redis`
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+ **Option 1:** To provision your Redis locally:
+ Use the following link to install Redis on your Linux virtual machine: [Redis Installation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+If you need a Client GUI, we recommend [redis insight](https://redis.io/insight/) (free version available)
+
+## Step 5: Setup environment variables
+
+Use environment variables or `.env` files to configure your project. More info [here](/l/fr/developers/self-host/capabilities/setup)
+
+Copy the `.env.example` files in `/front` and `/server`:
+
+```bash
+cp ./packages/twenty-front/.env.example ./packages/twenty-front/.env
+cp ./packages/twenty-server/.env.example ./packages/twenty-server/.env
+```
+
+
+ **Multi-Workspace Mode:** By default, Twenty runs in single-workspace mode where only one workspace can be created. To enable multi-workspace support (useful for testing subdomain-based features), set `IS_MULTIWORKSPACE_ENABLED=true` in your server `.env` file. See [Multi-Workspace Mode](/l/fr/developers/self-host/capabilities/setup#multi-workspace-mode) for details.
+
+
+## Step 6: Installing dependencies
+
+To build Twenty server and seed some data into your database, run the following command:
+
+```bash
+yarn
+```
+
+Note that `npm` or `pnpm` won't work
+
+## Step 7: Running the project
+
+
+
+ Depending on your Linux distribution, Redis server might be started automatically.
+ If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro.
+
+
+
+ Redis should already be running. If not, run:
+
+ ```bash
+ brew services start redis
+ ```
+
+
+
+ Depending on your Linux distribution, Redis server might be started automatically.
+ If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro.
+
+
+
+Set up your database with the following command:
+
+```bash
+npx nx database:reset twenty-server
+```
+
+Start the server, the worker and the frontend services:
+
+```bash
+npx nx start twenty-server
+npx nx worker twenty-server
+npx nx start twenty-front
+```
+
+Alternatively, you can start all services at once:
+
+```bash
+npx nx start
+```
+
+## Step 8: Use Twenty
+
+**Frontend**
+
+Twenty's frontend will be running at [http://localhost:3001](http://localhost:3001).
+You can log in using the default demo account: `tim@apple.dev` (password: `tim@apple.dev`)
+
+**Backend**
+
+* Twenty's server will be up and running at [http://localhost:3000](http://localhost:3000)
+* The GraphQL API can be accessed at [http://localhost:3000/graphql](http://localhost:3000/graphql)
+* The REST API can be reached at [http://localhost:3000/rest](http://localhost:3000/rest)
+
+## Troubleshooting
+
+If you encounter any problem, check [Troubleshooting](/l/fr/developers/self-host/capabilities/troubleshooting) for solutions.
diff --git a/packages/twenty-docs/l/fr/developers/contribute/contribute.mdx b/packages/twenty-docs/l/fr/developers/contribute/contribute.mdx
new file mode 100644
index 0000000000..0376097fc1
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/contribute.mdx
@@ -0,0 +1,32 @@
+---
+title: Contribute
+description: Contribute to Twenty's open-source development.
+---
+
+
+
+
+
+## Overview
+
+Twenty is open-source and welcomes contributions from the community. Whether you're fixing bugs, adding features, or improving documentation, your contributions help make Twenty better for everyone.
+
+## Ways to Contribute
+
+* **Report bugs**: Help identify and document issues
+* **Submit features**: Propose and implement new functionality
+* **Improve documentation**: Make our docs clearer and more helpful
+* **Frontend development**: Work on the React-based UI
+* **Backend development**: Contribute to the NestJS server
+
+## Getting Started
+
+
+
+ Report issues or request features
+
+
+
+ Contribute to the UI
+
+
diff --git a/packages/twenty-docs/l/fr/developers/extend/capabilities/apis.mdx b/packages/twenty-docs/l/fr/developers/extend/capabilities/apis.mdx
new file mode 100644
index 0000000000..650449eb85
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/extend/capabilities/apis.mdx
@@ -0,0 +1,147 @@
+---
+title: APIs
+description: Query and modify your CRM data programmatically using REST or GraphQL.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Twenty was built to be developer-friendly, offering powerful APIs that adapt to your custom data model. We provide four distinct API types to meet different integration needs.
+
+## Developer-First Approach
+
+Twenty generates APIs specifically for your data model:
+
+* **No long IDs required**: Use your object and field names directly in endpoints
+* **Standard and custom objects treated equally**: Your custom objects get the same API treatment as built-in ones
+* **Dedicated endpoints**: Each object and field gets its own API endpoint
+* **Custom documentation**: Generated specifically for your workspace's data model
+
+
+ Your personalized API documentation is available under **Settings → API & Webhooks** after creating an API key. Since Twenty generates APIs that match your custom data model, the documentation is unique to your workspace.
+
+
+## The Two API Types
+
+### Core API
+
+Accessed on `/rest/` or `/graphql/`
+
+Work with your actual **records** (the data):
+
+* Create, read, update, delete People, Companies, Opportunities, etc.
+* Query and filter data
+* Manage record relationships
+
+### Metadata API
+
+Accessed on `/rest/metadata/` or `/metadata/`
+
+Manage your **workspace and data model**:
+
+* Create, modify, or delete objects and fields
+* Configure workspace settings
+* Define relationships between objects
+
+## REST vs GraphQL
+
+Both Core and Metadata APIs are available in REST and GraphQL formats:
+
+| Format | Available Operations |
+| ----------- | ---------------------------------------------------------- |
+| **REST** | CRUD, batch operations, upserts |
+| **GraphQL** | Same + **batch upserts**, relationship queries in one call |
+
+Choose based on your needs — both formats access the same data.
+
+## API Endpoints
+
+| Environment | Base URL |
+| --------------- | ------------------------- |
+| **Cloud** | `https://api.twenty.com/` |
+| **Self-Hosted** | `https://{your-domain}/` |
+
+## Authentication
+
+Every API request requires an API key in the header:
+
+```
+Authorization: Bearer YOUR_API_KEY
+```
+
+### Create an API Key
+
+1. Go to **Settings → APIs & Webhooks**
+2. Click **+ Create key**
+3. Configure:
+ * **Name**: Descriptive name for the key
+ * **Expiration Date**: When the key expires
+4. Click **Save**
+5. **Copy immediately** — the key is only shown once
+
+
+
+
+ Your API key grants access to sensitive data. Don't share it with untrusted services. If compromised, disable it immediately and generate a new one.
+
+
+### Assign a Role to an API Key
+
+For better security, assign a specific role to limit access:
+
+1. Go to **Settings → Roles**
+2. Click on the role to assign
+3. Open the **Assignment** tab
+4. Under **API Keys**, click **+ Assign to API key**
+5. Select the API key
+
+The key will inherit that role's permissions. See [Permissions](/l/fr/user-guide/permissions-access/capabilities/permissions) for details.
+
+### Manage API Keys
+
+**Regenerate**: Settings → APIs & Webhooks → Click key → **Regenerate**
+
+**Delete**: Settings → APIs & Webhooks → Click key → **Delete**
+
+## API Playground
+
+Test your APIs directly in the browser with our built-in playground — available for both **REST** and **GraphQL**.
+
+### Access the Playground
+
+1. Go to **Settings → APIs & Webhooks**
+2. Create an API key (required)
+3. Click on **REST API** or **GraphQL API** to open the playground
+
+### What You Get
+
+* **Interactive documentation**: Generated for your specific data model
+* **Live testing**: Execute real API calls against your workspace
+* **Schema explorer**: Browse available objects, fields, and relationships
+* **Request builder**: Construct queries with autocomplete
+
+The playground reflects your custom objects and fields, so documentation is always accurate for your workspace.
+
+## Batch Operations
+
+Both REST and GraphQL support batch operations:
+
+* **Batch size**: Up to 60 records per request
+* **Operations**: Create, update, delete multiple records
+
+**GraphQL-only features:**
+
+* **Batch Upsert**: Create or update in one call
+* Use plural object names (e.g., `CreateCompanies` instead of `CreateCompany`)
+
+## Rate Limits
+
+API requests are throttled to ensure platform stability:
+
+| Limit | Value |
+| -------------- | -------------------- |
+| **Requests** | 100 calls per minute |
+| **Batch size** | 60 records per call |
+
+
+ Use batch operations to maximize throughput — process up to 60 records in a single API call instead of making individual requests.
+
diff --git a/packages/twenty-docs/l/fr/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/fr/developers/extend/capabilities/apps.mdx
new file mode 100644
index 0000000000..dc528fa780
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/extend/capabilities/apps.mdx
@@ -0,0 +1,522 @@
+---
+title: Twenty Apps
+description: Build and manage Twenty customizations as code.
+---
+
+
+ Apps are currently in alpha testing. The feature is functional but still evolving.
+
+
+## What Are Apps?
+
+Apps let you build and manage Twenty customizations **as code**. Instead of configuring everything through the UI, you define your data model and serverless functions in code — making it faster to build, maintain, and roll out to multiple workspaces.
+
+**What you can do today:**
+
+* Define custom objects and fields as code (managed data model)
+* Build serverless functions with custom triggers
+* Deploy the same app across multiple workspaces
+
+**Coming soon:**
+
+* Custom UI layouts and components
+
+## Prerequisites
+
+* Node.js 24+ and Yarn 4
+* A Twenty workspace and an API key (create one at https://app.twenty.com/settings/api-webhooks)
+
+## Getting Started
+
+Create a new app using the official scaffolder, then authenticate and start developing:
+
+```bash filename="Terminal"
+# Scaffold a new app
+npx create-twenty-app@latest my-twenty-app
+cd my-twenty-app
+
+# Authenticate using your API key (you'll be prompted)
+yarn auth
+
+# Start dev mode: automatically syncs local changes to your workspace
+yarn dev
+```
+
+From here you can:
+
+```bash filename="Terminal"
+# Add a new entity to your application (guided)
+yarn create-entity
+
+# Generate a typed Twenty client and workspace entity types
+yarn generate
+
+# Run a one‑time sync (instead of watch mode)
+yarn sync
+
+# Watch your application's functions logs
+yarn logs
+
+# Uninstall the application from the current workspace
+yarn uninstall
+
+# Display commands' help
+yarn help
+```
+
+See also: the CLI reference pages for [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) and [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk).
+
+## Project structure (scaffolded)
+
+When you run `npx create-twenty-app@latest my-twenty-app`, the scaffolder:
+
+* Copies a minimal base application into `my-twenty-app/`
+* Adds a local `twenty-sdk` dependency and Yarn 4 configuration
+* Creates config files and scripts wired to the `twenty` CLI
+* Generates a default application config and a default function role
+
+A freshly scaffolded app looks like this:
+
+```text filename="my-twenty-app/"
+my-twenty-app/
+ package.json
+ yarn.lock
+ .gitignore
+ .nvmrc
+ .yarnrc.yml
+ .yarn/
+ releases/
+ yarn-4.9.2.cjs
+ install-state.gz
+ eslint.config.mjs
+ tsconfig.json
+ README.md
+ src/
+ application.config.ts
+ role.config.ts
+ // your entities, actions, and other app files
+```
+
+At a high level:
+
+* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall`, and `auth` that delegate to the local `twenty` CLI.
+* **.gitignore**: Ignores common artifacts such as `node_modules`, `.yarn`, `generated/` (typed client), `dist/`, `build/`, coverage folders, log files, and `.env*` files.
+* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Lock and configure the Yarn 4 toolchain used by the project.
+* **.nvmrc**: Pins the Node.js version expected by the project.
+* **eslint.config.mjs** and **tsconfig.json**: Provide linting and TypeScript configuration for your app’s TypeScript sources.
+* **README.md**: A short README in the app root with basic instructions.
+* **src/**: The main place where you define your application-as-code:
+ * `application.config.ts`: Global configuration for your app (metadata and runtime wiring). See “Application config” below.
+ * `role.config.ts`: Default function role used by your serverless functions. See “Default function role” below.
+ * Future entities, actions/functions, and any supporting code you add.
+
+Later commands will add more files and folders:
+
+* `yarn generate` will create a `generated/` folder (typed Twenty client + workspace types).
+* `yarn create-entity` will add entity definition files under `src/` for your custom objects.
+
+## Authentication
+
+The first time you run `yarn auth`, you'll be prompted for:
+
+* API URL (defaults to http://localhost:3000 or your current workspace profile)
+* API key
+
+Your credentials are stored per-user in `~/.twenty/config.json`. You can maintain multiple profiles and switch using `--workspace `.
+
+Examples:
+
+```bash filename="Terminal"
+# Login interactively (recommended)
+yarn auth
+
+# Use a specific workspace profile
+yarn auth --workspace my-custom-workspace
+```
+
+## Use the SDK resources (types & config)
+
+The twenty-sdk provides typed building blocks you use inside your app. Below are the key pieces you'll touch most often.
+
+### Defining objects
+
+Custom objects are regular TypeScript classes annotated with decorators from `twenty-sdk`. They live under `src/objects/` in your app and describe both schema and behavior for records in your workspace.
+
+Here is an example `postCard` object from the Hello World app:
+
+```typescript
+import { type Note } from '../../generated';
+
+import {
+ type AddressField,
+ Field,
+ FieldType,
+ type FullNameField,
+ Object,
+ OnDeleteAction,
+ Relation,
+ RelationType,
+ STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS,
+} from 'twenty-sdk';
+
+enum PostCardStatus {
+ DRAFT = 'DRAFT',
+ SENT = 'SENT',
+ DELIVERED = 'DELIVERED',
+ RETURNED = 'RETURNED',
+}
+
+@Object({
+ universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05',
+ nameSingular: 'postCard',
+ namePlural: 'postCards',
+ labelSingular: 'Post card',
+ labelPlural: 'Post cards',
+ description: ' A post card object',
+ icon: 'IconMail',
+})
+export class PostCard {
+ @Field({
+ universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b',
+ type: FieldType.TEXT,
+ label: 'Content',
+ description: "Postcard's content",
+ icon: 'IconAbc',
+ })
+ content: string;
+
+ @Field({
+ universalIdentifier: 'c6aa31f3-da76-4ac6-889f-475e226009ac',
+ type: FieldType.FULL_NAME,
+ label: 'Recipient name',
+ icon: 'IconUser',
+ })
+ recipientName: FullNameField;
+
+ @Field({
+ universalIdentifier: '95045777-a0ad-49ec-98f9-22f9fc0c8266',
+ type: FieldType.ADDRESS,
+ label: 'Recipient address',
+ icon: 'IconHome',
+ })
+ recipientAddress: AddressField;
+
+ @Field({
+ universalIdentifier: '87b675b8-dd8c-4448-b4ca-20e5a2234a1e',
+ type: FieldType.SELECT,
+ label: 'Status',
+ icon: 'IconSend',
+ defaultValue: `'${PostCardStatus.DRAFT}'`,
+ options: [
+ { value: PostCardStatus.DRAFT, label: 'Draft', position: 0, color: 'gray' },
+ { value: PostCardStatus.SENT, label: 'Sent', position: 1, color: 'orange' },
+ { value: PostCardStatus.DELIVERED, label: 'Delivered', position: 2, color: 'green' },
+ { value: PostCardStatus.RETURNED, label: 'Returned', position: 3, color: 'orange' },
+ ],
+ })
+ status: PostCardStatus;
+
+ @Relation({
+ universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe',
+ type: RelationType.ONE_TO_MANY,
+ label: 'Notes',
+ icon: 'IconComment',
+ inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note,
+ onDelete: OnDeleteAction.CASCADE,
+ })
+ notes: Note[];
+
+ @Field({
+ universalIdentifier: 'e06abe72-5b44-4e7f-93be-afc185a3c433',
+ type: FieldType.DATE_TIME,
+ label: 'Delivered at',
+ icon: 'IconCheck',
+ isNullable: true,
+ defaultValue: null,
+ })
+ deliveredAt?: Date;
+}
+```
+
+Key points:
+
+* The `@Object` decorator defines the object identity and labels used across the workspace; its `universalIdentifier` must be unique and stable across deployments.
+* Each `@Field` decorator defines a field on the object with a type, label, and its own stable `universalIdentifier`.
+* `@Relation` wires this object to other objects (standard or custom) and controls cascade behavior with `onDelete`.
+* You can scaffold new objects using `yarn create-entity`, which guides you through naming, fields, and relationships, then generates object files similar to the `postCard` example.
+
+### Application config (application.config.ts)
+
+Every app has a single `application.config.ts` file that describes:
+
+* **Who the app is**: identifiers, display name, and description.
+* **How its functions run**: which role they use for permissions.
+* **(Optional) variables**: key–value pairs exposed to your functions as environment variables.
+
+When you scaffold a new app, you start with a minimal config:
+
+```typescript
+import { type ApplicationConfig } from 'twenty-sdk';
+
+const config: ApplicationConfig = {
+ universalIdentifier: '',
+ displayName: 'My Twenty App',
+ description: 'My first Twenty app',
+ functionRoleUniversalIdentifier: '',
+};
+
+export default config;
+```
+
+You can gradually extend this file as your app grows. For example, you can add an icon and application-scoped variables:
+
+```typescript
+import { type ApplicationConfig } from 'twenty-sdk';
+
+const config: ApplicationConfig = {
+ universalIdentifier: '',
+ displayName: 'My App',
+ description: 'What your app does',
+ icon: 'IconWorld', // Choose an icon by name
+ applicationVariables: {
+ DEFAULT_RECIPIENT_NAME: {
+ universalIdentifier: '',
+ description: 'Default recipient used by functions',
+ value: 'Jane Doe',
+ isSecret: false,
+ },
+ },
+ functionRoleUniversalIdentifier: '',
+};
+
+export default config;
+```
+
+Notes:
+
+* `universalIdentifier` fields are deterministic IDs you own; generate them once and keep them stable across syncs.
+* `applicationVariables` become environment variables for your functions (for example, `DEFAULT_RECIPIENT_NAME` is available as `process.env.DEFAULT_RECIPIENT_NAME`).
+* `functionRoleUniversalIdentifier` must match the role you define in `role.config.ts` (see below).
+
+#### Roles and permissions
+
+Applications can define roles that encapsulate permissions on your workspace’s objects and actions. The field `functionRoleUniversalIdentifier` in `application.config.ts` designates the default role used by your app’s serverless functions.
+
+* The runtime API key injected as `TWENTY_API_KEY` is derived from this default function role.
+* The typed client will be restricted to the permissions granted to that role.
+* Follow least‑privilege: create a dedicated role with only the permissions your functions need, then reference its universal identifier.
+
+##### Default function role (role.config.ts)
+
+When you scaffold a new app, the CLI also creates `src/role.config.ts`. This file exports the default role your serverless functions will use at runtime:
+
+```typescript
+import { PermissionFlag, type RoleConfig } from 'twenty-sdk';
+
+export const functionRole: RoleConfig = {
+ universalIdentifier: '',
+ label: 'My Twenty App default function role',
+ description: 'My Twenty App default function role',
+ canReadAllObjectRecords: true,
+ canUpdateAllObjectRecords: true,
+ canSoftDeleteAllObjectRecords: true,
+ canDestroyAllObjectRecords: false,
+};
+```
+
+The `universalIdentifier` of this role is automatically wired into `application.config.ts` as `functionRoleUniversalIdentifier`. In other words:
+
+* **role.config.ts** defines what the default function role can do.
+* **application.config.ts** points to that role so your functions inherit its permissions.
+
+As you move beyond the initial scaffold, you should tighten this role and make it explicit about what it can access. A more production-ready role might look closer to:
+
+```typescript
+import { PermissionFlag, type RoleConfig } from 'twenty-sdk';
+
+export const functionRole: RoleConfig = {
+ universalIdentifier: '',
+ label: 'Default function role',
+ description: 'Default role for function Twenty client',
+ canReadAllObjectRecords: false,
+ canUpdateAllObjectRecords: false,
+ canSoftDeleteAllObjectRecords: false,
+ canDestroyAllObjectRecords: false,
+ canUpdateAllSettings: false,
+ canBeAssignedToAgents: false,
+ canBeAssignedToUsers: false,
+ canBeAssignedToApiKeys: false,
+ objectPermissions: [
+ {
+ objectNameSingular: 'postCard',
+ canReadObjectRecords: true,
+ canUpdateObjectRecords: true,
+ canSoftDeleteObjectRecords: false,
+ canDestroyObjectRecords: false,
+ },
+ ],
+ fieldPermissions: [
+ {
+ objectNameSingular: 'postCard',
+ fieldName: 'content',
+ canReadFieldValue: false,
+ canUpdateFieldValue: false,
+ },
+ ],
+ permissionFlags: ['APPLICATIONS'],
+};
+```
+
+Notes:
+
+* Start from the scaffolded role, then progressively restrict it following least‑privilege.
+* Replace the `objectPermissions` and `fieldPermissions` with the objects/fields your functions need.
+* `permissionFlags` control access to platform-level capabilities. Keep them minimal; add only what you need.
+* See a working example in the Hello World app: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
+
+### Serverless function config and entrypoint
+
+Each function exports a main handler and a config describing its triggers. You can mix multiple trigger types.
+
+```typescript
+// src/actions/create-new-post-card.ts
+import type {
+ FunctionConfig,
+ DatabaseEventPayload,
+ ObjectRecordCreateEvent,
+ CronPayload,
+} from 'twenty-sdk';
+import Twenty, { type Person } from '../generated';
+
+// main handler can accept parameters from route, cron, or database events
+export const main = async (
+ params:
+ | { name?: string }
+ | DatabaseEventPayload>
+ | CronPayload,
+) => {
+ const client = new Twenty(); // generated typed client
+ const name = 'name' in params
+ ? params.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world'
+ : 'Hello world';
+
+ const result = await client.mutation({
+ createPostCard: {
+ __args: { data: { name } },
+ id: true,
+ name: true,
+ },
+ });
+ return result;
+};
+
+export const config: FunctionConfig = {
+ universalIdentifier: '',
+ name: 'create-new-post-card',
+ timeoutSeconds: 2,
+ triggers: [
+ // Public HTTP route trigger '/s/post-card/create'
+ {
+ universalIdentifier: '',
+ type: 'route',
+ path: '/post-card/create',
+ httpMethod: 'GET',
+ isAuthRequired: false,
+ },
+ // Cron trigger (CRON pattern)
+ {
+ universalIdentifier: '',
+ type: 'cron',
+ pattern: '0 0 1 1 *',
+ },
+ // Database event trigger
+ {
+ universalIdentifier: '',
+ type: 'databaseEvent',
+ eventName: 'person.created',
+ },
+ ],
+};
+```
+
+Common trigger types:
+
+* route: Exposes your function on an HTTP path and method **under the `/s/` endpoint**:
+
+> e.g. `path: '/post-card/create',` -> call on `/s/post-card/create`
+
+* cron: Runs your function on a schedule using a CRON expression.
+* databaseEvent: Runs on workspace object lifecycle events
+
+> e.g. `person.created`
+
+You can create new functions in two ways:
+
+* **Scaffolded**: Run `yarn create-entity --path ` and choose the option to add a new function. This generates a starter file under `` with a `main` handler and a `config` block similar to the example above.
+* **Manual**: Create a new file and export `main` and `config` yourself, following the same pattern.
+
+### Generated typed client
+
+Run yarn generate to create a local typed client in generated/ based on your workspace schema. Use it in your functions:
+
+```typescript
+import Twenty from './generated';
+
+const client = new Twenty();
+const { me } = await client.query({ me: { id: true, displayName: true } });
+```
+
+The client is re-generated by `yarn generate`. Re-run after changing your objects and `yarn sync` or when onboarding to a new workspace.
+
+#### Runtime credentials in serverless functions
+
+When your function runs on Twenty, the platform injects credentials as environment variables before your code executes:
+
+* `TWENTY_API_URL`: Base URL of the Twenty API your app targets.
+* `TWENTY_API_KEY`: Short‑lived key scoped to your application’s default function role.
+
+Notes:
+
+* You do not need to pass URL or API key to the generated client. It reads `TWENTY_API_URL` and `TWENTY_API_KEY` from process.env at runtime.
+* The API key’s permissions are determined by the role referenced in your `application.config.ts` via `functionRoleUniversalIdentifier`. This is the default role used by serverless functions of your application.
+* Applications can define roles to follow least‑privilege. Grant only the permissions your functions need, then point `functionRoleUniversalIdentifier` to that role’s universal identifier.
+
+### Hello World example
+
+Explore a minimal, end-to-end example that demonstrates objects, functions, and multiple triggers [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps/hello-world):
+
+## Manual setup (without the scaffolder)
+
+While we recommend using `create-twenty-app` for the best getting-started experience, you can also set up a project manually. Do not install the CLI globally. Instead, add `twenty-sdk` as a local dependency and wire scripts in your package.json:
+
+```bash filename="Terminal"
+yarn add -D twenty-sdk
+```
+
+Then add scripts like these:
+
+```json filename="package.json"
+{
+ "scripts": {
+ "auth": "twenty auth login",
+ "generate": "twenty app generate",
+ "dev": "twenty app dev",
+ "sync": "twenty app sync",
+ "uninstall": "twenty app uninstall",
+ "logs": "twenty app logs",
+ "create-entity": "twenty app add",
+ "help": "twenty --help"
+ }
+}
+```
+
+Now you can run the same commands via Yarn, e.g. `yarn dev`, `yarn sync`, etc.
+
+## Troubleshooting
+
+* Authentication errors: run `yarn auth` and ensure your API key has the required permissions.
+* Cannot connect to server: verify the API URL and that the Twenty server is reachable.
+* Types or client missing/outdated: run `yarn generate` and then `yarn dev`.
+* Dev mode not syncing: ensure `yarn dev` is running and that changes are not ignored by your environment.
+
+Discord Help Channel: https://discord.com/channels/1130383047699738754/1130386664812982322
diff --git a/packages/twenty-docs/l/fr/developers/extend/capabilities/webhooks.mdx b/packages/twenty-docs/l/fr/developers/extend/capabilities/webhooks.mdx
new file mode 100644
index 0000000000..5e41cb2d6e
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/extend/capabilities/webhooks.mdx
@@ -0,0 +1,112 @@
+---
+title: Webhooks
+description: Receive real-time notifications when events occur in your CRM.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Webhooks push data to your systems in real-time when events occur in Twenty — no polling required. Use them to keep external systems in sync, trigger automations, or send alerts.
+
+## Create a Webhook
+
+1. Go to **Settings → APIs & Webhooks → Webhooks**
+2. Click **+ Create webhook**
+3. Enter your webhook URL (must be publicly accessible)
+4. Click **Save**
+
+The webhook activates immediately and starts sending notifications.
+
+
+
+### Manage Webhooks
+
+**Edit**: Click the webhook → Update URL → **Save**
+
+**Delete**: Click the webhook → **Delete** → Confirm
+
+## Events
+
+Twenty sends webhooks for these event types:
+
+| Event | Example |
+| ------------------ | ---------------------------------------------------------- |
+| **Record Created** | `person.created`, `company.created`, `note.created` |
+| **Record Updated** | `person.updated`, `company.updated`, `opportunity.updated` |
+| **Record Deleted** | `person.deleted`, `company.deleted` |
+
+All event types are sent to your webhook URL. Event filtering may be added in future releases.
+
+## Payload Format
+
+Each webhook sends an HTTP POST with a JSON body:
+
+```json
+{
+ "event": "person.created",
+ "data": {
+ "id": "abc12345",
+ "firstName": "Alice",
+ "lastName": "Doe",
+ "email": "alice@example.com",
+ "createdAt": "2025-02-10T15:30:45Z",
+ "createdBy": "user_123"
+ },
+ "timestamp": "2025-02-10T15:30:50Z"
+}
+```
+
+| Field | Description |
+| ----------- | ------------------------------------------------ |
+| `event` | What happened (e.g., `person.created`) |
+| `data` | The full record that was created/updated/deleted |
+| `timestamp` | When the event occurred (UTC) |
+
+
+ Respond with a **2xx HTTP status** (200-299) to acknowledge receipt. Non-2xx responses are logged as delivery failures.
+
+
+## Webhook Validation
+
+Twenty signs each webhook request for security. Validate signatures to ensure requests are authentic.
+
+### Headers
+
+| Header | Description |
+| ---------------------------- | --------------------- |
+| `X-Twenty-Webhook-Signature` | HMAC SHA256 signature |
+| `X-Twenty-Webhook-Timestamp` | Request timestamp |
+
+### Validation Steps
+
+1. Get the timestamp from `X-Twenty-Webhook-Timestamp`
+2. Create the string: `{timestamp}:{JSON payload}`
+3. Compute HMAC SHA256 using your webhook secret
+4. Compare with `X-Twenty-Webhook-Signature`
+
+### Example (Node.js)
+
+```javascript
+const crypto = require("crypto");
+
+const timestamp = req.headers["x-twenty-webhook-timestamp"];
+const payload = JSON.stringify(req.body);
+const secret = "your-webhook-secret";
+
+const stringToSign = `${timestamp}:${payload}`;
+const expectedSignature = crypto
+ .createHmac("sha256", secret)
+ .update(stringToSign)
+ .digest("hex");
+
+const isValid = expectedSignature === req.headers["x-twenty-webhook-signature"];
+```
+
+## Webhooks vs Workflows
+
+| Method | Direction | Use Case |
+| ---------------------------- | --------- | ---------------------------------------------------------- |
+| **Webhooks** | OUT | Automatically notify external systems of any record change |
+| **Workflow + HTTP Request** | OUT | Send data out with custom logic (filters, transformations) |
+| **Workflow Webhook Trigger** | IN | Receive data into Twenty from external systems |
+
+For receiving external data, see [Set Up a Webhook Trigger](/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger).
diff --git a/packages/twenty-docs/l/fr/developers/extend/extend.mdx b/packages/twenty-docs/l/fr/developers/extend/extend.mdx
new file mode 100644
index 0000000000..b20f91c3ee
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/extend/extend.mdx
@@ -0,0 +1,34 @@
+---
+title: Extend
+description: Extend Twenty's functionality with APIs, webhooks, and custom apps.
+---
+
+
+
+
+
+## Overview
+
+Twenty is designed to be extensible. Use our APIs, webhooks, and app framework to integrate with your existing tools and build custom functionality.
+
+## What You Can Do
+
+* **APIs**: Query and modify your CRM data programmatically using REST or GraphQL
+* **Webhooks**: Receive real-time notifications when events occur in Twenty
+* **Apps**: Build custom applications that extend Twenty's capabilities - Coming soon!
+
+## Getting Started
+
+
+
+ Connect to Twenty programmatically
+
+
+
+ Get notified of events in real-time
+
+
+
+ Build customizations as code (Alpha)
+
+
diff --git a/packages/twenty-docs/l/fr/developers/introduction.mdx b/packages/twenty-docs/l/fr/developers/introduction.mdx
new file mode 100644
index 0000000000..f738cb27fa
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/introduction.mdx
@@ -0,0 +1,23 @@
+---
+title: Getting Started
+description: Welcome to Twenty Developer Documentation, your resources for extending, self-hosting, and contributing to Twenty.
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+
+
+ Extend
+ Build integrations with APIs, webhooks, and custom apps.
+
+
+
+ Self-Host
+ Deploy and manage Twenty on your own infrastructure.
+
+
+
+ Contribute
+ Join our open-source community and contribute to Twenty.
+
+
diff --git a/packages/twenty-docs/l/fr/developers/self-host/capabilities/cloud-providers.mdx b/packages/twenty-docs/l/fr/developers/self-host/capabilities/cloud-providers.mdx
index cc975ad41e..809388612a 100644
--- a/packages/twenty-docs/l/fr/developers/self-host/capabilities/cloud-providers.mdx
+++ b/packages/twenty-docs/l/fr/developers/self-host/capabilities/cloud-providers.mdx
@@ -1,45 +1,45 @@
---
-title: Autres méthodes
+title: Other methods
---
- Ce document est maintenu par la communauté. Il pourrait contenir des problèmes.
+ This document is maintained by the community. It might contain issues.
-## Kubernetes via Terraform et Manifests
+## Kubernetes via Terraform and Manifests
-La documentation communautaire pour le déploiement de Kubernetes est disponible [ici](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s)
+Community-led documentation for Kubernetes deployment is available [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s)
### Coolify
-Déployer Twenty sur les serveurs avec Coolify. (l'image officielle sur Coolify sera bientôt disponible)
+Deploy Twenty on servers using Coolify. (official image on Coolify will be available soon)
-[Documentation Coolify](https://coolify.io/docs/get-started/introduction)
+[Coolify documentation](https://coolify.io/docs/get-started/introduction)
### EasyPanel
-Déployez Twenty sur EasyPanel avec le modèle maintenu par la communauté ci-dessous.
+Deploy Twenty on EasyPanel with the community maintained template below.
-[Déployer sur EasyPanel](https://easypanel.io/docs/templates/twenty)
+[Deploy on EasyPanel](https://easypanel.io/docs/templates/twenty)
### Elest.io
-Déployez Twenty sur les serveurs avec Elest.io en utilisant le lien ci-dessous.
+Deploy Twenty on servers with Elest.io using link below.
-[Déployer sur Elest.io](https://elest.io/open-source/twenty)
+[Deploy on Elest.io](https://elest.io/open-source/twenty)
-### Twenty sur Railway
+### Twenty on Railway
-Déployez Twenty sur Railway avec le modèle maintenu par la communauté ci-dessous.
+Deploy Twenty on Railway with the community maintained template below.
-[](https://railway.com/deploy/nAL3hA)
+[](https://railway.com/deploy/nAL3hA)
-### Twenty sur Sealos
+### Twenty on Sealos
-Déployez Twenty sur Sealos avec le modèle maintenu par la communauté ci-dessous.
+Deploy Twenty on Sealos with the community maintained template below.
-[](https://sealos.io/products/app-store/twenty)
+[](https://sealos.io/products/app-store/twenty)
-## Autres
+## Others
-N'hésitez pas à ouvrir une PR pour ajouter d'autres options de fournisseur cloud.
+Please feel free to Open a PR to add more Cloud Provider options.
diff --git a/packages/twenty-docs/l/fr/developers/self-host/capabilities/docker-compose.mdx b/packages/twenty-docs/l/fr/developers/self-host/capabilities/docker-compose.mdx
new file mode 100644
index 0000000000..b48b461f20
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/self-host/capabilities/docker-compose.mdx
@@ -0,0 +1,253 @@
+---
+title: 1-Click w/ Docker Compose
+---
+
+
+ Docker containers are for production hosting or self-hosting, for the contribution please check the [Local Setup](/l/fr/developers/contribute/capabilities/local-setup).
+
+
+## Overview
+
+This guide provides step-by-step instructions to install and configure the Twenty application using Docker Compose. The aim is to make the process straightforward and prevent common pitfalls that could break your setup.
+
+**Important:** Only modify settings explicitly mentioned in this guide. Altering other configurations may lead to issues.
+
+See docs [Setup Environment Variables](/l/fr/developers/self-host/capabilities/setup) for advanced configuration. All environment variables must be declared in the docker-compose.yml file at the server and / or worker level depending on the variable.
+
+## System Requirements
+
+* RAM: Ensure your environment has at least 2GB of RAM. Insufficient memory can cause processes to crash.
+* Docker & Docker Compose: Make sure both are installed and up-to-date.
+
+## Option 1: One-line script
+
+Install the latest stable version of Twenty with a single command:
+
+```bash
+bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
+```
+
+To install a specific version or branch:
+
+```bash
+VERSION=vx.y.z BRANCH=branch-name bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
+```
+
+* Replace x.y.z with the desired version number.
+* Replace branch-name with the name of the branch you want to install.
+
+## Option 2: Manual steps
+
+Follow these steps for a manual setup.
+
+### Step 1: Set Up the Environment File
+
+1. **Create the .env File**
+
+ Copy the example environment file to a new .env file in your working directory:
+
+ ```bash
+ curl -o .env https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/.env.example
+ ```
+
+2. **Generate Secret Tokens**
+
+ Run the following command to generate a unique random string:
+
+ ```bash
+ openssl rand -base64 32
+ ```
+
+ **Important:** Keep this value secret / do not share it.
+
+3. **Update the `.env`**
+
+ Replace the placeholder value in your .env file with the generated token:
+
+ ```ini
+ APP_SECRET=first_random_string
+ ```
+
+4. **Set the Postgres Password**
+
+ Update the `PG_DATABASE_PASSWORD` value in the .env file with a strong password without special characters.
+
+ ```ini
+ PG_DATABASE_PASSWORD=my_strong_password
+ ```
+
+### Step 2: Obtain the Docker Compose File
+
+Download the `docker-compose.yml` file to your working directory:
+
+```bash
+curl -o docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/docker-compose.yml
+```
+
+### Step 3: Launch the Application
+
+Start the Docker containers:
+
+```bash
+docker compose up -d
+```
+
+### Step 4: Access the Application
+
+If you host twentyCRM on your own computer, open your browser and navigate to [http://localhost:3000](http://localhost:3000).
+
+If you host it on a server, check that the server is running and that everything is ok with
+
+```bash
+curl http://localhost:3000
+```
+
+## Configuration
+
+### Expose Twenty to External Access
+
+By default, Twenty runs on `localhost` at port `3000`. To access it via an external domain or IP address, you need to configure the `SERVER_URL` in your `.env` file.
+
+#### Understanding `SERVER_URL`
+
+* **Protocol:** Use `http` or `https` depending on your setup.
+ * Use `http` if you haven't set up SSL.
+ * Use `https` if you have SSL configured.
+* **Domain/IP:** This is the domain name or IP address where your application is accessible.
+* **Port:** Include the port number if you're not using the default ports (`80` for `http`, `443` for `https`).
+
+### SSL Requirements
+
+SSL (HTTPS) is required for certain browser features to work properly. While these features might work during local development (as browsers treat localhost differently), a proper SSL setup is needed when hosting Twenty on a regular domain.
+
+For example, the clipboard API might require a secure context - some features like copy buttons throughout the application might not work without HTTPS enabled.
+
+We strongly recommend setting up Twenty behind a reverse proxy with SSL termination for optimal security and functionality.
+
+#### Configuring `SERVER_URL`
+
+1. **Determine Your Access URL**
+ * **Without Reverse Proxy (Direct Access):**
+
+ If you're accessing the application directly without a reverse proxy:
+
+ ```ini
+ SERVER_URL=http://your-domain-or-ip:3000
+ ```
+
+ * **With Reverse Proxy (Standard Ports):**
+
+ If you're using a reverse proxy like Nginx or Traefik and have SSL configured:
+
+ ```ini
+ SERVER_URL=https://your-domain-or-ip
+ ```
+
+ * **With Reverse Proxy (Custom Ports):**
+
+ If you're using non-standard ports:
+
+ ```ini
+ SERVER_URL=https://your-domain-or-ip:custom-port
+ ```
+
+2. **Update the `.env` File**
+
+ Open your `.env` file and update the `SERVER_URL`:
+
+ ```ini
+ SERVER_URL=http(s)://your-domain-or-ip:your-port
+ ```
+
+ **Examples:**
+
+ * Direct access without SSL:
+ ```ini
+ SERVER_URL=http://123.45.67.89:3000
+ ```
+ * Access via domain with SSL:
+ ```ini
+ SERVER_URL=https://mytwentyapp.com
+ ```
+
+3. **Restart the Application**
+
+ For changes to take effect, restart the Docker containers:
+
+ ```bash
+ docker compose down
+ docker compose up -d
+ ```
+
+#### Considerations
+
+* **Reverse Proxy Configuration:**
+
+ Ensure your reverse proxy forwards requests to the correct internal port (`3000` by default). Configure SSL termination and any necessary headers.
+
+* **Firewall Settings:**
+
+ Open necessary ports in your firewall to allow external access.
+
+* **Consistency:**
+
+ The `SERVER_URL` must match how users access your application in their browsers.
+
+#### Persistence
+
+* **Data Volumes:**
+
+ The Docker Compose configuration uses volumes to persist data for the database and server storage.
+
+* **Stateless Environments:**
+
+ If deploying to a stateless environment (e.g., certain cloud services), configure external storage to persist data.
+
+## Backup and Restore
+
+Regular backups protect your CRM data from loss.
+
+### Create a Database Backup
+
+```bash
+docker exec twenty-postgres pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql
+```
+
+### Automate Daily Backups
+
+Add to your crontab (`crontab -e`):
+
+```bash
+0 2 * * * docker exec twenty-postgres pg_dump -U postgres twenty > /backups/twenty_$(date +\%Y\%m\%d).sql
+```
+
+### Restore from Backup
+
+1. Stop the application:
+
+```bash
+docker compose stop twenty-server twenty-front
+```
+
+2. Restore the database:
+
+```bash
+docker exec -i twenty-postgres psql -U postgres twenty < backup_20240115.sql
+```
+
+3. Restart services:
+
+```bash
+docker compose up -d
+```
+
+### Backup Best Practices
+
+* **Test restores regularly** — verify backups actually work
+* **Store backups off-site** — use cloud storage (S3, GCS, etc.)
+* **Encrypt sensitive data** — protect backups with encryption
+* **Retain multiple copies** — keep daily, weekly, and monthly backups
+
+## Troubleshooting
+
+If you encounter any problem, check [Troubleshooting](/l/fr/developers/self-host/capabilities/troubleshooting) for solutions.
diff --git a/packages/twenty-docs/l/fr/developers/self-host/capabilities/setup.mdx b/packages/twenty-docs/l/fr/developers/self-host/capabilities/setup.mdx
new file mode 100644
index 0000000000..d8f671544e
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/self-host/capabilities/setup.mdx
@@ -0,0 +1,293 @@
+---
+title: Setup
+---
+
+# Configuration Management
+
+
+ **First time installing?** Follow the [Docker Compose installation guide](/l/fr/developers/self-host/capabilities/docker-compose) to get Twenty running, then return here for configuration.
+
+
+Twenty offers **two configuration modes** to suit different deployment needs:
+
+**Admin panel access:** Only users with admin privileges (`canAccessFullAdminPanel: true`) can access the configuration interface.
+
+## 1. Admin Panel Configuration (Default)
+
+```bash
+IS_CONFIG_VARIABLES_IN_DB_ENABLED=true # default
+```
+
+**Most configuration happens through the UI** after installation:
+
+1. Access your Twenty instance (usually `http://localhost:3000`)
+2. Go to **Settings / Admin Panel / Configuration Variables**
+3. Configure integrations, email, storage, and more
+4. Changes take effect immediately (within 15 seconds for multi-container deployments)
+
+
+ **Multi-Container Deployments:** When using database configuration (`IS_CONFIG_VARIABLES_IN_DB_ENABLED=true`), both server and worker containers read from the same database. Admin panel changes affect both automatically, eliminating the need to duplicate environment variables between containers (except for infrastructure variables).
+
+
+**What you can configure through the admin panel:**
+
+* **Authentication** - Google/Microsoft OAuth, password settings
+* **Email** - SMTP settings, templates, verification
+* **Storage** - S3 configuration, local storage paths
+* **Integrations** - Gmail, Google Calendar, Microsoft services
+* **Workflow & Rate Limiting** - Execution limits, API throttling
+* **And much more...**
+
+
+
+
+ Each variable is documented with descriptions in your admin panel at **Settings → Admin Panel → Configuration Variables**.
+ Some infrastructure settings like database connections (`PG_DATABASE_URL`), server URLs (`SERVER_URL`), and app secrets (`APP_SECRET`) can only be configured via `.env` file.
+
+ [Complete technical reference →](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts)
+
+
+## 2. Environment-Only Configuration
+
+```bash
+IS_CONFIG_VARIABLES_IN_DB_ENABLED=false
+```
+
+**All configuration managed through `.env` files:**
+
+1. Set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` in your `.env` file
+2. Add all configuration variables to your `.env` file
+3. Restart containers for changes to take effect
+4. Admin panel will show current values but cannot modify them
+
+## Multi-Workspace Mode
+
+By default, Twenty runs in **single-workspace mode** — ideal for most self-hosted deployments where you need one CRM instance for your organization.
+
+### Single-Workspace Mode (Default)
+
+```bash
+IS_MULTIWORKSPACE_ENABLED=false # default
+```
+
+* One workspace per Twenty instance
+* First user automatically becomes admin with full privileges (`canImpersonate` and `canAccessFullAdminPanel`)
+* New signups are disabled after the first workspace is created
+* Simple URL structure: `https://your-domain.com`
+
+### Enabling Multi-Workspace Mode
+
+```bash
+IS_MULTIWORKSPACE_ENABLED=true
+DEFAULT_SUBDOMAIN=app # default value
+```
+
+Enable multi-workspace mode for SaaS-like deployments where multiple independent teams need their own workspaces on the same Twenty instance.
+
+**Key differences from single-workspace mode:**
+
+* Multiple workspaces can be created on the same instance
+* Each workspace gets its own subdomain (e.g., `sales.your-domain.com`, `marketing.your-domain.com`)
+* Users sign up and log in at `{DEFAULT_SUBDOMAIN}.your-domain.com` (e.g., `app.your-domain.com`)
+* No automatic admin privileges — first user in each workspace is a regular user
+* Workspace-specific settings like subdomain and custom domain become available in workspace settings
+
+
+ **Environment-only setting:** `IS_MULTIWORKSPACE_ENABLED` can only be configured via `.env` file and requires a restart. It cannot be changed through the admin panel.
+
+
+### DNS Configuration for Multi-Workspace
+
+When using multi-workspace mode, configure your DNS with a wildcard record to allow dynamic subdomain creation:
+
+```
+*.your-domain.com -> your-server-ip
+```
+
+This enables automatic subdomain routing for new workspaces without manual DNS configuration.
+
+### Restricting Workspace Creation
+
+In multi-workspace mode, you may want to limit who can create new workspaces:
+
+```bash
+IS_WORKSPACE_CREATION_LIMITED_TO_SERVER_ADMINS=true
+```
+
+When enabled, only users with `canAccessFullAdminPanel` can create additional workspaces. Users can still create their first workspace during initial signup.
+
+## Gmail & Google Calendar Integration
+
+### Create Google Cloud Project
+
+1. Go to [Google Cloud Console](https://console.cloud.google.com/)
+2. Create a new project or select existing one
+3. Enable these APIs:
+
+* [Gmail API](https://console.cloud.google.com/apis/library/gmail.googleapis.com)
+* [Google Calendar API](https://console.cloud.google.com/apis/library/calendar-json.googleapis.com)
+* [People API](https://console.cloud.google.com/apis/library/people.googleapis.com)
+
+### Configure OAuth
+
+1. Go to [Credentials](https://console.cloud.google.com/apis/credentials)
+2. Create OAuth 2.0 Client ID
+3. Add these redirect URIs:
+ * `https://{your-domain}/auth/google/redirect` (for SSO)
+ * `https://{your-domain}/auth/google-apis/get-access-token` (for integrations)
+
+### Configure in Twenty
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Google Auth** section
+3. Set these variables:
+ * `MESSAGING_PROVIDER_GMAIL_ENABLED=true`
+ * `CALENDAR_PROVIDER_GOOGLE_ENABLED=true`
+ * `AUTH_GOOGLE_CLIENT_ID={client-id}`
+ * `AUTH_GOOGLE_CLIENT_SECRET={client-secret}`
+ * `AUTH_GOOGLE_CALLBACK_URL=https://{your-domain}/auth/google/redirect`
+ * `AUTH_GOOGLE_APIS_CALLBACK_URL=https://{your-domain}/auth/google-apis/get-access-token`
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
+
+**Required scopes** (automatically configured):
+[See relevant source code](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes.ts#L4-L10)
+
+* `https://www.googleapis.com/auth/calendar.events`
+* `https://www.googleapis.com/auth/gmail.readonly`
+* `https://www.googleapis.com/auth/profile.emails.read`
+
+### If your app is in test mode
+
+If your app is in test mode, you will need to add test users to your project.
+
+Under [OAuth consent screen](https://console.cloud.google.com/apis/credentials/consent), add your test users to the "Test users" section.
+
+## Microsoft 365 Integration
+
+
+ Users must have a [Microsoft 365 Licence](https://admin.microsoft.com/Adminportal/Home) to be able to use the Calendar and Messaging API. They will not be able to sync their account on Twenty without one.
+
+
+### Create a project in Microsoft Azure
+
+You will need to create a project in [Microsoft Azure](https://portal.azure.com/#view/Microsoft_AAD_IAM/AppGalleryBladeV2) and get the credentials.
+
+### Enable APIs
+
+On Microsoft Azure Console enable the following APIs in "Permissions":
+
+* Microsoft Graph: Mail.ReadWrite
+* Microsoft Graph: Mail.Send
+* Microsoft Graph: Calendars.Read
+* Microsoft Graph: User.Read
+* Microsoft Graph: openid
+* Microsoft Graph: email
+* Microsoft Graph: profile
+* Microsoft Graph: offline_access
+
+Note: "Mail.ReadWrite" and "Mail.Send" are only mandatory if you want to send emails using our workflow actions. You can use "Mail.Read" instead if you only want to receive emails.
+
+### Authorized redirect URIs
+
+You need to add the following redirect URIs to your project:
+
+* `https://{your-domain}/auth/microsoft/redirect` if you want to use Microsoft SSO
+* `https://{your-domain}/auth/microsoft-apis/get-access-token`
+
+### Configure in Twenty
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Microsoft Auth** section
+3. Set these variables:
+ * `MESSAGING_PROVIDER_MICROSOFT_ENABLED=true`
+ * `CALENDAR_PROVIDER_MICROSOFT_ENABLED=true`
+ * `AUTH_MICROSOFT_ENABLED=true`
+ * `AUTH_MICROSOFT_CLIENT_ID={client-id}`
+ * `AUTH_MICROSOFT_CLIENT_SECRET={client-secret}`
+ * `AUTH_MICROSOFT_CALLBACK_URL=https://{your-domain}/auth/microsoft/redirect`
+ * `AUTH_MICROSOFT_APIS_CALLBACK_URL=https://{your-domain}/auth/microsoft-apis/get-access-token`
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
+
+### Configure scopes
+
+[See relevant source code](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes.ts#L2-L9)
+
+* 'openid'
+* 'email'
+* 'profile'
+* 'offline_access'
+* 'Mail.ReadWrite'
+* 'Mail.Send'
+* 'Calendars.Read'
+
+### If your app is in test mode
+
+If your app is in test mode, you will need to add test users to your project.
+
+Add your test users to the "Users and groups" section.
+
+## Background Jobs for Calendar & Messaging
+
+After configuring Gmail, Google Calendar, or Microsoft 365 integrations, you need to start the background jobs that sync data.
+
+Register the following recurring jobs in your worker container:
+
+```bash
+# from your worker container
+yarn command:prod cron:messaging:messages-import
+yarn command:prod cron:messaging:message-list-fetch
+yarn command:prod cron:calendar:calendar-event-list-fetch
+yarn command:prod cron:calendar:calendar-events-import
+yarn command:prod cron:messaging:ongoing-stale
+yarn command:prod cron:calendar:ongoing-stale
+yarn command:prod cron:workflow:automated-cron-trigger
+```
+
+## Email Configuration
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Email** section
+3. Configure your SMTP settings:
+
+
+
+ You will need to provision an [App Password](https://support.google.com/accounts/answer/185833).
+
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=smtp.gmail.com
+ * EMAIL_SMTP_PORT=465
+ * EMAIL_SMTP_USER=gmail_email_address
+ * EMAIL_SMTP_PASSWORD='gmail_app_password'
+
+
+
+ Keep in mind that if you have 2FA enabled, you will need to provision an [App Password](https://support.microsoft.com/en-us/account-billing/manage-app-passwords-for-two-step-verification-d6dc8c6d-4bf7-4851-ad95-6d07799387e9).
+
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=smtp.office365.com
+ * EMAIL_SMTP_PORT=587
+ * EMAIL_SMTP_USER=office365_email_address
+ * EMAIL_SMTP_PASSWORD='office365_password'
+
+
+
+ **smtp4dev** is a fake SMTP email server for development and testing.
+
+ * Run the smtp4dev image: `docker run --rm -it -p 8090:80 -p 2525:25 rnwood/smtp4dev`
+ * Access the smtp4dev ui here: [http://localhost:8090](http://localhost:8090)
+ * Set the following variables:
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=localhost
+ * EMAIL_SMTP_PORT=2525
+
+
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
diff --git a/packages/twenty-docs/l/fr/developers/self-host/capabilities/troubleshooting.mdx b/packages/twenty-docs/l/fr/developers/self-host/capabilities/troubleshooting.mdx
new file mode 100644
index 0000000000..d2187aedac
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/self-host/capabilities/troubleshooting.mdx
@@ -0,0 +1,227 @@
+---
+title: Troubleshooting
+---
+
+## Troubleshooting
+
+If you encounter any problem while setting up environment for development, upgrading your instance or self-hosting,
+here are some solutions for common problems.
+
+### Self-hosting
+
+#### First install results in `password authentication failed for user "postgres"`
+
+🚨 **IMPORTANT: This solution is ONLY for fresh installations** 🚨
+If you have an existing Twenty instance with production data, **DO NOT** follow these steps as they will permanently delete your database!
+
+While installing Twenty for the first time, you might want to change the default database password.
+The password you set during the first installation becomes permanently stored in the database volume. If you later try to change this password in your configuration without removing the old volume, you'll get authentication errors because the database is still using the original password.
+
+⚠️ WARNING: Following steps will PERMANENTLY DELETE all database data! ⚠️
+Only proceed if this is a fresh installation with no important data.
+
+In order to update the `PG_DATABASE_PASSWORD` you need to:
+
+```sh
+# Update the PG_DATABASE_PASSWORD in .env
+docker compose down --volumes
+docker compose up -d
+```
+
+#### CR line breaks found [Windows]
+
+This is due to the line break characters of Windows and the git configuration. Try running:
+
+```
+git config --global core.autocrlf false
+```
+
+Then delete the repository and clone it again.
+
+#### Missing metadata schema
+
+During Twenty installation, you need to provision your postgres database with the right schemas, extensions, and users.
+If you're successful in running this provisioning, you should have `default` and `metadata` schemas in your database.
+If you don't, make sure you don't have more than one postgres instance running on your computer.
+
+#### Cannot find module 'twenty-emails' or its corresponding type declarations.
+
+You have to build the package `twenty-emails` before running the initialization of the database with `npx nx run twenty-emails:build`
+
+#### Missing twenty-x package
+
+Make sure to run yarn in the root directory and then run `npx nx server:dev twenty-server`. If this still doesn't work try building the missing package manually.
+
+#### Lint on Save not working
+
+This should work out of the box with the eslint extension installed. If this doesn't work try adding this to your vscode setting (on the dev container scope):
+
+```
+"editor.codeActionsOnSave": {
+
+ "source.fixAll.eslint": "explicit"
+
+}
+```
+
+#### While running `npx nx start` or `npx nx start twenty-front`, Out of memory error is thrown
+
+In `packages/twenty-front/.env` uncomment `VITE_DISABLE_TYPESCRIPT_CHECKER=true` to disable background checks thus reducing amount of needed RAM.
+
+**If it does not work:**
+Run only the services you need, instead of `npx nx start`. For instance, if you work on the server, run only `npx nx worker twenty-server`
+
+**If it does not work:**
+If you tried to run only `npx nx run twenty-server:start` on WSL and it's failing with the below memory error:
+
+`FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory`
+
+Workaround is to execute below command in terminal or add it in .bashrc profile to get setup automatically:
+
+`export NODE_OPTIONS="--max-old-space-size=8192"`
+
+The --max-old-space-size=8192 flag sets an upper limit of 8GB for the Node.js heap; usage scales with application demand.
+Reference: https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048
+
+**If it does not work:**
+Investigate which processes are taking you most of your machine RAM. At Twenty, we noticed that some VScode extensions were taking a lot of RAM so we temporarily disable them.
+
+**If it does not work:**
+Restart your machine helps to clean up ghost processes.
+
+#### While running `npx nx start` there are weird [0] and [1] in logs
+
+That's expected as command `npx nx start` is running more commands under the hood
+
+#### No emails are sent
+
+Most of the time, it's because the `worker` is not running in the background. Try to run
+
+```
+npx nx worker twenty-server
+```
+
+#### Cannot connect my Microsoft 365 account
+
+Most of the time, it's because your admin has not enabled the Microsoft 365 Licence for your account. Check [https://admin.microsoft.com/](https://admin.microsoft.com/Adminportal/Home).
+
+If you have an error code `AADSTS50020`, it probably means that you are using a personal Microsoft account. This is not supported yet. More info [here](https://learn.microsoft.com/fr-fr/troubleshoot/entra/entra-id/app-integration/error-code-aadsts50020-user-account-identity-provider-does-not-exist)
+
+#### While running `yarn` warnings appear in console
+
+Warnings are informing about pulling additional dependencies which aren't explicitly stated in `package.json`, so as long as no breaking error appears, everything should work as expected.
+
+#### When user accesses login page, error about unauthorized user trying to access workspace appears in logs
+
+That's expected as user is unauthorized when logged out since its identity is not verified.
+
+#### How to check if your worker is running?
+
+* Go to [webhook-test.com](https://webhook-test.com/) and copy **Your Unique Webhook URL**.
+
+
+
+
+
+* Open your Twenty app, navigate to `/settings`, and enable the **Advanced** toggle at the bottom left of the screen.
+* Create a new webhook.
+* Paste **Your Unique Webhook URL** in the **Endpoint Url** field in Twenty. Set the **Filters** to `Companies` and `Created`.
+
+
+
+
+
+* Go to `/objects/companies` and create a new company record.
+* Return to [webhook-test.com](https://webhook-test.com/) and check if a new **POST request** has been received.
+
+
+
+
+
+* If a **POST request** is received, your worker is running successfully. Otherwise, you need to troubleshoot your worker.
+
+#### Front-end fails to start and returns error TS5042: Option 'project' cannot be mixed with source files on a command line
+
+Comment out checker plugin in `packages/twenty-ui/vite-config.ts` like in example below
+
+```
+plugins: [
+ react({ jsxImportSource: '@emotion/react' }),
+ tsconfigPaths(),
+ svgr(),
+ dts(dtsConfig),
+ // checker(checkersConfig),
+ wyw({
+ include: [
+ '**/OverflowingTextWithTooltip.tsx',
+ '**/Chip.tsx',
+ '**/Tag.tsx',
+ '**/Avatar.tsx',
+ '**/AvatarChip.tsx',
+ ],
+ babelOptions: {
+ presets: ['@babel/preset-typescript', '@babel/preset-react'],
+ },
+ }),
+ ],
+```
+
+#### Admin panel not accessible
+
+Run `UPDATE core."user" SET "canAccessFullAdminPanel" = TRUE WHERE email = 'you@yourdomain.com';` in database container to get access to admin panel.
+
+### 1-click Docker compose
+
+#### Unable to Log In
+
+If you can't log in after setup:
+
+1. Run the following commands:
+ ```bash
+ docker exec -it twenty-server-1 yarn
+ docker exec -it twenty-server-1 npx nx database:reset --configuration=no-seed
+ ```
+2. Restart the Docker containers:
+ ```bash
+ docker compose down
+ docker compose up -d
+ ```
+
+Note the database:reset command will completely erase your database and recreate it from scratch.
+
+#### Connection Issues Behind a Reverse Proxy
+
+If you're running Twenty behind a reverse proxy and experiencing connection issues:
+
+1. **Verify SERVER_URL:**
+
+ Ensure `SERVER_URL` in your `.env` file matches your external access URL, including `https` if SSL is enabled.
+
+2. **Check Reverse Proxy Settings:**
+
+ * Confirm that your reverse proxy is correctly forwarding requests to the Twenty server.
+ * Ensure headers like `X-Forwarded-For` and `X-Forwarded-Proto` are properly set.
+
+3. **Restart Services:**
+
+ After making changes, restart both the reverse proxy and Twenty containers.
+
+#### Error when uploading an image - permission denied
+
+Switching the data folder ownership on the host from root to another user and group resolves this problem.
+
+## Getting Help
+
+If you encounter issues not covered in this guide:
+
+* Check Logs:
+
+ View container logs for error messages:
+
+ ```bash
+ docker compose logs
+ ```
+
+* Community Support:
+
+ Reach out to the [Twenty community](https://github.com/twentyhq/twenty/issues) or [support channels](https://discord.gg/cx5n4Jzs57) for assistance.
diff --git a/packages/twenty-docs/l/fr/developers/self-host/capabilities/upgrade-guide.mdx b/packages/twenty-docs/l/fr/developers/self-host/capabilities/upgrade-guide.mdx
new file mode 100644
index 0000000000..03a53f5685
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/self-host/capabilities/upgrade-guide.mdx
@@ -0,0 +1,381 @@
+---
+title: Upgrade guide
+---
+
+## General guidelines
+
+**Always make sure to back up your database before starting the upgrade process** by running `docker exec -it {db_container_name_or_id} pg_dumpall -U {postgres_user} > databases_backup.sql`.
+
+To restore backup, run `cat databases_backup.sql | docker exec -i {db_container_name_or_id} psql -U {postgres_user}`.
+
+If you used Docker Compose, follow these steps:
+
+1. In a terminal, on the host where Twenty is running, turn off Twenty: `docker compose down`
+
+2. Upgrade the version by changing the `TAG` value in the .env file near your docker-compose. ( We recommend consuming `major.minor` version such as `v0.53` )
+
+3. Bring Twenty back online with `docker compose up -d`
+
+If you want to upgrade your instance by few versions, e.g. from v0.33.0 to v0.35.0, you have to upgrade your instance sequentially, in this example from v0.33.0 to v0.34.0, then from v0.34.0 to v0.35.0.
+
+**Make sure that after each upgraded version you have non-corrupted backup.**
+
+## Version-specific upgrade steps
+
+## v1.0
+
+Hello Twenty v1.0! 🎉
+
+## v0.60
+
+### Performance Enhancements
+
+All interactions with the metadata API have been optimized for better performance, particularly for object metadata manipulation and workspace creation operations.
+
+We've refactored our caching strategy to prioritize cache hits over database queries when possible, significantly improving the performance of metadata API operations.
+
+If you encounter any runtime issues after upgrading, you may need to flush your cache to ensure it's synchronized with the latest changes. Run this command in your twenty-server container:
+
+```bash
+yarn command:prod cache:flush
+```
+
+### v0.55
+
+Upgrade your Twenty instance to use v0.55 image
+
+You don't need to run any command anymore, the new image will automatically care about running all required migrations.
+
+### `User does not have permission` error
+
+If you encounter authorization errors on most requests after upgrading, you may need to flush your cache to recompute the latest permissions.
+
+In your `twenty-server` container, run:
+
+```bash
+yarn command:prod cache:flush
+```
+
+This issue is specific to this Twenty version and should not be required for future upgrades.
+
+### v0.54
+
+Since version `0.53`, no manual actions needed.
+
+#### Metadata schema deprecation
+
+We've merged the `metadata` schema into the `core` one to simplify data retrieval from `TypeORM`.
+We have merged the `migrate` command step within the `upgrade` command. We do not recommend running `migrate` manually within any of your server/worker containers.
+
+### Since v0.53
+
+Starting from `0.53`, upgrade is programmatically done within the `DockerFile`, this means from now on, you shouldn't have to run any command manually anymore.
+
+Make sure to keep upgrading your instance sequentially, without skipping any major version (e.g. `0.43.3` to `0.44.0` is allowed, but `0.43.1` to `0.45.0` isn't), else could lead to workspace version desynchronization that could result in runtime error and missing functionality.
+
+To check if a workspace has been correctly migrated you can review its version in database in `core.workspace` table.
+
+It should always be in the range of your current Twenty's instance `major.minor` version, you can view your instance version in the admin panel (at `/settings/admin-panel`, accessible if your user has `canAccessFullAdminPanel` property set to true in the database) or by running `echo $APP_VERSION` in your `twenty-server` container.
+
+To fix a desynchronized workspace version, you will have to upgrade from the corresponding twenty's version following related upgrade guide sequentially and so on until it reaches desired version.
+
+#### `auditLog` removal
+
+We've removed the auditLog standard object, which means your backup size might be significantly reduced after this migration.
+
+### v0.51 to v0.52
+
+Upgrade your Twenty instance to use v0.52 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+#### I have a workspace blocked in version between `0.52.0` and `0.52.6`
+
+Unfortunately `0.52.0` and `0.52.6` have been completely removed from dockerHub.
+You will have to manually update your workspace version to `0.51.0` in database and upgrade using twenty version `0.52.11` following its just above upgrade guide.
+
+### v0.50 to v0.51
+
+Upgrade your Twenty instance to use v0.51 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+### v0.44.0 to v0.50.0
+
+Upgrade your Twenty instance to use v0.50.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+#### Docker-compose.yml mutation
+
+This version includes a `docker-compose.yml` mutation to give `worker` service access to the `server-local-data` volume.
+Please update your local `docker-compose.yml` with [v0.50.0 docker-compose.yml](https://github.com/twentyhq/twenty/blob/v0.50.0/packages/twenty-docker/docker-compose.yml)
+
+### v0.43.0 to v0.44.0
+
+Upgrade your Twenty instance to use v0.44.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+### v0.42.0 to v0.43.0
+
+Upgrade your Twenty instance to use v0.43.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+In this version, we have also switched to postgres:16 image in docker-compose.yml.
+
+#### (Option 1) Database migration
+
+Keeping the existing postgres-spilo image is fine, but you will have to freeze the version in your docker-compose.yml to be 0.43.0.
+
+#### (Option 2) Database migration
+
+If you want to migrate your database to the new postgres:16 image, please follow these steps:
+
+1. Dump your database from the old postgres-spilo container
+
+```
+docker exec -it twenty-db-1 sh
+pg_dump -U {YOUR_POSTGRES_USER} -d {YOUR_POSTGRES_DB} > databases_backup.sql
+exit
+docker cp twenty-db-1:/home/postgres/databases_backup.sql .
+```
+
+Make sure your dump file is not empty.
+
+2. Upgrade your docker-compose.yml to use postgres:16 image as in the [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) file.
+
+3. Restore the database to the new postgres:16 container
+
+```
+docker cp databases_backup.sql twenty-db-1:/databases_backup.sql
+docker exec -it twenty-db-1 sh
+psql -U {YOUR_POSTGRES_USER} -d {YOUR_POSTGRES_DB} -f databases_backup.sql
+exit
+```
+
+### v0.41.0 to v0.42.0
+
+Upgrade your Twenty instance to use v0.42.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.42
+```
+
+**Environment Variables**
+
+* Removed: `FRONT_PORT`, `FRONT_PROTOCOL`, `FRONT_DOMAIN`, `PORT`
+* Added: `FRONTEND_URL`, `NODE_PORT`, `MAX_NUMBER_OF_WORKSPACES_DELETED_PER_EXECUTION`, `MESSAGING_PROVIDER_MICROSOFT_ENABLED`, `CALENDAR_PROVIDER_MICROSOFT_ENABLED`, `IS_MICROSOFT_SYNC_ENABLED`
+
+### v0.40.0 to v0.41.0
+
+Upgrade your Twenty instance to use v0.41.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.41
+```
+
+**Environment Variables**
+
+* Removed: `AUTH_MICROSOFT_TENANT_ID`
+
+### v0.35.0 to v0.40.0
+
+Upgrade your Twenty instance to use v0.40.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.40
+```
+
+**Environment Variables**
+
+* Added: `IS_EMAIL_VERIFICATION_REQUIRED`, `EMAIL_VERIFICATION_TOKEN_EXPIRES_IN`, `WORKFLOW_EXEC_THROTTLE_LIMIT`, `WORKFLOW_EXEC_THROTTLE_TTL`
+
+### v0.34.0 to v0.35.0
+
+Upgrade your Twenty instance to use v0.35.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.35
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.35` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+* We replaced `ENABLE_DB_MIGRATIONS` with `DISABLE_DB_MIGRATIONS` (default value is now `false`, you probably don't have to set anything)
+
+### v0.33.0 to v0.34.0
+
+Upgrade your Twenty instance to use v0.34.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.34
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.34` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+* Removed: `FRONT_BASE_URL`
+* Added: `FRONT_DOMAIN`, `FRONT_PROTOCOL`, `FRONT_PORT`
+
+We have updated the way we handle the frontend URL.
+You can now set the frontend URL using the `FRONT_DOMAIN`, `FRONT_PROTOCOL` and `FRONT_PORT` variables.
+If FRONT_DOMAIN is not set, the frontend URL will fall back to `SERVER_URL`.
+
+### v0.32.0 to v0.33.0
+
+Upgrade your Twenty instance to use v0.33.0 image
+
+```
+yarn command:prod cache:flush
+yarn database:migrate:prod
+yarn command:prod upgrade-0.33
+```
+
+The `yarn command:prod cache:flush` command will flush the Redis cache.
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.33` takes care of the data migration of all workspaces.
+
+Starting from this version, twenty-postgres image for DB became deprecated and twenty-postgres-spilo is used instead.
+If you want to keep using twenty-postgres image, simply replace `twentycrm/twenty-postgres:${TAG}` with `twentycrm/twenty-postgres` in docker-compose.yml.
+
+### v0.31.0 to v0.32.0
+
+Upgrade your Twenty instance to use v0.32.0 image
+
+**Schema and data migration**
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.32
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.32` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+We have updated the way we handle the Redis connection.
+
+* Removed: `REDIS_HOST`, `REDIS_PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD`
+* Added: `REDIS_URL`
+
+Update your `.env` file to use the new `REDIS_URL` variable instead of the individual Redis connection parameters.
+
+We have also simplified the way we handle the JWT tokens.
+
+* Removed: `ACCESS_TOKEN_SECRET`, `LOGIN_TOKEN_SECRET`, `REFRESH_TOKEN_SECRET`, `FILE_TOKEN_SECRET`
+* Added: `APP_SECRET`
+
+Update your `.env` file to use the new `APP_SECRET` variable instead of the individual tokens secrets (you can use the same secret as before or generate a new random string)
+
+**Connected Account**
+
+If you are using connected account to synchronize your Google emails and calendars, you will need to activate the [People API](https://developers.google.com/people) on your Google Admin console.
+
+### v0.30.0 to v0.31.0
+
+Upgrade your Twenty instance to use v0.31.0 image
+
+**Schema and data migration**:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.31
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.31` takes care of the data migration of all workspaces.
+
+### v0.24.0 to v0.30.0
+
+Upgrade your Twenty instance to use v0.30.0 image
+
+**Breaking change**:
+To enhance performances, Twenty now requires redis cache to be configured. We have updated our [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) to reflect this.
+Make sure to update your configuration and to update your environment variables accordingly:
+
+```
+REDIS_HOST={your-redis-host}
+REDIS_PORT={your-redis-port}
+CACHE_STORAGE_TYPE=redis
+```
+
+**Schema and data migration**:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.30
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.30` takes care of the data migration of all workspaces.
+
+### v0.23.0 to v0.24.0
+
+Upgrade your Twenty instance to use v0.24.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.24
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.24` takes care of the data migration of all workspaces.
+
+### v0.22.0 to v0.23.0
+
+Upgrade your Twenty instance to use v0.23.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.23
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the Database.
+The `yarn command:prod upgrade-0.23` takes care of the data migration, including transferring activities to tasks/notes.
+
+### v0.21.0 to v0.22.0
+
+Upgrade your Twenty instance to use v0.22.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod workspace:sync-metadata -f
+yarn command:prod upgrade-0.22
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the Database.
+The `yarn command:prod workspace:sync-metadata -f` command will sync the definition of standard objects to the metadata tables and apply to required migrations to existing workspaces.
+The `yarn command:prod upgrade-0.22` command will apply specific data transformations to adapt to the new object defaultRequestInstrumentationOptions.
diff --git a/packages/twenty-docs/l/fr/developers/self-host/self-host.mdx b/packages/twenty-docs/l/fr/developers/self-host/self-host.mdx
new file mode 100644
index 0000000000..13056b71de
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/self-host/self-host.mdx
@@ -0,0 +1,30 @@
+---
+title: Self-Host
+description: Deploy and manage Twenty on your own infrastructure.
+---
+
+
+
+
+
+## Overview
+
+Twenty can be self-hosted on your own infrastructure, giving you full control over your data and deployment.
+
+## Why Self-Host?
+
+* **Data ownership**: Keep all CRM data on your own servers
+* **Compliance**: Meet regulatory requirements for data residency
+* **Customization**: Full access to modify and extend the platform
+
+## Getting Started
+
+
+
+ Quick setup with Docker
+
+
+
+ Deploy on AWS, GCP, or Azure
+
+
diff --git a/packages/twenty-docs/l/fr/navigation.json b/packages/twenty-docs/l/fr/navigation.json
index 1c7f64dad9..8096fbf4ac 100644
--- a/packages/twenty-docs/l/fr/navigation.json
+++ b/packages/twenty-docs/l/fr/navigation.json
@@ -1,91 +1,203 @@
{
"tabs": {
"userGuide": {
- "label": "Guide de l'utilisateur",
+ "label": "User Guide",
"groups": {
- "gettingStarted": {
- "label": "Commencer"
+ "discoverTwenty": {
+ "label": "Discover Twenty",
+ "groups": {
+ "gettingStartedCapabilities": {
+ "label": "Capabilities"
+ },
+ "gettingStartedHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"dataModel": {
- "label": "Modèle de données"
+ "label": "Data Model",
+ "groups": {
+ "dataModelCapabilities": {
+ "label": "Capabilities"
+ },
+ "dataModelHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "crmEssentials": {
- "label": "Essentiels du CRM"
+ "dataMigration": {
+ "label": "Data Migration",
+ "groups": {
+ "dataMigrationCapabilities": {
+ "label": "Capabilities"
+ },
+ "dataMigrationHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "views": {
- "label": "Vues"
+ "calendarEmails": {
+ "label": "Calendar & Emails",
+ "groups": {
+ "calendarEmailsCapabilities": {
+ "label": "Capabilities"
+ },
+ "calendarEmailsHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"workflows": {
- "label": "Flux de travail"
+ "label": "Workflows",
+ "groups": {
+ "workflowsCapabilities": {
+ "label": "Capabilities"
+ },
+ "workflowsHowTos": {
+ "label": "How-Tos",
+ "groups": {
+ "crmAutomations": {
+ "label": "CRM Automations"
+ },
+ "connectToOtherTools": {
+ "label": "Connect to Other Tools"
+ },
+ "advancedConfigurations": {
+ "label": "Advanced Configurations"
+ },
+ "needMoreHelp": {
+ "label": "Need More Help"
+ }
+ }
+ }
+ }
},
- "collaboration": {
- "label": "Collaboration"
+ "ai": {
+ "label": "AI",
+ "groups": {
+ "aiCapabilities": {
+ "label": "Capabilities"
+ },
+ "aiHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "integrationsApi": {
- "label": "Intégrations & API"
+ "viewsPipelines": {
+ "label": "Views & Pipelines",
+ "groups": {
+ "viewsPipelinesCapabilities": {
+ "label": "Capabilities"
+ },
+ "viewsPipelinesHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "reporting": {
- "label": "Rapports"
+ "dashboards": {
+ "label": "Dashboards",
+ "groups": {
+ "dashboardsCapabilities": {
+ "label": "Capabilities"
+ },
+ "dashboardsHowTos": {
+ "label": "How-Tos"
+ }
+ }
+ },
+ "permissionsAccess": {
+ "label": "Permissions & Access",
+ "groups": {
+ "permissionsAccessCapabilities": {
+ "label": "Capabilities"
+ },
+ "permissionsAccessHowTos": {
+ "label": "How-Tos"
+ }
+ }
+ },
+ "billing": {
+ "label": "Billing",
+ "groups": {
+ "billingCapabilities": {
+ "label": "Capabilities"
+ },
+ "billingHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"settings": {
- "label": "Paramètres"
- },
- "pricing": {
- "label": "Tarifs"
- },
- "resources": {
- "label": "Ressources"
+ "label": "Settings",
+ "groups": {
+ "settingsCapabilities": {
+ "label": "Capabilities"
+ },
+ "settingsHowTos": {
+ "label": "How-Tos"
+ }
+ }
}
}
},
"developers": {
- "label": "Développeurs",
+ "label": "Developers",
"groups": {
"developersGroup": {
- "label": "Développeurs"
+ "label": "Developers"
},
- "devGettingStarted": {
- "label": "Commencer",
+ "extend": {
+ "label": "Extend",
"groups": {
- "selfHosting": {
- "label": "Auto-hébergement"
- },
- "apiAndWebhooks": {
- "label": "API et webhooks"
+ "extendCapabilities": {
+ "label": "Capabilities"
}
}
},
- "contributing": {
- "label": "Contribuer",
+ "selfHost": {
+ "label": "Self-Host",
"groups": {
- "frontendDevelopment": {
- "label": "Développement du frontend",
+ "selfHostCapabilities": {
+ "label": "Capabilities"
+ }
+ }
+ },
+ "contribute": {
+ "label": "Contribute",
+ "groups": {
+ "contributeCapabilities": {
+ "label": "Capabilities",
"groups": {
- "twentyUi": {
- "label": "Twenty UI",
+ "frontendDevelopment": {
+ "label": "Frontend Development",
"groups": {
- "display": {
- "label": "Afficher"
- },
- "feedback": {
- "label": "Vos commentaires"
- },
- "input": {
- "label": "Input"
- },
- "navigation": {
- "label": "Navigation"
+ "twentyUi": {
+ "label": "Twenty UI",
+ "groups": {
+ "display": {
+ "label": "Display"
+ },
+ "feedback": {
+ "label": "Feedback"
+ },
+ "input": {
+ "label": "Input"
+ },
+ "navigation": {
+ "label": "Navigation"
+ }
+ }
}
}
+ },
+ "backendDevelopment": {
+ "label": "Backend Development"
}
}
- },
- "backendDevelopment": {
- "label": "Développement du backend"
}
}
}
}
}
}
-}
\ No newline at end of file
+}
diff --git a/packages/twenty-docs/l/fr/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/fr/twenty-ui/display/app-tooltip.mdx
index 6b43167a3b..4e620eedc7 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/display/app-tooltip.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/display/app-tooltip.mdx
@@ -1,16 +1,16 @@
---
-title: Info-bulle de l'application
+title: App Tooltip
image: /images/user-guide/tips/light-bulb.png
---
-
+
-Un message bref qui affiche des informations supplémentaires lorsqu'un utilisateur interagit avec un élément.
+A brief message that displays additional information when a user interacts with an element.
-
+
```jsx
import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
@@ -18,12 +18,12 @@ Un message bref qui affiche des informations supplémentaires lorsqu'un utilisat
return (
<>
- Aperçus client
+ Customer Insights
-
- | Propriétés | Type | Description |
- | ----------------------- | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
- | nomDeClasse | chaîne | Classe CSS facultative pour le style supplémentaire |
- | sélecteurAncre | Sélecteur CSS | Sélecteur pour l'ancre de l'info-bulle (l'élément qui déclenche l'info-bulle) |
- | contenu | chaîne | Le contenu que vous souhaitez afficher dans l'info-bulle |
- | délaiMasquer | nombre | Le délai avant de masquer l'info-bulle après que le curseur ait quitté l'ancre |
- | décalage | nombre | Le décalage en pixels pour positionner l'info-bulle |
- | pasDeFlèche | booléen | Si `vrai`, masque la flèche sur l'info-bulle |
- | estOuvert | booléen | Si `vrai`, l'info-bulle est ouverte par défaut |
- | emplacement | Chaîne `PlacesType` de `react-tooltip` | Spécifie le placement de l'info-bulle. Les valeurs incluent `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, et `left-end` |
- | stratégiePositionnement | Chaîne `PositionStrategy` de `react-tooltip` | Stratégie de positionnement pour l'info-bulle. A deux valeurs : `absolute` et `fixed` |
+
+ | Props | Type | Description |
+ | ---------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional CSS class for additional styling |
+ | anchorSelect | CSS selector | Selector for the tooltip anchor (the element that triggers the tooltip) |
+ | content | string | The content you want to display within the tooltip |
+ | delayHide | number | The delay in seconds before hiding the tooltip after the cursor leaves the anchor |
+ | offset | number | The offset in pixels for positioning the tooltip |
+ | noArrow | boolean | If `true`, hides the arrow on the tooltip |
+ | isOpen | boolean | If `true`, the tooltip is open by default |
+ | place | `PlacesType` string from `react-tooltip` | Specifies the placement of the tooltip. Values include `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, and `left-end` |
+ | positionStrategy | `PositionStrategy` string from `react-tooltip` | Position strategy for the tooltip. Has two values: `absolute` and `fixed` |
-## Texte débordant avec info-bulle
+## Overflowing Text with Tooltip
-Gère le texte débordant et affiche une info-bulle lorsque le texte déborde.
+Handles overflowing text and displays a tooltip when the text overflows.
-
+
```jsx
import { OverflowingTextWithTooltip } from 'twenty-ui/display';
export const MyComponent = () => {
const crmTaskDescription =
- 'Suivre avec le client concernant son enquête récente sur le produit. Discuter des options de prix, répondre à toute préoccupation et fournir des informations additionnelles sur le produit. Enregistrer les détails de la conversation dans le CRM pour référence future.';
+ 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
return ;
};
```
-
- | Propriétés | Type | Description |
- | ---------- | ------ | ----------------------------------------------------------------------- |
- | texte | chaîne | Le contenu que vous souhaitez afficher dans la zone de texte débordante |
+
+ | Props | Type | Description |
+ | ----- | ------ | ------------------------------------------------------------ |
+ | text | string | The content you want to display in the overflowing text area |
diff --git a/packages/twenty-docs/l/fr/twenty-ui/display/checkmark.mdx b/packages/twenty-docs/l/fr/twenty-ui/display/checkmark.mdx
new file mode 100644
index 0000000000..ef84d5c2d5
--- /dev/null
+++ b/packages/twenty-docs/l/fr/twenty-ui/display/checkmark.mdx
@@ -0,0 +1,58 @@
+---
+title: Checkmark
+image: /images/user-guide/tasks/tasks_header.png
+---
+
+
+
+
+
+Represents a successful or completed action.
+
+
+
+ ```jsx
+ import { Checkmark } from 'twenty-ui/display';
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ Extends `React.ComponentPropsWithoutRef<'div'>` and accepts all the props of a regular `div` element.
+
+
+
+## Animated Checkmark
+
+Represents a checkmark icon with the added feature of animation.
+
+
+
+ ```jsx
+ import { AnimatedCheckmark } from 'twenty-ui/display';
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ----------- | ------- | ------------------------------------------- | ----------- |
+ | isAnimating | boolean | Controls whether the checkmark is animating | false |
+ | color | string | Color of the checkmark | |
+ | duration | number | The duration of the animation in seconds | 0.5 seconds |
+ | size | number | The size of the checkmark | 28 pixels |
+
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/display/chip.mdx b/packages/twenty-docs/l/fr/twenty-ui/display/chip.mdx
index 3d0c83086b..ded2fd1c77 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/display/chip.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/display/chip.mdx
@@ -1,5 +1,5 @@
---
-title: Puce
+title: Chip
image: /images/user-guide/github/github-header.png
---
@@ -7,53 +7,48 @@ image: /images/user-guide/github/github-header.png
-Un élément visuel que vous pouvez utiliser comme un conteneur cliquable ou non cliquable avec une étiquette, des composants optionnels à gauche et à droite, et diverses options de style pour afficher des étiquettes et des tags.
+A visual element that you can use as a clickable or non-clickable container with a label, optional left and right components, and various styling options to display labels and tags.
+
+ ```jsx
+ import { Chip } from 'twenty-ui/components';
-
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
-```jsx
-import { Chip } from 'twenty-ui/components';
+ ```
+
-export const MyComponent = () => {
- return (
-
- );
-};
-
-```
-
-
-
-
-
-| Propriétés | Type | Description |
-| ------------ | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ |
-| linkToEntity | chaîne | Le lien vers l'entité |
-| entityId | chaîne | L'identifiant unique pour l'entité |
-| nom | chaîne | Le nom de l'entité |
-| pictureUrl | chaîne | Image", |
-| avatarType | Type d'avatar | Le type d'avatar que vous souhaitez afficher. A deux options : `arrondie` et `carrée` |
-| variante | `EntityChipVariant` enum | Variante de la puce entité que vous souhaitez afficher. A deux options : `régulier` et `transparent` |
-| LeftIcon | ComposantIcône | Un composant React représentant une icône. Affiché sur le côté gauche de la puce |
-
-
+
+ | Props | Type | Description |
+ | ------------ | ------------------------ | -------------------------------------------------------------------------------------------- |
+ | linkToEntity | string | The link to the entity |
+ | entityId | string | The unique identifier for the entity |
+ | name | string | The name of the entity |
+ | pictureUrl | string | s picture", |
+ | avatarType | Avatar Type | The type of avatar you want to display. Has two options: `rounded` and `squared` |
+ | variant | `EntityChipVariant` enum | Variant of the entity chip you want to display. Has two options: `regular` and `transparent` |
+ | LeftIcon | IconComponent | A React component representing an icon. Displayed on the left side of the chip |
+
-## Exemples
+## Examples
-### Puce transparente désactivée
+### Transparent Disabled Chip
```jsx
import { Chip } from 'twenty-ui/components';
@@ -76,9 +71,9 @@ export const MyComponent = () => {
```
-
+
-### Puce désactivée avec infobulle
+### Disabled Chip with Tooltip
```jsx
import { Chip } from "twenty-ui/components";
@@ -100,49 +95,44 @@ export const MyComponent = () => {
};
```
-## Puce entité
+## Entity Chip
-Un élément semblable à une puce pour afficher des informations sur une entité.
+A Chip-like element to display information about an entity.
+
+ ```jsx
+ import { BrowserRouter as Router } from 'react-router-dom';
+ import { IconTwentyStar } from 'twenty-ui/display';
+ import { Chip } from 'twenty-ui/components';
-
+ export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
-```jsx
-import { BrowserRouter as Router } from 'react-router-dom';
-import { IconTwentyStar } from 'twenty-ui/display';
-import { Chip } from 'twenty-ui/components';
-
-export const MyComponent = () => {
- return (
-
-
-
- );
-};
-```
-
-
-
-
-
-| Propriétés | Type | Description |
-| ------------ | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ |
-| linkToEntity | chaîne | Le lien vers l'entité |
-| entityId | chaîne | L'identifiant unique pour l'entité |
-| nom | chaîne | Le nom de l'entité |
-| pictureUrl | chaîne | Image", |
-| avatarType | Type d'avatar | Le type d'avatar que vous souhaitez afficher. A deux options : `arrondie` et `carrée` |
-| variante | `EntityChipVariant` enum | Variante de la puce entité que vous souhaitez afficher. A deux options : `régulier` et `transparent` |
-| LeftIcon | ComposantIcône | Un composant React représentant une icône. Affiché sur le côté gauche de la puce |
-
-
+
+ | Props | Type | Description |
+ | ------------ | ------------------------ | -------------------------------------------------------------------------------------------- |
+ | linkToEntity | string | The link to the entity |
+ | entityId | string | The unique identifier for the entity |
+ | name | string | The name of the entity |
+ | pictureUrl | string | s picture", |
+ | avatarType | Avatar Type | The type of avatar you want to display. Has two options: `rounded` and `squared` |
+ | variant | `EntityChipVariant` enum | Variant of the entity chip you want to display. Has two options: `regular` and `transparent` |
+ | LeftIcon | IconComponent | A React component representing an icon. Displayed on the left side of the chip |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/display/icons.mdx b/packages/twenty-docs/l/fr/twenty-ui/display/icons.mdx
index af7d9f31ab..2d73154c8d 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/display/icons.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/display/icons.mdx
@@ -1,5 +1,5 @@
---
-title: Icônes
+title: Icons
image: /images/user-guide/objects/objects.png
---
@@ -7,77 +7,67 @@ image: /images/user-guide/objects/objects.png
-Une liste d'icônes utilisées dans notre application.
+A list of icons used throughout our app.
-## Icônes Tabler
+## Tabler Icons
-Nous utilisons les icônes Tabler pour React dans toute l'application.
+We use Tabler icons for React throughout the app.
+
+
-
+ ```
+ yarn add @tabler/icons-react
+ ```
+
-```
-yarn add @tabler/icons-react
-```
+
+ You can import each icon as a component. Here's an example:
-
+
-
+ ```jsx
+ import { IconArrowLeft } from "@tabler/icons-react";
-Vous pouvez importer chaque icône en tant que composant. Here's an example:
-
-```jsx
-import { IconArrowLeft } from "@tabler/icons-react";
-
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-
-| Propriétés | Type | Description | Par défaut |
-| ---------- | ------ | --------------------------------------------- | --------------- |
-| taille | nombre | La hauteur et la largeur de l'icône en pixels | 24 |
-| couleur | chaîne | La couleur des icônes | couleurCourante |
-| trait | nombre | La largeur du trait de l'icône en pixels | 2 |
-
-
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+ | Props | Type | Description | Default |
+ | ------ | ------ | ------------------------------------------ | ------------ |
+ | size | number | The height and width of the icon in pixels | 24 |
+ | color | string | The color of the icons | currentColor |
+ | stroke | number | The stroke width of the icon in pixels | 2 |
+
-## Icônes personnalisées
+## Custom Icons
-En plus des icônes Tabler, l'application utilise également certaines icônes personnalisées.
+In addition to Tabler icons, the app also uses some custom icons.
-### Icône Carnet d'adresses
+### Icon Address Book
-Affiche une icône de carnet d'adresses.
+Displays an address book icon.
+
+ ```jsx
+ import { IconAddressBook } from 'twenty-ui/display';
-
-
-```jsx
-import { IconAddressBook } from 'twenty-ui/display';
-
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-
-| Propriétés | Type | Description | Par défaut |
-| ---------- | ------ | --------------------------------------------- | ---------- |
-| taille | nombre | La hauteur et la largeur de l'icône en pixels | 24 |
-| trait | nombre | La largeur du trait de l'icône en pixels | 2 |
-
-
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+ | Props | Type | Description | Default |
+ | ------ | ------ | ------------------------------------------ | ------- |
+ | size | number | The height and width of the icon in pixels | 24 |
+ | stroke | number | The stroke width of the icon in pixels | 2 |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/display/soon-pill.mdx b/packages/twenty-docs/l/fr/twenty-ui/display/soon-pill.mdx
new file mode 100644
index 0000000000..56ace0bae7
--- /dev/null
+++ b/packages/twenty-docs/l/fr/twenty-ui/display/soon-pill.mdx
@@ -0,0 +1,18 @@
+---
+title: Soon Pill
+image: /images/user-guide/kanban-views/kanban.png
+---
+
+
+
+
+
+A small badge or "pill" to indicate something is coming soon.
+
+```jsx
+import { SoonPill } from "@/ui/display/pill/components/SoonPill";
+
+export const MyComponent = () => {
+ return ;
+};
+```
diff --git a/packages/twenty-docs/l/fr/twenty-ui/display/tag.mdx b/packages/twenty-docs/l/fr/twenty-ui/display/tag.mdx
new file mode 100644
index 0000000000..a2226c88d4
--- /dev/null
+++ b/packages/twenty-docs/l/fr/twenty-ui/display/tag.mdx
@@ -0,0 +1,38 @@
+---
+title: Tag
+image: /images/user-guide/table-views/table.png
+---
+
+
+
+
+
+Component to visually categorize or label content.
+
+
+
+ ```jsx
+ import { Tag } from "@/ui/display/tag/components/Tag";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | color | string | Color of the tag. Options include: `green`, `turquoise`, `sky`, `blue`, `purple`, `pink`, `red`, `orange`, `yellow`, `gray` |
+ | text | string | The content of the tag |
+ | onClick | function | Optional function called when a user clicks on the tag |
+
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input.mdx b/packages/twenty-docs/l/fr/twenty-ui/input.mdx
index 9c298b3927..2da701caf5 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/input.mdx
@@ -1,8 +1,8 @@
---
-title: "Entrée "
+title: Input
image: /images/user-guide/tips/light-bulb.png
---
-
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input/block-editor.mdx b/packages/twenty-docs/l/fr/twenty-ui/input/block-editor.mdx
index 5b1bf2f90b..9943fa5f5d 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/input/block-editor.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/input/block-editor.mdx
@@ -1,5 +1,5 @@
---
-title: Éditeur de Blocs
+title: Block Editor
image: /images/user-guide/api/api.png
---
@@ -7,28 +7,25 @@ image: /images/user-guide/api/api.png
-Utilise un éditeur de texte riche basé sur des blocs de [BlockNote](https://www.blocknotejs.org/) pour permettre aux utilisateurs de modifier et de visualiser des blocs de contenu.
+Uses a block-based rich text editor from [BlockNote](https://www.blocknotejs.org/) to allow users to edit and view blocks of content.
-
+
+ ```jsx
+ import { useBlockNote } from "@blocknote/react";
+ import { BlockEditor } from "@/ui/input/editor/components/BlockEditor";
-```jsx
-import { useBlockNote } from "@blocknote/react";
-import { BlockEditor } from "@/ui/input/editor/components/BlockEditor";
+ export const MyComponent = () => {
+ const BlockNoteEditor = useBlockNote();
-export const MyComponent = () => {
- const BlockNoteEditor = useBlockNote();
+ return ;
+ };
+ ```
+
- return ;
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| ---------- | ----------------- | ---------------------------------------------------- |
-| éditeur | `BlockNoteEditor` | L'instance de l'éditeur de blocs ou sa configuration |
-
-
+
+ | Props | Type | Description |
+ | ------ | ----------------- | ------------------------------------------ |
+ | editor | `BlockNoteEditor` | The block editor instance or configuration |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input/buttons.mdx b/packages/twenty-docs/l/fr/twenty-ui/input/buttons.mdx
new file mode 100644
index 0000000000..1c53eb1816
--- /dev/null
+++ b/packages/twenty-docs/l/fr/twenty-ui/input/buttons.mdx
@@ -0,0 +1,439 @@
+---
+title: Buttons
+image: /images/user-guide/views/filter.png
+---
+
+
+
+
+
+A list of buttons and button groups used throughout the app.
+
+## Button
+
+
+
+ ```jsx
+ import { Button } from "@/ui/input/button/components/Button";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional class name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | fullWidth | boolean | Defines whether the button should span the whole width of its container |
+ | variant | string | The visual style variant of the button. Options include `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` |
+ | accent | string | The accent color of the button. Options include: `default`, `blue`, and `danger` |
+ | soon | boolean | Indicates if the button is marked as "soon" (such as for upcoming features) |
+ | disabled | boolean | Specifies whether the button is disabled or not |
+ | focus | boolean | Determines if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Button Group
+
+
+
+ ```jsx
+ import { Button } from "@/ui/input/button/components/Button";
+ import { ButtonGroup } from "@/ui/input/button/components/ButtonGroup";
+
+ export const MyComponent = () => {
+ return (
+
+ console.log("click")}
+ />
+ console.log("click")}
+ />
+ console.log("click")}
+ />
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------- | ---------------------------------------------------------------------------------------------------------------- |
+ | variant | string | The visual style variant of the buttons within the group. Options include `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the buttons within the group. Has two options: `medium` and `small` |
+ | accent | string | The accent color of the buttons within the group. Options include `default`, `blue` and `danger` |
+ | className | string | Optional class name for additional styling |
+ | children | ReactNode | An array of React elements representing the individual buttons within the group |
+
+
+
+## Floating Button
+
+
+
+ ```jsx
+ import { FloatingButton } from "@/ui/input/button/components/FloatingButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | --------------------- | ---------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `middle`, `right` |
+ | applyShadow | boolean | Determines whether to apply shadow to a button |
+ | applyBlur | boolean | Determines whether to apply a blur effect to the button |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+
+
+
+## Floating Button Group
+
+
+
+ ```jsx
+ import { FloatingButton } from "@/ui/input/button/components/FloatingButton";
+ import { FloatingButtonGroup } from "@/ui/input/button/components/FloatingButtonGroup";
+ import { IconClipboardText, IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+
+
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | -------- | --------- | ------------------------------------------------------------------------------- | ------- |
+ | size | string | The size of the button. Has two options: `small` and `medium` | small |
+ | children | ReactNode | An array of React elements representing the individual buttons within the group | |
+
+
+
+## Floating Icon Button
+
+
+
+ ```jsx
+ import { FloatingIconButton } from "@/ui/input/button/components/FloatingIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ isActive={true}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` |
+ | applyShadow | boolean | Determines whether to apply shadow to a button |
+ | applyBlur | boolean | Determines whether to apply a blur effect to the button |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+ | isActive | boolean | Determines if the button is in an active state |
+
+
+
+## Floating Icon Button Group
+
+
+
+ ```jsx
+ import { FloatingIconButtonGroup } from "@/ui/input/button/components/FloatingIconButtonGroup";
+ import { IconClipboardText, IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ const iconButtons = [
+ {
+ Icon: IconClipboardText,
+ onClick: () => console.log("Button 1 clicked"),
+ isActive: true,
+ },
+ {
+ Icon: IconCheckbox,
+ onClick: () => console.log("Button 2 clicked"),
+ isActive: true,
+ },
+ ];
+
+ return (
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | iconButtons | array | An array of objects, each representing an icon button in the group. Each object should include the icon component you want to display in the button, the function you want to call when a user clicks on the button, and whether the button should be active or not. |
+
+
+
+## Light Button
+
+
+
+ ```jsx
+ import { LightButton } from "@/ui/input/button/components/LightButton";
+
+ export const MyComponent = () => {
+ return console.log('click')}
+ />;
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ----------------- | --------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | icon | `React.ReactNode` | The icon you want to display in the button |
+ | title | string | The text content of the button |
+ | accent | string | The accent color of the button. Options include: `secondary` and `tertiary` |
+ | active | boolean | Determines if the button is in an active state |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Light Icon Button
+
+
+
+ ```jsx
+ import { LightIconButton } from "@/ui/input/button/components/LightIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------------------- | --------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | testId | string | Test identifier for the button |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | accent | string | The accent color of the button. Options include: `secondary` and `tertiary` |
+ | active | boolean | Determines if the button is in an active state |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Main Button
+
+
+
+ ```jsx
+ import { MainButton } from "@/ui/input/button/components/MainButton";
+ import { IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------------- | -------------------------------- | --------------------------------------------------------------------------------- |
+ | title | string | The text content of the button |
+ | fullWidth | boolean | Defines whether the button should span the whole width of its container |
+ | variant | string | The visual style variant of the button. Options include `primary` and `secondary` |
+ | soon | boolean | Indicates if the button is marked as "soon" (such as for upcoming features) |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | React `button` props | `React.ComponentProps<'button'>` | All standard HTML button props are supported |
+
+
+
+## Rounded Icon Button
+
+
+
+ ```jsx
+ import { RoundedIconButton } from "@/ui/input/button/components/RoundedIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------------- | ----------------------------------------------- | ----------- |
+ | Icon | `React.ComponentType` | |
+ | React `button` props | `React.ButtonHTMLAttributes` | |
+
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input/checkbox.mdx b/packages/twenty-docs/l/fr/twenty-ui/input/checkbox.mdx
index 09b17c3888..b25eeba052 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/input/checkbox.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/input/checkbox.mdx
@@ -1,16 +1,16 @@
---
-title: Case à cocher
+title: Checkbox
image: /images/user-guide/tasks/tasks_header.png
---
-
+
-Utilisé lorsqu'un utilisateur doit sélectionner plusieurs valeurs parmi plusieurs options.
+Used when a user needs to select multiple values from several options.
-
+
```jsx
import { Checkbox } from "twenty-ui/display";
@@ -19,8 +19,8 @@ Utilisé lorsqu'un utilisateur doit sélectionner plusieurs valeurs parmi plusie
console.log("la fonction onChange est exécutée")}
- onCheckedChange={() => console.log("la fonction onCheckedChange est exécutée")}
+ onChange={() => console.log("onChange function fired")}
+ onCheckedChange={() => console.log("onCheckedChange function fired")}
variant="primary"
size="small"
shape="squared"
@@ -30,15 +30,15 @@ Utilisé lorsqu'un utilisateur doit sélectionner plusieurs valeurs parmi plusie
```
-
- | Propriétés | Type | Description |
- | --------------- | -------- | ---------------------------------------------------------------------------------------------------------- |
- | coché | booléen | Indique si la case à cocher est cochée |
- | indéterminé | booléen | Indique si la case à cocher est dans un état indéterminé (ni cochée ni décochée) |
- | onChange | fonction | La fonction de rappel que vous souhaitez déclencher lorsque l'état de la case à cocher change |
- | onCheckedChange | fonction | La fonction de rappel que vous souhaitez déclencher lorsque l'état `coché` change |
- | variante | chaîne | Le style visuel de la variante de la boîte. Les options incluent : `primaire`, `secondaire` et `tertiaire` |
- | taille | chaîne | La taille de la case à cocher. Comporte deux options : `petit` et `grand` |
- | forme | chaîne | La forme de la case à cocher. Comporte deux options : `carrée` et `arrondie` |
+
+ | Props | Type | Description |
+ | --------------- | -------- | -------------------------------------------------------------------------------------------- |
+ | checked | boolean | Indicates whether the checkbox is checked |
+ | indeterminate | boolean | Indicates whether the checkbox is in an indeterminate state (neither checked nor unchecked) |
+ | onChange | function | The callback function you want to trigger when the checkbox state changes |
+ | onCheckedChange | function | The callback function you want to trigger when the `checked` state changes |
+ | variant | string | The visual style variant of the box. Options include: `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the checkbox. Has two options: `small` and `large` |
+ | shape | string | The shape of the checkbox. Has two options: `squared` and `rounded` |
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input/color-scheme.mdx b/packages/twenty-docs/l/fr/twenty-ui/input/color-scheme.mdx
index eb7b05ae1d..1b1505d481 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/input/color-scheme.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/input/color-scheme.mdx
@@ -1,5 +1,5 @@
---
-title: Schéma de couleurs
+title: Color Scheme
image: /images/user-guide/fields/field.png
---
@@ -7,67 +7,57 @@ image: /images/user-guide/fields/field.png
-## Carte de Schéma de couleurs
+## Color Scheme Card
-Représente différents schémas de couleurs et est spécialement adapté aux thèmes clairs et sombres.
+Represents different color schemes and is specially tailored for light and dark themes.
-
+
+ ```jsx
+ import { ColorSchemeCard } from "twenty-ui/display";
-```jsx
-import { ColorSchemeCard } from "twenty-ui/display";
-
-export const MyComponent = () => {
- return (
-
- );
-};
-```
-
-
-
-
-
-| Propriétés | Type | Description | Par défaut |
-| -------------------------- | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------- |
-| variante | chaîne | La variante du schéma de couleurs. Les options incluent `Sombre`, `Clair` et `Système`. | clair |
-| sélectionné | booléen | Si `vrai`, affiche une coche pour indiquer le schéma de couleurs sélectionné. | |
-| propriétés supplémentaires | `React.ComponentPropsWithoutRef<'div'>` | Propriétés standard de l'élément HTML `div`. | |
-
-
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+ | Props | Type | Description | Default |
+ | ---------------- | --------------------------------------- | ----------------------------------------------------------------------- | ------- |
+ | variant | string | The color scheme variant. Options include `Dark`, `Light`, and `System` | light |
+ | selected | boolean | If `true`, displays a checkmark to indicate the selected color scheme | |
+ | additional props | `React.ComponentPropsWithoutRef<'div'>` | Standard HTML `div` element props | |
+
-## Sélecteur de Schéma de couleurs
+## Color Scheme Picker
-Permet aux utilisateurs de choisir entre différents schémas de couleurs.
+Allows users to choose between different color schemes.
-
+
+ ```jsx
+ import { ColorSchemePicker } from "twenty-ui/display";
-```jsx
-import { ColorSchemePicker } from "twenty-ui/display";
-
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-
-| Propriétés | Type | Description |
-| ---------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
-| valeur | `Schéma de couleurs` | Le schéma de couleurs actuellement sélectionné. |
-| onChange | fonction | La fonction de rappel que vous souhaitez déclencher lorsqu'un utilisateur sélectionne un schéma de couleurs. |
-
-
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+ | Props | Type | Description |
+ | -------- | -------------- | ---------------------------------------------------------------------------- |
+ | value | `Color Scheme` | The currently selected color scheme |
+ | onChange | function | The callback function you want to trigger when a user selects a color scheme |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/fr/twenty-ui/input/icon-picker.mdx
index 6e0ada64ed..59d269242e 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/input/icon-picker.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/input/icon-picker.mdx
@@ -1,26 +1,26 @@
---
-title: Sélecteur d'icônes
+title: Icon Picker
image: /images/user-guide/github/github-header.png
---
-
+
-Un sélecteur d'icônes basé sur un menu déroulant qui permet aux utilisateurs de sélectionner une icône dans une liste.
+A dropdown-based icon picker that allows users to select an icon from a list.
-
+
```jsx
- import { RecoilRoot } de "recoil";
- import React, { useState } de "react";
- import { IconPicker } de "@/ui/input/components/IconPicker";
+ import { RecoilRoot } from "recoil";
+ import React, { useState } from "react";
+ import { IconPicker } from "@/ui/input/components/IconPicker";
- export const MonComposant = () => {
+ export const MyComponent = () => {
const [selectedIcon, setSelectedIcon] = useState("");
const handleIconChange = ({ iconKey, Icon }) => {
- console.log("Icône sélectionnée:", iconKey);
+ console.log("Selected Icon:", iconKey);
setSelectedIcon(iconKey);
};
@@ -38,15 +38,15 @@ Un sélecteur d'icônes basé sur un menu déroulant qui permet aux utilisateurs
```
-
- | Propriétés | Type | Description |
- | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
- | désactivé | booléen | Désactive le sélecteur d'icônes si défini sur `true` |
- | onChange | fonction | La fonction de rappel déclenchée lorsque l'utilisateur sélectionne une icône. Elle reçoit un objet avec les propriétés `iconKey` et `Icon` |
- | selectedIconKey | chaîne | La clé de l'icône initialement sélectionnée |
- | onClickOutside | fonction | Fonction de rappel déclenchée lorsque l'utilisateur clique en dehors du menu déroulant |
- | onClose | fonction | Fonction de rappel déclenchée lorsque le menu déroulant est fermé |
- | onOpen | fonction | Fonction de rappel déclenchée lorsque le menu déroulant est ouvert |
- | variante | chaîne | La variante de style visuel de l'icône cliquable. Les options incluent : `primaire`, `secondaire` et `tertiaire` |
+
+ | Props | Type | Description |
+ | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------- |
+ | disabled | boolean | Disables the icon picker if set to `true` |
+ | onChange | function | The callback function triggered when the user selects an icon. It receives an object with `iconKey` and `Icon` properties |
+ | selectedIconKey | string | The key of the initially selected icon |
+ | onClickOutside | function | Callback function triggered when the user clicks outside the dropdown |
+ | onClose | function | Callback function triggered when the dropdown is closed |
+ | onOpen | function | Callback function triggered when the dropdown is opened |
+ | variant | string | The visual style variant of the clickable icon. Options include: `primary`, `secondary`, and `tertiary` |
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input/image-input.mdx b/packages/twenty-docs/l/fr/twenty-ui/input/image-input.mdx
index 0ac0aae033..0d563d7c37 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/input/image-input.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/input/image-input.mdx
@@ -1,16 +1,16 @@
---
-title: Saisie Image
+title: Image Input
image: /images/user-guide/objects/objects.png
---
-
+
-Permet aux utilisateurs de télécharger et de supprimer une image.
+Allows users to upload and remove an image.
-
+
```jsx
import { ImageInput } from "@/ui/input/components/ImageInput";
@@ -20,15 +20,15 @@ Permet aux utilisateurs de télécharger et de supprimer une image.
```
-
- | Propriétés | Type | Description |
- | ------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------- |
- | photo | chaîne | L'URL source de l'image |
- | onUpload | fonction | La fonction appelée lors du téléchargement d'une nouvelle image par un utilisateur. Elle reçoit l'objet `File` comme paramètre. |
- | onRemove | fonction | La fonction appelée lorsque l'utilisateur clique sur le bouton supprimer. |
- | onAbort | fonction | La fonction appelée lorsque l'utilisateur clique sur le bouton annuler pendant le téléchargement de l'image. |
- | isUploading | booléen | Indique si une image est en cours de téléchargement. |
- | messageErreur | chaîne | Un message d'erreur facultatif à afficher sous l'entrée d'image. |
- | désactivé | booléen | Si `true`, l'entrée entière est désactivée et les boutons ne sont pas cliquables. |
+
+ | Props | Type | Description |
+ | ------------ | -------- | ------------------------------------------------------------------------------------------------- |
+ | picture | string | The image source URL |
+ | onUpload | function | The function called when a user uploads a new image. It receives the `File` object as a parameter |
+ | onRemove | function | The function called when the user clicks on the remove button |
+ | onAbort | function | The function called when a user clicks on the abort button during image upload |
+ | isUploading | boolean | Indicates whether an image is currently being uploaded |
+ | errorMessage | string | An optional error message to display below the image input |
+ | disabled | boolean | If `true`, the entire input is disabled, and the buttons are not clickable |
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input/radio.mdx b/packages/twenty-docs/l/fr/twenty-ui/input/radio.mdx
index 818b9731ab..e6246e631f 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/input/radio.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/input/radio.mdx
@@ -7,98 +7,91 @@ image: /images/user-guide/create-workspace/workspace-cover.png
-Utilisé lorsque les utilisateurs peuvent choisir une seule option parmi une série d'options.
+Used when users may only choose one option from a series of options.
-
+
+ ```jsx
+ import { Radio } from "twenty-ui/display";
-```jsx
-import { Radio } from "twenty-ui/display";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ const handleRadioChange = (event) => {
+ console.log("Radio button changed:", event.target.checked);
+ };
- const handleRadioChange = (event) => {
- console.log("Radio button changed:", event.target.checked);
- };
-
- const handleCheckedChange = (checked) => {
- console.log("Checked state changed:", checked);
- };
+ const handleCheckedChange = (checked) => {
+ console.log("Checked state changed:", checked);
+ };
- return (
-
- );
-};
+ return (
+
+ );
+ };
-```
+ ```
+
-
-
-
-| Propriétés | Type | Description |
-| --------------- | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
-| style | propriétés `React.CSS` | Styles inline supplémentaires pour le composant |
-| nomDeClasse | chaîne | Classe CSS facultative pour le style supplémentaire |
-| coché | booléen | Indique si le bouton radio est coché |
-| valeur | chaîne | L'étiquette ou le texte associé au bouton radio |
-| onChange | fonction | La fonction appelée lorsque le bouton radio sélectionné est modifié |
-| onCheckedChange | fonction | La fonction appelée lorsque l'état `checked` du bouton radio change |
-| taille | chaîne | La taille du bouton radio. Les options incluent : `large` et `small` |
-| désactivé | booléen | Si `true`, le bouton radio est désactivé et ne peut pas être cliqué |
-| positionLabel | chaîne | La position du texte du label par rapport au bouton radio. A deux options : `left` et `right` |
-
-
+
+ | Props | Type | Description |
+ | --------------- | ---------------------- | ------------------------------------------------------------------------------------------------ |
+ | style | `React.CSS` properties | Additional inline styles for the component |
+ | className | string | Optional CSS class for additional styling |
+ | checked | boolean | Indicates whether the radio button is checked |
+ | value | string | The label or text associated with the radio button |
+ | onChange | function | The function called when the selected radio button is changed |
+ | onCheckedChange | function | The function called when the `checked` state of the radio button changes |
+ | size | string | The size of the radio button. Options include: `large` and `small` |
+ | disabled | boolean | If `true`, the radio button is disabled and not clickable |
+ | labelPosition | string | The position of the label text relative to the radio button. Has two options: `left` and `right` |
+
-## Groupe Radio
+## Radio Group
-Regroupe ensemble des boutons radio associés.
+Groups together related radio buttons.
-
+
+ ```jsx
+ import React, { useState } from "react";
+ import { Radio, RadioGroup } from "twenty-ui/display";
-```jsx
-import React, { useState } from "react";
-import { Radio, RadioGroup } from "twenty-ui/display";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ const [selectedValue, setSelectedValue] = useState("Option 1");
- const [selectedValue, setSelectedValue] = useState("Option 1");
+ const handleChange = (event) => {
+ setSelectedValue(event.target.value);
+ };
+
+ return (
+
+
+
+
+
+ );
+ };
- const handleChange = (event) => {
- setSelectedValue(event.target.value);
- };
-
- return (
-
-
-
-
-
- );
-};
-
-```
-
-
-
-
-| Propriétés | Type | Description |
-| ------------- | ----------------- | ------------------------------------------------------------------------------------------------------------ |
-| valeur | chaîne | La valeur du bouton radio actuellement sélectionné |
-| onChange | fonction | La fonction de rappel déclenchée lorsque le bouton radio est changé |
-| onValueChange | fonction | La fonction de rappel déclenchée lorsque la valeur sélectionnée dans le groupe change. |
-| enfants | `React.ReactNode` | Permet de passer des composants React (tels que Radio) en tant qu'enfants au Groupe Radio |
-
-
+ ```
+
+
+ | Props | Type | Description |
+ | ------------- | ----------------- | ---------------------------------------------------------------------------------- |
+ | value | string | The value of the currently selected radio button |
+ | onChange | function | The callback function triggered when the radio button is changed |
+ | onValueChange | function | The callback function triggered when the selected value in the group changes. |
+ | children | `React.ReactNode` | Allows you to pass React components (such as Radio) as children to the Radio Group |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input/select.mdx b/packages/twenty-docs/l/fr/twenty-ui/input/select.mdx
index 9124594cc1..d685bf4012 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/input/select.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/input/select.mdx
@@ -1,5 +1,5 @@
---
-title: Sélectionner
+title: Select
image: /images/user-guide/what-is-twenty/20.png
---
@@ -7,48 +7,45 @@ image: /images/user-guide/what-is-twenty/20.png
-Permet aux utilisateurs de choisir une valeur dans une liste d'options prédéfinies.
+Allows users to pick a value from a list of predefined options.
-
+
+ ```jsx
+ import { RecoilRoot } from 'recoil';
+ import { IconTwentyStar } from 'twenty-ui/display';
-```jsx
-import { RecoilRoot } from 'recoil';
-import { IconTwentyStar } from 'twenty-ui/display';
+ import { Select } from '@/ui/input/components/Select';
-import { Select } from '@/ui/input/components/Select';
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
- return (
-
-
-
- );
-};
+ ```
+
-```
-
-
-
-
-| Propriétés | Type | Description |
-| ----------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| nomDeClasse | chaîne | Classe CSS facultative pour le style supplémentaire |
-| désactivé | booléen | Lorsqu'il est réglé sur `true`, cela désactive l'interaction de l'utilisateur avec le composant. |
-| étiquette | chaîne | L'étiquette pour décrire la fonction du composant `Select`. |
-| onChange | fonction | La fonction appelée lorsque les valeurs sélectionnées changent. |
-| options | tableau | Représente les options disponibles pour le composant `Selected`. C'est un tableau d'objets où chaque objet possède une `valeur` (l'identifiant unique), un `label` (l'identifiant unique) et une icône optionnelle. |
-| valeur | chaîne | Représente la valeur actuellement sélectionnée. Elle doit correspondre à l'une des propriétés `valeur` dans le tableau `options`. |
-
-
+
+ | Props | Type | Description |
+ | --------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional CSS class for additional styling |
+ | disabled | boolean | When set to `true`, disables user interaction with the component |
+ | label | string | The label to describe the purpose of the `Select` component |
+ | onChange | function | The function called when the selected values change |
+ | options | array | Represents the options available for the `Selected` component. It's an array of objects where each object has a `value` (the unique identifier), `label` (the unique identifier), and an optional `Icon` |
+ | value | string | Represents the currently selected value. It should match one of the `value` properties in the `options` array |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input/text.mdx b/packages/twenty-docs/l/fr/twenty-ui/input/text.mdx
index f298f1112e..8cad1352ae 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/input/text.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/input/text.mdx
@@ -1,71 +1,72 @@
---
-title: Texte
+title: Text
image: /images/user-guide/notes/notes_header.png
---
-
+
-## Entrée de texte
+## Text Input
-Permet aux utilisateurs de saisir et de modifier du texte.
+Allows users to enter and edit text.
-
+
```jsx
import { RecoilRoot } from "recoil";
import { TextInput } from "@/ui/input/components/TextInput";
export const MyComponent = () => {
const handleChange = (text) => {
- console.log("Changement d'entrée:", text);
+ console.log("Input changed:", text);
};
const handleKeyDown = (event) => {
- console.log("Touche enfoncée:", event.key);
+ console.log("Key pressed:", event.key);
};
return (
);
};
+
```
-
- | Propriétés | Type | Description |
- | ----------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
- | nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
- | étiquette | chaîne | Représente l'étiquette de l'entrée |
- | onChange | fonction | La fonction appelée lorsque la valeur de l'entrée change |
- | largeurTotale | booléen | Indique si l'entrée doit occuper 100% de la largeur |
- | désactiverLesRaccourcis | booléen | Indique si les raccourcis sont activés pour l'entrée |
- | erreur | chaîne | Représente le message d'erreur à afficher. Lorsqu'il est fourni, il ajoute également une icône d'erreur sur le côté droit de l'entrée |
- | surToucheEnfoncée | fonction | Appelée lorsqu'une touche est enfoncée alors que le champ de saisie est focalisé. Reçoit un `React.KeyboardEvent` en tant qu'argument |
- | IcôneDroite | ComposantIcône | Un composant icône facultatif affiché sur le côté droit de l'entrée |
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | label | string | Represents the label for the input |
+ | onChange | function | The function called when the input value changes |
+ | fullWidth | boolean | Indicates whether the input should take up 100% of the width |
+ | disableHotkeys | boolean | Indicates whether hotkeys are enabled for the input |
+ | error | string | Represents the error message to be displayed. When provided, it also adds an icon error on the right side of the input |
+ | onKeyDown | function | Called when a key is pressed down while the input field is focused. Receives a `React.KeyboardEvent` as an argument |
+ | RightIcon | IconComponent | An optional icon component displayed on the right side of the input |
- Le composant accepte également d'autres propriétés d'éléments d'entrée HTML.
+ The component also accepts other HTML input element props.
-## Entrée de texte à taille automatique
+## Autosize Text Input
-Composant d'entrée de texte qui ajuste automatiquement sa hauteur en fonction du contenu.
+Text input component that automatically adjusts its height based on the content.
-
+
```jsx
import { RecoilRoot } from "recoil";
import { AutosizeTextInput } from "@/ui/input/components/AutosizeTextInput";
@@ -74,13 +75,13 @@ Composant d'entrée de texte qui ajuste automatiquement sa hauteur en fonction d
return (
console.log("Fonction onValidate déclenchée")}
+ onValidate={() => console.log("onValidate function fired")}
minRows={1}
- placeholder="Écrivez un commentaire"
- onFocus={() => console.log("Fonction onFocus déclenchée")}
+ placeholder="Write a comment"
+ onFocus={() => console.log("onFocus function fired")}
variant="icon"
buttonTitle
- value="Tâche: "
+ value="Task: "
/>
);
@@ -88,25 +89,25 @@ Composant d'entrée de texte qui ajuste automatiquement sa hauteur en fonction d
```
-
- | Propriétés | Type | Description |
- | -------------- | -------- | ------------------------------------------------------------------------------------------- |
- | surValider | fonction | La fonction de rappel que vous souhaitez déclencher lorsque l'utilisateur valide l'entrée |
- | minLignes | nombre | Le nombre minimum de lignes pour la zone de texte |
- | espace réservé | chaîne | Le texte d'espace réservé que vous souhaitez afficher lorsque la zone de texte est vide |
- | surFocus | fonction | La fonction de rappel que vous souhaitez déclencher lorsque la zone de texte prend le focus |
- | variante | chaîne | La variante de l'entrée. Les options incluent : `défaut`, `icône`, et `bouton` |
- | titreBouton | chaîne | Le titre pour le bouton (applicable uniquement à la variante bouton) |
- | valeur | chaîne | La valeur initiale pour la zone de texte |
+
+ | Props | Type | Description |
+ | ----------- | -------- | --------------------------------------------------------------------------- |
+ | onValidate | function | The callback function you want to trigger when the user validates the input |
+ | minRows | number | The minimum number of rows for the text area |
+ | placeholder | string | The placeholder text you want to display when the text area is empty |
+ | onFocus | function | The callback function you want to trigger when the text area gains focus |
+ | variant | string | The variant of the input. Options include: `default`, `icon`, and `button` |
+ | buttonTitle | string | The title for the button (only applicable for the button variant) |
+ | value | string | The initial value for the text area |
-## Zone de texte
+## Text Area
-Vous permet de créer des entrées de texte multiligne.
+Allows you to create multi-line text inputs.
-
+
```jsx
import { TextArea } from "@/ui/input/components/TextArea";
@@ -115,8 +116,8 @@ Vous permet de créer des entrées de texte multiligne.
-
- | Propriétés | Type | Description |
- | -------------- | -------- | --------------------------------------------------------------------------- |
- | désactivé | booléen | Indique si la zone de texte est désactivée |
- | minLignes | nombre | Nombre minimum de lignes visibles pour la zone de texte. |
- | surChangement | fonction | Fonction de rappel déclenchée lorsque le contenu de la zone de texte change |
- | espace réservé | chaîne | Texte de l'espace réservé affiché lorsque la zone de texte est vide |
- | valeur | chaîne | La valeur actuelle de la zone de texte |
+
+ | Props | Type | Description |
+ | ----------- | -------- | -------------------------------------------------------------- |
+ | disabled | boolean | Indicates whether the text area is disabled |
+ | minRows | number | Minimum number of visible rows for the text area. |
+ | onChange | function | Callback function triggered when the text area content changes |
+ | placeholder | string | Placeholder text displayed when the text area is empty |
+ | value | string | The current value of the text area |
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input/toggle.mdx b/packages/twenty-docs/l/fr/twenty-ui/input/toggle.mdx
new file mode 100644
index 0000000000..39f1645abd
--- /dev/null
+++ b/packages/twenty-docs/l/fr/twenty-ui/input/toggle.mdx
@@ -0,0 +1,36 @@
+---
+title: Toggle
+image: /images/user-guide/table-views/table.png
+---
+
+
+
+
+
+
+
+ ```jsx
+ import { Toggle } from "twenty-ui/input";
+
+ export const MyComponent = () => {
+ return (
+ console.log('On Change event')}
+ color="green"
+ toggleSize = "medium"
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ---------- | -------- | ------------------------------------------------------------------------------------------- | ------------ |
+ | value | boolean | The current state of the toggle | `false` |
+ | onChange | function | Callback function triggered when the toggle state changes | |
+ | color | string | Color of the toggle when it\ | s blue color |
+ | toggleSize | string | Size of the toggle, affecting both height and weight. Has two options: `small` and `medium` | medium |
+
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/introduction.mdx b/packages/twenty-docs/l/fr/twenty-ui/introduction.mdx
new file mode 100644
index 0000000000..7b088c4b8b
--- /dev/null
+++ b/packages/twenty-docs/l/fr/twenty-ui/introduction.mdx
@@ -0,0 +1,30 @@
+---
+title: Overview
+description: Component library for Twenty CRM
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+## Components
+
+
+
+ Display
+ Display components for showing information visually
+
+
+
+ Feedback
+ Feedback components for user notifications
+
+
+
+ Input
+ Input components for user interaction
+
+
+
+ Navigation
+ Navigation components for user interface
+
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/navigation.mdx b/packages/twenty-docs/l/fr/twenty-ui/navigation.mdx
index f99e2bb5df..b17dad4220 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/navigation.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/fr/twenty-ui/navigation/breadcrumb.mdx
index b8acf63d8c..aadbee8ee4 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/navigation/breadcrumb.mdx
@@ -1,26 +1,26 @@
---
-title: Fil d'Ariane
+title: Breadcrumb
image: /images/user-guide/fields/field.png
---
-
+
-Affiche une barre de navigation en fil d'Ariane.
+Renders a breadcrumb navigation bar.
-
+
```jsx
import { BrowserRouter } from "react-router-dom";
import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
export const MyComponent = () => {
const breadcrumbLinks = [
- { children: "Accueil", href: "/" },
- { children: "Catégorie", href: "/category" },
- { children: "Sous-catégorie", href: "/category/subcategory" },
- { children: "Page Actuelle" },
+ { children: "Home", href: "/" },
+ { children: "Category", href: "/category" },
+ { children: "Subcategory", href: "/category/subcategory" },
+ { children: "Current Page" },
];
return (
@@ -32,10 +32,10 @@ Affiche une barre de navigation en fil d'Ariane.
```
-
- | Propriétés | Type | Description |
- | ----------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
- | nomDeClasse | chaîne | Nom de classe facultatif pour un style supplémentaire |
- | liens | tableau | Un tableau d'objets, chacun représentant un lien de fil d'Ariane. Chaque objet a une propriété `children` (le contenu textuel du lien) et une propriété `href` facultative (l'URL vers laquelle naviguer lorsque le lien est cliqué) |
+
+ | Props | Type | Description |
+ | --------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional class name for additional styling |
+ | links | array | An array of objects, each representing a breadcrumb link. Each object has a `children` property (the text content of the link) and an optional `href` property (the URL to navigate to when the link is clicked) |
diff --git a/packages/twenty-docs/l/fr/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/fr/twenty-ui/navigation/links.mdx
index af019d075a..e9f7e3d80f 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/navigation/links.mdx
@@ -1,18 +1,18 @@
---
-title: Liens
+title: Links
image: /images/user-guide/what-is-twenty/20.png
---
-
+
-## Lien de contact
+## Contact Link
-Un composant de lien stylisé pour afficher les informations de contact.
+A stylized link component for displaying contact information.
-
+
```jsx
import { BrowserRouter as Router } from 'react-router-dom';
@@ -20,7 +20,7 @@ Un composant de lien stylisé pour afficher les informations de contact.
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log('Lien de contact cliqué!', event);
+ console.log('Contact link clicked!', event);
};
return (
@@ -38,71 +38,72 @@ Un composant de lien stylisé pour afficher les informations de contact.
```
-
- | Propriétés | Type | Description |
- | ----------- | ----------------- | -------------------------------------------------------- |
- | nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
- | href | chaîne | L'URL cible ou le chemin du lien |
- | onClick | fonction | Fonction de rappel à déclencher lors du clic sur le lien |
- | enfants | `React.ReactNode` | Le contenu à afficher à l'intérieur du lien |
+
+ | Props | Type | Description |
+ | --------- | ----------------- | ---------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | href | string | The target URL or path for the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
-## Lien brut
+## Raw Link
-Un composant de lien stylisé pour afficher les liens.
+A stylized link component for displaying links.
-
+
```jsx
import { RawLink } from "/navigation";
import { BrowserRouter as Router } from "react-router-dom";
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log("Lien de contact cliqué!", event);
+ console.log("Contact link clicked!", event);
};
return (
- Contactez-nous
+ Contact Us
);
};
+
```
-
- | Propriétés | Type | Description |
- | ----------- | ----------------- | -------------------------------------------------------- |
- | nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
- | href | chaîne | L'URL cible ou le chemin du lien |
- | onClick | fonction | Fonction de rappel à déclencher lors du clic sur le lien |
- | enfants | `React.ReactNode` | Le contenu à afficher à l'intérieur du lien |
+
+ | Props | Type | Description |
+ | --------- | ----------------- | ---------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | href | string | The target URL or path for the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
-## Lien arrondi
+## Rounded Link
-Un lien de style arrondi avec un composant Chip pour les liens.
+A rounded-styled link with a Chip component for links.
-
+
```jsx
import { RoundedLink } from "/navigation";
import { BrowserRouter as Router } from "react-router-dom";
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log("Lien de contact cliqué!", event);
+ console.log("Contact link clicked!", event);
};
return (
- Contactez-nous
+ Contact Us
);
@@ -110,21 +111,21 @@ Un lien de style arrondi avec un composant Chip pour les liens.
```
-
- | Propriétés | Type | Description |
- | ---------- | ----------------- | -------------------------------------------------------- |
- | href | chaîne | L'URL cible ou le chemin du lien |
- | enfants | `React.ReactNode` | Le contenu à afficher à l'intérieur du lien |
- | onClick | fonction | Fonction de rappel à déclencher lors du clic sur le lien |
+
+ | Props | Type | Description |
+ | -------- | ----------------- | ---------------------------------------------------------- |
+ | href | string | The target URL or path for the link |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
-## Lien social
+## Social Link
-Liens sociaux stylisés, avec support pour différents types de liens sociaux, tels que les URL, LinkedIn, et X (ou Twitter).
+Stylized social links, with support for various social link types, such as URLs, LinkedIn, and X (or Twitter).
-
+
```jsx
import { SocialLink } from "twenty-ui/navigation";
import { BrowserRouter as Router } from "react-router-dom";
@@ -142,12 +143,12 @@ Liens sociaux stylisés, avec support pour différents types de liens sociaux, t
```
-
- | Propriétés | Type | Description |
- | ---------- | ----------------- | ------------------------------------------------------------------------------- |
- | href | chaîne | L'URL cible ou le chemin du lien |
- | enfants | `React.ReactNode` | Le contenu à afficher à l'intérieur du lien |
- | type | chaîne | Le type de liens sociaux. Les options incluent: `url`, `LinkedIn`, et `Twitter` |
- | onClick | fonction | Fonction de rappel à déclencher lors du clic sur le lien |
+
+ | Props | Type | Description |
+ | -------- | ----------------- | --------------------------------------------------------------------------- |
+ | href | string | The target URL or path for the link |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
+ | type | string | The type of social links. Options include: `url`, `LinkedIn`, and `Twitter` |
+ | onClick | function | Callback function to be triggered when the link is clicked |
diff --git a/packages/twenty-docs/l/fr/twenty-ui/navigation/menu-item.mdx b/packages/twenty-docs/l/fr/twenty-ui/navigation/menu-item.mdx
index fd6212fe28..209c6270ea 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/navigation/menu-item.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/navigation/menu-item.mdx
@@ -1,5 +1,5 @@
---
-title: Élément de menu
+title: Menu Item
image: /images/user-guide/kanban-views/kanban.png
---
@@ -7,452 +7,422 @@ image: /images/user-guide/kanban-views/kanban.png
-Un élément de menu polyvalent conçu pour être utilisé dans un menu ou une liste de navigation.
+A versatile menu item designed to be used in a menu or navigation list.
-
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { IconAlertCircle } from "@tabler/icons-react";
+ import { MenuItem } from "twenty-ui/display";
-```jsx
-import { IconBell } from "@tabler/icons-react";
-import { IconAlertCircle } from "@tabler/icons-react";
-import { MenuItem } from "twenty-ui/display";
+ export const MyComponent = () => {
+ const handleMenuItemClick = (event) => {
+ console.log("Menu item clicked!", event);
+ };
-export const MyComponent = () => {
- const handleMenuItemClick = (event) => {
- console.log("Menu item clicked!", event);
- };
+ const handleButtonClick = (event) => {
+ console.log("Icon button clicked!", event);
+ };
- const handleButtonClick = (event) => {
- console.log("Icon button clicked!", event);
- };
+ return (
+
+ );
+ };
+ ```
+
- return (
-
- );
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| ------------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
-| LeftIcon | ComposantIcône | Une icône à gauche optionnelle affichée avant le texte dans l'élément de menu |
-| accent | chaîne | Spécifie la couleur d'accent de l'élément de menu. Les options incluent : `default`, `danger` et `placeholder` |
-| texte | chaîne | Le contenu texte de l'élément de menu |
-| boutonsIcône | tableau | Un tableau d'objets représentant des boutons d'icônes supplémentaires associés à l'élément de menu |
-| isTooltipOpen | booléen | Contrôle la visibilité de l'infobulle associée à l'élément de menu |
-| testId | chaîne | L'attribut data-testid à des fins de test |
-| auClique | fonction | Fonction de rappel déclenchée lorsqu'on clique sur l'élément de menu |
-| nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
-
-
+
+ | Props | Type | Description |
+ | ------------- | ------------- | ---------------------------------------------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | accent | string | Specifies the accent color of the menu item. Options include: `default`, `danger`, and `placeholder` |
+ | text | string | The text content of the menu item |
+ | iconButtons | array | An array of objects representing additional icon buttons associated with the menu item |
+ | isTooltipOpen | boolean | Controls the visibility of the tooltip associated with the menu item |
+ | testId | string | The data-testid attribute for testing purposes |
+ | onClick | function | Callback function triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
-## Variantes
+## Variants
-Les différentes variantes du composant d'élément de menu incluent les suivantes :
+The different variants of the menu item component include the following:
-### Commande
+### Command
-Un élément de menu de style commande dans un menu pour indiquer des raccourcis clavier.
+A command-style menu item within a menu to indicate keyboard shortcuts.
-
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemCommand } from "twenty-ui/display";
-```jsx
-import { IconBell } from "@tabler/icons-react";
-import { MenuItemCommand } from "twenty-ui/display";
+ export const MyComponent = () => {
+ const handleCommandClick = () => {
+ console.log("Command clicked!");
+ };
-export const MyComponent = () => {
- const handleCommandClick = () => {
- console.log("Command clicked!");
- };
+ return (
+
+ );
+ };
+ ```
+
- return (
-
- );
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| ----------------- | -------------- | ----------------------------------------------------------------------------- |
-| LeftIcon | ComposantIcône | Une icône à gauche optionnelle affichée avant le texte dans l'élément de menu |
-| texte | chaîne | Le contenu texte de l'élément de menu |
-| premierRaccourci | chaîne | Le premier raccourci clavier associé à la commande |
-| deuxièmeRaccourci | chaîne | Le deuxième raccourci clavier associé à la commande |
-| estSélectionné | booléen | Indique si l'élément de menu est sélectionné ou surligné |
-| onClick | fonction | Fonction de rappel déclenchée lorsqu'on clique sur l'élément de menu |
-| nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
-
-
+
+ | Props | Type | Description |
+ | ------------ | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | firstHotKey | string | The first keyboard shortcut associated with the command |
+ | secondHotKey | string | The second keyboard shortcut associated with the command |
+ | isSelected | boolean | Indicates whether the menu item is selected or highlighted |
+ | onClick | function | Callback function triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
### Draggable
-Un élément de menu draggable conçu pour être utilisé dans un menu ou une liste où les éléments peuvent être glissés, et des actions supplémentaires peuvent être effectuées via les boutons d'icônes.
+A draggable menu item component designed to be used in a menu or list where items can be dragged, and additional actions can be performed through icon buttons.
-
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { IconAlertCircle } from "@tabler/icons-react";
+ import { MenuItemDraggable } from "twenty-ui/display";
-```jsx
-import { IconBell } from "@tabler/icons-react";
-import { IconAlertCircle } from "@tabler/icons-react";
-import { MenuItemDraggable } from "twenty-ui/display";
+ export const MyComponent = () => {
+ const handleMenuItemClick = (event) => {
+ console.log("Menu item clicked!", event);
+ };
-export const MyComponent = () => {
- const handleMenuItemClick = (event) => {
- console.log("Menu item clicked!", event);
- };
+ return (
+
+ );
+ };
+ ```
+
- return (
-
- );
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| -------------- | -------------- | ------------------------------------------------------------------------------------------------------------- |
-| LeftIcon | ComposantIcône | Une icône à gauche optionnelle affichée avant le texte dans l'élément de menu |
-| accent | chaîne | La couleur d'accent de l'élément de menu. Elle peut être `défaut`, `placeholder`, et `danger` |
-| boutonsIcône | tableau | Un tableau d'objets représentant des boutons d'icônes supplémentaires associés à l'élément de menu |
-| isTooltipOpen | booléen | Contrôle la visibilité de l'infobulle associée à l'élément de menu |
-| auClique | fonction | Fonction de rappel à déclencher lors du clic sur le lien |
-| texte | chaîne | Le contenu texte de l'élément de menu |
-| isDragDisabled | booléen | Indique si le glissement est désactivé |
-| nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
-
-
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ------------------------------------------------------------------------------------------ |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | accent | string | The accent color of the menu item. It can either be `default`, `placeholder`, and `danger` |
+ | iconButtons | array | An array of objects representing additional icon buttons associated with the menu item |
+ | isTooltipOpen | boolean | Controls the visibility of the tooltip associated with the menu item |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | text | string | The text content of the menu item |
+ | isDragDisabled | boolean | Indicates whether dragging is disabled |
+ | className | string | Optional name for additional styling |
+
-### Sélection multiple
+### Multi Select
-Fournit un moyen d'implémenter une fonctionnalité de sélection multiple avec une case à cocher associée.
+Provides a way to implement multi-select functionality with an associated checkbox.
-
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemMultiSelect } from "twenty-ui/display";
-```jsx
-import { IconBell } from "@tabler/icons-react";
-import { MenuItemMultiSelect } from "twenty-ui/display";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
- return (
-
- );
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| -------------- | -------------- | ----------------------------------------------------------------------------- |
-| LeftIcon | ComposantIcône | Une icône à gauche optionnelle affichée avant le texte dans l'élément de menu |
-| texte | chaîne | Le contenu texte de l'élément de menu |
-| sélectionné | booléen | Indique si l'élément de menu est sélectionné (coché) |
-| onSelectChange | fonction | Fonction de rappel déclenchée lorsque l'état de la case à cocher change |
-| nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
-
-
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | onSelectChange | function | Callback function triggered when the checkbox state changes |
+ | className | string | Optional name for additional styling |
+
-### Sélection multiple avec avatar
+### Multi Select Avatar
-Un élément de menu multi-sélection avec un avatar, une case à cocher pour la sélection, et du contenu textuel.
+A multi-select menu item with an avatar, a checkbox for selection, and textual content.
-
+
+ ```jsx
+ import { MenuItemMultiSelectAvatar } from "twenty-ui/display";
-```jsx
-import { MenuItemMultiSelectAvatar } from "twenty-ui/display";
+ export const MyComponent = () => {
+ const imageUrl =
+ "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
-export const MyComponent = () => {
- const imageUrl =
- "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
+ return (
+ }
+ text="First Option"
+ selected={false}
+ className
+ />
+ );
+ };
+ ```
+
- return (
- }
- text="First Option"
- selected={false}
- className
- />
- );
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| -------------- | ----------- | ----------------------------------------------------------------------- |
-| avatar | `ReactNode` | L'avatar ou l'icône à afficher sur le côté gauche de l'élément de menu |
-| texte | chaîne | Le contenu texte de l'élément de menu |
-| sélectionné | booléen | Indique si l'élément de menu est sélectionné (coché) |
-| onSelectChange | fonction | Fonction de rappel déclenchée lorsque l'état de la case à cocher change |
-| nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
-
-
+
+ | Props | Type | Description |
+ | -------------- | ----------- | -------------------------------------------------------------------- |
+ | avatar | `ReactNode` | The avatar or icon to be displayed on the left side of the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | onSelectChange | function | Callback function triggered when the checkbox state changes |
+ | className | string | Optional name for additional styling |
+
-### Naviguer
+### Navigate
-Un élément de menu comportant une icône facultative à gauche, un contenu textuel, et une icône de chevron droite.
+A menu item featuring an optional left icon, textual content, and a right-chevron icon.
-
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemNavigate } from "twenty-ui/display";
-```jsx
-import { IconBell } from "@tabler/icons-react";
-import { MenuItemNavigate } from "twenty-ui/display";
+ export const MyComponent = () => {
+ const handleNavigation = () => {
+ console.log("Navigate to another page");
+ };
-export const MyComponent = () => {
- const handleNavigation = () => {
- console.log("Navigate to another page");
- };
+ return (
+
+ );
+ };
+ ```
+
- return (
-
- );
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| ----------- | -------------- | ----------------------------------------------------------------------------- |
-| LeftIcon | ComposantIcône | Une icône à gauche optionnelle affichée avant le texte dans l'élément de menu |
-| texte | chaîne | Le contenu texte de l'élément de menu |
-| auClique | fonction | Fonction de rappel à déclencher lorsqu'on clique sur l'élément de menu |
-| nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
-
-
+
+ | Props | Type | Description |
+ | --------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
-### Sélectionner
+### Select
-Un élément de menu sélectionnable, avec un contenu facultatif à gauche (icône et texte) et un indicateur (icône de coche) pour l'état sélectionné.
+A selectable menu item, featuring optional left content (icon and text) and an indicator (check icon) for the selected state.
-
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemSelect } from "twenty-ui/display";
-```jsx
-import { IconBell } from "@tabler/icons-react";
-import { MenuItemSelect } from "twenty-ui/display";
+ export const MyComponent = () => {
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
-export const MyComponent = () => {
- const handleSelection = () => {
- console.log("Menu item selected");
- };
+ return (
+
+ );
+ };
+ ```
+
- return (
-
- );
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| ----------- | -------------- | ----------------------------------------------------------------------------- |
-| LeftIcon | ComposantIcône | Une icône à gauche optionnelle affichée avant le texte dans l'élément de menu |
-| texte | chaîne | Le contenu texte de l'élément de menu |
-| sélectionné | booléen | Indique si l'élément de menu est sélectionné (coché) |
-| désactivé | booléen | Indique si l'élément de menu est désactivé |
-| survolé | booléen | Indique si l'élément de menu est actuellement survolé |
-| auClique | fonction | Fonction de rappel à déclencher lorsqu'on clique sur l'élément de menu |
-| nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
-
-
+
+ | Props | Type | Description |
+ | --------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
-### Sélectionner Avatar
+### Select Avatar
-Un élément de menu sélectionnable avec un avatar, avec un contenu facultatif à gauche (avatar et texte) et un indicateur (icône de coche) pour l'état sélectionné.
+A selectable menu item with an avatar, featuring optional left content (avatar and text) and an indicator (check icon) for the selected state.
-
+
+ ```jsx
+ import { MenuItemSelectAvatar } from "twenty-ui/display";
-```jsx
-import { MenuItemSelectAvatar } from "twenty-ui/display";
+ export const MyComponent = () => {
+ const imageUrl =
+ "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
-export const MyComponent = () => {
- const imageUrl =
- "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
- const handleSelection = () => {
- console.log("Menu item selected");
- };
+ return (
+ }
+ text="First Option"
+ selected={true}
+ disabled={false}
+ hovered={false}
+ testId="menu-item-test"
+ onClick={handleSelection}
+ className
+ />
+ );
+ };
- return (
- }
- text="First Option"
- selected={true}
- disabled={false}
- hovered={false}
- testId="menu-item-test"
- onClick={handleSelection}
- className
- />
- );
-};
+ ```
+
-```
-
-
-
-
-| Propriétés | Type | Description |
-| ----------- | ----------- | ----------------------------------------------------------------------- |
-| avatar | `ReactNode` | L'avatar ou l'icône à afficher sur le côté gauche de l'élément de menu |
-| texte | chaîne | Le contenu texte de l'élément de menu |
-| sélectionné | booléen | Indique si l'élément de menu est sélectionné (coché) |
-| désactivé | booléen | Indique si l'élément de menu est désactivé |
-| survolé | booléen | Indique si l'élément de menu est actuellement survolé |
-| testId | chaîne | L'attribut data-testid à des fins de test |
-| onClick | fonction | Fonction de rappel à déclencher lorsqu'on clique sur l'élément de menu |
-| nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
-
-
+
+ | Props | Type | Description |
+ | --------- | ----------- | -------------------------------------------------------------------- |
+ | avatar | `ReactNode` | The avatar or icon to be displayed on the left side of the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | testId | string | The data-testid attribute for testing purposes |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
-### Sélection de Couleur
+### Select Color
-Un élément de menu sélectionnable avec un échantillon de couleur pour les scénarios où vous souhaitez que les utilisateurs choisissent une couleur dans un menu.
+A selectable menu item with a color sample for scenarios where you want users to choose a color from a menu.
-
+
+ ```jsx
+ import { MenuItemSelectColor } from "twenty-ui/display";
-```jsx
-import { MenuItemSelectColor } from "twenty-ui/display";
+ export const MyComponent = () => {
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
-export const MyComponent = () => {
- const handleSelection = () => {
- console.log("Menu item selected");
- };
+ return (
+
+ );
+ };
+ ```
+
- return (
-
- );
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| ----------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| couleur | chaîne | La couleur à thème à afficher comme échantillon dans l'élément de menu. Les options incluent: `vert`, `turquoise`, `ciel`, `bleu`, `violet`, `rose`, `rouge`, `orange`, `jaune`, `gris` |
-| sélectionné | booléen | Indique si l'élément de menu est sélectionné (coché) |
-| désactivé | booléen | Indique si l'élément de menu est désactivé |
-| survolé | booléen | Indique si l'élément de menu est actuellement survolé |
-| variante | chaîne | La variante de l'échantillon de couleur. Elle peut être `défaut` ou `pipeline` |
-| onClick | fonction | Fonction de rappel à déclencher lorsqu'on clique sur l'élément de menu |
-| nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
-
-
+
+ | Props | Type | Description |
+ | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | color | string | The theme color to be displayed as a sample in the menu item. Options include: `green`, `turquoise`, `sky`, `blue`, `purple`, `pink`, `red`, `orange`, `yellow`, and `gray` |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | variant | string | The variant of the color sample. It can either be `default` or `pipeline` |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
-### Basculer
+### Toggle
-Un élément de menu avec un interrupteur à bascule associé pour permettre aux utilisateurs d'activer ou de désactiver une fonctionnalité spécifique
+A menu item with an associated toggle switch to allow users to enable or disable a specific feature
-
+
+ ```jsx
+ import { IconBell } from '@tabler/icons-react';
-```jsx
-import { IconBell } from '@tabler/icons-react';
+ import { MenuItemToggle } from 'twenty-ui/display';
-import { MenuItemToggle } from 'twenty-ui/display';
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
- return (
-
- );
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| --------------------- | -------------- | -------------------------------------------------------------------------------------- |
-| LeftIcon | ComposantIcône | Une icône à gauche optionnelle affichée avant le texte dans l'élément de menu |
-| texte | chaîne | Le contenu texte de l'élément de menu |
-| basculé | booléen | Indique si l'interrupteur est en "marche" ou "arrêt". |
-| surChangementBasculer | fonction | Fonction de rappel déclenchée lorsque l'état de l'interrupteur change. |
-| tailleBasculer | chaîne | La taille de l'interrupteur à bascule. Cela peut être soit \ |
-| nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
-
-
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ----------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | toggled | boolean | Indicates whether the toggle switch is in the "on" or "off" state |
+ | onToggleChange | function | Callback function triggered when the toggle switch state changes |
+ | toggleSize | string | The size of the toggle switch. It can be either \ |
+ | className | string | Optional name for additional styling |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/fr/twenty-ui/navigation/navigation-bar.mdx
new file mode 100644
index 0000000000..a77e9f34e6
--- /dev/null
+++ b/packages/twenty-docs/l/fr/twenty-ui/navigation/navigation-bar.mdx
@@ -0,0 +1,49 @@
+---
+title: Navigation Bar
+image: /images/user-guide/table-views/table.png
+---
+
+
+
+
+
+Renders a navigation bar that contains multiple `NavigationBarItem` components.
+
+
+
+ ```jsx
+ import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
+ import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
+
+ export const MyComponent = () => {
+
+ const navigationItems = [
+ {
+ name: "Home",
+ Icon: IconHome,
+ onClick: () => console.log("Home clicked"),
+ },
+ {
+ name: "Profile",
+ Icon: IconUser,
+ onClick: () => console.log("Profile clicked"),
+ },
+ {
+ name: "Settings",
+ Icon: IconSettings,
+ onClick: () => console.log("Settings clicked"),
+ },
+ ];
+
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | activeItemName | string | The name of the currently active navigation item |
+ | items | array | An array of objects representing each navigation item. Each object contains the `name` of the item, the `Icon` component to display, and an `onClick` function to be called when the item is clicked |
+
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/fr/twenty-ui/navigation/step-bar.mdx
index 41bb17dedb..66c420f561 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/navigation/step-bar.mdx
@@ -1,34 +1,34 @@
---
-title: Barre d'étape
+title: Step Bar
image: /images/user-guide/api/api.png
---
-
+
-Affiche la progression à travers une séquence d'étapes numérotées en surlignant l'étape active. Il affiche un conteneur avec des étapes, chacune représentée par le composant `Step`.
+Displays progress through a sequence of numbered steps by highlighting the active step. It renders a container with steps, each represented by the `Step` component.
-
+
```jsx
import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
export const MyComponent = () => {
return (
- Étape 1
- Étape 2
- Étape 3
+ Step 1
+ Step 2
+ Step 3
);
};
```
-
- | Propriétés | Type | Description |
- | ----------- | ------ | --------------------------------------------------------------------------------------------------------- |
- | étapeActive | nombre | L'index de l'étape actuellement active. Cela détermine quelle étape doit être visuellement mise en valeur |
+
+ | Props | Type | Description |
+ | ---------- | ------ | ------------------------------------------------------------------------------------------------- |
+ | activeStep | number | The index of the currently active step. This determines which step should be visually highlighted |
diff --git a/packages/twenty-docs/l/fr/twenty-ui/progress-bar.mdx b/packages/twenty-docs/l/fr/twenty-ui/progress-bar.mdx
index 2f9f866831..2e4735ab30 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/progress-bar.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/progress-bar.mdx
@@ -1,16 +1,16 @@
---
-title: Retour d'information
+title: Feedback
image: /images/user-guide/emails/emails_header.png
---
-
+
-Indique le progrès ou le compte à rebours et passe de droite à gauche.
+Indicates progress or countdown and moves from right to left.
-
+
```jsx
import { ProgressBar } from "twenty-ui/feedback";
@@ -29,24 +29,24 @@ Indique le progrès ou le compte à rebours et passe de droite à gauche.
```
-
- | Propriétés | Type | Description | Par défaut |
- | -------------------- | ------- | --------------------------------------------------------------------------------------------------------- | ---------- |
- | durée | nombre | La durée totale de l'animation de la barre de progression en millisecondes | 3 |
- | délai | nombre | Le délai de démarrage de l'animation de la barre de progression en millisecondes | 0 |
- | adoucissement | chaîne | Fonction d'adoucissement pour l'animation de la barre de progression | easeInOut |
- | hauteurBarre | nombre | La hauteur de la barre en pixels | 24 |
- | couleurBarre | chaîne | La couleur de la barre | gray80 |
- | démarrageAutomatique | booléen | Si `true`, l'animation de la barre de progression commence automatiquement lorsque le composant est monté | `vrai` |
+
+ | Props | Type | Description | Default |
+ | --------- | ------- | ------------------------------------------------------------------------------------ | --------- |
+ | duration | number | The total duration of the progress bar animation in milliseconds | 3 |
+ | delay | number | The delay in starting the progress bar animation in milliseconds | 0 |
+ | easing | string | Easing function for the progress bar animation | easeInOut |
+ | barHeight | number | The height of the bar in pixels | 24 |
+ | barColor | string | The color of the bar | gray80 |
+ | autoStart | boolean | If `true`, the progress bar animation starts automatically when the component mounts | `true` |
-## Barre de Progression Circulaire
+## Circular Progress Bar
-Indique le progrès d'une tâche, souvent utilisé sur des écrans de chargement ou dans des zones où vous souhaitez communiquer des processus en cours à l'utilisateur.
+Indicates the progress of a task, often used in loading screens or areas where you want to communicate ongoing processes to the user.
-
+
```jsx
import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
@@ -56,11 +56,11 @@ Indique le progrès d'une tâche, souvent utilisé sur des écrans de chargement
```
-
- | Propriétés | Type | Description | Par défaut |
- | ------------ | ------ | ------------------------------------------------- | --------------- |
- | taille | nombre | La taille de la barre de progression circulaire | 50 |
- | largeurBarre | nombre | La largeur de la ligne de la barre de progression | 5 |
- | couleurBarre | chaîne | La couleur de la barre de progression | couleurCourante |
+
+ | Props | Type | Description | Default |
+ | -------- | ------ | ------------------------------------- | ------------ |
+ | size | number | The size of the circular progress bar | 50 |
+ | barWidth | number | The width of the progress bar line | 5 |
+ | barColor | string | The color of the progress bar | currentColor |
diff --git a/packages/twenty-docs/l/fr/user-guide/ai/capabilities/ai-agents.mdx b/packages/twenty-docs/l/fr/user-guide/ai/capabilities/ai-agents.mdx
new file mode 100644
index 0000000000..8811db9709
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/ai/capabilities/ai-agents.mdx
@@ -0,0 +1,34 @@
+---
+title: AI Agents
+description: Integrate AI capabilities directly into your automation workflows.
+---
+
+
+ This feature is in development and will be available in beta soon.
+
+
+## Overview
+
+Integrate AI capabilities directly into your automation workflows for intelligent data processing and decision-making.
+
+## Capabilities
+
+| Feature | Description |
+| ------------------- | ------------------------------------------------ |
+| **AI actions** | Add AI-powered steps to any workflow |
+| **Data enrichment** | Automatically enhance records with external data |
+| **Classification** | Categorize records based on content analysis |
+| **Summarization** | Generate summaries from text fields |
+| **Custom prompts** | Define exactly how AI processes your data |
+
+## Use Cases
+
+* **Lead scoring**: Automatically score and prioritize inbound leads
+* **Data cleanup**: Standardize company names and contact information
+* **Email drafts**: Generate follow-up emails based on meeting notes
+* **Record routing**: Assign records to the right team member based on content
+
+## Related
+
+* [Workflows Overview](/l/fr/user-guide/workflows/overview) — automation basics
+* [AI Permissions](/l/fr/user-guide/ai/capabilities/permissions-access-control) — access control for AI agents
diff --git a/packages/twenty-docs/l/fr/user-guide/ai/capabilities/ai-chatbot.mdx b/packages/twenty-docs/l/fr/user-guide/ai/capabilities/ai-chatbot.mdx
new file mode 100644
index 0000000000..d7cbbc04fc
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/ai/capabilities/ai-chatbot.mdx
@@ -0,0 +1,41 @@
+---
+title: AI Chatbot
+description: An intelligent assistant that helps you interact with your CRM data using natural language.
+---
+
+
+ This feature is in development and will be available in beta soon.
+
+
+## Overview
+
+An intelligent assistant that helps you interact with your CRM data using natural language.
+
+## Capabilities
+
+| Feature | Description |
+| ---------------------------- | ------------------------------------------------------------------------- |
+| **Natural language queries** | Ask questions in plain English instead of building filters |
+| **Full data access** | Query records, relationships, and metrics across your workspace |
+| **Page context** | Reference "this company" or "this opportunity" based on your current view |
+| **Conversational** | Follow-up questions maintain context from previous queries |
+
+## Example Interactions
+
+### Finding Records
+
+* "Show me all opportunities over $50,000"
+* "Find contacts I haven't emailed in 2 weeks"
+* "List companies in the healthcare industry"
+
+### Getting Insights
+
+* "What's my total pipeline value?"
+* "How many deals closed last month?"
+* "Which stage has the most stuck opportunities?"
+
+### Using Page Context
+
+* "Summarize my interactions with this person" (on a contact page)
+* "What opportunities are linked to this company?" (on a company page)
+* "When was this deal last updated?" (on an opportunity page)
diff --git a/packages/twenty-docs/l/fr/user-guide/ai/capabilities/permissions-access-control.mdx b/packages/twenty-docs/l/fr/user-guide/ai/capabilities/permissions-access-control.mdx
index fc8db7cc80..f0c4899875 100644
--- a/packages/twenty-docs/l/fr/user-guide/ai/capabilities/permissions-access-control.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/ai/capabilities/permissions-access-control.mdx
@@ -1,35 +1,35 @@
---
-title: Autorisations et contrôle d’accès
-description: Contrôlez ce à quoi les agents IA peuvent accéder et ce qu’ils peuvent modifier dans votre espace de travail.
+title: Permissions & Access Control
+description: Control what AI agents can access and modify in your workspace.
---
-## Vue d'ensemble
+## Overview
-Les agents IA respectent votre structure d’autorisations existante. C’est particulièrement important pour les équipes qui veulent contrôler précisément à quoi les processus d’IA automatisés peuvent accéder ou ce qu’ils peuvent modifier dans leur espace de travail.
+AI agents respect your existing permission structure. This is particularly important for teams who want to control exactly what automated AI processes can access or modify in their workspace.
-## Attribuer un Rôle à un Agent IA
+## Assign a Role to an AI Agent
-1. Allez dans **Paramètres → Rôles**
-2. Cliquez sur le rôle que vous souhaitez attribuer
-3. Ouvrez l'onglet **Attribution**
-4. Sous **Agents IA**, cliquez sur **+ Attribuer à un agent IA**
-5. Sélectionnez l’agent IA dans la liste
-6. Confirmez l'attribution
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **AI Agents**, click **+ Assign to AI agent**
+5. Select the AI agent from the list
+6. Confirm the assignment
-## Pourquoi Attribuer des Rôles aux Agents IA ?
+## Why Assign Roles to AI Agents?
-| Avantage | Description |
-| ---------------- | --------------------------------------------------------------------------------------- |
-| **Sécurité** | Limitez les données auxquelles les agents IA peuvent accéder ou qu’ils peuvent modifier |
-| **Conformité** | Garantissez que l’IA ne traite que les données dont elle a besoin |
-| **Contrôle** | Empêchez les actions involontaires des automatisations d’IA |
-| **Auditabilité** | Suivez quelles actions ont été effectuées par chaque agent |
+| Benefit | Description |
+| ---------------- | ------------------------------------------------- |
+| **Security** | Limit what data AI agents can access or modify |
+| **Compliance** | Ensure AI only processes the data it needs |
+| **Control** | Prevent unintended actions from AI automations |
+| **Auditability** | Track which actions were performed by which agent |
- Pour les agents IA s’exécutant au sein de flux de travail, l’attribution d’un rôle garantit que l’agent ne peut pas accéder ni modifier des données en dehors de sa portée prévue—même si le flux de travail dispose d’autorisations plus étendues.
+ For AI agents running within workflows, role assignment ensures the agent cannot access or modify data outside its intended scope—even if the workflow has broader permissions.
-## Contenu connexe
+## Related
-* [Autorisations](/l/fr/user-guide/permissions-access/capabilities/permissions) — informations détaillées sur la création et la gestion des rôles
-* [Agents IA](/l/fr/user-guide/ai/capabilities/ai-agents) — fonctionnalités d’IA dans les flux de travail
+* [Permissions](/l/fr/user-guide/permissions-access/capabilities/permissions) — detailed information on creating and managing roles
+* [AI Agents](/l/fr/user-guide/ai/capabilities/ai-agents) — AI capabilities in workflows
diff --git a/packages/twenty-docs/l/fr/user-guide/ai/how-tos/ai-faq.mdx b/packages/twenty-docs/l/fr/user-guide/ai/how-tos/ai-faq.mdx
new file mode 100644
index 0000000000..774eae15c4
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/ai/how-tos/ai-faq.mdx
@@ -0,0 +1,29 @@
+---
+title: AI FAQ
+description: Frequently asked questions about AI features in Twenty.
+---
+
+
+
+ AI features are currently in development and will be released in beta soon. Stay tuned for updates!
+
+
+
+ We're building two main AI capabilities:
+
+ 1. **AI Chatbot**: A context-aware assistant that can access your Twenty data and help you with queries
+ 2. **AI Agents in Workflows**: Intelligent automation that can process data, make decisions, and execute tasks within your workflows
+
+
+
+ AI agents will operate under the permission system. You can assign specific roles to AI agents under **Settings → Roles**, giving you full control over what data they can access and what actions they can perform.
+
+
+
+ AI actions will consume workflow credits based on the complexity of the task and the AI model used. More details will be available when the features launch.
+
+
+
+ Initially, Twenty will use built-in AI models. Support for custom or external AI models may be added in future releases based on user feedback.
+
+
diff --git a/packages/twenty-docs/l/fr/user-guide/ai/overview.mdx b/packages/twenty-docs/l/fr/user-guide/ai/overview.mdx
new file mode 100644
index 0000000000..bd4ee68a79
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/ai/overview.mdx
@@ -0,0 +1,62 @@
+---
+title: AI
+description: AI-powered features coming soon to Twenty.
+---
+
+
+
+
+
+## What's Coming
+
+Twenty is building AI capabilities to help your team work smarter. We're focusing on two major areas:
+
+### 1. AI Chatbot
+
+A conversational assistant that understands your context and has access to all your Twenty data.
+
+**Key capabilities:**
+
+* **Full data access**: Query any record, relationship, or metric in your workspace
+* **Page context awareness**: Reference "this company" or "this opportunity" based on where you are in Twenty
+* **Natural language**: Ask questions and get answers without navigating menus
+
+**Example prompts:**
+
+* "What opportunities are closing this month?"
+* "Which deals have been in Negotiation for more than 30 days?"
+* "Summarize my interactions with this person"
+
+### 2. AI Agents in Workflows
+
+Extend your workflows with AI-powered actions and autonomous agents.
+
+**Key capabilities:**
+
+* **AI actions**: Use AI to enrich data, classify records, generate summaries, and more
+* **Autonomous agents**: Let agents execute multi-step tasks within a workflow
+* **Custom prompts**: Define exactly how AI should process your data
+
+**Use cases:**
+
+* Automatically categorize inbound leads
+* Enrich company data from public sources
+* Generate follow-up email drafts based on meeting notes
+* Score opportunities based on engagement patterns
+
+## Permissions and Access Control
+
+AI agents will be managed through the existing permissions system:
+
+1. Go to **Settings → Roles**
+2. Configure which data each AI agent can access
+3. Set read/write permissions per object
+
+This ensures AI agents respect your data governance policies and only access what they need.
+
+## Stay Updated
+
+We'll update this section as AI features become available. In the meantime:
+
+* Follow our [GitHub](https://github.com/twentyhq/twenty) for development updates
+* Join our [Discord](https://discord.gg/twenty) to share feedback and feature requests
diff --git a/packages/twenty-docs/l/fr/user-guide/billing/capabilities/pricing-plans.mdx b/packages/twenty-docs/l/fr/user-guide/billing/capabilities/pricing-plans.mdx
index b762a884cf..90bf7e7cbb 100644
--- a/packages/twenty-docs/l/fr/user-guide/billing/capabilities/pricing-plans.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/billing/capabilities/pricing-plans.mdx
@@ -1,79 +1,79 @@
---
-title: Formules tarifaires},{
-description: En savoir plus sur les formules tarifaires de Twenty et comment passer de l’une à l’autre.
+title: Pricing Plans
+description: Learn about Twenty's pricing plans and how to switch between them.
---
-## Vue d'ensemble
+## Overview
-Twenty propose une tarification flexible adaptée aux équipes de toute taille, que vous préfériez l’hébergement cloud ou l’auto-hébergement.
+Twenty offers flexible pricing to fit teams of all sizes, whether you prefer cloud hosting or self-hosting.
-## Formules Cloud
+## Cloud Plans
### Pro (Cloud)
-Pour les équipes prêtes à passer à l’échelle :
+For teams ready to scale:
-* Toutes les fonctionnalités CRM essentielles
-* Synchronisation des e-mails et du calendrier
-* Workflows et automatisations
-* Support standard
+* All core CRM features
+* Email and calendar sync
+* Workflows and automations
+* Standard support
- Les fonctionnalités premium (SSO et autorisations au niveau des lignes) ne sont pas incluses dans la formule Pro.
+ Premium features (SSO and row-level permissions) are not included in the Pro plan.
-### Organisation (Cloud)
+### Organization (Cloud)
-Pour les équipes plus importantes ayant des besoins avancés :
+For larger teams with advanced needs:
-* Tout ce qui est inclus dans Pro
-* **Fonctionnalités premium** : intégration SSO et autorisations au niveau des lignes
-* Support prioritaire
+* Everything in Pro
+* **Premium features**: SSO integration and row-level permissions
+* Priority support
-## Formules auto-hébergées
+## Self-Hosted Plans
-### Gratuit (Auto-hébergé)
+### Free (Self-Hosted)
-Hébergez Twenty sur votre propre infrastructure, sans frais :
+Host Twenty on your own infrastructure at no cost:
-* Toutes les fonctionnalités Pro incluses
-* Support communautaire via Discord
-* Contrôle total sur vos données
+* All Pro features included
+* Community support via Discord
+* Full control over your data
-### Organisation (Auto-hébergé)
+### Organization (Self-Hosted)
-Pour les équipes qui ont besoin de fonctionnalités premium tout en s’auto-hébergeant :
+For teams who need premium features while self-hosting:
-* Toutes les fonctionnalités Pro
-* **Fonctionnalités premium** : intégration SSO et autorisations au niveau des lignes
-* Assistance de l’équipe Twenty
-* Aucune obligation de publier le code personnalisé en open source avant de le distribuer
+* All Pro features
+* **Premium features**: SSO integration and row-level permissions
+* Twenty team support
+* No requirement to publish custom code as open-source before distributing
-## Fonctionnalités premium
+## Premium Features
-Les fonctionnalités premium ne sont disponibles que sur les formules Organisation (Cloud ou auto-hébergé) :
+Premium features are only available on the Organization plans (Cloud or Self-Hosted):
-* **Intégration SSO** : authentification unique avec votre fournisseur d’identité
-* **Autorisations au niveau des lignes** : contrôle d’accès granulaire au niveau de l’enregistrement
+* **SSO integration**: Single Sign-On with your identity provider
+* **Row-level permissions**: Fine-grained access control at the record level
-## Changer de formule
+## Switching Plans
-### Passer à l’Organisation
+### Upgrade to Organization
-1. Allez dans **Paramètres → Facturation**
-2. Cliquez sur **Passer à l’Organisation**
-3. Confirmez la mise à niveau
+1. Go to **Settings → Billing**
+2. Click **Switch to Organization**
+3. Confirm your upgrade
-### Rétrograder vers Pro
+### Downgrade to Pro
-Contactez l’assistance pour rétrograder votre formule.
+Contact support to downgrade your plan.
-### Passer à la facturation annuelle
+### Switch to Yearly Billing
-1. Allez dans **Paramètres → Facturation**
-2. Cliquez sur **Passer à l’annuel**
-3. Économisez avec la facturation annuelle
+1. Go to **Settings → Billing**
+2. Click **Switch to Yearly**
+3. Save with annual billing
-### Passer à la facturation mensuelle
+### Switch to Monthly Billing
-Contactez l’assistance pour revenir à la facturation mensuelle.
+Contact support to switch back to monthly billing.
diff --git a/packages/twenty-docs/l/fr/user-guide/billing/capabilities/workflow-credits.mdx b/packages/twenty-docs/l/fr/user-guide/billing/capabilities/workflow-credits.mdx
new file mode 100644
index 0000000000..0ce8e3be72
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/billing/capabilities/workflow-credits.mdx
@@ -0,0 +1,49 @@
+---
+title: Workflow Credits
+description: Understanding workflow credits, consumption, and how to purchase more.
+---
+
+## Overview
+
+Credits power your workflow automations in Twenty. Every workflow action consumes credits based on its complexity.
+
+## Credit Allocation
+
+Credits are based on your billing cycle, not your plan:
+
+| Billing Cycle | Credits |
+| ------------- | --------------- |
+| Monthly | 5 million/month |
+| Yearly | 50 million/year |
+
+
+ The 5 million monthly credits are designed to empower you to run automations without worrying about costs. For most workflows using standard actions, this is more than enough. You'll only need additional credits when running advanced code nodes or AI-powered features.
+
+
+## Credit Consumption
+
+Different actions consume different amounts of credits:
+
+| Action Type | Credit Usage |
+| ------------------------------------------------------- | ----------------------- |
+| **Basic operations** (search, update, create records) | Minimal |
+| **Complex operations** (code nodes, external API calls) | More credits |
+| **AI prompts** (coming soon) | Variable based on usage |
+
+Credits are deducted in real-time when workflows execute.
+
+## Monitoring Usage
+
+Track your credit consumption:
+
+1. Go to **Settings → Billing**
+2. View your current usage and remaining credits
+3. Monitor trends to plan for additional credits if needed
+
+## Purchasing Additional Credits
+
+Need more credits?
+
+1. Go to **Settings → Billing**
+2. Click on the option to purchase additional credit packs
+3. Select the amount you need
diff --git a/packages/twenty-docs/l/fr/user-guide/billing/how-tos/billing-faq.mdx b/packages/twenty-docs/l/fr/user-guide/billing/how-tos/billing-faq.mdx
new file mode 100644
index 0000000000..ee1d560cb1
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/billing/how-tos/billing-faq.mdx
@@ -0,0 +1,86 @@
+---
+title: Billing FAQ
+description: Frequently asked questions about Twenty pricing and billing.
+---
+
+## Pricing
+
+
+
+ Yes, you can use Twenty for free while self-hosting. You will get access to everything included in the Pro (Cloud) plan, except the support from our core-team. Support is accessible via our Discord community.
+
+ If you want to self-host and need the Premium features (SSO and row-level permissions), you can choose the paid Organization (Self-Hosted) license. This also includes support from the Twenty team and removes the requirement to publish custom code as open-source before distributing.
+
+
+
+ Premium features are only available on the Organization plans (Cloud or Self-Hosted):
+
+ * **SSO integration**: Single Sign-On with your identity provider
+ * **Row-level permissions**: Fine-grained access control at the record level
+
+
+
+ We do not offer free seats. Pricing is per user and each user needs a licence to access Twenty.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `Switch to Organization`.
+
+
+
+ Please reach out to our team directly via the Support, there is no easy way to do this using the UI at the moment.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `Switch to Yearly`.
+
+
+
+ Please reach out to our team directly via the Support, there is no easy way to do this using the UI at the moment.
+
+
+
+ You will find this under `Settings → Billing`.
+
+
+
+ The number of credits depends on your billing cycle, not your plan:
+
+ * **Monthly subscriptions**: 5 million credits per month
+ * **Yearly subscriptions**: 50 million credits per year
+
+
+
+ Each workflow action consumes credits based on its complexity:
+
+ * **Basic internal operations** (such as search, update, create records) consume very few credits
+ * **More complex operations** like code nodes and requests to external services consume more credits
+ * **AI prompts** (coming soon!) will also consume more credits based on usage
+
+ Credits are deducted in real-time when workflows execute. You can monitor your usage in **Settings → Billing** to track consumption and remaining credits.
+
+
+
+ You can buy additional credits under `Settings → Billing`.
+
+
+
+## Billing
+
+
+
+ You can do so under `Settings → Billing`.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll be able to add a new payment method there.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll be able to edit the billing information there.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll see all your invoices at the bottom of the screen.
+
+
diff --git a/packages/twenty-docs/l/fr/user-guide/billing/overview.mdx b/packages/twenty-docs/l/fr/user-guide/billing/overview.mdx
new file mode 100644
index 0000000000..ac488ed7a6
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/billing/overview.mdx
@@ -0,0 +1,45 @@
+---
+title: Billing
+description: Understand Twenty pricing and manage your subscription.
+image: /images/user-guide/setup/pricing.png
+---
+
+
+
+
+
+Twenty offers flexible pricing plans to fit your team's needs. Manage your subscription, track workflow credits, and access invoices all from **Settings → Billing**.
+
+## What's in this section
+
+
+
+ Learn about Twenty's pricing plans and what's included.
+
+
+
+ Frequently asked questions about pricing and billing.
+
+
+
+## At a glance
+
+| Plan | Key Features |
+| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| **Free (Self-Hosted)** | All Pro features, community support |
+| **Pro (Cloud)** | Everything apart from the Premium features (SSO and row-level permissions), standard support |
+| **Organization (Cloud)** | All from Pro + the Premium features (SSO and row-level permissions), priority support |
+| **Organization (Self-Hosted)** | All from Pro + the Premium features (SSO, row-level permissions), Twenty team support, not required to publish your custom code as open-source before distributing |
+
+## Quick answers
+
+**Where do I manage billing?**
+Go to **Settings → Billing** to view your plan, update payment methods, and access invoices.
+
+**Can I use Twenty for free?**
+Yes! Self-host Twenty and get all Pro features at no cost.
+
+**How do I upgrade?**
+Go to **Settings → Billing** and click **Switch to Organization** or **Switch to Yearly**.
+
+For more questions, see the [Billing FAQ](/l/fr/user-guide/billing/how-tos/billing-faq).
diff --git a/packages/twenty-docs/l/fr/user-guide/calendar-emails/capabilities/calendar.mdx b/packages/twenty-docs/l/fr/user-guide/calendar-emails/capabilities/calendar.mdx
new file mode 100644
index 0000000000..8aca3fd3ca
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/calendar-emails/capabilities/calendar.mdx
@@ -0,0 +1,43 @@
+---
+title: Calendar
+description: Understanding calendar integration features in Twenty.
+---
+
+**Note**: To connect your calendar and configure sync settings, visit [Email & Calendar Setup](/l/fr/user-guide/calendar-emails/overview).
+
+## How Calendar Integration Works
+
+Twenty automatically syncs your calendar events and links them to the relevant CRM records, giving you a complete view of your meeting history with contacts and companies.
+
+## Calendar Tab
+
+Next to the Emails tab on records, you'll find a `Calendar` tab that contains the history of meetings scheduled with the record.
+
+### Available For
+
+* **People**: View all meetings scheduled with a specific contact
+* **Companies**: See all meetings related to a company and its employees
+* **Opportunities**: Access meeting history related to the company linked to this opportunity
+
+### Viewing Meeting History
+
+1. **Navigate to a Record**: Go to any Person, Company, or Opportunity record
+2. **Select the Calendar Tab**: Click on the `Calendar` tab next to the Emails tab
+3. **Browse Meeting History**: View all scheduled meetings and their details
+4. **Access Meeting Context**: See meeting participants, times, and related information
+
+## Visibility Settings
+
+Calendar data follows the same visibility settings as emails, ensuring consistent privacy controls across both communication channels.
+
+## What Gets Synced
+
+* **External Meetings**: All meetings with contacts outside your organization
+* **Automatic Linking**: Meetings connect to existing People and Company records based on attendee email addresses
+* **Meeting Details**: Subject, time, duration, and participants
+* **Updates**: New calendar events sync automatically
+
+## What Doesn't Get Synced
+
+* **Internal Meetings**: Meetings with only colleagues (same domain) remain private
+* **Private Events**: Events marked as private in your calendar
diff --git a/packages/twenty-docs/l/fr/user-guide/calendar-emails/capabilities/mailbox.mdx b/packages/twenty-docs/l/fr/user-guide/calendar-emails/capabilities/mailbox.mdx
new file mode 100644
index 0000000000..2e67ab7cb0
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/calendar-emails/capabilities/mailbox.mdx
@@ -0,0 +1,85 @@
+---
+title: Mailbox
+description: Understanding email integration features in Twenty.
+---
+
+**Note**: To connect your email accounts and configure sync settings, visit [Email & Calendar Setup](/l/fr/user-guide/calendar-emails/overview).
+
+## How Email Integration Works
+
+Twenty automatically links emails from your connected mailboxes to the relevant CRM records, keeping all communication history in one place.
+
+### Objects Where Emails Can Be Found
+
+Email conversations appear in three main objects:
+
+* **People**: View all emails exchanged with a specific contact
+* **Companies**: See all emails related to a company and its employees
+* **Opportunities**: Access email threads related to the company linked to this opportunity. Email threads from individual people on the opportunity are not shown yet.
+
+### Viewing Email Threads
+
+1. **Navigate to a Record**: Go to any Person, Company, or Opportunity record
+2. **Select the Emails Tab**: Click on the `Emails` tab to view synced emails
+3. **Open an Email Thread**: Click on any email to open and read the full conversation
+4. **Browse History**: Scroll through the complete email history with that contact
+
+
+
+## What You'll See
+
+### Email Thread View
+
+When you open an email thread, you can:
+
+* **Read Full Conversations**: See the complete email exchange
+* **View Participants**: See all people involved in the email thread
+* **Check Timestamps**: Know exactly when each email was sent
+* **Access Context**: Understand the full communication history
+
+### Email Visibility
+
+Depending on your mailbox settings, you might see:
+
+* **Full Content**: Complete email text and details
+* **Subject + Metadata**: Subject line, sender, recipient, and timestamp
+* **Metadata Only**: Basic information without email content
+
+## Email Sync Behavior
+
+### What Gets Synced
+
+* **External Emails**: All emails with contacts outside your organization
+* **Automatic Linking**: Emails connect to existing People and Company records
+* **Multiple Addresses**: Emails from any address link to the same contact record
+* **Updates**: New emails appear within 5 minutes
+
+### What Doesn't Get Synced
+
+* **Internal Emails**: Emails between colleagues (same domain) remain private
+* **Group Emails**: Distribution lists and group emails are excluded
+* **Excluded Folders**: Folders you've chosen not to sync (configured under Settings → Accounts → Email)
+
+### Selective Folder Sync (Lab Feature)
+
+Control which email folders sync with Twenty:
+
+1. Enable `Message Folder` in Settings → Releases → Lab
+2. Configure folders under Settings → Accounts → Email
+3. Choose specific folders to include or exclude (Inbox, Sent, Archive, custom folders)
+
+## Troubleshooting Email Sync
+
+### Common Sync Issues
+
+* **Sync Delays**: Emails appear within 5 minutes, but initial imports take longer
+* **Missing Emails**: Check if:
+ * Folders are excluded in Message Folder settings
+ * Contact auto-creation is disabled (emails need existing Twenty records)
+ * Email is from colleagues (same domain) or group lists
+ * Mailbox is still completing initial sync
+
+### Email Limitations
+
+* **System Folders**: Some email folders may not be available for sync
+* **Aliases**: Only true mailboxes can be connected (not email aliases)
diff --git a/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx b/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx
new file mode 100644
index 0000000000..edee83875d
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx
@@ -0,0 +1,28 @@
+---
+title: Can I Book Meetings from Twenty?
+description: Information about booking meetings directly from Twenty.
+---
+
+## Current Status
+
+**No, Twenty does not currently support booking meetings directly from the platform.**
+
+Twenty's calendar integration is designed to **sync and display** your existing calendar events, not to create new ones. All meeting scheduling should be done through your native calendar application (Google Calendar, Microsoft Outlook, etc.).
+
+## What You Can Do
+
+* **View meeting history** on People, Companies, and Opportunities records
+* **See upcoming meetings** with contacts in your CRM
+* **Track meeting context** alongside email communications
+* **Auto-create contacts** from meeting participants
+
+## How to Schedule Meetings
+
+1. Use your native calendar app (Google Calendar, Outlook, etc.)
+2. Create the meeting as you normally would
+3. The meeting will automatically sync to Twenty within 5 minutes
+4. View the meeting on the relevant CRM records
+
+## Future Plans
+
+Meeting creation from within Twenty is on our roadmap. Join our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to share your use case and help prioritize this feature.
diff --git a/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx b/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx
new file mode 100644
index 0000000000..5515ea4950
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx
@@ -0,0 +1,44 @@
+---
+title: Can I Send Emails from Twenty?
+description: Information about sending emails directly from Twenty.
+---
+
+## Current Status
+
+Twenty's email integration is designed to **sync and display** your email history. Emails cannot be composed or sent directly from Twenty's interface.
+
+When you view an email thread on a record page and click **Reply**, you'll be redirected to the original thread in your mailbox (Gmail, Outlook, etc.). This is where you compose and send your reply.
+
+## What You Can Do Today
+
+* **View email history** on People, Companies, and Opportunities records
+* **Read full email threads** with contacts in your CRM
+* **Track communication context** alongside calendar events
+* **Auto-create contacts** from email interactions
+* **Reply via redirect** — click Reply to jump to your mailbox
+
+## Sending Emails via Workflows
+
+While you can't send emails manually from Twenty, you **can send emails automatically using Workflows**. This is useful for:
+
+* Automated follow-ups
+* Notifications to contacts
+* Triggered communications based on record changes
+
+Emails sent via workflows go through your connected mailbox account.
+
+→ Learn about the [Send Email action](/l/fr/user-guide/workflows/capabilities/workflow-actions#send-email)
+
+## Email Sequences and Newsletters
+
+For email sequences and newsletters, we recommend using workflows to connect Twenty to a dedicated email marketing tool.
+
+
+ Mass emails should not be sent directly from your mailbox to protect your domain reputation. Use a dedicated tool for bulk communications.
+
+
+→ See [How to send emails from workflows](/l/fr/user-guide/workflows/capabilities/send-emails-from-workflows) for setup instructions
+
+## Future Plans
+
+Native email composition from within Twenty is on our roadmap. Join our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to share your use case and help prioritize this feature.
diff --git a/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx b/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx
new file mode 100644
index 0000000000..de258baef3
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx
@@ -0,0 +1,35 @@
+---
+title: Can I Track Email Activity on All Objects?
+description: Understanding email activity tracking across different objects.
+---
+
+## Supported Objects
+
+Email activity is currently available on **three standard objects**:
+
+| Object | What You See |
+| ----------------- | ---------------------------------------------------------------- |
+| **People** | All emails exchanged with that specific contact |
+| **Companies** | All emails with anyone from that company (based on email domain) |
+| **Opportunities** | Emails related to the company linked to the opportunity |
+
+## Why Only These Objects?
+
+People, Companies, and Opportunities are the core relationship objects where email context adds the most value. Email threads are automatically linked based on:
+
+* **Email address** → matched to People records
+* **Email domain** → matched to Company records
+* **Company relation** → linked to Opportunities
+
+## Custom Objects
+
+**Email tracking is not available on custom objects** at this time.
+
+If you need email context on a custom object, consider:
+
+* Using a relation field to link your custom object to People or Companies
+* Viewing email history on the linked People/Company record
+
+## Future Plans
+
+Extending email visibility to custom objects is being considered. Share your use case on our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to help prioritize this feature.
diff --git a/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx b/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx
new file mode 100644
index 0000000000..83da30bd83
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx
@@ -0,0 +1,42 @@
+---
+title: Connect Several Mailboxes per User
+description: Connect multiple email accounts for a single user.
+---
+
+## Overview
+
+Twenty supports **unlimited email accounts per user**. This is useful if you manage multiple inboxes, such as:
+
+* Personal work email + shared team inbox
+* Multiple client-facing email addresses
+* Different email accounts for different roles
+
+## How to Add Multiple Mailboxes
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Connect your additional Google or Microsoft account
+4. Configure sync settings for this mailbox
+5. Repeat for each mailbox you want to connect
+
+## Managing Multiple Accounts
+
+Each connected mailbox has its own settings:
+
+* **Email visibility**: Choose what teammates can see
+* **Contact auto-creation**: Enable/disable per mailbox
+* **Folder selection**: Choose which folders to sync (Lab feature)
+
+## How Emails Appear
+
+Emails from all your connected mailboxes are synced to Twenty and appear on:
+
+* **People records**: Based on the contact's email address
+* **Company records**: Based on the email domain
+* **Opportunities**: Based on the linked company
+
+Each email shows which mailbox it was sent from/received to, so you can track which account was used for each communication.
+
+## Important Notes
+
+Only true mailboxes can be connected. Email aliases that forward to another mailbox cannot be connected separately—they'll sync through the main mailbox.
diff --git a/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx b/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx
new file mode 100644
index 0000000000..c5db7745a0
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx
@@ -0,0 +1,53 @@
+---
+title: I Don't See Emails on Records
+description: Troubleshooting missing emails on records.
+---
+
+## Common Reasons
+
+### 1. Initial Sync Still in Progress
+
+Email sync takes time, especially for large mailboxes.
+
+* **Calendar sync**: Completes in minutes
+* **Email sync**: Can take several hours for large mailboxes
+
+**Solution**: Wait up to a few hours for the initial import to complete.
+
+### 2. Contact Doesn't Exist in Twenty
+
+Emails only appear on existing People records. If the contact wasn't created yet:
+
+* Enable **Contact Auto-Creation** in your mailbox settings
+* Or manually create the Person record first
+
+**Solution**: Go to **Settings → Accounts**, select your mailbox, and enable contact auto-creation.
+
+### 3. Internal Emails Are Excluded
+
+Emails between colleagues (same email domain) are never synced to maintain privacy.
+
+**Solution**: This is expected behavior. Only external emails are synced.
+
+### 4. Email Is from a Group or Distribution List
+
+Group emails and distribution lists are excluded from sync.
+
+**Solution**: This is expected behavior.
+
+### 5. Folder Not Selected for Sync
+
+If you're using the Message Folder feature, some folders might be excluded.
+
+**Solution**: Go to **Settings → Accounts**, select your mailbox, and check folder sync settings.
+
+### 6. Wrong Email Address on Record
+
+The Person record might have a different email address than the one used in the email.
+
+**Solution**: Add the correct email address to the Person record.
+
+## Still Not Working?
+
+1. Try disconnecting and reconnecting your mailbox
+2. Contact support if issues persist
diff --git a/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx b/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
index e27785337f..9569d2651a 100644
--- a/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
@@ -1,52 +1,52 @@
---
-title: Limiter les e-mails importés.
-description: Contrôlez quels e-mails sont importés dans Twenty.
+title: Limit Emails Imported
+description: Control which emails are imported into Twenty.
---
-## Vue d'ensemble
+## Overview
-Par défaut, Twenty synchronise tous les e-mails externes depuis votre boîte aux lettres connectée. Vous pouvez limiter ce qui est importé à l’aide de la **sélection de dossiers** et des **paramètres de visibilité**.
+By default, Twenty syncs all external emails from your connected mailbox. You can limit what gets imported using **folder selection** and **visibility settings**.
-## Méthode 1 : Sélection de dossiers (recommandée)
+## Method 1: Folder Selection (Recommended)
-Contrôlez quels dossiers e-mail sont synchronisés avec Twenty :
+Control which email folders sync with Twenty:
-1. Allez dans **Paramètres → Versions → Lab**
-2. Activez **Dossier de messages**
-3. Retournez à **Paramètres → Comptes**
-4. Sélectionnez votre compte e-mail connecté
-5. Choisissez quels dossiers synchroniser :
+1. Go to **Settings → Releases → Lab**
+2. Enable **Message Folder**
+3. Return to **Settings → Accounts**
+4. Select your connected email account
+5. Choose which folders to sync:
-| Dossier | Description |
-| -------------------------- | -------------------------------------------- |
-| **Boîte de réception** | E-mails entrants principaux |
-| **Envoyé** | E-mails sortants que vous avez envoyés |
-| **Archive** | Messages archivés |
-| **Dossiers personnalisés** | Tous les dossiers spécifiques de votre choix |
+| Folder | Description |
+| ------------------ | ----------------------------- |
+| **Inbox** | Primary incoming emails |
+| **Sent** | Outgoing emails you've sent |
+| **Archive** | Archived messages |
+| **Custom Folders** | Any specific folders you want |
-6. Excluez les dossiers que vous ne voulez pas synchroniser (Spam, Corbeille, dossiers personnels)
+6. Exclude folders you don't want synced (Spam, Trash, personal folders)
-Cela vous donne un contrôle précis sur les e-mails qui apparaissent dans votre CRM sans tout synchroniser.
+This gives you precise control over which emails appear in your CRM without syncing everything.
-## Méthode 2 : Paramètres de création automatique de contacts
+## Method 2: Contact Auto-Creation Settings
-Contrôlez à quel moment les contacts sont créés à partir des e-mails :
+Control when contacts are created from emails:
-1. Allez dans **Paramètres → Comptes**
-2. Sélectionnez votre boîte aux lettres connectée
-3. Choisissez une option :
- * **Désactivé** : Aucun contact n’est créé, mais les e-mails sont tout de même synchronisés avec les contacts existants.
- * **Envoyés et reçus** : Créer des contacts à partir de tous les e-mails externes
- * **Envoyés uniquement** : Créer des contacts uniquement à partir des e-mails que vous envoyez
+1. Go to **Settings → Accounts**
+2. Select your connected mailbox
+3. Choose an option:
+ * **Deactivated**: No contacts created, but emails still sync to existing contacts
+ * **Sent & Received**: Create contacts from all external emails
+ * **Sent Only**: Only create contacts from emails you send
-## Ce qui est toujours exclu
+## What's Always Excluded
-Ces e-mails ne sont jamais synchronisés, quels que soient les paramètres :
+These emails are never synced, regardless of settings:
-* **E-mails internes** : Messages entre collègues (même domaine)
-* **E-mails de groupe** : Listes de distribution et messages de groupe
-* **Spam/Corbeille** : Les dossiers système sont généralement exclus
+* **Internal emails**: Messages between colleagues (same domain)
+* **Group emails**: Distribution lists and group messages
+* **Spam/Trash**: System folders are typically excluded
-## Note importante
+## Important Note
-Nous ne fournissons pas d’adresse e-mail en CC pour une synchronisation sélective. Utilisez la fonctionnalité de sélection de dossiers ci-dessus pour obtenir le même niveau de contrôle.
+We don't provide a CC email address for selective syncing. Use the folder selection feature above to achieve the same level of control.
diff --git a/packages/twenty-docs/l/fr/user-guide/calendar-emails/overview.mdx b/packages/twenty-docs/l/fr/user-guide/calendar-emails/overview.mdx
new file mode 100644
index 0000000000..a80d406895
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/calendar-emails/overview.mdx
@@ -0,0 +1,132 @@
+---
+title: Calendar & Emails
+description: Connect your email and calendar accounts to Twenty.
+image: /images/user-guide/emails/emails_header.png
+---
+
+
+
+
+
+## Connection Options
+
+### Google Account (Gmail & Google Calendar)
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Select **Continue with Google**
+4. Authorize Twenty to access your Gmail and Google Calendar
+5. Configure email sync settings (visibility, auto-creation) → click **Next**
+6. Configure calendar sync settings (visibility, auto-creation) → click **Add Account**
+7. Your emails and calendar events will start syncing automatically
+
+### Microsoft Account (Outlook & Microsoft Calendar)
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Select **Continue with Microsoft**
+4. Authorize Twenty to access your Outlook and Microsoft Calendar
+5. Configure email sync settings (visibility, auto-creation) → click **Next**
+6. Configure calendar sync settings (visibility, auto-creation) → click **Add Account**
+7. Your emails and calendar events will start syncing automatically
+
+### SMTP/CalDAV Setup (Other Providers)
+
+For other email and calendar providers:
+
+1. Go to **Settings → Releases → Lab** to enable the feature
+2. Return to **Settings → Accounts**
+3. Configure SMTP settings for email
+4. Configure CalDAV settings for calendar
+5. Test the connection
+
+### Multiple Mailboxes
+
+* **Unlimited Accounts**: Connect multiple email accounts per user
+* **Account Management**: Switch between different mailboxes
+* **Sync Settings**: Configure different settings per mailbox
+
+
+ Only true mailboxes can be connected (e.g., support@domain.com with its own inbox). Email aliases that forward to another mailbox cannot be connected to Twenty.
+
+
+## Email Configuration
+
+### Message Visibility
+
+Choose different levels of visibility for your emails:
+
+* **Metadata Only**: Share only basic information (sender, recipient, date, time)
+* **Subject and Metadata**: Share subject line along with metadata
+* **All Email Content**: Share entire email content including attachments
+
+### Contact Auto-Creation
+
+* **Deactivated**: No automatic contact creation
+* **For messages sent & received**: Create contacts for all external email interactions
+* **For messages sent only**: Create contacts only for emails you send
+* **Note**: Internal emails (same domain) are never synced to maintain privacy
+
+When enabled, contacts are automatically linked to their Company records based on their email domain. If the company doesn't exist yet, Twenty creates it for you.
+
+### Control which emails get sync with Message Folder Selection (Lab Feature)
+
+Control which email folders sync with Twenty:
+
+1. Go to **Settings → Releases → Lab** and enable **Message Folder**
+2. Return to **Settings → Accounts** and select your connected email account
+3. Choose which folders to sync:
+ * **Inbox**: Primary incoming emails
+ * **Sent**: Outgoing emails you've sent
+ * **Custom Folders**: Any specific folders you want to include
+ * **Exclude Folders**: Skip folders like Spam, Trash, or personal folders
+
+This gives you precise control over which emails appear in your CRM without syncing everything.
+
+**What Gets Synced:**
+
+* **External Emails**: All emails with external contacts from selected folders
+* **Internal Emails**: Not synced (same domain emails remain private)
+* **Attachments**: Coming in H1 2026
+
+**Note**: We don't provide a CC email address for selective syncing. Instead, use the Message Folder feature above to achieve the same level of control over which emails sync with Twenty.
+
+## Calendar Configuration
+
+### Event Visibility
+
+Choose what will be visible to other users in your workspace:
+
+* **Everything**: The whole event details will be shared with your team
+* **Metadata**: Only date & participants will be shared with your team
+
+### Contact Auto-Creation for Meetings
+
+* **Yes**: Automatically create contacts for meeting participants not in your CRM
+* **No**: Only link meetings to existing contacts
+
+When enabled, contacts are automatically linked to their Company records based on their email domain. If the company doesn't exist yet, Twenty creates it for you.
+
+### Control which events get sync
+
+* **Meeting Import**: Automatically import calendar events
+* **Contact Linking**: Link meetings to People and Company records
+
+**What Gets Synced:**
+
+* **Meetings**: Calendar events with external participants
+* **Contact Linking**: Events automatically linked to CRM records
+* **Team Events**: Shared calendar visibility
+
+## Sync Frequency
+
+**Updates every 5 minutes**: Both email and calendar data sync automatically every 5 minutes after the initial import.
+
+
+ **Initial sync timing**: Calendar sync completes quickly (usually within minutes), while email sync takes longer for large mailboxes—up to a few hours depending on volume. Don't worry if you see contacts from calendar events appearing before your email contacts; this is normal behavior.
+
+
+## Next Steps
+
+* [Mailbox capabilities](/l/fr/user-guide/calendar-emails/capabilities/mailbox)
+* [Troubleshoot missing emails](/l/fr/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records)
diff --git a/packages/twenty-docs/l/fr/user-guide/dashboards/capabilities/dashboards.mdx b/packages/twenty-docs/l/fr/user-guide/dashboards/capabilities/dashboards.mdx
new file mode 100644
index 0000000000..b3d731e668
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/dashboards/capabilities/dashboards.mdx
@@ -0,0 +1,74 @@
+---
+title: Dashboards
+description: Create and organize dashboards with tabs to visualize your CRM data.
+---
+
+## Overview
+
+Dashboards in Twenty are organized in a hierarchy: **Dashboards → Tabs → Widgets**. Each dashboard can contain multiple tabs, and each tab contains widgets (charts, numbers, iFrames).
+
+## Creating a Dashboard
+
+1. Go to **Dashboards** in the navigation
+2. Click **+ New Dashboard**
+3. Give your dashboard a name
+4. Start adding tabs and widgets
+
+## Working with Tabs
+
+Tabs help you organize your dashboard into logical sections.
+
+### Creating Tabs
+
+1. In edit mode, click **+ Add Tab**
+2. Name your tab (e.g., "Pipeline Overview", "Team Performance")
+3. Add widgets to the tab
+
+### Duplicating Tabs
+
+1. Click on the tab you want to duplicate
+2. Click the **Duplicate** button in the side panel
+
+## Dashboard Layout
+
+### Arranging Widgets
+
+* Drag and drop to position
+* Resize for emphasis
+* Group related charts together
+
+### Duplicating a Dashboard
+
+1. Exit edit mode (view mode only)
+2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
+3. Select **Duplicate dashboard**
+
+### Best Practices
+
+* **Logical flow**: Arrange from overview to detail
+* **Visual hierarchy**: Larger charts for key metrics
+* **Consistent styling**: Use matching colors and fonts
+
+## Visibility & Access
+
+### Dashboard Visibility
+
+Dashboards are visible to everyone who has access to your Twenty workspace. There is no private dashboard option at the moment.
+
+### Favorites
+
+You can add dashboards to your favorites for quick access. This is a personal setting—your favorites are not visible to other users.
+
+To add a dashboard to favorites, open the dashboard and click the star icon.
+
+### Timezone Behavior
+
+Dashboards currently display data based on the timezone of the user viewing them. This means the same dashboard may show different metrics for team members in different regions (e.g., APAC vs. US).
+
+
+ **Coming soon**: We will add the ability to set a specific timezone for a dashboard, so all users see consistent data regardless of their location.
+
+
+
+ **Coming soon**: Dashboard-level filters will allow you to apply filters across all widgets at once, making it faster to explore your data.
+
diff --git a/packages/twenty-docs/l/fr/user-guide/dashboards/capabilities/widgets.mdx b/packages/twenty-docs/l/fr/user-guide/dashboards/capabilities/widgets.mdx
new file mode 100644
index 0000000000..fc12e61339
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/dashboards/capabilities/widgets.mdx
@@ -0,0 +1,131 @@
+---
+title: Widgets
+description: Explore the widget types and visualization options in Twenty.
+---
+
+## Available Widgets
+
+Twenty provides various widget types to visualize your CRM data.
+
+### Bar Charts
+
+Display data as horizontal or vertical bars.
+
+**Best for:**
+
+* Comparing values across categories
+* Showing rankings
+* Tracking metrics by time period
+
+**Example uses:**
+
+* Deals by stage
+* Revenue by sales rep
+* Contacts added per month
+
+
+ **Display limits**: Bar charts can show a maximum of 100 bars (horizontal) or 50 bars (vertical). If you see the warning "Undisplayed data: max X bars per chart", add filters to narrow down your data or change the grouping (e.g., group by week instead of days).
+
+
+### Pie Charts
+
+Show proportions of a whole.
+
+**Best for:**
+
+* Showing composition or distribution
+* Comparing parts to whole
+* Highlighting major segments
+
+**Example uses:**
+
+* Deal distribution by source
+* Contact breakdown by industry
+* Pipeline composition by owner
+
+### Line Charts
+
+Display trends over time.
+
+**Best for:**
+
+* Tracking changes over time
+* Identifying trends
+* Comparing multiple metrics
+
+**Example uses:**
+
+* Monthly deal count trend
+* Revenue growth over quarters
+* Activity levels over time
+
+### Number Metrics
+
+Display single key values prominently.
+
+**Best for:**
+
+* Highlighting KPIs
+* Showing totals or averages
+* Quick status checks
+
+**Example uses:**
+
+* Total pipeline value
+* Number of open opportunities
+* Conversion rate
+
+**Advanced options:**
+
+* **Ratio**: For Select fields, calculate ratios between values. Go to **Data on display** → select your field → enable the **Ratio** option.
+* **Prefix & Suffix**: Add custom text before or after the number (e.g., "$" prefix or "%" suffix) for better readability.
+
+### iFrames
+
+Embed external tools and content directly in your dashboard.
+
+**Best for:**
+
+* Displaying external reports or dashboards
+* Integrating third-party sales tools
+* Showing live content from other systems
+
+**Example uses:**
+
+* Metrics from your Support tool
+* Metrics from your dialer
+* Live content from your Sales sequence tool
+
+
+ **Coming soon**: Gauge charts and tables are not yet available but are on our roadmap.
+
+
+## Configuring Widgets
+
+### Data Source
+
+1. Select the object to visualize (Opportunities, People, etc.)
+2. Choose the metric to display (count, sum, average)
+3. Apply filters to focus on specific data
+
+### Grouping
+
+Group data by:
+
+* Fields (stage, owner, industry)
+* Time periods (day, week, month, quarter)
+* Custom segments
+
+### Styling
+
+Customize your charts with:
+
+* Colors and themes
+* Labels and legends
+* Size and positioning
+
+### Duplicating Widgets
+
+1. Click on the widget
+2. Open **Options**
+3. Click **Duplicate widget**
diff --git a/packages/twenty-docs/l/fr/user-guide/dashboards/how-tos/dashboards-faq.mdx b/packages/twenty-docs/l/fr/user-guide/dashboards/how-tos/dashboards-faq.mdx
new file mode 100644
index 0000000000..7af41b4efa
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/dashboards/how-tos/dashboards-faq.mdx
@@ -0,0 +1,59 @@
+---
+title: Dashboards FAQ
+description: Frequently asked questions about dashboards in Twenty.
+---
+
+
+
+ No, dashboards are currently visible to everyone with access to your Twenty workspace. Private dashboards are not yet available.
+
+
+
+ Dashboards currently display data based on the viewer's timezone. If you're in different regions (e.g., APAC vs. US), you may see slightly different numbers for the same dashboard. We're working on adding a timezone setting per dashboard to ensure consistent data across teams.
+
+
+
+ Exporting dashboards is not available at the moment. This feature is on our roadmap.
+
+
+
+ No, sharing dashboards with users outside your Twenty workspace (non-Twenty users) is not currently supported.
+
+
+
+ Open the dashboard you want to favorite, then click the star icon. Favorites are personal—they won't affect other users.
+
+
+
+ * **Tabs** organize your dashboard into sections (like pages within the dashboard)
+ * **Widgets** are the individual visualizations (charts, numbers, iFrames) within each tab
+
+ Structure: Dashboard → Tabs → Widgets
+
+
+
+ Bar charts have display limits: 100 bars for horizontal charts, 50 for vertical. If your data exceeds this, add filters to narrow down the results or change the grouping (e.g., group by week instead of day).
+
+
+
+ Dashboard-level filters are not available yet, but this feature is on our roadmap. Currently, you need to apply filters to each widget individually.
+
+
+
+ Not yet. Gauge charts and tables are on our roadmap and will be added in a future release.
+
+
+
+ 1. Make sure you're in view mode (not editing)
+ 2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
+ 3. Select **Duplicate dashboard**
+
+
+
+ Widgets update automatically as your CRM data changes:
+
+ * Real-time updates for most metrics
+ * Use the refresh button for a manual update if needed
+ * Historical data is preserved for trend analysis
+
+
diff --git a/packages/twenty-docs/l/fr/user-guide/dashboards/overview.mdx b/packages/twenty-docs/l/fr/user-guide/dashboards/overview.mdx
new file mode 100644
index 0000000000..a6c77ee8ca
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/dashboards/overview.mdx
@@ -0,0 +1,79 @@
+---
+title: Dashboards
+description: Learn the basics of reporting and dashboards in Twenty.
+image: /images/user-guide/reporting/pie-chart.png
+---
+
+
+
+
+
+## Understanding Dashboards
+
+Dashboards in Twenty provide a visual way to track your key performance metrics and gain insights from your CRM data.
+
+
+
+## Key Concepts
+
+### Dashboards
+
+A dashboard is a collection of tabs that display your CRM data at a glance. You can create multiple dashboards for different purposes:
+
+* Sales performance
+* Team activity
+* Pipeline health
+* Custom metrics
+
+### Tabs
+
+Tabs allow you to organize your dashboard into sections. Each tab contains one or more widgets.
+
+### Widgets
+
+Widgets are individual visualizations that display specific data. Types include:
+
+* Bar charts
+* Pie charts
+* Line charts
+* Number metrics
+* iFrames
+
+
+ **Current limitations**:
+
+ * Exporting dashboards and sharing with external users (non-Twenty users) are not available at the moment.
+ * Gauge charts and tables are not yet available.
+
+
+## Getting Started
+
+### Creating Your First Dashboard
+
+1. Navigate to the **Dashboards** section
+2. Click **+ New Dashboard**
+3. Give your dashboard a name
+4. Add tabs to organize your content
+5. Add widgets to display your data
+6. Save
+
+### Adding Widgets
+
+1. Open a tab on your dashboard
+2. Click **+ Add Widget**
+3. Select the widget type
+4. Choose the data source (object)
+5. Configure the widget settings
+6. Save and view your widget
+
+## Best Practices
+
+* **Start simple**: Begin with a few key metrics and add more over time
+* **Focus on actionable data**: Display metrics that drive decisions
+* **Regular review**: Check your dashboards regularly to spot trends
+* **Share with team**: Make dashboards visible to relevant team members
+
+## Next Steps
+
+* [Widgets and visualizations](/l/fr/user-guide/dashboards/capabilities/widgets)
+* [Dashboards FAQ](/l/fr/user-guide/dashboards/how-tos/dashboards-faq)
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/error-handling.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/error-handling.mdx
new file mode 100644
index 0000000000..a442127b0b
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/error-handling.mdx
@@ -0,0 +1,76 @@
+---
+title: Error Handling & Validation
+description: Review and fix import errors directly in the UI before confirming.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Pre-Import Validation
+
+After uploading your file and mapping fields, Twenty validates your data **before** importing. This allows you to catch and fix errors without affecting your existing data.
+
+## How It Works
+
+1. **Upload** your CSV file
+2. **Map** your columns to Twenty fields
+3. **Review** the potential errors highlighted in yellow
+4. **Fix errors** directly in the UI
+5. **Confirm** the import
+
+
+
+## Error Display
+
+Rows with issues are highlighted in **yellow**. You can:
+
+* **Edit the cell directly** to fix the error
+* **Remove the row** to skip it entirely
+
+This inline editing saves time—no need to go back to your spreadsheet, fix errors, and re-upload.
+
+## Common Error Types
+
+### Duplicate Values
+
+**Cause**: A unique field (email, domain) already exists in Twenty or appears twice in your file.
+
+**Fix**:
+
+* Edit the duplicate value in the import UI
+* Remove one of the duplicate rows
+
+See [Uniqueness Constraints](/l/fr/user-guide/data-migration/capabilities/uniqueness-constraints) for more details on how uniqueness is enforced.
+
+### Invalid Format
+
+**Cause**: Data doesn't match the expected format (e.g., invalid email, wrong date format).
+
+**Fix**: Edit the cell to use the correct format.
+
+See [Field Mapping](/l/fr/user-guide/data-migration/capabilities/field-mapping) for the expected format of each field type.
+
+### Missing Required Fields
+
+**Cause**: A required field is empty.
+
+**Fix**: Enter a value in the required field or remove the row.
+
+### Relation Not Found
+
+**Cause**: The referenced record doesn't exist (e.g., a Company domain that wasn't imported).
+
+**Fix**:
+
+* Import the parent records first
+* Or correct the reference value
+
+See [Import Relations](/l/fr/user-guide/data-migration/capabilities/import-relations) for the correct import order and how to link records.
+
+## Tips for Fewer Errors
+
+1. **Download the template** to see expected format prior to importing your file
+2. **Clean your data** in the spreadsheet first
+3. **Import files in correct order** to import relations (Companies → People → Opportunities)
+4. **Test with small batches** before full import
+5. **Check for duplicates** before uploading
+6. **Limit the size of your file to 10,000 records** per file
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/field-mapping.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/field-mapping.mdx
new file mode 100644
index 0000000000..2e8802ce71
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/field-mapping.mdx
@@ -0,0 +1,198 @@
+---
+title: Field Mapping
+description: How field mapping works during data import.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## How Field Mapping Works
+
+When you upload a file, Twenty analyzes your columns and attempts to match them to existing fields.
+
+### Automatic Mapping
+
+Twenty tries to match columns based on:
+
+* Column header names (exact or similar matches)
+* Data type detection (dates, numbers, emails)
+* Common field patterns
+
+**Quick tip:** Export a few rows from the object you want to import. The exported file will have the exact column names Twenty expects, making automatic mapping seamless during import.
+
+### Manual Mapping Options
+
+For each column, you can:
+
+* **Map to a field**: Select the matching Twenty field from a dropdown
+* **Do not map**: Skip the column entirely (data won't be imported)
+
+**Fields must exist before import.** The import creates records, not fields. Create custom fields under **Settings → Data Model** before importing.
+
+## Field Type Compatibility
+
+All field types available in the Data Model are supported for import.
+
+You can also import `id` values to either assign a specific ID to new records or update existing ones.
+
+
+
+## Data Format Requirements
+
+**Some fields have special syntax.** We recommend downloading the sample file before preparing your import to see the expected syntax for each field type.
+
+### Address Fields
+
+Address is a nested field with multiple columns. Some can be left empty.
+
+* **Address / Address 1**: Street address line 1
+* **Address / Address 2**: Street address line 2
+* **Address / City**: City name
+* **Address / State**: State or province
+* **Address / Country**: Country name
+* **Address / Post Code**: Postal/ZIP code
+
+### Array Fields
+
+Use the following format:
+
+```
+["value1","value2"]
+```
+
+### Boolean Fields
+
+Use `TRUE` or `FALSE` (uppercase) - not `true` or `false`
+
+### Currency Fields
+
+Currency is a nested field with two columns that **both must be filled**:
+
+* **Amount / Amount**: The numeric value (e.g., `1234.56`)
+* **Amount / Currency**: The currency code (e.g., `USD`, `EUR`)
+
+### Date Fields
+
+Supported formats:
+
+* `YYYY-MM-DD` (recommended)
+* `MM/DD/YYYY`
+* `DD/MM/YYYY`
+* ISO 8601 format
+
+### Domain Fields
+
+* It is recommended to use the format `https://domain.com` to avoid creating duplicates, as this is the format used for Companies created by the mailbox and calendar synchronizations
+* A `Domain Label` and `Domain URL` can be filled: best practice is to fill `domain.com` in the label and `https://domain.com` in the url
+* Domains must be unique within the Companies object
+* **Domains must be unique within the file to import**
+
+### Email Fields
+
+* Must be valid email format
+* Emails must be unique within the People object
+* **Emails must be unique within the file to import**
+* For additional emails: use **Emails / Primary Email** for the main email, and **Emails / Additional Emails** with this format:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Id Fields
+
+Specifying an `id` during import is optional. Twenty auto-generates one if not provided.
+
+Use cases for mapping an `id` column:
+
+* **Set a specific ID**: Choose the UUID for newly created records
+* **Update existing records**: Match against existing records to update them instead of creating duplicates. In that case, it is recommended to not map the other unique fields: mapping only one unique field ensures a smoother import.
+
+If you provide an `id`, it must be in UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
+
+### JSON Fields
+
+Use valid JSON format:
+
+```
+{"key":"value","key2":"value2"}
+```
+
+### Links Fields
+
+Similar to Domain fields:
+
+* Fill both the label and URL columns: **Links / Link URL** and **Links / Link Label**
+* Use full URL format: `https://example.com`
+* For secondary links, use **Links / Secondary Links** column with this format:
+
+```
+[{"url":"https://twenty.com","label":"Twenty"}]
+```
+
+### Multi-Select Fields
+
+Use the **API names** (not the display labels) in the following format:
+
+```
+["VALUE1","VALUE2"]
+```
+
+See [here](#finding-api-names-for-select-fields) where to find the API names.
+
+New select options will not be created automatically by the import. They must be added under **Settings → Data Model** before importing.
+
+
+ **Import overwrites, it does not add.**
+
+ If a record already has `VALUE2` and `VALUE3` selected, and you import `["VALUE1"]`, the record will only have `VALUE1` after import. The previous selections are replaced, not merged.
+
+
+### Number Fields
+
+* Numbers only
+* Decimals use period: `1234.56`
+* No thousands separators
+
+### Phone Fields
+
+Phone is a nested field with multiple columns that **must be filled**
+
+* **Phones / Primary Phone Number**: The phone number (e.g., `4159095555`)
+* **Phones / Primary Phone Country Code**: Country code (e.g., `US`)
+* **Phones / Primary Phone Calling Code**: Dialing code (e.g., `+1`)
+
+### Rating Fields
+
+Use the API name format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, `RATING_5`
+
+### Relation Fields
+
+Please see our dedicated article: [Import Relations Between Objects](/l/fr/user-guide/data-migration/capabilities/import-relations)
+
+### Select Fields
+
+Use the **API name** of the option (not the display label):
+
+```
+VALUE1
+```
+
+See [here](#finding-api-names-for-select-fields) where to find the API names.
+New select options will not be created automatically by the import. They must be added under **Settings → Data Model** before importing.
+
+### Text Fields
+
+* No special formatting required
+* Leading/trailing spaces are trimmed
+
+## Finding API Names
+
+For Select, Multi-Select, and Array fields with predefined options, you must use the **API names**, not the display labels.
+
+### How to Find API Names
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at the bottom right of the settings page)
+4. View the API name for each option
+
+
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/file-formats.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/file-formats.mdx
index d1ab1ee203..106fc6c2e1 100644
--- a/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/file-formats.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/file-formats.mdx
@@ -1,48 +1,48 @@
---
-title: Formats de fichiers pris en charge
-description: Formats de fichiers pris en charge pour l’importation de données dans Twenty.
+title: Supported File Formats
+description: File formats supported for data import in Twenty.
---
-## Formats pris en charge
+## Supported Formats
-Twenty prend en charge trois formats de fichiers pour l’importation :
+Twenty supports three file formats for import:
-| Format | Extension | Notes |
-| ------------------ | --------- | ------------------------------ |
-| **CSV** | .csv | Recommandé, le plus compatible |
-| **Excel** | .xlsx | Format Excel moderne |
-| **Excel (hérité)** | .xls | Ancien format Excel |
+| Format | Extension | Notes |
+| ------------------ | --------- | ---------------------------- |
+| **CSV** | .csv | Recommended, most compatible |
+| **Excel** | .xlsx | Modern Excel format |
+| **Excel (Legacy)** | .xls | Older Excel format |
-## Exigences relatives aux fichiers
+## File Requirements
-| Exigence | Valeur |
-| ---------------------------- | -------------------------------------------------------- |
-| **Encodage** | UTF-8 recommandé |
-| **Limite d’enregistrements** | 10 000 enregistrements par fichier |
-| **Structure** | La première ligne doit contenir les en-têtes de colonnes |
-| **Contenu** | Un seul type d’objet par fichier |
+| Requirement | Value |
+| ---------------- | ------------------------------------- |
+| **Encoding** | UTF-8 recommended |
+| **Record limit** | 10,000 records per file |
+| **Structure** | First row must contain column headers |
+| **Content** | One object type per file |
-## Meilleures pratiques pour les fichiers CSV
+## CSV Best Practices
-* **Délimiteur** : Utilisez une virgule (`,`) ou un point-virgule (`;`)
-* **Délimiteur de texte** : Utilisez des guillemets doubles (`\"`) pour le texte contenant des virgules
-* **Fins de ligne** : Windows (CRLF) ou Unix (LF) sont tous deux pris en charge
-* **Valeurs vides** : Laissez les cellules vides, n’utilisez pas "NULL" ni "N/A"
+* **Delimiter**: Use comma (`,`) or semicolon (`;`)
+* **Text qualifier**: Use double quotes (`"`) for text containing commas
+* **Line endings**: Windows (CRLF) or Unix (LF) both supported
+* **Empty values**: Leave cells empty, don't use "NULL" or "N/A"
-## Meilleures pratiques pour Excel
+## Excel Best Practices
-Lors de l’exportation depuis Excel :
+When exporting from Excel:
-* Supprimez les formules (exportez uniquement les valeurs)
-* Supprimez les lignes vides à la fin
-* Assurez-vous qu’aucune cellule n’est fusionnée
-* Utilisez uniquement la première feuille
+* Remove formulas (export values only)
+* Delete empty rows at the end
+* Ensure no merged cells
+* Use the first sheet only
-## Jeux de données volumineux
+## Large Datasets
-Pour les jeux de données de plus de 10 000 enregistrements :
+For datasets larger than 10,000 records:
-* Divisez en plusieurs fichiers
-* Ou utilisez l’[importation via l’API](/l/fr/user-guide/data-migration/how-tos/import-data-via-api) pour un nombre illimité d’enregistrements
+* Split into multiple files
+* Or use the [API import](/l/fr/user-guide/data-migration/how-tos/import-data-via-api) for unlimited records
-Pour des migrations très volumineuses (plus de 100 000 enregistrements), l’API est nettement plus rapide et plus fiable que les importations CSV.
+For very large migrations (100,000+ records), the API is significantly faster and more reliable than CSV imports.
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/import-relations.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/import-relations.mdx
new file mode 100644
index 0000000000..2db105b1ec
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/import-relations.mdx
@@ -0,0 +1,148 @@
+---
+title: Import Relations Between Objects
+description: Import relationships between records via CSV.
+---
+
+## Overview
+
+Twenty supports importing relationships between objects during CSV import. This allows you to link records (e.g., attach People to Companies) as part of your data migration.
+
+**Currently supported for import**: One-to-many relations pointing to a single object type on each side (e.g., People → Companies). Relations pointing to multiple object types are not yet supported in import/export.
+
+## How Relations Work in Twenty
+
+### One to Many / Many to One
+
+Twenty supports standard relations where one record links to many others:
+
+* **One Company → Many People**: A company can have multiple employees, but each person belongs to one company
+* **One Company → Many Opportunities**: A company can have multiple deals, but each opportunity belongs to one company
+
+### Relations That Can Point to Multiple Object Types
+
+Some relations can connect to different types of objects. This works in two ways:
+
+**Pattern 1: Many records linking to one record each from different object types**
+
+Several Notes, Tasks, or Activities can each be attached to multiple object types at once:
+
+* **Notes** can be linked to one Person, one Company, and one Opportunity simultaneously
+* **Tasks** can be linked to one Person, one Company, and one Opportunity simultaneously
+
+Here, the Notes/Tasks are on the "many" side. Each links to one record per object type.
+
+
+
+**Pattern 2: One record receiving links from many records of different object types**
+
+A Project can receive links from multiple records across different object types:
+
+* **A Project** can have many People linked to it, many Companies linked to it, and many Notes attached to it
+
+Here, the Project is on the "one" side. Multiple records from different objects can all link to the same Project.
+
+
+
+
+ **Import/Export limitation**: Relations that point to multiple object types (like Notes → People/Companies/Opportunities) are **not yet supported** in CSV import or export.
+
+ * **Import**: Only one-to-many relations pointing to a single object type on each side can be imported
+ * **Export**: Columns for relations pointing to multiple object types are currently left empty
+
+ This is on our roadmap.
+
+
+### What's Not Supported Today
+
+**Many to Many relations** are not yet available. For example, you cannot currently create a relation where:
+
+* Many People are linked to many Projects
+
+Many to Many relations are planned for H1 2026.
+
+## Linking Records During Import
+
+**Reminder**: Only one-to-many relations pointing to a single object type can be imported (e.g., People → Companies). Relations pointing to multiple object types (e.g., Notes → People/Companies/Opportunities) are not yet supported.
+
+### Step 1: Identify the "One" and "Many" Sides
+
+First, determine which object is on the "one" side and which is on the "many" side of the relationship.
+
+**Example**:
+
+* **Company** is the "one" side (one company has many employees)
+* **People** is the "many" side (each person belongs to one company)
+
+### Step 2: Ensure the "One" Side Records Exist
+
+Before importing the "many" side, the "one" side records must already exist in Twenty.
+
+* Import or create the "one" side records first (e.g., Companies)
+* Validate their unique identifier. This can be:
+ * The `id` (Twenty's UUID)
+ * A field set as unique (e.g., `domain` for Companies, or an external ID from your previous system)
+
+The import will fail if a reference is made to a record that does not exist.
+
+### Step 3: Prepare Your CSV File
+
+Add a column in your "many" side CSV file that references the "one" side record.
+
+**Example**: For a People CSV file linking to Companies:
+
+```
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+**Important**:
+
+* The value must **exactly match** the unique field on the Company record
+* For domains, use the **Domain URL** (e.g., `https://acme.com`), not the Domain Label
+* Map only **one** unique identifier per relation: this leads to a smoother import
+
+### Step 4: Ensure the Relation Field Exists
+
+Before uploading your file, make sure the relation field exists between your objects.
+
+If it doesn't exist:
+
+1. Go to **Settings → Data Model**
+2. Select your object (e.g., People)
+3. Create a relation field pointing to the target object (e.g., Company)
+
+### Step 5: Upload and Map the Relation
+
+1. Upload your CSV file via the import UI
+2. In the field mapping step, find your relation column (e.g., `companyDomain`)
+3. Map it to the relation field (e.g., Company)
+4. Twenty will automatically link each record to the matching parent
+
+### Available Unique Fields for Relations
+
+| Object | Unique Fields Available |
+| ------------------------------------- | --------------------------------------- |
+| **Companies** | `id`, `domain`, any custom unique field |
+| **People** | `id`, `email`, any custom unique field |
+| **Workspace Members** | `id`, `email` (not name) |
+| **Other standard and custom objects** | `id`, any field marked as unique |
+
+**Linking to Workspace Members**: When the relation points to Workspace Members (your team logging into Twenty), reference them by their **email address**, not their name.
+
+We recommend using `domain` for Companies and `email` for People, as these are human-readable and easy to maintain in spreadsheets.
+
+**Reminder**: Soft-deleted records (visible under Command Menu → See deleted records) count toward uniqueness criteria. If you import a record with the same unique value as a deleted record, the deleted record will be restored. See [Uniqueness Constraints](/l/fr/user-guide/data-migration/capabilities/uniqueness-constraints) for more details.
+
+## Import Order Rule
+
+
+ **Always import the "one" side first!**
+
+ 1. **Companies** first (no dependencies)
+ 2. **People** second (linked to Companies)
+ 3. **Opportunities** third (linked to Companies/People)
+ 4. **Custom objects** following their dependencies
+
+ The parent record must exist before you can reference it.
+
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/uniqueness-constraints.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/uniqueness-constraints.mdx
new file mode 100644
index 0000000000..5f6d05701b
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/uniqueness-constraints.mdx
@@ -0,0 +1,72 @@
+---
+title: Uniqueness Constraints
+description: How Twenty enforces data uniqueness during import.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Overview
+
+Twenty enforces uniqueness on certain fields to prevent duplicate records and ensure data integrity. Understanding these constraints is essential for successful imports.
+
+## Default Unique Fields
+
+| Object | Unique Fields |
+| ------------------ | ---------------------- |
+| **People** | `id`, `email` |
+| **Companies** | `id`, `domain` |
+| **Custom objects** | `id` only (by default) |
+
+The `id` field is Twenty's internal identifier, auto-generated for each record. It uses UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
+
+## Custom Unique Fields
+
+You can define additional unique fields under **Settings → Data Model**:
+
+1. Go to **Settings → Data Model**
+2. Select the object
+3. Click on a field
+4. Enable **Unique** in field settings
+
+### Use Cases for Custom Unique Fields
+
+* **External IDs**: Store IDs from other systems (Salesforce ID, HubSpot ID)
+* **Business identifiers**: Employee numbers, customer codes
+* **Alternative contact info**: LinkedIn profile, phone number
+
+The field name `id` is reserved for Twenty's internal ID. Use a different name like `externalId` or `legacyId` for external identifiers.
+
+## Import Behavior
+
+### Creating New Records
+
+If a unique field value doesn't exist, a new record is created.
+
+### Updating Existing Records
+
+If a unique field value matches an existing record, that record is **updated** with the new data.
+To **update existing records**, it is recommended to **only match one unique field**.
+
+### Soft-Deleted Records
+
+
+ **Deleted records count toward uniqueness.**
+
+ Soft-deleted records (visible under Command Menu → See deleted records) are included in uniqueness checks. If you import a record with the same unique value as a deleted record, the deleted record will be **restored** with the new data.
+
+
+## Duplicate Detection During Import
+
+During the validation phase:
+
+* Duplicates within your file are highlighted in yellow
+* You can edit or remove duplicate rows from the UI before starting the import
+
+
+
+## Best Practices
+
+1. **Remove duplicates** from your file before importing
+2. **Check for existing records** in Twenty before importing
+3. **Use external IDs** when migrating from other systems
+4. **Include unique fields** if you want to update existing records
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/export-your-data.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/export-your-data.mdx
new file mode 100644
index 0000000000..4158b8edde
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/export-your-data.mdx
@@ -0,0 +1,209 @@
+---
+title: Export Your Data
+description: Complete step-by-step guide to exporting data from Twenty.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Overview
+
+Export your workspace data to CSV for backups, reporting, or migration.
+
+**Use cases:**
+
+* **Regular backups** — keep copies of your data
+* **External reporting** — analyze data in Excel, Google Sheets, or BI tools
+* **Migration** — move data to another system
+* **Bulk updates** — export, edit, and re-import to update records
+
+## What You Need to Know
+
+### Export Limits
+
+* **Maximum 20,000 records** per export
+* Only **visible columns** are exported
+* Only **filtered records** are exported (based on your current view)
+
+For larger exports (20,000+ records), use filters to export in batches or use the [API](/l/fr/developers/extend/capabilities/apis).
+
+### Permissions
+
+You need the **"Export CSV"** permission to export data. Contact your workspace admin if you don't have this option.
+
+## Step 1: Navigate to the Object
+
+Go to the object you want to export:
+
+* **People** — for contacts
+* **Companies** — for organizations
+* **Opportunities** — for deals
+* **Custom objects** — any object you've created
+
+## Step 2: Configure Your View
+
+**Important:** The export includes only what's visible in your current view.
+
+### Add/Remove Columns
+
+1. Click **Options → Fields** (or the **+** at the end of columns)
+2. Check the fields you want to export
+3. Uncheck fields you don't need
+
+### Filter Records (Optional)
+
+If you only need a subset of data:
+
+1. Click **Filter**
+2. Add filter conditions (e.g., "Created date > January 1, 2024")
+3. Only matching records will be exported
+
+### Sort Records (Optional)
+
+1. Click a column header to sort
+2. The export will follow your sort order
+
+**Create a dedicated export view.** Save a view specifically configured for exports so you don't need to reconfigure each time.
+
+## Step 3: Export the Data
+
+1. Click the **⋮** icon on the top right of the table
+2. Select **Export view**
+3. Choose where to save the CSV file
+4. Wait for the download to complete
+
+## What Gets Exported
+
+| Included | Not Included |
+| -------------------------------- | ---------------------- |
+| All visible columns | Hidden columns |
+| Records matching current filters | Filtered-out records |
+| Custom field values | Fields not in the view |
+| Record IDs | File attachments |
+| Relation IDs | Images |
+
+### Relation Fields
+
+Relation IDs are only exported on the **"many" side** of a relationship:
+
+* **People export** includes a `companyId` column (People → Company relation)
+* **Companies export** does NOT include `peopleIds` (Companies is the "one" side)
+
+This means you can use the People export to re-import and maintain the Company link, but you'll need to re-import People after Companies to recreate the relationships.
+
+## Exporting for Specific Purposes
+
+### For Backups
+
+1. Create a view with **all fields** visible
+2. Remove all filters to include all records
+3. Export each object type separately
+4. Store exports in a secure location
+5. Set a recurring reminder (weekly/monthly)
+
+### For External Reporting
+
+1. Include only the fields you need for analysis
+2. Apply filters to focus on relevant data
+3. Consider sorting by the field you'll analyze
+
+### For Bulk Updates
+
+1. Export the records you want to update
+2. Include the unique identifier (`email`, `domain`, or `id`)
+3. Edit the exported file
+4. Re-import to update records
+ See: [How to Update Existing Records](/l/fr/user-guide/data-migration/how-tos/update-existing-records-via-import)
+
+### For Migration
+
+If you're exporting to migrate to another system:
+
+1. **Export each object separately** — People, Companies, Opportunities, etc.
+2. **Include ID fields** — these help maintain relationships
+3. **Document field mappings** — note how Twenty fields map to your target system
+
+## Handling Large Datasets (20,000+ Records)
+
+The export limit is 20,000 records. For larger datasets:
+
+### Option 1: Export in Batches
+
+1. Add a filter (e.g., "Created date" ranges)
+2. Export the first batch
+3. Change the filter
+4. Export the next batch
+5. Combine files in your spreadsheet
+
+**Example filters for batching:**
+
+* By date range (January, February, March...)
+* By owner (Team member A, Team member B...)
+* By status (Active, Inactive...)
+
+### Option 2: Use the API
+
+The API has no record limit:
+
+1. Get your API key from **Settings → Developers**
+2. Use the GraphQL API to query records
+3. Process results in your application
+
+See: [API Documentation](/l/fr/developers/extend/capabilities/apis)
+
+## Tips and Best Practices
+
+### Create Export Views
+
+Save views configured specifically for exports:
+
+1. Configure columns and filters
+2. Click **View options** → **Save as new view**
+3. Name it "Export - [Purpose]"
+
+### Secure Your Exports
+
+Exported files may contain sensitive data:
+
+* Store in secure locations
+* Delete old exports when no longer needed
+* Be careful sharing export files
+
+### Check Before Exporting
+
+Correct columns are visible
+Filters are set correctly (or removed for full export)
+You have Export permission
+
+## FAQ
+
+
+
+ Only visible columns are exported. Add the columns you need via **Options → Fields** before exporting.
+
+
+
+ Check your filters. The export only includes records matching your current view filters. Remove filters to export all records.
+
+
+
+ Not in a single export. Use filters to export in batches, or use the API for larger datasets.
+
+
+
+ CSV (Comma Separated Values). Opens in Excel, Google Sheets, or any spreadsheet application.
+
+
+
+ Yes, but only on the "many" side of relationships. For example, a People export includes `companyId`, but a Companies export does not include people IDs.
+
+
+
+ Not directly through the UI. Use the API to build automated export workflows.
+
+
+
+## Next Steps
+
+* [How to Update Existing Records](/l/fr/user-guide/data-migration/how-tos/update-existing-records-via-import) — edit and re-import your export
+* [How to Import Data via API](/l/fr/user-guide/data-migration/how-tos/import-data-via-api) — for large datasets
+* [API Documentation](/l/fr/developers/extend/capabilities/apis) — build custom export workflows
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/fix-import-errors.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/fix-import-errors.mdx
new file mode 100644
index 0000000000..7951b5ad9d
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/fix-import-errors.mdx
@@ -0,0 +1,430 @@
+---
+title: Fix Import Errors
+description: Complete troubleshooting guide for resolving CSV import errors.
+---
+
+## Overview
+
+Import not working? This guide helps you identify and fix common import errors step by step.
+
+## How Import Validation Works
+
+After uploading your file and mapping columns, Twenty validates your data:
+
+1. **Validation runs** — Twenty checks each row for errors
+2. **Errors are highlighted** — problematic rows appear in **yellow**
+3. **You can fix in-place** — edit cells directly in the import UI
+4. **Or remove rows** — skip problematic records entirely
+
+**Fix errors in the UI.** You don't need to go back to your spreadsheet. Edit cells directly during import to save time.
+
+## Step-by-Step Troubleshooting
+
+### Step 1: Identify the Error Type
+
+Click on a highlighted row to see the specific error message. Common error types:
+
+| Error Message | What It Means |
+| --------------------------------------------------------------------- | ------------------------------------------------------------ |
+| Duplicate values highlighted in yellow | Value already exists in Twenty or appears twice in your file |
+| `{field} is not a valid {type}` (hover on yellow cell) | Data doesn't match expected format |
+| Required field highlighted | A required field is empty |
+| `Can't connect to {object}. No unique record found...` (import fails) | Referenced record doesn't exist |
+| `Too many records. Up to 10000 allowed` (upload blocked) | File has more than 10,000 records |
+
+### Step 2: Fix the Error
+
+Follow the specific instructions below for each error type.
+
+---
+
+## Error: Duplicate Value
+
+### What You'll See
+
+Rows with duplicate values are **highlighted in yellow** in the import UI before the import starts.
+
+### What It Means
+
+A unique field (email, domain) either:
+
+* Already exists in Twenty
+* Appears twice in your file
+
+### How to Fix
+
+**Option 1: Edit the duplicate value**
+
+1. Click the cell with the error
+2. Change to a unique value
+3. Continue with import
+
+**Option 2: Remove the duplicate row**
+
+1. Click the X next to the row
+2. The row will be skipped during import
+
+**Option 3: Let Twenty update the existing record**
+
+1. Ensure your file includes a unique identifier (`email`, `domain`, or `id`)
+2. Map the unique identifier field
+3. Twenty will update the existing record instead of creating a duplicate
+
+
+ **You can update unique fields too.**
+
+ * If you keep the `id` but change the `email` → the email will be updated
+ * If you keep the `email` but change the `id` → the id will be updated
+
+ As long as one unique identifier matches, Twenty updates the record.
+
+
+### How to Prevent This Error
+
+Before importing:
+
+1. Sort your spreadsheet by the unique field
+2. Remove duplicate rows
+3. Check if records already exist in Twenty
+
+
+ **Soft-deleted records count toward uniqueness.**
+
+ Check Command Menu → See deleted records. Records there still enforce uniqueness. Permanently delete them or restore and update.
+
+
+For more details: [Uniqueness Constraints](/l/fr/user-guide/data-migration/capabilities/uniqueness-constraints)
+
+---
+
+## Error: Invalid Format
+
+### What You'll See
+
+The cell value is highlighted in yellow. Hover over it to see the error message:
+
+```
+{field name} is not a valid {field type}
+```
+
+### What It Means
+
+The data doesn't match the expected format for that field type.
+
+### How to Fix — By Field Type
+
+#### Email
+
+**Problem:** Invalid email format
+**Solution:** Use format `name@domain.com`
+
+```
+❌ john.smith@
+❌ john smith@acme.com
+✓ john.smith@acme.com
+```
+
+#### Domain
+
+**Problem:** Inconsistent format may cause duplicates
+**Solution:** Use `https://domain.com` format (recommended)
+
+```
+⚠️ acme.com (valid, but not recommended)
+⚠️ www.acme.com (valid, but not recommended)
+✅ https://acme.com (recommended)
+```
+
+All formats are valid, but `https://domain.com` is recommended because it matches the format used by email/calendar sync. Using other formats may create duplicate companies.
+
+#### Date
+
+**Problem:** Unrecognized date format
+**Solution:** Use consistent format throughout file
+
+```
+✓ 2024-03-15 (YYYY-MM-DD - recommended)
+✓ 03/15/2024 (MM/DD/YYYY)
+✓ 15/03/2024 (DD/MM/YYYY)
+```
+
+#### Phone
+
+**Problem:** Missing required columns
+**Solution:** Include all phone columns
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+#### Boolean
+
+**Problem:** Wrong boolean value
+**Solution:** Use uppercase `TRUE` or `FALSE`
+
+```
+❌ true
+❌ yes
+❌ 1
+✓ TRUE
+✓ FALSE
+```
+
+#### Select / Multi-Select
+
+**Problem:** Value doesn't match existing options
+**Solution:** Use **API names**, not display labels
+
+How to find API names:
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at bottom right)
+4. Use the API name (e.g., `OPTION_1`, not "Option 1")
+
+```
+❌ High Priority
+✓ HIGH_PRIORITY
+```
+
+#### Currency
+
+**Problem:** Missing amount or currency code
+**Solution:** Fill both columns
+
+| Column | Example |
+| --------------------- | --------- |
+| **Amount / Amount** | `1234.56` |
+| **Amount / Currency** | `USD` |
+
+#### Number
+
+**Problem:** Non-numeric characters
+**Solution:** Numbers only, period for decimals
+
+```
+❌ $1,234.56
+❌ 1,234.56
+✓ 1234.56
+```
+
+For complete format reference: [Field Mapping](/l/fr/user-guide/data-migration/capabilities/field-mapping)
+
+---
+
+## Error: Required Field Missing
+
+### What You'll See
+
+The row is highlighted in yellow with the required field cell marked.
+
+### What It Means
+
+A required field is empty for this row.
+
+### How to Fix
+
+**Option 1: Enter a value**
+
+1. Click the empty cell
+2. Enter a value
+3. Continue with import
+
+**Option 2: Remove the row**
+
+1. If you don't have the data, click X to skip the row
+
+### How to Prevent This Error
+
+Before importing, identify required fields:
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Check which fields are marked as required
+
+---
+
+## Error: Relation Not Found
+
+### What You'll See
+
+This error appears **after the import starts** — the import fails with a message like:
+
+```
+Can't connect to company. No unique record found with condition: id = 7776ee49-f608-4a77-8cc8-6fe96ae1e43f
+```
+
+This means there is no Company in Twenty with that specific identifier.
+
+Unlike other errors, this one is not caught during the data review step. The import will start and then fail when it encounters the missing relation.
+
+### What It Means
+
+You're trying to link to a record that doesn't exist in Twenty.
+
+### How to Fix
+
+**Option 1: Import parent records first**
+
+1. Cancel the current import
+2. Import the parent records (e.g., Companies)
+3. Then import the child records (e.g., People)
+
+**Option 2: Fix the reference value**
+
+1. Check the reference value in your file
+2. Ensure it exactly matches an existing record
+3. Verify format: domains should be `https://domain.com`
+
+**Option 3: Remove the relation**
+
+1. Clear the cell to import without the relation
+2. Add the relation manually later
+
+### How to Prevent This Error
+
+1. **Import in the correct order:**
+ * Companies first
+ * People second (with company references)
+ * Opportunities third
+
+2. **Verify reference values:**
+ * Export parent records to get exact identifiers
+ * Use domain format `https://domain.com`
+ * Check for typos and case sensitivity
+
+
+ **Import will fail if a reference is made to a non-existent record.**
+
+ Always import parent objects before child objects.
+
+
+For more details: [Import Relations](/l/fr/user-guide/data-migration/capabilities/import-relations)
+
+---
+
+## Error: File Too Large
+
+### What You'll See
+
+This error appears **when uploading your file** — the upload is blocked entirely:
+
+```
+Too many records. Up to 10000 allowed
+```
+
+You won't be able to proceed to the data review step until you reduce the file size.
+
+### What It Means
+
+Your file has more than 10,000 records.
+
+### How to Fix
+
+**Option 1: Split into multiple files**
+
+1. Divide your data into files of 10,000 records or fewer
+2. Import each file separately
+3. Maintain import order (Companies before People)
+
+**Option 2: Use API import**
+For very large datasets, use the API which has no record limit.
+See: [How to Import Data via API](/l/fr/user-guide/data-migration/how-tos/import-data-via-api)
+
+---
+
+## Error: Field Not Recognized
+
+### What It Means
+
+A column in your file can't be mapped because the field doesn't exist in Twenty.
+
+### How to Fix
+
+1. Go to **Settings → Data Model**
+2. Select the object you're importing
+3. Click **+ Add field**
+4. Create the custom field with the appropriate type
+5. Re-upload your file
+
+The CSV import creates records, not fields. All fields must exist before importing.
+
+---
+
+## Error: User Relation Empty
+
+### What It Means
+
+You're trying to assign a record to a user (Owner, Assignee) but the relation isn't being mapped.
+
+### Common Causes
+
+1. **User hasn't accepted their invitation** — the user doesn't exist in Twenty yet
+2. **Using user ID from old system** — Twenty can't match IDs from another system
+3. **Wrong email format** — the email doesn't match the user's Twenty account
+
+### How to Fix
+
+1. Ensure all users have **accepted their invitation** to your Twenty workspace
+2. Use the user's **email address** (not their name or old system ID)
+3. Use the same email they used to join Twenty
+
+
+ **Users must accept invitations before importing.**
+
+ If a user hasn't accepted their invitation, records referencing them will have empty user relations.
+
+
+---
+
+## Pre-Import Checklist
+
+Avoid errors by checking these before importing:
+
+### File Requirements
+
+File is CSV, XLSX, or XLS format
+File has fewer than 10,000 records
+File uses UTF-8 encoding
+
+### Data Quality
+
+No duplicate emails (for People)
+No duplicate domains (for Companies)
+All dates use consistent format
+All domains use `https://domain.com` format
+
+### Field Formats
+
+Boolean fields use `TRUE` or `FALSE` (uppercase)
+Select fields use API names, not display labels
+Phone fields have all required columns
+Currency fields have both Amount and Currency Code
+
+### Relations
+
+Parent records imported before child records
+Relation columns reference existing records
+Domain format matches Twenty's format exactly
+
+### Data Model
+
+All custom fields exist in Settings → Data Model
+Select options exist before importing
+
+---
+
+## Still Having Issues?
+
+If you've tried the above solutions:
+
+1. **Download the sample file** — see the exact format Twenty expects
+2. **Export existing records** — compare your file to working data
+3. **Test with a small batch** — try 5-10 rows first
+4. **Check the reference articles:**
+ * [Field Mapping](/l/fr/user-guide/data-migration/capabilities/field-mapping)
+ * [Uniqueness Constraints](/l/fr/user-guide/data-migration/capabilities/uniqueness-constraints)
+ * [Import Relations](/l/fr/user-guide/data-migration/capabilities/import-relations)
+ * [Error Handling](/l/fr/user-guide/data-migration/capabilities/error-handling)
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/import-companies-via-csv.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
new file mode 100644
index 0000000000..e35012a90b
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
@@ -0,0 +1,201 @@
+---
+title: Import Companies via CSV
+description: Complete step-by-step guide to importing companies into Twenty.
+---
+
+## Overview
+
+This guide walks you through importing your companies into Twenty. **Companies should be imported first** because People and Opportunities link to Companies.
+
+## Before You Start
+
+### Prerequisites Checklist
+
+
+ Your file is CSV, XLSX, or XLS format
+
+
+
+ File has fewer than 10,000 records
+
+
+
+ No duplicate domains in your file
+
+
+
+ All custom fields exist in **Settings → Data Model**
+
+
+
+ Need to import more than 10,000 companies? Split into multiple files or use the [API import](/l/fr/user-guide/data-migration/how-tos/import-data-via-api).
+
+
+## Step 1: Prepare Your Company Data
+
+### Required and Recommended Fields
+
+| Field | Required? | Format | Notes |
+| ----------------- | ----------- | -------------------- | ------------------------ |
+| **Name** | Recommended | Text | Company display name |
+| **Domain** | Recommended | `https://domain.com` | Unique identifier |
+| **Address** | Optional | Multiple columns | See below |
+| **Employees** | Optional | Number | Employee count |
+| **Custom fields** | Optional | Varies | Must exist in Data Model |
+
+### Domain Format
+
+
+ **Use the format `https://domain.com` for domains.**
+
+ This matches the format used when Companies are auto-created from email/calendar sync, preventing duplicates later.
+
+
+**Domain columns:**
+
+* **Domain / Domain Label**: `acme.com`
+* **Domain / Domain URL**: `https://acme.com`
+
+### Address Format
+
+Address is a nested field with multiple columns:
+
+```
+Address / Address 1,Address / City,Address / State,Address / Country,Address / Post Code
+123 Main Street,San Francisco,CA,USA,94105
+```
+
+### Sample CSV Structure
+
+```csv
+name,Domain / Domain URL,Domain / Domain Label,Address / City,Address / Country,employees
+Acme Corp,https://acme.com,acme.com,San Francisco,USA,250
+Widget Co,https://widgets.co,widgets.co,New York,USA,50
+```
+
+
+ **Pro tip:** Click **Download sample file** during import to see the exact column names Twenty expects.
+
+
+## Step 2: Access the Import Feature
+
+**Option 1: From the Companies View**
+
+1. Navigate to **Companies** in the left sidebar
+2. Click the **⋮** icon on the top right
+3. Select **Import records**
+
+**Option 2: Using Command Menu**
+
+1. Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+2. Type "import"
+3. Select **Import records**
+4. Choose **Companies**
+
+## Step 3: Upload Your File
+
+1. Click **Select file**
+2. Choose your CSV, XLSX, or XLS file
+3. Wait for Twenty to analyze your file
+
+## Step 4: Map Your Columns
+
+Twenty automatically tries to match your columns to fields. Review and adjust:
+
+1. **Check automatic mappings** — verify they're correct
+2. **Fix incorrect mappings** — click the dropdown to select the right field
+3. **Skip columns** — select **Do not map** for columns you don't want to import
+
+### Important Mapping Rules
+
+* **Domain**: Map to **Domain / Domain URL** (not Domain Label)
+* **Address**: Map each part to its specific column (City, State, etc.)
+* **Select fields**: Values must match existing options (or you'll map them in the next step)
+
+
+
+## Step 5: Map Select Field Values
+
+If you have Select or Multi-Select fields:
+
+1. Twenty shows your values alongside existing options
+2. Match each value in your file to a Twenty option
+3. Or create new options if needed
+
+
+ Select options use **API names**, not display labels. Check **Settings → Data Model** → Enable **Advanced mode** to see API names.
+
+
+## Step 6: Review and Fix Errors
+
+Before completing the import, Twenty validates your data:
+
+1. Click **Next Steps**
+2. Rows with errors are highlighted in **yellow**
+3. **Fix errors directly** — click a cell and edit the value
+4. **Remove problematic rows** — click the X to skip that row
+
+### Common Company Import Errors
+
+| Error | Cause | Solution |
+| -------------------------- | ------------------------------- | ------------------------------------------ |
+| **Duplicate domain** | Domain already exists in Twenty | Remove from file or update existing record |
+| **Invalid domain format** | Wrong format | Use `https://domain.com` |
+| **Missing required field** | Required field is empty | Fill in the value or remove the row |
+
+## Step 7: Complete the Import
+
+1. Review the import summary
+2. Click **Confirm** to import
+3. Wait for the import to complete
+4. Verify by checking a few records
+
+## After Importing Companies
+
+Now you can import records that link to Companies:
+
+1. **[Import People](/l/fr/user-guide/data-migration/how-tos/import-contacts-via-csv)** — link them to Companies using the domain
+2. **Import Opportunities** — link them to Companies
+3. **Verify the import** — spot-check a few records to ensure data is correct
+
+## Updating Existing Companies
+
+To update companies instead of creating new ones:
+
+1. Include the `domain` or `id` column in your file
+2. Twenty matches records by this unique identifier
+3. Existing companies are updated; new ones are created
+
+See [How to Update Existing Records](/l/fr/user-guide/data-migration/how-tos/update-existing-records-via-import) for details.
+
+## FAQ
+
+
+
+ Domain is a unique identifier in Twenty. This prevents duplicate companies and ensures email sync correctly links emails to the right company.
+
+
+
+ You can leave the domain empty. However, we recommend adding domains when possible for better data quality and automatic email linking.
+
+
+
+ Yes! You can import companies first, then import People later and link them using the company domain.
+
+
+
+ If you include a unique identifier (domain or id) that matches an existing company, Twenty updates that company instead of creating a duplicate.
+
+
+
+ Either remove the duplicate from your file, or include the company's `id` to update the existing record instead.
+
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/fr/user-guide/data-migration/how-tos/fix-import-errors)
+* [Field Mapping Reference](/l/fr/user-guide/data-migration/capabilities/field-mapping)
+* [Uniqueness Constraints](/l/fr/user-guide/data-migration/capabilities/uniqueness-constraints)
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
new file mode 100644
index 0000000000..1ae59fe92d
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
@@ -0,0 +1,242 @@
+---
+title: Import Contacts via CSV
+description: Complete step-by-step guide to importing people/contacts into Twenty.
+---
+
+## Overview
+
+This guide walks you through importing your contacts (People) into Twenty. **Import Companies first** if you want to link People to Companies.
+
+## Before You Start
+
+### Prerequisites Checklist
+
+
+ Your file is CSV, XLSX, or XLS format
+
+
+
+ File has fewer than 10,000 records
+
+
+
+ No duplicate email addresses in your file
+
+
+
+ **Companies imported first** (if linking People to Companies)
+
+
+
+ All custom fields exist in **Settings → Data Model**
+
+
+
+ **Import Companies Before People**
+
+ If you want to link People to Companies, import Companies first. The Company must exist before you can reference it.
+
+
+## Step 1: Prepare Your Contact Data
+
+### Required and Recommended Fields
+
+| Field | Required? | Format | Notes |
+| ----------------- | ----------- | ----------------- | ------------------------- |
+| **Email** | Recommended | `name@domain.com` | Must be unique |
+| **First Name** | Recommended | Text | |
+| **Last Name** | Recommended | Text | |
+| **Company** | Optional | Domain or ID | Links to existing Company |
+| **Phone** | Optional | Multiple columns | See below |
+| **Job Title** | Optional | Text | |
+| **Custom fields** | Optional | Varies | Must exist in Data Model |
+
+### Email Format
+
+* Must be valid email format: `name@domain.com`
+* **Must be unique** — no duplicates in your file or in Twenty
+* For additional emails, use the **Emails / Additional Emails** column:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Phone Format
+
+Phone is a **nested field** requiring multiple columns:
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+### Linking to Companies
+
+Add a column with the Company's unique identifier:
+
+| Column Name | Format | Example |
+| --------------- | ---------- | -------------------------------------- |
+| `companyDomain` | URL format | `https://acme.com` |
+| `companyId` | UUID | `c776ee49-f608-4a77-8cc8-6fe96ae1e43f` |
+
+
+ **Use Domain URL format** (`https://acme.com`), not the label. This matches how Companies are stored in Twenty.
+
+
+### Sample CSV Structure
+
+```csv
+firstName,lastName,email,jobTitle,companyDomain,Phones / Primary Phone Number,Phones / Primary Phone Country Code
+John,Smith,john@acme.com,CEO,https://acme.com,4159095555,US
+Jane,Doe,jane@widgets.co,CTO,https://widgets.co,2125551234,US
+```
+
+
+ **Pro tip:** Click **Download sample file** during import or export a few existing People to see the exact column names Twenty expects.
+
+
+## Step 2: Access the Import Feature
+
+**Option 1: From the People View**
+
+1. Navigate to **People** in the left sidebar
+2. Click the **⋮** icon on the top right
+3. Select **Import records**
+
+**Option 2: Using Command Menu**
+
+1. Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+2. Type "import"
+3. Select **Import records**
+4. Choose **People**
+
+## Step 3: Upload Your File
+
+1. Click **Select file**
+2. Choose your CSV, XLSX, or XLS file
+3. Wait for Twenty to analyze your file
+
+## Step 4: Map Your Columns
+
+Twenty automatically tries to match your columns to fields. Review and adjust:
+
+1. **Check automatic mappings** — verify they're correct
+2. **Fix incorrect mappings** — click the dropdown to select the right field
+3. **Skip columns** — select **Do not map** for columns you don't want to import
+
+### Important Mapping Rules
+
+| Column Type | Map To | Notes |
+| ----------------- | ------------------------------ | ---------------------------------- |
+| Company reference | **Company** relation field | Use domain OR id, not both |
+| Email | **Email** | Primary email address |
+| Additional emails | **Emails / Additional Emails** | Array format |
+| Phone | Separate columns | Number, Country Code, Calling Code |
+
+
+
+### Mapping the Company Relation
+
+When mapping the company column:
+
+1. Find your company reference column (e.g., `companyDomain`)
+2. Map it to the **Company** relation field
+3. Twenty will link each Person to the matching Company
+
+
+ **Map only ONE unique identifier for relations.**
+
+ Don't map both `companyId` AND `companyDomain`. Choose one—preferably domain since it's human-readable.
+
+
+## Step 5: Map Select Field Values
+
+If you have Select or Multi-Select fields (like Lead Source):
+
+1. Twenty shows your values alongside existing options
+2. Match each value in your file to a Twenty option
+3. Or create new options if needed
+
+
+ Select options use **API names**, not display labels. Check **Settings → Data Model** → Enable **Advanced mode** to see API names.
+
+
+## Step 6: Review and Fix Errors
+
+Before completing the import, Twenty validates your data:
+
+1. Click **Next Steps**
+2. Rows with errors are highlighted in **yellow**
+3. **Fix errors directly** — click a cell and edit the value
+4. **Remove problematic rows** — click the X to skip that row
+
+### Common Contact Import Errors
+
+| Error | Cause | Solution |
+| -------------------------- | -------------------------------------- | ------------------------------------------- |
+| **Duplicate email** | Email already exists in Twenty or file | Remove duplicate or update existing record |
+| **Invalid email format** | Email format incorrect | Fix to `name@domain.com` |
+| **Relation not found** | Company doesn't exist | Import Companies first or fix the reference |
+| **Missing required field** | Required field is empty | Fill in the value or remove the row |
+
+## Step 7: Complete the Import
+
+1. Review the import summary
+2. Click **Confirm** to import
+3. Wait for the import to complete
+4. Verify by checking a few records and their Company links
+
+## After Importing Contacts
+
+Your contacts are now in Twenty! Next steps:
+
+1. **Verify Company links** — open a few People records to confirm they're linked to the right Company
+2. **Import Opportunities** — if needed, link them to People and Companies
+3. **Set up email sync** — connect your mailbox to see email history on contact records
+
+## Updating Existing Contacts
+
+To update contacts instead of creating new ones:
+
+1. Include the `email` or `id` column in your file
+2. Twenty matches records by this unique identifier
+3. Existing contacts are updated; new ones are created
+
+See [How to Update Existing Records](/l/fr/user-guide/data-migration/how-tos/update-existing-records-via-import) for details.
+
+## FAQ
+
+
+
+ Email is a unique identifier in Twenty. This prevents duplicate contacts and ensures email sync correctly links emails to the right person.
+
+
+
+ You can leave the email empty. However, we recommend adding emails when possible for better data quality and email sync functionality.
+
+
+
+ Add a column with the Company's domain (e.g., `https://acme.com`) or ID. During mapping, connect this column to the Company relation field.
+
+
+
+ Import Companies first, then import People. The Company must exist before you can reference it.
+
+
+
+ Yes! Create a custom field marked as "unique" in your data model to store the external ID. Note: the field name `id` is reserved for Twenty's internal ID.
+
+
+
+ The Company you're referencing doesn't exist. Either import the Company first, or check that the domain/ID exactly matches an existing Company.
+
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/fr/user-guide/data-migration/how-tos/fix-import-errors)
+* [How to Import Relations](/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+* [Field Mapping Reference](/l/fr/user-guide/data-migration/capabilities/field-mapping)
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/import-data-via-api.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/import-data-via-api.mdx
new file mode 100644
index 0000000000..7a9aae41a6
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/import-data-via-api.mdx
@@ -0,0 +1,176 @@
+---
+title: Import Data via API
+description: When and how to use Twenty's APIs for large-scale data imports.
+---
+
+## Overview
+
+Twenty provides both **GraphQL** and **REST APIs** for programmatic data import. Use the API when CSV import isn't practical for your data volume or when you need automated, recurring imports.
+
+## When to Use API Import
+
+| Scenario | Recommended Method |
+| ---------------------------------- | ----------------------------- |
+| Under 10,000 records | CSV Import |
+| 10,000 - 50,000 records | CSV Import (split into files) |
+| **50,000+ records** | **API Import** |
+| One-time migration | Either (based on volume) |
+| **Recurring imports** | **API Import** |
+| **Real-time sync** | **API Import** |
+| **Integration with other systems** | **API Import** |
+
+For datasets in the hundreds of thousands, the API is significantly faster and more reliable than multiple CSV imports.
+
+## API Rate Limits
+
+Twenty enforces rate limits to ensure system stability:
+
+| Limit | Value |
+| -------------------------- | --------------------- |
+| **Requests per minute** | 100 |
+| **Records per batch call** | 60 |
+| **Maximum throughput** | ~6,000 records/minute |
+
+
+ **Plan your import around these limits.**
+
+ For 100,000 records at maximum throughput, expect approximately 17 minutes of import time. Add buffer time for error handling and retries.
+
+
+## Getting Started
+
+### Step 1: Get Your API Key
+
+1. Go to **Settings → Developers**
+2. Click **+ Create API key**
+3. Give your key a descriptive name
+4. Copy the API key immediately (it won't be shown again)
+5. Store it securely
+
+
+ **Keep your API key secret.**
+
+ Anyone with your API key can access and modify your workspace data. Never commit it to code repositories or share it publicly.
+
+
+### Step 2: Choose Your API
+
+Twenty supports two API types:
+
+| API | Best For | Documentation |
+| ----------- | ----------------------------------------------------------- | ------------------------------------------------ |
+| **GraphQL** | Flexible queries, fetching related data, complex operations | [API Docs](/l/fr/developers/extend/capabilities/apis) |
+| **REST** | Simple CRUD operations, familiar REST patterns | [API Docs](/l/fr/developers/extend/capabilities/apis) |
+
+Both APIs support:
+
+* Creating, reading, updating, and deleting records
+* **Batch operations** — create or update up to 60 records per call
+
+**For imports, use batch operations** to maximize throughput within rate limits.
+
+### Step 3: Plan Your Import Order
+
+Just like CSV imports, **order matters** for relations:
+
+1. **Companies** first (no dependencies)
+2. **People** second (can link to Companies)
+3. **Opportunities** third (can link to Companies and People)
+4. **Tasks/Notes** (can link to any of the above)
+5. **Custom objects** (following their dependencies)
+
+## Best Practices
+
+### Batch Your Requests
+
+* Don't send records one at a time
+* Group up to **60 records per API call**
+* This maximizes throughput within rate limits
+
+### Handle Rate Limits
+
+* Implement delays between requests (600ms minimum for sustained imports)
+* Use exponential backoff when you hit limits
+* Monitor for 429 (Too Many Requests) responses
+
+### Validate Data First
+
+* Clean and validate your data before importing
+* Check required fields are populated
+* Verify formats match Twenty's requirements (see [Field Mapping](/l/fr/user-guide/data-migration/capabilities/field-mapping))
+
+### Log Everything
+
+* Log every record imported (including IDs)
+* Log errors with full context
+* This helps debug issues and verify completion
+
+### Test First
+
+* Test with a small batch (10-20 records)
+* Verify data appears correctly in Twenty
+* Then run the full import
+
+### Upsert to Avoid Duplicates
+
+The GraphQL API supports **batch upsert** — update if the record exists, create if not. This prevents duplicates when re-running imports.
+
+## Finding Object and Field Names
+
+To see available objects and fields:
+
+1. Go to **Settings → API and Webhooks**
+2. Browse the **Metadata API**
+3. View all standard and custom objects with their fields
+
+The documentation shows all standard and custom objects, their fields, and the expected data types.
+
+## Professional Services
+
+For complex API migrations, our partners can help:
+
+| Service | What's Included |
+| ----------------------- | ---------------------------------- |
+| **Data Model Design** | design your optimal data structure |
+| **Migration Scripts** | write and run the import scripts |
+| **Data Transformation** | handle complex mapping and cleanup |
+| **Validation & QA** | verify the migration is complete |
+
+**Best for:**
+
+* Migrations of 100,000+ records
+* Complex data transformations
+* Tight timelines
+* Teams without developer resources
+
+Contact us at [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/fr/user-guide/getting-started/capabilities/implementation-services).
+
+## FAQ
+
+
+
+ GraphQL lets you request exactly the data you need in a single query and is better for complex operations. REST uses standard HTTP methods (GET, POST, PUT, DELETE) and may be more familiar if you've worked with traditional APIs.
+
+
+
+ Yes! Use update mutations (GraphQL) or PUT/PATCH requests (REST) with the record's `id`.
+
+
+
+ Query for existing records first using unique identifiers (email, domain). Update if exists, create if not.
+
+
+
+ Yes, use delete mutations (GraphQL) or DELETE requests (REST).
+
+
+
+ Not currently, but both APIs work with any HTTP client in any language.
+
+
+
+## API Documentation
+
+For full implementation details, code examples, and schema reference:
+
+* [API Documentation](/l/fr/developers/extend/capabilities/apis)
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx
new file mode 100644
index 0000000000..1d76a3121b
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx
@@ -0,0 +1,228 @@
+---
+title: Import Relations Between Objects via CSV
+description: Complete step-by-step guide to linking records during CSV import.
+---
+
+## Overview
+
+This guide walks you through importing relations between objects—for example, linking People to Companies, or Opportunities to People.
+
+**What can be imported:** Only one-to-many relations pointing to a single object type. Relations pointing to multiple object types (like Notes linking to People AND Companies) are not yet supported for import.
+
+## Understanding Relations
+
+### What is a "One-to-Many" Relation?
+
+In a one-to-many relation:
+
+* **One** Company has **many** People (employees)
+* **One** Company has **many** Opportunities
+* **One** Person has **many** Tasks
+
+The "one" side is the **parent**. The "many" side is the **child**.
+
+### Common Relations in Twenty
+
+| Relation | "One" Side (Parent) | "Many" Side (Child) |
+| ------------------------- | ------------------- | ------------------- |
+| Companies → People | Company | People |
+| Companies → Opportunities | Company | Opportunities |
+| People → Tasks | Person | Tasks |
+| People → Notes | Person | Notes |
+
+## Step 1: Identify the "One" and "Many" Sides
+
+Before importing, determine which object is the parent and which is the child.
+
+**Ask yourself:** "Does ONE [Object A] have MANY [Object B]?"
+
+* One Company → Many People ✓ (Company is parent)
+* One Person → Many Companies ✗ (This is wrong—a person belongs to one company)
+
+## Step 2: Import the Parent Records First
+
+The parent ("one" side) must exist in Twenty before you can reference it.
+
+**Import order:**
+
+1. **Companies** first (no dependencies)
+2. **People** second (link to Companies)
+3. **Opportunities** third (link to Companies and/or People)
+4. **Tasks/Notes** (link to any of the above)
+
+
+ **If the parent record doesn't exist, the import will fail.**
+
+ Always verify that Companies are imported before importing People with company references.
+
+
+## Step 3: Note the Parent's Unique Identifier
+
+You need to reference the parent record using a **unique identifier**. Available options:
+
+| Parent Object | Available Unique Identifiers |
+| --------------------- | --------------------------------------------------------------- |
+| **Companies** | `id` (UUID), `domain` (recommended), or any custom unique field |
+| **People** | `id` (UUID), `email`, or any custom unique field |
+| **Workspace Members** | `id` (UUID), `email` (not name) |
+| **Custom Objects** | `id` (UUID), or any field marked as unique |
+
+**Recommended:** Use `domain` for Companies and `email` for People. These are human-readable and easy to verify in your spreadsheet.
+
+### Finding the Identifier
+
+If you need the `id`:
+
+1. Export the parent records from Twenty
+2. The export includes the `id` column
+3. Use these IDs in your child records file
+
+## Step 4: Verify the Relation Field Exists
+
+Before importing, ensure the relation field exists between your objects.
+
+**To check or create:**
+
+1. Go to **Settings → Data Model**
+2. Select your child object (e.g., People)
+3. Look for a relation field pointing to the parent (e.g., Company)
+4. If it doesn't exist, create it:
+ * Click **+ Add field**
+ * Select **Relation** type
+ * Choose the parent object
+
+## Step 5: Prepare Your CSV File
+
+Add a column to your child CSV that references the parent using its unique identifier.
+
+### Example: People Linking to Companies
+
+**Your People CSV:**
+
+```csv
+firstName,lastName,email,jobTitle,companyDomain
+John,Smith,john@acme.com,CEO,https://acme.com
+Jane,Doe,jane@widgets.co,CTO,https://widgets.co
+Bob,Johnson,bob@techstart.io,Developer,https://techstart.io
+```
+
+The `companyDomain` column references the Company's domain.
+
+### Format Requirements
+
+| Identifier | Format | Example |
+| ---------- | -------------- | -------------------------------------- |
+| Domain | URL format | `https://acme.com` |
+| Email | Standard email | `john@acme.com` |
+| ID | UUID | `c776ee49-f608-4a77-8cc8-6fe96ae1e43f` |
+
+
+ **Domain format matters!**
+
+ Use `https://domain.com` (not just `domain.com`). This matches how Twenty stores Company domains and prevents matching errors.
+
+
+### Important Rules
+
+1. **Exact match required** — the value must exactly match the parent record
+2. **Map only ONE unique identifier** — don't include both `companyId` AND `companyDomain`
+3. **Case sensitive** — `Acme.com` ≠ `acme.com`
+
+## Step 6: Upload and Map the Relation
+
+1. Navigate to the child object (e.g., People)
+2. Click **⋮** → **Import records**
+3. Upload your CSV file
+4. In the field mapping step:
+ * Find your relation column (e.g., `companyDomain`)
+ * Map it to the **Company** relation field
+5. Complete the remaining mapping
+6. Review errors and confirm
+
+Twenty will automatically link each child record to the matching parent.
+
+## Step 7: Verify the Import
+
+After importing:
+
+1. Open a few child records (e.g., People)
+2. Verify the relation field shows the correct parent (e.g., Company)
+3. Open a parent record and check the related records section
+
+## Common Mistakes to Avoid
+
+| Mistake | Problem | Solution |
+| -------------------------- | -------------------------------------------------- | ------------------------------------------------------- |
+| **Wrong import order** | Importing People before Companies | Always import parents first, then children |
+| **Wrong domain format** | Using `acme.com` instead of `https://acme.com` | Use full URL format with `https://` |
+| **Multiple unique fields** | Mapping both `companyId` AND `companyDomain` | Map only ONE unique identifier |
+| **Missing relation field** | The relation field doesn't exist in the data model | Create it in **Settings → Data Model** before importing |
+| **Non-existent records** | The parent record doesn't exist in Twenty | Import parent records first, or check for typos |
+| **Case mismatch** | `Acme.com` in file but `acme.com` in Twenty | Ensure exact case matching |
+
+## Linking to Workspace Members
+
+When linking to Workspace Members (your team):
+
+* Use their **email address**, not their name
+* Example: `owner@yourcompany.com`, not "John Smith"
+
+```csv
+taskName,assignedTo
+Follow up with client,john@yourcompany.com
+Review proposal,jane@yourcompany.com
+```
+
+## FAQ
+
+
+
+ You have two options:
+
+ 1. Use the Twenty `id` (export parent records to get their IDs)
+ 2. Create a custom unique field in your data model to store an external ID from your previous system
+
+
+
+ Yes! Include the child record's unique identifier (e.g., `email` for People) and the new relation value. The import will update the relation.
+
+
+
+ Many-to-Many relations are not yet supported for import. This is planned for H1 2026.
+
+
+
+ Relations pointing to multiple object types are not yet supported for import/export. This is on our roadmap.
+
+
+
+ The import will show an error for that row. You can either:
+
+ * Import the parent record first, then re-import
+ * Fix the reference value
+ * Remove the row from import
+
+
+
+ Common causes:
+
+ * Wrong format (use `https://domain.com` for domains)
+ * Case mismatch (check exact spelling)
+ * Parent doesn't exist (import parents first)
+ * Mapping multiple identifiers (use only one)
+
+
+
+
+ **Remember: Soft-deleted records count toward uniqueness.**
+
+ If you're getting "not found" errors but the record seems to exist, check Command Menu → See deleted records. The parent may have been soft-deleted.
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/fr/user-guide/data-migration/how-tos/fix-import-errors)
+* [Import Relations Capabilities](/l/fr/user-guide/data-migration/capabilities/import-relations)
+* [Uniqueness Constraints](/l/fr/user-guide/data-migration/capabilities/uniqueness-constraints)
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
new file mode 100644
index 0000000000..c6da81f711
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
@@ -0,0 +1,293 @@
+---
+title: Migrating from Other CRMs
+description: Step-by-step guide to migrate your data from any CRM to Twenty.
+---
+
+## Overview
+
+This guide walks you through migrating your data from any CRM to Twenty. The process involves auditing your data, preparing your Twenty workspace, exporting from your current system, and importing into Twenty.
+
+Views, workflows, and permissions must be recreated manually after migration. Plan time for this configuration work.
+
+## Step 1: Audit Your Current Data
+
+Migration is an opportunity for a fresh start. Don't bring over clutter.
+
+**What to keep:**
+
+* Active contacts and companies
+* Open opportunities and deals
+* Important notes and activities
+* Custom fields you actually use
+
+**What to leave behind:**
+
+* Outdated contacts (no activity in 2+ years)
+* Duplicate records
+* Test data
+* Unused custom fields
+
+## Step 2: Map Your Data Model
+
+Create a mapping document between your current CRM and Twenty:
+
+| Your CRM | Twenty |
+| ---------------------- | -------------------- |
+| Account / Organization | **Company** |
+| Contact / Person | **People** |
+| Deal / Opportunity | **Opportunity** |
+| Activity | **Task** or **Note** |
+| Custom Object | **Custom Object** |
+
+**For each field, document:**
+
+* The source field name
+* The target Twenty field
+* Any format transformations needed (dates, phone numbers, etc.)
+
+Keep this mapping document handy during import—you'll reference it when mapping columns.
+
+## Step 3: Set Up Your Twenty Workspace
+
+Before importing data, prepare your Twenty workspace:
+
+### Create Custom Objects and Fields
+
+1. Go to **Settings → Data Model**
+2. Create any custom objects you need
+3. Add custom fields to standard and custom objects
+4. Configure field settings (unique, required, select options, etc.)
+
+
+ **Fields must exist before import.**
+
+ The CSV import creates records, not fields. Create all custom fields in Settings → Data Model before importing.
+
+
+### Invite Your Team
+
+
+ **Invite users BEFORE importing data.**
+
+ If your data includes user references (Account Owner, Assignee, etc.), those users must exist in Twenty before import. Otherwise, those relations cannot be mapped.
+
+
+1. Go to **Settings → Members**
+2. Invite all team members
+3. **Wait for everyone to accept** their invitation
+4. Verify all users appear in your Members list
+
+## Step 4: Export from Your Current CRM
+
+Export your data from your current CRM:
+
+1. Look for an **Export** function (usually under Settings, Data Management, or Admin)
+2. Export to **CSV format** when possible
+3. Export each object type separately (Companies, Contacts, Deals, etc.)
+4. Include all fields you want to migrate
+
+**Export these objects (in this order for reference):**
+
+1. Companies / Accounts / Organizations
+2. Contacts / People
+3. Deals / Opportunities
+4. Notes and Activities
+5. Custom objects
+
+## Step 5: Clean and Format Your Data
+
+Open each exported CSV in a spreadsheet application and prepare it for Twenty.
+
+### Remove Duplicates
+
+1. Sort by the unique field (email for People, domain for Companies)
+2. Remove or merge duplicate rows
+3. Verify no duplicates exist in Twenty already
+
+### Format Fields Correctly
+
+| Field Type | Required Format |
+| ----------------- | ------------------------------------------------- |
+| **Domain** | `https://domain.com` |
+| **Email** | `name@domain.com` (must be unique) |
+| **Date** | `YYYY-MM-DD` |
+| **Phone** | Three columns: Number, Country Code, Calling Code |
+| **Boolean** | `TRUE` or `FALSE` (uppercase) |
+| **Select fields** | Use API names, not display labels |
+
+
+ **Domain format is critical.**
+
+ Use `https://domain.com` (not `domain.com` or `www.domain.com`). This matches Twenty's format and prevents duplicates when you connect email/calendar sync.
+
+
+See [How to Prepare Your CSV Files](/l/fr/user-guide/data-migration/how-tos/prepare-your-csv-files) for complete formatting requirements for all field types.
+
+### Add Relation Columns
+
+To link records (e.g., People to Companies), add a column with the parent's unique identifier.
+
+**Example: People CSV with Company link**
+
+```csv
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+See [How to Import Relations](/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for detailed instructions on linking records.
+
+### Update User References
+
+If your data includes user assignments (Owner, Assignee):
+
+1. Add a column with the **user's email** (not just their ID from the old system)
+2. Use the same email addresses that users used to join your Twenty workspace
+
+See [How to Prepare Your CSV Files](/l/fr/user-guide/data-migration/how-tos/prepare-your-csv-files) for complete formatting guide.
+
+## Step 6: Import to Twenty
+
+
+ **Import Order Matters!**
+
+ Always import in this order:
+
+ 1. **Companies** first (no dependencies)
+ 2. **People** second (link to Companies)
+ 3. **Opportunities** third (link to Companies/People)
+ 4. **Notes and Tasks** (link to records)
+ 5. **Custom objects** following their dependencies
+
+ The parent record must exist before you can reference it.
+
+
+### Import Each Object
+
+For each CSV file, in order:
+
+1. Navigate to the object in Twenty
+2. Click **⋮ → Import records**
+3. Upload the CSV file
+4. Map columns to fields:
+ * Map user email columns to the appropriate relation fields
+ * Map relation columns (like `companyDomain`) to relation fields
+5. Review and fix any errors in the UI
+6. Confirm the import
+7. Verify a few records before proceeding to the next file
+
+**Detailed guides:**
+
+* [How to Import Companies](/l/fr/user-guide/data-migration/how-tos/import-companies-via-csv)
+* [How to Import Contacts](/l/fr/user-guide/data-migration/how-tos/import-contacts-via-csv)
+* [How to Import Relations](/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+
+## Step 7: Large Migrations (50,000+ Records)
+
+For large migrations:
+
+| Volume | Recommended Approach |
+| ----------------------- | ----------------------------- |
+| Under 10,000 records | Single CSV import |
+| 10,000 - 50,000 records | Split into multiple CSV files |
+| 50,000+ records | Use the API |
+
+**For API imports:**
+
+* Faster and more reliable for large datasets
+* Supports batch operations (up to 60 records per call)
+* See [How to Import Data via API](/l/fr/user-guide/data-migration/how-tos/import-data-via-api)
+
+## Step 8: Post-Migration Setup
+
+After importing data, complete your workspace configuration:
+
+### Recreate Views
+
+* Set up saved views with filters, sorts, and column configurations
+* Create any kanban or calendar views you need
+
+### Recreate Workflows
+
+* Rebuild your automations in **Settings → Workflows**
+* Start with the most critical workflows
+* Test each one before relying on it
+
+### Configure Roles and Permissions
+
+* Set up roles in **Settings → Roles**
+* Assign users to appropriate roles
+
+### Connect Email and Calendar
+
+* Each user connects their own account in **Settings → Accounts**
+* Twenty will start syncing emails to contact records
+* See [Email & Calendar](/l/fr/user-guide/calendar-emails/overview)
+
+### Train Your Team
+
+* Walk through the new interface together
+* Document any team-specific processes
+
+## Common Issues and Solutions
+
+| Issue | Cause | Solution |
+| ----------------------- | --------------------------- | ------------------------------------------------------------------------------------ |
+| **Duplicate errors** | Email/domain already exists | Remove duplicates from file, or include unique identifier to update existing records |
+| **Relation not found** | Parent record doesn't exist | Import parent objects first (Companies before People) |
+| **Missing fields** | Custom field doesn't exist | Create field in Settings → Data Model before importing |
+| **Select field errors** | Using display labels | Use API names (enable Advanced mode in Settings to find them) |
+| **User relation empty** | User hasn't accepted invite | Ensure all users accept invitations before importing |
+
+See [How to Fix Import Errors](/l/fr/user-guide/data-migration/how-tos/fix-import-errors) for detailed troubleshooting steps.
+
+## Post-Migration Checklist
+
+### Data Integrity
+
+All records imported (compare counts with source system)
+Relations working correctly (People linked to Companies)
+User assignments mapped correctly (Owner, Assignee)
+Custom fields populated
+No unexpected duplicates
+
+### Configuration
+
+Views recreated
+Workflows recreated and tested
+Roles and permissions configured
+Email/calendar sync connected
+
+### Team Readiness
+
+Team trained on new system
+Old CRM access plan decided (keep for reference? When to disable?)
+
+## FAQ
+
+
+
+ Not currently. Workflows must be recreated manually in Twenty.
+
+
+
+ File attachments are not included in CSV exports. You'll need to re-upload them manually, migrate via API, or contact our team for assistance.
+
+
+
+ Yes, we recommend keeping your old CRM running until you've verified the migration is complete. Just be careful not to create new data in both places.
+
+
+
+ Depends on data volume and complexity. Small migrations (under 10,000 records) can be done in a few hours. Large migrations may take several days including data cleanup and testing.
+
+
+
+## Need Help?
+
+For complex migrations or large datasets:
+
+* **Guided setup:** Book a 4-hour onboarding pack
+* **Full migration service:** Our partners can handle the entire migration
+
+Contact [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/fr/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx
new file mode 100644
index 0000000000..1144ac9eec
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx
@@ -0,0 +1,171 @@
+---
+title: Migrating from Self-Hosted to Cloud
+description: Step-by-step guide to migrate your Twenty self-hosted instance to Twenty Cloud.
+---
+
+## Overview
+
+This guide walks you through migrating your data from a Twenty self-hosted instance to Twenty Cloud. The process involves setting up your cloud workspace, exporting your data, and re-importing it.
+
+Views, workflows, and roles must be recreated manually after migration. Plan time for this configuration work.
+
+## Step 1: Create Your Cloud Workspace
+
+1. Go to [app.twenty.com](https://app.twenty.com) and create a new workspace
+2. Complete the initial setup wizard
+3. Note your new workspace URL
+
+## Step 2: Recreate Your Data Model
+
+Before importing data, recreate your custom objects and fields:
+
+1. Go to **Settings → Data Model** in your cloud instance
+2. Create custom objects that match your self-hosted setup
+3. Add custom fields to standard and custom objects
+4. Configure field settings (unique, required, etc.)
+
+Take screenshots of your self-hosted data model for reference, or keep both instances open side by side.
+
+## Step 3: Invite All Users
+
+
+ **Critical: Invite users BEFORE importing data.**
+
+ Users must accept their invitations before you import any records that reference them (like Account Owner fields). If users don't exist yet, those relations cannot be mapped.
+
+
+1. Go to **Settings → Members** in your cloud instance
+2. Invite all team members who had accounts on self-hosted
+3. **Wait for everyone to accept** their invitation
+4. Verify all users appear in your Members list
+
+## Step 4: Export Data from Self-Hosted
+
+Export each object from your self-hosted instance:
+
+1. Navigate to each object (Companies, People, Opportunities, etc.)
+2. Configure the view to show **all columns** you want to migrate
+3. Click **⋮ → Export view**
+4. Save each CSV file with a clear name (e.g., `companies-export.csv`)
+
+**Export in this order** (for reference when importing):
+
+1. Companies
+2. People
+3. Opportunities
+4. Custom objects (following their dependencies)
+5. Tasks, Notes
+
+## Step 5: Update Workspace Member References
+
+The exported CSVs contain user IDs from your self-hosted instance. These IDs won't match your cloud instance, so you need to replace them with emails.
+
+**For each CSV file with user references (Owner, Assignee, etc.):**
+
+1. Open the CSV in a spreadsheet application
+2. Add a new column next to each user ID column (e.g., `accountOwnerEmail` next to `accountOwnerId`)
+3. Fill in the **email address** of each user
+4. You can delete the old ID column or leave it (it will be skipped during import)
+
+**Example:**
+
+Before:
+
+```csv
+name,domain,accountOwnerId
+Acme Corp,https://acme.com,old-uuid-123
+```
+
+After:
+
+```csv
+name,domain,accountOwnerEmail
+Acme Corp,https://acme.com,john@yourcompany.com
+```
+
+Use the same email addresses that users used to accept their cloud workspace invitation.
+
+## Step 6: Plan Your Import Order
+
+Import files in the correct order to maintain relationships:
+
+1. **Companies** first (no dependencies)
+2. **People** second (link to Companies)
+3. **Opportunities** third (link to Companies and People)
+4. **Custom objects** (following their dependencies)
+5. **Tasks and Notes** last (link to other records)
+
+See [How to Import Relations](/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for details on maintaining relationships.
+
+## Step 7: Import to Cloud
+
+For each CSV file, in order:
+
+1. Navigate to the object in your cloud instance
+2. Click **⋮ → Import records**
+3. Upload the CSV file
+4. Map columns to fields:
+ * Map user email columns to the appropriate relation fields
+ * Map other columns as usual
+5. Review and fix any errors
+6. Confirm the import
+7. Verify a few records before proceeding to the next file
+
+## Step 8: Recreate Configuration
+
+After importing data, manually recreate:
+
+### Views
+
+* Recreate saved views with filters, sorts, and column configurations
+* Set up any kanban or calendar views
+
+### Workflows
+
+* Recreate automations in **Settings → Workflows**
+* Test each workflow before relying on it
+
+### Roles and Permissions
+
+* Configure roles in **Settings → Roles**
+* Assign users to appropriate roles
+
+### Integrations
+
+* Reconnect email and calendar sync for each user
+* Reconfigure any API integrations with new API keys
+
+## Post-Migration Checklist
+
+All data imported successfully
+Relations between objects working correctly
+User assignments (Owner, Assignee) mapped correctly
+Views recreated
+Workflows recreated and tested
+Roles and permissions configured
+Email/calendar sync reconnected
+API integrations updated with new keys
+
+## FAQ
+
+
+
+ Not currently. Workflows must be recreated manually in your cloud instance.
+
+
+
+ File attachments are not included in CSV exports. You'll need to re-upload any attachments manually, migrate them via API or contact our team for assistance with large migrations.
+
+
+
+ Yes, we recommend keeping your self-hosted instance running until you've verified the cloud migration is complete. Just be careful not to create new data in both places.
+
+
+
+ Records referencing that user will fail to import or the relation will be empty. Ensure all users accept invitations before importing data.
+
+
+
+## Need Help?
+
+For complex migrations or large datasets, contact us at [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/fr/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
new file mode 100644
index 0000000000..4fb19584c9
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
@@ -0,0 +1,270 @@
+---
+title: Prepare Your CSV Files
+description: Complete step-by-step guide to format your data for import into Twenty.
+---
+
+## Overview
+
+This guide walks you through preparing your CSV file for a successful import. Follow these steps in order to avoid errors.
+
+## Step 1: Check File Requirements
+
+Before you start, ensure your file meets these requirements:
+
+| Requirement | Details |
+| -------------- | ------------------------ |
+| **Format** | CSV, XLSX, or XLS |
+| **Size limit** | 10,000 records per file |
+| **Encoding** | UTF-8 recommended |
+| **Structure** | One object type per file |
+
+For datasets larger than 10,000 records, split into multiple files or use the [API import](/l/fr/user-guide/data-migration/how-tos/import-data-via-api).
+
+## Step 2: Download the Sample File
+
+**This is the most important step.** The sample file shows you the exact column names and format Twenty expects.
+
+1. Go to the object view (People, Companies, etc.)
+2. Click **⋮** → **Import records**
+3. Click **Download sample file**
+4. Use this file as your template
+
+**Pro tip:** Export a few existing records instead. This gives you real examples of how data should be formatted, and the column names will map automatically during import.
+
+## Step 3: Remove Duplicate Values
+
+Twenty enforces uniqueness on certain fields. Duplicates will cause import errors.
+
+| Object | Unique Fields |
+| ------------------ | ----------------------------------------- |
+| **People** | `id`, `email` |
+| **Companies** | `id`, `domain` |
+| **Custom objects** | `id`, plus any field you marked as unique |
+
+**Before importing:**
+
+1. Sort your spreadsheet by the unique field (email or domain)
+2. Remove or merge duplicate rows
+3. Check for duplicates that already exist in Twenty
+
+**Soft-deleted records count toward uniqueness.** Records in Command Menu → See deleted records will cause duplicate errors. Delete them permanently or restore and update them.
+
+## Step 4: Format Each Field Type Correctly
+
+Different field types require specific formats. Here's the complete reference:
+
+### Text Fields
+
+* No special formatting required
+* Leading/trailing spaces are automatically trimmed
+
+### Email Fields
+
+* Must be valid email format: `name@domain.com`
+* Must be unique (no duplicates in file or in Twenty)
+* For additional emails, use this format in the **Emails / Additional Emails** column:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Domain Fields
+
+* **Recommended format**: `https://domain.com`
+* This matches the format used by mailbox/calendar sync (prevents duplicates)
+* Fill both columns:
+ * **Domain / Domain Label**: `domain.com`
+ * **Domain / Domain URL**: `https://domain.com`
+* Must be unique within your file and in Twenty
+
+### Phone Fields
+
+Phone is a **nested field** requiring multiple columns:
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+### Address Fields
+
+Address is a **nested field** with multiple columns (some can be left empty):
+
+* **Address / Address 1**: Street address line 1
+* **Address / Address 2**: Street address line 2 (optional)
+* **Address / City**: City name
+* **Address / State**: State or province
+* **Address / Country**: Country name
+* **Address / Post Code**: Postal/ZIP code
+
+### Date Fields
+
+Use consistent formatting throughout your file:
+
+* `YYYY-MM-DD` (recommended): `2024-03-15`
+* `MM/DD/YYYY`: `03/15/2024`
+* `DD/MM/YYYY`: `15/03/2024`
+* ISO 8601: `2024-03-15T10:30:00Z`
+
+### Number Fields
+
+* Numbers only (no text)
+* Use period for decimals: `1234.56`
+* No thousands separators (not `1,234.56`)
+
+### Currency Fields
+
+Currency is a **nested field** requiring two columns that **both must be filled**:
+
+| Column | Example |
+| --------------------- | --------- |
+| **Amount / Amount** | `1234.56` |
+| **Amount / Currency** | `USD` |
+
+### Boolean Fields
+
+Use uppercase: `TRUE` or `FALSE`
+
+Lowercase `true` or `false` will not work.
+
+### Select Fields
+
+Use the **API name** of the option, not the display label.
+
+**How to find API names:**
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at bottom right)
+4. Copy the API name (e.g., `OPTION_1`, not "Option 1")
+
+New select options are not created automatically. Add them in **Settings → Data Model** before importing.
+
+### Multi-Select Fields
+
+Use API names in array format:
+
+```
+["VALUE1","VALUE2"]
+```
+
+### Array Fields
+
+Use JSON array format:
+
+```
+["value1","value2"]
+```
+
+### Rating Fields
+
+Use the format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, or `RATING_5`
+
+### Links/URL Fields
+
+Fill both columns:
+
+* **Links / Link Label**: `Twenty`
+* **Links / Link URL**: `https://twenty.com`
+
+For secondary links, use the **Links / Secondary Links** column:
+
+```
+[{"url":"https://twenty.com","label":"Twenty"}]
+```
+
+### JSON Fields
+
+Use valid JSON format:
+
+```
+{"key":"value","key2":"value2"}
+```
+
+### ID Fields
+
+* **Optional**: Twenty auto-generates IDs if not provided
+* **Format**: UUID (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`)
+* **Use case**: Include ID to update existing records instead of creating new ones
+
+## Step 5: Add Relation Columns (If Linking Records)
+
+To link records to other objects (e.g., People to Companies), add a column with the unique identifier of the related record.
+
+**Example**: Linking People to Companies
+
+Add a column to your People CSV:
+
+```
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+**Important rules for relations:**
+
+* The parent record must already exist in Twenty
+* Use the **Domain URL** format (`https://domain.com`), not the label
+* Map only ONE unique identifier (don't include both `companyId` AND `companyDomain`)
+* For Workspace Members, use their **email** (not name)
+
+
+ **Import Order Matters!**
+
+ Import the "one" side before the "many" side:
+
+ 1. **Companies** first
+ 2. **People** second (with company reference)
+ 3. **Opportunities** third
+
+ The parent record must exist before you can reference it.
+
+
+See [How to Import Relations](/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for detailed instructions.
+
+## Step 6: Ensure Fields Exist in Twenty
+
+The import creates **records**, not **fields**. All fields you want to import must already exist in your data model.
+
+**Before importing:**
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Create any custom fields you need
+4. Note the exact field names (they must match your column headers)
+
+## Step 7: Final Checklist
+
+Before uploading your file, verify:
+
+File is CSV, XLSX, or XLS format
+File has fewer than 10,000 records
+Encoding is UTF-8
+No duplicate emails (for People) or domains (for Companies)
+Dates use consistent format throughout
+Domains use `https://domain.com` format
+Boolean fields use `TRUE` or `FALSE` (uppercase)
+Select fields use API names, not display labels
+All custom fields exist in Settings → Data Model
+Parent records imported before child records
+Relation columns reference existing records
+
+## Common Mistakes to Avoid
+
+| Mistake | Solution |
+| -------------------------------------------- | ------------------------------------- |
+| Using `true` instead of `TRUE` | Boolean values must be uppercase |
+| Using display labels for Select fields | Find and use API names in Settings |
+| Importing People before Companies | Always import parent objects first |
+| Missing currency code for Currency fields | Fill both Amount and Currency columns |
+| Wrong domain format | Use `https://domain.com` consistently |
+| Mapping multiple unique fields for relations | Map only ONE (domain OR id, not both) |
+
+## Next Steps
+
+Your file is ready! Now:
+
+* [Import Companies](/l/fr/user-guide/data-migration/how-tos/import-companies-via-csv) (import these first)
+* [Import Contacts](/l/fr/user-guide/data-migration/how-tos/import-contacts-via-csv)
+* [Fix any import errors](/l/fr/user-guide/data-migration/how-tos/fix-import-errors)
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx
new file mode 100644
index 0000000000..422638ef0e
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx
@@ -0,0 +1,198 @@
+---
+title: Update Existing Records via Import
+description: Complete step-by-step guide to bulk updating records using CSV import.
+---
+
+## Overview
+
+Need to update many records at once? Instead of editing them one by one, use the CSV import to bulk update existing records.
+
+**Use cases:**
+
+* Update job titles for multiple people
+* Change company information in bulk
+* Add data to new custom fields
+* Correct data errors across many records
+
+## How It Works
+
+When you import a file containing a **unique identifier** that matches an existing record, Twenty updates that record instead of creating a duplicate.
+
+| If unique identifier... | Twenty will... |
+| -------------------------- | ------------------------------------------------ |
+| Matches an existing record | **Update** the existing record |
+| Doesn't match any record | **Create** a new record |
+| Is missing from your file | **Create** a new record (with auto-generated ID) |
+
+
+ **Multi-Select fields are overwritten, not merged.**
+
+ If a record has `Option A` and `Option B` selected, and you import `["Option C"]`, the record will only have `Option C` after import. The import replaces all previous selections—it does not add to them.
+
+ To keep existing values, include them all in your import: `["Option A","Option B","Option C"]`
+
+
+## Step 1: Export Your Current Data
+
+First, export the records you want to update:
+
+1. Navigate to the object (People, Companies, etc.)
+2. **Add the columns you need** — click **Options → Fields** to show the fields you want to update
+3. **Filter if needed** — narrow down to only the records you want to update
+4. Click **⋮** → **Export view**
+5. Save the CSV file
+
+**Why export first?** The exported file has the correct format, includes unique identifiers, and maps automatically during import.
+
+### What Gets Exported
+
+* All visible columns in your current view
+* The record's unique identifiers (`id`, `email`, `domain`)
+* Current field values you can modify
+
+## Step 2: Edit the CSV File
+
+Open the exported file in your spreadsheet application (Excel, Google Sheets, etc.):
+
+1. **Keep the unique identifier column** — don't delete `id`, `email`, or `domain`
+2. **Update the values** in the columns you want to change
+3. **Remove columns you don't need to update** (optional, but cleaner)
+4. **Don't change unique identifier values** — or Twenty will create new records
+
+### Example: Updating Job Titles
+
+**Exported file:**
+
+```csv
+id,email,firstName,lastName,jobTitle
+550e8400-e29b-41d4-a716-446655440001,john@acme.com,John,Smith,Sales Rep
+550e8400-e29b-41d4-a716-446655440002,jane@acme.com,Jane,Doe,Sales Rep
+550e8400-e29b-41d4-a716-446655440003,bob@acme.com,Bob,Johnson,Sales Rep
+```
+
+**After your edits:**
+
+```csv
+id,email,firstName,lastName,jobTitle
+550e8400-e29b-41d4-a716-446655440001,john@acme.com,John,Smith,Account Executive
+550e8400-e29b-41d4-a716-446655440002,jane@acme.com,Jane,Doe,Senior Account Executive
+550e8400-e29b-41d4-a716-446655440003,bob@acme.com,Bob,Johnson,Account Executive
+```
+
+
+ **Don't change the unique identifier values.**
+
+ If you change `john@acme.com` to `john.smith@acme.com`, Twenty will create a new record instead of updating the existing one.
+
+
+## Step 3: Import the Updated File
+
+1. Navigate to the object
+2. Click **⋮** → **Import records**
+3. Upload your edited CSV file
+4. **Ensure the unique identifier is mapped** — verify `email`, `domain`, or `id` is mapped correctly
+5. Review the field mappings
+6. Check for errors
+7. Click **Confirm**
+
+Twenty matches records by the unique identifier and updates them with new values.
+
+## Choosing the Right Unique Identifier
+
+| Object | Recommended | Alternative | Notes |
+| ------------------ | ---------------- | ----------- | ---------------------------- |
+| **People** | `email` | `id` | Email is human-readable |
+| **Companies** | `domain` | `id` | Domain is human-readable |
+| **Custom objects** | Any unique field | `id` | Use your custom unique field |
+
+**Use only ONE unique identifier.** Don't map both `email` AND `id`. This can cause confusion and errors.
+
+### Using Custom Unique Fields
+
+If you have a custom field marked as unique (like an external ID from another system):
+
+1. Include that field in your export and import
+2. Map it during import
+3. Twenty will match on that field
+
+## Step 4: Verify the Updates
+
+After importing:
+
+1. Open a few updated records
+2. Verify the changes were applied
+3. Check that no duplicate records were created
+
+## What About Fields Not in Your File?
+
+**Fields not included in your import file remain unchanged.**
+
+| Your file includes... | Result |
+| ---------------------------- | ------------------------------------------------------ |
+| `email`, `jobTitle` | Only `jobTitle` is updated; other fields stay the same |
+| `email`, `jobTitle`, `phone` | `jobTitle` and `phone` are updated |
+
+This means you only need to include the fields you want to change (plus the unique identifier).
+
+## Combining Updates and New Records
+
+You can update existing records AND create new ones in the same import:
+
+```csv
+email,firstName,lastName,jobTitle
+john@acme.com,John,Smith,Senior Manager ← Updates existing (email matches)
+newperson@acme.com,New,Person,Analyst ← Creates new (email doesn't match)
+```
+
+## Common Mistakes to Avoid
+
+| Mistake | Problem | Result | Solution |
+| ------------------------------ | ------------------------------------------------------- | -------------------------------------- | ----------------------------------------- |
+| **Changing unique identifier** | Changed `john@acme.com` to `john.smith@acme.com` | Creates new record instead of updating | Keep unique identifiers unchanged |
+| **Multiple unique fields** | Mapping both `email` AND `id` | Potential matching conflicts | Map only ONE unique identifier |
+| **No unique identifier** | File only has `firstName`, `lastName`, `jobTitle` | All rows create new records | Always include `email`, `domain`, or `id` |
+| **Case mismatch** | File has `John@acme.com` but Twenty has `john@acme.com` | Creates new record | Export from Twenty to get exact values |
+
+## FAQ
+
+
+
+ Records with unique identifiers that don't match existing records will be created as new records. This lets you update and create in the same import.
+
+
+
+ Yes, leave the cell empty in your CSV. The import will clear that field's value on the existing record.
+
+
+
+ Fields not in your import file remain unchanged on existing records. Only fields you include are updated.
+
+
+
+ Yes! Include the relation's unique identifier (e.g., `companyDomain`) and map it to the relation field. The relation will be updated.
+
+
+
+ During the import review step, Twenty shows you how many records will be updated vs. created based on unique identifier matches.
+
+
+
+ There's no automatic undo. We recommend exporting your data as a backup before making bulk updates.
+
+
+
+## Best Practices
+
+1. **Export first** — always start from an export to ensure correct format
+2. **Backup before updating** — export your data before making bulk changes
+3. **Test with a few records** — try updating 5-10 records first before doing a large batch
+4. **Use human-readable identifiers** — `email` and `domain` are easier to verify than `id`
+5. **Only include necessary columns** — fewer columns means less chance for errors
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/fr/user-guide/data-migration/how-tos/fix-import-errors)
+* [Uniqueness Constraints](/l/fr/user-guide/data-migration/capabilities/uniqueness-constraints)
+* [Field Mapping Reference](/l/fr/user-guide/data-migration/capabilities/field-mapping)
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/overview.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/overview.mdx
index 851f8eb428..cd43973969 100644
--- a/packages/twenty-docs/l/fr/user-guide/data-migration/overview.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/overview.mdx
@@ -1,89 +1,89 @@
---
-title: Migration de données},{
-description: Importez et exportez vos données CRM via des fichiers CSV ou l’API.
+title: Data Migration
+description: Import and export your CRM data via CSV files or API.
image: /images/user-guide/import-export-data/cloud.png
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-
+
-## Méthodes d’import
+## Import Methods
-Twenty prend en charge deux méthodes principales d’import de données :
+Twenty supports two main methods for importing data:
-| Méthode | Idéal pour | Limite de volume |
-| ----------------------- | -------------------------------------------- | ---------------------------------- |
-| **Importation CSV** | Migrations standard, mises à jour régulières | 10 000 enregistrements par fichier |
-| **Importation via API** | Migrations à grande échelle, automatisation | Illimité |
+| Method | Best For | Volume Limit |
+| -------------- | ------------------------------------ | ----------------------- |
+| **CSV Import** | Standard migrations, regular updates | 10,000 records per file |
+| **API Import** | Large-scale migrations, automation | Unlimited |
-Pour des ensembles de données très volumineux (des centaines de milliers d’enregistrements), utilisez l’API. Nos [partenaires d’implémentation](/l/fr/user-guide/getting-started/capabilities/implementation-services) peuvent vous aider à exécuter ces scripts si nécessaire.
+For very large datasets (hundreds of thousands of records), use the API. Our [implementation partners](/l/fr/user-guide/getting-started/capabilities/implementation-services) can help run these scripts if needed.
-## Principes de base de l’import CSV
+## CSV Import Basics
-Vous pouvez importer des données pour n’importe quel objet à l’aide de fichiers CSV, XLSX ou XLS. Chaque fichier doit contenir **un seul type d’objet** (par exemple, uniquement des enregistrements Personnes).
+You can import data for any object using CSV, XLSX, or XLS files. Each file should contain **only one type of object** (e.g., only People records).
-**Les champs doivent exister avant l’import.** Le téléversement d’un CSV crée des enregistrements, mais ne crée pas de champs. Si vous avez besoin de champs personnalisés, créez-les d’abord dans **Paramètres → Modèle de données**.
+**Fields must exist before import.** Uploading a CSV creates records but does not create fields. If you need custom fields, create them first under **Settings → Data Model**.
-### Étapes
+### Steps
-1. Accédez à l’objet dans lequel vous souhaitez importer des données
-2. Cliquez sur l’icône **⋮** en haut à droite (le menu Commande), puis cliquez sur **Importer des enregistrements**
-3. Téléchargez le fichier modèle pour garantir que vos données sont au format attendu
-4. Téléversez votre fichier CSV formaté
-5. Faites correspondre vos colonnes aux champs Twenty
-6. Passez en revue les erreurs (surlignées en jaune) et corrigez-les en les modifiant directement dans l’interface
-7. Confirmez l’importation
+1. Navigate to the object where you want to import data
+2. Click the **⋮** icon on the top right (this is the Command Menu) and click on **Import records**
+3. Download the template file to ensure your data is in the expected format
+4. Upload your formatted CSV file
+5. Map your columns to Twenty fields
+6. Review errors (highlighted in yellow) and fix them, directly editing in the UI
+7. Confirm the import
-### Importer des relations entre objets
+### Importing relations between objects
-Vous pouvez importer des relations entre objets à l’aide de la fonction d’import CSV. Vous devez référencer l’objet lié en utilisant un champ unique de cet objet : l’`id`, l’`email` pour les Personnes et les membres de l’espace de travail, le `domain` pour les entreprises, tout autre champ défini comme unique dans le modèle de données pour tout autre objet.
+You can import relations between objects using the csv import function. You need to reference the related object using a unique field from this object: the `id`, the `email` for People and Workspace Members, the `domain` for companies, any other field set as unique in the data model for any other object.
-**Les enregistrements supprimés comptent pour l’unicité.** Les enregistrements supprimés de façon logique (visibles dans le menu Commande → Voir les enregistrements supprimés) sont inclus dans les vérifications d’unicité. Si vous importez un enregistrement ayant la même valeur unique qu’un enregistrement supprimé, l’enregistrement supprimé sera restauré.
+**Deleted records count toward uniqueness.** Soft-deleted records (visible under Command Menu → See deleted records) are included in uniqueness checks. If you import a record with the same unique value as a deleted record, the deleted record will be restored.
- **L’ordre d’importation est important !**
+ **Import Order Matters!**
- Lors de l’import d’objets liés, téléversez les fichiers dans cet ordre :
+ When importing related objects, upload files in this order:
- 1. **Entreprises** d’abord (le côté "un" des relations)
- 2. **Personnes** en second (liées aux entreprises via companyId)
- 3. **Opportunités** en troisième (liées aux entreprises/personnes)
- 4. **Objets personnalisés** avec relations en dernier
+ 1. **Companies** first (the "one" side of relationships)
+ 2. **People** second (linked to companies via companyId)
+ 3. **Opportunities** third (linked to companies/people)
+ 4. **Custom objects** with relations last
- Pourquoi ? Le côté "un" d’une relation un-à-plusieurs doit exister avant que vous puissiez y faire référence. Par exemple, l’enregistrement Entreprise doit exister avant d’importer une Personne avec l’ID de cette entreprise.
+ Why? The "one" side of a one-to-many relationship must exist before you can reference it. For example, the Company record must exist before you import a Person with that company's ID.
-Veuillez consulter [cet article](/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) pour un guide étape par étape sur la procédure à suivre.
+Please refer to [this article](/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for a step-by-step guide on how to proceed.
-## Exporter des données
+## Export Data
-Exportez les données de votre espace de travail pour des sauvegardes, des rapports ou des migrations.
+Export your workspace data for backups, reporting, or migration.
-### Étapes
+### Steps
-1. Accédez à l’objet que vous souhaitez exporter
-2. Configurez la vue avec les colonnes dont vous avez besoin
-3. Cliquez sur **⋮** → **Exporter la vue**
-4. Enregistrez le fichier CSV
+1. Navigate to the object you want to export
+2. Configure the view with the columns you need
+3. Click **⋮** → **Export view**
+4. Save the CSV file
-**Seules les colonnes visibles sont exportées.** Le fichier CSV ne contiendra que les colonnes affichées dans votre vue actuelle. Ajoutez ou masquez des colonnes avant l’exportation pour contrôler les données incluses.
+**Only visible columns are exported.** The CSV file will only contain the columns displayed in your current view. Add or hide columns before exporting to control what data is included.
-**Limites d’exportation** : jusqu’à 20 000 enregistrements par export.
+**Export limits**: Up to 20,000 records per export.
-## Autorisations
+## Permissions
-L’import et l’export de données nécessitent des autorisations spécifiques :
+Data import and export require specific permissions:
-* **Importation** : nécessite l’autorisation "Import CSV"
-* **Exportation** : nécessite l’autorisation "Export CSV"
+* **Import**: Requires "Import CSV" permission
+* **Export**: Requires "Export CSV" permission
-Contactez l’administrateur de votre espace de travail si vous n’avez pas ces autorisations.
+Contact your workspace admin if you don't have these permissions.
-## Prochaines étapes
+## Next Steps
-* [Préparez vos fichiers CSV](/l/fr/user-guide/data-migration/how-tos/prepare-your-csv-files)
-* [Importer des relations entre objets](/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
-* [Importer via API pour de grands ensembles de données](/l/fr/user-guide/data-migration/how-tos/import-data-via-api)
+* [Prepare your CSV files](/l/fr/user-guide/data-migration/how-tos/prepare-your-csv-files)
+* [Import relations between objects](/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+* [Import via API for large datasets](/l/fr/user-guide/data-migration/how-tos/import-data-via-api)
diff --git a/packages/twenty-docs/l/fr/user-guide/data-model/capabilities/fields.mdx b/packages/twenty-docs/l/fr/user-guide/data-model/capabilities/fields.mdx
index e4885faef2..ef477158c2 100644
--- a/packages/twenty-docs/l/fr/user-guide/data-model/capabilities/fields.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/data-model/capabilities/fields.mdx
@@ -1,122 +1,122 @@
---
-title: Champs
-description: Comprendre le rôle des champs et comment les gérer.
+title: Fields
+description: Understand the role of fields and how to manage them.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-## À propos des Champs
+## About Fields
-Les champs sont comme les colonnes d'une feuille de calcul. Ils stockent différents types de données comme du texte, des chiffres ou des dates. Les champs peuvent être standard (intégrés) ou personnalisés (ceux que vous créez).
+Fields are like columns in a spreadsheet. They store different types of data like text, numbers, or dates. Fields can be standard (built-in) or custom (the ones you create).
-### Champs Standards
+### Standard Fields
-Les champs standard sont intégrés à Twenty pour répondre aux besoins professionnels courants.
+Standard fields come built-in with Twenty to handle common business needs.
-Par exemple, `Prénom` et `Nom de famille` sont des champs standards dans l'objet `Personnes`. Ils stockent des données textuelles pour les noms individuels.
+For example, `First Name` and `Last Name` are standard fields in the `People` object. They store text data for individual names.
-Vous ne pouvez pas supprimer les champs standard, mais vous pouvez les désactiver si vous n'en avez pas besoin.
+You cannot delete standard fields, but you can deactivate them if you don't need them.
-Vous pouvez également personnaliser les options des champs standard de type `SELECT`, par exemple les options pour l’`Étape` des Opportunités.
+You can also customize the options of the standard `SELECT` type fields, for example the options for the `Stage` on Opportunities.
-### Champs Personnalisés
+### Custom Fields
-Les champs personnalisés peuvent être ajoutés à n'importe quel objet. Vous pouvez stocker du texte, des chiffres, des dates, des sélections déroulantes, et plus encore. Utilisez les champs personnalisés pour suivre des informations spécifiques à votre entreprise.
+Custom fields can be added to any object. You can store text, numbers, dates, dropdown selections, and more. Use custom fields to track information that's specific to your business.
-Par exemple, un champ personnalisé pour SpaceX pourrait être `Statut Actif de la Fusée`, indiquant si une fusée est opérationnelle.
+For instance, a custom field for SpaceX could be `Rocket Active Status`, indicating if a rocket is operational.
-## Types de champs
+## Field Types
-Twenty prend en charge divers types de champs :
+Twenty supports various field types:
-| Type | Description | Exemple |
-| ------------------ | ----------------------------------------------------------- | -------------------------- |
-| Adresse | Adresse structurée avec rue, ville, état, pays, code postal | Adresse du bureau |
-| Tableau | Liste de valeurs textuelles | Étiquettes |
-| Booléen | Case à cocher vrai/faux | Actif |
-| Devise | Valeur monétaire avec code de devise | Montant de l’affaire (USD) |
-| Date | Valeurs de date | Date de clôture |
-| Date et heure | Date avec heure | Heure de réunion |
-| Domaine | Domaine de site web (utilisé pour les Entreprises) | acme.com |
-| E-mail | Adresses e-mail (principale + supplémentaires) | Adresse e-mail du contact |
-| JSON | Données JSON structurées | Métadonnées personnalisées |
-| Liens | URL avec libellés (primaire + secondaire) | Site web, LinkedIn |
-| Texte long | Texte sur plusieurs lignes | Description, Notes |
-| Sélection multiple | Choix multiples à partir d’une liste prédéfinie | Étiquettes, Catégories |
-| Nombre | Valeurs numériques (entières ou décimales) | Quantité, Score |
-| Téléphone | Numéros de téléphone avec indicatif du pays | Téléphone professionnel |
-| Note | Notation par étoiles (1-5) | Priorité, Score |
-| Relation | Liens vers des enregistrements dans d’autres objets | Entreprise → Personnes |
-| Sélection | Choix unique à partir d’une liste prédéfinie | Étape, Statut |
-| Texte | Texte sur une seule ligne | Nom, Titre |
+| Type | Description | Example |
+| ------------ | ----------------------------------------------------------------- | ------------------ |
+| Address | Structured address with street, city, state, country, postal code | Office Address |
+| Array | List of text values | Tags |
+| Boolean | True/false checkbox | Is Active |
+| Currency | Monetary value with currency code | Deal Amount (USD) |
+| Date | Date values | Close Date |
+| Date & Time | Date with time | Meeting Time |
+| Domain | Website domain (used for Companies) | acme.com |
+| Email | Email addresses (with primary + additional) | Contact Email |
+| JSON | Structured JSON data | Custom metadata |
+| Links | URLs with labels (primary + secondary) | Website, LinkedIn |
+| Long Text | Multi-line text | Description, Notes |
+| Multi-Select | Multiple choices from a predefined list | Tags, Categories |
+| Number | Numeric values (integers or decimals) | Quantity, Score |
+| Phone | Phone numbers with country code | Work Phone |
+| Rating | Star rating (1-5) | Priority, Score |
+| Relation | Links to records in other objects | Company → People |
+| Select | Single choice from a predefined list | Stage, Status |
+| Text | Single line of text | Name, Title |
-## Créer un Champ Personnalisé
+## Create a Custom Field
-Pour ajouter un champ personnalisé à n'importe quel objet, suivez ces étapes:
+To add a custom field to any object, follow these steps:
-1. Allez dans les `Paramètres` dans la barre latérale gauche.
-2. Allez dans le `Modèle de Données`, puis sélectionnez l'objet que vous souhaitez personnaliser.
-3. Continuez en cliquant sur `Ajouter un champ`.
-4. Choisissez un nom de champ et un type qui répondent à vos exigences. Envisagez d'ajouter une description du champ pour une meilleure compréhension.
+1. Go to `Settings` in the left sidebar.
+2. Go to `Data Model`, then select the object you wish to customize.
+3. Proceed by clicking on `Add Field`.
+4. Choose a field name and type that suits your requirements. Consider adding a field description for better understanding.
-Votre nouveau champ est maintenant disponible dans les champs de l'application. Pour l'afficher sur une vue spécifique, cliquez sur le menu des options, puis sélectionnez `Champs`.
+Your newly created field is now available within the application's fields. To display it on a specific view, click on the options menu, then select `Fields`.
-
+
-**Méthode rapide:** Cliquez sur le bouton **+** en haut à droite de tout tableau d'objet, puis sélectionnez `Personnaliser les champs`. Cela vous amène directement aux paramètres du Modèle de Données.
+**Quick way:** Click the **+** button at the top right of any object table, then select `Customize fields`. This takes you directly to the Data Model settings.
-## Désactiver un champ
+## Deactivate a Field
-Vous pouvez désactiver un champ pour le masquer dans l'application sans perdre vos données. Considérez cela comme masquer le champ plutôt que de le supprimer.
+You can deactivate a field to hide it from the app without losing your data. Think of it as hiding the field rather than deleting it.
-Voici comment vous pouvez le faire:
+Here's how you can do it:
-1. Trouvez le champ que vous voulez désactiver dans vos paramètres d'objet.
+1. Find the field you want to deactivate in your object settings.
-2. Cliquez sur les trois points `⋮` à côté du champ pour ouvrir le menu.
+2. Click the three dots `⋮` next to the field to open the menu.
-3. Sélectionnez `Désactiver` dans le menu déroulant.
+3. Select `Deactivate` from the dropdown.
-Que se passe-t-il lorsque vous désactivez un champ?
+What happens when you deactivate a field?
-1. **Dans l'application :** Le champ disparaît et vous ne pouvez plus ajouter de nouvelles valeurs.
+1. **In the app:** The field disappears and you can't add new values to it.
-2. **Relations existantes :** S'il s'agit d'un champ de relation, les connexions existantes restent mais vous ne pouvez pas en créer de nouvelles.
+2. **Existing relationships:** If it's a relation field, existing connections stay but you can't create new ones.
-3. **Accès API :** Vous pouvez toujours accéder au champ et à ses données par l'API.
+3. **API access:** You can still access the field and its data through the API.
-Vous pouvez réactiver les champs standards et personnalisés ou avoir l'option de les supprimer définitivement.
+You can reactivate Standard and Custom Fields or have the option to permanently delete them.
-## Rendre les Champs Uniques
+## Make Fields Unique
-Rendez un champ unique pour garantir que des enregistrements distincts ne peuvent pas avoir la même valeur. Par exemple, les adresses e-mail sont uniques pour chaque personne.
+Make a field unique to ensure distinct records cannot have the same value. For example, email addresses are unique for each person.
-Si vous obtenez une erreur lors de la définition de l'unicité, vérifiez les valeurs en double dans vos données (y compris les enregistrements supprimés).
+If you get an error when setting uniqueness, check for duplicate values in your data (including deleted records).
-## Bonnes pratiques de configuration des champs
+## Field Configuration Best Practices
-### Conventions de nommage et limitations
+### Naming Conventions and Limitations
-* **Les noms au singulier et au pluriel doivent être distincts** : Notre API GraphQL nécessite des noms distincts pour les mutations
-* **Noms de champs protégés** : certains noms sont réservés à l’usage du système (par exemple, `Type`, `Application`)
+* **Singular and plural named must be distinct**: Our GraphQL API needs distinct names for mutations
+* **Protected field names**: some names are reserved for system usage (e.g., `Type`, `Application`)
-### Champs de devise et de téléphone
+### Currency and Phone Fields
-* **Devise par défaut** : peut être configurée via le modèle de données
-* **Codes de pays par défaut** : peuvent être configurés pour les champs téléphoniques via le modèle de données
+* **Default currency**: can be configured via the data model
+* **Default country codes**: can be configured for phone fields via the data model
-### Champs de sélection
+### Select Fields
-* **Une option par défaut peut être sélectionnée** pour chaque champ de sélection
+* **A default option can be selected** for each Select field
-### Champs de texte d'enregistrement
+### Record Text Fields
-* **Chaque objet a un champ d'affichage principal**: Ce champ apparaît dans la colonne la plus à gauche et représente l'enregistrement lorsqu'il est lié à d'autres objets. Il doit s'agir d'un champ de texte. Par exemple, le champ `Nom` est utilisé pour les Personnes comme champ principal, donc lorsque vous liez une personne à une entreprise, vous verrez son nom dans la vue de l'entreprise.
+* **Each object has one main display field**: This field appears in the leftmost column and represents the record when linked to other objects. It must be a text field. For example, People uses `Name` as the main field, so when you link a person to a company, you'll see their name in the company's view.
diff --git a/packages/twenty-docs/l/fr/user-guide/data-model/capabilities/objects.mdx b/packages/twenty-docs/l/fr/user-guide/data-model/capabilities/objects.mdx
new file mode 100644
index 0000000000..f2f1105277
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-model/capabilities/objects.mdx
@@ -0,0 +1,91 @@
+---
+title: Objects
+description: Learn about standard and custom objects in Twenty.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Standard Objects
+
+Standard objects are predefined entities in your workspace to help you get started. They're part of a shared data model accessible to all users of Twenty. You can use them as-is, customize them or deactivate them.
+
+
+
+### People
+
+The `People` object stores your contacts. It includes contact details and interaction history, so you can see all your customer interactions in one place.
+
+### Company
+
+The `Companies` object stores your business accounts. It includes details like industry, size and location. Companies connect to both `People` and `Opportunities` objects.
+
+### Opportunities
+
+The `Opportunities` object stores deal-related data. It tracks the progression of potential sales, from prospecting to closure, recording stages, deal sizes, associated account, and expected close date. You can view your sales pipeline in a kanban layout.
+
+### Notes
+
+The `Notes` object stores free-form notes that can be attached to People, Companies, Opportunities, and other records. Use notes to capture meeting summaries, important details, or any contextual information.
+
+### Tasks
+
+The `Tasks` object stores to-dos and action items. Tasks can be linked to People, Companies, Opportunities, and other records. Track due dates, assignees, and completion status to stay on top of your follow-ups.
+
+## Custom Objects
+
+Custom objects let you store information that's unique to your organization and that standard objects can't handle. For example, if you're SpaceX, you may want to create a custom object for Rockets and Launches.
+
+
+
+### Creating a New Custom Object
+
+To create a new custom object:
+
+1. Go to Settings in the sidebar on the left.
+2. Under Workspace, go to Data model. Here you'll be able to see an overview of all your existing Standard and Custom objects (both active and disabled).
+
+
+
+3. Click on `+ New object` at the top. Enter the name (both singular and plural), choose an icon, and add a description for your custom object and hit Save (at the top right). Using Listing as an example of custom object, the singular would be "listing" and the plural would be "listings" along with a description like "Listings that hosts created to showcase their property."
+
+4. Your custom object is now created and will appear in your sidebar. You can start adding records to it right away.
+
+## Managing Objects
+
+### Deactivating Objects
+
+If you don't need a standard or custom object:
+
+1. Go to Settings → Data Model
+2. Find the object you want to deactivate
+3. Click the toggle to deactivate it
+4. The object will be hidden from your workspace but data is preserved
+
+### Reactivating Objects
+
+To bring back a deactivated object:
+
+1. Go to Settings → Data Model
+2. Look for deactivated objects (they'll be grayed out)
+3. Click the toggle to reactivate it
+4. The object and all its data will be restored
+
+## Best Practices
+
+### When to Create Custom Objects
+
+* **Unique business entities**: Things specific to your industry or process
+* **Complex relationships**: When you need to track connections between multiple entities
+* **Scalable data**: When you might have many instances of something
+
+### When to Use Fields Instead
+
+* **Simple attributes**: Properties that describe existing objects
+* **Categories or labels**: Ways to classify existing records
+* **Single values**: Information that doesn't need its own lifecycle
+
+### Object Naming
+
+* **Use clear, descriptive names**: Make it obvious what the object represents
+* **Follow conventions**: Use singular for the object name, plural for the collection
+* **Consider your team**: Choose names everyone will understand
diff --git a/packages/twenty-docs/l/fr/user-guide/data-model/capabilities/relation-fields.mdx b/packages/twenty-docs/l/fr/user-guide/data-model/capabilities/relation-fields.mdx
new file mode 100644
index 0000000000..ddcd3c709e
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-model/capabilities/relation-fields.mdx
@@ -0,0 +1,92 @@
+---
+title: Relation Fields
+description: Connect records across different objects using relation fields.
+---
+
+## Types of Relations
+
+### One-to-Many
+
+One record in Object A can be linked to many records in Object B.
+
+**Example:** One Company can have many People (employees).
+
+### Many-to-One
+
+Many records in Object A can be linked to one record in Object B.
+
+**Example:** Many People can belong to one Company.
+
+### Relations to Multiple Object Types
+
+Some objects can link to multiple object types on one side of the relation.
+
+**Example:** A Note can be attached to one Person AND one Company AND one Opportunity simultaneously. The Note is on the "many" side, connecting to multiple "one" sides.
+
+
+
+Similarly, a Project (on the "one" side) could receive links from multiple People, multiple Companies, and multiple Notes.
+
+
+
+
+ **Import/Export limitation**: Relations pointing to multiple object types are not yet supported for CSV import/export. This is on our roadmap.
+
+
+### Many-to-Many
+
+Many records in Object A can be linked to many records in Object B.
+
+**Example:** Many People can be linked to many Projects, and vice versa.
+
+
+ **Many-to-Many is not yet supported.**
+
+ This relation type is planned for H1 2026. As a workaround, create an intermediate "junction" object (e.g., "Project Assignments") that has Many-to-One relations to both objects.
+
+
+## Creating a Relation Field
+
+1. Go to **Settings → Data Model**
+2. Select the object where you want to add the relation
+3. Click **+ Add Field**
+4. Select **Relation** as the field type
+5. Choose the target object(s) to relate to
+6. Configure the relation settings:
+ * **Field name on source object**: The name of the relation field on the object you're editing
+ * **Field name on destination object**: The name of the relation field that will appear on the target object
+ * Relation type (one-to-many, many-to-one)
+7. Click **Save**
+
+## Standard Relations
+
+Twenty comes with pre-built relations between standard objects:
+
+| From Object | To Object | Relation Type |
+| ------------- | --------- | ------------- |
+| People | Companies | Many-to-One |
+| Opportunities | Companies | Many-to-One |
+| Opportunities | People | Many-to-One |
+
+## Best Practices
+
+### Planning Relations
+
+* **Map your data model**: Plan relations before creating them
+* **Consider direction**: Think about which object "owns" the relationship
+* **Avoid circular dependencies**: Keep your data model clean
+
+### Naming Relations
+
+* **Use clear names**: Make it obvious what the relation represents
+* **Be consistent**: Use similar naming patterns across relations
+* **Consider both sides**: Name both sides of the relation appropriately
+
+### Performance
+
+* **Don't over-relate**: Too many relations can slow down your workspace
+
+## Limitations
+
+* **Deleting relations** removes the link but not the related records
+* **Circular relations** should be avoided for data integrity
diff --git a/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/create-custom-fields.mdx b/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/create-custom-fields.mdx
new file mode 100644
index 0000000000..b244cc755f
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/create-custom-fields.mdx
@@ -0,0 +1,72 @@
+---
+title: Create Custom Fields
+description: Step-by-step guide to adding custom fields to any object.
+---
+
+Custom fields let you capture information specific to your business. Add them to any object—standard or custom.
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Select the object you want to add a field to
+3. Click **+ Add Field**
+4. Choose a **field type** (see [Fields](/l/fr/user-guide/data-model/capabilities/fields) for all types)
+5. Enter the **field name** and optional description
+6. Configure field-specific settings (see below)
+7. Click **Save**
+
+**Quick method:** Click the **+** at the end of column headers in any table view → **Customize fields**.
+
+## Show the Field in Views
+
+New fields aren't automatically visible. To display:
+
+1. Open the object's table view
+2. Click **Options → Fields**
+3. Click the **eye icon** next to your field to show it
+4. Drag to reorder
+
+## Configuration Options
+
+### For Select / Multi-Select
+
+1. Click **+ Add option** to create choices
+2. Set a **default option** if desired
+3. Drag to reorder options
+
+
+ **Use API names for imports.** Enable **Advanced mode** in Settings to see API names. See [Field Mapping](/l/fr/user-guide/data-migration/capabilities/field-mapping).
+
+
+### For Currency Fields
+
+Set the **default currency** (USD, EUR, etc.) for new records.
+
+### For Phone Fields
+
+Set the **default country code** to pre-fill for new phone numbers.
+
+### Making a Field Unique
+
+Toggle **Unique** to prevent duplicate values across records.
+
+
+ If duplicates exist (including in deleted records), you'll get an error. Clean up duplicates first.
+
+
+### Setting Default Values
+
+For Select fields, you can choose which option is pre-selected for new records. For Checkbox fields, set whether it's checked or unchecked by default.
+
+## Deactivating a Field
+
+1. Go to **Settings → Data Model**
+2. Find the field
+3. Click **⋮ → Deactivate**
+
+Data is preserved. You can reactivate or permanently delete later.
+
+## Related
+
+* [Fields](/l/fr/user-guide/data-model/capabilities/fields) — all field types explained
+* [Data Model FAQ](/l/fr/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/create-custom-objects.mdx b/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/create-custom-objects.mdx
new file mode 100644
index 0000000000..8cf698959b
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/create-custom-objects.mdx
@@ -0,0 +1,51 @@
+---
+title: Create Custom Objects
+description: Step-by-step guide to creating custom objects in Twenty.
+---
+
+Custom objects let you store information unique to your business that standard objects don't cover. For example: Projects, Products, Tickets, or Listings.
+
+
+ **Not sure if you need an object or a field?** See [Understanding Your Data Model](/l/fr/user-guide/data-model/overview) for guidance.
+
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Click **+ New object**
+3. Fill in:
+ * **Singular name** (e.g., "Listing")
+ * **Plural name** (e.g., "Listings")
+ * **Icon**
+ * **Description** (optional)
+4. Click **Save**
+
+Your object appears in the sidebar immediately.
+
+## Next: Add Fields
+
+New objects start with basic fields. Add custom fields to capture the data you need:
+
+1. In **Settings → Data Model**, select your object
+2. Click **+ Add Field**
+3. Choose a field type, configure, and save
+
+See [How to Create Custom Fields](/l/fr/user-guide/data-model/how-tos/create-custom-fields) for details on field types and configuration.
+
+## Connecting to Other Objects
+
+To link your object to People, Companies, or other objects, create a relation field. See [How to Create Relation Fields](/l/fr/user-guide/data-model/how-tos/create-relation-fields).
+
+## Deactivating an Object
+
+If you no longer need an object:
+
+1. Go to **Settings → Data Model**
+2. Toggle the object off
+
+The object is hidden but data is preserved. You can reactivate or permanently delete later.
+
+## Related
+
+* [Objects](/l/fr/user-guide/data-model/capabilities/objects) — standard vs custom objects
+* [Data Model FAQ](/l/fr/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/create-relation-fields.mdx b/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/create-relation-fields.mdx
new file mode 100644
index 0000000000..5a34bfd581
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/create-relation-fields.mdx
@@ -0,0 +1,60 @@
+---
+title: Create Relation Fields
+description: Step-by-step guide to connecting objects with relation fields.
+---
+
+Relation fields connect records from different objects—for example, linking People to Companies.
+
+
+ **Relation names cannot be changed after creation** (they affect the API). Plan your names carefully.
+
+
+## Before You Start
+
+Decide:
+
+* Which objects are you connecting? (e.g., People → Companies)
+* Which is the "one" side? (e.g., Company)
+* Which is the "many" side? (e.g., People — many people work at one company)
+* What should the field be named on each side?
+
+See [Relation Fields](/l/fr/user-guide/data-model/capabilities/relation-fields) for relation types explained.
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Select the object where you want the relation (typically the "many" side)
+3. Click **+ Add Field**
+4. Select **Relation** as the field type
+5. Choose the **target object**
+6. Select **One-to-Many** or **Many-to-One**
+7. Enter field names for **both sides** of the relation
+8. Click **Save**
+
+## Example: People → Companies
+
+* Go to **Settings → Data Model → People**
+* Add a Relation field
+* Target: **Companies**
+* Type: **Many-to-One**
+* Field on People: **Company**
+* Field on Companies: **Employees**
+
+Now each Person can be linked to a Company, and each Company shows its People.
+
+## Deleting a Relation
+
+1. Go to **Settings → Data Model**
+2. Find the relation field
+3. Click **⋮ → Deactivate**
+
+Links are preserved but hidden. Reactivate to restore.
+
+
+ **Deleting a relation doesn't delete records.** Only the link between them is removed.
+
+
+## Related
+
+* [Relation Fields](/l/fr/user-guide/data-model/capabilities/relation-fields) — types and limitations
+* [How to Import Relations](/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) — bulk import linked records
diff --git a/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/customize-your-data-model.mdx b/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/customize-your-data-model.mdx
index 92cc7769be..76e698cff5 100644
--- a/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/customize-your-data-model.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/customize-your-data-model.mdx
@@ -1,22 +1,22 @@
---
-title: Personnalisez votre modèle de données},{
-description: Vue d’ensemble des options de personnalisation du modèle de données.
+title: Customize Your Data Model
+description: Overview of data model customization options.
---
-Le modèle de données de Twenty est entièrement personnalisable. Créez des objets, des champs et des relations adaptés à votre entreprise.
+Twenty's data model is fully customizable. Create objects, fields, and relations to match your business.
-## Liens rapides
+## Quick Links
-| Je souhaite... | Guide |
-| ----------------------------- | ---------------------------------------------------------------------------------------------- |
-| Créer un nouvel objet | [Comment créer des objets personnalisés](/l/fr/user-guide/data-model/how-tos/create-custom-objects) |
-| Ajouter des champs à un objet | [Comment créer des champs personnalisés](/l/fr/user-guide/data-model/how-tos/create-custom-fields) |
-| Relier des objets entre eux | [Comment créer des champs de relation](/l/fr/user-guide/data-model/how-tos/create-relation-fields) |
+| I want to... | Guide |
+| ------------------------ | -------------------------------------------------------------------------------------- |
+| Create a new object | [How to Create Custom Objects](/l/fr/user-guide/data-model/how-tos/create-custom-objects) |
+| Add fields to an object | [How to Create Custom Fields](/l/fr/user-guide/data-model/how-tos/create-custom-fields) |
+| Connect objects together | [How to Create Relation Fields](/l/fr/user-guide/data-model/how-tos/create-relation-fields) |
-## En savoir plus
+## Learn More
-* [Comprendre votre modèle de données](/l/fr/user-guide/data-model/overview) — concepts clés et conseils de planification
-* [Objets](/l/fr/user-guide/data-model/capabilities/objects) — objets standard et personnalisés
-* [Champs](/l/fr/user-guide/data-model/capabilities/fields) — tous les types de champs
-* [Champs de relation](/l/fr/user-guide/data-model/capabilities/relation-fields) — relier des objets
-* [FAQ sur le modèle de données](/l/fr/user-guide/data-model/how-tos/data-model-faq) — questions fréquentes
+* [Understanding Your Data Model](/l/fr/user-guide/data-model/overview) — key concepts and planning tips
+* [Objects](/l/fr/user-guide/data-model/capabilities/objects) — standard vs custom objects
+* [Fields](/l/fr/user-guide/data-model/capabilities/fields) — all field types
+* [Relation Fields](/l/fr/user-guide/data-model/capabilities/relation-fields) — connecting objects
+* [Data Model FAQ](/l/fr/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/data-model-faq.mdx b/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/data-model-faq.mdx
new file mode 100644
index 0000000000..73b5b5ed0c
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/data-model-faq.mdx
@@ -0,0 +1,155 @@
+---
+title: Data Model FAQ
+description: Frequently asked questions about Twenty's data model.
+---
+
+## Object Management
+
+
+
+ Yes, custom objects can be deleted. You can also deactivate them first, which hides the object and its data from the interface while preserving the data.
+
+
+
+ No, standard objects cannot be deleted. You can only deactivate them, which hides them from the interface but preserves the data.
+
+
+
+ You can create as many custom objects and fields as you need — the price doesn't change.
+
+
+
+ You can rename the label of standard objects (People, Companies, Opportunities), but not their API names. The API names are fixed for consistency across all Twenty workspaces.
+
+
+
+ Yes, you can change the icon for both standard and custom objects in **Settings → Data Model**.
+
+
+
+ Not yet. Object ordering in the navigation is currently fixed, but this feature is planned for a future release.
+
+
+
+ All active objects appear in the navigation. You can deactivate objects you don't need under **Settings → Data Model**.
+
+
+
+## Field Capabilities
+
+
+
+ No, field types cannot be changed after creation. If you need a different type, create a new field with the correct type, migrate your data, then deactivate the old field.
+
+
+
+ Our GraphQL API uses both forms for different operations:
+
+ * `createPerson` (singular) for single record actions
+ * `createPeople` (plural) for bulk operations
+
+ This creates limitations when singular and plural forms are the same, but it improves the developer experience.
+
+
+
+ Certain field names like `Type` or `Application` are reserved for system use. Choose alternative names like `Category` or `Classification` instead.
+
+
+
+ * The field is hidden from the interface
+ * Existing data is preserved
+ * You can still access the field via API
+ * Existing relations remain but you can't create new ones
+ * You can reactivate the field later
+
+
+
+ Currently, you cannot make custom fields required. All fields accept empty values. You can use workflows to enforce required fields by sending alerts or blocking actions when fields are empty.
+
+
+
+ * **Unique**: No two records can have the same value in this field
+ * **Required**: The field must have a value (not currently supported for custom fields)
+
+
+
+ Formula fields are coming in **Q1 2026**. In the meantime, you can use workflows to calculate and update field values automatically.
+
+
+
+ Nested fields are coming in **Q1 2026**. Currently, you can use workflows to bring field values from related objects. For example, to display a company's industry on a Person record, create a custom field on People and use a workflow to synchronize the value.
+
+
+
+ Field reordering will be available with custom layouts in **Q4 2025**. Currently, fields appear in alphabetical order.
+
+
+
+## Relations
+
+
+
+ Yes! Self-referencing relations are supported and recommended for use cases like account hierarchies. For example, create a relation from Companies to Companies to track parent/child accounts.
+
+
+
+ Many-to-many relationships are coming in **H1 2026**. Currently, create an intermediate object with two one-to-many relationships as a workaround.
+
+ For example, to link People and Projects (many-to-many), create a "Project Assignments" object with:
+
+ * A relation to People (many assignments → one person)
+ * A relation to Projects (many assignments → one project)
+
+
+
+ These allow one object to relate to multiple different object types through a single field. For example, Notes can be attached to People AND Companies AND Opportunities simultaneously.
+
+ Each Note links to one Person, one Company, and one Opportunity at the same time.
+
+ Learn more in [Relation Fields](/l/fr/user-guide/data-model/capabilities/relation-fields).
+
+
+
+ Yes, you can create multiple relations between the same two objects. For example, a Company could have both a "Primary Contact" and "Billing Contact" relation to People.
+
+
+
+ When you delete a record, the relation link is removed from the related records. The related records themselves are not deleted.
+
+
+
+ While technically possible, circular relations (A → B → C → A) should be avoided as they can cause confusion and potential performance issues.
+
+
+
+## Access and Permissions
+
+
+
+ Go to **Settings → Data Model** to view and edit all your objects and fields.
+
+
+
+ Reach out to your workspace administrator. Data model access is usually restricted to administrators only.
+
+
+
+## Data Management
+
+
+
+ There's no hard limit on record counts. However, very large datasets may impact performance in some views. Use filters and views to manage large datasets effectively.
+
+
+
+ Yes, you can import CSV data into any object, including custom objects. The import process supports field mapping for custom fields. See [How to Prepare Your CSV Files](/l/fr/user-guide/data-migration/how-tos/prepare-your-csv-files).
+
+
+
+ Currently, there's no built-in export for data model configuration. Contact support if you need to migrate your data model between workspaces.
+
+
+
+## Need More Help?
+
+Check our [Implementation Services](/l/fr/user-guide/getting-started/capabilities/implementation-services) for help with complex data model design.
diff --git a/packages/twenty-docs/l/fr/user-guide/data-model/overview.mdx b/packages/twenty-docs/l/fr/user-guide/data-model/overview.mdx
new file mode 100644
index 0000000000..aab0d25517
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-model/overview.mdx
@@ -0,0 +1,180 @@
+---
+title: Data Model
+description: Learn what a data model is and how to design one that fits your business.
+image: /images/user-guide/fields/custom_data_model.png
+---
+
+
+
+
+
+## What is a Data Model?
+
+A data model is the structure that defines how information is organized in your CRM. Think of it as the **blueprint** of your customer data — you design it once, then fill it with your actual data.
+
+## Key Concepts
+
+### Objects
+
+**Objects** are the main categories of data in your CRM. Each object represents a type of thing you want to track.
+
+Twenty comes with standard objects:
+
+* **People** — individuals (contacts, leads, partners)
+* **Companies** — organizations
+* **Opportunities** — deals or sales
+* **Notes** — attached notes on records
+* **Tasks** — to-dos linked to records
+
+You can also create **custom objects** for anything specific to your business (e.g., Projects, Subscriptions, Events).
+
+### Fields
+
+**Fields** are the properties or attributes that describe each object. They store the actual information.
+
+For example, the **People** object has fields like:
+
+* Name
+* Email
+* Phone
+* Job Title
+* Company (a relation to the Companies object)
+
+Fields have different **types**: text, number, date, select, multi-select, relation, and more. You can add custom fields to any object.
+
+### Records
+
+**Records** are the individual entries within an object — the actual data you create and manage.
+
+For example:
+
+* "John Smith" is a **record** in the People object
+* "Acme Corp" is a **record** in the Companies object
+
+**An analogy:**
+
+| Data Model Concept | Real-World Analogy |
+| ------------------ | ------------------------------------------ |
+| **Objects** | Sections in a book (the categories) |
+| **Fields** | Columns in a spreadsheet (the properties) |
+| **Records** | Rows in a spreadsheet (the actual entries) |
+
+You design the data model (objects + fields) once, then create many records within that structure.
+
+## Why Customize Your Data Model?
+
+Every business works differently. Customizing your data model means you can shape Twenty around **your** processes instead of forcing yours into a rigid system.
+
+Twenty offers full flexibility:
+
+* Create as many custom objects as you need
+* Add unlimited custom fields
+* The price doesn't change based on customization
+
+## Tips to Design Your Data Model
+
+### 1. Start with Your Core Objects
+
+Identify the main concepts you work with. Twenty already provides:
+
+* **People** — your contacts
+* **Companies** — your accounts
+* **Opportunities** — your deals
+
+Think about what else you might need:
+
+* Stripe would need a `Subscriptions` object
+* Airbnb would need a `Trips` object
+* An accelerator would need a `Batches` object
+
+### 2. Use Fields for Variations, Not New Objects
+
+If something is just a characteristic of an existing object, make it a **field**.
+
+**Use fields for:**
+
+* Categories and labels (e.g., `Industry` for Companies)
+* Status values (e.g., `Stage` for Opportunities)
+* Attributes and properties
+
+### 3. Create an Object When It Stands on Its Own
+
+If the concept has its own lifecycle, properties, or relationships, it deserves an object.
+
+**Create an object for:**
+
+* **Projects** — have deadlines, owners, and tasks
+* **Subscriptions** — connect companies, products, and invoices
+* **Events** — involve attendees and follow-up actions
+
+These go beyond a single field because they carry their own data and relationships.
+
+### 4. Create an Object When Records Are Open-Ended
+
+If something can be linked multiple times and you don't know how many, use an object.
+
+**Bad approach:**
+Creating fields like `Product 1`, `Product 2`, `Product 3`...
+
+**Good approach:**
+Create a `Products` object and relate it to records. This supports one, two, or a hundred products without changing your model.
+
+### 5. Keep It Simple First
+
+Start with fields. Move to new objects only when you feel the limits:
+
+* Too many fields on one object
+* Repeated records that should be separate
+* Relationships that don't fit neatly
+
+## Special Note on People, Companies, and Opportunities
+
+
+ **Email and calendar sync only works with People, Companies, and Opportunities.**
+
+ These are the only objects where you can access synchronized emails and meetings from your mailbox/calendar. We recommend using them as much as possible.
+
+
+**Best practices:**
+
+* If you need categories of People, use fields (not new objects)
+* Example: Use a `Person Type` field with values "Prospect" and "Partner" instead of creating separate objects
+* Create different **views** to filter: one showing partners, another showing prospects
+
+**It's okay to have fields that don't apply to every record.** For example, a `Referral Link` field on People that only applies when `Person Type = Partner`. Hide this field from views where it's not relevant.
+
+## Questions to Guide Your Choice
+
+Ask yourself:
+
+Is this just a property of something I already have, or does it need its own properties?
+Will I ever need to track multiple of these per record, without knowing how many?
+Does this concept connect to several different objects, not just one?
+Will it have its own lifecycle (stages, start/end dates)?
+
+If the answer is "yes" to one or more, it's probably time for a new object.
+
+## Accessing Your Data Model
+
+1. Go to **Settings** in the left sidebar
+2. Click **Data Model**
+3. View all your objects (standard and custom)
+4. Click any object to see and edit its fields
+
+
+ **Don't see Data Model in Settings?**
+
+ Access to the data model is usually restricted to administrators. Contact your workspace admin if you need access.
+
+
+## Next Steps
+
+Once you've planned your data model:
+
+* [How to Create Custom Objects](/l/fr/user-guide/data-model/how-tos/create-custom-objects)
+* [How to Create Custom Fields](/l/fr/user-guide/data-model/how-tos/create-custom-fields)
+* [How to Create Relation Fields](/l/fr/user-guide/data-model/how-tos/create-relation-fields)
+
+## Need Help?
+
+Our team can help you design and create the data model you need. Discover our [Implementation Services](/l/fr/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/fr/user-guide/getting-started/capabilities/glossary.mdx b/packages/twenty-docs/l/fr/user-guide/getting-started/capabilities/glossary.mdx
new file mode 100644
index 0000000000..71ac91622f
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/getting-started/capabilities/glossary.mdx
@@ -0,0 +1,108 @@
+---
+title: Glossary
+description: Get familiar with essential terminology used in Twenty.
+---
+
+## API
+
+API (Application Programming Interface) allows you to connect Twenty with other software systems and build custom integrations.
+
+## Apps
+
+Apps are custom extensions built as code that can define data models and serverless functions. They enable developers to create reusable customizations that can be deployed across multiple workspaces.
+
+## Code Actions
+
+Code Actions are workflow steps that let you write custom JavaScript to transform data, make calculations, or perform complex logic that isn't possible with built-in actions.
+
+## Command Menu
+
+The Command Menu is a quick-access interface (opened with `Cmd + K` on Mac and `Ctrl + K` on Windows) that lets you perform actions, create records, and navigate your workspace efficiently.
+
+## Company & People
+
+The CRM has two fundamental types of records:
+
+* A `Company` represents a business or organization.
+* `People` represent your company's current and prospective customers or clients.
+
+## Custom Fields
+
+Custom Fields are data fields you create to capture information specific to your business needs and processes.
+
+## Data Model
+
+A Data Model is the structure that defines how information is organized in your CRM, including what objects exist, their properties (fields), and how they relate to each other.
+
+## Favorites
+
+Favorites are records you've marked for quick access, appearing in your sidebar for instant navigation to important data.
+
+## Field
+
+A field refers to a specific area where particular data is stored for an entity.
+
+## Integration
+
+Integrations are built-in tools that allow you to link Twenty with other software or systems.
+
+## Iterator
+
+An Iterator is a workflow action that loops through an array of items, executing subsequent actions for each item in the list.
+
+## Kanban
+
+A `Kanban` is a visual way to track your business processes using cards and columns. Each column represents a stage in your process (for example: new, ongoing, won, lost), and you move records through these stages as they progress.
+
+## Object
+
+An Object is a data structure that represents a specific type of entity in your CRM (like People, Companies, or Opportunities). Objects can be standard (built-in) or custom (created by you).
+
+## Opportunities
+
+Opportunities in Twenty CRM are potential deals or sales with accounts or contacts.
+
+## Record
+
+A Record indicates an instance of an object, like a specific account or contact.
+
+## Relation Fields
+
+Relation Fields create connections between different objects, allowing you to link records together (like connecting a Person to a Company).
+
+## Standard Fields
+
+Standard Fields are pre-built data fields that come with objects by default and provide common functionality across all workspaces.
+
+## Tasks
+
+Tasks in Twenty CRM are assigned activities relating to contacts, accounts, or opportunities.
+
+## Triggers
+
+Triggers are the starting point of a workflow — the event or condition that initiates the automation. Examples include record creation, record updates, webhooks, or scheduled times.
+
+## Views
+
+You can customize the display of your records using views, setting different filters, layouts and sorting options for each view.
+
+## Upsert
+
+Upsert is an operation that combines "update" and "insert" — it updates an existing record if a match is found, or creates a new record if no match exists.
+
+## Webhooks
+
+Webhooks are automated messages sent from Twenty to other applications when specific events occur, enabling real-time data synchronization.
+
+## Workflows
+
+Workflows are automated processes that trigger actions based on specific conditions, helping you automate repetitive tasks and business processes.
+
+## Workspace
+
+A `Workspace` typically represents a company using Twenty. It holds all the records and data that you and your team members add to Twenty.
+It has a single domain name, which is typically the domain name your company uses for employee email addresses.
+
+## Workspace Members
+
+Workspace Members are the Twenty users from your team who have access to your workspace. They can be assigned as owners or assignees for records.
diff --git a/packages/twenty-docs/l/fr/user-guide/getting-started/capabilities/implementation-services.mdx b/packages/twenty-docs/l/fr/user-guide/getting-started/capabilities/implementation-services.mdx
new file mode 100644
index 0000000000..706de4d2a0
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/getting-started/capabilities/implementation-services.mdx
@@ -0,0 +1,16 @@
+---
+title: Implementation Services
+description: Whether you need help getting started or creating advanced customizations, we have a solution.
+---
+
+## Onboarding Packs
+
+Get help from our core team to set up your Twenty workspace with our 4-hour Onboarding packs:
+
+* **Data Model Design**: Design and create your custom data model with objects, fields, and relationships
+* **Data Migration**: Migrate your existing data from your current CRM to Twenty
+* **Workflow Creation**: Create custom workflows to support your business processes
+
+## Implementation Partners
+
+Work with certified Twenty partners for more advanced customizations and integrations. Reach out to our team via [contact@twenty.com](mailto:contact@twenty.com) to be matched with our partners.
diff --git a/packages/twenty-docs/l/fr/user-guide/getting-started/capabilities/what-is-twenty.mdx b/packages/twenty-docs/l/fr/user-guide/getting-started/capabilities/what-is-twenty.mdx
new file mode 100644
index 0000000000..989fc34e75
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/getting-started/capabilities/what-is-twenty.mdx
@@ -0,0 +1,42 @@
+---
+title: What is Twenty
+description: Twenty is an open-source CRM that gives you the building blocks to create exactly what your business needs.
+---
+
+## Vision
+
+Creating a good CRM is hard because it's a balancing act.
+For each business, the requirements seem straightforward, yet everyone's needs are distinct.
+The result is a CRM that's either too basic, or one that's attempting to be a jack-of-all-trades but ending up as a master of none.
+
+At first, Twenty looks like most CRMs you already know: you can track deals, organize contacts, manage tasks and notes.
+**But what sets it apart is our approach to extensibility. We are building an open platform that provides the building blocks for you to solve your unique business problems.**
+
+We prioritize universal principles and common patterns over feature lists.
+We don't try to have all the answers and instead empower users to find what works best for them.
+Open-source is the bedrock of our approach, ensuring that Twenty evolves with its community, for its community.
+
+## Benefits
+
+**Customizable:** Designed to fit your business needs.
+
+**Community-driven:** Built and maintained by a large open-source community.
+
+**Cost-effective:** You'll never be vendor-locked, because you can always self-host.
+
+## Main Features
+
+* **Calendar & Emails:** Sync your mailbox and calendar to see all communications on your CRM records. [Learn more](/l/fr/user-guide/calendar-emails/overview).
+* **Data Model:** Create custom objects and fields to match your unique business processes. [Explore](/l/fr/user-guide/data-model/overview).
+* **Data Migration:** Import and export your data via CSV or API. [Get started](/l/fr/user-guide/data-migration/overview).
+* **Views & Pipelines:** Organize your data with table views, kanban boards, and sales pipelines. [Discover](/l/fr/user-guide/views-pipelines/overview).
+* **Workflows:** Automate your business processes and integrate with external tools. [Build automations](/l/fr/user-guide/workflows/overview).
+* **AI:** Enhance your CRM with AI-powered features and agents. [Explore AI](/l/fr/user-guide/ai/overview).
+* **Dashboards:** Track performance with custom reports and visualizations. [View dashboards](/l/fr/user-guide/dashboards/overview).
+* **Permissions & Access:** Control who can view, edit, and manage your data with role-based permissions. [Configure access](/l/fr/user-guide/permissions-access/overview).
+* **Notes & Tasks:** Create notes and tasks linked to your records for better collaboration.
+* **API & Webhooks:** Connect to other apps and build custom integrations. [Start integrating](/l/fr/developers/extend/capabilities/apis).
+
+## Join now
+
+[Register here](https://app.twenty.com) or [become a contributor on GitHub](https://github.com/twentyhq/twenty).
diff --git a/packages/twenty-docs/l/fr/user-guide/getting-started/how-tos/configure-your-workspace.mdx b/packages/twenty-docs/l/fr/user-guide/getting-started/how-tos/configure-your-workspace.mdx
new file mode 100644
index 0000000000..c9861f407b
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/getting-started/how-tos/configure-your-workspace.mdx
@@ -0,0 +1,77 @@
+---
+title: Configure Your Workspace
+description: Every business works differently. Start with these 3 steps to shape Twenty around your needs.
+---
+
+**Quick Win**: Start with connecting your mailbox. This gives you immediate value and helps your team see Twenty in action with real data. You can do so under Settings → Accounts.
+
+## 1. Customize your data model
+
+Twenty offers the flexibility you need to shape the data model that will best support your day-to-day.
+Create objects and fields of any type, including relations between your different objects. You can do so under Settings → Data Model.
+Here are a few tips:
+
+* **You are not limited in the number of custom fields nor custom objects**. Adding custom objects and fields will not lead to upgrading your plan.
+* **People, Companies and Opportunities are the three objects from where you can access the emails and meetings synchronized from your mailbox and calendar**. We recommend using those as much as possible, adding fields to categorize your records if need be. Here is an example:
+ * It is best to use the People object for your prospects and partners, creating a field on the People object named `Person Type`, instead of creating a Partner custom object. Because you would not be able to access the emails exchanged with this person from the Partner records.
+ * Create different views under People, one to display partners and one to display prospects.
+* Two People cannot have the same email address. Two Companies cannot have the same domain.
+* You can deactivate standard fields and objects you do not want to use.
+* You can hide fields from views: don't be afraid of creating fields, you won't have to display all of them.
+
+Read [this article](/l/fr/user-guide/data-model/overview) to learn how to design your data model.
+
+## 2. Bring your data in
+
+Bringing your existing data into Twenty gives your team context from the start.
+
+### Connect your mailbox
+
+If you have not done so when creating your workspace, connect your **Google or Microsoft account** under Settings → Accounts. This allows Twenty to:
+
+* Import your messages and meetings
+* Auto-create contacts based on interactions (optional)
+* Keep communication history visible for your team
+
+**Using another provider?**
+You can add another mailbox via SMTP or another calendar via CalDAV. You will need to activate the feature under Settings → Releases → Lab, and then go back to the Settings → Accounts tab.
+
+### Import data via csv
+
+Use the Command menu (`Cmd + K` or `Ctrl + K`) to import People, Companies, Opportunities, or any custom objects via CSV.
+
+**Key guidelines**:
+
+* Download the sample file to understand the expected format
+* Limit each file to 10k records
+* Remove duplicate emails for People or duplicate domains for Companies
+* Review and fix errors (highlighted in yellow) before importing
+
+Read [this article](/l/fr/user-guide/data-migration/overview) to learn more about data import.
+
+## 3. Create your first view
+
+Creating different views is key to make the data actionable for your team.
+Here is how to proceed:
+
+* **Add or hide columns**
+ Manage the fields visible in a given view clicking on Options → Fields (from the top right). You can show/hide fields from there.
+
+* **Reorder fields**
+ Reorder the fields from a given view clicking on Options → Fields (from the top right). Drag and drop the fields to reorder them.
+
+* **Filter your view**
+ Narrow down the records displayed using the Filters from the top right.
+
+* **Sort records**
+ Reorder records displayed using the Sort function from the top right, or by clicking directly on the column name.
+
+* **Choose the layout**
+ You can switch to a **Kanban layout** or a list **Group By** layout, as long as the object has a `Stage` or similar select-type field.
+
+* **Save your view as Favorites**
+ This can be done using the dropdown menu showing the different views.
+
+## What's next?
+
+Start creating automations using [workflows](/l/fr/user-guide/workflows/overview).
diff --git a/packages/twenty-docs/l/fr/user-guide/getting-started/how-tos/create-workspace.mdx b/packages/twenty-docs/l/fr/user-guide/getting-started/how-tos/create-workspace.mdx
new file mode 100644
index 0000000000..f93617f83f
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/getting-started/how-tos/create-workspace.mdx
@@ -0,0 +1,48 @@
+---
+title: Create a Workspace
+description: Follow a step-by-step guide on how to register on Twenty, choose a subscription plan, and set up your account.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Step 1: Registration
+
+1. Navigate to [Twenty Sign Up](https://app.twenty.com).
+2. Select your preferred sign-up method:
+ * **Continue with Google** for Google account registration.
+ * **Continue with Microsoft** for Microsoft account registration.
+ * Or, **Continue With Email** for email registration.
+
+
+
+## Step 2: Choosing a Trial Period
+
+Choose between two trial periods:
+
+### 30 days
+
+With credit card
+
+### 7 days
+
+Without credit card
+
+Both trials include:
+
+* Full access
+* Unlimited contacts
+* Email integration
+* Custom objects
+* API & Webhooks
+
+You can click on "Change plan" to choose a different plan or billing interval.
+
+
+
+## Step 3: Payment Confirmation & Account Setup
+
+Post payment approval via Stripe, you're directed to create your workspace and user profile. Remember that you can cancel your subscription anytime.
+
+## Support
+
+For queries or help, connect with the dedicated support team at [contact@twenty.com](mailto:contact@twenty.com) or send a message on [Discord](https://discord.gg/cx5n4Jzs57).
diff --git a/packages/twenty-docs/l/fr/user-guide/getting-started/how-tos/navigate-around-twenty.mdx b/packages/twenty-docs/l/fr/user-guide/getting-started/how-tos/navigate-around-twenty.mdx
new file mode 100644
index 0000000000..6f4905e857
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/getting-started/how-tos/navigate-around-twenty.mdx
@@ -0,0 +1,83 @@
+---
+title: Navigate Around Twenty
+description: Get a quick overview of how to navigate through the platform and where to take different types of actions.
+---
+
+## The Main Layout
+
+The center of the screen is **where your records live**: people, companies, opportunities, tasks, notes, dashboards, workflows and any other object you created. This is where the day-to-day work happens.
+You can **view, edit, delete records** from there as well as **creating new views**.
+
+
+
+## The Navigation Bar
+
+On the left side, from the top to the bottom, you'll be able to:
+
+* Switch between your **several workspaces** using the dropdown menu or create a new workspace
+* Use the **search bar** (press `/` to focus on it instantly)
+* Open the **Settings** section
+* Have direct access to your **Favourites views**. Favourites are unique for each user.
+* Switch between different objects
+* **Create automations** using workflows
+* Reach out to Support and open our User Guide.
+
+
+
+## The Command Menu
+
+The command menu gives you **quick access to actions** in Twenty. You can access it in two ways:
+
+* **Keyboard shortcut**: Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+* **Mouse**: Click the three dots in the top right corner
+ From there, you can:
+* Create new records
+* **Import and export data via csv**
+* Create new views
+* Access deleted records (Twenty supports soft and hard deletes)
+* See the keyboard shortcuts to quickly access objects in your workspace
+
+
+
+## The Search Bar
+
+The search bar is accesible via the Command Menu, at the top of your navigation bar, or by pressing `/` to focus on it instantly. Search works across all object.
+
+
+
+## The Side Panel
+
+When you click on a record, the side panel appears on the right. This gives you a quick overview of the record's key information, without bringing you to another page. From there, you can decide to close this overview or to get additional information about this record, clicking on the Open button.
+
+
+
+## Views
+
+Every object (like Opportunities or People) supports multiple views. You're not limited in the number of views per object.
+
+Use the dropdown menu at the top left of the main layout to switch between the different views. For example:
+
+* Use a Kanban view to track opportunities by stage
+* Use Group By view to create sections and improve efficiency
+* Use filters to focus on specific records (e.g. leads created last week)
+* Save filtered views to reuse them later
+* Favourite views for fast access
+
+
+
+If you're new to Views, read our [Views & Pipelines guide](/l/fr/user-guide/views-pipelines/overview) to learn how to create and customize them.
+
+## Settings
+
+Open your Settings from the top left to:
+
+* **Connect your mailbox and calendar** accounts for seamless email and calendar sync
+* Customize your **data model**: create custom objects, fields, and relationships
+* **Access the API playground and configure webhooks**
+* **Manage user permissions** and workspace access controls
+* Invite team members and manage user roles
+* Edit your profile and workspace preferences
+* Configure billing and monitor workflow credits usage
+* Discover the latest releases and upcoming features (under Releases → Lab tab)
+
+If you do not see all those sections under Settings, reach out to your workspace administrator - some of them have restricted access.
diff --git a/packages/twenty-docs/l/fr/user-guide/introduction.mdx b/packages/twenty-docs/l/fr/user-guide/introduction.mdx
new file mode 100644
index 0000000000..cc882fb37a
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/introduction.mdx
@@ -0,0 +1,63 @@
+---
+title: Discover Twenty
+description: Welcome to Twenty User Guide, your resources for advanced configurations and best practices.
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+
+
+ Discover Twenty
+ Learn what Twenty is and how it can help your business.
+
+
+
+ Data Model
+ Customize your data model to fit your business processes.
+
+
+
+ Data Migration
+ Import and export your data via CSV or API.
+
+
+
+ Calendar & Emails
+ Centralize your team's meetings and emails.
+
+
+
+ Workflows
+ Automate processes and integrate with external tools.
+
+
+
+ AI
+ Enhance your team with AI agents.
+
+
+
+ Views & Pipelines
+ Organize your data with actionable views and pipelines.
+
+
+
+ Dashboards
+ Real-time insights to track performance.
+
+
+
+ Permissions & Access
+ Manage roles and access to Twenty.
+
+
+
+ Billing
+ Understand how Twenty pricing and billing works.
+
+
+
+ Settings
+ Configure your workspace preferences.
+
+
diff --git a/packages/twenty-docs/l/fr/user-guide/permissions-access/capabilities/permissions.mdx b/packages/twenty-docs/l/fr/user-guide/permissions-access/capabilities/permissions.mdx
new file mode 100644
index 0000000000..6f726692bc
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/permissions-access/capabilities/permissions.mdx
@@ -0,0 +1,198 @@
+---
+title: Permissions
+description: Control access to objects, fields, and settings with role-based permissions.
+image: /images/user-guide/permissions/permissions.png
+---
+
+Twenty's permission system allows you to control access to three main areas:
+
+* **Objects and Fields**: Control who can view, edit, or delete records and individual fields
+* **Settings**: Manage access to workspace configuration and administrative functions
+* **Actions**: Control general workspace actions like importing data or sending emails
+
+## Create a Role
+
+To create a new role:
+
+1. Go to **Settings → Roles**
+2. Under **All Roles**, click on **+ Create Role**
+3. Enter a role name
+4. In the default **Permissions** tab, [configure permissions](#customize-permissions)
+5. Click **Save** to finish
+
+## Delete a Role
+
+To delete a role:
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to remove
+3. Open the **Settings** tab, then click **Delete Role**
+4. Click **Confirm** in the modal
+
+
+ If a role is deleted, any workspace member assigned to it will be automatically reassigned to the default role. All except the **Admin** role can be deleted. There must always be at least one member assigned to the **Admin** role.
+
+
+## Assign Roles to Members
+
+### View Current Assignments
+
+* Go to **Settings → Roles**
+* See all roles and how many members are assigned to each
+* View which members have which roles
+
+### Assign a Role to a Member
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Click **+ Assign to member**
+5. Select the workspace member from the list
+6. Confirm the assignment
+
+### Set Default Role
+
+1. Go to **Settings → Roles**
+2. In the **Options** section, find **Default Role**
+3. Select which role new members should automatically receive
+4. New workspace members will be assigned this role when they join
+
+
+ You can only assign roles to existing workspace members. To invite new members, use [Member Management](/l/fr/user-guide/settings/capabilities/member-management).
+
+
+## Customize Permissions
+
+Permissions determine what each role can access or modify within your workspace, including workspace objects records, settings, and actions.
+
+### Object Permissions
+
+The **Objects** section controls what this role can do with records across your workspace.
+
+#### Set Default Permissions (All Objects)
+
+First, configure the baseline permissions that apply to **all objects** by default:
+
+| Permission | Description |
+| ---------------------------------- | -------------------------------------- |
+| **See Records on All Objects** | View records in lists and detail pages |
+| **Edit Records on All Objects** | Modify existing records |
+| **Delete Records on All Objects** | Soft-delete records (can be restored) |
+| **Destroy Records on All Objects** | Permanently delete records |
+
+Select or unselect based on what should be the default behavior for this role.
+
+
+ **Example — Intern role**: An intern should be able to see all objects but not edit them by default. Enable "See Records on All Objects" but leave "Edit Records on All Objects" unchecked.
+
+
+#### Add Object-Level Exceptions
+
+After setting defaults, use the **Object-Level** sub-section to add rules that override the defaults for specific objects.
+
+Click **+ Add rule** and select an object to create an exception.
+
+**Example rules for an Intern role:**
+
+| Rule | Effect |
+| ------------------------------------- | ------------------------------------------------------ |
+| Opportunities → disable "See Records" | Intern cannot see the Opportunities object at all |
+| People → enable "Edit Records" | Intern can edit People records (but not other objects) |
+
+### Field Permissions
+
+Within each object-level rule, you can go further and configure **field-level permissions** to control access to specific fields.
+
+| Permission | Description |
+| -------------- | -------------------------- |
+| **See Field** | View the field value |
+| **Edit Field** | Modify the field value |
+| **No Access** | Field is completely hidden |
+
+**Example — Restrict sensitive fields:**
+
+For the Intern role with People edit access, you might want to restrict certain fields:
+
+* People → Email → **See Field** only (cannot edit)
+* People → Address → **No Access** (completely hidden)
+
+This allows the intern to edit most People fields while protecting sensitive information.
+
+### How Permission Inheritance Works
+
+Permissions cascade from general to specific:
+
+1. **All Objects** → sets the baseline for all objects
+2. **Object-Level rules** → override the baseline for specific objects
+3. **Field-Level rules** → override the object setting for specific fields
+
+More specific settings always take precedence.
+
+### Managing Permission Overrides
+
+To override inherited permissions:
+
+1. Click **X** to remove the inherited rule
+2. Select the specific permissions you want
+3. Click the orange **Undo** icon (circular arrow) to revert changes
+
+When done, click **Finish**, then **Save** once redirected to the role page.
+
+### Workspace Settings Permissions
+
+Control access to workspace settings in two ways:
+
+* Toggle **Settings All Access** to grant full access
+* Or enable specific permissions (e.g., API key generation, workspace preferences, role assignment, data model configuration, security settings, and workflow management)
+
+
+ **Current limitation**: Access to workflow management is currently required to manually trigger workflows. This behavior may change in future releases.
+
+
+### Workspace Action Permissions
+
+Control access to general workspace actions:
+
+* Toggle **Application All Access** to grant full permissions
+* Or enable individual actions such as **Send Email**, **Import CSV**, and **Export CSV**
+
+## Assigning Roles to API Keys and AI Agents
+
+Beyond workspace members, roles can also be assigned to **API Keys** and **AI Agents**. This is particularly helpful for teams who want to control exactly "who" can do what in their workspace—including automated processes and integrations.
+
+### Why Assign Roles to API Keys and AI Agents?
+
+* **Security**: Limit what automated processes can access or modify
+* **Compliance**: Ensure integrations only touch the data they need
+* **Control**: Prevent accidental data changes from misconfigured automations
+* **Auditability**: Track which actions were performed by which integration or agent
+
+### Assign a Role to an API Key
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **API Keys**, click **+ Assign to API key**
+5. Select the API key from the list
+6. Confirm the assignment
+
+The API key will now inherit all permissions defined by that role. Any API calls made with this key will be restricted accordingly.
+
+
+ API keys without an assigned role use default permissions. For tighter security, always assign a specific role to production API keys.
+
+
+### Assign a Role to an AI Agent
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **AI Agents**, click **+ Assign to AI agent**
+5. Select the AI agent from the list
+6. Confirm the assignment
+
+The AI agent will only be able to access data and perform actions allowed by its assigned role.
+
+
+ For AI agents running within workflows, this ensures the agent cannot access or modify data outside its intended scope—even if the workflow has broader permissions.
+
diff --git a/packages/twenty-docs/l/fr/user-guide/permissions-access/capabilities/sso-configuration.mdx b/packages/twenty-docs/l/fr/user-guide/permissions-access/capabilities/sso-configuration.mdx
new file mode 100644
index 0000000000..310c161605
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/permissions-access/capabilities/sso-configuration.mdx
@@ -0,0 +1,125 @@
+---
+title: SSO Configuration
+description: Configure Single Sign-On for secure enterprise authentication.
+---
+
+## About SSO
+
+Single Sign-On (SSO) allows your team members to log into Twenty using your organization's identity provider. This provides:
+
+* **Centralized access control**: Manage access from one place
+* **Enhanced security**: Leverage your existing security policies
+* **Better user experience**: One set of credentials for all tools
+
+## Supported Providers
+
+Twenty supports SSO with:
+
+* **SAML 2.0**: Works with most enterprise identity providers
+* **Google Workspace**: For organizations using Google
+* **Microsoft Entra ID**: (formerly Azure AD) For Microsoft environments
+
+## Setting Up SSO
+
+### Prerequisites
+
+* Organization plan (cloud and self-hosted workspaces)
+* Admin access to your identity provider
+* Admin access to Twenty workspace
+
+
+ **For self-hosting users willing to set up SSO**, reach out to contact@twenty.com
+
+
+### Configuration Steps
+
+#### 1. Access SSO Settings
+
+1. Go to **Settings → Security**
+2. Find the **SSO Configuration** section
+3. Click **Configure SSO**
+
+#### 2) Choose Your Provider
+
+Select your identity provider from the list or choose "Custom SAML" for other providers.
+
+#### 3. Configure Your Identity Provider
+
+You'll need to configure your identity provider with:
+
+* **Entity ID**: Provided by Twenty
+* **ACS URL**: The callback URL for authentication
+* **Certificate**: For secure communication
+
+#### 4. Enter Provider Details in Twenty
+
+* **SSO URL**: Login URL from your provider
+* **Entity ID**: Your provider's identifier
+* **Certificate**: X.509 certificate from your provider
+
+#### 5. Test and Enable
+
+1. Click **Test Configuration** to verify setup
+2. Enable SSO when testing is successful
+3. Configure user provisioning preferences
+
+## User Provisioning
+
+### Just-in-Time (JIT) Provisioning
+
+* Users are created automatically on first login
+* Assigned default role automatically
+* No manual user creation needed
+
+### Manual Provisioning
+
+* Invite users before they can log in
+* Pre-assign specific roles
+* More control over who can access
+
+## Managing SSO Users
+
+### Role Assignment
+
+SSO users can be assigned roles like regular users:
+
+1. Go to **Settings → Members**
+2. Find the user
+3. Change their role as needed
+
+### Access Revocation
+
+To remove access for SSO users:
+
+* Remove them from your identity provider, or
+* Remove them from the Twenty workspace
+
+## Best Practices
+
+### Security
+
+* **Require SSO**: Disable password login for SSO users
+* **Regular audits**: Review access periodically
+* **Strong IdP policies**: Enforce MFA at the identity provider
+
+### User Management
+
+* **Clear naming**: Use consistent naming from your directory
+* **Group mapping**: Map IdP groups to Twenty roles (if available)
+* **Offboarding process**: Include Twenty in your deprovisioning workflow
+
+## Troubleshooting
+
+### Common Issues
+
+* **Certificate errors**: Ensure certificate hasn't expired
+* **URL mismatches**: Verify ACS URL matches exactly
+* **User not found**: Check JIT provisioning settings
+
+### Getting Help
+
+If you encounter issues, contact support with:
+
+* Error messages received
+* Identity provider being used
+* Configuration details (without sensitive data)
diff --git a/packages/twenty-docs/l/fr/user-guide/permissions-access/how-tos/permissions-faq.mdx b/packages/twenty-docs/l/fr/user-guide/permissions-access/how-tos/permissions-faq.mdx
new file mode 100644
index 0000000000..6700b48297
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/permissions-access/how-tos/permissions-faq.mdx
@@ -0,0 +1,126 @@
+---
+title: Permissions FAQ
+description: Frequently asked questions about roles and permissions.
+---
+
+## Roles
+
+
+
+ Twenty comes with an **Admin** and **Member** roles by default. You can create additional custom roles based on your team's needs (e.g., Sales Rep, Manager, Read-Only User).
+
+
+
+ No, the Admin role cannot be deleted. There must always be at least one member assigned to the Admin role.
+
+
+
+ Any workspace member assigned to that role will be automatically reassigned to the default role.
+
+
+
+ Go to **Settings → Roles**, find the **Default Role** option, and select which role new members should automatically receive when they join.
+
+
+
+ No, each user can only have one role at a time. Create a custom role if you need a combination of permissions.
+
+
+
+## Permissions
+
+
+
+ * **Object permissions**: Control access to entire records (e.g., can see/edit/delete People records)
+ * **Field permissions**: Control access to specific fields within an object (e.g., can see but not edit the Salary field)
+
+ Field permissions allow more granular control over sensitive data.
+
+
+
+ Permissions cascade from global to specific:
+
+ 1. **All Objects** sets the baseline for all objects
+ 2. **Object-Level Permissions** can override the global setting for specific objects
+ 3. **Field-Level Permissions** can override the object setting for specific fields
+
+ More specific settings always take precedence.
+
+
+
+ For objects:
+
+ * **See Records**: View records in lists and detail pages
+ * **Edit Records**: Modify existing records
+ * **Delete Records**: Soft-delete records (can be restored)
+ * **Destroy Records**: Permanently delete records
+
+ For fields:
+
+ * **See Field**: View the field value
+ * **Edit Field**: Modify the field value
+ * **No Access**: Field is completely hidden
+
+
+
+ Row-level permissions will be available on the **Organization** plan by Q1 2026. This allows you to restrict access to specific records based on criteria (e.g., only see your own opportunities).
+
+
+
+ 1. Go to **Settings → Roles**
+ 2. Select the role
+ 3. Navigate to the object containing the field
+ 4. Set the field permission to **See Field** (without Edit Field)
+
+
+
+## Settings & Actions
+
+
+
+ You can control access to:
+
+ * API key generation
+ * Workspace preferences
+ * Role assignment
+ * Data model configuration
+ * Security settings
+ * Workflow management
+
+ Use **Settings All Access** to grant full access, or enable specific permissions.
+
+
+
+ You can control:
+
+ * **Send Email**: Ability to send emails from Twenty
+ * **Import CSV**: Ability to import data via CSV
+ * **Export CSV**: Ability to export data to CSV
+
+ Use **Application All Access** to grant all actions, or enable specific ones.
+
+
+
+## SSO
+
+
+
+ No, SSO is a Premium feature available on the **Organization** plan only.
+
+
+
+ Twenty supports:
+
+ * **SAML 2.0** (works with most enterprise identity providers)
+ * **Google Workspace**
+ * **Microsoft Entra ID** (formerly Azure AD)
+
+
+
+ With JIT provisioning, user accounts are automatically created in Twenty when someone logs in via SSO for the first time. They're assigned the default role automatically.
+
+
+
+ Yes, once SSO is configured, you can disable password login for SSO users to enforce authentication through your identity provider.
+
+
diff --git a/packages/twenty-docs/l/fr/user-guide/permissions-access/overview.mdx b/packages/twenty-docs/l/fr/user-guide/permissions-access/overview.mdx
index 313b9de765..3ba0139d2b 100644
--- a/packages/twenty-docs/l/fr/user-guide/permissions-access/overview.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/permissions-access/overview.mdx
@@ -1,40 +1,40 @@
---
-title: Autorisations et accès
-description: Gérez les rôles, les autorisations et le contrôle d’accès dans votre espace de travail.
+title: Permissions & Access
+description: Manage roles, permissions, and access control in your workspace.
---
-
+
-Le système d’autorisations de Twenty vous permet de contrôler qui peut accéder aux données de votre espace de travail et les modifier. Créez des rôles, attribuez des autorisations et configurez l’authentification unique (SSO) pour un accès sécurisé.
+Twenty's permission system lets you control who can access and modify data in your workspace. Create roles, assign permissions, and configure SSO for secure access.
-## Contenu de cette section
+## What's in this section
- Créez des rôles et configurez les autorisations sur les objets, les champs et les paramètres.
+ Create roles and configure object, field, and settings permissions.
-
- Configurez l’authentification unique avec votre fournisseur d’identité.
+
+ Set up Single Sign-On with your identity provider.
- Questions fréquentes sur les rôles, les autorisations et l’authentification unique (SSO).
+ Common questions about roles, permissions, and SSO.
-## Fonctionnalités clés
+## Key features
-* **Accès basé sur les rôles** : Créez des rôles personnalisés avec des autorisations spécifiques
-* **Autorisations sur les objets** : Contrôlez qui peut afficher, modifier ou supprimer des enregistrements
-* **Autorisations sur les champs** : Restreignez l’accès aux champs sensibles
-* **Autorisations sur les paramètres** : Contrôlez l’accès à la configuration de l’espace de travail
-* **Intégration SSO** : Configurez l’authentification unique pour la sécurité d’entreprise (plan Organization)
+* **Role-based access**: Create custom roles with specific permissions
+* **Object permissions**: Control who can view, edit, or delete records
+* **Field permissions**: Restrict access to sensitive fields
+* **Settings permissions**: Control access to workspace configuration
+* **SSO integration**: Configure single sign-on for enterprise security (Organization plan)
-## Liens rapides
+## Quick links
-* [Créer un rôle](/l/fr/user-guide/permissions-access/capabilities/permissions#create-a-role)
-* [Configurer le SSO](/l/fr/user-guide/permissions-access/capabilities/sso-configuration)
-* [Gérer les membres de l’équipe](/l/fr/user-guide/settings/capabilities/member-management)
+* [Create a role](/l/fr/user-guide/permissions-access/capabilities/permissions#create-a-role)
+* [Configure SSO](/l/fr/user-guide/permissions-access/capabilities/sso-configuration)
+* [Manage team members](/l/fr/user-guide/settings/capabilities/member-management)
diff --git a/packages/twenty-docs/l/fr/user-guide/settings/capabilities/domains-settings.mdx b/packages/twenty-docs/l/fr/user-guide/settings/capabilities/domains-settings.mdx
new file mode 100644
index 0000000000..b2c49c5ae2
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/settings/capabilities/domains-settings.mdx
@@ -0,0 +1,47 @@
+---
+title: Domain Settings
+description: Configure workspace domain, approved access domains, and public domains.
+---
+
+Configure domain settings under **Settings → Domains**.
+
+## Workspace Domain
+
+Edit your subdomain name or set a custom domain for your workspace.
+
+### Customize Domain
+
+1. Click **Customize Domain**
+2. Edit your subdomain (e.g., `yourcompany.twenty.com`)
+3. Or set up a custom domain (e.g., `crm.yourcompany.com`)
+
+For custom domains, you'll need to configure DNS settings with your domain provider.
+
+## Approved Domains
+
+Anyone with an email address at these domains is allowed to sign up for this workspace automatically.
+
+### Add Approved Access Domain
+
+1. Click **Add Approved Access Domain**
+2. Enter your company domain (e.g., `yourcompany.com`)
+3. Save
+
+Once configured, anyone with an email address at that domain can join your workspace without needing a direct invitation.
+
+
+ This is useful for allowing your entire team to self-register while keeping the workspace restricted to your organization.
+
+
+## Public Domains
+
+Provision a complete and secure hosting environment on these domains.
+
+### Add Public Domain
+
+1. Click **Add Public Domain**
+2. Enter the domain you want to use
+3. Configure DNS settings as instructed
+4. Verify the domain
+
+SSL certificates are automatically provisioned for public domains.
diff --git a/packages/twenty-docs/l/fr/user-guide/settings/capabilities/experience-settings.mdx b/packages/twenty-docs/l/fr/user-guide/settings/capabilities/experience-settings.mdx
index 5a833a4d85..e279f7d88b 100644
--- a/packages/twenty-docs/l/fr/user-guide/settings/capabilities/experience-settings.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/settings/capabilities/experience-settings.mdx
@@ -1,38 +1,38 @@
---
-title: Expérience - Paramètres
-description: Personnalisez votre thème d'interface et vos préférences régionales.
+title: Experience Settings
+description: Customize your interface theme and regional preferences.
---
-Personnalisez votre expérience Twenty dans **Paramètres → Expérience**.
+Personalize your Twenty experience under **Settings → Experience**.
-## Apparence
+## Appearance
-Choisissez votre thème visuel :
+Choose your visual theme:
-* **Clair** : Interface épurée et lumineuse
-* **Sombre** : Plus reposant pour les yeux dans des conditions de faible luminosité
-* **Paramètres système** : S'adapte automatiquement au thème de votre appareil
+* **Light**: Clean, bright interface
+* **Dark**: Easier on the eyes in low-light conditions
+* **System settings**: Automatically matches your device's theme
-## Langue
+## Language
-Sélectionnez votre langue préférée pour l'interface Twenty dans le menu déroulant.
+Select your preferred language for the Twenty interface from the dropdown menu.
## Formats
-Configurer la date, l'heure, le nombre, le fuseau horaire et le jour de début du calendrier.
+Configure date, time, number, timezone, and calendar start day.
-| Paramètre | Description |
-| ------------------------------- | --------------------------------------------------------------------------- |
-| **Fuseau horaire** | Votre fuseau horaire local pour une planification et des horodatages précis |
-| **Format de date** | Format d'affichage des dates (p. ex. : 12 déc. 2025) |
-| **Format de l'heure** | Format 12 heures (7:22 PM) ou 24 heures |
-| **Format de nombre** | Séparateurs pour les décimales et les milliers (p. ex. : 1 234,56) |
-| **Jour de début du calendrier** | Premier jour de la semaine (dimanche ou lundi) |
+| Setting | Description |
+| ---------------------- | ---------------------------------------------------------- |
+| **Time zone** | Your local timezone for accurate timestamps and scheduling |
+| **Date format** | How dates appear (e.g., Dec 12, 2025) |
+| **Time format** | 12-hour (7:22 PM) or 24-hour format |
+| **Number format** | Decimal and thousands separators (e.g., 1,234.56) |
+| **Calendar start day** | First day of the week (Sunday or Monday) |
-Chaque paramètre peut être défini sur **Paramètres système** pour s'adapter automatiquement aux préférences de votre appareil, ou vous pouvez choisir un format spécifique.
+Each setting can be set to **System settings** to automatically match your device preferences, or you can choose a specific format.
-## Comment mettre à jour
+## How to Update
-1. Allez dans **Paramètres → Expérience**
-2. Ajustez vos préférences dans chaque section
-3. Les modifications sont enregistrées automatiquement
+1. Go to **Settings → Experience**
+2. Adjust your preferences in each section
+3. Changes save automatically
diff --git a/packages/twenty-docs/l/fr/user-guide/settings/capabilities/member-management.mdx b/packages/twenty-docs/l/fr/user-guide/settings/capabilities/member-management.mdx
new file mode 100644
index 0000000000..cc31f18850
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/settings/capabilities/member-management.mdx
@@ -0,0 +1,87 @@
+---
+title: Member Management
+description: Invite team members and manage workspace access.
+---
+
+Manage who has access to your workspace under **Settings → Members**.
+
+## Invite New Members
+
+### Using Email Invitation
+
+1. Go to **Settings → Members**
+2. Click **+ Invite**
+3. Enter the person's email address
+4. Select a role for the new member
+5. Click **Send invite**
+
+The invited person will receive an email with a link to join your workspace.
+
+### Using Invite Link
+
+1. Go to **Settings → Members**
+2. Copy the workspace invite link
+3. Share the link with new team members
+4. They'll receive access once they sign up
+
+## View and Manage Members
+
+### View All Members
+
+Go to **Settings → Members** to see:
+
+* All active members
+* Pending invitations
+
+### Edit a Member's Profile
+
+Click on a member to open their profile page. As an admin, you can:
+
+* Edit their **name**
+* Update their **profile picture**
+* **Impersonate** their account (useful for troubleshooting)
+* **Delete** their account
+
+### Change a Member's Role
+
+On the member's profile page:
+
+1. Open the **Permissions** tab
+2. View the currently assigned role
+3. Select a different role from the dropdown
+4. The change takes effect immediately
+
+→ [Learn more about roles and permissions](/l/fr/user-guide/permissions-access/capabilities/permissions)
+
+### Remove a Member
+
+1. Click on the member to open their profile
+2. Click **Delete** to remove them from the workspace
+
+
+ Removed members lose access immediately. Their data (records, notes, tasks) remains in the workspace.
+
+
+
+ **Email sync is also removed.** If the deleted user was the only one who synced certain emails, those emails will be permanently removed from the workspace.
+
+
+## Pending Invitations
+
+Manage invitations that haven't been accepted:
+
+* **Resend**: Send the invitation email again
+* **Cancel**: Revoke the invitation before it's accepted
+
+## Approved Access Domains
+
+Allow team members to join automatically based on their email domain:
+
+1. Go to **Settings → Domains**
+2. Add your company domain (e.g., `yourcompany.com`)
+3. Anyone with that email domain can join without an invitation
+
+## Related
+
+* [Permissions](/l/fr/user-guide/permissions-access/capabilities/permissions) — configure what each role can do
+* [Domains Settings](/l/fr/user-guide/settings/capabilities/domains-settings) — configure approved domains
diff --git a/packages/twenty-docs/l/fr/user-guide/settings/capabilities/profile-settings.mdx b/packages/twenty-docs/l/fr/user-guide/settings/capabilities/profile-settings.mdx
index 6f26f46269..febfa4a86f 100644
--- a/packages/twenty-docs/l/fr/user-guide/settings/capabilities/profile-settings.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/settings/capabilities/profile-settings.mdx
@@ -1,43 +1,43 @@
---
-title: Paramètres du profil
-description: Gérez votre profil personnel et vos paramètres de sécurité.
+title: Profile Settings
+description: Manage your personal profile and security settings.
---
-## Informations personnelles
+## Personal Information
-### Nom et e-mail
+### Name and Email
-* **Nom affiché**: Modifiez comment votre nom apparaît aux autres membres de l’espace de travail
-* **Adresse e-mail**: Changez votre e-mail de connexion (nécessite vérification)
-* **Photo de profil**: Téléchargez un avatar personnalisé ou utilisez vos initiales
+* **Display Name**: Update how your name appears to other workspace members
+* **Email Address**: Change your login email (requires verification)
+* **Profile Picture**: Upload a custom avatar or use your initials
-## Paramètres de sécurité
+## Security Settings
-### Authentification à deux facteurs (2FA)
+### Two-Factor Authentication (2FA)
-Activez le 2FA pour ajouter une couche supplémentaire de sécurité à votre compte :
+Enable 2FA to add an extra layer of security to your account:
-1. Accédez à **Paramètres → Paramètres du profil**
-2. Cliquez sur **Activer le 2FA**
-3. Scannez le code QR avec votre application d'authentification
-4. Entrez le code de vérification pour confirmer
+1. Go to **Settings → Profile Settings**
+2. Click **Enable 2FA**
+3. Scan the QR code with your authenticator app
+4. Enter the verification code to confirm
-### Gestion des mots de passe
+### Password Management
-* **Modifier le mot de passe**: Mettez à jour votre mot de passe actuel
-* **Exigences du mot de passe**: Doit contenir au moins 8 caractères
+* **Change Password**: Update your current password
+* **Password Requirements**: Must be at least 8 characters long
-## Gestion du profil
+## Profile Management
-### Supprimer le compte
+### Delete Account
- La suppression de votre compte supprimera définitivement votre accès à tous les espaces de travail. Cette action ne peut être annulée, vous perdrez l'accès à tous les espaces de travail où vous êtes membre, et vous devriez envisager de quitter des espaces de travail individuels si vous souhaitez uniquement quitter certaines équipes.
+ Deleting your account will permanently remove your access to all workspaces. This action cannot be undone, you'll lose access to all workspaces where you're a member, and you should consider leaving individual workspaces instead if you only want to exit specific teams.
-Pour supprimer votre compte :
+To delete your account:
-1. Accédez à **Paramètres → Paramètres du profil**
-2. Faites défiler jusqu'à **Zone de danger**
-3. Cliquez sur **Supprimer le compte**
-4. Confirmez en tapant votre adresse e-mail
+1. Go to **Settings → Profile Settings**
+2. Scroll to **Danger Zone**
+3. Click **Delete Account**
+4. Confirm by typing your email address
diff --git a/packages/twenty-docs/l/fr/user-guide/settings/capabilities/releases-settings.mdx b/packages/twenty-docs/l/fr/user-guide/settings/capabilities/releases-settings.mdx
new file mode 100644
index 0000000000..4180b67161
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/settings/capabilities/releases-settings.mdx
@@ -0,0 +1,31 @@
+---
+title: Releases Settings
+description: Enable experimental features in Twenty.
+---
+
+## About Releases Settings
+
+The Releases section allows you to enable experimental features before they're generally available.
+
+## Lab Features
+
+Lab features are experimental capabilities that are still being developed. They may change or be removed without notice.
+
+### How to Enable Lab Features
+
+1. Go to **Settings → Releases**
+2. Find the feature you want to enable
+3. Toggle it on
+4. The feature will be available immediately
+
+
+ Lab features are experimental and may not work as expected. Use them with caution in production environments.
+
+
+## Feature Feedback
+
+Your feedback helps improve Twenty:
+
+* Report issues with experimental features
+* Share how you're using new features
+* Suggest improvements via the community Discord
diff --git a/packages/twenty-docs/l/fr/user-guide/settings/capabilities/workspace-settings.mdx b/packages/twenty-docs/l/fr/user-guide/settings/capabilities/workspace-settings.mdx
new file mode 100644
index 0000000000..f72f71a814
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/settings/capabilities/workspace-settings.mdx
@@ -0,0 +1,30 @@
+---
+title: Workspace Settings
+description: Customize your workspace name and branding.
+---
+
+Those are accessible under **Settings → General**.
+
+## Workspace Picture
+
+* **Upload Logo**: Add a custom workspace logo
+* **Supported formats**: PNG, JPEG, and GIF files under 10MB
+* **Remove**: Delete the current workspace logo
+
+## Workspace Name
+
+* **Name**: Change your workspace display name
+* This name appears to all workspace members
+
+## Danger Zone
+
+
+ Deleting your workspace permanently removes all data and cannot be undone. All workspace data will be lost forever, all members will lose access immediately, and this action cannot be reversed.
+
+
+To delete your workspace:
+
+1. Click **Delete workspace** button
+2. Confirm the deletion when prompted
+
+**Note**: Only workspace administrators can delete workspaces.
diff --git a/packages/twenty-docs/l/fr/user-guide/settings/how-tos/settings-faq.mdx b/packages/twenty-docs/l/fr/user-guide/settings/how-tos/settings-faq.mdx
new file mode 100644
index 0000000000..19aa50e5a0
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/settings/how-tos/settings-faq.mdx
@@ -0,0 +1,171 @@
+---
+title: Settings FAQ
+description: Frequently asked questions about Twenty settings.
+image: /images/user-guide/setup/settings.png
+---
+
+## Workspace Settings
+
+
+
+ 1. Go to **Settings → General**
+ 2. Find the Workspace Name field
+ 3. Enter your new name
+ 4. Changes save automatically
+
+
+
+ 1. Go to **Settings → General**
+ 2. Click on the current logo or upload area
+ 3. Select an image file (PNG, JPEG, or GIF under 10MB)
+ 4. The logo updates immediately
+
+
+
+ Yes, you can create and be a member of multiple workspaces. Each workspace has its own data, settings, and subscription.
+
+
+
+ 1. Go to **Settings → General**
+ 2. Scroll to Danger Zone
+ 3. Click **Delete workspace**
+ 4. Confirm the deletion
+
+ Note: This permanently deletes all data and cannot be undone.
+
+
+
+ Delete the workspaces you no longer need under **Settings → General → Delete workspace**.
+
+
+ Do not delete your **account** (accessible under Settings → Profile): your account is shared among all your workspaces. Deleting your account removes access to ALL workspaces.
+
+
+
+
+ If you want to temporarily disable your workspace (not permanently delete it), go to **Settings → Billing** and click **Cancel Plan**. Your data will be preserved for a grace period.
+
+
+
+## Profile Settings
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Find the Password section
+ 3. Enter your current password
+ 4. Enter your new password
+ 5. Save changes
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Find the 2FA section
+ 3. Click **Enable 2FA**
+ 4. Scan the QR code with your authenticator app
+ 5. Enter the verification code
+
+
+
+ To change your email address, please reach out to [contact@twenty.com](mailto:contact@twenty.com).
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Scroll to Danger Zone
+ 3. Click **Delete Account**
+ 4. Confirm by typing your email
+
+ Note: This removes your access to all workspaces and deletes all emails synced from your connected accounts.
+
+
+
+## Experience Settings
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find the Theme section
+ 3. Select Light, Dark, or System
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Date Format
+ 3. Select your preferred format
+ 4. Changes apply immediately
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Time Zone
+ 3. Select your local time zone
+ 4. All timestamps will adjust
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Language
+ 3. Select from available languages
+ 4. The interface updates to your selection
+
+
+
+## Account Settings
+
+
+
+ 1. Go to **Settings → Accounts**
+ 2. Click **Add account**
+ 3. Choose Google or Microsoft
+ 4. Authorize access
+ 5. Configure sync settings
+
+
+
+ Yes, you can connect multiple email accounts. Go to **Settings → Accounts** and add additional accounts as needed.
+
+
+
+ 1. Go to **Settings → Accounts**
+ 2. Find the account to remove
+ 3. Click **Disconnect**
+ 4. Confirm the action
+
+
+
+## Domains
+
+
+
+ Yes! Go to **Settings → Domains** and click **Customize Domain**. You have two options:
+
+ * **Subdomain**: Use a Twenty subdomain like `yourcompany.twenty.com`
+ * **Custom domain**: Use your own domain like `crm.yourcompany.com` (requires DNS configuration)
+
+ A subdomain is quick to set up, while a custom domain provides a fully branded experience for your team.
+
+
+
+ You can configure approved access domains so team members with company email addresses can automatically join your workspace. Go to **Settings → Domains** and add your company domain (e.g., `yourcompany.com`).
+
+
+
+## Lab Features
+
+
+
+ Lab features are experimental capabilities being tested before general release. They may change or be removed without notice.
+
+
+
+ Lab features are functional but may have bugs or unexpected behavior. Use them cautiously in production environments.
+
+
+
+ 1. Go to **Settings → Releases → Lab**
+ 2. Find the feature you want
+ 3. Toggle it on
+ 4. The feature becomes available immediately
+
+
diff --git a/packages/twenty-docs/l/fr/user-guide/settings/overview.mdx b/packages/twenty-docs/l/fr/user-guide/settings/overview.mdx
new file mode 100644
index 0000000000..c642a9535a
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/settings/overview.mdx
@@ -0,0 +1,67 @@
+---
+title: Settings
+description: Set up your Twenty workspace with essential configurations.
+image: /images/user-guide/setup/settings.png
+---
+
+
+
+
+
+## Initial Setup
+
+When you first create your workspace, there are several key settings to configure.
+
+### Workspace Name and Logo
+
+1. Go to **Settings → General**
+2. Update your workspace name
+3. Upload your company logo
+4. Save your changes
+
+### Time Zone and Date Format
+
+1. Go to **Settings → Experience**
+2. Select your time zone
+3. Choose your preferred date format
+4. Save your changes
+
+## Essential Configurations
+
+### Connect Email and Calendar
+
+Set up email and calendar sync:
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Connect your Google or Microsoft account
+4. Configure sync settings
+
+→ [Complete email & calendar setup guide](/l/fr/user-guide/calendar-emails/overview)
+
+### Invite Your Team
+
+Add team members to your workspace:
+
+1. Go to **Settings → Members**
+2. Click **+ Invite**
+3. Enter email addresses
+4. Assign appropriate roles
+
+
+ Before inviting your team, check the default role under **Settings → Roles**. New members are automatically assigned this role when they join.
+
+
+## Workspace Settings Checklist
+
+* Workspace name and logo configured
+* Time zone and date format set
+* Email and calendar connected
+* Team members invited
+* Roles and permissions configured
+
+## Next Steps
+
+* [Workspace settings](/l/fr/user-guide/settings/capabilities/workspace-settings)
+* [Profile settings](/l/fr/user-guide/settings/capabilities/profile-settings)
+* [Experience settings](/l/fr/user-guide/settings/capabilities/experience-settings)
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/calendar-view.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/calendar-view.mdx
new file mode 100644
index 0000000000..9b8889147f
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/calendar-view.mdx
@@ -0,0 +1,46 @@
+---
+title: Calendar View
+description: Display records with date fields on a calendar.
+---
+
+## About Calendar View
+
+Calendar view displays your records on a calendar based on a date field. Each record appears as an event on the corresponding date.
+
+
+
+## Creating a Calendar View
+
+1. Navigate to an object with date fields
+2. Click the view dropdown → **+ Add view**
+3. Name your view and click **Create**
+4. Open the **Options** on the right
+5. Select **Calendar** as the layout
+6. Choose the **date field** to use for positioning records
+7. Click **Update view**
+
+## Configuring the Calendar
+
+### Choose the Date Field
+
+Under **Options**, select which date field determines where records appear on the calendar.
+
+### Display Fields
+
+Configure which fields show on each calendar event:
+
+1. Click **Options → Fields**
+2. Toggle fields on/off
+3. Drag to reorder
+
+## Use Cases
+
+* **Meetings and calls**: View upcoming appointments
+* **Deadlines**: Track due dates and close dates
+* **Events**: Plan and visualize scheduled activities
+* **Follow-ups**: See when tasks are due
+
+## Related
+
+* [Views Overview](/l/fr/user-guide/views-pipelines/overview) — creating and managing views
+* [Filters and Sorting](/l/fr/user-guide/views-pipelines/capabilities/filters-and-sorting) — filtering calendar data
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/fields-and-columns.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/fields-and-columns.mdx
new file mode 100644
index 0000000000..8b7f176e67
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/fields-and-columns.mdx
@@ -0,0 +1,52 @@
+---
+title: Fields & Columns
+description: Choose which fields to display and how to organize them.
+---
+
+## Selecting Fields to Display
+
+Each view can show a different set of fields. Customize what's visible to focus on the information that matters.
+
+### Show or Hide Fields
+
+1. Click **Options** in the top right
+2. Click **Fields**
+3. Click the **eye icon** next to each field to show/hide it
+
+### Reorder Fields
+
+Change the order fields appear in your view:
+
+1. Click **Options → Fields**
+2. Drag fields up or down
+3. Changes save automatically
+
+## Field Display by View Type
+
+### Table Views
+
+* Fields appear as columns
+* Resize columns by dragging borders
+
+### Kanban Views
+
+* Fields appear on cards
+* Reorder via Options → Fields
+* Use Compact view to hide all fields
+
+### Calendar Views
+
+* Selected fields show on calendar events
+* Configure via Options → Fields
+
+## Best Practices
+
+* **Show only what's needed** — too many fields clutters the view
+* **Put important fields first** — most-used columns on the left
+* **Create multiple views** — different field sets for different purposes
+* **Use field visibility per view** — same object, different focus
+
+## Related
+
+* [Table Views](/l/fr/user-guide/views-pipelines/capabilities/table-views) — list view features
+* [Kanban Views](/l/fr/user-guide/views-pipelines/capabilities/kanban-views) — card-based views
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx
new file mode 100644
index 0000000000..6944850210
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx
@@ -0,0 +1,78 @@
+---
+title: Filters & Sorting
+description: Filter and sort records to find exactly what you need.
+---
+
+## Filtering Data
+
+Filters help you focus on specific records by showing only those that match your criteria.
+
+### Adding a Filter
+
+1. Click the **Filter** button in the toolbar
+2. Select the field to filter by
+3. Choose the operator (equals, contains, etc.)
+4. Enter the filter value
+5. Click **Apply**
+
+### Filter Operators
+
+| Field Type | Available Operators |
+| ---------- | -------------------------------------------------- |
+| Text | Equals, Contains, Starts with, Ends with, Is empty |
+| Number | Equals, Greater than, Less than, Between, Is empty |
+| Date | Equals, Before, After, Between, Is empty |
+| Select | Equals, Is any of, Is empty |
+| Checkbox | Is true, Is false |
+| Relation | Equals, Is empty |
+
+### Multiple Filters
+
+Combine multiple filters to narrow down results:
+
+* All filters are applied with AND logic
+* Each additional filter further restricts results
+
+### Removing Filters
+
+* Click the **X** on individual filter chips
+* Click **Clear all** to remove all filters
+
+## Sorting Data
+
+Sorting determines the order records appear.
+
+### Adding a Sort
+
+1. Click the **Sort** button in the toolbar
+2. Select the field to sort by
+3. Choose ascending (A-Z, 0-9) or descending (Z-A, 9-0)
+4. Click **Apply**
+
+### Multiple Sorts
+
+Add multiple sort levels:
+
+* First sort is primary
+* Subsequent sorts apply within groups of equal values
+
+### Quick Column Sorting
+
+Click any column header to sort:
+
+* First click: Ascending
+* Second click: Descending
+* Third click: Remove sort
+
+## Saving Filter and Sort Settings
+
+Filters and sorts are saved with the view:
+
+1. Configure your filters and sorts
+2. Click **Save** to update the current view
+3. Or click **Save as new view** to create a variant
+
+## Related
+
+* [Table Views](/l/fr/user-guide/views-pipelines/capabilities/table-views) — group by feature
+* [Views Overview](/l/fr/user-guide/views-pipelines/overview) — building and managing views
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/kanban-views.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/kanban-views.mdx
new file mode 100644
index 0000000000..fa616d2f3d
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/kanban-views.mdx
@@ -0,0 +1,99 @@
+---
+title: Kanban Board Views
+description: Learn how to use Kanban views to visualize and manage your workflows.
+image: /images/user-guide/kanban-views/kanban.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## About Kanban Views
+
+Kanban views visually map out process flows, where each column stands for a distinct stage and each card represents a record.
+
+## Move Cards between Stages
+
+You can move each card between stages as it goes through your workflow by dragging and dropping. To proceed, hold your click on a card and move it to the next stage.
+
+
+
+## Add and Delete Stages
+
+You can tailor your workflow to suit your needs using stages, which represent a value in a Select Field:
+
+### Add Stages
+
+To add a stage, access the Select field settings by navigating to Settings > Data Model, selecting your object, and then the field your Kanban board depends on.
+
+
+
+### Remove Stages
+
+To remove a stage, hover the stage name or the `⋮` icon, click `Edit from settings` in the Select field settings, and then click **Delete** next to the relevant stage.
+
+## Display Fields
+
+You can configure your Kanban board to display some fields and hide others. To hide a field, click on **Options** on the top right, then on **Fields** to bring up the list of options. Look for the field needed in the Hidden Fields section and click on the eye button to display the field.
+
+You can also rearrange the order of fields by holding down the field name and dragging it to where you want it.
+
+
+
+## Compact View
+
+You can hide all the fields and get an overview of all records at a glance. To enable:
+
+1. Click **Options** on the top right
+2. Turn on the toggle for **Compact view**
+
+
+
+## Column Aggregations
+
+Each column in a Kanban view can display aggregated values at the top, helping you understand your data at a glance.
+
+### Available Aggregations
+
+| Aggregation | Description |
+| ----------- | --------------------------------------------- |
+| **Count** | Number of records in the column |
+| **Sum** | Total of a numeric field (e.g., deal amounts) |
+| **Average** | Average value of a numeric field |
+| **Min** | Lowest value |
+| **Max** | Highest value |
+
+### Configuring Aggregations
+
+1. Click on the number displayed next to the Stage value, at the top of a column
+2. Select the aggregation type
+3. Choose the field to aggregate
+
+**Example:** Show total deal value per stage by aggregating the Amount field with Sum.
+
+## When to Use Kanban Views
+
+Kanban views are ideal for:
+
+* **Sales pipelines**: Track deals through stages from lead to close
+* **Project management**: Monitor tasks through workflow states
+* **Recruitment**: Track candidates through hiring stages
+* **Any staged process**: Visualize any workflow with defined stages
+
+## Best Practices
+
+### Organize Your Stages
+
+* **Limit stages**: 5-7 stages is ideal for visibility
+* **Clear naming**: Use descriptive stage names
+* **Logical order**: Arrange stages in process order
+
+### Optimize Card Display
+
+* **Show key fields**: Display only the most important information
+* **Use compact view**: For high-level overviews
+* **Color coding**: Use stage colors to quickly identify status
+
+### Maintain Data Quality
+
+* **Update regularly**: Keep cards moving through stages
+* **Archive completed**: Move closed items out of active view
+* **Review stale cards**: Follow up on cards stuck in stages
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/table-views.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/table-views.mdx
new file mode 100644
index 0000000000..f5a5239336
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/table-views.mdx
@@ -0,0 +1,64 @@
+---
+title: Table Views
+description: Display your data in a spreadsheet-like list format.
+---
+
+## About Table Views
+
+Table views display records in rows with customizable columns—like a spreadsheet. This is the default view type for most objects.
+
+
+
+## Features
+
+### Column Configuration
+
+* Show or hide columns (fields)
+* Resize column widths
+* Reorder columns by dragging
+
+### Group By a Select Field
+
+Organize records into collapsible groups based on a field of select type.
+
+
+
+1. Click **Options**
+2. Select **Group**
+3. Choose a Select field
+4. Configure group order under **Options → Group → Sort**:
+ * **Alphabetical** or **Reverse alphabetical**
+ * **Manual order**: Drag groups under "Visible groups" to reorder
+ * Click the **eye icon** next to a group to hide it
+
+**Use cases:**
+
+* Group Company by Type
+* Group Opportunities by Stage
+* Group Tasks by Status
+
+
+ **For best performance, limit to 10-15 visible groups per view.** If you need more groups, consider using a Dashboard instead.
+
+
+### Column Widths
+
+Resize columns to show more or less content:
+
+1. Hover between two column headers
+2. Click and drag the column border
+3. Release to set the new width
+
+## When to Use Table Views
+
+Table views work best for:
+
+* **Browsing large datasets** — scan many records quickly
+* **Data entry** — edit multiple records efficiently
+* **Detailed analysis** — see many fields at once
+* **Sorting and filtering** — find specific records
+
+## Related
+
+* [Fields and Columns](/l/fr/user-guide/views-pipelines/capabilities/fields-and-columns) — configuring which fields to display
+* [Filters and Sorting](/l/fr/user-guide/views-pipelines/capabilities/filters-and-sorting) — narrowing down records
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/view-settings.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/view-settings.mdx
new file mode 100644
index 0000000000..2ce0d1d0ef
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/capabilities/view-settings.mdx
@@ -0,0 +1,74 @@
+---
+title: View Settings
+description: Manage view visibility, naming, icons, and organization.
+---
+
+## View Visibility
+
+Control who can see your custom views.
+
+### Visibility Options
+
+| Setting | Who Can See |
+| ------------- | --------------------- |
+| **Workspace** | All workspace members |
+| **Unlisted** | Only you |
+
+### Changing Visibility
+
+1. Open the view
+2. Click **Options → Visibility**
+3. Select **Workspace** or **Unlisted**
+
+
+ The default "All [Object Name]" views cannot have their visibility changed.
+
+
+## Rename a View
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Edit**
+4. Enter the new name
+
+## Change View Icon
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Edit**
+4. Click the icon to change it
+
+## Reorder Views
+
+Change the order views appear in the dropdown:
+
+1. Open the view dropdown
+2. Drag views by their handle
+3. Drop in the desired position
+4. Order saves automatically
+
+## Favorites
+
+Pin frequently used views for quick access:
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to a view
+3. Select **Add to favorites**
+
+Favorited views appear in a dedicated section for easy access.
+
+## Delete a View
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Delete**
+4. Confirm deletion
+
+
+ Deleted views cannot be recovered.
+
+
+## Related
+
+* [Views Overview](/l/fr/user-guide/views-pipelines/overview) — creating views
+* [How to Restrict Access](/l/fr/user-guide/views-pipelines/how-tos/restrict-access-to-your-view) — step-by-step guide
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
new file mode 100644
index 0000000000..09e5c8c148
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
@@ -0,0 +1,61 @@
+---
+title: Create a Calendar View for Tasks Due
+description: Visualize your tasks and deadlines on a calendar.
+---
+
+
+
+## Prerequisites
+
+Your Tasks object needs a **Due Date** field (Date or Date & Time type).
+
+## Steps
+
+1. Navigate to **Tasks**
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Tasks Calendar")
+4. Click **Create**
+5. Click **Options** and select **Calendar** as the layout
+6. Choose **Due Date** as the date field
+7. Click **Save**
+
+## Configure Your Calendar
+
+### Display Fields on Events
+
+1. Click **Options → Fields**
+2. Click the **eye icon** to show/hide fields
+3. Drag to reorder
+
+Recommended fields to display:
+
+* **Title** — task name
+* **Assignee** — who's responsible
+* **Status** — current progress
+
+### Filter Your Calendar
+
+Create focused views:
+
+* **My Tasks**: Filter by Assignee = Me
+* **This Week**: Filter by Due Date = This week
+* **Overdue**: Filter by Due Date < Today, Status ≠ Done
+
+## Other Calendar Use Cases
+
+| Object | Date Field | Purpose |
+| ------------- | ---------- | ------------------------- |
+| Opportunities | Close Date | Track expected closes |
+| Custom Events | Event Date | Plan activities |
+| Projects | Deadline | Monitor project timelines |
+
+## Tips
+
+* **Review weekly**: Start each week by checking your calendar view
+* **Combine with table view**: Use calendar for overview, table for details
+* **Set visibility**: Keep personal task calendars as Unlisted
+
+## Related
+
+* [Calendar View](/l/fr/user-guide/views-pipelines/capabilities/calendar-view) — all calendar features
+* [Filters and Sorting](/l/fr/user-guide/views-pipelines/capabilities/filters-and-sorting) — filter your calendar
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
new file mode 100644
index 0000000000..9823d83b76
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
@@ -0,0 +1,80 @@
+---
+title: Create a Kanban View for Projects
+description: Track projects through stages using a visual board.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Use a Kanban view to visualize your projects (or any object with stages) as cards moving through columns.
+
+
+
+## Prerequisites
+
+Your object needs a **Select field** to use as columns (e.g., Status, Stage, Phase).
+
+If you don't have one:
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Add a Select field with your stage options
+
+## Steps
+
+1. Navigate to your object (e.g., Projects, Tasks)
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Project Board")
+4. Click **Create**
+5. Click **Options** and select **Kanban** as the layout
+6. The view uses your Select field for columns automatically
+7. Click **Save**
+
+## Configure Your Board
+
+### Show Key Fields on Cards
+
+1. Click **Options → Fields**
+2. Find fields in the "Hidden Fields" section
+3. Click the **eye icon** to display them on cards
+4. Drag to reorder
+
+
+
+### Enable Compact View
+
+For a high-level overview:
+
+1. Click **Options**
+2. Turn on **Compact view**
+
+Cards show only the record name.
+
+
+
+### Add Aggregations
+
+Show counts or totals at the top of each column:
+
+1. Click the number next to a column name
+2. Select an aggregation (Count, Sum, etc.)
+3. Choose a field if needed
+
+## Moving Cards
+
+Drag and drop cards between columns to update their status.
+
+
+
+## Example: Task Board
+
+| Column (Status) | Cards |
+| --------------- | ----------------- |
+| **To Do** | New tasks |
+| **In Progress** | Active work |
+| **Review** | Awaiting approval |
+| **Done** | Completed |
+
+## Related
+
+* [Kanban Views](/l/fr/user-guide/views-pipelines/capabilities/kanban-views) — aggregations, compact view, stages
+* [How to Set Up a Sales Pipeline](/l/fr/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline) — Kanban for Opportunities
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx
new file mode 100644
index 0000000000..4f4ddc782e
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx
@@ -0,0 +1,51 @@
+---
+title: Create a Table View with Grouping
+description: Organize your records into collapsible groups by field value.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Group your table view by a Select field to organize records into collapsible sections.
+
+
+
+## Steps
+
+1. Navigate to the object (People, Companies, etc.)
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Companies by Type")
+4. Click **Create**
+5. Click **Options → Group**
+6. Choose a Select field to group by
+7. Click **Save**
+
+## Configure Group Order
+
+Under **Options → Group → Sort**, choose how groups are ordered:
+
+| Option | Description |
+| ------------------------ | --------------------------------------------- |
+| **Alphabetical** | A to Z |
+| **Reverse alphabetical** | Z to A |
+| **Manual order** | Drag groups to reorder under "Visible groups" |
+
+Click the **eye icon** next to a group to hide it from the view.
+
+
+ **For best performance, limit to 10-15 visible groups.** If you need more, consider using a Dashboard instead.
+
+
+## Example: Companies by Industry
+
+1. Go to **Companies**
+2. Create a new view named "By Industry"
+3. Click **Options → Group**
+4. Select the **Industry** field
+5. Save
+
+Now your companies are organized by industry, making it easy to focus on one segment at a time.
+
+## Related
+
+* [Table Views](/l/fr/user-guide/views-pipelines/capabilities/table-views) — all table view features
+* [Filters and Sorting](/l/fr/user-guide/views-pipelines/capabilities/filters-and-sorting) — combine grouping with filters
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
index f19d50894f..0dbdee2774 100644
--- a/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
@@ -1,32 +1,32 @@
---
-title: Restreindre l’accès à votre vue},{
-description: Contrôlez qui peut voir vos vues personnalisées.
+title: Restrict Access to Your View
+description: Control who can see your custom views.
---
-Chaque vue (sauf les vues par défaut "All [Object Name]") possède son propre paramètre de visibilité.
+Each view (except the default "All [Object Name]" views) has its own visibility setting.
-## Étapes
+## Steps
-1. Ouvrez la vue que vous souhaitez restreindre
-2. Cliquez sur **Options** en haut à droite
-3. Cliquez sur **Visibilité**
-4. Sélectionnez **Non répertorié**
+1. Open the view you want to restrict
+2. Click **Options** in the top right
+3. Click **Visibility**
+4. Select **Unlisted**
-Votre vue est désormais visible uniquement par vous.
+Your view is now visible only to you.
-## Options de visibilité
+## Visibility Options
-| Paramètre | Qui peut voir |
-| --------------------- | --------------------------------------- |
-| **Espace de travail** | Tous les membres de l’espace de travail |
-| **Non répertorié** | Vous uniquement |
+| Setting | Who Can See |
+| ------------- | --------------------- |
+| **Workspace** | All workspace members |
+| **Unlisted** | Only you |
## Notes
-* Les vues par défaut "All [Object Name]" ne peuvent pas être rendues non répertoriées
-* Les vues non répertoriées n’apparaissent pas dans les menus déroulants de vues des autres utilisateurs
-* Vous pouvez à tout moment rétablir la visibilité sur l’espace de travail
+* The default "All [Object Name]" views cannot be made unlisted
+* Unlisted views don't appear in other users' view dropdowns
+* You can change visibility back to Workspace at any time
-## Articles connexes
+## Related
-* [Paramètres des vues](/l/fr/user-guide/views-pipelines/capabilities/view-settings) — toutes les options de configuration des vues
+* [View Settings](/l/fr/user-guide/views-pipelines/capabilities/view-settings) — all view configuration options
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx
new file mode 100644
index 0000000000..3751fb7f83
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx
@@ -0,0 +1,120 @@
+---
+title: Set Up a Sales Pipeline
+description: Configure your sales pipeline to track opportunities through stages.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+A sales pipeline in Twenty is a Kanban view of your Opportunities object, where each column represents a stage in your sales process.
+
+## Step 1: Configure Your Stages
+
+Stages are defined in the Opportunities object's **Stage** field.
+
+1. Go to **Settings → Data Model**
+2. Select **Opportunities**
+3. Find and click the **Stage** field
+4. Add, remove, or rename stages to match your process
+
+
+
+### Recommended Stages
+
+| Stage | Purpose |
+| --------------- | ----------------------------------- |
+| **New** | Fresh opportunities just identified |
+| **Qualified** | Confirmed as a good fit |
+| **Meeting** | Engaged in discussions |
+| **Proposal** | Proposal sent |
+| **Negotiation** | Working on terms |
+| **Closed Won** | Deal successful |
+| **Closed Lost** | Deal unsuccessful |
+
+
+ **5-7 stages is optimal.** Too many stages makes the pipeline hard to scan; too few loses visibility into deal progress.
+
+
+## Step 2: Create a Pipeline View
+
+1. Go to **Opportunities**
+2. Click the view dropdown → **+ Add view**
+3. Name it "Sales Pipeline"
+4. Click **Create**
+5. Open **Options** and select **Kanban** as the layout
+
+The view automatically uses the Stage field for columns.
+
+## Step 3: Configure Your View
+
+### Show Key Fields
+
+1. Click **Options → Fields**
+2. Look for fields in the "Hidden Fields" section
+3. Click the **eye icon** to display: Company, Amount, Close Date, Owner
+
+### Enable Aggregations
+
+Show totals at the top of each column:
+
+1. Click the number displayed next to a Stage name at the top of a column
+2. Select the aggregation type (Count, Sum, Average, etc.)
+3. Choose the field to aggregate (e.g., Amount)
+
+**Example:** Show total deal value per stage by aggregating Amount with Sum.
+
+### Use Compact View (Optional)
+
+For a high-level overview with minimal card content:
+
+1. Click **Options**
+2. Turn on the toggle for **Compact view**
+
+## Step 4: Create Personal and Team Views
+
+### "My Pipeline"
+
+* **Filter**: Owner = Me
+* **Visibility**: Unlisted (personal view)
+
+### "Team Pipeline"
+
+* **Filter**: None (show all)
+* **Visibility**: Workspace (shared view)
+
+### "Closing This Month"
+
+* **Type**: Table
+* **Filter**: Close Date = This month, Stage ≠ Closed Won, Stage ≠ Closed Lost
+* **Sort**: Close Date ascending
+
+## Working with Opportunities
+
+### Creating Opportunities
+
+* Click **+ New** in the Opportunities view
+* Or click **+** in a specific stage column
+
+### Moving Through Stages
+
+Drag and drop opportunity cards between columns to update their stage.
+
+
+
+## Best Practices
+
+### Pipeline Hygiene
+
+* Update deals daily as they progress
+* Move or close stale deals promptly
+* Keep close dates realistic
+
+### Stage Discipline
+
+* Define clear criteria for each stage
+* Move deals promptly when criteria are met
+* Don't let deals sit in stages too long
+
+## Related
+
+* [Kanban Views](/l/fr/user-guide/views-pipelines/capabilities/kanban-views) — aggregations and compact view
+* [Filters and Sorting](/l/fr/user-guide/views-pipelines/capabilities/filters-and-sorting) — creating filtered views
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
index 1c956dfc1c..c7df4f98ea 100644
--- a/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
@@ -1,149 +1,149 @@
---
-title: Afficher le Montant attendu dans votre pipeline},{
-description: Calculez et affichez les valeurs d'affaire pondérées en fonction de la probabilité de l'étape.
+title: Show Expected Amount in Your Pipeline
+description: Calculate and display weighted deal values based on stage probability.
---
-Le Montant attendu est une valeur calculée : **Montant × Probabilité**. Cela vous aide à prévoir les revenus en pondérant les affaires selon leur probabilité de conclusion.
+The Expected Amount is a calculated value: **Amount × Probability**. This helps you forecast revenue by weighting deals based on how likely they are to close.
- Ceci est un exemple de création de [Champs de formule](/l/fr/user-guide/workflows/how-tos/crm-automations/formula-fields) à l'aide de workflows.
+ This is an example of creating [Formula Fields](/l/fr/user-guide/workflows/how-tos/crm-automations/formula-fields) using workflows.
-Ce guide vous explique comment configurer les champs personnalisés et les workflows nécessaires pour calculer et afficher les montants attendus dans votre pipeline.
+This guide walks you through setting up the custom fields and workflows needed to calculate and display expected amounts in your pipeline.
-## Étape 1 : Créer des champs personnalisés
+## Step 1: Create Custom Fields
-Vous avez besoin de deux champs personnalisés sur l'objet Opportunités.
+You need two custom fields on the Opportunities object.
-### Créer le champ Probabilité
+### Create the Probability Field
-1. Allez dans **Paramètres → Modèle de données → Opportunités**
-2. Cliquez sur **+ Ajouter un champ**
-3. Configurer:
- * **Nom** : Probabilité
- * **Type** : Nombre
- * **Description** : Probabilité selon l'étape (0–100 %)
-4. Cliquez sur **Enregistrer**
+1. Go to **Settings → Data Model → Opportunities**
+2. Click **+ Add Field**
+3. Configure:
+ * **Name**: Probability
+ * **Type**: Number
+ * **Description**: Stage-based probability (0-100%)
+4. Click **Save**
-### Créer le champ Montant attendu
+### Create the Expected Amount Field
-1. Cliquez sur **+ Ajouter un champ**
-2. Configurer:
- * **Nom** : Montant attendu
- * **Type** : Devise
- * **Description** : Calculé : Montant × Probabilité
-3. Cliquez sur **Enregistrer**
+1. Click **+ Add Field**
+2. Configure:
+ * **Name**: Expected Amount
+ * **Type**: Currency
+ * **Description**: Calculated: Amount × Probability
+3. Click **Save**
-### Facultatif : rendre les champs en lecture seule pour les utilisateurs
+### Optional: Make Fields Read-Only for Users
-Si vous ne souhaitez pas que les utilisateurs modifient manuellement ces champs calculés :
+If you don't want users manually editing these calculated fields:
-1. Allez dans **Paramètres → Rôles**
-2. Sélectionnez le rôle à configurer
-3. Recherchez l'objet Opportunités
-4. Définissez les champs **Probabilité** et **Montant attendu** en lecture seule
+1. Go to **Settings → Roles**
+2. Select the role to configure
+3. Find the Opportunities object
+4. Set **Probability** and **Expected Amount** fields to read-only
-Cela garantit que seuls les workflows peuvent mettre à jour ces valeurs.
+This ensures only the workflows can update these values.
-## Étape 2 : Créer le workflow n° 1 — Mettre à jour la probabilité lors d'un changement d'étape
+## Step 2: Create Workflow #1 — Update Probability on Stage Change
-Ce workflow définit automatiquement la Probabilité lorsqu'une opportunité passe à une nouvelle étape.
+This workflow automatically sets the Probability when an opportunity moves to a new stage.
-### Créer le workflow
+### Create the Workflow
-1. Allez dans **Workflows**
-2. Cliquez sur **+ Nouveau workflow**
-3. Nommez-le "Mettre à jour la probabilité lors d'un changement d'étape"
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Update Probability on Stage Change"
-### Configurer le déclencheur
+### Configure the Trigger
-1. Ajoutez un déclencheur **Enregistrement créé ou mis à jour**
-2. Sélectionnez **Opportunités** comme objet
-3. Filtrer sur : le champ **Étape** est mis à jour
+1. Add a **Record Created or Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Stage** field is updated
-### Ajouter des branches pour chaque étape
+### Add Branches for Each Stage
-Créez une branche pour chaque étape avec sa probabilité :
+Create a branch for each stage with its probability:
-| Étape | Probabilité |
-| ------------- | ----------- |
-| Nouveau | 10 % |
-| Qualifié | 25 % |
-| Réunion | 40 % |
-| Proposition | 60 % |
-| Négociation | 80 % |
-| Fermée gagnée | 100 % |
-| Fermée perdue | 0% |
+| Stage | Probability |
+| ----------- | ----------- |
+| New | 10% |
+| Qualified | 25% |
+| Meeting | 40% |
+| Proposal | 60% |
+| Negotiation | 80% |
+| Closed Won | 100% |
+| Closed Lost | 0% |
- Pour créer une nouvelle branche, cliquez avec le bouton droit sur la zone de travail du workflow et cliquez sur **Nouvelle action**. Puis, reliez cette action au nœud précédent en faisant glisser la flèche du nœud précédent vers cette nouvelle action.
+ To create a new branch, right click on the workflow canvas and click **New action**. Then, link this action to the previous node by dragging the arrow from the previous node to this new action.
-Pour chaque étape :
+For each stage:
-1. Ajoutez un nœud **Filtre** : Étape = [nom de l'étape]
-2. Ajoutez une action **Mettre à jour l'enregistrement** :
- * Enregistrement : l'opportunité déclenchante
- * Champ : Probabilité
- * Valeur : [probabilité pour cette étape]
+1. Add a **Filter** node: Stage = [stage name]
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Probability
+ * Value: [probability for that stage]
-### Calculer le montant attendu
+### Calculate Expected Amount
-Après la jonction des branches :
+After the branches rejoin:
-1. Ajoutez un nœud **Filtre** : le champ Montant n'est pas vide
-2. Ajoutez une action **Mettre à jour l'enregistrement** :
- * Enregistrement : l'opportunité déclenchante
- * Champ : Montant attendu
- * Valeur : Montant × Probabilité
+1. Add a **Filter** node: Amount is not empty
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Expected Amount
+ * Value: Amount × Probability
-## Étape 3 : Créer le workflow n° 2 — Recalculer lors d'une modification du montant
+## Step 3: Create Workflow #2 — Recalculate on Amount Change
-Ce workflow met à jour le Montant attendu lorsque le Montant de l'affaire change.
+This workflow updates the Expected Amount when the deal Amount changes.
-### Créer le workflow
+### Create the Workflow
-1. Allez dans **Workflows**
-2. Cliquez sur **+ Nouveau workflow**
-3. Nommez-le "Recalculer le Montant attendu lors d'une modification du Montant"
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Recalculate Expected Amount on Amount Change"
-### Configurer le déclencheur
+### Configure the Trigger
-1. Ajoutez un déclencheur **Enregistrement créé ou mis à jour**
-2. Sélectionnez **Opportunités** comme objet
-3. Filtrer sur : le champ **Montant** est mis à jour
+1. Add a **Record Created or Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Amount** field is updated
-### Ajouter la logique
+### Add the Logic
-1. Ajoutez un nœud **Filtre** : le champ Montant n'est pas vide
-2. Ajoutez une action **Mettre à jour l'enregistrement** :
- * Enregistrement : l'opportunité déclenchante
- * Champ : Montant attendu
- * Valeur : Montant × Probabilité
+1. Add a **Filter** node: Amount is not empty
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Expected Amount
+ * Value: Amount × Probability
-## Étape 4 : Afficher dans votre pipeline
+## Step 4: Display in Your Pipeline
-Affichez maintenant les totaux de Montant attendu dans votre vue Kanban :
+Now show the Expected Amount totals in your Kanban view:
-1. Ouvrez votre vue Kanban **Pipeline des ventes**
-2. Cliquez sur le **nombre** à côté de n'importe quel nom d'étape en haut d'une colonne
-3. Sélectionnez **Somme**
-4. Choisissez **Montant attendu**
+1. Open your **Sales Pipeline** Kanban view
+2. Click the **number** next to any Stage name at the top of a column
+3. Select **Sum**
+4. Choose **Expected Amount**
-Chaque colonne affiche maintenant la valeur totale pondérée du pipeline pour cette étape.
+Each column now shows the total weighted pipeline value for that stage.
-## Résumé
+## Summary
-| Composant | Objectif |
-| ------------------------- | ----------------------------------------------------------------------------------- |
-| **Champ Probabilité** | Stocke la probabilité de gain selon l'étape |
-| **Champ Montant attendu** | Stocke Montant × Probabilité |
-| **Workflow n° 1** | Met à jour la Probabilité lorsque l'Étape change, puis recalcule le Montant attendu |
-| **Workflow n° 2** | Recalcule le Montant attendu lorsque le Montant change |
-| **Agrégation** | Affiche la somme du Montant attendu par étape |
+| Component | Purpose |
+| ------------------------- | ------------------------------------------------------------------------- |
+| **Probability field** | Stores the stage-based win probability |
+| **Expected Amount field** | Stores Amount × Probability |
+| **Workflow #1** | Updates Probability when Stage changes, then recalculates Expected Amount |
+| **Workflow #2** | Recalculates Expected Amount when Amount changes |
+| **Aggregation** | Displays Sum of Expected Amount per stage |
-## Connexes
+## Related
-* [Champs de formule](/l/fr/user-guide/workflows/how-tos/crm-automations/formula-fields) — créer des champs calculés à l'aide de workflows
-* [Vues Kanban](/l/fr/user-guide/views-pipelines/capabilities/kanban-views) — agrégations de colonnes
-* [Comment créer des champs personnalisés](/l/fr/user-guide/data-model/how-tos/create-custom-fields) — configuration des champs
+* [Formula Fields](/l/fr/user-guide/workflows/how-tos/crm-automations/formula-fields) — create calculated fields using workflows
+* [Kanban Views](/l/fr/user-guide/views-pipelines/capabilities/kanban-views) — column aggregations
+* [How to Create Custom Fields](/l/fr/user-guide/data-model/how-tos/create-custom-fields) — field configuration
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
index 160da26ffb..67bbf4dee8 100644
--- a/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
@@ -1,104 +1,104 @@
---
-title: Suivre la durée pendant laquelle les opportunités restent à chaque étape
-description: Surveillez la vélocité des affaires en suivant le moment où les opportunités entrent dans chaque étape.
+title: Track How Long Opportunities Stay in Each Stage
+description: Monitor deal velocity by tracking when opportunities enter each stage.
---
- Voici un exemple de création de [champs de formule](/l/fr/user-guide/workflows/how-tos/crm-automations/formula-fields) à l'aide de Workflows — plus précisément des calculs de dates.
+ This is an example of creating [Formula Fields](/l/fr/user-guide/workflows/how-tos/crm-automations/formula-fields) using workflows — specifically date calculations.
-Suivre le moment où les opportunités entrent dans chaque étape vous aide à identifier les goulots d'étranglement et à mesurer la vélocité des affaires.
+Tracking when opportunities enter each stage helps you identify bottlenecks and measure deal velocity.
-Ce guide vous explique comment configurer des champs personnalisés et un workflow pour enregistrer automatiquement le moment où une opportunité passe à chaque étape, et calculer le nombre de jours passés dans l'étape précédente.
+This guide walks you through setting up custom fields and a workflow to automatically record when an opportunity moves to each stage, and calculate how many days it spent in the previous stage.
-## Étape 1 : Créez des champs personnalisés
+## Step 1: Create Custom Fields
-Vous avez besoin de deux types de champs pour chaque étape :
+You need two types of fields for each stage:
-* **Champs Date et heure** : Enregistrer le moment où l'opportunité est entrée dans chaque étape
-* **Champs numériques** : Stocker le nombre de jours que l'opportunité a passés dans chaque étape
+* **Date & Time fields**: Record when the opportunity entered each stage
+* **Number fields**: Store how many days the opportunity spent in each stage
-### Créez les champs "Dernière entrée"
+### Create the "Last Entered" Fields
-1. Allez dans **Paramètres → Modèle de données → Opportunités**
-2. Pour chaque étape, cliquez sur **+ Ajouter un champ** et configurez :
- * **Nom** : Dernière entrée [Nom de l'étape] (par exemple, "Dernière entrée Nouveau", "Dernière entrée Qualifiée")
- * **Type** : Date et heure
- * **Description** : Horodatage du moment où l'opportunité est entrée dans cette étape
-3. Cliquez sur **Enregistrer**
+1. Go to **Settings → Data Model → Opportunities**
+2. For each stage, click **+ Add Field** and configure:
+ * **Name**: Last Entered [Stage Name] (e.g., "Last Entered New", "Last Entered Qualified")
+ * **Type**: Date & Time
+ * **Description**: Timestamp when opportunity entered this stage
+3. Click **Save**
-Créez ces champs :
+Create these fields:
-* Dernière entrée Nouveau
-* Dernière entrée Qualifiée
-* Dernière entrée Réunion
-* Dernière entrée Proposition
-* Dernière entrée Négociation
-* Dernière entrée Clôturée gagnée
-* Dernière entrée Clôturée perdue
+* Last Entered New
+* Last Entered Qualified
+* Last Entered Meeting
+* Last Entered Proposal
+* Last Entered Negotiation
+* Last Entered Closed Won
+* Last Entered Closed Lost
-### Créez les champs "Jours dans l'étape"
+### Create the "Days in Stage" Fields
-1. Pour chaque étape, cliquez sur **+ Ajouter un champ** et configurez :
- * **Nom** : Jours dans [Nom de l'étape] (par exemple, "Jours dans Nouveau", "Jours dans Qualifiée")
- * **Type** : Numérique
- * **Description** : Nombre de jours passés dans cette étape
-2. Cliquez sur **Enregistrer**
+1. For each stage, click **+ Add Field** and configure:
+ * **Name**: Days in [Stage Name] (e.g., "Days in New", "Days in Qualified")
+ * **Type**: Number
+ * **Description**: Number of days spent in this stage
+2. Click **Save**
-Créez ces champs :
+Create these fields:
-* Jours dans Nouveau
-* Jours dans Qualifiée
-* Jours dans Réunion
-* Jours dans Proposition
-* Jours dans Négociation
+* Days in New
+* Days in Qualified
+* Days in Meeting
+* Days in Proposal
+* Days in Negotiation
- Vous n'avez pas besoin de champs "Jours dans" pour Clôturée gagnée et Clôturée perdue, car ce sont des étapes finales.
+ You don't need "Days in" fields for Closed Won and Closed Lost since those are final stages.
-### Facultatif : rendre les champs en lecture seule
+### Optional: Make Fields Read-Only
-Si vous ne souhaitez pas que les utilisateurs modifient manuellement ces champs calculés :
+If you don't want users manually editing these calculated fields:
-1. Allez dans **Paramètres → Rôles**
-2. Sélectionnez le rôle à configurer
-3. Trouvez l'objet Opportunités
-4. Définissez les champs "Dernière entrée" et "Jours dans" en lecture seule
+1. Go to **Settings → Roles**
+2. Select the role to configure
+3. Find the Opportunities object
+4. Set the "Last Entered" and "Days in" fields to read-only
-## Étape 2 : Créez le workflow
+## Step 2: Create the Workflow
-Ce seul workflow gère les deux tâches :
+This single workflow handles both tasks:
-* Enregistre l'horodatage lors de l'entrée dans une nouvelle étape
-* Calcule le nombre de jours passés dans l'étape précédente
+* Records the timestamp when entering a new stage
+* Calculates days spent in the previous stage
-### Créez le workflow
+### Create the Workflow
-1. Allez dans **Workflows**
-2. Cliquez sur **+ Nouveau workflow**
-3. Nommez-le "Suivre le temps par étape"
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Track Stage Time"
-### Configurez le déclencheur
+### Configure the Trigger
-1. Ajoutez un déclencheur **Enregistrement mis à jour**
-2. Sélectionnez **Opportunités** comme objet
-3. Filtrer sur : le champ **Étape** est mis à jour
+1. Add a **Record Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Stage** field is updated
-### Ajoutez des branches pour chaque étape
+### Add Branches for Each Stage
- Pour créer une nouvelle branche, faites un clic droit sur le canevas du workflow et cliquez sur **Nouvelle action**. Ensuite, reliez cette action au nœud précédent en faisant glisser la flèche du nœud précédent vers cette nouvelle action.
+ To create a new branch, right click on the workflow canvas and click **New action**. Then, link this action to the previous node by dragging the arrow from the previous node to this new action.
---
-**Branche 1 : Étape = Nouveau (première étape)**
+**Branch 1: Stage = New (first stage)**
-Comme il s'agit de la première étape, nous enregistrons uniquement l'horodatage d'entrée — aucune étape précédente à calculer.
+Since this is the first stage, we only record the entry timestamp—no previous stage to calculate.
-1. Ajoutez un nœud **Filtre** : Étape = Nouveau
-2. Ajoutez une action **Code** :
+1. Add a **Filter** node: Stage = New
+2. Add a **Code** action:
```javascript
export const main = async (): Promise => {
@@ -106,19 +106,19 @@ export const main = async (): Promise => {
};
```
-3. Ajoutez une action **Mettre à jour l'enregistrement** :
- * Enregistrement : l'opportunité déclenchante
- * Champ : Dernière entrée Nouveau
- * Valeur : `now` depuis le nœud Code
+3. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Last Entered New
+ * Value: `now` from Code node
---
-**Branche 2 : Étape = Qualifiée**
+**Branch 2: Stage = Qualified**
-Lors du passage à Qualifiée, enregistrez l'heure d'entrée ET calculez les jours passés dans Nouveau.
+When moving to Qualified, record entry time AND calculate days spent in New.
-1. Ajoutez un nœud **Filtre** : Étape = Qualifiée
-2. Ajoutez une action **Code** :
+1. Add a **Filter** node: Stage = Qualified
+2. Add a **Code** action:
```javascript
export const main = async (params: {
@@ -138,21 +138,21 @@ export const main = async (params: {
};
```
-3. Configurez l'entrée du nœud Code : associez `lastEnteredPreviousStage` au champ **Dernière entrée Nouveau**
-4. Ajoutez une action **Mettre à jour l'enregistrement** :
- * Enregistrement : l'opportunité déclenchante
- * Champs à mettre à jour:
- * Dernière entrée Qualifiée = `now`
- * Jours dans Nouveau = `daysInPreviousStage`
+3. Configure the Code node input: map `lastEnteredPreviousStage` to the **Last Entered New** field
+4. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Fields to update:
+ * Last Entered Qualified = `now`
+ * Days in New = `daysInPreviousStage`
---
-**Branche 3 : Étape = Réunion**
+**Branch 3: Stage = Meeting**
-Lors du passage à Réunion, enregistrez l'heure d'entrée ET calculez les jours passés dans Qualifiée.
+When moving to Meeting, record entry time AND calculate days spent in Qualified.
-1. Ajoutez un nœud **Filtre** : Étape = Réunion
-2. Ajoutez une action **Code** :
+1. Add a **Filter** node: Stage = Meeting
+2. Add a **Code** action:
```javascript
export const main = async (params: {
@@ -172,60 +172,60 @@ export const main = async (params: {
};
```
-3. Configurez l'entrée du nœud Code : associez `lastEnteredPreviousStage` au champ **Dernière entrée Qualifiée**
-4. Ajoutez une action **Mettre à jour l'enregistrement** :
- * Enregistrement : l'opportunité déclenchante
- * Champs à mettre à jour:
- * Dernière entrée Réunion = `now`
- * Jours dans Qualifiée = `daysInPreviousStage`
+3. Configure the Code node input: map `lastEnteredPreviousStage` to the **Last Entered Qualified** field
+4. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Fields to update:
+ * Last Entered Meeting = `now`
+ * Days in Qualified = `daysInPreviousStage`
---
-**Continuez pour les étapes restantes :**
+**Continue for remaining stages:**
-| Étape | Enregistrements | Calcule |
-| --------------- | ------------------------------- | ---------------------- |
-| Proposition | Dernière entrée Proposition | Jours dans Réunion |
-| Négociation | Dernière entrée Négociation | Jours dans Proposition |
-| Clôturée gagnée | Dernière entrée Clôturée gagnée | Jours dans Négociation |
-| Clôturée perdue | Dernière entrée Clôturée perdue | Jours dans Négociation |
+| Stage | Records | Calculates |
+| ----------- | ------------------------ | ------------------- |
+| Proposal | Last Entered Proposal | Days in Meeting |
+| Negotiation | Last Entered Negotiation | Days in Proposal |
+| Closed Won | Last Entered Closed Won | Days in Negotiation |
+| Closed Lost | Last Entered Closed Lost | Days in Negotiation |
-Les branches n'ont pas besoin de se rejoindre — chacune s'exécute indépendamment lorsque sa condition d'étape est remplie.
+The branches do not need to rejoin—each runs independently when its stage condition is met.
-## Étape 3 : Analyser le temps par étape
+## Step 3: Analyze Time in Stage
-Avec les horodatages et les comptages de jours enregistrés, vous pouvez désormais analyser la vélocité des affaires.
+With timestamps and day counts recorded, you can now analyze deal velocity.
-### Créez une vue "Affaires lentes"
+### Create a "Slow Deals" View
-1. Créez une vue Tableau des Opportunités
-2. Ajoutez des colonnes : Nom, Étape, Jours dans [étape précédente], Montant
-3. Triez par le champ "Jours dans" (décroissant)
-4. Filtrez par Étape pour vous concentrer sur une étape à la fois
+1. Create a Table view of Opportunities
+2. Add columns: Name, Stage, Days in [previous stage], Amount
+3. Sort by "Days in" field (descending)
+4. Filter by Stage to focus on one stage at a time
-Les affaires en haut ont passé le plus de temps dans l'étape précédente.
+Deals at the top spent the most time in the previous stage.
-### Utilisez les agrégations
+### Use Aggregations
-Dans votre vue Kanban du pipeline :
+In your pipeline Kanban view:
-1. Cliquez sur le nombre à côté du nom d'une étape
-2. Sélectionnez **Moyenne**
-3. Choisissez un champ "Jours dans"
+1. Click the number next to a Stage name
+2. Select **Average**
+3. Choose a "Days in" field
-Cela affiche le temps moyen que les affaires passent à chaque étape.
+This shows the average time deals spend in each stage.
-## Résumé
+## Summary
-| Composant | Objectif |
-| ------------------------------ | -------------------------------------------------------------------------- |
-| **Champs « Dernière entrée »** | Stockent le moment où l'opportunité est entrée dans chaque étape |
-| **Champs « Jours dans »** | Stockent le nombre de jours passés dans chaque étape |
-| **Workflow** | Enregistre l'horodatage ET calcule les jours en un seul passage |
-| **Vues et agrégations** | Analysez la vélocité des affaires et identifiez les goulots d'étranglement |
+| Component | Purpose |
+| ------------------------ | ------------------------------------------------- |
+| **Last Entered fields** | Store when opportunity entered each stage |
+| **Days in fields** | Store how many days spent in each stage |
+| **Workflow** | Records timestamp AND calculates days in one pass |
+| **Views & Aggregations** | Analyze deal velocity and identify bottlenecks |
-## Connexes
+## Related
-* [Workflows](/l/fr/user-guide/workflows/overview) — principes de l'automatisation
-* [Comment créer des champs personnalisés](/l/fr/user-guide/data-model/how-tos/create-custom-fields) — configuration des champs
-* [Vues Kanban](/l/fr/user-guide/views-pipelines/capabilities/kanban-views) — agrégations
+* [Workflows](/l/fr/user-guide/workflows/overview) — automation basics
+* [How to Create Custom Fields](/l/fr/user-guide/data-model/how-tos/create-custom-fields) — field configuration
+* [Kanban Views](/l/fr/user-guide/views-pipelines/capabilities/kanban-views) — aggregations
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/overview.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/overview.mdx
index b837935b23..aa8cc7a06e 100644
--- a/packages/twenty-docs/l/fr/user-guide/views-pipelines/overview.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/overview.mdx
@@ -1,137 +1,137 @@
---
-title: Vues et Pipelines
-description: Découvrez comment créer et gérer des vues dans Twenty.
+title: Views & Pipelines
+description: Learn how to create and manage views in Twenty.
image: /images/user-guide/table-views/table.png
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-
+
-## Comprendre les vues
+## Understanding Views
-Les vues sont des configurations enregistrées qui déterminent la façon dont vos données sont affichées. Chaque vue peut avoir ses propres :
+Views are saved configurations that determine how your data is displayed. Each view can have its own:
-* **Disposition** : Tableau, Kanban ou Calendrier
-* **Filtres** : Quels enregistrements afficher
-* **Tri** : Comment les enregistrements sont classés
-* **Champs** : Quelles colonnes sont visibles
+* **Layout**: Table, Kanban, or Calendar
+* **Filters**: Which records to show
+* **Sorting**: How records are ordered
+* **Fields**: Which columns are visible
-## Types de vue
+## View Types
-### Vue Tableau
+### Table View
-La vue par défaut de type tableur affichant les enregistrements en lignes avec des colonnes personnalisables.
+The default spreadsheet-like view showing records in rows with customizable columns.
-### Vue Kanban
+### Kanban View
-Une vue tableau visuelle où les enregistrements apparaissent sous forme de cartes organisées par étapes. Idéal pour :
+A visual board view where records appear as cards organized by stages. Ideal for:
-* Pipelines de vente
-* Suivi de projets
-* Tout flux de travail avec des étapes définies
+* Sales pipelines
+* Project tracking
+* Any workflow with defined stages
-### Vue Calendrier
+### Calendar View
-Affiche les enregistrements possédant des champs de date sur un calendrier. Parfait pour :
+Display records with date fields on a calendar. Perfect for:
-* Réunions et événements
-* Échéances et dates limites
-* Planification basée sur le temps
+* Meetings and events
+* Deadlines and due dates
+* Time-based planning
-## Création d'une Vue
+## Creating a View
-Il y a deux manières de créer une nouvelle vue.
+There are two ways to create a new view.
-### Utilisez le menu déroulant de la vue
+### Use the View Dropdown Menu
-1. Accédez à n'importe quel objet (Personnes, Entreprises, etc.)
-2. Cliquez sur le nom de la vue en haut à gauche (affiche la vue actuelle avec une flèche déroulante)
-3. Cliquez sur **+ Ajouter une vue**
-4. Nommez votre vue et cliquez sur **Créer**
-5. Choisissez une disposition (Tableau, Kanban ou Calendrier) sous **Options**
-6. Ajoutez des filtres et un tri selon vos besoins
-7. Sélectionnez les champs à afficher et réorganisez-les
-8. Cliquez sur **Enregistrer**
+1. Navigate to any object (People, Companies, etc.)
+2. Click the view name at the top left (shows current view with a dropdown arrow)
+3. Click **+ Add view**
+4. Name your view and click **Create**
+5. Choose a layout (Table, Kanban, or Calendar) under **Options**
+6. Add filters and sorting as needed
+7. Select which fields to display and reorder them
+8. Click **Save**
-
+
-### Commencez par modifier une vue existante
+### Start by editting an existing view
-1. Accédez à n'importe quel objet (Personnes, Entreprises, etc.)
-2. Choisissez une disposition (Tableau, Kanban ou Calendrier) sous **Options** ou ajoutez des filtres et un tri selon vos besoins
-3. Cliquez sur **Enregistrer comme nouvelle vue**
-4. Nommez votre vue et cliquez sur **Créer**
-5. Continuez à modifier votre nouvelle vue
-6. Cliquez sur **Mettre à jour la vue** pour enregistrer vos configurations supplémentaires
+1. Navigate to any object (People, Companies, etc.)
+2. Choose a layout (Table, Kanban, or Calendar) under **Options** or Add filters and sorting as needed
+3. Click on **Save as new view**
+4. Name your view and click **Create**
+5. Keep editing your new view
+6. Click on **Update view** to save your additional configurations
-
+
-## Gérer les vues
+## Managing Views
-### Modifier une vue
+### Edit a View
-1. Sélectionnez la vue dans le menu déroulant
-2. Apportez vos modifications (filtres, tri, colonnes)
-3. Cliquez sur **Enregistrer** pour mettre à jour la vue
+1. Select the view from the dropdown
+2. Make your changes (filters, sorting, columns)
+3. Click **Save** to update the view
-### Renommer une vue ou changer son icône
+### Rename a View or Change Its Icon
-1. Ouvrez le menu déroulant de la vue
-2. Cliquez sur le menu **⋮** à côté du nom de la vue
-3. Sélectionnez **Modifier**
-4. Modifiez le nom ou l'icône
-5. Cliquez sur **Enregistrer**
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view name
+3. Select **Edit**
+4. Change the name or icon
+5. Click **Save**
-### Réorganiser les vues
+### Reorder Views
-1. Ouvrez le menu déroulant de la vue
-2. Cliquez et faites glisser une vue par sa poignée
-3. Déposez-la à l'emplacement souhaité
-4. Le nouvel ordre est enregistré automatiquement
+1. Open the view dropdown
+2. Click and drag a view by its handle
+3. Drop it in the desired position
+4. The new order is saved automatically
-### Ajouter aux favoris
+### Add to Favorites
-Épinglez les vues fréquemment utilisées pour un accès rapide :
+Pin frequently used views for quick access:
-1. Ouvrez le menu déroulant de la vue
-2. Cliquez sur le menu **⋮** à côté d'une vue
-3. Sélectionnez **Ajouter aux favoris**
-4. La vue apparaît dans votre section Favoris
+1. Open the view dropdown
+2. Click the **⋮** menu next to a view
+3. Select **Add to favorites**
+4. The view appears in your favorites section
-### Supprimer une vue
+### Delete a View
-1. Sélectionnez la vue à supprimer
-2. Cliquez sur le menu déroulant de la vue
-3. Cliquez sur le menu **⋮** à côté de la vue
-4. Sélectionnez **Supprimer**
-5. Confirmez la suppression
+1. Select the view to delete
+2. Click the view dropdown
+3. Click the **⋮** menu next to the view
+4. Select **Delete**
+5. Confirm deletion
- Les vues supprimées ne peuvent pas être récupérées. Assurez-vous de vouloir la supprimer avant de confirmer.
+ Deleted views cannot be recovered. Make sure you want to remove it before confirming.
-## Visibilité de la vue
+## View Visibility
-Chaque vue (sauf les vues par défaut "Tous les [Nom de l'objet]") possède son propre paramètre de visibilité.
+Each view (except the default "All [Object Name]" views) has its own visibility setting.
-Pour modifier la visibilité :
+To change visibility:
-1. Ouvrez la vue
-2. Cliquez sur **Options → Visibilité**
-3. Choisissez :
- * **Espace de travail** : Visible par tous les membres de l'espace de travail
- * **Non répertoriée** : Visible uniquement par vous
+1. Open the view
+2. Click **Options → Visibility**
+3. Choose:
+ * **Workspace**: Visible to all workspace members
+ * **Unlisted**: Visible only to you
- La visibilité des vues par défaut "Tous les [Nom de l'objet]" ne peut pas être modifiée.
+ The default "All [Object Name]" views cannot have their visibility changed.
-## Prochaines étapes
+## Next Steps
-* [Vues de Tableau](/l/fr/user-guide/views-pipelines/capabilities/table-views)
-* [Vues Kanban](/l/fr/user-guide/views-pipelines/capabilities/kanban-views)
-* [Filtres et tri](/l/fr/user-guide/views-pipelines/capabilities/filters-and-sorting)
-* [Paramètres de la vue](/l/fr/user-guide/views-pipelines/capabilities/view-settings)
+* [Table Views](/l/fr/user-guide/views-pipelines/capabilities/table-views)
+* [Kanban Views](/l/fr/user-guide/views-pipelines/capabilities/kanban-views)
+* [Filters and Sorting](/l/fr/user-guide/views-pipelines/capabilities/filters-and-sorting)
+* [View Settings](/l/fr/user-guide/views-pipelines/capabilities/view-settings)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/send-emails-from-workflows.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/send-emails-from-workflows.mdx
new file mode 100644
index 0000000000..5fd6028ad7
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/send-emails-from-workflows.mdx
@@ -0,0 +1,149 @@
+---
+title: Send Emails from Workflows
+description: Send personalized emails automatically using workflow actions.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Automatically send emails when specific events occur in your CRM—welcome new contacts, follow up on opportunities, or notify team members.
+
+## Prerequisites
+
+Before you can send emails from workflows:
+
+1. Connect an email account under **Settings → Accounts**
+2. Ensure the account has sending permissions enabled
+
+## Basic Email Workflow
+
+### Example: Welcome Email for New Contacts
+
+**Goal**: Send a welcome email when a new person is added to the CRM.
+
+**Setup**:
+
+1. **Create workflow**: Go to **Settings → Workflows** and click **+ New Workflow**
+
+2. **Add trigger**: Select **Record is Created** → **People**
+
+3. **Add Send Email action**:
+ * Click **+** to add an action
+ * Select **Send Email**
+ * Configure the email:
+
+| Field | Value |
+| ----------- | -------------------------------------- |
+| **To** | `{{trigger.object.email}}` |
+| **Subject** | `Welcome to {{Your Company Name}}` |
+| **Body** | `Hi {{trigger.object.firstName}}, ...` |
+
+4. **Test and activate**: Test with a sample record, then activate
+
+## Using Variables in Emails
+
+Reference data from previous steps using `{{variable}}` syntax:
+
+```text
+Hi {{trigger.object.firstName}},
+
+Thank you for connecting with us!
+
+Your company, {{trigger.object.company.name}}, is now in our system.
+
+Best regards,
+The Team
+```
+
+### Available Variables from Triggers
+
+| Trigger Type | Common Variables |
+| -------------------------- | -------------------------------------- |
+| **Record Created/Updated** | `{{trigger.object.fieldName}}` |
+| **Manual** | `{{trigger.selectedRecord.fieldName}}` |
+| **Webhook** | `{{trigger.body.fieldName}}` |
+
+## Advanced: Conditional Emails
+
+### Example: Different Emails Based on Lead Source
+
+**Goal**: Send different welcome emails based on where the lead came from.
+
+**Setup**:
+
+1. **Trigger**: Record is Created (People)
+
+2. **Add Filter action**:
+ * Condition: `{{trigger.object.source}}` equals `"Website"`
+ * If true → continue to website welcome email
+
+3. **Branch for other sources**:
+ * Create parallel branches for different sources
+ * Each branch has its own Send Email action
+
+## Sending Emails to Multiple Recipients
+
+### Example: Notify Team When Deal Closes
+
+**Goal**: Email the sales rep and their manager when an opportunity is won.
+
+**Setup**:
+
+1. **Trigger**: Record is Updated (Opportunities, Stage = "Closed Won")
+
+2. **Search Records**: Find the opportunity owner's manager
+
+3. **Send Email #1**: To opportunity owner
+ * To: `{{trigger.object.owner.email}}`
+ * Subject: `Congratulations on closing {{trigger.object.name}}!`
+
+4. **Send Email #2**: To manager
+ * To: `{{searchRecords.manager.email}}`
+ * Subject: `Deal Won: {{trigger.object.name}}`
+
+## Scheduled Follow-up Emails
+
+### Example: Follow Up 3 Days After Meeting
+
+**Goal**: Send a follow-up email 3 days after a meeting is logged.
+
+**Setup**:
+
+1. **Trigger**: Record is Created (Activities, Type = "Meeting")
+
+2. **Delay action**: Wait 3 days
+
+3. **Send Email**:
+ * To: Meeting attendee
+ * Subject: Following up on our conversation
+ * Body: Reference meeting details from trigger
+
+## Best Practices
+
+### Email Content
+
+* Keep subject lines concise and relevant
+* Personalize with recipient's name
+* Include a clear call to action
+* Test emails before activating
+
+### Deliverability
+
+* Don't send too many emails too quickly
+* Use professional email signatures
+* Avoid spam trigger words
+* Ensure unsubscribe options for marketing emails
+
+### Troubleshooting
+
+* Verify email account is connected and active
+* Check recipient email address is valid
+* Review workflow runs for error messages
+* Test with your own email address first
+
+
+ **Coming soon**: Email attachments will be available in Q1 2026.
+
+
+## Related
+
+* [Workflow Triggers](/l/fr/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/use-branches-in-workflows.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
new file mode 100644
index 0000000000..62a0da9278
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
@@ -0,0 +1,90 @@
+---
+title: Use Branches in Workflows
+description: Understand how branches work and how to control which path is executed.
+---
+
+## How Branches Work
+
+In the workflow editor, you can create multiple paths (branches) going out from a single node. This allows you to build complex automations with different outcomes.
+
+**Important**: When a workflow runs, **all branches execute in parallel by default**. There is no built-in "if/else" logic to choose one branch over another—every path will run simultaneously.
+
+## Controlling Which Branch Runs
+
+To execute only one branch based on specific conditions, **add a Filter node at the beginning of each branch**.
+
+### Example Setup
+
+1. Create your workflow with multiple branches from a single node
+2. Add a **Filter** node as the first step in each branch
+3. Set conditions on each Filter to determine when that branch should continue
+4. Only the branch(es) whose Filter conditions are met will proceed
+
+
+
+### How Filters Work
+
+* If the Filter condition is **met**: The branch continues executing
+* If the Filter condition is **not met**: The branch stops at the Filter node
+
+This effectively creates conditional logic where only the appropriate branch runs based on your data.
+
+## Example: Route by Deal Size
+
+**Scenario**: When a deal is closed, send different notifications based on deal size.
+
+1. **Trigger**: Opportunity updated (Stage = Closed Won)
+2. **Branch 1**: Filter for Amount > $10,000 → Send Slack message to #big-deals
+3. **Branch 2**: Filter for Amount ≤ $10,000 → Send email to sales manager
+
+Both branches start, but only the one matching the deal amount will continue past its Filter.
+
+## Creating Branches
+
+
+ To create a new branch from an existing step, click the **+** button on the step and add your action. You can add multiple branches by clicking **+** multiple times.
+
+
+1. In the workflow editor, select the step you want to branch from
+2. Click the **+** button to add an action
+3. This creates one branch
+4. Click **+** again on the same step to create additional branches
+5. Each branch can have its own sequence of actions
+
+## Merging Branches Back Together
+
+After parallel branches complete their work, you can merge them back into a single path:
+
+1. Complete your branched actions
+2. Add a new step that should run after all branches
+3. Drag a connection from the last step of each branch to this new step
+4. The merged step waits for all connected branches to complete before executing
+
+### Example: Process Then Notify
+
+```
+Trigger
+ │
+ ├── Branch A: Update Customer Record
+ │
+ └── Branch B: Create Support Ticket
+
+ ↘ ↙
+
+ Merged Step: Send Confirmation Email
+```
+
+The confirmation email sends only after both the customer update and ticket creation are done.
+
+## Best Practices
+
+* Always use **Filter nodes** at the start of branches when you want conditional execution
+* Keep branch conditions **mutually exclusive** to avoid duplicate actions
+* Test your workflows with different data to ensure the correct branches run
+* **Rename branch steps** descriptively so it's clear what each path does
+* **Merge branches** when you need a final action after parallel processing
+
+## Related
+
+* [Workflows FAQ](/l/fr/user-guide/workflows/how-tos/need-more-help/workflows-faq) — answers about parallel execution
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions) — available actions for branches
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/use-iterator.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/use-iterator.mdx
new file mode 100644
index 0000000000..f7daaf1ea6
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/use-iterator.mdx
@@ -0,0 +1,180 @@
+---
+title: Use Iterator
+description: Loop through arrays of records to perform actions on each item.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Iterator lets you loop through an array of records and perform actions on each one. It's essential for workflows that need to process multiple records returned by Search Records or received via webhooks.
+
+
+ Iterator is currently in beta. Activate it under **Settings → Releases → Lab**.
+
+
+## When to Use Iterator
+
+| Scenario | Example |
+| -------------------------- | ---------------------------------------------- |
+| **Process search results** | Send email to each person found |
+| **Handle webhook arrays** | Create records for each item in order |
+| **Bulk updates** | Update multiple records with calculated values |
+| **Notifications** | Alert multiple people about an event |
+
+## Understanding Iterator
+
+Iterator expects an **array** as input. It then:
+
+1. Takes the first item from the array
+2. Runs all actions inside the iterator with that item
+3. Moves to the next item
+4. Repeats until all items are processed
+
+## Basic Setup
+
+### Example: Email Everyone in Search Results
+
+**Goal**: Find all contacts in a specific company and send each one a personalized email.
+
+### Step 1: Search for Records
+
+1. Add **Search Records** action
+2. Object: **People**
+3. Filter: Company equals "Acme Inc"
+4. This returns an array of people
+
+### Step 2: Check Results Exist
+
+1. Add **Filter** action
+2. Condition: `{{searchRecords.length}}` is greater than 0
+3. This prevents Iterator errors on empty results
+
+### Step 3: Add Iterator
+
+1. Add **Iterator** action
+2. Array input: Select `{{searchRecords}}`
+3. This creates a loop
+
+### Step 4: Add Actions Inside Iterator
+
+Actions placed after Iterator run for each item:
+
+1. Add **Send Email** action (inside iterator)
+2. To: `{{iterator.currentItem.email}}`
+3. Subject: Hello `{{iterator.currentItem.firstName}}`!
+4. Body: Personalized message using current item fields
+
+### Result
+
+If Search Records returns 5 people, the Iterator:
+
+* Sends email to person 1
+* Sends email to person 2
+* ... continues for all 5
+
+## Accessing Current Item Data
+
+Inside Iterator, use `{{iterator.currentItem}}` to access the current record:
+
+| Variable | Description |
+| --------------------------------------- | ----------------------------------- |
+| `{{iterator.currentItem}}` | The entire current record object |
+| `{{iterator.currentItem.id}}` | Record ID |
+| `{{iterator.currentItem.email}}` | Email field |
+| `{{iterator.currentItem.company.name}}` | Related company name |
+| `{{iterator.index}}` | Current position in array (0-based) |
+
+## Common Patterns
+
+### Update Multiple Records
+
+**Goal**: Mark all overdue tasks as "Late"
+
+```
+1. Search Records (Tasks, Due Date < Today, Status ≠ Completed)
+2. Filter (length > 0)
+3. Iterator (searchRecords)
+ └── Update Record
+ - Object: Tasks
+ - Record: {{iterator.currentItem.id}}
+ - Status: Late
+```
+
+### Create Records from Array
+
+**Goal**: Webhook receives order with multiple items, create a record for each
+
+```
+1. Webhook Trigger (receives items array)
+2. Filter (items.length > 0)
+3. Iterator (trigger.body.items)
+ └── Create Record
+ - Object: Order Items
+ - Name: {{iterator.currentItem.name}}
+ - Quantity: {{iterator.currentItem.qty}}
+ - Related Order: {{trigger.body.orderId}}
+```
+
+### Conditional Processing Inside Loop
+
+**Goal**: Only send email to contacts with valid emails
+
+```
+1. Search Records (People)
+2. Iterator (searchRecords)
+ └── Filter (currentItem.email is not empty)
+ └── Send Email
+ - To: {{iterator.currentItem.email}}
+```
+
+## Troubleshooting
+
+### "Iterator expects an array"
+
+**Cause**: You passed a single record instead of an array.
+
+**Fix**: Make sure you're passing the result of Search Records or an array field, not a single record.
+
+```
+✅ Correct: {{searchRecords}}
+❌ Wrong: {{searchRecords[0]}}
+```
+
+### Iterator Doesn't Run
+
+**Cause**: The array is empty.
+
+**Fix**: Add a Filter before Iterator to check array length:
+
+```
+Filter: {{searchRecords.length}} > 0
+```
+
+### Actions Run Too Many Times
+
+**Cause**: Search Records returned more records than expected.
+
+**Fix**:
+
+* Add more specific filters to Search Records
+* Set a limit on Search Records (max 200)
+* Add Filter inside Iterator for additional conditions
+
+## Performance Considerations
+
+* **Credit usage**: Each iteration consumes credits for its actions
+* **Time**: Large arrays take longer to process
+* **Limits**: Consider batching very large operations
+* **Rate limits**: External API calls may hit rate limits with many iterations
+
+## Best Practices
+
+1. **Always check array length** before Iterator to avoid errors
+2. **Add filters inside loops** when not all items need processing
+3. **Rename your Iterator step** to describe what it's looping through
+4. **Test with small arrays** before processing large datasets
+5. **Monitor workflow runs** to ensure iterations complete as expected
+
+## Related
+
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions)
+* [How to Use Branches](/l/fr/user-guide/workflows/capabilities/use-branches-in-workflows)
+* [Workflows FAQ](/l/fr/user-guide/workflows/how-tos/need-more-help/workflows-faq)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-actions.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-actions.mdx
new file mode 100644
index 0000000000..d00cc9dcce
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-actions.mdx
@@ -0,0 +1,311 @@
+---
+title: Workflow Actions
+description: Learn about the actions available in Twenty workflows.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## About Actions
+
+Actions define what happens after a trigger fires. You can chain multiple actions together to build complex automations.
+
+
+ * Use the variable picker (click the `(x+)` icon) to browse available data from previous steps
+ * Hover over any input field to see which step a variable comes from — helpful when the same field (e.g., ID) exists in multiple previous steps
+ * Give each action a descriptive name for easier maintenance
+
+
+## Record Actions
+
+
+
+### Create a Record
+
+Adds a new record to a selected object.
+
+**Configuration**:
+
+* Select the target object
+* Fill out the required and optional fields
+* Use data from previous steps or input values manually to populate fields
+
+**Output**: The newly created record data is available for use in subsequent steps.
+
+### Update Record
+
+Modifies an existing record in a selected object.
+
+
+
+**Configuration**:
+
+* Select the target object
+* Choose the specific record to update.
+ * You can either choose a fixed record, using the drop down menu displaying all available records.
+ * Or you can have the record dynamically selected, by designating a record found in a previous step, using the `(x+)`. You cannot search for the record based on different criteria at this stage. If you've not yet identified the record, add a `Search Record` step before this `Update Record` step.
+* Select fields to modify and enter new values
+
+**Output**: The updated record data is available for use in subsequent steps.
+
+### Delete Record
+
+Removes a record from a selected object.
+
+**Configuration**:
+
+* Select the target object
+* Choose the specific record to delete
+
+**Output**: The deleted record data remains available for use in subsequent steps.
+
+### Search Records
+
+Finds records within a selected object using filter conditions.
+
+**Configuration**:
+
+* Select the object to search
+* Set filter criteria to narrow results
+* Configure sorting and limits
+
+**Output**: Returns matching records that can be used in subsequent steps.
+
+
+ **Limit**: Search Records returns a maximum of **200 records**. If you need to process more, add specific filters to reduce results or use scheduled workflows to process in batches.
+
+
+**Best Practice**: Use [branches](/l/fr/user-guide/workflows/capabilities/workflow-branches) after Search Records to handle "found" vs "not found" scenarios.
+
+### Upsert Record
+
+Creates a new record or updates an existing one based on matching criteria. This is useful when you're not sure if a record already exists.
+
+
+
+**Configuration**:
+
+* Select the target object
+* Note which fields can be used for matching: email for People, domain for Companies, ID for any object, or any field marked as Unique. You'll need to populate at least one of these below.
+* Fill out the field values. Do not forget to populate at least one of the unique identifiers.
+
+
+ **Matching usually works even better when adding only one unique identifier.** For example, the screenshot below will match companies based on their domain. The ID is not necessarily needed.
+
+
+
+
+* Use data from previous steps to populate fields
+
+**How it works**:
+
+1. Searches for a record matching your criteria
+2. If found → updates the existing record
+3. If not found → creates a new record
+
+**Output**: The created or updated record data is available for use in subsequent steps.
+
+## Flow Actions
+
+### Iterator
+
+**Loops through an array of records** returned from a previous step, allowing you to perform actions on each record individually.
+
+**Configuration**:
+
+* Select the array of records from a previous step (e.g., results from Search Records, from a Manual trigger with Bulk availability, from a code node)
+* Define the actions to perform on each record in the loop.
+
+
+ - You can add several actions within an iterator.
+ - When using branches inside an iterator, make sure the last step of each branch connects back to the iterator to close the loop.
+
+
+* Access `Current Item` Fields: to use fields from the record currently being processed, click on the **Iterator** step, then select **Current item**. The list of available fields from that record will be displayed and can be selected for use in subsequent actions.
+
+
+
+### Filter
+
+Filters records based on specified conditions, allowing only records that meet the criteria to pass through.
+
+**Configuration**:
+
+* Select the record to filter
+* Define filter conditions and criteria
+* Configure which records should pass through to subsequent steps
+
+
+ 1. **Output**: Filter nodes don't return data—they act as gates. If the conditions are met, the workflow continues. If not, the workflow stops at that branch.
+ 2. The `IS` operator can be used with numeric fields. It performs as an `EQUAL`.
+
+
+### Delay
+
+Pauses workflow execution for a specified duration or until a specific date/time.
+
+**Delay Types**:
+
+| Type | Description |
+| ------------------ | ------------------------------------------------------------------ |
+| **Duration** | Wait for a specific amount of time (days, hours, minutes, seconds) |
+| **Scheduled Date** | Wait until a specific date and time |
+
+**Configuration for Duration**:
+
+* Set days, hours, minutes, and/or seconds
+* Combine multiple units (e.g., 2 days and 4 hours)
+
+**Configuration for Scheduled Date**:
+
+* Select a date and time
+* Can reference a date field from a previous step (e.g., follow up 3 days after a meeting)
+
+**Use cases**:
+
+* Wait 24 hours before sending a follow-up email
+* Pause until an opportunity's close date
+* Schedule actions for business hours
+
+
+ The scheduled date cannot be in the past. If a date field from a previous step is used and the date has already passed, the workflow will fail.
+
+
+**Limits & Credits**:
+
+* **No maximum duration limit**—you can set delays of minutes, days, weeks, or longer
+* **1 credit consumed** when the Delay node executes, regardless of duration
+* **No credits consumed** while waiting—a 5-minute delay costs the same as a 5-day delay
+
+## Communication Actions
+
+### Send Email
+
+Sends an email from your workflow. This is great for templated group emails. Emails will look like the ones you send from your mailbox.
+Not suited for newsletters (which require richer formatting) or automated email sequences.
+
+**Prerequisites**: Add an email account in Settings → Accounts
+
+**Configuration**:
+
+* Select the sender email account
+
+
+ You can only send emails from mailboxes synced to your own Twenty account. Sending from other team members' mailboxes (e.g., the account owner's email) is on the roadmap.
+
+
+For all the following steps, you can reference variables from previous steps for personalization.
+
+* Enter recipient email address.
+
+
+ Only one recipient is possible at the moment.
+
+
+* Set subject line.
+* Compose message body. You can format links, create numbered list, bullet point lists, add attachments.
+
+
+ Adding HTML signatures is not possible at the moment.
+
+
+### Form
+
+Prompts a form during workflow execution to collect user input. The responses can then be used in subsequent steps to create records, send emails, or execute any other action based on the input.
+
+
+ **Forms are designed for manual triggers only**. For workflows with other triggers (Record Created, Updated, etc.), forms are only accessible via the workflow run interface, which is not the expected user experience. A notifications center will be released in 2026 to properly support forms in automated workflows.
+
+
+**Configuration**:
+
+* Configure the fields that users will be asked to fill. For each field, choose
+ * a type among text, number, date, a given record, a select field. Select fields from all objects are available.
+ * a label
+ * a default value under `Placeholder` (optional)
+* Edit the form title
+
+**Output**: Form responses are available for use in subsequent steps.
+
+**Example**: The "Quick Lead" workflow is available by default in all workspaces, available anywhere in the Command Menu `Cmd + K`.
+
+**How to fill the form**:
+
+* Trigger your manual workflow from the command menu `Cmd K`
+* Fill the form that is displayed in the side panel and click `Submit`.
+
+
+ The fields cannot be made mandatory.
+
+
+
+
+## Integration Actions
+
+### Code
+
+Runs custom JavaScript within your workflow.
+
+**Configuration**:
+
+* Access variables from previous steps. You can edit the variables names dynamically.
+
+
+
+* Write JavaScript code in the editor
+* Return variables for use in subsequent steps
+* Test code directly in the step
+
+
+ If you need to use external API keys in your code, you must input them directly in the function body. You cannot configure API keys elsewhere and reference them in the serverless function.
+
+
+
+ **Working with arrays?** Arrays from external systems or previous steps may come as strings. See [How to handle arrays in Code actions](/l/fr/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions) for the solution.
+
+
+
+ Click the square icon at the top right of the code editor to display it in full screen — helpful since the default editor width is limited.
+
+
+### HTTP Request
+
+Sends a request to an external API as part of your workflow.
+
+
+
+**Configuration**:
+
+* Enter the API endpoint URL. Using parameters from previous steps is possible.
+* Select HTTP method (GET, POST, PUT, PATCH, DELETE)
+* Add required headers and values
+* Provide sample response for structure preview
+
+## AI Actions
+
+### AI Agent - Coming Soon
+
+Runs an AI agent within your workflow to perform intelligent tasks.
+
+**Configuration**:
+
+* **Agent**: Select an existing AI agent or use the default agent
+* **Prompt**: Write the instruction for the AI agent
+* Reference variables from previous steps in the prompt
+
+**What AI Agents can do**:
+
+* Analyze and summarize data
+* Classify or categorize records
+* Generate text content
+* Make decisions based on data
+* Interact with your CRM data using tools
+
+**Output**: The AI agent's response is available for use in subsequent steps. If the agent has a structured output schema, the response will follow that format.
+
+
+ AI Agent actions consume workflow credits based on the AI model used. See [Workflow Credits](/l/fr/user-guide/workflows/capabilities/workflow-credits) for details.
+
+
+
+ AI agents respect role-based permissions. You can assign specific roles to agents under **Settings → Roles** to control what data they can access. See [Permissions](/l/fr/user-guide/permissions-access/capabilities/permissions) for details.
+
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-branches.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-branches.mdx
index ead12adad6..7264d6124f 100644
--- a/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-branches.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-branches.mdx
@@ -1,66 +1,66 @@
---
-title: Branches de flux de travail},{
-description: Créez des chemins parallèles et une logique conditionnelle dans vos flux de travail.
+title: Workflow Branches
+description: Create parallel paths and conditional logic in your workflows.
---
-Les branches vous permettent de scinder votre flux de travail en plusieurs chemins pouvant s’exécuter simultanément ou de façon conditionnelle selon vos données.
+Branches allow you to split your workflow into multiple paths that can run simultaneously or conditionally based on your data.
-## Fonctionnement des branches
+## How Branches Work
-Lorsque vous créez plusieurs connexions à partir d’un seul nœud, chaque chemin devient une branche. Par défaut, **toutes les branches s’exécutent en parallèle** — elles ne s’attendent pas les unes les autres.
+When you create multiple connections from a single node, each path becomes a branch. By default, **all branches execute in parallel**—they don't wait for each other.
-## Création de branches
+## Creating Branches
-### Ajouter une nouvelle branche
+### Add a New Branch
-1. **Cliquez avec le bouton droit sur la zone de travail principale** du flux de travail (et non sur un nœud existant)
-2. Cliquez sur **Ajouter un nœud**
-3. Choisissez le type de nœud pour votre nouvelle branche
-4. Faites glisser une flèche depuis le bas de l’étape précédente vers le haut de cette nouvelle action
-5. Répétez pour ajouter d’autres branches à partir du même nœud
+1. **Right-click on the main canvas** of the workflow (not on an existing node)
+2. Click **Add node**
+3. Choose the node type for your new branch
+4. Drag an arrow from the bottom of the previous step to the top of this new action
+5. Repeat to add more branches from the same node
- Chaque branche est indépendante. L’ajout d’une branche n’affecte pas les autres chemins existants à partir de ce nœud.
+ Each branch is independent. Adding a branch doesn't affect other existing paths from that node.
-### Disposition visuelle
+### Visual Layout
-Les branches apparaissent comme des chemins parallèles dans l’éditeur de flux de travail. Vous pouvez faire glisser les nœuds pour réorganiser la disposition visuelle sans affecter l’exécution.
+Branches appear as parallel paths in the workflow editor. You can drag nodes to rearrange the visual layout without affecting execution.
-## Branches conditionnelles
+## Conditional Branches
-Puisque toutes les branches s’exécutent par défaut, utilisez des nœuds **Filtre** pour contrôler quels chemins s’exécutent réellement :
+Since all branches run by default, use **Filter** nodes to control which paths actually execute:
-| Branche | Condition de filtre | Action |
-| ------- | --------------------- | ---------------------------------- |
-| A | Étape = "Gagnée" | Envoyer un e-mail de félicitations |
-| B | Étape = "Perdue" | Créer une tâche de suivi |
-| C | Étape = "Négociation" | Notifier le responsable |
+| Branch | Filter Condition | Action |
+| ------ | --------------------- | -------------------------- |
+| A | Stage = "Won" | Send congratulations email |
+| B | Stage = "Lost" | Create follow-up task |
+| C | Stage = "Negotiation" | Notify manager |
-1. Créez des branches à partir de votre déclencheur ou action
-2. Ajoutez un nœud **Filtre** comme première étape de chaque branche
-3. Configurez chaque filtre avec des conditions mutuellement exclusives
-4. Ajoutez vos actions après chaque filtre
+1. Create branches from your trigger or action
+2. Add a **Filter** node as the first step of each branch
+3. Configure each filter with mutually exclusive conditions
+4. Add your actions after each filter
-Seules les branches pour lesquelles la condition du filtre est remplie poursuivront l’exécution.
+Only the branch(es) where the filter condition is met will continue executing.
-## Fusion de branches
+## Merging Branches
-**Les branches ne fusionnent pas automatiquement.** Chaque branche s’exécute indépendamment jusqu’à sa fin. Vous avez toute latitude quant à la manière de gérer cela :
+**Branches don't automatically merge.** Each branch runs independently until it ends. You have full flexibility in how you handle this:
-* **Option 1 : Garder les branches séparées**
- Chaque branche gère ses propres actions de suivi de manière indépendante. C’est l’approche la plus simple lorsque les branches n’ont pas besoin de converger.
+* **Option 1: Keep branches separate**
+ Each branch handles its own follow-up actions independently. This is the simplest approach when branches don't need to converge.
-* **Option 2 : Fusionner les branches manuellement**
- Lors de la création de votre flux de travail, vous pouvez connecter manuellement plusieurs branches à la même action en aval. Il suffit de faire glisser des flèches depuis la fin de chaque branche vers un nœud commun.
+* **Option 2: Merge branches manually**
+ When creating your workflow, you can manually connect multiple branches to the same downstream action. Simply drag arrows from the end of each branch to a common node.
- Bien que vous puissiez utiliser un nœud [Delay](/l/fr/user-guide/workflows/capabilities/workflow-actions#delay) pour mettre l’exécution en pause, il n’est pas actuellement configurable pour attendre "jusqu’à ce qu’une autre branche se termine".
+ While you can use a [Delay](/l/fr/user-guide/workflows/capabilities/workflow-actions#delay) node to pause execution, it's not currently configurable to wait "until another branch ends."
-## Contenus associés
+## Related
-* [Comment utiliser les branches dans les flux de travail](/l/fr/user-guide/workflows/capabilities/use-branches-in-workflows) - Guide étape par étape
-* [Actions de flux de travail](/l/fr/user-guide/workflows/capabilities/workflow-actions) - Actions disponibles, y compris Filtre
+* [How to Use Branches in Workflows](/l/fr/user-guide/workflows/capabilities/use-branches-in-workflows) - Step-by-step guide
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions) - Available actions including Filter
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-credits.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-credits.mdx
new file mode 100644
index 0000000000..437aee5822
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-credits.mdx
@@ -0,0 +1,76 @@
+---
+title: Workflow Credits
+description: Understand workflow credit consumption and management.
+---
+
+Workflow credits power your automations in Twenty. Understanding how they work helps you optimize costs and manage your automation budget effectively.
+
+## Credit Allocation
+
+Workflow credits are allocated based on your billing cycle, not your plan tier:
+
+| Billing Cycle | Credits |
+| ------------------------ | --------------------------- |
+| **Monthly subscription** | 5 million credits per month |
+| **Yearly subscription** | 50 million credits per year |
+
+
+ 5 million monthly credits are generous for standard automations. Most teams won't exceed this limit with typical workflow usage. Additional credits are primarily needed for advanced Code actions and AI-powered workflows.
+
+
+## How Credit Consumption Works
+
+Credits are consumed when workflows execute, not when you create them. Each workflow action consumes credits based on its complexity:
+
+### Credit Consumption by Action Type
+
+* **Basic internal operations**: Very low credit consumption
+ * Search Records
+ * Create Record
+ * Update Record
+ * Delete Record
+ * Form actions
+
+* **Complex operations**: Higher credit consumption
+ * Code actions (JavaScript execution)
+ * HTTP Requests to external services
+
+* **AI features**: Higher credit consumption
+ * AI Agent actions consume credits based on the AI model used
+ * More complex prompts and longer outputs use more credits
+
+* **Delay actions**: Minimal credit consumption
+ * The Delay node consumes **1 credit** when it executes
+ * **No credits are consumed** during the wait period
+ * A 5-minute delay costs the same as a 5-day delay
+
+### Real-Time Deduction
+
+Credits are deducted in real-time as workflows execute. This means:
+
+* Draft workflows don't consume credits
+* Only active, running workflows use your credit allocation
+* Failed workflows still consume credits for completed steps
+
+## Managing Credits
+
+### Check Credit Usage
+
+1. Go to **Settings → Billing**
+2. View your current credit consumption and remaining balance
+3. Monitor usage patterns to optimize your workflows
+
+### Purchasing Additional Credits
+
+If you need more credits beyond your plan allocation:
+
+1. Go to **Settings → Billing**
+2. Click on the option to purchase additional credits. Packages of different sizes are available.
+3. Credits are added to your current balance
+
+## Best Practices
+
+* **Batch Processing**: Use bulk operations and Iterator actions efficiently
+* **Manual Trigger Optimization**: For manual triggers, choose `Bulk` availability to process multiple records in a single workflow run
+* Optimize Code actions for efficiency
+* Batch operations to reduce individual action calls
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-runs.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-runs.mdx
new file mode 100644
index 0000000000..665851b020
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-runs.mdx
@@ -0,0 +1,92 @@
+---
+title: Workflow Runs
+description: Monitor and manage workflow executions.
+image: /images/user-guide/workflows/workflow.png
+---
+
+## About Runs
+
+A **Run** is a record of a workflow execution. Every time a workflow is triggered—whether by a record event, schedule, manual action, or webhook—a new run is created.
+
+## Viewing Runs
+
+### From the Workflow Editor
+
+1. Open the workflow you want to monitor
+2. Click the **Runs** panel on the right side
+3. See a list of recent runs with their status
+
+### From the Workflow Runs View
+
+1. Go to **Workflow Runs** in the sidebar
+2. View runs across all workflows
+3. Filter by status, workflow, or date
+
+## Run Statuses
+
+| Status | Description |
+| ------------- | ------------------------------------------------------------------------ |
+| **Running** | Workflow is currently executing |
+| **Completed** | Workflow finished successfully |
+| **Failed** | Workflow encountered an error and stopped |
+| **Waiting** | Workflow is paused (e.g., waiting for a Delay action or Form submission) |
+
+## Run Details
+
+Click on any run to see:
+
+* **Status**: Current state of the run
+* **Started at**: When the run began
+* **Duration**: How long the run took
+* **Trigger data**: The input that started the workflow
+* **Step outputs**: Data returned by each step
+* **Error messages**: If the run failed, what went wrong
+
+## Step-by-Step Execution
+
+Each run shows the progression through your workflow:
+
+1. See which steps completed successfully
+2. Identify where failures occurred
+3. View the data passed between steps
+4. Debug issues by examining step inputs and outputs
+
+## Error Handling
+
+When a run fails:
+
+1. Open the failed run
+2. Find the step that caused the failure
+3. Check the error message for details
+4. Common issues:
+ * Missing required fields
+ * Invalid data format
+ * External API errors
+ * Permission issues
+
+## Re-running Workflows
+
+If a run fails, you can:
+
+* Fix the underlying issue and wait for the next trigger
+* For manual workflows, trigger again with the same or updated data
+* Review the workflow logic to prevent future failures
+
+## Performance Tips
+
+### Managing Run History
+
+* Runs are retained for historical reference
+* Very old runs may be archived automatically
+* Export run data if you need to keep records
+
+### Monitoring Best Practices
+
+* Check runs regularly after activating new workflows
+* Review failed runs to identify patterns
+
+## Related
+
+* [Workflow Triggers](/l/fr/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions)
+* [Workflow Troubleshooting](/l/fr/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-triggers.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-triggers.mdx
new file mode 100644
index 0000000000..24848d084a
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-triggers.mdx
@@ -0,0 +1,136 @@
+---
+title: Workflow Triggers
+description: Learn about the different triggers that start your workflows.
+---
+
+## About Triggers
+
+Workflows always start with a single trigger that defines when the automation should run.
+
+
+
+
+ **Advanced objects are supported!** Beyond standard CRM objects (People, Companies, Opportunities), you can also trigger workflows and perform actions on:
+
+ * Workspace Members
+ * Calendar Events
+ * Messages (Emails)
+ * Tasks, Notes, and many other system objects
+
+ This opens up powerful automations like notifying team members when calendar events are created, or processing incoming emails automatically.
+
+
+## Record is Created
+
+Starts the workflow when a new record is created in a selected object (People, Companies, Opportunities, or any custom object).
+
+**Configuration**: Select the object type to monitor for new records.
+
+
+ * This trigger is great for records created by csv, mailbox and calendar synchronization, API.
+ * **It is not recommended for records created manually**: with this trigger, workflows start as soon as the record is created. Since Twenty UI offers auto-save on the fly (there is not an edit mode and then a validation to save records), the workflow will be triggered before the user inputs all the fields.
+ To trigger this workflow on records created manually, it is recommended to use the trigger `Record is created or updated` instead.
+
+
+## Record is Updated
+
+Starts the workflow when changes are made to an existing record.
+
+**Configuration**:
+
+* Select the object type
+* Optionally specify which fields to monitor for changes
+
+## Record is Updated or Created
+
+Starts the workflow when a record is either created or updated in a selected object.
+
+**Why This Matters**: This trigger is particularly helpful because records created via different methods behave differently:
+
+* **API/CSV imports**: Records are created with all fields populated immediately
+* **Manual creation**: Records are created first, then fields are added in subsequent updates
+
+**Configuration**:
+
+* Select the object type to monitor
+* Optionally specify which fields to monitor for changes
+* The workflow will trigger both on initial creation and any subsequent updates
+
+## Record is Deleted
+
+Starts the workflow when a record is removed from an object.
+
+**Configuration**: Select the object type to monitor for deletions.
+
+## Manual Trigger
+
+Starts the workflow when triggered by a user action. This trigger can be accessed through the `Cmd+K` menu or via a custom button that will be displayed in the top navbar after selecting record(s).
+
+
+
+**Availability Configuration**:
+Choose how the workflow should handle record selection:
+
+* **Global**: No record is required to trigger this workflow. The workflow is triggered from the command menu `Cmd + K` anywhere (from any object) and does not use record(s) as input.
+
+* **Single**: The selected record(s) will be passed to your workflow. This is configured for a given object. Several records can be selected before triggering the workflow. The workflow will run from beginning to end as many times as there are records selected.
+
+
+ **Soft limit: 100 runs/minute**. Beyond this, workflows remain in "Not Started" status and are processed gradually—either by a background job or when another workflow enters the queue. This means you can select more than 100 records with a Single trigger; execution will just be slower.
+
+
+* **Bulk**: The selected record(s) will be passed to your workflow. This is configured for a given object. Several records can be selected before triggering the workflow. The workflow will run once, providing the entire list of records as input. This means the workflow needs to contain an [Iterator action](/l/fr/user-guide/workflows/capabilities/workflow-actions#iterator).
+
+
+ This is more advanced, and best for people who want to optimize the number of workflow runs.
+
+
+
+
+**Additional Configuration**:
+
+* Select the target object (for Single and Bulk availability)
+* Choose a command icon for the workflow trigger
+* Configure navbar placement (Pinned or Not Pinned)
+
+**Access Methods**:
+
+* `Cmd+K` menu to find and launch manual workflows
+* Custom button in the top navbar (if configured)
+
+## Time-Based Trigger: On a Schedule
+
+Starts the workflow on a recurring basis you define.
+
+**Configuration**:
+
+* Select time unit (minutes, hours, days)
+* Enter a value or use custom cron expressions for advanced scheduling
+
+
+ **Timezone**: Scheduled workflows run in **UTC**. When setting hours for daily schedules, convert your local time to UTC.
+
+
+## External Trigger: Webhook
+
+Starts the workflow when a GET or POST request is received from an external service.
+
+
+
+**Configuration**:
+
+* The workflow provides a unique webhook URL—copy this and add it to your external system as the endpoint to call.
+* For POST requests, define the expected body structure so Twenty knows what data to expect. Add here the fields you will receive that will be needed below in your workflow.
+* Configure authentication (coming soon).
+
+## Choosing the Right Trigger
+
+| Use Case | Recommended Trigger |
+| --------------------------- | ---------------------------- |
+| New leads need processing | Record is Created |
+| Data changes need sync | Record is Updated |
+| Import/manual data handling | Record is Updated or Created |
+| Cleanup after deletion | Record is Deleted |
+| User-initiated action | Launch Manually |
+| Recurring reports | On a Schedule |
+| External integration | Webhook or On a Schedule |
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-versions.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-versions.mdx
index 3868531027..c4945856c4 100644
--- a/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-versions.mdx
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-versions.mdx
@@ -1,85 +1,85 @@
---
-title: Versions de Workflow
-description: Gérer les versions et les brouillons de workflows.
+title: Workflow Versions
+description: Manage workflow versions and drafts.
image: /images/user-guide/workflows/workflow.png
---
-## À propos des versions
+## About Versions
-Chaque fois que vous activez un workflow, une nouvelle version est créée. Cela vous permet de suivre les modifications dans le temps et de revenir aux configurations précédentes si nécessaire.
+Every time you activate a workflow, a new version is created. This allows you to track changes over time and revert to previous configurations if needed.
-## Statuts des versions
+## Version Statuses
-| Statut | Description |
-| ------------- | ------------------------------------------------- |
-| **Brouillon** | En cours d'édition, pas encore publié |
-| **Actif** | Version active répondant aux déclencheurs |
-| **Désactivé** | Auparavant actif, mais arrêté manuellement |
-| **Archivé** | Versions antérieures conservées pour l'historique |
+| Status | Description |
+| --------------- | -------------------------------------- |
+| **Draft** | Being edited, not yet published |
+| **Active** | Live version responding to triggers |
+| **Deactivated** | Previously active but manually stopped |
+| **Archived** | Past versions kept for history |
-## Travailler avec des brouillons
+## Working with Drafts
-Lorsque vous modifiez un workflow actif, vos modifications sont enregistrées en tant que **brouillon**. La version active continue de s'exécuter pendant que vous travaillez sur des mises à jour.
+When you edit an active workflow, your changes are saved as a **draft**. The active version continues to run while you work on updates.
-Une fois vos modifications terminées, vous pouvez :
+Once you're done editing, you can:
-* **Activer** : Publier le brouillon comme nouvelle version active (la version précédente est archivée)
-* **Abandonner** : Supprimer le brouillon et conserver la version active actuelle
+* **Activate**: Publish the draft as the new active version (the previous version is archived)
+* **Discard**: Delete the draft and keep the current active version
-## Historique des versions
+## Version History
-### Afficher les versions précédentes
+### Viewing Past Versions
-1. Ouvrez le workflow
-2. Cliquez sur l'onglet **Versions**
-3. Affichez toutes les versions précédentes avec leurs horodatages
+1. Open the workflow
+2. Click the **Versions** tab
+3. See all previous versions with timestamps
-### Restaurer une version
+### Restoring a Version
-1. Trouvez la version que vous souhaitez restaurer
-2. Cliquez sur **Utiliser comme brouillon**
-3. La version est copiée dans un nouveau brouillon
-4. Effectuez les mises à jour nécessaires
-5. Activez lorsque vous êtes prêt
+1. Find the version you want to restore
+2. Click **Use as draft**
+3. The version is copied to a new draft
+4. Make any necessary updates
+5. Activate when ready
-## Meilleures pratiques
+## Best Practices
-### Gestion des versions
+### Version Management
-* N'activez que lorsque vous êtes prêt pour la mise en production
-* Conservez des modifications significatives d'une version à l'autre.
-* Documentez les modifications majeures dans les noms ou les descriptions de workflows
-* Testez en mode brouillon avant d'activer
+* Activate only when ready for production
+* Keep meaningful changes between versions
+* Document major changes in workflow names or descriptions
+* Test in draft mode before activating
-### Annulation des modifications
+### Reverting Changes
-* Si une nouvelle version pose des problèmes, restaurez la version précédente
-* Utilisez l'historique des versions pour suivre ce qui a changé
-* Testez toujours les versions restaurées avant de les activer
+* If a new version causes issues, restore the previous version
+* Use the version history to track what changed
+* Always test restored versions before activating
-## Workflows courants
+## Common Workflows
-### Modification rapide
+### Quick Edit
-1. Apportez des modifications mineures à un workflow actif
-2. Testez en mode brouillon
-3. Activez la nouvelle version
+1. Make minor changes to an active workflow
+2. Test in draft mode
+3. Activate the new version
-### Révision majeure
+### Major Revision
-1. Utilisez la version précédente comme point de départ
-2. Apportez des modifications importantes dans un brouillon
-3. Testez minutieusement tous les scénarios
-4. Activez lorsque vous êtes confiant
+1. Use the previous version as a starting point
+2. Make significant changes in draft
+3. Thoroughly test all scenarios
+4. Activate when confident
-### Retour en arrière
+### Rollback
-1. Identifiez le problème avec la version actuelle
-2. Trouvez la dernière version fonctionnelle dans l'historique
-3. Cliquez sur **Utiliser comme brouillon**
-4. Activez pour rétablir l'ancien comportement
+1. Identify the issue with the current version
+2. Find the last working version in history
+3. Click **Use as draft**
+4. Activate to restore the old behavior
-## Articles connexes
+## Related
-* [Prise en main des workflows](/l/fr/user-guide/workflows/overview)
-* [Exécutions de workflows](/l/fr/user-guide/workflows/capabilities/workflow-runs)
+* [Getting Started with Workflows](/l/fr/user-guide/workflows/overview)
+* [Workflow Runs](/l/fr/user-guide/workflows/capabilities/workflow-runs)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx
new file mode 100644
index 0000000000..bbc096202f
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx
@@ -0,0 +1,82 @@
+---
+title: Handle Arrays in Code Actions
+description: Learn how to properly handle array inputs in workflow Code actions.
+---
+
+When working with arrays in Code actions, you may encounter two common challenges:
+
+1. **Arrays passed as strings** — data from external systems or previous steps arrives as a string instead of an actual array
+2. **Can't select individual items** — you can only select the entire array, not specific fields within it
+
+Both can be solved with a Code node.
+
+## Parsing Arrays from Strings
+
+Arrays are often passed between workflow steps as strings or JSON rather than native arrays. This happens when:
+
+* Receiving data from external APIs via HTTP Request
+* Processing webhook payloads
+* Passing data between workflow steps
+
+**Solution**: Add this pattern at the start of your Code action:
+
+```javascript
+export const main = async (params: {
+ users: any;
+}): Promise => {
+ const { users } = params;
+
+ // Handle input that may come as a string or an array
+ const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;
+
+ // Now you can safely work with usersFormatted as an array
+ return {
+ users: usersFormatted.map((user) => ({
+ ...user,
+ activityStatus: String(user.activityStatus).toUpperCase(),
+ })),
+ };
+};
+```
+
+The key line `typeof users === "string" ? JSON.parse(users) : users` checks if the input is a string, parses it if needed, or uses it directly if it's already an array.
+
+## Extracting Individual Fields from Arrays
+
+A webhook might return an array like `answers: [...]`, but in subsequent workflow steps you can only select the **entire array** — not individual items within it.
+
+**Solution**: Add a Code node to extract specific fields and return them as a structured object:
+
+```javascript
+export const main = async (params: {
+ answers: any;
+}): Promise => {
+ const { answers } = params;
+
+ // Handle input that may come as a string or an array
+ const answersFormatted = typeof answers === "string"
+ ? JSON.parse(answers)
+ : answers;
+
+ // Extract specific fields from the array
+ const firstname = answersFormatted[0]?.text || "";
+ const name = answersFormatted[1]?.text || "";
+
+ return {
+ answer: {
+ firstname,
+ name
+ }
+ };
+};
+```
+
+The Code node returns a structured object instead of an array. In subsequent steps, you can now select individual fields like `answer.firstname` and `answer.name` from the variable picker.
+
+
+ We're actively working on making array handling easier in future updates.
+
+
+
+ Click the square icon at the top right of the code editor to display it in full screen — helpful since the default editor width is limited.
+
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx
new file mode 100644
index 0000000000..b738f0c1d6
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx
@@ -0,0 +1,182 @@
+---
+title: Bring Product Data into Twenty
+description: Sync product catalog data from a data warehouse into your CRM on a schedule.
+---
+
+Use this pattern to keep Twenty in sync with product data from your data warehouse (e.g., Snowflake, BigQuery, PostgreSQL).
+
+## Workflow Structure
+
+1. **Trigger**: On a Schedule
+2. **Code**: Query your data warehouse
+3. **Code** (optional): Format data as array
+4. **Iterator**: Loop through each product
+5. **Upsert Record**: Create or update in Twenty
+
+
+
+## Step 1: Schedule the Trigger
+
+Set the workflow to run at a frequency matching your data freshness needs:
+
+* Every 5 minutes for near real-time sync
+* Every hour for less critical data
+* Daily for batch updates
+
+## Step 2: Query Your Data Warehouse
+
+Add a **Code** action to fetch recent data:
+
+```javascript
+export const main = async () => {
+ const intervalMinutes = 10; // Match your schedule frequency
+ const cutoffTime = new Date(Date.now() - intervalMinutes * 60 * 1000).toISOString();
+
+ // Replace with your actual data warehouse connection
+ const response = await fetch("https://your-warehouse-api.com/query", {
+ method: "POST",
+ headers: {
+ "Authorization": "Bearer YOUR_API_KEY",
+ "Content-Type": "application/json"
+ },
+ body: JSON.stringify({
+ query: `
+ SELECT id, name, sku, price, stock_quantity, updated_at
+ FROM products
+ WHERE updated_at >= '${cutoffTime}'
+ `
+ })
+ });
+
+ const data = await response.json();
+ return { products: data.results };
+};
+```
+
+
+ Filter by `updated_at >= last X minutes` to retrieve only recently changed records. This keeps the sync efficient.
+
+
+## Step 3: Format Data (Optional)
+
+If your warehouse returns data in a format that needs transformation, add another **Code** action. Common transformations include type conversions, field renaming, and data cleanup.
+
+### Example: User Data with Boolean and Status Fields
+
+```javascript
+export const main = async (params: {
+ users: any;
+}): Promise => {
+ const { users } = params;
+ const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;
+
+ // Convert string "true"/"false" to actual booleans
+ const toBool = (v: any) => v === true || v === "true";
+
+ return {
+ users: usersFormatted.map((user) => ({
+ ...user,
+ activityStatus: String(user.activityStatus).toUpperCase(),
+ isActiveLast30d: toBool(user.isActiveLast30d),
+ isActiveLast7d: toBool(user.isActiveLast7d),
+ isActiveLast24h: toBool(user.isActiveLast24h),
+ isTwenty: toBool(user.isTwenty),
+ })),
+ };
+};
+```
+
+### Example: Product Data with Type Conversions
+
+```javascript
+export const main = async (params: { products: any }) => {
+ const products = typeof params.products === "string"
+ ? JSON.parse(params.products)
+ : params.products;
+
+ return {
+ products: products.map(product => ({
+ externalId: product.id,
+ name: product.name,
+ sku: product.sku,
+ price: parseFloat(product.price), // String → Number
+ stockQuantity: parseInt(product.stock_quantity),
+ isActive: product.status === "active" // String → Boolean
+ }))
+ };
+};
+```
+
+### Example: Date and Currency Formatting
+
+```javascript
+export const main = async (params: { deals: any }) => {
+ const deals = typeof params.deals === "string"
+ ? JSON.parse(params.deals)
+ : params.deals;
+
+ return {
+ deals: deals.map(deal => ({
+ ...deal,
+ // Convert Unix timestamp to ISO date
+ closedAt: deal.closed_timestamp
+ ? new Date(deal.closed_timestamp * 1000).toISOString()
+ : null,
+ // Ensure amount is a number (remove currency symbols)
+ amount: parseFloat(String(deal.amount).replace(/[^0-9.-]/g, "")),
+ // Normalize stage names
+ stage: deal.stage?.toLowerCase().replace(/_/g, " ")
+ }))
+ };
+};
+```
+
+### Common Transformations
+
+| Source Format | Target Format | Code |
+| -------------------- | ---------------- | ---------------------------------------- |
+| `"true"` / `"false"` | `true` / `false` | `v === true \|\| v === "true"` |
+| `"123.45"` | `123.45` | `parseFloat(value)` |
+| `"active"` | `"ACTIVE"` | `value.toUpperCase()` |
+| `1704067200` (Unix) | ISO date | `new Date(v * 1000).toISOString()` |
+| `"$1,234.56"` | `1234.56` | `parseFloat(v.replace(/[^0-9.-]/g, ""))` |
+| `null` / `undefined` | `""` | `value \|\| ""` |
+
+## Step 4: Iterate Through Products
+
+Add an **Iterator** action:
+
+* Input: `{{code.products}}`
+
+This loops through each product in the array.
+
+## Step 5: Upsert Each Record
+
+Inside the iterator, add an **Upsert Record** action:
+
+| Setting | Value |
+| ------------ | -------------------------------------- |
+| **Object** | Your custom Product object |
+| **Match by** | External ID or SKU (unique identifier) |
+| **Name** | `{{iterator.item.name}}` |
+| **SKU** | `{{iterator.item.sku}}` |
+| **Price** | `{{iterator.item.price}}` |
+
+
+ Use **Upsert** (update or create) instead of building separate branches for create vs. update. It's faster to build and easier to debug.
+
+
+## Example Use Cases
+
+| Source | Data |
+| ----------------------- | ----------------------------------- |
+| **ERP system** | Product catalog, pricing, inventory |
+| **E-commerce platform** | Orders, customers, product updates |
+| **Data warehouse** | Aggregated metrics, enriched data |
+| **Inventory system** | Stock levels, reorder alerts |
+
+## Related
+
+* [Workflow Triggers](/l/fr/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions)
+* [Handle Arrays in Code Actions](/l/fr/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx
new file mode 100644
index 0000000000..aab9962d1d
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx
@@ -0,0 +1,130 @@
+---
+title: Bring Typeform Submissions into Twenty
+description: Handle Typeform's webhook payload to create leads from form submissions.
+---
+
+For standard webhook setup, see [Set Up a Webhook Trigger](/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger). This article covers the specific handling required for Typeform's custom payload structure.
+
+### Step 1: Create a Webhook Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Select **Webhook** as the trigger
+4. Copy the webhook URL
+
+### Step 2: Configure Typeform
+
+1. In Typeform, open your form
+2. Go to **Connect → Webhooks**
+3. Paste your Twenty webhook URL
+4. Save
+
+### Step 3: Understand the Typeform Payload
+
+Typeform sends a nested JSON structure. Here's a simplified example:
+
+```json
+{
+ "event_type": "form_response",
+ "form_response": {
+ "form_id": "abc123",
+ "submitted_at": "2025-01-15T10:30:00Z",
+ "answers": [
+ {
+ "text": "Jane",
+ "type": "text",
+ "field": { "id": "field1", "type": "short_text", "title": "First Name" }
+ },
+ {
+ "text": "Smith",
+ "type": "text",
+ "field": { "id": "field2", "type": "short_text", "title": "Last Name" }
+ },
+ {
+ "text": "Acme Corp",
+ "type": "text",
+ "field": { "id": "field3", "type": "short_text", "title": "Company" }
+ },
+ {
+ "email": "jane@acme.com",
+ "type": "email",
+ "field": { "id": "field4", "type": "email", "title": "Email" }
+ },
+ {
+ "type": "choice",
+ "field": { "id": "field5", "type": "dropdown", "title": "Team Size" },
+ "choice": { "label": "10-50" }
+ }
+ ]
+ }
+}
+```
+
+Key things to note:
+
+* Form data is nested under `form_response`
+* **Answers are returned as an array**, not as named fields
+* Each answer includes the field type and title for reference
+
+### Step 4: Extract Fields from the Answers Array
+
+Since `answers` is an array, you can only select the entire array in subsequent steps — not individual fields. Add a **Code** action to extract the fields you need:
+
+```javascript
+export const main = async (params: {
+ answers: any;
+}): Promise => {
+ const { answers } = params;
+
+ // Handle input that may come as a string or an array
+ const answersFormatted = typeof answers === "string"
+ ? JSON.parse(answers)
+ : answers;
+
+ // Extract fields by position or by finding the field type
+ const firstName = answersFormatted[0]?.text || "";
+ const lastName = answersFormatted[1]?.text || "";
+ const company = answersFormatted[2]?.text || "";
+ const email = answersFormatted.find(a => a.type === "email")?.email || "";
+ const teamSize = answersFormatted.find(a => a.type === "choice")?.choice?.label || "";
+
+ return {
+ contact: {
+ firstName,
+ lastName,
+ company,
+ email,
+ teamSize
+ }
+ };
+};
+```
+
+Now in subsequent steps, you can select `contact.firstName`, `contact.email`, etc. from the variable picker.
+
+
+ For more details on handling arrays in Code actions, see [Handle Arrays in Code Actions](/l/fr/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
+
+
+### Step 5: Create the Record
+
+Add a **Create Record** action:
+
+| Field | Value |
+| -------------- | ---------------------------------------------------- |
+| **Object** | People |
+| **First Name** | `{{code.contact.firstName}}` |
+| **Last Name** | `{{code.contact.lastName}}` |
+| **Email** | `{{code.contact.email}}` |
+| **Company** | Search or create based on `{{code.contact.company}}` |
+
+### Step 6: Test and Activate
+
+1. Submit a test response in Typeform
+2. Check the workflow run to verify data was captured
+3. Activate the workflow
+
+## Related
+
+* [Set Up a Webhook Trigger](/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger)
+* [Handle Arrays in Code Actions](/l/fr/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx
new file mode 100644
index 0000000000..5ac2e95681
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx
@@ -0,0 +1,143 @@
+---
+title: Generate a Quote or Invoice from Twenty
+description: Automatically create invoices in external tools when deals close.
+---
+
+Automatically send deal data to your invoicing system (Stripe, QuickBooks, Xero, etc.) when an opportunity is won.
+
+## Workflow Structure
+
+1. **Trigger**: Record is Updated (Opportunity)
+2. **Filter**: Stage = Closed Won
+3. **Search Record**: Get Company details
+4. **Code** (optional): Format payload
+5. **HTTP Request**: Send to invoicing system
+
+## Step 1: Set Up the Trigger
+
+1. Create a new workflow
+2. Select **Record is Updated** trigger
+3. Choose **Opportunity** as the object
+
+## Step 2: Filter for Closed Won
+
+Add a **Filter** action to only continue when the deal is won:
+
+| Setting | Value |
+| ------------- | --------------------------------- |
+| **Field** | Stage |
+| **Condition** | Equals |
+| **Value** | `CLOSED_WON` (or your stage name) |
+
+
+ The trigger fires on any Opportunity update. The Filter ensures the workflow only continues when the stage changes to Closed Won.
+
+
+## Step 3: Get Company Details
+
+The Opportunity record may not include all Company fields you need for the invoice. Add a **Search Record** action:
+
+| Setting | Value |
+| ------------ | ---------------------------------------- |
+| **Object** | Company |
+| **Match by** | ID equals `{{trigger.object.companyId}}` |
+
+This retrieves the full Company record with billing address, tax ID, etc.
+
+## Step 4: Format the Payload (Optional)
+
+If your invoicing system expects a specific format, add a **Code** action:
+
+```javascript
+export const main = async (params: {
+ opportunity: any;
+ company: any;
+}): Promise => {
+ const { opportunity, company } = params;
+
+ return {
+ invoice: {
+ // Customer info from Company
+ customer_name: company.name,
+ customer_email: company.email || "",
+ billing_address: {
+ line1: company.address?.street || "",
+ city: company.address?.city || "",
+ postal_code: company.address?.postalCode || "",
+ country: company.address?.country || ""
+ },
+ tax_id: company.taxId || null,
+
+ // Invoice details from Opportunity
+ amount: opportunity.amount,
+ currency: opportunity.currency || "USD",
+ description: `Invoice for ${opportunity.name}`,
+ due_days: 30,
+
+ // Reference back to Twenty
+ metadata: {
+ opportunity_id: opportunity.id,
+ company_id: company.id
+ }
+ }
+ };
+};
+```
+
+## Step 5: Send to Invoicing System
+
+Add an **HTTP Request** action:
+
+| Setting | Value |
+| ----------- | ----------------------------------------- |
+| **Method** | POST |
+| **URL** | Your invoicing API endpoint |
+| **Headers** | `Authorization: Bearer YOUR_API_KEY` |
+| **Body** | `{{code.invoice}}` or map fields directly |
+
+### Example: Stripe Invoice
+
+```
+POST https://api.stripe.com/v1/invoices
+Headers:
+ Authorization: Bearer sk_live_xxx
+ Content-Type: application/x-www-form-urlencoded
+
+Body:
+ customer: {{company.stripeCustomerId}}
+ collection_method: send_invoice
+ days_until_due: 30
+```
+
+### Example: QuickBooks Invoice
+
+```
+POST https://quickbooks.api.intuit.com/v3/company/{realmId}/invoice
+Headers:
+ Authorization: Bearer YOUR_ACCESS_TOKEN
+ Content-Type: application/json
+
+Body: {{code.invoice}}
+```
+
+## Complete Workflow Summary
+
+| Step | Action | Purpose |
+| ---- | ----------------------- | ------------------------------------ |
+| 1 | Trigger: Record Updated | Fires when any Opportunity changes |
+| 2 | Filter | Only proceed if Stage = Closed Won |
+| 3 | Search Record | Get full Company details for billing |
+| 4 | Code | Format data for invoicing API |
+| 5 | HTTP Request | Create invoice in external system |
+
+## Tips
+
+* **Store external IDs**: Save the invoice ID returned by the API back to the Opportunity using an **Update Record** action
+* **Error handling**: Add a branch to send a notification if the HTTP request fails
+* **Test first**: Use your invoicing system's sandbox/test mode before going live
+
+## Related
+
+* [Workflow Triggers](/l/fr/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions)
+* [Closed Won Automations](/l/fr/user-guide/workflows/how-tos/crm-automations/closed-won-automations)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx
new file mode 100644
index 0000000000..914d076f4f
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx
@@ -0,0 +1,171 @@
+---
+title: Set Up a Webhook Trigger
+description: Receive data from external services to trigger workflows.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Webhook triggers allow external services to start your workflows by sending data to a unique URL. Use them to connect forms, third-party apps, and custom integrations.
+
+## When to Use Webhooks
+
+| Use Case | Example |
+| ----------------------- | --------------------------------------- |
+| **Web forms** | Contact form submissions create leads |
+| **Third-party apps** | Stripe payment → create customer record |
+| **Custom integrations** | Your app → Twenty automation |
+| **No-code tools** | Zapier, Make, n8n connections |
+
+## Step-by-Step Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it (e.g., "Website Form Submission")
+
+### Step 2: Configure the Webhook Trigger
+
+1. Click on the trigger block
+2. Select **Webhook**
+3. You'll receive a unique webhook URL like:
+ ```
+ https://api.twenty.com/webhooks/workflow/abc123...
+ ```
+4. Copy this URL—you'll need it for your external service
+
+### Step 3: Define Expected Data Structure
+
+For **POST** requests, define the expected body structure:
+
+1. Click **Define expected body**
+2. Enter a sample JSON that matches what your service will send:
+
+```json
+{
+ "firstName": "John",
+ "lastName": "Doe",
+ "email": "john@example.com",
+ "company": "Acme Inc",
+ "message": "Interested in your product"
+}
+```
+
+3. Click **Save**—this creates variables you can use in subsequent steps
+
+### Step 4: Add Actions
+
+Now add actions that use the webhook data:
+
+**Example: Create a Person record**
+
+1. Add **Create Record** action
+2. Select **People** object
+3. Map fields:
+
+| Field | Value |
+| ---------- | ---------------------------------------------------- |
+| First Name | `{{trigger.body.firstName}}` |
+| Last Name | `{{trigger.body.lastName}}` |
+| Email | `{{trigger.body.email}}` |
+| Company | Search or create based on `{{trigger.body.company}}` |
+
+### Step 5: Test the Webhook
+
+Before activating, test your webhook:
+
+**Using cURL**:
+
+```bash
+curl -X POST https://api.twenty.com/webhooks/workflow/abc123... \
+ -H "Content-Type: application/json" \
+ -d '{"firstName":"Test","lastName":"User","email":"test@example.com"}'
+```
+
+**Using Postman or similar**:
+
+1. Create a POST request to your webhook URL
+2. Set Content-Type header to `application/json`
+3. Add your test JSON body
+4. Send and check workflow runs
+
+### Step 6: Activate
+
+Once tested, click **Activate** to make the workflow live.
+
+## Handling Different Data Structures
+
+### Nested Data
+
+If your webhook sends nested data:
+
+```json
+{
+ "contact": {
+ "name": "John Doe",
+ "email": "john@example.com"
+ },
+ "source": "website"
+}
+```
+
+Reference with: `{{trigger.body.contact.email}}`
+
+### Arrays
+
+If data includes arrays:
+
+```json
+{
+ "items": [
+ {"name": "Product A", "qty": 2},
+ {"name": "Product B", "qty": 1}
+ ]
+}
+```
+
+How you handle arrays depends on your use case:
+
+**Unknown number of items → Use Iterator**
+
+If you need to process each item in the array (e.g., create a record for each), add a **Code** action to parse the array, then use **Iterator**:
+
+```javascript
+export const main = async (params: { items: any }) => {
+ const items = typeof params.items === "string"
+ ? JSON.parse(params.items)
+ : params.items;
+ return { items };
+};
+```
+
+Then use Iterator to loop through: `{{code.items}}`
+
+**Known/specific fields → Extract to named fields**
+
+If the array contains specific fields you want to access individually (e.g., form answers where position 0 is always "first name", position 1 is always "last name"), add a **Code** action to extract them:
+
+```javascript
+export const main = async (params: { items: any }) => {
+ const items = typeof params.items === "string"
+ ? JSON.parse(params.items)
+ : params.items;
+
+ return {
+ product: {
+ name: items[0]?.name || "",
+ qty: items[0]?.qty || 0
+ }
+ };
+};
+```
+
+Now you can select `product.name` and `product.qty` individually in subsequent steps.
+
+
+ For more details on handling arrays, see [Handle Arrays in Code Actions](/l/fr/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
+
+
+## Related
+
+* [Workflow Triggers](/l/fr/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx
new file mode 100644
index 0000000000..c20854c45f
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx
@@ -0,0 +1,179 @@
+---
+title: Closed Won Automations
+description: Automate post-win activities when opportunities close.
+---
+
+When a deal closes, multiple things need to happen: update company status, notify team members, create onboarding tasks. Automate all of this with a single workflow.
+
+## The Problem
+
+When an opportunity moves to "Closed Won":
+
+* Company type needs to change from "Prospect" to "Customer"
+* Onboarding tasks need to be created
+* Customer success team needs to be notified
+* Sales rep needs confirmation
+
+Doing this manually is time-consuming and error-prone.
+
+## The Solution
+
+Create a workflow that handles all post-win activities automatically.
+
+## Complete Workflow Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it "Deal Won - Post-Win Automation"
+
+### Step 2: Configure the Trigger
+
+1. Select **Record is Updated**
+2. Choose **Opportunities**
+3. Under "Fields to monitor", select **Stage**
+
+### Step 3: Add Stage Filter
+
+1. Add **Filter** action
+2. Condition: `{{trigger.object.stage}}` equals "Closed Won"
+
+### Step 4: Update Company Type
+
+1. Add **Update Record** action
+2. Configure:
+
+| Field | Value |
+| ------------------- | ------------------------------- |
+| **Object** | Companies |
+| **Record** | `{{trigger.object.company.id}}` |
+| **Type** | Customer |
+| **First Deal Date** | `{{trigger.object.closedAt}}` |
+| **Account Owner** | `{{trigger.object.owner.id}}` |
+
+### Step 5: Create Onboarding Task
+
+1. Add **Create Record** action
+2. Configure:
+
+| Field | Value |
+| ----------------------- | ---------------------------------------------------------------------------------------------------- |
+| **Object** | Tasks |
+| **Title** | `Onboarding: {{trigger.object.name}}` |
+| **Assignee** | Customer Success team member |
+| **Due Date** | 3 days from now |
+| **Priority** | High |
+| **Related Company** | `{{trigger.object.company.id}}` |
+| **Related Opportunity** | `{{trigger.object.id}}` |
+| **Description** | `New customer onboarding for {{trigger.object.company.name}}. Deal value: {{trigger.object.amount}}` |
+
+### Step 6: Notify Customer Success
+
+1. Add **Send Email** action
+2. Configure:
+
+| Field | Value |
+| ----------- | -------------------------------------------------- |
+| **To** | customer-success@yourcompany.com |
+| **Subject** | `🎉 New Customer: {{trigger.object.company.name}}` |
+| **Body** | See example below |
+
+**Email body example**:
+
+```
+Hi CS Team,
+
+We have a new customer!
+
+Company: {{trigger.object.company.name}}
+Deal: {{trigger.object.name}}
+Value: {{trigger.object.amount}}
+Sales Rep: {{trigger.object.owner.name}}
+Close Date: {{trigger.object.closedAt}}
+
+An onboarding task has been created automatically.
+
+Let's give them a great start!
+```
+
+### Step 7: Confirm to Sales Rep
+
+1. Add another **Send Email** action
+2. Configure:
+
+| Field | Value |
+| ----------- | -------------------------------------------------------------------------------------------------------------------- |
+| **To** | `{{trigger.object.owner.email}}` |
+| **Subject** | `✅ Deal Closed: {{trigger.object.name}}` |
+| **Body** | Congratulations! Your deal has been processed. The customer success team has been notified and onboarding has begun. |
+
+### Step 8: Test and Activate
+
+1. Test by moving a test opportunity to "Closed Won"
+2. Verify:
+ * Company type changed to "Customer"
+ * Onboarding task created
+ * CS team received email
+ * Sales rep received confirmation
+3. Activate when ready
+
+## Handling Closed Lost
+
+Create a similar workflow for lost deals:
+
+### Trigger
+
+* Record is Updated (Opportunities, Stage = "Closed Lost")
+
+### Actions
+
+1. **Create Record**: Task for "Lost Deal Analysis"
+2. **Update Record**: Add lost reason to company record
+3. **Send Email**: Notify manager of lost deal
+
+## Advanced: Multi-Step Onboarding
+
+For complex onboarding, create multiple tasks:
+
+```javascript
+export const main = async (params) => {
+ const tasks = [
+ { title: "Welcome call", daysFromNow: 1, assignee: "CS" },
+ { title: "Send onboarding materials", daysFromNow: 2, assignee: "CS" },
+ { title: "Technical setup", daysFromNow: 5, assignee: "Support" },
+ { title: "30-day check-in", daysFromNow: 30, assignee: "CS" }
+ ];
+
+ return { tasks };
+};
+```
+
+Use **Iterator** to create each task from the array.
+
+## Customization Ideas
+
+### Keep your other tools up-to-date
+
+* Create customer in billing system with an **HTTP Request**
+
+### Conditional Actions
+
+Use **Filter** actions to:
+
+* Different onboarding for enterprise vs SMB
+* Different assignees based on region
+* Skip notifications for small deals
+
+### Include Deal Details
+
+Use **Code** action to format:
+
+* Deal summary documents
+* Handoff notes for CS team
+* Custom onboarding checklists
+
+## Related
+
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/fr/user-guide/workflows/capabilities/send-emails-from-workflows)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx
new file mode 100644
index 0000000000..816203370d
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx
@@ -0,0 +1,136 @@
+---
+title: Detect Stale Opportunities
+description: Automatically notify managers when opportunities haven't been updated.
+---
+
+Keep your pipeline healthy by alerting managers when opportunities go stale. This workflow checks for opportunities that haven't been updated in a specified number of days.
+
+## The Problem
+
+Opportunities sitting without updates lead to:
+
+* Deals going cold
+* Unreliable forecasts
+* Lost revenue
+
+## The Solution
+
+Create a scheduled workflow that finds stale opportunities and emails their managers.
+
+## Step-by-Step Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it "Stale Opportunity Alert"
+
+### Step 2: Configure the Trigger
+
+1. Select **On a Schedule**
+2. Set to run daily (e.g., every day at 8 AM)
+
+### Step 3: Search for Stale Opportunities
+
+1. Add **Search Records** action
+2. Configure:
+
+| Field | Value |
+| ---------- | ----------------------------------------------- |
+| **Object** | Opportunities |
+| **Filter** | Updated At is before (today - 7 days) |
+| **Filter** | Stage is not "Closed Won" AND not "Closed Lost" |
+| **Limit** | 100 |
+
+### Step 4: Check If Any Found
+
+1. Add **Filter** action
+2. Condition: `{{searchRecords.length}}` is greater than 0
+3. If no stale opportunities, the workflow stops here
+
+### Step 5: Format the Alert (Code Action)
+
+Add a **Code** action to format the email:
+
+```javascript
+export const main = async (params) => {
+ const opportunities = params.opportunities;
+
+ // Group opportunities by owner
+ const byOwner = {};
+ opportunities.forEach(opp => {
+ const ownerEmail = opp.owner?.email || 'unassigned';
+ if (!byOwner[ownerEmail]) {
+ byOwner[ownerEmail] = [];
+ }
+ byOwner[ownerEmail].push({
+ name: opp.name,
+ amount: opp.amount,
+ lastUpdated: opp.updatedAt,
+ stage: opp.stage
+ });
+ });
+
+ // Format summary for manager
+ let summary = "Stale Opportunities Report\n\n";
+ Object.entries(byOwner).forEach(([owner, opps]) => {
+ summary += `${owner}: ${opps.length} stale opportunities\n`;
+ opps.forEach(opp => {
+ summary += ` - ${opp.name} (${opp.stage})\n`;
+ });
+ summary += "\n";
+ });
+
+ return {
+ summary,
+ totalCount: opportunities.length
+ };
+};
+```
+
+### Step 6: Send Alert Email
+
+Add **Send Email** action:
+
+| Field | Value |
+| ----------- | ----------------------------------------------------------- |
+| **To** | sales-manager@yourcompany.com |
+| **Subject** | `🚨 {{code.totalCount}} Stale Opportunities Need Attention` |
+| **Body** | `{{code.summary}}` |
+
+### Step 7: Test and Activate
+
+1. Click **Test** to run the workflow
+2. Check that the email contains the right data
+3. Activate when ready
+
+## Customization Options
+
+### Change Staleness Threshold
+
+Modify the Search Records filter to change from 7 days to your preferred period:
+
+* 3 days for high-velocity sales
+* 14 days for enterprise deals
+* 30 days for long sales cycles
+
+### Alert Individual Reps
+
+Instead of one manager email, use **Iterator** to send personalized emails to each rep about their own stale deals.
+
+### Add Escalation
+
+Create multiple workflows with increasing severity:
+
+1. Day 7: Email to rep
+2. Day 14: Email to rep + manager
+3. Day 21: Create task for manager to intervene
+
+### Include in Slack
+
+Use **HTTP Request** to post to a Slack webhook instead of or in addition to email.
+
+## Related
+
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/fr/user-guide/workflows/capabilities/send-emails-from-workflows)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
new file mode 100644
index 0000000000..c5eab95dbf
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
@@ -0,0 +1,74 @@
+---
+title: Display Number of Emails Received
+description: Create a workflow to automatically count and display the number of emails received from each contact.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+## Overview
+
+This workflow triggers every time a new email is received and updates a custom field on the Person record with the total count of emails from that sender.
+
+## Prerequisites
+
+Before setting up this workflow, create a custom field on the **People** object:
+
+1. Go to **Settings → Data Model → People**
+2. Add a new **Number** field
+3. Name it something like "Number of emails received from this person"
+
+## Step-by-Step Setup
+
+
+
+### Step 1: Configure the Trigger
+
+1. Go to **Workflows** and create a new workflow
+2. Select **Record is Created** as the trigger
+3. Choose **Message Participants** (available under Advanced objects)
+
+
+ A Message Participant is a combination of a message ID and a person ID, creating one unique record per message. This is easier to track than Messages directly because we can access the `handle` field, which contains the sender's (or recipient's) email address.
+
+
+### Step 2: Filter on Role
+
+1. Add a **Filter** action
+2. Set the condition: **Role** equals **FROM**
+
+This ensures you only count messages sent by this person, not messages sent to them.
+
+### Step 3: Search All Message Participants with Same Handle
+
+1. Add a **Search Records** action
+2. Select **Message Participants** as the object
+3. Add filters: **Handle** equals the handle from the trigger (the sender's email address) and **Role** equals **FROM**
+4. Increase the **Limit** from 1 to **200** (the maximum)
+
+This finds all messages from this email address to get the total count.
+
+
+ The Search Records action is limited to returning 200 records maximum. However, since you're only using the `totalCount` value (not the individual records), this step will return the total number of emails sent by this person.
+
+
+### Step 4: Update the Person Record with a Create or Update Record action
+
+1. Add a **Create or Update Record** action
+
+
+ Use **Upsert Record** instead of **Update Record** here. This lets you identify the person by their email address (the `handle` field) rather than requiring a record ID from a previous step.
+
+
+2. Select **People** as the object
+3. Find the person by matching their email to the `handle` from the Message Participant
+4. Set your custom "Number of emails received" field to `{{searchRecords.totalCount}}`
+
+The `totalCount` value from the Search Records action represents the total number of emails received from this person.
+
+## Related
+
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions)
+* [Create Custom Fields](/l/fr/user-guide/data-model/how-tos/customize-your-data-model)
+* [Search Records Action](/l/fr/user-guide/workflows/capabilities/workflow-actions#search-records)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx
new file mode 100644
index 0000000000..98a1b7f546
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx
@@ -0,0 +1,170 @@
+---
+title: Display Related Record Data
+description: Show data from related records (e.g., Company info on Opportunities) using workflows.
+---
+
+Display data from related records directly on your records — for example, show the employee count from a Company on its Opportunities. This workflow workaround is useful until nested fields are natively available.
+
+## Common Use Cases
+
+| Source | Destination | Fields to Copy |
+| ----------- | ----------- | ------------------------------- |
+| Company | Opportunity | Industry, Company Size, ARR |
+| Person | Opportunity | Email, Phone, Title |
+| Opportunity | Company | Last Deal Amount, Last Won Date |
+
+## Basic Field Copy
+
+### Example: Copy Contact Email to Opportunity
+
+**Goal**: When setting a Point of Contact on an opportunity, copy their email to the opportunity for easy access.
+
+### Prerequisite
+
+Create the destination fields in **Settings → Data Model → Opportunities** before building the workflow:
+
+* Contact Email (type: Email)
+* Contact Phone (type: Phone)
+
+### Setup
+
+1. **Trigger**: Record is Updated (Opportunities, Point of Contact field)
+
+2. **Filter**: Check that Point of Contact is not empty
+
+3. **Search Records**: Find the linked person
+ * Object: People
+ * Filter: ID equals `{{trigger.object.pointOfContact.id}}`
+
+4. **Update Record**:
+ * Object: Opportunities
+ * Record: `{{trigger.object.id}}`
+ * Contact Email: `{{searchRecords[0].email}}`
+ * Contact Phone: `{{searchRecords[0].phone}}`
+
+## Copy Multiple Fields
+
+### Example: Sync Company Info to All Related Opportunities
+
+**Goal**: When company details change, update all related opportunities.
+
+### Setup
+
+1. **Trigger**: Record is Updated (Companies)
+ * Fields: Industry, Company Size, Annual Revenue
+
+2. **Search Records**: Find all opportunities for this company
+ * Object: Opportunities
+ * Filter: Company ID equals `{{trigger.object.id}}`
+
+3. **Iterator**: Loop through each opportunity
+
+4. **Update Record** (inside iterator):
+ * Object: Opportunities
+ * Record: `{{iterator.currentItem.id}}`
+ * Company Industry: `{{trigger.object.industry}}`
+ * Company Size: `{{trigger.object.companySize}}`
+ * Company ARR: `{{trigger.object.annualRevenue}}`
+
+## Copy on Record Creation
+
+### Example: Pre-fill Opportunity with Company Data
+
+**Goal**: When creating an opportunity linked to a company, automatically copy key company info.
+
+### Prerequisite
+
+Create the destination fields in **Settings → Data Model → Opportunities**:
+
+* Company Industry (type: Text)
+* Company Size (type: Number)
+
+### Setup
+
+1. **Trigger**: Record is Created (Opportunities)
+ * Filter: Company is not empty
+
+2. **Search Records**: Get the linked company's details
+ * Object: Companies
+ * Filter: ID equals `{{trigger.object.company.id}}`
+
+3. **Update Record**:
+ * Object: Opportunities
+ * Record: `{{trigger.object.id}}`
+ * Company Industry: `{{searchRecords[0].industry}}`
+ * Company Size: `{{searchRecords[0].employees}}`
+
+
+ **Tasks and Notes limitation**: Relations on Tasks and Notes are hardcoded as many-to-many and are not yet available in workflow triggers or actions. To access these relations, use the [API](/l/fr/developers/extend/capabilities/apis) instead.
+
+
+## Bidirectional Sync
+
+### Example: Keep Primary Contact in Sync
+
+**Goal**: When a company's primary contact changes, update the contact. When a person becomes primary, update the company.
+
+### Workflow 1: Company → Person
+
+1. **Trigger**: Record is Updated (Companies, Primary Contact field)
+2. **Update Record**: Set person's "Is Primary Contact" to true
+3. **Search Records**: Find previous primary contact
+4. **Update Record**: Set previous contact's "Is Primary Contact" to false
+
+### Workflow 2: Person → Company
+
+1. **Trigger**: Record is Updated (People, Is Primary Contact = true)
+2. **Update Record**: Set company's Primary Contact to this person
+
+
+ Be careful with bidirectional syncs to avoid infinite loops. Use filters to check if the value actually changed before updating.
+
+
+## Using Code for Complex Mapping
+
+### Example: Transform Data During Copy
+
+**Goal**: Copy and format phone number from person to opportunity.
+
+```javascript
+export const main = async (params) => {
+ const { phone } = params;
+
+ if (!phone) return { formattedPhone: null };
+
+ // Remove non-numeric characters
+ const digits = phone.replace(/\D/g, '');
+
+ // Format as (XXX) XXX-XXXX
+ const formatted = digits.length === 10
+ ? `(${digits.slice(0,3)}) ${digits.slice(3,6)}-${digits.slice(6)}`
+ : phone;
+
+ return { formattedPhone: formatted };
+};
+```
+
+## Best Practices
+
+### Avoid Loops
+
+* Don't create workflows that trigger each other endlessly
+* Use specific field conditions
+* Add checks to see if value actually changed
+
+### Handle Missing Data
+
+* Always check if source record exists before copying
+* Provide default values for optional fields
+* Use filters to skip when source field is empty
+
+### Performance
+
+* Batch updates when copying to many records
+* Use scheduled workflows for bulk sync operations
+* Consider using Iterator for multiple record updates
+
+## Related
+
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions)
+* [Workflow Triggers](/l/fr/user-guide/workflows/capabilities/workflow-triggers)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx
new file mode 100644
index 0000000000..a608f7fd9c
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx
@@ -0,0 +1,202 @@
+---
+title: Formula Fields
+description: Create formula fields using workflows until native support is available.
+---
+
+Twenty doesn't yet support native formula fields yet (coming in 2026), but you can achieve the same result using workflows. This workaround lets you automatically calculate and populate field values—from simple concatenations to complex business logic.
+
+## Common Use Cases
+
+| Use Case | Formula Example |
+| ------------------- | --------------------------------- |
+| **Full name** | First Name + " " + Last Name |
+| **Expected amount** | Amount × Probability |
+| **Days until due** | Due Date - Today |
+| **Days in stage** | Today - Stage Entry Date |
+| **Lead score** | Points based on multiple criteria |
+
+
+ For a complete example of tracking time in pipeline stages, see [Track How Long Opportunities Stay in Each Stage](/l/fr/user-guide/views-pipelines/how-tos/track-time-in-stage).
+
+
+## Basic Formula: Concatenation
+
+### Example: Auto-Fill Full Name
+
+**Goal**: Automatically combine first and last name into a full name field.
+
+### Setup
+
+1. **Trigger**: Record is Updated or Created (People)
+
+2. **Filter**: Check that first name or last name changed
+
+3. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { firstName, lastName } = params;
+
+ const fullName = [firstName, lastName]
+ .filter(Boolean)
+ .join(' ');
+
+ return { fullName };
+};
+```
+
+4. **Update Record**: Set Full Name to `{{code.fullName}}`
+
+## Numeric Formula: Expected Amount
+
+### Example: Calculate Expected Revenue
+
+**Goal**: Multiply opportunity amount by probability to get expected amount.
+
+See [How to Show Expected Amount in Pipeline](/l/fr/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline) for the complete workflow.
+
+### Quick Setup
+
+1. **Trigger**: Record is Updated (Opportunities, Amount OR Probability field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { amount, probability } = params;
+
+ const expectedAmount = (amount || 0) * (probability || 0) / 100;
+
+ return { expectedAmount };
+};
+```
+
+3. **Update Record**: Set Expected Amount to `{{code.expectedAmount}}`
+
+## Date Formula: Days Calculation
+
+### Example: Days Until Task Due
+
+**Goal**: Calculate how many days remain until a task's due date.
+
+### Setup
+
+1. **Trigger**: Record is Updated or Created (Tasks, Due Date field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { dueDate } = params;
+
+ if (!dueDate) {
+ return { daysUntilDue: null };
+ }
+
+ const due = new Date(dueDate);
+ const today = new Date();
+ const diffTime = due - today;
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return { daysUntilDue: diffDays };
+};
+```
+
+3. **Update Record**: Set Days Until Due to `{{code.daysUntilDue}}`
+
+
+ Negative values indicate overdue tasks. You can use this field to filter or sort tasks by urgency.
+
+
+## Conditional Formula: Lead Score
+
+### Example: Calculate Lead Score Based on Criteria
+
+**Goal**: Score leads based on company size, industry, and engagement.
+
+### Setup
+
+1. **Trigger**: Record is Updated (People or Companies)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { companySize, industry, hasEmail, hasPhone, source } = params;
+
+ let score = 0;
+
+ // Company size scoring
+ if (companySize === 'Enterprise') score += 30;
+ else if (companySize === 'Mid-Market') score += 20;
+ else if (companySize === 'SMB') score += 10;
+
+ // Industry scoring
+ const targetIndustries = ['Technology', 'Finance', 'Healthcare'];
+ if (targetIndustries.includes(industry)) score += 25;
+
+ // Contact info scoring
+ if (hasEmail) score += 10;
+ if (hasPhone) score += 15;
+
+ // Source scoring
+ if (source === 'Referral') score += 20;
+ else if (source === 'Website') score += 10;
+
+ return { leadScore: score };
+};
+```
+
+3. **Update Record**: Set Lead Score to `{{code.leadScore}}`
+
+## Text Formula: Domain Extraction
+
+### Example: Extract Domain from Email
+
+**Goal**: Automatically extract and store the email domain.
+
+### Setup
+
+1. **Trigger**: Record is Updated (People, Email field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { email } = params;
+
+ if (!email) return { domain: null };
+
+ const domain = email.split('@')[1]?.toLowerCase();
+
+ return { domain };
+};
+```
+
+3. **Update Record**: Set Domain field to `{{code.domain}}`
+
+## Best Practices
+
+### Performance
+
+* Only trigger on relevant field changes
+* Use filters to skip records that don't need calculation
+* Avoid complex calculations in high-volume workflows
+
+### Error Handling
+
+* Check for null/undefined values before calculations
+* Use default values when data is missing
+* Return clear error messages when calculations fail
+
+### Testing
+
+* Test with edge cases (empty fields, zero values)
+* Verify calculations manually before activating
+* Monitor workflow runs for unexpected results
+
+## Related
+
+* [How to Show Expected Amount in Pipeline](/l/fr/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline)
+* [How to Track Time in Stage](/l/fr/user-guide/views-pipelines/how-tos/track-time-in-stage)
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
new file mode 100644
index 0000000000..bcadfc829d
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
@@ -0,0 +1,106 @@
+---
+title: Send Email Alerts with Tasks Due
+description: Automatically notify team members about their upcoming or overdue tasks.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+Send daily email reminders to each team member about their tasks due today.
+
+## Overview
+
+This workflow runs on a schedule and:
+
+1. Fetches all workspace members
+2. Loops through each member
+3. Finds their tasks due today
+4. Formats and sends a personalized email
+
+## Step-by-Step Setup
+
+
+
+### Step 1: Configure the Trigger
+
+1. Go to **Settings → Workflows** and create a new workflow
+2. Select **On a Schedule** as the trigger
+3. Use a cron expression for daily at 8:00 AM: `0 8 * * *`
+
+### Step 2: Search for All Workspace Members
+
+1. Add a **Search Records** action
+2. Select **Workspace Members** (under advanced objects)
+3. No filters needed — this returns all members
+
+### Step 3: Add an Iterator
+
+1. Add an **Iterator** action
+2. Set the input array to the workspace members from the previous step
+3. All actions inside the iterator will run once per member
+
+### Step 4: Search for Tasks Due Today (Inside Iterator)
+
+1. Inside the iterator, add a **Search Records** action
+2. Select **Tasks** as the object
+3. Add filters:
+ * **Assignee** = current workspace member (from the iterator)
+ * **Due Date** = today
+
+### Step 5: Format Tasks into Email Body (Inside Iterator)
+
+Add a **Code** action to format the tasks into a readable list with links:
+
+```javascript
+export const main = async (params: {
+ tasksDue?: Array<{ id: string; title: string }> | null | string;
+}) => {
+ const tasksDue =
+ typeof params.tasksDue === "string"
+ ? JSON.parse(params.tasksDue)
+ : params.tasksDue;
+
+ if (!Array.isArray(tasksDue) || tasksDue.length === 0) {
+ return {
+ formattedTasks: "No tasks due today."
+ };
+ }
+
+ const formattedTasks = tasksDue
+ .map(
+ t =>
+ `${t.title}\nhttps://yourSubDomain.twenty.com/object/task/${t.id}`
+ )
+ .join("\n\n");
+
+ return { formattedTasks };
+};
+```
+
+
+ Replace `yourSubDomain` with your actual Twenty workspace subdomain.
+
+
+### Step 6: Send Email (Inside Iterator)
+
+1. Add a **Send Email** action (still inside the iterator)
+2. Configure:
+
+| Field | Value |
+| ----------- | --------------------------------------------------------------- |
+| **To** | `{{iterator.currentItem.userEmail}}` (workspace member's email) |
+| **Subject** | Your Tasks Due Today |
+| **Body** | `{{code.formattedTasks}}` |
+
+### Step 7: Test and Activate
+
+1. Click **Test** to run the workflow manually
+2. Check inboxes for the emails
+3. Activate the workflow
+
+## Related
+
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/fr/user-guide/workflows/capabilities/send-emails-from-workflows)
+* [Handle Arrays in Code Actions](/l/fr/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/need-more-help/professional-services.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
new file mode 100644
index 0000000000..674ca6229f
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
@@ -0,0 +1,29 @@
+---
+title: Professional Services
+description: Get professional help building complex workflows and automations from Twenty's team and certified partners.
+---
+
+## When Do You Need Professional Help?
+
+Consider professional services for:
+
+* Complex multi-system integrations
+* Advanced business logic and automation rules
+* Large-scale data processing workflows
+* Custom API development
+* Team training and workflow optimization
+* When you don't have internal resources
+
+## Service Options
+
+### Onboarding Packs
+
+Get help from our core team with our 4-hour [Onboarding packs](https://twenty.com/onboarding-packages):
+
+* **Workflow Creation**: Build custom workflows for your business processes
+* **Data Model Design**: Optimize your data structure for workflow automation
+* **Data Migration**: Import existing data with proper workflow integration
+
+### Implementation Partners
+
+Work with certified partners for advanced customizations. Contact us at contact@twenty.com to connect with our [implementation partners](https://twenty.com/partners).
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx
new file mode 100644
index 0000000000..b243fc4acb
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx
@@ -0,0 +1,170 @@
+---
+title: Workflow Troubleshooting
+description: Common workflow issues and how to resolve them.
+---
+
+## Common Issues and Solutions
+
+### Workflow Not Triggering
+
+**Symptoms**: Your workflow doesn't run when you expect it to.
+
+**Possible Causes**:
+
+1. **Workflow not activated**: Ensure the workflow is set to "Active" not "Draft"
+2. **Trigger conditions not met**: Verify the trigger matches your expected event
+3. **Field not monitored**: For "Record is Updated" triggers, ensure the specific field is being watched
+4. **Permissions**: Check you have permission to run workflows
+
+**Solutions**:
+
+* Verify workflow status in the workflow list
+* Test with the specific action you expect to trigger it
+* Review trigger configuration
+* Contact your admin about permissions
+
+### Workflow Triggers Too Early (Empty Fields)
+
+**Symptoms**: When manually creating a record in the UI, your workflow triggers before you've had time to fill in all the fields. The workflow runs with mostly empty field values.
+
+**Why this happens**: Twenty saves everything in real-time — there's no separate "edit" vs "read" mode. When you create a record, it's saved immediately, triggering the "Record is created" event before you can fill in additional fields.
+
+**When "Record is created" works well**:
+
+* Records created via API calls (fields are populated in a single request)
+* Records created via import
+* Automated record creation from other workflows
+
+**Solution**: For records created manually in the UI, use **"Record is created or updated"** as your trigger instead. This way:
+
+* The workflow triggers after the user has finished filling in and saving the fields
+* You get the complete data rather than empty values
+
+
+ If you only want the workflow to run once per record, add a Filter action to check a field like `createdAt equals updatedAt` (first save) or use a custom checkbox field to track if the workflow has already run.
+
+
+### Actions Failing
+
+**Symptoms**: Workflow runs but some actions fail.
+
+**Possible Causes**:
+
+1. **Missing data**: Required fields are empty
+2. **Invalid references**: Variables from previous steps don't exist
+3. **API errors**: External services returning errors
+4. **Permission issues**: Action requires permissions you don't have
+
+**Solutions**:
+
+* Check the workflow run details for error messages
+* Verify all required fields have values
+* Test API connections independently
+* Review role permissions
+
+### HTTP Request Errors
+
+**Symptoms**: HTTP Request actions fail or return unexpected results.
+
+**Common Error Codes**:
+
+* **400**: Bad request - check your request body format
+* **401**: Unauthorized - verify API key
+* **403**: Forbidden - check API permissions
+* **404**: Not found - verify endpoint URL
+* **429**: Too many requests - implement rate limiting
+* **500**: Server error - external service issue
+
+**Solutions**:
+
+* Verify API endpoint URL
+* Check authentication headers
+* Test the API call outside of Twenty first
+* Add error handling in Code actions
+
+### Code Action Errors
+
+**Symptoms**: JavaScript code fails to execute.
+
+**Common Issues**:
+
+1. **Syntax errors**: Typos or invalid JavaScript
+2. **Undefined variables**: Referencing variables that don't exist
+3. **Type errors**: Operations on wrong data types
+4. **Timeouts**: Code taking too long to execute
+
+**Solutions**:
+
+* Use the built-in code editor validation
+* Test code logic in a JavaScript console first
+* Add console.log statements for debugging
+* Simplify complex operations
+
+### Email Not Sending
+
+**Symptoms**: Send Email action doesn't deliver emails.
+
+**Possible Causes**:
+
+1. **No email account connected**: Check Settings → Accounts
+2. **Invalid email address**: Recipient email is malformed
+3. **Sending limits**: Email provider rate limits reached
+4. **Spam filters**: Emails being blocked
+
+**Solutions**:
+
+* Verify email account connection
+* Validate recipient email addresses
+* Check email provider limits
+* Review email content for spam triggers
+
+## Debugging Workflows
+
+### Using Workflow Runs
+
+1. Go to the workflow editor
+2. Open the **Runs** panel
+3. Find the failed run
+4. Click to see step-by-step details
+5. Review error messages and output data
+
+### Testing Individual Steps
+
+1. For Code actions, use the **Test** button
+2. For HTTP requests, test the endpoint separately
+3. Create test records to trigger workflows
+4. Use manual triggers for controlled testing
+
+### Common Debugging Patterns
+
+**Add logging**:
+Use Code actions to log intermediate values for debugging.
+
+**Isolate steps**:
+Test each step independently to identify failures.
+
+**Check data flow**:
+Verify that each step receives the expected input data.
+
+## Best Practices to Avoid Issues
+
+### Before Activation
+
+* Test thoroughly in draft mode
+* Validate all API connections
+* Review trigger conditions carefully
+* Document expected behavior
+
+### During Development
+
+* Use descriptive step names
+* Add comments in Code actions
+* Test with realistic data
+* Plan for edge cases
+
+### After Activation
+
+* Monitor initial runs closely
+* Set up alerts for failures
+* Review run history regularly
+* Keep workflows simple when possible
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx
new file mode 100644
index 0000000000..a7ed19a97c
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx
@@ -0,0 +1,254 @@
+---
+title: Workflows FAQ
+description: Frequently asked questions about workflows in Twenty.
+---
+
+
+
+ This is likely a permissions issue. You need access to workflows to create and activate them.
+
+ **Solution**: Contact your workspace administrator to grant you workflow access under **Settings → Roles**.
+
+ If you don't see the Workflows section at all in your sidebar, this confirms it's a permissions issue.
+
+
+
+ Manual workflows only appear in the navbar if properly configured:
+
+ 1. The workflow must be **activated** (not in draft mode)
+ 2. The navbar placement must be set to **Pinned**
+ 3. For Single/Bulk triggers, you must be on the correct object page
+
+ **To check**: Open the workflow → click the trigger → verify "Navbar placement" is set to "Pinned".
+
+ You can always access manual workflows via **Cmd + K** (or **Ctrl + K**) regardless of navbar settings.
+
+
+
+ | Type | Records Required | Workflow Runs |
+ | ---- | ---------------- | ------------- |
+
+ \| **Global** | None | Once, no record input |
+ \| **Single** | One or more selected | Once per selected record |
+ \| **Bulk** | One or more selected | Once, with all records as array |
+
+ * **Global**: Use when the workflow doesn't need any record context (e.g., generate a report)
+ * **Single**: Use when you want to process each selected record independently (e.g., send individual emails)
+ * **Bulk**: Use when you need to process records together or optimize credit usage (requires Iterator action)
+
+ See [Workflow Triggers](/l/fr/user-guide/workflows/capabilities/workflow-triggers) for details.
+
+
+
+ An explicit If/Else node is not yet available but is on our roadmap.
+
+ **Current workaround**: Create multiple branches from your step, each starting with a **Filter** action:
+
+ ```
+ Step 1
+ │
+ ├── Branch A: Filter (condition = true) → Actions...
+ │
+ └── Branch B: Filter (condition = false) → Actions...
+ ```
+
+ Only the branch where the filter condition passes will execute its subsequent actions.
+
+ See [How to Use Branches](/l/fr/user-guide/workflows/capabilities/workflow-branches) for a step-by-step guide.
+
+
+
+ **Yes**, branches run in parallel by default.
+
+ If you want only one branch to execute:
+
+ * Add a **Filter** action at the start of each branch
+ * Set opposite conditions (e.g., Branch A: status = "Open", Branch B: status ≠ "Open")
+
+ Branches that fail their filter condition stop executing, while others continue.
+
+
+
+ **Yes**. After your parallel branches complete, you can add a step that both branches connect to.
+
+ In the workflow editor:
+
+ 1. Complete your branched actions
+ 2. Add a new step after the branches
+ 3. Drag connections from the end of each branch to this new step
+
+ The merged step will execute after all connected branches complete.
+
+
+
+ **Search Records returns a maximum of 200 records.**
+
+ If you need to process more:
+
+ * Add more specific filters to reduce results
+ * Use scheduled workflows to process in batches
+ * Consider using the API for bulk operations
+
+ For most workflows, 200 records is sufficient. If you regularly hit this limit, consider restructuring your automation.
+
+
+
+ **Not yet.** CC and BCC fields for the Send Email action are on our roadmap.
+
+ **Current workaround**: Add multiple Send Email actions to send to additional recipients, or use an HTTP Request to send via an external email service that supports CC.
+
+
+
+ Every action produces output data that can be used in subsequent steps.
+
+ **To reference previous step data**:
+
+ * Use the variable picker when configuring a field
+ * Or type `{{stepName.fieldName}}` directly
+
+ **Examples**:
+
+ * Trigger data: `{{trigger.object.email}}`
+ * Search results: `{{searchRecords[0].name}}`
+ * Code output: `{{code.calculatedValue}}`
+
+ Hover over any field in the action configuration to see available variables from previous steps.
+
+
+
+ **Iterator requires an array input.** Common issues:
+
+ 1. **Input is not an array**: Ensure you're passing results from Search Records or another action that returns an array
+ 2. **Array is empty**: Add a filter before Iterator to check `{{searchRecords.length}} > 0`
+ 3. **Wrong variable selected**: Make sure you select the array itself, not a single record
+
+ **Correct setup**:
+
+ 1. Search Records (returns array)
+ 2. Filter: length > 0
+ 3. Iterator: select `{{searchRecords}}`
+ 4. Actions inside iterator use `{{iterator.currentItem.fieldName}}`
+
+
+
+ Code actions (serverless functions) have a **default timeout of 5 minutes** (300 seconds).
+
+ The maximum configurable timeout is **15 minutes** (900 seconds).
+
+ If your code exceeds this limit, the action will fail with a timeout error.
+
+ **Tips to avoid timeouts**:
+
+ * Break large operations into smaller chunks using Iterator
+ * Avoid heavy computations; use external services via HTTP Request for intensive processing
+ * Optimize your code to reduce execution time
+ * If you need longer processing, consider using scheduled workflows that process data in batches
+
+
+
+ Workflow runs show the execution history and help you debug issues.
+
+ **Access runs**:
+
+ * In workflow editor → **Runs** panel on the right
+ * Or go to **Workflow Runs** in the sidebar
+
+ **Understanding a run**:
+
+ * **Status**: Running, Completed, Failed, Waiting
+ * **Steps**: See which steps executed and their output
+ * **Errors**: Click failed steps to see error messages
+ * **Data**: View input/output data at each step
+
+ See [Workflow Runs](/l/fr/user-guide/workflows/capabilities/workflow-runs) for details.
+
+
+
+ Workflow runs might be failing immediately due to rate limits.
+
+ **Hard limit: 5,000 runs per hour per workspace.**
+
+ If you exceed this limit, workflows are immediately marked as failed and won't appear in your runs list as expected.
+
+ **Common scenarios that hit this limit**:
+
+ * Selecting more than 5,000 records with a Single manual trigger
+ * Multiple workflows running simultaneously across your workspace
+ * High-frequency automated triggers (e.g., Record Updated on a busy object)
+
+ **Solutions**:
+
+ * Use **Bulk** triggers instead of Single to process many records in one run
+ * Space out large batch operations
+ * Use filters to reduce trigger frequency
+ * Schedule heavy workflows during off-peak hours
+
+
+
+ Twenty has two rate limits to ensure system stability:
+
+ | Limit | Value | Behavior |
+ | ----- | ----- | -------- |
+
+ \| **Soft limit** | 100 runs/minute | Runs queue in "Not Started" status, processed gradually |
+ \| **Hard limit** | 5,000 runs/hour | Runs immediately fail |
+
+ **Soft limit (100/min)**: Your workflows won't fail—they just wait in the queue and are processed over time. You can trigger more than 100 records; execution will be slower.
+
+ **Hard limit (5,000/hr)**: This applies to your entire workspace. If all your workflows combined exceed 5,000 runs in an hour, additional runs will fail immediately.
+
+ **Tips to stay within limits**:
+
+ * Use Bulk triggers with Iterator instead of Single triggers for large batches
+ * Combine related automations into fewer workflows
+ * Use scheduled workflows to spread load over time
+
+
+
+ **No, there is no automatic retry functionality at the moment.**
+
+ If a workflow run fails, you'll need to:
+
+ 1. Review the error in **Settings → Workflows → [Your Workflow] → Runs**
+ 2. Fix the issue (data, configuration, or external service)
+ 3. Manually trigger the workflow again on the affected record(s)
+
+ **Tips to reduce failures**:
+
+ * Add **Filter** nodes to validate data before actions
+ * Use **Search Records** to check if related records exist
+ * Test thoroughly with a few records before bulk operations
+
+ Automatic retry functionality is on our roadmap for a future release.
+
+
+
+ **Yes, if your workflows are triggered by record creation or updates.**
+
+ When you import data via CSV, each record created or updated can trigger workflows. A large import (thousands of records) could:
+
+ * Hit the 5,000 runs/hour limit
+ * Consume significant workflow credits
+ * Send unexpected emails or notifications
+ * Create duplicate tasks or records
+
+ **Before a mass import**:
+
+ 1. Go to **Settings → Workflows**
+ 2. Identify workflows triggered by the object you're importing
+ 3. **Deactivate** them temporarily
+ 4. Run your CSV import
+ 5. **Reactivate** the workflows when done
+
+ **Alternative**: If you need the workflows to run on imported data, import in smaller batches to stay within rate limits.
+
+
+
+ If your workflow canvas looks messy with nodes scattered around, you can automatically organize it:
+
+ 1. Right-click anywhere on the workflow canvas
+ 2. Click **Tidy up workflow**
+
+ This will automatically rearrange all nodes into a clean, organized layout.
+
+
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/overview.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/overview.mdx
new file mode 100644
index 0000000000..d1ce17da67
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/overview.mdx
@@ -0,0 +1,80 @@
+---
+title: Workflows
+description: Learn how to build automations in Twenty.
+image: /images/user-guide/workflows/workflow.png
+---
+
+
+
+
+
+## Why Workflows Matter
+
+Twenty was built to bring maximum flexibility to its users. Rather than forcing you to adapt your business processes to rigid, pre-built features, workflows enable you to build automations that create the CRM that best supports your unique business use cases.
+
+Workflows are Twenty's in-app feature for building these automations. They give you the building blocks to create exactly what your business needs, when it needs it.
+
+## What can I do with workflows?
+
+We recommend building automations for two main purposes:
+
+1. **Internal automations to facilitate your team's day-to-day**: Reduce the amount of manual entries and repetitive tasks that slow down your team.
+2. **Bring data in and out of Twenty**: Connect Twenty via API calls and webhooks to your database and other tools.
+
+## Building Your First Workflow
+
+### Step 1: Create a New Workflow
+
+1. Go to **Workflows** accessible below the other objects
+2. Click **+ New Record**
+3. Give your workflow a name
+
+### Step 2: Add a Trigger
+
+Every workflow starts with a trigger. Choose from:
+
+* **Record events**: When a record is created, updated, or deleted
+* **Schedule**: Run at specific times (daily, weekly, etc.)
+* **Manual**: Triggered by a user action
+* **Webhook**: Triggered by a webhook
+
+
+
+### Step 3: Add Actions
+
+After your trigger, add one or more actions:
+
+* **Create Record**: Add new records to any object
+* **Update Record**: Modify existing record data
+* **Delete Record**: Remove records from objects
+* **Search Records**: Find records matching criteria
+* **Upsert Record**: Create or update based on matching criteria
+* **Iterator**: Loop through arrays of records
+* **Filter**: Control which records proceed
+* **Delay**: Wait before continuing (duration or scheduled date)
+* **Send Email**: Send emails via your connected account
+* **Code**: Run custom JavaScript
+* **HTTP Request**: Call external APIs
+* **Form**: Get inputs from users within Twenty UI at the time of execution
+* **AI Agent** (Coming soon): Run intelligent AI tasks
+
+
+
+### Step 4: Test and Activate
+
+1. Use the **Test** button to run your workflow with sample data
+2. Review the results to ensure it works as expected
+3. Toggle the workflow **Active** when ready
+
+## Workflow Best Practices
+
+* **Edit step names**: Rename your workflow steps to clearly describe what each one does. This helps with maintenance and makes it easier to hand off to coworkers
+* **Leverage previous step data**: You can use fields from records returned by any previous step in your workflow
+* **Start simple**: Begin with basic workflows and add complexity over time as you become more comfortable with the system
+* **Plan before building**: Map out your workflow logic before you start building to avoid getting stuck halfway through
+
+## Next Steps
+
+* [Workflow Triggers](/l/fr/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/fr/user-guide/workflows/capabilities/workflow-actions)
+* [CRM Automations](/l/fr/user-guide/workflows/how-tos/crm-automations/closed-won-automations)
diff --git a/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/hotkeys.mdx
index 46e0c334ac..e3af941e57 100644
--- a/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/hotkeys.mdx
+++ b/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -45,29 +45,29 @@ const PageListeningEnter = () => {
goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope();
- // 1. Imposta l'ambito del tasto di scelta rapida in un useEffect
+ // 1. Set the hotkey scope in a useEffect
useEffect(() => {
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleEnterPage,
);
- // Torna all'ambito del tasto di scelta rapida precedente quando il componente viene smontato
+ // Revert to the previous hotkey scope when the component is unmounted
return () => {
goBackToPreviousHotkeyScope();
};
}, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
- // 2. Usa l'hook useScopedHotkeys
+ // 2. Use the useScopedHotkeys hook
useScopedHotkeys(
Key.Enter,
() => {
- // Alcuna logica eseguita in questa pagina quando l'utente preme Invio
+ // Some logic executed on this page when the user presses Enter
// ...
},
ExampleHotkeyScopes.ExampleEnterPage,
);
- return La mia pagina che ascolta per Invio
;
+ return My page that listens for Enter
;
};
```
@@ -87,7 +87,7 @@ const ExamplePageWithModal = () => {
} = usePreviousHotkeyScope();
const handleOpenModalClick = () => {
- // 1. Imposta l'ambito del tasto di scelta rapida quando l'utente apre la modale
+ // 1. Set the hotkey scope when user opens the modal
setShowModal(true);
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleModal,
@@ -95,14 +95,14 @@ const ExamplePageWithModal = () => {
};
const handleModalClose = () => {
- // 1. Torna all'ambito del tasto di scelta rapida precedente quando la modale viene chiusa
+ // 1. Revert to the previous hotkey scope when the modal is closed
setShowModal(false);
goBackToPreviousHotkeyScope();
};
return
-
La mia pagina con una modale
- Apri modale
+ My page with a modal
+ Open modal
{showModal && }
;
};
@@ -112,9 +112,9 @@ Poi nel componente modale:
```tsx
const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
- // 2. Usa l'hook useScopedHotkeys per ascoltare per Esc.
- // Nota che esc è un tasto di scelta rapida comune che potrebbe essere utilizzato da molti altri componenti
- // Quindi è importante utilizzare un ambito di tasto di scelta rapida per evitare conflitti
+ // 2. Use the useScopedHotkeys hook to listen for Escape.
+ // Note that escape is a common hotkey that could be used by many other components
+ // So it's important to use a hotkey scope to avoid conflicts
useScopedHotkeys(
Key.Escape,
() => {
@@ -123,7 +123,7 @@ const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
ExampleHotkeyScopes.ExampleModal,
);
- return Il mio componente modale
;
+ return My modal component
;
};
```
diff --git a/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/style-guide.mdx b/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/style-guide.mdx
index 25bd6ae987..b084205343 100644
--- a/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/style-guide.mdx
+++ b/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/style-guide.mdx
@@ -21,16 +21,16 @@ Usa sempre componenti funzionali TSX.
Non utilizzare l'`import` di default con `const`, perché è più difficile da leggere e importare con il completamento del codice.
```tsx
-// ❌ Male, più difficile da leggere, più difficile da importare con il completamento del codice
+// ❌ Bad, harder to read, harder to import with code completion
const MyComponent = () => {
- return Ciao Mondo
;
+ return Hello World
;
};
export default MyComponent;
-// ✅ Bene, facile da leggere, facile da importare con il completamento del codice
+// ✅ Good, easy to read, easy to import with code completion
export function MyComponent() {
- return Ciao Mondo
;
+ return Hello World
;
};
```
@@ -41,24 +41,24 @@ Crea il tipo di proprietà e chiamalo `(ComponentName)Props` se non c'è bisogno
Usa la destrutturazione delle props.
```tsx
-// ❌ Male, nessun tipo
-export const MyComponent = (props) => Ciao {props.name}
;
+// ❌ Bad, no type
+export const MyComponent = (props) => Hello {props.name}
;
-// ✅ Bene, tipo
+// ✅ Good, type
type MyComponentProps = {
name: string;
};
-export const MyComponent = ({ name }: MyComponentProps) => Ciao {name}
;
+export const MyComponent = ({ name }: MyComponentProps) => Hello {name}
;
```
#### Evita di usare `React.FC` o `React.FunctionComponent` per definire i tipi di proprietà
```tsx
-/* ❌ - Male, definisce le annotazioni dei tipi di componenti con `FC`
- * - Con `React.FC`, il componente accetta implicitamente una prop `children`
- * anche se non è definita nel tipo di prop. Questo potrebbe non essere
- * sempre desiderabile, soprattutto se il componente non intende rendere
+/* ❌ - Bad, defines the component type annotations with `FC`
+ * - With `React.FC`, the component implicitly accepts a `children` prop
+ * even if it's not defined in the prop type. This might not always be
+ * desirable, especially if the component doesn't intend to render
* children.
*/
const EmailField: React.FC<{
@@ -86,7 +86,7 @@ const EmailField = ({ value }: EmailFieldProps) => (
Evita di usare l'espansione singola delle variabili delle props negli elementi JSX, come `{...props}`. Questa pratica spesso porta a un codice meno leggibile e più difficile da mantenere perché non è chiaro quali props stia ricevendo il componente.
```tsx
-/* ❌ - Male, espande una singola variabile di prop nel componente sottostante
+/* ❌ - Bad, spreads a single variable prop into the underlying component
*/
const MyComponent = (props: OwnProps) => {
return ;
@@ -137,12 +137,12 @@ onClick?.();
Usa sempre `type` invece di `interface`, perché quasi sempre si sovrappongono, e `type` è più flessibile.
```tsx
-// ❌ Male
+// ❌ Bad
interface MyInterface {
name: string;
}
-// ✅ Bene
+// ✅ Good
type MyType = {
name: string;
};
@@ -155,7 +155,7 @@ type MyType = {
Puoi vedere perché TypeScript consiglia di evitare gli enum [qui](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
```tsx
-// ❌ Male, utilizza un enum
+// ❌ Bad, utilizes an enum
enum Color {
Red = "red",
Green = "green",
diff --git a/packages/twenty-docs/l/it/developers/self-host/capabilities/troubleshooting.mdx b/packages/twenty-docs/l/it/developers/self-host/capabilities/troubleshooting.mdx
index 28263cf396..55fb1825d1 100644
--- a/packages/twenty-docs/l/it/developers/self-host/capabilities/troubleshooting.mdx
+++ b/packages/twenty-docs/l/it/developers/self-host/capabilities/troubleshooting.mdx
@@ -59,7 +59,7 @@ Questo dovrebbe funzionare direttamente con l'estensione eslint installata. Se q
```
"editor.codeActionsOnSave": {
- "source.fixAll.eslint": "esplicito"
+ "source.fixAll.eslint": "explicit"
}
```
diff --git a/packages/twenty-docs/l/it/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/it/twenty-ui/input/icon-picker.mdx
index 963eea003a..e195b82555 100644
--- a/packages/twenty-docs/l/it/twenty-ui/input/icon-picker.mdx
+++ b/packages/twenty-docs/l/it/twenty-ui/input/icon-picker.mdx
@@ -20,7 +20,7 @@ Un selettore di icone basato su menu a tendina che consente agli utenti di scegl
const [selectedIcon, setSelectedIcon] = useState("");
const handleIconChange = ({ iconKey, Icon }) => {
- console.log("Icona selezionata:", iconKey);
+ console.log("Selected Icon:", iconKey);
setSelectedIcon(iconKey);
};
diff --git a/packages/twenty-docs/l/it/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/it/twenty-ui/navigation/breadcrumb.mdx
index b84dc7b6e2..1e51c7eaa1 100644
--- a/packages/twenty-docs/l/it/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/it/twenty-ui/navigation/breadcrumb.mdx
@@ -18,9 +18,9 @@ Visualizza una barra di navigazione a briciole di pane.
export const MyComponent = () => {
const breadcrumbLinks = [
{ children: "Home", href: "/" },
- { children: "Categoria", href: "/category" },
- { children: "Sottocategoria", href: "/category/subcategory" },
- { children: "Pagina Attuale" },
+ { children: "Category", href: "/category" },
+ { children: "Subcategory", href: "/category/subcategory" },
+ { children: "Current Page" },
];
return (
diff --git a/packages/twenty-docs/l/it/twenty-ui/navigation/menu-item.mdx b/packages/twenty-docs/l/it/twenty-ui/navigation/menu-item.mdx
index 60c92dfed1..6c9e35ff03 100644
--- a/packages/twenty-docs/l/it/twenty-ui/navigation/menu-item.mdx
+++ b/packages/twenty-docs/l/it/twenty-ui/navigation/menu-item.mdx
@@ -18,18 +18,18 @@ Una voce di menu versatile progettata per essere utilizzata in un menu o in un e
export const MyComponent = () => {
const handleMenuItemClick = (event) => {
- console.log("Voce di menu cliccata!", event);
+ console.log("Menu item clicked!", event);
};
const handleButtonClick = (event) => {
- console.log("Icona pulsante cliccata!", event);
+ console.log("Icon button clicked!", event);
};
return (
{
const handleCommandClick = () => {
- console.log("Comando cliccato!");
+ console.log("Command clicked!");
};
return (
{
const handleMenuItemClick = (event) => {
- console.log("Voce di menu cliccata!", event);
+ console.log("Menu item clicked!", event);
};
return (
@@ -125,7 +125,7 @@ Un componente di menu trascinabile progettato per essere utilizzato in un menu o
iconButtons={[{ Icon: IconAlertCircle, onClick: handleButtonClick }]}
isTooltipOpen={false}
onClick={handleMenuItemClick}
- text="Voce di menu trascinabile"
+ text="Menu item draggable"
isDragDisabled={false}
className
/>
@@ -163,7 +163,7 @@ Fornisce un modo per implementare la funzionalità di selezione multipla con una
return (
@@ -199,7 +199,7 @@ Una voce di menu a selezione multipla con un avatar, una casella di controllo pe
return (
}
- text="Prima opzione"
+ text="First Option"
selected={false}
className
/>
@@ -231,13 +231,13 @@ Una voce di menu con un'icona opzionale a sinistra, contenuto testuale e un'icon
export const MyComponent = () => {
const handleNavigation = () => {
- console.log("Naviga a un'altra pagina");
+ console.log("Navigate to another page");
};
return (
@@ -268,13 +268,13 @@ Una voce di menu selezionabile, con opzioni di contenuto a sinistra (icona e tes
export const MyComponent = () => {
const handleSelection = () => {
- console.log("Voce di menu selezionata");
+ console.log("Menu item selected");
};
return (
{
- console.log("Voce di menu selezionata");
+ console.log("Menu item selected");
};
return (
}
- text="Prima Opzione"
+ text="First Option"
selected={true}
disabled={false}
hovered={false}
@@ -329,6 +329,7 @@ Una voce di menu selezionabile con un avatar, opzioni di contenuto a sinistra (a
/>
);
};
+
```
@@ -357,12 +358,12 @@ Una voce di menu selezionabile con un campione di colore per scenari in cui si d
export const MyComponent = () => {
const handleSelection = () => {
- console.log("Voce di menu selezionata");
+ console.log("Menu item selected");
};
return (
```jsx
- import { IconBell } from "@tabler/icons-react";
+ import { IconBell } from '@tabler/icons-react';
- import { MenuItemToggle } from "twenty-ui/display";
+ import { MenuItemToggle } from 'twenty-ui/display';
export const MyComponent = () => {
return (
```jsx
- importa { IconHome, IconUser, IconSettings } da '@tabler/icons-react';
- importa { NavigationBar } da "@/ui/navigation/navigation-bar/components/NavigationBar";
+ import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
+ import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
export const MyComponent = () => {
@@ -21,17 +21,17 @@ Rende una barra di navigazione che contiene più componenti `NavigationBarItem`.
{
name: "Home",
Icon: IconHome,
- onClick: () => console.log("Home cliccato"),
+ onClick: () => console.log("Home clicked"),
},
{
- name: "Profilo",
+ name: "Profile",
Icon: IconUser,
- onClick: () => console.log("Profilo cliccato"),
+ onClick: () => console.log("Profile clicked"),
},
{
- name: "Impostazioni",
+ name: "Settings",
Icon: IconSettings,
- onClick: () => console.log("Impostazioni cliccate"),
+ onClick: () => console.log("Settings clicked"),
},
];
diff --git a/packages/twenty-docs/l/it/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/it/twenty-ui/navigation/step-bar.mdx
index f67ae1c5c5..bf0dbb1203 100644
--- a/packages/twenty-docs/l/it/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/it/twenty-ui/navigation/step-bar.mdx
@@ -17,9 +17,9 @@ Visualizza il progresso attraverso una sequenza di passi numerati evidenziando i
export const MyComponent = () => {
return (
- Passo 1
- Passo 2
- Passo 3
+ Step 1
+ Step 2
+ Step 3
);
};
diff --git a/packages/twenty-docs/l/it/user-guide/billing/overview.mdx b/packages/twenty-docs/l/it/user-guide/billing/overview.mdx
index 8fa9c6a28d..dfbfb31281 100644
--- a/packages/twenty-docs/l/it/user-guide/billing/overview.mdx
+++ b/packages/twenty-docs/l/it/user-guide/billing/overview.mdx
@@ -1,6 +1,6 @@
---
title: Fatturazione
-description: Understand Twenty pricing and manage your subscription.
+description: Comprendi i prezzi di Twenty e gestisci il tuo abbonamento.
image: /images/user-guide/setup/pricing.png
---
@@ -8,38 +8,38 @@ image: /images/user-guide/setup/pricing.png
-Twenty offers flexible pricing plans to fit your team's needs. Manage your subscription, track workflow credits, and access invoices all from **Settings → Billing**.
+Twenty offre piani tariffari flessibili per soddisfare le esigenze del tuo team. Gestisci il tuo abbonamento, tieni traccia dei crediti dei flussi di lavoro e accedi alle fatture direttamente da **Impostazioni → Fatturazione**.
-## What's in this section
+## Cosa c'è in questa sezione
-
- Learn about Twenty's pricing plans and what's included.
+
+ Scopri i piani tariffari di Twenty e cosa includono.
- Frequently asked questions about pricing and billing.
+ Domande frequenti su prezzi e fatturazione.
-## At a glance
+## A colpo d'occhio
-| Piano | Key Features |
-| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| **Free (Self-Hosted)** | All Pro features, community support |
-| **Pro (Cloud)** | Everything apart from the Premium features (SSO and row-level permissions), standard support |
-| **Organization (Cloud)** | All from Pro + the Premium features (SSO and row-level permissions), priority support |
-| **Organization (Self-Hosted)** | All from Pro + the Premium features (SSO, row-level permissions), Twenty team support, not required to publish your custom code as open-source before distributing |
+| Piano | Funzionalità principali |
+| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| **Gratuito (self-hosted)** | Tutte le funzionalità Pro, supporto della community |
+| **Pro (Cloud)** | Tutto tranne le funzionalità Premium (SSO e autorizzazioni a livello di riga), supporto standard |
+| **Organizzazione (Cloud)** | Tutto di Pro + le funzionalità Premium (SSO e autorizzazioni a livello di riga), supporto prioritario |
+| **Organizzazione (self-hosted)** | Tutto di Pro + le funzionalità Premium (SSO, autorizzazioni a livello di riga), supporto del team Twenty, non è richiesto pubblicare il tuo codice personalizzato come open-source prima della distribuzione |
-## Quick answers
+## Risposte rapide
-**Where do I manage billing?**
-Go to **Settings → Billing** to view your plan, update payment methods, and access invoices.
+**Dove gestisco la fatturazione?**
+Vai su **Impostazioni → Fatturazione** per vedere il tuo piano, aggiornare i metodi di pagamento e accedere alle fatture.
-**Can I use Twenty for free?**
-Yes! Self-host Twenty and get all Pro features at no cost.
+**Posso usare Twenty gratuitamente?**
+Sì! Ospita Twenty in self-hosting e ottieni tutte le funzionalità Pro senza costi.
-**How do I upgrade?**
-Go to **Settings → Billing** and click **Switch to Organization** or **Switch to Yearly**.
+**Come effettuo l'upgrade?**
+Vai su **Impostazioni → Fatturazione** e fai clic su **Passa a Organizzazione** o **Passa ad Annuale**.
-For more questions, see the [Billing FAQ](/l/it/user-guide/billing/how-tos/billing-faq).
+Per altre domande, consulta le [FAQ sulla fatturazione](/l/it/user-guide/billing/how-tos/billing-faq).
diff --git a/packages/twenty-docs/l/it/user-guide/calendar-emails/capabilities/calendar.mdx b/packages/twenty-docs/l/it/user-guide/calendar-emails/capabilities/calendar.mdx
index 5bedf1ed01..40ded83663 100644
--- a/packages/twenty-docs/l/it/user-guide/calendar-emails/capabilities/calendar.mdx
+++ b/packages/twenty-docs/l/it/user-guide/calendar-emails/capabilities/calendar.mdx
@@ -1,19 +1,19 @@
---
title: Calendario
-description: Understanding calendar integration features in Twenty.
+description: Informazioni sulle funzionalità di integrazione del calendario in Twenty.
---
-**Note**: To connect your calendar and configure sync settings, visit [Email & Calendar Setup](/l/it/user-guide/calendar-emails/overview).
+**Nota**: Per connettere il tuo calendario e configurare le impostazioni di sincronizzazione, visita [Configurazione Email e Calendario](/l/it/user-guide/calendar-emails/overview).
-## How Calendar Integration Works
+## Come funziona l'integrazione del calendario
-Twenty automatically syncs your calendar events and links them to the relevant CRM records, giving you a complete view of your meeting history with contacts and companies.
+Twenty sincronizza automaticamente gli eventi del tuo calendario e li collega ai relativi record del CRM, offrendoti una visione completa della cronologia delle riunioni con contatti e aziende.
## Scheda del calendario
-Next to the Emails tab on records, you'll find a `Calendar` tab that contains the history of meetings scheduled with the record.
+Accanto alla scheda Email nei record, troverai una scheda `Calendario` che contiene la cronologia delle riunioni programmate con il record.
-### Available For
+### Disponibile per
* **Persone**: Visualizza tutte le riunioni programmate con un contatto specifico
* **Aziende**: Vedi tutte le riunioni relative a un'azienda e ai suoi dipendenti
@@ -26,18 +26,18 @@ Next to the Emails tab on records, you'll find a `Calendar` tab that contains th
3. **Sfoglia la cronologia delle riunioni**: Visualizza tutte le riunioni programmate e i loro dettagli
4. **Accedi al contesto della riunione**: Vedi i partecipanti, i tempi e le informazioni relative alle riunioni
-## Visibility Settings
+## Impostazioni di visibilità
-Calendar data follows the same visibility settings as emails, ensuring consistent privacy controls across both communication channels.
+I dati del calendario seguono le stesse impostazioni di visibilità delle email, garantendo controlli della privacy coerenti su entrambi i canali di comunicazione.
## Cosa viene sincronizzato
-* **External Meetings**: All meetings with contacts outside your organization
-* **Automatic Linking**: Meetings connect to existing People and Company records based on attendee email addresses
-* **Meeting Details**: Subject, time, duration, and participants
-* **Updates**: New calendar events sync automatically
+* **Riunioni esterne**: Tutte le riunioni con contatti al di fuori della tua organizzazione
+* **Collegamento automatico**: Le riunioni si collegano ai record Persone e Aziende esistenti in base agli indirizzi email dei partecipanti
+* **Dettagli riunione**: Oggetto, orario, durata e partecipanti
+* **Aggiornamenti**: I nuovi eventi del calendario vengono sincronizzati automaticamente
## Cosa non viene sincronizzato
-* **Internal Meetings**: Meetings with only colleagues (same domain) remain private
-* **Private Events**: Events marked as private in your calendar
+* **Riunioni interne**: Le riunioni solo tra colleghi (stesso dominio) rimangono private
+* **Eventi privati**: Eventi contrassegnati come privati nel tuo calendario
diff --git a/packages/twenty-docs/l/it/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx b/packages/twenty-docs/l/it/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
index 47beb33008..e0df3b0f5f 100644
--- a/packages/twenty-docs/l/it/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
+++ b/packages/twenty-docs/l/it/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
@@ -1,5 +1,5 @@
---
-title: Limita le email importate},{
+title: Limit Emails Imported
description: Controlla quali email vengono importate in Twenty.
---
diff --git a/packages/twenty-docs/l/it/user-guide/dashboards/how-tos/dashboards-faq.mdx b/packages/twenty-docs/l/it/user-guide/dashboards/how-tos/dashboards-faq.mdx
index bf2c6b0e0b..9495dff759 100644
--- a/packages/twenty-docs/l/it/user-guide/dashboards/how-tos/dashboards-faq.mdx
+++ b/packages/twenty-docs/l/it/user-guide/dashboards/how-tos/dashboards-faq.mdx
@@ -1,59 +1,59 @@
---
-title: Dashboards FAQ
-description: Frequently asked questions about dashboards in Twenty.
+title: Domande frequenti sui cruscotti},{
+description: Domande frequenti sui cruscotti in Twenty.
---
-
- No, dashboards are currently visible to everyone with access to your Twenty workspace. Private dashboards are not yet available.
+
+ No, al momento i cruscotti sono visibili a chiunque abbia accesso al tuo spazio di lavoro Twenty. I cruscotti privati non sono ancora disponibili.
-
- Dashboards currently display data based on the viewer's timezone. If you're in different regions (e.g., APAC vs. US), you may see slightly different numbers for the same dashboard. We're working on adding a timezone setting per dashboard to ensure consistent data across teams.
+
+ Attualmente i cruscotti mostrano i dati in base al fuso orario di chi li visualizza. Se vi trovate in regioni diverse (ad es., APAC vs. USA), potreste vedere numeri leggermente diversi per lo stesso cruscotto. Stiamo lavorando per aggiungere un'impostazione del fuso orario per ogni cruscotto, per garantire dati coerenti tra i team.
-
- Exporting dashboards is not available at the moment. This feature is on our roadmap.
+
+ L'esportazione dei cruscotti non è disponibile al momento. Questa funzionalità è nella nostra roadmap.
-
- No, sharing dashboards with users outside your Twenty workspace (non-Twenty users) is not currently supported.
+
+ No, al momento la condivisione dei cruscotti con utenti esterni al tuo spazio di lavoro Twenty (utenti non Twenty) non è supportata.
-
- Open the dashboard you want to favorite, then click the star icon. Favorites are personal—they won't affect other users.
+
+ Apri il cruscotto che vuoi aggiungere ai preferiti, quindi fai clic sull'icona a stella. I preferiti sono personali: non influiscono sugli altri utenti.
-
- * **Tabs** organize your dashboard into sections (like pages within the dashboard)
- * **Widgets** are the individual visualizations (charts, numbers, iFrames) within each tab
+
+ * **Le schede** organizzano il tuo cruscotto in sezioni (come pagine all'interno del cruscotto)
+ * **I widget** sono le singole visualizzazioni (grafici, numeri, iFrame) all'interno di ogni scheda
- Structure: Dashboard → Tabs → Widgets
+ Struttura: Cruscotto → Schede → Widget
-
- Bar charts have display limits: 100 bars for horizontal charts, 50 for vertical. If your data exceeds this, add filters to narrow down the results or change the grouping (e.g., group by week instead of day).
+
+ I grafici a barre hanno limiti di visualizzazione: 100 barre per i grafici orizzontali, 50 per quelli verticali. Se i tuoi dati superano questi limiti, aggiungi filtri per restringere i risultati oppure cambia il raggruppamento (ad es., raggruppa per settimana invece che per giorno).
-
- Dashboard-level filters are not available yet, but this feature is on our roadmap. Currently, you need to apply filters to each widget individually.
+
+ I filtri a livello di cruscotto non sono ancora disponibili, ma questa funzionalità è nella nostra roadmap. Attualmente è necessario applicare i filtri a ciascun widget singolarmente.
-
- Non ancora. Gauge charts and tables are on our roadmap and will be added in a future release.
+
+ Non ancora. I grafici a indicatore (gauge) e le tabelle sono nella nostra roadmap e verranno aggiunti in una versione futura.
-
- 1. Make sure you're in view mode (not editing)
- 2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
- 3. Select **Duplicate dashboard**
+
+ 1. Assicurati di essere in modalità visualizzazione (non in modifica)
+ 2. Apri la barra dei comandi con **Cmd + K** (oppure **Ctrl + K** su Windows)
+ 3. Seleziona **Duplica cruscotto**
-
- Widgets update automatically as your CRM data changes:
+
+ I widget si aggiornano automaticamente quando i dati del tuo CRM cambiano:
- * Real-time updates for most metrics
- * Use the refresh button for a manual update if needed
- * Historical data is preserved for trend analysis
+ * Aggiornamenti in tempo reale per la maggior parte delle metriche
+ * Se necessario, usa il pulsante di aggiornamento per un aggiornamento manuale
+ * I dati storici sono conservati per l'analisi delle tendenze
diff --git a/packages/twenty-docs/l/it/user-guide/data-migration/capabilities/field-mapping.mdx b/packages/twenty-docs/l/it/user-guide/data-migration/capabilities/field-mapping.mdx
index daa28f8381..c293d75db2 100644
--- a/packages/twenty-docs/l/it/user-guide/data-migration/capabilities/field-mapping.mdx
+++ b/packages/twenty-docs/l/it/user-guide/data-migration/capabilities/field-mapping.mdx
@@ -1,176 +1,176 @@
---
-title: Field Mapping
-description: How field mapping works during data import.
+title: Mappatura dei campi
+description: Come funziona la mappatura dei campi durante l'importazione dei dati.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-## How Field Mapping Works
+## Come funziona la mappatura dei campi
-When you upload a file, Twenty analyzes your columns and attempts to match them to existing fields.
+Quando carichi un file, Twenty analizza le colonne e tenta di abbinarle ai campi esistenti.
-### Automatic Mapping
+### Mappatura automatica
-Twenty tries to match columns based on:
+Twenty tenta di abbinare le colonne in base a:
-* Column header names (exact or similar matches)
-* Data type detection (dates, numbers, emails)
-* Common field patterns
+* Nomi delle intestazioni di colonna (corrispondenze esatte o simili)
+* Rilevamento del tipo di dati (date, numeri, email)
+* Modelli comuni dei campi
-**Quick tip:** Export a few rows from the object you want to import. The exported file will have the exact column names Twenty expects, making automatic mapping seamless during import.
+**Suggerimento rapido:** Esporta alcune righe dall'oggetto che desideri importare. Il file esportato avrà esattamente i nomi di colonna che Twenty si aspetta, rendendo la mappatura automatica agevole durante l'importazione.
-### Manual Mapping Options
+### Opzioni di mappatura manuale
-For each column, you can:
+Per ogni colonna, puoi:
-* **Map to a field**: Select the matching Twenty field from a dropdown
-* **Do not map**: Skip the column entirely (data won't be imported)
+* **Mappa a un campo**: seleziona dal menu a discesa il campo di Twenty corrispondente
+* **Non mappare**: salta completamente la colonna (i dati non verranno importati)
-**Fields must exist before import.** The import creates records, not fields. Create custom fields under **Settings → Data Model** before importing.
+**I campi devono esistere prima dell'importazione.** L'importazione crea record, non campi. Crea i campi personalizzati in **Impostazioni → Modello dati** prima di importare.
-## Field Type Compatibility
+## Compatibilità dei tipi di campo
-All field types available in the Data Model are supported for import.
+Tutti i tipi di campo disponibili nel Modello dati sono supportati per l'importazione.
-You can also import `id` values to either assign a specific ID to new records or update existing ones.
+Puoi anche importare valori di `id` per assegnare un ID specifico ai nuovi record oppure aggiornare quelli esistenti.
-## Data Format Requirements
+## Requisiti del formato dei dati
-**Some fields have special syntax.** We recommend downloading the sample file before preparing your import to see the expected syntax for each field type.
+**Alcuni campi hanno una sintassi speciale.** Consigliamo di scaricare il file di esempio prima di preparare l'importazione per vedere la sintassi prevista per ciascun tipo di campo.
-### Address Fields
+### Campi indirizzo
-Address is a nested field with multiple columns. Some can be left empty.
+Indirizzo è un campo annidato con più colonne. Alcuni possono essere lasciati vuoti.
-* **Address / Address 1**: Street address line 1
-* **Address / Address 2**: Street address line 2
-* **Address / City**: City name
-* **Address / State**: State or province
-* **Address / Country**: Country name
-* **Address / Post Code**: Postal/ZIP code
+* **Indirizzo / Indirizzo 1**: Prima riga dell'indirizzo
+* **Indirizzo / Indirizzo 2**: Seconda riga dell'indirizzo
+* **Indirizzo / Città**: Nome della città
+* **Indirizzo / Stato**: Stato o provincia
+* **Indirizzo / Paese**: Nome del paese
+* **Indirizzo / Codice postale**: Codice postale/CAP
-### Array Fields
+### Campi array
-Use the following format:
+Usa il seguente formato:
```
-["value1","value2"]
+[\"value1\",\"value2\"]
```
-### Boolean Fields
+### Campi booleani
-Use `TRUE` or `FALSE` (uppercase) - not `true` or `false`
+Usa `TRUE` o `FALSE` (maiuscolo), non `true` o `false`
-### Currency Fields
+### Campi valuta
-Currency is a nested field with two columns that **both must be filled**:
+Valuta è un campo annidato con due colonne che **devono essere entrambe compilate**:
-* **Amount / Amount**: The numeric value (e.g., `1234.56`)
-* **Amount / Currency**: The currency code (e.g., `USD`, `EUR`)
+* **Importo / Importo**: Il valore numerico (es. `1234.56`)
+* **Importo / Valuta**: Il codice valuta (es. `USD`, `EUR`)
-### Date Fields
+### Campi data
-Supported formats:
+Formati supportati:
-* `YYYY-MM-DD` (recommended)
+* `YYYY-MM-DD` (consigliato)
* `MM/DD/YYYY`
* `DD/MM/YYYY`
-* ISO 8601 format
+* Formato ISO 8601
-### Domain Fields
+### Campi dominio
-* It is recommended to use the format `https://domain.com` to avoid creating duplicates, as this is the format used for Companies created by the mailbox and calendar synchronizations
-* A `Domain Label` and `Domain URL` can be filled: best practice is to fill `domain.com` in the label and `https://domain.com` in the url
-* Domains must be unique within the Companies object
-* **Domains must be unique within the file to import**
+* Si consiglia di usare il formato `https://domain.com` per evitare la creazione di duplicati, poiché è il formato utilizzato per le Aziende create dalle sincronizzazioni della casella di posta e del calendario
+* Si possono compilare `Domain Label` e `Domain URL`: la pratica consigliata è inserire `domain.com` nell'etichetta e `https://domain.com` nell'URL
+* I domini devono essere univoci all'interno dell'oggetto Aziende
+* **I domini devono essere univoci all'interno del file da importare**
-### Email Fields
+### Campi email
-* Must be valid email format
-* Emails must be unique within the People object
-* **Emails must be unique within the file to import**
-* For additional emails: use **Emails / Primary Email** for the main email, and **Emails / Additional Emails** with this format:
+* Devono avere un formato email valido
+* Le email devono essere univoche all'interno dell'oggetto Persone
+* **Le email devono essere univoche all'interno del file da importare**
+* Per email aggiuntive: usa **Email / Email primaria** per l'email principale e **Email / Email aggiuntive** con questo formato:
```
-["jane@twenty.com","jane.doe@twenty.com"]
+[\"jane@twenty.com\",\"jane.doe@twenty.com\"]
```
-### Id Fields
+### Campi ID
-Specifying an `id` during import is optional. Twenty auto-generates one if not provided.
+Specificare un `id` durante l'importazione è facoltativo. Twenty ne genera automaticamente uno se non viene fornito.
-Use cases for mapping an `id` column:
+Casi d'uso per la mappatura di una colonna `id`:
-* **Set a specific ID**: Choose the UUID for newly created records
-* **Update existing records**: Match against existing records to update them instead of creating duplicates. In that case, it is recommended to not map the other unique fields: mapping only one unique field ensures a smoother import.
+* **Imposta un ID specifico**: scegli l'UUID per i record appena creati
+* **Aggiorna i record esistenti**: abbinali ai record esistenti per aggiornarli, invece di creare duplicati. In tal caso, si consiglia di non mappare gli altri campi univoci: mappare un solo campo univoco garantisce un'importazione più fluida.
-If you provide an `id`, it must be in UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
+Se fornisci un `id`, deve essere nel formato UUID (ad es. `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
-### JSON Fields
+### Campi JSON
-Use valid JSON format:
+Usa un formato JSON valido:
```
-{"key":"value","key2":"value2"}
+{\"key\":\"value\",\"key2\":\"value2\"}
```
-### Links Fields
+### Campi link
-Similar to Domain fields:
+Simili ai campi dominio:
-* Fill both the label and URL columns: **Links / Link URL** and **Links / Link Label**
-* Use full URL format: `https://example.com`
-* For secondary links, use **Links / Secondary Links** column with this format:
+* Compila sia la colonna etichetta sia la colonna URL: **Link / URL del link** e **Link / Etichetta del link**
+* Usa il formato URL completo: `https://example.com`
+* Per i link secondari, usa la colonna **Link / Link secondari** con questo formato:
```
-[{"url":"https://twenty.com","label":"Twenty"}]
+[{\"url\":\"https://twenty.com\",\"label\":\"Twenty\"}]
```
-### Multi-Select Fields
+### Campi a selezione multipla
-Use the **API names** (not the display labels) in the following format:
+Usa i nomi API (non le etichette visualizzate) nel seguente formato:
```
-["VALUE1","VALUE2"]
+[\"VALUE1\",\"VALUE2\"]
```
-See [here](#finding-api-names-for-select-fields) where to find the API names.
+Vedi [qui](#finding-api-names-for-select-fields) dove trovare i nomi API.
-New select options will not be created automatically by the import. They must be added under **Settings → Data Model** before importing.
+Le nuove opzioni di selezione non verranno create automaticamente dall'importazione. Devono essere aggiunte in **Impostazioni → Modello dati** prima di importare.
- **Import overwrites, it does not add.**
+ **L'importazione sovrascrive, non aggiunge.**
- If a record already has `VALUE2` and `VALUE3` selected, and you import `["VALUE1"]`, the record will only have `VALUE1` after import. The previous selections are replaced, not merged.
+ Se un record ha già selezionato `VALUE2` e `VALUE3` e importi `[\"VALUE1\"]`, il record avrà solo `VALUE1` dopo l'importazione. Le selezioni precedenti vengono sostituite, non unite.
-### Number Fields
+### Campi numerici
-* Numbers only
-* Decimals use period: `1234.56`
-* No thousands separators
+* Solo numeri
+* Per i decimali si usa il punto: `1234.56`
+* Nessun separatore delle migliaia
-### Phone Fields
+### Campi telefono
-Phone is a nested field with multiple columns that **must be filled**
+Telefono è un campo annidato con più colonne che **devono essere compilate**
-* **Phones / Primary Phone Number**: The phone number (e.g., `4159095555`)
-* **Phones / Primary Phone Country Code**: Country code (e.g., `US`)
-* **Phones / Primary Phone Calling Code**: Dialing code (e.g., `+1`)
+* **Telefoni / Numero di telefono principale**: Il numero di telefono (es. `4159095555`)
+* **Telefoni / Codice paese del telefono principale**: Codice paese (es. `US`)
+* **Telefoni / Prefisso di chiamata del telefono principale**: Prefisso di chiamata (es. `+1`)
-### Rating Fields
+### Campi valutazione
-Use the API name format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, `RATING_5`
+Usa il formato del nome API: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, `RATING_5`
### Campi di Relazione
-Please see our dedicated article: [Import Relations Between Objects](/l/it/user-guide/data-migration/capabilities/import-relations)
+Consulta il nostro articolo dedicato: [Importare relazioni tra oggetti](/l/it/user-guide/data-migration/capabilities/import-relations)
### Campi Selezione
-Use the **API name** of the option (not the display label):
+Usa il nome API dell'opzione (non l'etichetta visualizzata):
```
VALUE1
diff --git a/packages/twenty-docs/l/it/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx b/packages/twenty-docs/l/it/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
index 10b396e7f5..2269f574fe 100644
--- a/packages/twenty-docs/l/it/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
+++ b/packages/twenty-docs/l/it/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
@@ -87,114 +87,114 @@ Il telefono è un **campo annidato** che richiede più colonne:
| **Telefoni / Codice paese del telefono principale** | `US` |
| **Telefoni / Prefisso internazionale del telefono principale** | `+1` |
-### Address Fields
+### Campi indirizzo
-Address is a **nested field** with multiple columns (some can be left empty):
+Indirizzo è un **campo annidato** con più colonne (alcune possono essere lasciate vuote):
-* **Address / Address 1**: Street address line 1
-* **Address / Address 2**: Street address line 2 (optional)
-* **Address / City**: City name
-* **Address / State**: State or province
-* **Address / Country**: Country name
-* **Address / Post Code**: Postal/ZIP code
+* **Indirizzo / Indirizzo 1**: Riga indirizzo 1
+* **Indirizzo / Indirizzo 2**: Riga indirizzo 2 (facoltativa)
+* **Indirizzo / Città**: Nome città
+* **Indirizzo / Stato**: Stato o provincia
+* **Indirizzo / Paese**: Nome paese
+* **Indirizzo / Codice postale**: Codice postale/CAP
-### Date Fields
+### Campi data
-Use consistent formatting throughout your file:
+Usa un formato coerente in tutto il file:
-* `YYYY-MM-DD` (recommended): `2024-03-15`
+* `YYYY-MM-DD` (consigliato): `2024-03-15`
* `MM/DD/YYYY`: `03/15/2024`
* `DD/MM/YYYY`: `15/03/2024`
* ISO 8601: `2024-03-15T10:30:00Z`
-### Number Fields
+### Campi numerici
-* Numbers only (no text)
-* Use period for decimals: `1234.56`
-* No thousands separators (not `1,234.56`)
+* Solo numeri (nessun testo)
+* Usa il punto per i decimali: `1234.56`
+* Nessun separatore delle migliaia (non `1,234.56`)
-### Currency Fields
+### Campi valuta
-Currency is a **nested field** requiring two columns that **both must be filled**:
+Valuta è un **campo annidato** che richiede due colonne che **devono essere entrambe compilate**:
-| Column | Esempio |
+| Colonna | Esempio |
| --------------------- | --------- |
-| **Amount / Amount** | `1234.56` |
-| **Amount / Currency** | `USD` |
+| **Importo / Importo** | `1234.56` |
+| **Importo / Valuta** | `USD` |
-### Boolean Fields
+### Campi booleani
-Use uppercase: `TRUE` or `FALSE`
+Usa il maiuscolo: `TRUE` o `FALSE`
-Lowercase `true` or `false` will not work.
+Le minuscole `true` o `false` non funzioneranno.
### Campi Selezione
-Use the **API name** of the option, not the display label.
+Usa il **nome API** dell'opzione, non l'etichetta di visualizzazione.
-**How to find API names:**
+**Come trovare i nomi API:**
-1. Go to **Settings → Data Model**
-2. Select the object and field
-3. Enable **Advanced mode** (toggle at bottom right)
-4. Copy the API name (e.g., `OPTION_1`, not "Option 1")
+1. Vai a **Impostazioni → Modello dati**
+2. Seleziona l'oggetto e il campo
+3. Abilita la **Modalità avanzata** (interruttore in basso a destra)
+4. Copia il nome API (ad es., `OPTION_1`, non "Option 1")
-New select options are not created automatically. Add them in **Settings → Data Model** before importing.
+Le nuove opzioni di selezione non vengono create automaticamente. Aggiungile in **Impostazioni → Modello dati** prima di importare.
-### Multi-Select Fields
+### Campi a selezione multipla
-Use API names in array format:
+Usa i nomi API in formato array:
```
["VALUE1","VALUE2"]
```
-### Array Fields
+### Campi array
-Use JSON array format:
+Usa il formato array JSON:
```
["value1","value2"]
```
-### Rating Fields
+### Campi di valutazione
-Use the format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, or `RATING_5`
+Usa il formato: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4` o `RATING_5`
-### Links/URL Fields
+### Campi Link/URL
-Fill both columns:
+Compila entrambe le colonne:
-* **Links / Link Label**: `Twenty`
-* **Links / Link URL**: `https://twenty.com`
+* **Link / Etichetta del link**: `Twenty`
+* **Link / URL del link**: `https://twenty.com`
-For secondary links, use the **Links / Secondary Links** column:
+Per i link secondari, usa la colonna **Link / Link secondari**:
```
[{"url":"https://twenty.com","label":"Twenty"}]
```
-### JSON Fields
+### Campi JSON
-Use valid JSON format:
+Usa un formato JSON valido:
```
{"key":"value","key2":"value2"}
```
-### ID Fields
+### Campi ID
-* **Optional**: Twenty auto-generates IDs if not provided
-* **Format**: UUID (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`)
-* **Use case**: Include ID to update existing records instead of creating new ones
+* **Opzionale**: Twenty genera automaticamente gli ID se non forniti
+* **Formato**: UUID (ad es., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`)
+* **Caso d'uso**: Includi l'ID per aggiornare i record esistenti invece di crearne di nuovi
-## Step 5: Add Relation Columns (If Linking Records)
+## Passaggio 5: Aggiungi colonne di relazione (se colleghi record)
-To link records to other objects (e.g., People to Companies), add a column with the unique identifier of the related record.
+Per collegare i record ad altri oggetti (ad es., Persone ad Aziende), aggiungi una colonna con l'identificatore univoco del record correlato.
-**Example**: Linking People to Companies
+**Esempio**: collegare Persone ad Aziende
-Add a column to your People CSV:
+Aggiungi una colonna al CSV Persone:
```
firstName,lastName,email,companyDomain
@@ -202,69 +202,69 @@ John,Smith,john@acme.com,https://acme.com
Jane,Doe,jane@widgets.co,https://widgets.co
```
-**Important rules for relations:**
+**Regole importanti per le relazioni:**
-* The parent record must already exist in Twenty
-* Use the **Domain URL** format (`https://domain.com`), not the label
-* Map only ONE unique identifier (don't include both `companyId` AND `companyDomain`)
-* For Workspace Members, use their **email** (not name)
+* Il record padre deve già esistere in Twenty
+* Usa il formato **URL del dominio** (`https://domain.com`), non l'etichetta
+* Mappa un solo identificatore univoco (non includere sia `companyId` che `companyDomain`)
+* Per i membri dello spazio di lavoro, usa la loro **email** (non il nome)
- **Import Order Matters!**
+ **L'ordine di importazione è importante!**
- Import the "one" side before the "many" side:
+ Importa il lato "uno" prima del lato "molti":
- 1. **Companies** first
- 2. **People** second (with company reference)
- 3. **Opportunities** third
+ 1. **Aziende** prima
+ 2. **Persone** poi (con riferimento all'azienda)
+ 3. **Opportunità** al terzo posto
- The parent record must exist before you can reference it.
+ Il record padre deve esistere prima di potervi fare riferimento.
-See [How to Import Relations](/l/it/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for detailed instructions.
+Consulta [Come importare le relazioni](/l/it/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) per istruzioni dettagliate.
-## Step 6: Ensure Fields Exist in Twenty
+## Passaggio 6: Verifica che i campi esistano in Twenty
-The import creates **records**, not **fields**. All fields you want to import must already exist in your data model.
+L'importazione crea record, non campi. Tutti i campi che vuoi importare devono già esistere nel tuo modello dati.
-**Before importing:**
+**Prima di importare:**
-1. Go to **Settings → Data Model**
-2. Select your object
-3. Create any custom fields you need
-4. Note the exact field names (they must match your column headers)
+1. Vai a **Impostazioni → Modello dati**
+2. Seleziona il tuo oggetto
+3. Crea gli eventuali campi personalizzati necessari
+4. Annota i nomi esatti dei campi (devono corrispondere alle intestazioni delle colonne)
-## Step 7: Final Checklist
+## Passaggio 7: Lista di controllo finale
-Before uploading your file, verify:
+Prima di caricare il file, verifica:
-File is CSV, XLSX, or XLS format
-File has fewer than 10,000 records
-Encoding is UTF-8
-No duplicate emails (for People) or domains (for Companies)
-Dates use consistent format throughout
-Domains use `https://domain.com` format
-Boolean fields use `TRUE` or `FALSE` (uppercase)
-Select fields use API names, not display labels
-All custom fields exist in Settings → Data Model
-Parent records imported before child records
-Relation columns reference existing records
+Il file è in formato CSV, XLSX o XLS
+Il file contiene meno di 10.000 record
+La codifica è UTF-8
+Nessuna email duplicata (per Persone) o domini (per Aziende)
+Le date usano un formato coerente ovunque
+I domini usano il formato `https://domain.com`
+I campi booleani usano `TRUE` o `FALSE` (maiuscolo)
+I campi di selezione usano i nomi API, non le etichette di visualizzazione
+Tutti i campi personalizzati esistono in Impostazioni → Modello dati
+I record padre sono importati prima dei record figlio
+Le colonne di relazione fanno riferimento a record esistenti
-## Common Mistakes to Avoid
+## Errori comuni da evitare
-| Mistake | Solution |
-| -------------------------------------------- | ------------------------------------- |
-| Using `true` instead of `TRUE` | Boolean values must be uppercase |
-| Using display labels for Select fields | Find and use API names in Settings |
-| Importing People before Companies | Always import parent objects first |
-| Missing currency code for Currency fields | Fill both Amount and Currency columns |
-| Wrong domain format | Use `https://domain.com` consistently |
-| Mapping multiple unique fields for relations | Map only ONE (domain OR id, not both) |
+| Errore | Soluzione |
+| --------------------------------------------------------------- | ---------------------------------------------------- |
+| Uso di `true` invece di `TRUE` | I valori booleani devono essere in maiuscolo |
+| Uso delle etichette di visualizzazione per i campi di selezione | Trova e usa i nomi API in Impostazioni |
+| Importare Persone prima delle Aziende | Importa sempre prima gli oggetti padre |
+| Codice valuta mancante per i campi di valuta | Compila sia la colonna Importo sia la colonna Valuta |
+| Formato di dominio errato | Usa `https://domain.com` in modo coerente |
+| Mappatura di più campi univoci per le relazioni | Mappa solo UNO (dominio O id, non entrambi) |
## Prossimi Passi
-Your file is ready! Now:
+Il tuo file è pronto! Ora:
-* [Import Companies](/l/it/user-guide/data-migration/how-tos/import-companies-via-csv) (import these first)
-* [Import Contacts](/l/it/user-guide/data-migration/how-tos/import-contacts-via-csv)
-* [Fix any import errors](/l/it/user-guide/data-migration/how-tos/fix-import-errors)
+* [Importa Aziende](/l/it/user-guide/data-migration/how-tos/import-companies-via-csv) (importale per prime)
+* [Importa Contatti](/l/it/user-guide/data-migration/how-tos/import-contacts-via-csv)
+* [Correggi eventuali errori di importazione](/l/it/user-guide/data-migration/how-tos/fix-import-errors)
diff --git a/packages/twenty-docs/l/it/user-guide/data-model/how-tos/create-relation-fields.mdx b/packages/twenty-docs/l/it/user-guide/data-model/how-tos/create-relation-fields.mdx
index 4a8fd22399..265814862a 100644
--- a/packages/twenty-docs/l/it/user-guide/data-model/how-tos/create-relation-fields.mdx
+++ b/packages/twenty-docs/l/it/user-guide/data-model/how-tos/create-relation-fields.mdx
@@ -1,60 +1,60 @@
---
-title: Create Relation Fields
-description: Step-by-step guide to connecting objects with relation fields.
+title: Creazione di Campi di Relazione
+description: Guida passo passo per collegare gli oggetti con campi di relazione.
---
-Relation fields connect records from different objects—for example, linking People to Companies.
+I campi di relazione collegano record di oggetti diversi — ad esempio, collegando Persone ad Aziende.
- **Relation names cannot be changed after creation** (they affect the API). Plan your names carefully.
+ **I nomi delle relazioni non possono essere modificati dopo la creazione** (influiscono sull'API). Pianifica con attenzione i nomi.
## Prima di Iniziare
-Decide:
+Decidi:
-* Which objects are you connecting? (e.g., People → Companies)
-* Which is the "one" side? (e.g., Company)
-* Which is the "many" side? (e.g., People — many people work at one company)
-* What should the field be named on each side?
+* Quali oggetti stai collegando? (ad es., Persone → Aziende)
+* Qual è il lato "uno"? (ad es., Azienda)
+* Qual è il lato "molti"? (ad es., Persone — molte persone lavorano per una sola azienda)
+* Quale nome dovrebbe avere il campo su ciascun lato?
-See [Relation Fields](/l/it/user-guide/data-model/capabilities/relation-fields) for relation types explained.
+Consulta [Campi di Relazione](/l/it/user-guide/data-model/capabilities/relation-fields) per la spiegazione dei tipi di relazione.
-## Steps
+## Passaggi
-1. Go to **Settings → Data Model**
-2. Select the object where you want the relation (typically the "many" side)
-3. Click **+ Add Field**
-4. Select **Relation** as the field type
-5. Choose the **target object**
-6. Select **One-to-Many** or **Many-to-One**
-7. Enter field names for **both sides** of the relation
+1. Vai a **Impostazioni → Modello dati**
+2. Seleziona l'oggetto in cui vuoi la relazione (in genere il lato "molti")
+3. Fai clic su **+ Aggiungi campo**
+4. Seleziona **Relazione** come tipo di campo
+5. Scegli l'**oggetto di destinazione**
+6. Seleziona **Uno-a-molti** o **Molti-a-uno**
+7. Inserisci i nomi dei campi per **entrambi i lati** della relazione
8. Clicca su **Salva**
-## Example: People → Companies
+## Esempio: Persone → Aziende
-* Go to **Settings → Data Model → People**
-* Add a Relation field
-* Target: **Companies**
-* Type: **Many-to-One**
-* Field on People: **Company**
-* Field on Companies: **Employees**
+* Vai a **Impostazioni → Modello dati → Persone**
+* Aggiungi un campo di relazione
+* Destinazione: **Aziende**
+* Tipo: **Molti-a-uno**
+* Campo su Persone: **Azienda**
+* Campo su Aziende: **Dipendenti**
-Now each Person can be linked to a Company, and each Company shows its People.
+Ora ogni Persona può essere collegata a un'Azienda e ogni Azienda mostra le proprie Persone.
-## Deleting a Relation
+## Eliminare una relazione
-1. Go to **Settings → Data Model**
-2. Find the relation field
-3. Click **⋮ → Deactivate**
+1. Vai a **Impostazioni → Modello dati**
+2. Trova il campo di relazione
+3. Fai clic su **⋮ → Disattiva**
-Links are preserved but hidden. Reactivate to restore.
+I collegamenti vengono conservati ma nascosti. Riattiva per ripristinare.
- **Deleting a relation doesn't delete records.** Only the link between them is removed.
+ **Eliminare una relazione non elimina i record.** Viene rimosso solo il collegamento tra di essi.
-## Related
+## Correlati
-* [Relation Fields](/l/it/user-guide/data-model/capabilities/relation-fields) — types and limitations
-* [How to Import Relations](/l/it/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) — bulk import linked records
+* [Campi di Relazione](/l/it/user-guide/data-model/capabilities/relation-fields) — tipi e limitazioni
+* [Come importare le relazioni](/l/it/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) — importazione massiva di record collegati
diff --git a/packages/twenty-docs/l/it/user-guide/data-model/how-tos/customize-your-data-model.mdx b/packages/twenty-docs/l/it/user-guide/data-model/how-tos/customize-your-data-model.mdx
index 01fa9a7e09..e812a124ea 100644
--- a/packages/twenty-docs/l/it/user-guide/data-model/how-tos/customize-your-data-model.mdx
+++ b/packages/twenty-docs/l/it/user-guide/data-model/how-tos/customize-your-data-model.mdx
@@ -1,5 +1,5 @@
---
-title: Personalizza il tuo modello di dati},{
+title: Customize Your Data Model
description: Panoramica delle opzioni di personalizzazione del modello di dati.
---
diff --git a/packages/twenty-docs/l/it/user-guide/permissions-access/overview.mdx b/packages/twenty-docs/l/it/user-guide/permissions-access/overview.mdx
index 8435af9755..0087e3c195 100644
--- a/packages/twenty-docs/l/it/user-guide/permissions-access/overview.mdx
+++ b/packages/twenty-docs/l/it/user-guide/permissions-access/overview.mdx
@@ -1,5 +1,5 @@
---
-title: Permessi e accesso},{
+title: Permissions & Access
description: Gestisci ruoli, permessi e il controllo degli accessi nel tuo spazio di lavoro.
---
diff --git a/packages/twenty-docs/l/it/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx b/packages/twenty-docs/l/it/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
index 6da388c8cd..8806e861e4 100644
--- a/packages/twenty-docs/l/it/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
+++ b/packages/twenty-docs/l/it/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
@@ -1,5 +1,5 @@
---
-title: Limita l'accesso alla tua visualizzazione},{
+title: Restrict Access to Your View
description: Controlla chi può vedere le tue visualizzazioni personalizzate.
---
diff --git a/packages/twenty-docs/l/it/user-guide/workflows/capabilities/workflow-branches.mdx b/packages/twenty-docs/l/it/user-guide/workflows/capabilities/workflow-branches.mdx
index 41aa3d5bb1..cd9d24f392 100644
--- a/packages/twenty-docs/l/it/user-guide/workflows/capabilities/workflow-branches.mdx
+++ b/packages/twenty-docs/l/it/user-guide/workflows/capabilities/workflow-branches.mdx
@@ -1,5 +1,5 @@
---
-title: Rami dei flussi di lavoro},{
+title: Workflow Branches
description: Crea percorsi paralleli e logica condizionale nei tuoi flussi di lavoro.
---
diff --git a/packages/twenty-docs/l/it/user-guide/workflows/capabilities/workflow-runs.mdx b/packages/twenty-docs/l/it/user-guide/workflows/capabilities/workflow-runs.mdx
index 4d612af27d..58f96174e2 100644
--- a/packages/twenty-docs/l/it/user-guide/workflows/capabilities/workflow-runs.mdx
+++ b/packages/twenty-docs/l/it/user-guide/workflows/capabilities/workflow-runs.mdx
@@ -1,92 +1,92 @@
---
title: Esecuzioni del workflow
-description: Monitor and manage workflow executions.
+description: Monitora e gestisci le esecuzioni dei flussi di lavoro.
image: /images/user-guide/workflows/workflow.png
---
-## About Runs
+## Informazioni sulle esecuzioni
-A **Run** is a record of a workflow execution. Every time a workflow is triggered—whether by a record event, schedule, manual action, or webhook—a new run is created.
+Un'**Esecuzione** è una registrazione dell'esecuzione di un flusso di lavoro. Ogni volta che un flusso di lavoro viene attivato — che sia da un evento di record, una pianificazione, un'azione manuale o un webhook — viene creata una nuova esecuzione.
-## Viewing Runs
+## Visualizzazione delle esecuzioni
-### From the Workflow Editor
+### Dall'editor del flusso di lavoro
-1. Open the workflow you want to monitor
-2. Click the **Runs** panel on the right side
-3. See a list of recent runs with their status
+1. Apri il flusso di lavoro che desideri monitorare
+2. Fai clic sul pannello **Esecuzioni** a destra
+3. Visualizza un elenco delle esecuzioni recenti con il relativo stato
-### From the Workflow Runs View
+### Dalla vista Esecuzioni dei flussi di lavoro
-1. Go to **Workflow Runs** in the sidebar
-2. View runs across all workflows
-3. Filter by status, workflow, or date
+1. Vai a **Esecuzioni dei flussi di lavoro** nella barra laterale
+2. Visualizza le esecuzioni in tutti i flussi di lavoro
+3. Filtra per stato, flusso di lavoro o data
-## Run Statuses
+## Stati delle esecuzioni
-| Stato | Descrizione |
-| ----------------- | ------------------------------------------------------------------------ |
-| **In esecuzione** | Workflow is currently executing |
-| **Completed** | Workflow finished successfully |
-| **Failed** | Workflow encountered an error and stopped |
-| **Waiting** | Workflow is paused (e.g., waiting for a Delay action or Form submission) |
+| Stato | Descrizione |
+| ----------------- | ------------------------------------------------------------------------------------------------- |
+| **In esecuzione** | Il flusso di lavoro è in esecuzione |
+| **Completato** | Il flusso di lavoro è terminato correttamente |
+| **Non riuscito** | Il flusso di lavoro ha riscontrato un errore ed è stato interrotto |
+| **In attesa** | Il flusso di lavoro è in pausa (ad es., in attesa di un'azione Ritardo o dell'invio di un modulo) |
-## Run Details
+## Dettagli dell'esecuzione
-Click on any run to see:
+Fai clic su una qualsiasi esecuzione per visualizzare:
-* **Status**: Current state of the run
-* **Started at**: When the run began
-* **Duration**: How long the run took
-* **Trigger data**: The input that started the workflow
-* **Step outputs**: Data returned by each step
-* **Error messages**: If the run failed, what went wrong
+* **Stato**: stato attuale dell'esecuzione
+* **Ora di avvio**: quando è iniziata l'esecuzione
+* **Durata**: quanto è durata l'esecuzione
+* **Dati del trigger**: l'input che ha avviato il flusso di lavoro
+* **Output dei passaggi**: dati restituiti da ciascun passaggio
+* **Messaggi di errore**: se l'esecuzione non è riuscita, cosa è andato storto
-## Step-by-Step Execution
+## Esecuzione passo dopo passo
-Each run shows the progression through your workflow:
+Ogni esecuzione mostra l'avanzamento nel flusso di lavoro:
-1. See which steps completed successfully
-2. Identify where failures occurred
-3. View the data passed between steps
-4. Debug issues by examining step inputs and outputs
+1. Vedi quali passaggi sono stati completati correttamente
+2. Identifica dove si sono verificati errori
+3. Visualizza i dati scambiati tra i passaggi
+4. Esegui il debug dei problemi esaminando gli input e gli output dei passaggi
-## Error Handling
+## Gestione degli errori
-When a run fails:
+Quando un'esecuzione non riesce:
-1. Open the failed run
-2. Find the step that caused the failure
-3. Check the error message for details
-4. Common issues:
- * Missing required fields
+1. Apri l'esecuzione non riuscita
+2. Trova il passaggio che ha causato l'errore
+3. Controlla il messaggio di errore per i dettagli
+4. Problemi comuni:
+ * Campi obbligatori mancanti
* Formato dati non valido
- * External API errors
- * Permission issues
+ * Errori delle API esterne
+ * Problemi di autorizzazioni
-## Re-running Workflows
+## Eseguire nuovamente i flussi di lavoro
-If a run fails, you can:
+Se un'esecuzione non riesce, puoi:
-* Fix the underlying issue and wait for the next trigger
-* For manual workflows, trigger again with the same or updated data
-* Review the workflow logic to prevent future failures
+* Correggi il problema alla base e attendi il prossimo trigger
+* Per i flussi di lavoro manuali, attivalo di nuovo con gli stessi dati o con dati aggiornati
+* Rivedi la logica del flusso di lavoro per prevenire errori futuri
-## Performance Tips
+## Suggerimenti sulle prestazioni
-### Managing Run History
+### Gestione della cronologia delle esecuzioni
-* Runs are retained for historical reference
-* Very old runs may be archived automatically
-* Export run data if you need to keep records
+* Le esecuzioni vengono conservate per riferimento storico
+* Le esecuzioni molto vecchie possono essere archiviate automaticamente
+* Esporta i dati delle esecuzioni se devi conservare i registri
-### Monitoring Best Practices
+### Pratiche consigliate per il monitoraggio
-* Check runs regularly after activating new workflows
-* Review failed runs to identify patterns
+* Controlla regolarmente le esecuzioni dopo aver attivato nuovi flussi di lavoro
+* Esamina le esecuzioni non riuscite per identificare schemi ricorrenti
-## Related
+## Correlati
-* [Workflow Triggers](/l/it/user-guide/workflows/capabilities/workflow-triggers)
-* [Workflow Actions](/l/it/user-guide/workflows/capabilities/workflow-actions)
-* [Workflow Troubleshooting](/l/it/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)
+* [Trigger dei flussi di lavoro](/l/it/user-guide/workflows/capabilities/workflow-triggers)
+* [Azioni dei flussi di lavoro](/l/it/user-guide/workflows/capabilities/workflow-actions)
+* [Risoluzione dei problemi dei flussi di lavoro](/l/it/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)
diff --git a/packages/twenty-docs/l/it/user-guide/workflows/how-tos/need-more-help/professional-services.mdx b/packages/twenty-docs/l/it/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
index 86ef812a3d..ba534e609a 100644
--- a/packages/twenty-docs/l/it/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
+++ b/packages/twenty-docs/l/it/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
@@ -1,6 +1,6 @@
---
title: Servizi Professionali
-description: Get professional help building complex workflows and automations from Twenty's team and certified partners.
+description: Ottieni assistenza professionale per creare flussi di lavoro e automazioni complessi dal team di Twenty e dai partner certificati.
---
## Quando Hai Bisogno di Aiuto Professionale?
@@ -20,7 +20,7 @@ Considera i servizi professionali per:
Ottieni aiuto dal nostro team principale con i nostri pacchetti di [Onboarding da 4 ore](https://twenty.com/onboarding-packages):
-* **Workflow Creation**: Build custom workflows for your business processes
+* **Creazione di Flussi di Lavoro**: Crea flussi di lavoro personalizzati per i tuoi processi aziendali
* **Progettazione del Modello di Dati**: Ottimizza la tua struttura dei dati per l'automazione dei flussi di lavoro
* **Migrazione dei Dati**: Importa dati esistenti con la giusta integrazione nel flusso di lavoro
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/best-practices-server.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/best-practices-server.mdx
new file mode 100644
index 0000000000..d8f5c5ea7c
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/best-practices-server.mdx
@@ -0,0 +1,22 @@
+---
+title: Best Practices
+---
+
+This document outlines the best practices you should follow when working on the backend.
+
+## Follow a modular approach
+
+The backend follows a modular approach, which is a fundamental principle when working with NestJS. Make sure you break down your code into reusable modules to maintain a clean and organized codebase.
+Each module should encapsulate a particular feature or functionality and have a well-defined scope. This modular approach enables clear separation of concerns and removes unnecessary complexities.
+
+## Expose services to use in modules
+
+Always create services that have a clear and single responsibility, which enhances code readability and maintainability. Name the services descriptively and consistently.
+
+You should also expose services that you want to use in other modules. Exposing services to other modules is possible through NestJS's powerful dependency injection system, and promotes loose coupling between components.
+
+## Avoid using `any` type
+
+When you declare a variable as `any`, TypeScript's type checker doesn't perform any type checking, making it possible to assign any type of values to the variable. TypeScript uses type inference to determine the type of variable based on the value. By declaring it as `any`, TypeScript can no longer infer the type. This makes it hard to catch type-related errors during development, leading to runtime errors and makes the code less maintainable, less reliable, and harder to understand for others.
+
+This is why everything should have a type. So if you create a new object with a first name and last name, you should create an interface or type that contains a first name and last name that defines the shape of the object you are manipulating.
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/custom-objects.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/custom-objects.mdx
new file mode 100644
index 0000000000..7feec7a639
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/custom-objects.mdx
@@ -0,0 +1,39 @@
+---
+title: Custom Objects
+---
+
+Objects are structures that allow you to store data (records, attributes, and values) specific to an organization. Twenty provides both standard and custom objects.
+
+Standard objects are in-built objects with a set of attributes available for all users. Examples of standard objects in Twenty include Company and Person. Standard objects have standard fields that are also available for all Twenty users, like Company.displayName.
+
+Custom objects are objects that you can create to store information that is unique to your organization. They are not built-in; members of your workspace can create and customize custom objects to hold information that standard objects aren't suitable for.
+
+## High-level schema
+
+
+
+
+
+
+
+## How it works
+
+Custom objects come from metadata tables that determine the shape, name, and type of the objects. All this information is present in the metadata schema database, consisting of tables:
+
+* **DataSource**: Details where the data is present.
+* **Object**: Describes the object and links to a DataSource.
+* **Field**: Outlines an Object's fields and connects to the Object.
+
+To add a custom object, the workspaceMember will query the /metadata API. This updates the metadata accordingly and computes a GraphQL schema based on the metadata, storing it in a GQL cache for later use.
+
+
+
+
+
+
+
+To fetch data, the process involves making queries through the /graphql endpoint and passing them through the Query Resolver.
+
+
+
+
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/feature-flags.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/feature-flags.mdx
index 9cf53d125f..a261cfec3c 100644
--- a/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/feature-flags.mdx
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/feature-flags.mdx
@@ -1,12 +1,12 @@
---
-title: 機能フラグ
+title: Feature Flags
---
-機能フラグは試験的な機能を隠すために使用されます。 機能フラグは試験的な機能を隠すために使用されます。 Twentyでは、それらはワークスペースレベルで設定されており、ユーザーレベルではありません。 機能フラグは試験的な機能を隠すために使用されます。 Twentyでは、それらはワークスペースレベルで設定されており、ユーザーレベルではありません。
+Feature flags are used to hide experimental features. For Twenty, they are set on workspace level and not on a user level.
-## 新しい機能フラグの追加
+## Adding a new feature flag
-`FeatureFlagKey.ts`に機能フラグを追加します:
+In `FeatureFlagKey.ts` add the feature flag:
```ts
type FeatureFlagKey =
@@ -14,7 +14,7 @@ type FeatureFlagKey =
| ...;
```
-また、`feature-flag.entity.ts`の列挙型にも追加します:
+Also add it to the enum in `feature-flag.entity.ts`:
```ts
enum FeatureFlagKeys {
@@ -23,7 +23,7 @@ enum FeatureFlagKeys {
}
```
-**バックエンド**機能に機能フラグを適用するには、次を使用します:
+To apply a feature flag on a **backend** feature use:
```ts
@Gate({
@@ -31,16 +31,16 @@ enum FeatureFlagKeys {
})
```
-**フロントエンド**機能に機能フラグを適用するには、次を使用します:
+To apply a feature flag on a **frontend** feature use:
```ts
const isFeatureNameEnabled = useIsFeatureEnabled('IS_FEATURENAME_ENABLED');
```
-## デプロイメント用の機能フラグを設定する
+## Configure feature flags for the deployment
-Table `core.featureFlag` 内の対応するレコードを変更します:
+Change the corresponding record in the Table `core.featureFlag`:
-| id | キー | workspaceId | 値 |
-| ---- | ------------------------ | ----------- | --- |
-| ランダム | `IS_FEATURENAME_ENABLED` | WorkspaceID | `真` |
+| id | key | workspaceId | value |
+| ------ | ------------------------ | ----------- | ------ |
+| Random | `IS_FEATURENAME_ENABLED` | WorkspaceID | `true` |
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx
new file mode 100644
index 0000000000..233d92ac8a
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx
@@ -0,0 +1,125 @@
+---
+title: Folder Architecture
+info: A detailed look into our server folder architecture
+---
+
+The backend directory structure is as follows:
+
+```
+server
+ └───ability
+ └───constants
+ └───core
+ └───database
+ └───decorators
+ └───filters
+ └───guards
+ └───health
+ └───integrations
+ └───metadata
+ └───workspace
+ └───utils
+```
+
+## Ability
+
+Defines permissions and includes handlers for each entity.
+
+## Decorators
+
+Defines custom decorators in NestJS for added functionality.
+
+See [custom decorators](https://docs.nestjs.com/custom-decorators) for more details.
+
+## Filters
+
+Includes exception filters to handle exceptions that might occur in GraphQL endpoints.
+
+## Guards
+
+See [guards](https://docs.nestjs.com/guards) for more details.
+
+## Health
+
+Includes a publicly available REST API (healthz) that returns a JSON to confirm whether the database is working as expected.
+
+## Metadata
+
+Defines custom objects and makes available a GraphQL API (graphql/metadata).
+
+## Workspace
+
+Generates and serves custom GraphQL schema based on the metadata.
+
+### Workspace Directory Structure
+
+```
+workspace
+
+ └───workspace-schema-builder
+ └───factories
+ └───graphql-types
+ └───database
+ └───interfaces
+ └───object-definitions
+ └───services
+ └───storage
+ └───utils
+ └───workspace-resolver-builder
+ └───factories
+ └───interfaces
+ └───workspace-query-builder
+ └───factories
+ └───interfaces
+ └───workspace-query-runner
+ └───interfaces
+ └───utils
+ └───workspace-datasource
+ └───workspace-manager
+ └───workspace-migration-runner
+ └───utils
+ └───workspace.module.ts
+ └───workspace.factory.spec.ts
+ └───workspace.factory.ts
+```
+
+The root of the workspace directory includes the `workspace.factory.ts`, a file containing the `createGraphQLSchema` function. This function generates workspace-specific schema by using the metadata to tailor a schema for individual workspaces. By separating the schema and resolver construction, we use the `makeExecutableSchema` function, which combines these discrete elements.
+
+This strategy is not just about organization, but also helps with optimization, such as caching generated type definitions to enhance performance and scalability.
+
+### Workspace Schema builder
+
+Generates the GraphQL schema, and includes:
+
+#### Factories:
+
+Specialised constructors to generate GraphQL-related constructs.
+
+* The type.factory translates field metadata into GraphQL types using `TypeMapperService`.
+* The type-definition.factory creates GraphQL input or output objects derived from `objectMetadata`.
+
+#### GraphQL Types
+
+Includes enumerations, inputs, objects, and scalars, and serves as the building blocks for the schema construction.
+
+#### Interfaces and Object Definitions
+
+Contains the blueprints for GraphQL entities, and includes both predefined and custom types like `MONEY` or `URL`.
+
+#### Services
+
+Contains the service responsible for associating FieldMetadataType with its appropriate GraphQL scalar or query modifiers.
+
+#### Storage
+
+Includes the `TypeDefinitionsStorage` class that contains reusable type definitions, preventing duplication of GraphQL types.
+
+### Workspace Resolver Builder
+
+Creates resolver functions for querying and mutating the GraphQL schema.
+
+Each factory in this directory is responsible for producing a distinct resolver type, such as the `FindManyResolverFactory`, designed for adaptable application across various tables.
+
+### Workspace Query Runner
+
+Runs the generated queries on the database and parses the result.
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/queue.mdx
new file mode 100644
index 0000000000..6148c0fbf0
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/queue.mdx
@@ -0,0 +1,41 @@
+---
+title: Message Queue
+---
+
+Queues facilitate async operations to be performed. They can be used for performing background tasks such as sending a welcome email on register.
+Each use case will have its own queue class extended from `MessageQueueServiceBase`.
+
+Currently, we only support `bull-mq`[bull-mq](https://bullmq.io/) as the queue driver.
+
+## Steps to create and use a new queue
+
+1. Add a queue name for your new queue under enum `MESSAGE_QUEUES`.
+2. Provide the factory implementation of the queue with the queue name as the dependency token.
+3. Inject the queue that you created in the required module/service with the queue name as the dependency token.
+4. Add worker class with token based injection just like producer.
+
+### Example usage
+
+```ts
+class Resolver {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
+
+ async onSomeAction() {
+ //business logic
+ await this.queue.add(someData);
+ }
+}
+
+//async worker
+class CustomWorker {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
+ this.initWorker();
+ }
+
+ async initWorker() {
+ await this.queue.work(async ({ id, data }) => {
+ //worker logic
+ });
+ }
+}
+```
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/server-commands.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/server-commands.mdx
index aef509c753..6951909788 100644
--- a/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/server-commands.mdx
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/server-commands.mdx
@@ -1,24 +1,19 @@
---
-title: バックエンドコマンド
+title: Backend Commands
---
-## 便利なコマンド
+## Useful commands
-これらのコマンドは packages/twenty-server フォルダから実行してください。
-これらのコマンドは packages/twenty-server フォルダから実行してください。
-これらのコマンドは packages/twenty-server フォルダから実行してください。
-これらのコマンドは packages/twenty-server フォルダから実行してください。
-これらのコマンドは packages/twenty-server フォルダから実行してください。
-これらのコマンドは packages/twenty-server フォルダから実行してください。
+These commands should be executed from packages/twenty-server folder.
From any other folder you can run `npx nx {command} twenty-server` (or `npx nx run twenty-server:{command}`).
-### 初期設定
+### First time setup
```
-npx nx database:reset twenty-server # 開発用のシードでデータベースを設定する
+npx nx database:reset twenty-server # setup the database with dev seeds
```
-### サーバーの起動
+### Starting the server
```
npx nx run twenty-server:start
@@ -27,80 +22,80 @@ npx nx run twenty-server:start
### Lint
```
-npx nx run twenty-server:lint # --fix を付けることでリントエラーを修正可能
+npx nx run twenty-server:lint # pass --fix to fix lint errors
```
-### テスト
+### Test
```
-npx nx run twenty-server:test:unit # 単体テストを実行
-npx nx run twenty-server:test:integration # 統合テストを実行
+npx nx run twenty-server:test:unit # run unit tests
+npx nx run twenty-server:test:integration # run integration tests
```
-注: 統合テストを実行する前にデータベースをリセットする必要がある場合、 `npx nx run twenty-server:test:integration:with-db-reset` を実行できます。
+Note: you can run `npx nx run twenty-server:test:integration:with-db-reset` in case you need to reset the database before running the integration tests.
-### データベースのリセット
+### Resetting the database
-データベースをリセットおよびシードしたい場合は、次のコマンドを実行してください:
+If you want to reset and seed the database, you can run the following command:
```bash
npx nx run twenty-server:database:reset
```
-### マイグレーション
+### Migrations
-#### Core/Metadata スキーマ (TypeORM) のオブジェクトに対して
+#### For objects in Core/Metadata schemas (TypeORM)
```bash
npx nx run twenty-server:typeorm migration:generate src/database/typeorm/core/migrations/nameOfYourMigration -d src/database/typeorm/core/core.datasource.ts
```
-#### ワークスペースオブジェクトに対して
+#### For Workspace objects
-マイグレーションファイルはなく、それぞれのワークスペースに対して自動的に生成され、
-データベースに保存され、このコマンドで適用されます。
+There are no migrations files, migration are generated automatically for each workspace,
+stored in the database, and applied with this command
```bash
npx nx run twenty-server:command workspace:sync-metadata -f
```
- これによりデータベースが削除され、マイグレーションとシードが再実行されます。
+ This will drop the database and re-run the migrations and seed.
- このコマンドを実行する前に、保持したいデータをバックアップしてください。
+ Make sure to back up any data you want to keep before running this command.
-## 技術スタック
+## Tech Stack
-Twenty は主にバックエンドに NestJS を使用しています。
+Twenty primarily uses NestJS for the backend.
-最初に使用した ORM は Prisma でした。 最初に使用した ORM は Prisma でした。 But in order to allow users to create custom fields and custom objects, a lower-level made more sense as we need to have fine-grained control. 最初に使用した ORM は Prisma でした。 But in order to allow users to create custom fields and custom objects, a lower-level made more sense as we need to have fine-grained control. 現在のプロジェクトでは TypeORM を使用しています。
+Prisma was the first ORM we used. But in order to allow users to create custom fields and custom objects, a lower-level made more sense as we need to have fine-grained control. The project now uses TypeORM.
-現在の技術スタックは次のようになっています。
+Here's what the tech stack now looks like.
-**コア**
+**Core**
* [NestJS](https://nestjs.com/)
* [TypeORM](https://typeorm.io/)
* [GraphQL Yoga](https://the-guild.dev/graphql/yoga-server)
-**データベース**
+**Database**
* [Postgres](https://www.postgresql.org/)
-**サードパーティ統合**
+**Third-party integrations**
-* [Sentry](https://sentry.io/welcome/) バグトラッキング用
+* [Sentry](https://sentry.io/welcome/) for tracking bugs
-**テスト**
+**Testing**
* [Jest](https://jestjs.io/)
-**ツール**
+**Tooling**
* [Yarn](https://yarnpkg.com/)
* [ESLint](https://eslint.org/)
-**開発**
+**Development**
* [AWS EKS](https://aws.amazon.com/eks/)
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/zapier.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/zapier.mdx
new file mode 100644
index 0000000000..46bcd563fc
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/zapier.mdx
@@ -0,0 +1,83 @@
+---
+title: Zapier App
+---
+
+Effortlessly sync Twenty with 3000+ apps using [Zapier](https://zapier.com/). Automate tasks, boost productivity, and supercharge your customer relationships!
+
+## About Zapier
+
+Zapier is a tool that allows you to automate workflows by connecting the apps that your team uses every day. The fundamental concept of Zapier is automation workflows, called Zaps, and include triggers and actions.
+
+You can learn more about how Zapier works [here](https://zapier.com/how-it-works).
+
+## Setup
+
+### Step 1: Install Zapier packages
+
+```bash
+cd packages/twenty-zapier
+
+yarn
+```
+
+### Step 2: Login with the CLI
+
+Use your Zapier credentials to log in using the CLI:
+
+```bash
+zapier login
+```
+
+### Step 3: Set environment variables
+
+From the `packages/twenty-zapier` folder, run:
+
+```bash
+cp .env.example .env
+```
+
+Run the application locally, go to [http://localhost:3000/settings/api-webhooks](http://localhost:3000/settings/api-webhooks), and generate an API key.
+
+Replace the **YOUR_API_KEY** value in the `.env` file with the API key you just generated.
+
+## Development
+
+
+ Make sure to run `yarn build` before any `zapier` command.
+
+
+### Test
+
+```bash
+yarn test
+```
+
+### Lint
+
+```bash
+yarn format
+```
+
+### Watch and compile as you edit code
+
+```bash
+yarn watch
+```
+
+### Validate your Zapier app
+
+```bash
+yarn validate
+```
+
+### Deploy your Zapier app
+
+```bash
+yarn deploy
+```
+
+### List all Zapier CLI commands
+
+```bash
+zapier
+```
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/bug-and-requests.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/bug-and-requests.mdx
new file mode 100644
index 0000000000..4db64b703d
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/bug-and-requests.mdx
@@ -0,0 +1,78 @@
+---
+title: Bugs, Requests & Pull Requests
+info: Report issues, request features, and contribute code
+---
+
+## Reporting Bugs
+
+To report a bug, please [create an issue on GitHub](https://github.com/twentyhq/twenty/issues/new).
+
+You can also ask for help on [Discord](https://discord.gg/cx5n4Jzs57).
+
+## Feature Requests
+
+If you're not sure if it's a bug, and you feel it's closer to a feature request, then you should probably [open a discussion instead](https://github.com/twentyhq/twenty/discussions/new).
+
+## Submit a Pull Request
+
+Contributing code to Twenty starts with a pull request (PR).
+
+### Before You Start
+
+1. Check [existing issues](https://github.com/twentyhq/twenty/issues) for related work
+2. For new features, open an issue first to discuss
+3. Review our [Code of Conduct](https://github.com/twentyhq/twenty/blob/main/CODE_OF_CONDUCT.md)
+
+### Fork and Clone
+
+1. Fork the repository on GitHub
+2. Clone your fork:
+
+```bash
+git clone https://github.com/YOUR_USERNAME/twenty.git
+cd twenty
+```
+
+3. Add upstream remote:
+
+```bash
+git remote add upstream https://github.com/twentyhq/twenty.git
+```
+
+### Create a Branch
+
+```bash
+git checkout -b feature/your-feature-name
+```
+
+Use descriptive branch names:
+
+* `feature/add-export-button`
+* `fix/login-redirect-issue`
+* `docs/update-api-guide`
+
+### Make Your Changes
+
+1. Write clean, well-documented code
+2. Follow existing code style
+3. Add tests for new functionality
+4. Update documentation if needed
+
+### Submit Your PR
+
+1. Push your branch:
+
+```bash
+git push origin feature/your-feature-name
+```
+
+2. Open a PR on GitHub
+3. Fill in the PR template
+4. Link related issues
+
+### PR Checklist
+
+* [ ] Code follows project style guidelines
+* [ ] Tests pass locally
+* [ ] Documentation is updated
+* [ ] PR description explains the changes
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/best-practices-front.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
new file mode 100644
index 0000000000..187c2d848c
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
@@ -0,0 +1,325 @@
+---
+title: Best Practices
+---
+
+This document outlines the best practices you should follow when working on the frontend.
+
+## State management
+
+React and Recoil handle state management in the codebase.
+
+### Use `useRecoilState` to store state
+
+It's good practice to create as many atoms as you need to store your state.
+
+
+ It's better to use extra atoms than trying to be too concise with props drilling.
+
+
+```tsx
+export const myAtomState = atom({
+ key: 'myAtomState',
+ default: 'default value',
+});
+
+export const MyComponent = () => {
+ const [myAtom, setMyAtom] = useRecoilState(myAtomState);
+
+ return (
+
+ setMyAtom(e.target.value)}
+ />
+
+ );
+}
+```
+
+### Do not use `useRef` to store state
+
+Avoid using `useRef` to store state.
+
+If you want to store state, you should use `useState` or `useRecoilState`.
+
+See [how to manage re-renders](#managing-re-renders) if you feel like you need `useRef` to prevent some re-renders from happening.
+
+## Managing re-renders
+
+Re-renders can be hard to manage in React.
+
+Here are some rules to follow to avoid unnecessary re-renders.
+
+Keep in mind that you can **always** avoid re-renders by understanding their cause.
+
+### Work at the root level
+
+Avoiding re-renders in new features is now made easy by eliminating them at the root level.
+
+The `PageChangeEffect` sidecar component contains just one `useEffect` that holds all the logic to execute on a page change.
+
+That way you know that there's just one place that can trigger a re-render.
+
+### Always think twice before adding `useEffect` in your codebase
+
+Re-renders are often caused by unnecessary `useEffect`.
+
+You should think whether you need `useEffect`, or if you can move the logic in a event handler function.
+
+You'll find it generally easy to move the logic in a `handleClick` or `handleChange` function.
+
+You can also find them in libraries like Apollo: `onCompleted`, `onError`, etc.
+
+### Use a sibling component to extract `useEffect` or data fetching logic
+
+If you feel like you need to add a `useEffect` in your root component, you should consider extracting it in a sidecar component.
+
+You can apply the same for data fetching logic, with Apollo hooks.
+
+```tsx
+// ❌ Bad, will cause re-renders even if data is not changing,
+// because useEffect needs to be re-evaluated
+export const PageComponent = () => {
+ const [data, setData] = useRecoilState(dataState);
+ const [someDependency] = useRecoilState(someDependencyState);
+
+ useEffect(() => {
+ if(someDependency !== data) {
+ setData(someDependency);
+ }
+ }, [someDependency]);
+
+ return {data}
;
+};
+
+export const App = () => (
+
+
+
+);
+```
+
+```tsx
+// ✅ Good, will not cause re-renders if data is not changing,
+// because useEffect is re-evaluated in another sibling component
+export const PageComponent = () => {
+ const [data, setData] = useRecoilState(dataState);
+
+ return {data}
;
+};
+
+export const PageData = () => {
+ const [data, setData] = useRecoilState(dataState);
+ const [someDependency] = useRecoilState(someDependencyState);
+
+ useEffect(() => {
+ if(someDependency !== data) {
+ setData(someDependency);
+ }
+ }, [someDependency]);
+
+ return <>>;
+};
+
+export const App = () => (
+
+
+
+
+);
+```
+
+### Use recoil family states and recoil family selectors
+
+Recoil family states and selectors are a great way to avoid re-renders.
+
+They are useful when you need to store a list of items.
+
+### You shouldn't use `React.memo(MyComponent)`
+
+Avoid using `React.memo()` because it does not solve the cause of the re-render, but instead breaks the re-render chain, which can lead to unexpected behavior and make the code very hard to refactor.
+
+### Limit `useCallback` or `useMemo` usage
+
+They are often not necessary and will make the code harder to read and maintain for a gain of performance that is unnoticeable.
+
+## Console.logs
+
+`console.log` statements are valuable during development, offering real-time insights into variable values and code flow. But, leaving them in production code can lead to several issues:
+
+1. **Performance**: Excessive logging can affect the runtime performance, especially on client-side applications.
+
+2. **Security**: Logging sensitive data can expose critical information to anyone who inspects the browser's console.
+
+3. **Cleanliness**: Filling up the console with logs can obscure important warnings or errors that developers or tools need to see.
+
+4. **Professionalism**: End users or clients checking the console and seeing a myriad of log statements might question the code's quality and polish.
+
+Make sure you remove all `console.logs` before pushing the code to production.
+
+## Naming
+
+### Variable Naming
+
+Variable names ought to precisely depict the purpose or function of the variable.
+
+#### The issue with generic names
+
+Generic names in programming are not ideal because they lack specificity, leading to ambiguity and reduced code readability. Such names fail to convey the variable or function's purpose, making it challenging for developers to understand the code's intent without deeper investigation. This can result in increased debugging time, higher susceptibility to errors, and difficulties in maintenance and collaboration. Meanwhile, descriptive naming makes the code self-explanatory and easier to navigate, enhancing code quality and developer productivity.
+
+```tsx
+// ❌ Bad, uses a generic name that doesn't communicate its
+// purpose or content clearly
+const [value, setValue] = useState('');
+```
+
+```tsx
+// ✅ Good, uses a descriptive name
+const [email, setEmail] = useState('');
+```
+
+#### Some words to avoid in variable names
+
+* dummy
+
+### Event handlers
+
+Event handler names should start with `handle`, while `on` is a prefix used to name events in components props.
+
+```tsx
+// ❌ Bad
+const onEmailChange = (val: string) => {
+ // ...
+};
+```
+
+```tsx
+// ✅ Good
+const handleEmailChange = (val: string) => {
+ // ...
+};
+```
+
+## Optional Props
+
+Avoid passing the default value for an optional prop.
+
+**EXAMPLE**
+
+Take the`EmailField` component defined below:
+
+```tsx
+type EmailFieldProps = {
+ value: string;
+ disabled?: boolean;
+};
+
+const EmailField = ({ value, disabled = false }: EmailFieldProps) => (
+
+);
+```
+
+**Usage**
+
+```tsx
+// ❌ Bad, passing in the same value as the default value adds no value
+const Form = () => ;
+```
+
+```tsx
+// ✅ Good, assumes the default value
+const Form = () => ;
+```
+
+## Component as props
+
+Try as much as possible to pass uninstantiated components as props, so children can decide on their own of what props they need to pass.
+
+The most common example for that is icon components:
+
+```tsx
+const SomeParentComponent = () => ;
+
+// In MyComponent
+const MyComponent = ({ MyIcon }: { MyIcon: IconComponent }) => {
+ const theme = useTheme();
+
+ return (
+
+
+
+ )
+};
+```
+
+For React to understand that the component is a component, you need to use PascalCase, to later instantiate it with ``
+
+## Prop Drilling: Keep It Minimal
+
+Prop drilling, in the React context, refers to the practice of passing state variables and their setters through many component layers, even if intermediary components don't use them. While sometimes necessary, excessive prop drilling can lead to:
+
+1. **Decreased Readability**: Tracing where a prop originates or where it's utilized can become convoluted in a deeply nested component structure.
+
+2. **Maintenance Challenges**: Changes in one component's prop structure might require adjustments in several components, even if they don't directly use the prop.
+
+3. **Reduced Component Reusability**: A component receiving a lot of props solely for passing them down becomes less general-purpose and harder to reuse in different contexts.
+
+If you feel that you are using excessive prop drilling, see [state management best practices](#state-management).
+
+## Imports
+
+When importing, opt for the designated aliases rather than specifying complete or relative paths.
+
+**The Aliases**
+
+```js
+{
+ alias: {
+ "~": path.resolve(__dirname, "src"),
+ "@": path.resolve(__dirname, "src/modules"),
+ "@testing": path.resolve(__dirname, "src/testing"),
+ },
+}
+```
+
+**Usage**
+
+```tsx
+// ❌ Bad, specifies the entire relative path
+import {
+ CatalogDecorator
+} from '../../../../../testing/decorators/CatalogDecorator';
+import {
+ ComponentDecorator
+} from '../../../../../testing/decorators/ComponentDecorator';
+```
+
+```tsx
+// ✅ Good, utilises the designated aliases
+import { CatalogDecorator } from '~/testing/decorators/CatalogDecorator';
+import { ComponentDecorator } from 'twenty-ui/testing';
+```
+
+## Schema Validation
+
+[Zod](https://github.com/colinhacks/zod) is the schema validator for untyped objects:
+
+```js
+const validationSchema = z
+ .object({
+ exist: z.boolean(),
+ email: z
+ .string()
+ .email('Email must be a valid email'),
+ password: z
+ .string()
+ .regex(PASSWORD_REGEX, 'Password must contain at least 8 characters'),
+ })
+ .required();
+
+type Form = z.infer;
+```
+
+## Breaking Changes
+
+Always perform thorough manual testing before proceeding to guarantee that modifications haven’t caused disruptions elsewhere, given that tests have not yet been extensively integrated.
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
new file mode 100644
index 0000000000..064ac5c256
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
@@ -0,0 +1,109 @@
+---
+title: Folder Architecture
+info: A detailed look into our folder architecture
+---
+
+In this guide, you will explore the details of the project directory structure and how it contributes to the organization and maintainability of Twenty.
+
+By following this folder architecture convention, it's easier to find the files related to specific features and ensure that the application is scalable and maintainable.
+
+```
+front
+└───modules
+│ └───module1
+│ │ └───submodule1
+│ └───module2
+│ └───ui
+│ │ └───display
+│ │ └───inputs
+│ │ │ └───buttons
+│ │ └───...
+└───pages
+└───...
+```
+
+## Pages
+
+Includes the top-level components defined by the application routes. They import more low-level components from the modules folder (more details below).
+
+## Modules
+
+Each module represents a feature or a group of feature, comprising its specific components, states, and operational logic.
+They should all follow the structure below. You can nest modules within modules (referred to as submodules) and the same rules will apply.
+
+```
+module1
+ └───components
+ │ └───component1
+ │ └───component2
+ └───constants
+ └───contexts
+ └───graphql
+ │ └───fragments
+ │ └───queries
+ │ └───mutations
+ └───hooks
+ │ └───internal
+ └───states
+ │ └───selectors
+ └───types
+ └───utils
+```
+
+### Contexts
+
+A context is a way to pass data through the component tree without having to pass props down manually at every level.
+
+See [React Context](https://react.dev/reference/react#context-hooks) for more details.
+
+### GraphQL
+
+Includes fragments, queries, and mutations.
+
+See [GraphQL](https://graphql.org/learn/) for more details.
+
+* Fragments
+
+A fragment is a reusable piece of a query, which you can use in different places. By using fragments, it's easier to avoid duplicating code.
+
+See [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) for more details.
+
+* Queries
+
+See [GraphQL Queries](https://graphql.org/learn/queries/) for more details.
+
+* Mutations
+
+See [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) for more details.
+
+### Hooks
+
+See [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) for more details.
+
+### States
+
+Contains the state management logic. [RecoilJS](https://recoiljs.org) handles this.
+
+* Selectors: See [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) for more details.
+
+React's built-in state management still handles state within a component.
+
+### Utils
+
+Should just contain reusable pure functions. Otherwise, create custom hooks in the `hooks` folder.
+
+## UI
+
+Contains all the reusable UI components used in the application.
+
+This folder can contain sub-folders, like `data`, `display`, `feedback`, and `input` for specific types of components. Each component should be self-contained and reusable, so that you can use it in different parts of the application.
+
+By separating the UI components from the other components in the `modules` folder, it's easier to maintain a consistent design and to make changes to the UI without affecting other parts (business logic) of the codebase.
+
+## Interface and dependencies
+
+You can import other module code from any module except for the `ui` folder. This will keep its code easy to test.
+
+### Internal
+
+Each part (hooks, states, ...) of a module can have an `internal` folder, which contains parts that are just used within the module.
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
index e08909064c..48051bddd2 100644
--- a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -1,41 +1,41 @@
---
-title: フロントエンドコマンド
+title: Frontend Commands
---
-## 便利なコマンド
+## Useful commands
-### アプリの開始
+### Starting the app
```bash
npx nx start twenty-front
```
-### APIのGraphQLスキーマに基づいてGraphQLスキーマを再生成する
+### Regenerate graphql schema based on API graphql schema
```bash
npx nx run twenty-front:graphql:generate --configuration=metadata
```
-または
+OR
```bash
npx nx run twenty-front:graphql:generate
```
-### リント
+### Lint
```bash
npx nx run twenty-front:lint # pass --fix to fix lint errors
```
-## 翻訳
+## Translations
```bash
npx nx run twenty-front:lingui:extract
npx nx run twenty-front:lingui:compile
```
-### テスト
+### Test
```bash
npx nx run twenty-front:test # run jest tests
@@ -44,11 +44,11 @@ npx nx run twenty-front:storybook:test # run tests # (needs yarn storybook:serve
npx nx run twenty-front:storybook:coverage # (needs yarn storybook:serve:dev to be running)
```
-## 技術スタック
+## Tech Stack
-プロジェクトは、最小限のボイラープレートコードを持つシンプルでクリーンなスタックを持っています。
+The project has a clean and simple stack, with minimal boilerplate code.
-**アプリ**
+**App**
* [React](https://react.dev/)
* [Apollo](https://www.apollographql.com/docs/)
@@ -56,35 +56,35 @@ npx nx run twenty-front:storybook:coverage # (needs yarn storybook:serve:dev to
* [Recoil](https://recoiljs.org/docs/introduction/core-concepts)
* [TypeScript](https://www.typescriptlang.org/)
-**テスト**
+**Testing**
* [Jest](https://jestjs.io/)
* [Storybook](https://storybook.js.org/)
-**ツール**
+**Tooling**
* [Yarn](https://yarnpkg.com/)
* [Craco](https://craco.js.org/docs/)
* [ESLint](https://eslint.org/)
-## アーキテクチャ
+## Architecture
-### ルーティング
+### Routing
-[React Router](https://reactrouter.com/)はルーティングを処理します。
+[React Router](https://reactrouter.com/) handles the routing.
-不要な[再レンダリング](/l/ja/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders)を避けるために、すべてのルーティングロジックは`PageChangeEffect`内の`useEffect`にあります。
+To avoid unnecessary [re-renders](/l/ja/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) all the routing logic is in a `useEffect` in `PageChangeEffect`.
-### 状態管理
+### State Management
-[Recoil](https://recoiljs.org/docs/introduction/core-concepts)は状態管理を処理します。
+[Recoil](https://recoiljs.org/docs/introduction/core-concepts) handles state management.
-状態管理に関する詳細な情報は[ベストプラクティス](/l/ja/developers/contribute/capabilities/frontend-development/best-practices-front#state-management)を参照してください。
+See [best practices](/l/ja/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) for more information on state management.
-## テスト
+## Testing
-[Jest](https://jestjs.io/)はユニットテストのツールであり、[Storybook](https://storybook.js.org/)はコンポーネントテスト用です。
+[Jest](https://jestjs.io/) serves as the tool for unit testing while [Storybook](https://storybook.js.org/) is for component testing.
-Jestは主にユーティリティ関数のテスト用で、コンポーネントのテスト自体ではありません。
+Jest is mainly for testing utility functions, and not components themselves.
-Storybookは、独立したコンポーネントの挙動をテストし、デザインシステムを表示するためのものです。
+Storybook is for testing the behavior of isolated components, as well as displaying the design system.
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/hotkeys.mdx
index b1ebf3a762..43cde50e63 100644
--- a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/hotkeys.mdx
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -1,42 +1,42 @@
---
-title: ホットキー
+title: Hotkeys
---
-## イントロダクション
+## Introduction
-ホットキーをリッスンする必要がある場合、通常は `onKeyDown` イベントリスナーを使用します。
+When you need to listen to a hotkey, you would normally use the `onKeyDown` event listener.
-しかし、`twenty-front` では、同時にマウントされている異なるコンポーネントで使用される同じホットキーの間で競合が生じることがあります。
+In `twenty-front` however, you might have conflicts between same hotkeys that are used in different components, mounted at the same time.
-例えば、Enterキーをリッスンするページと、Enterキーをリッスンするモーダル、さらにそのモーダル内のSelectコンポーネントもEnterキーをリッスンしている場合、全てが同時にマウントされると競合が生じる可能性があります。
+For example, if you have a page that listens for the Enter key, and a modal that listens for the Enter key, with a Select component inside that modal that listens for the Enter key, you might have a conflict when all are mounted at the same time.
-## `useScopedHotkeys` フック
+## The `useScopedHotkeys` hook
-この問題を解決するために、どのような競合もなくホットキーをリッスンすることを可能にするカスタムフックがあります。
+To handle this problem, we have a custom hook that makes it possible to listen to hotkeys without any conflict.
-コンポーネント内に配置すると、コンポーネントがマウントされ、指定された**ホットキースコープ**がアクティブなときだけホットキーをリッスンします。
+You place it in a component, and it will listen to the hotkeys only when the component is mounted AND when the specified **hotkey scope** is active.
-## 実際にホットキーをリッスンする方法は?
+## How to listen for hotkeys in practice?
-ホットキーをリッスンするための設定には2つのステップがあります:
+There are two steps involved in setting up hotkey listening :
-1. ホットキーをリッスンする[ホットキースコープ](#what-is-a-hotkey-scope-)を設定します
-2. ホットキーをリッスンするために `useScopedHotkeys` フックを使用します
+1. Set the [hotkey scope](#what-is-a-hotkey-scope-) that will listen to hotkeys
+2. Use the `useScopedHotkeys` hook to listen to hotkeys
-他のUI要素(例:左側のメニューやコマンドメニュー)もホットキーをリッスンする可能性があるため、ホットキースコープの設定は単純なページでも必要です。
+Setting up hotkey scopes is required even in simple pages, because other UI elements like left menu or command menu might also listen to hotkeys.
-## ホットキーのユースケース
+## Use cases for hotkeys
-一般的に、ホットキーが必要となる動作は2つあります:
+In general, you'll have two use cases that require hotkeys :
-1. ページにマウントされたコンポーネントで
-2. ユーザーのアクションでフォーカスをとるモーダルタイプのコンポーネントで
+1. In a page or a component mounted in a page
+2. In a modal-type component that takes the focus due to a user action
-2番目のユースケースは再帰的に発生します:例えばモーダル内のドロップダウン。
+The second use case can happen recursively : a dropdown in a modal for example.
-### ページ内でホットキーをリッスン
+### Listening to hotkeys in a page
-例:
+Example :
```tsx
const PageListeningEnter = () => {
@@ -45,37 +45,37 @@ const PageListeningEnter = () => {
goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope();
- // 1. setHotkeyScopeAndMemorizePreviousScopeをuseEffect内で設定
+ // 1. Set the hotkey scope in a useEffect
useEffect(() => {
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleEnterPage,
);
- // コンポーネントがアンマウントされたときに前のホットキースコープに戻ります
+ // Revert to the previous hotkey scope when the component is unmounted
return () => {
goBackToPreviousHotkeyScope();
};
}, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
- // 2. useScopedHotkeysフックを使用
+ // 2. Use the useScopedHotkeys hook
useScopedHotkeys(
Key.Enter,
() => {
- // ユーザーがEnterを押したときにこのページで実行されるロジック
+ // Some logic executed on this page when the user presses Enter
// ...
},
ExampleHotkeyScopes.ExampleEnterPage,
);
- return Enterをリッスンする私のページ
;
+ return My page that listens for Enter
;
};
```
-### モーダルタイプのコンポーネントでホットキーをリッスン
+### Listening to hotkeys in a modal-type component
-この例では、親にモーダルを閉じるように指示するためにEscapeキーをリッスンするモーダルコンポーネントを使用します。
+For this example we'll use a modal component that listens for the Escape key to tell its parent to close it.
-ここで、ユーザーの操作がスコープを変更します。
+Here the user interaction is changing the scope.
```tsx
const ExamplePageWithModal = () => {
@@ -87,7 +87,7 @@ const ExamplePageWithModal = () => {
} = usePreviousHotkeyScope();
const handleOpenModalClick = () => {
- // 1. ユーザーがモーダルを開くときにホットキースコープを設定
+ // 1. Set the hotkey scope when user opens the modal
setShowModal(true);
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleModal,
@@ -95,26 +95,26 @@ const ExamplePageWithModal = () => {
};
const handleModalClose = () => {
- // 1. モーダルが閉じられるときに前のホットキースコープに戻る
+ // 1. Revert to the previous hotkey scope when the modal is closed
setShowModal(false);
goBackToPreviousHotkeyScope();
};
return
-
私のモーダル付きページ
- モーダルを開く
+ My page with a modal
+ Open modal
{showModal && }
;
};
```
-その後、モーダルコンポーネント内で:
+Then in the modal component :
```tsx
const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
- // 2. EscapeをリッスンするためにuseScopedHotkeysフックを使用
- // Escapeは多くの他のコンポーネントでも使用される可能性がある一般的なホットキーです
- // スコープを使って競合を防ぐことが重要です
+ // 2. Use the useScopedHotkeys hook to listen for Escape.
+ // Note that escape is a common hotkey that could be used by many other components
+ // So it's important to use a hotkey scope to avoid conflicts
useScopedHotkeys(
Key.Escape,
() => {
@@ -123,56 +123,56 @@ const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
ExampleHotkeyScopes.ExampleModal,
);
- return 私のモーダルコンポーネント
;
+ return My modal component
;
};
```
-モント/アンマウントでのuseEffectだけで競合を避けるには不十分なことがある場合にこのパターンを使用することが重要です。
+It's important to use this pattern when you're not sure that just using a useEffect with mount/unmount will be enough to avoid conflicts.
-これらの競合はデバッグが困難で、useEffectsでよく発生することがあります。
+Those conflicts can be hard to debug, and it might happen more often than not with useEffects.
-## ホットキースコープとは?
+## What is a hotkey scope?
-ホットキースコープは、ホットキーがアクティブなコンテキストを表す文字列です。 通常、enumとしてエンコードされます。 通常、enumとしてエンコードされます。 通常、enumとしてエンコードされます。
+A hotkey scope is a string that represents a context in which the hotkeys are active. It is generally encoded as an enum.
-ホットキースコープを変更すると、このスコープをリッスンしているホットキーが有効になり、他のスコープをリッスンしているホットキーが無効になります。
+When you change the hotkey scope, the hotkeys that are listening to this scope will be enabled and the hotkeys that are listening to other scopes will be disabled.
-一度に1つのスコープしか設定できません。
+You can set only one scope at a time.
-例として、各ページのホットキースコープは`PageHotkeyScope` enumで定義されています:
+As an example, the hotkey scopes for each page are defined in the `PageHotkeyScope` enum:
```tsx
export enum PageHotkeyScope {
- Settings = '設定',
- CreateWorkspace = '作業スペースの作成',
- SignInUp = 'サインイン-アップ',
- CreateProfile = 'プロファイルの作成',
- PlanRequired = 'プランが必要',
- ShowPage = 'ページ表示',
- PersonShowPage = '人物表示ページ',
- CompanyShowPage = '会社表示ページ',
- CompaniesPage = '会社ページ',
- PeoplePage = '人物ページ',
- OpportunitiesPage = '機会ページ',
- ProfilePage = 'プロファイルページ',
- WorkspaceMemberPage = 'ワークスペースメンバーページ',
- TaskPage = 'タスクページ',
+ Settings = 'settings',
+ CreateWorkspace = 'create-workspace',
+ SignInUp = 'sign-in-up',
+ CreateProfile = 'create-profile',
+ PlanRequired = 'plan-required',
+ ShowPage = 'show-page',
+ PersonShowPage = 'person-show-page',
+ CompanyShowPage = 'company-show-page',
+ CompaniesPage = 'companies-page',
+ PeoplePage = 'people-page',
+ OpportunitiesPage = 'opportunities-page',
+ ProfilePage = 'profile-page',
+ WorkspaceMemberPage = 'workspace-member-page',
+ TaskPage = 'task-page',
}
```
-内部的には、現在選択されているスコープはアプリケーション全体で共有されるRecoilステートに格納されています:
+Internally, the currently selected scope is stored in a Recoil state that is shared across the application :
```tsx
export const currentHotkeyScopeState = createState({
- key: '現在のホットキースコープステート',
+ key: 'currentHotkeyScopeState',
defaultValue: INITIAL_HOTKEYS_SCOPE,
});
```
-しかし、このRecoilステートは手動で処理しないでください! 次のセクションでその使用方法を見ていきます。 次のセクションでその使用方法を見ていきます。 次のセクションでその使用方法を見ていきます。
+But this Recoil state should never be handled manually ! We'll see how to use it in the next section.
-## 内部的にはどう機能しているのか?
+## How is it working internally?
-[react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro)の上に薄いラッパーを作成し、より効率的にし、不必要な再レンダリングを避けます。
+We made a thin wrapper on top of [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) that makes it more performant and avoids unnecessary re-renders.
-また、ホットキースコープの状態を処理し、アプリケーション全体で利用できるRecoilステートを作成しました。
+We also create a Recoil state to handle the hotkey scope state and make it available everywhere in the application.
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/storybook.mdx
index baff4a6c9a..5c7f5fa52a 100644
--- a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/storybook.mdx
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -1,8 +1,8 @@
---
-title: ストーリーブック
-description: TwentyのUIコンポーネントライブラリを閲覧
+title: Storybook
+description: Browse Twenty's UI component library
---
-ストーリーブックで私たちの完全なコンポーネントライブラリおよびドキュメントを参照してください。
+View our complete component library and documentation in Storybook.
-[ストーリーブックを開く →](https://storybook.twenty.com)
+[Open Storybook →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/style-guide.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/style-guide.mdx
new file mode 100644
index 0000000000..e3ba4a44f0
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/style-guide.mdx
@@ -0,0 +1,290 @@
+---
+title: Style Guide
+---
+
+This document includes the rules to follow when writing code.
+
+The goal here is to have a consistent codebase, which is easy to read and easy to maintain.
+
+For this, it's better to be a bit more verbose than to be too concise.
+
+Always keep in mind that people read code more often than they write it, specially on an open source project, where anyone can contribute.
+
+There are a lot of rules that are not defined here, but that are automatically checked by linters.
+
+## React
+
+### Use functional components
+
+Always use TSX functional components.
+
+Do not use default `import` with `const`, because it's harder to read and harder to import with code completion.
+
+```tsx
+// ❌ Bad, harder to read, harder to import with code completion
+const MyComponent = () => {
+ return Hello World
;
+};
+
+export default MyComponent;
+
+// ✅ Good, easy to read, easy to import with code completion
+export function MyComponent() {
+ return Hello World
;
+};
+```
+
+### Props
+
+Create the type of the props and call it `(ComponentName)Props` if there's no need to export it.
+
+Use props destructuring.
+
+```tsx
+// ❌ Bad, no type
+export const MyComponent = (props) => Hello {props.name}
;
+
+// ✅ Good, type
+type MyComponentProps = {
+ name: string;
+};
+
+export const MyComponent = ({ name }: MyComponentProps) => Hello {name}
;
+```
+
+#### Refrain from using `React.FC` or `React.FunctionComponent` to define prop types
+
+```tsx
+/* ❌ - Bad, defines the component type annotations with `FC`
+ * - With `React.FC`, the component implicitly accepts a `children` prop
+ * even if it's not defined in the prop type. This might not always be
+ * desirable, especially if the component doesn't intend to render
+ * children.
+ */
+const EmailField: React.FC<{
+ value: string;
+}> = ({ value }) => ;
+```
+
+```tsx
+/* ✅ - Good, a separate type (OwnProps) is explicitly defined for the
+ * component's props
+ * - This method doesn't automatically include the children prop. If
+ * you want to include it, you have to specify it in OwnProps.
+ */
+type EmailFieldProps = {
+ value: string;
+};
+
+const EmailField = ({ value }: EmailFieldProps) => (
+
+);
+```
+
+#### No Single Variable Prop Spreading in JSX Elements
+
+Avoid using single variable prop spreading in JSX elements, like `{...props}`. This practice often results in code that is less readable and harder to maintain because it's unclear which props the component is receiving.
+
+```tsx
+/* ❌ - Bad, spreads a single variable prop into the underlying component
+ */
+const MyComponent = (props: OwnProps) => {
+ return ;
+}
+```
+
+```tsx
+/* ✅ - Good, Explicitly lists all props
+ * - Enhances readability and maintainability
+ */
+const MyComponent = ({ prop1, prop2, prop3 }: MyComponentProps) => {
+ return ;
+};
+```
+
+Rationale:
+
+* At a glance, it's clearer which props the code passes down, making it easier to understand and maintain.
+* It helps to prevent tight coupling between components via their props.
+* Linting tools make it easier to identify misspelled or unused props when you list props explicitly.
+
+## JavaScript
+
+### Use nullish-coalescing operator `??`
+
+```tsx
+// ❌ Bad, can return 'default' even if value is 0 or ''
+const value = process.env.MY_VALUE || 'default';
+
+// ✅ Good, will return 'default' only if value is null or undefined
+const value = process.env.MY_VALUE ?? 'default';
+```
+
+### Use optional chaining `?.`
+
+```tsx
+// ❌ Bad
+onClick && onClick();
+
+// ✅ Good
+onClick?.();
+```
+
+## TypeScript
+
+### Use `type` instead of `interface`
+
+Always use `type` instead of `interface`, because they almost always overlap, and `type` is more flexible.
+
+```tsx
+// ❌ Bad
+interface MyInterface {
+ name: string;
+}
+
+// ✅ Good
+type MyType = {
+ name: string;
+};
+```
+
+### Use string literals instead of enums
+
+[String literals](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types) are the go-to way to handle enum-like values in TypeScript. They are easier to extend with Pick and Omit, and offer a better developer experience, specially with code completion.
+
+You can see why TypeScript recommends avoiding enums [here](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
+
+```tsx
+// ❌ Bad, utilizes an enum
+enum Color {
+ Red = "red",
+ Green = "green",
+ Blue = "blue",
+}
+
+let color = Color.Red;
+```
+
+```tsx
+// ✅ Good, utilizes a string literal
+
+let color: "red" | "green" | "blue" = "red";
+```
+
+#### GraphQL and internal libraries
+
+You should use enums that GraphQL codegen generates.
+
+It's also better to use an enum when using an internal library, so the internal library doesn't have to expose a string literal type that is not related to the internal API.
+
+Example:
+
+```TSX
+const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+} = usePreviousHotkeyScope();
+
+setHotkeyScopeAndMemorizePreviousScope(
+ RelationPickerHotkeyScope.RelationPicker,
+);
+```
+
+## Styling
+
+### Use StyledComponents
+
+Style the components with [styled-components](https://emotion.sh/docs/styled).
+
+```tsx
+// ❌ Bad
+Hello World
+```
+
+```tsx
+// ✅ Good
+const StyledTitle = styled.div`
+ color: red;
+`;
+```
+
+Prefix styled components with "Styled" to differentiate them from "real" components.
+
+```tsx
+// ❌ Bad
+const Title = styled.div`
+ color: red;
+`;
+```
+
+```tsx
+// ✅ Good
+const StyledTitle = styled.div`
+ color: red;
+`;
+```
+
+### Theming
+
+Utilizing the theme for the majority of component styling is the preferred approach.
+
+#### Units of measurement
+
+Avoid using `px` or `rem` values directly within the styled components. The necessary values are generally already defined in the theme, so it’s recommended to make use of the theme for these purposes.
+
+#### Colors
+
+Refrain from introducing new colors; instead, use the existing palette from the theme. Should there be a situation where the palette does not align, please leave a comment so that the team can rectify it.
+
+```tsx
+// ❌ Bad, directly specifies style values without utilizing the theme
+const StyledButton = styled.button`
+ color: #333333;
+ font-size: 1rem;
+ font-weight: 400;
+ margin-left: 4px;
+ border-radius: 50px;
+`;
+```
+
+```tsx
+// ✅ Good, utilizes the theme
+const StyledButton = styled.button`
+ color: ${({ theme }) => theme.font.color.primary};
+ font-size: ${({ theme }) => theme.font.size.md};
+ font-weight: ${({ theme }) => theme.font.weight.regular};
+ margin-left: ${({ theme }) => theme.spacing(1)};
+ border-radius: ${({ theme }) => theme.border.rounded};
+`;
+```
+
+## Enforcing No-Type Imports
+
+Avoid type imports. To enforce this standard, an ESLint rule checks for and reports any type imports. This helps maintain consistency and readability in the TypeScript code.
+
+```tsx
+// ❌ Bad
+import { type Meta, type StoryObj } from '@storybook/react';
+
+// ❌ Bad
+import type { Meta, StoryObj } from '@storybook/react';
+
+// ✅ Good
+import { Meta, StoryObj } from '@storybook/react';
+```
+
+### Why No-Type Imports
+
+* **Consistency**: By avoiding type imports and using a single approach for both type and value imports, the codebase remains consistent in its module import style.
+
+* **Readability**: No-type imports improve code readability by making it clear when you're importing values or types. This reduces ambiguity and makes it easier to understand the purpose of imported symbols.
+
+* **Maintainability**: It enhances codebase maintainability because developers can identify and locate type-only imports when reviewing or modifying code.
+
+### ESLint Rule
+
+An ESLint rule, `@typescript-eslint/consistent-type-imports`, enforces the no-type import standard. This rule will generate errors or warnings for any type import violations.
+
+Please note that this rule specifically addresses rare edge cases where unintentional type imports occur. TypeScript itself discourages this practice, as mentioned in the [TypeScript 3.8 release notes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). In most situations, you should not need to use type-only imports.
+
+To ensure your code complies with this rule, make sure to run ESLint as part of your development workflow.
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/work-with-figma.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
index a91dc197c4..6cffcc405e 100644
--- a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
@@ -1,136 +1,59 @@
---
-title: Figma で作業する
-info: Twenty の Figma を使用した共同作業方法を学ぶ
+title: Work with Figma
+info: Learn how you can collaborate with Twenty's Figma
---
-Figma は、デザイナーと開発者の間のコミュニケーションの壁を埋めるのを助ける協働インターフェース設計ツールです。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
-このガイドは、Figma を使って共同作業する方法を説明します。
+Figma is a collaborative interface design tool that aids in bridging the communication barrier between designers and developers.
+This guide explains how you can collaborate with Figma.
-## アクセス
+## Access
-1. **共有リンクにアクセスする:** プロジェクトの Figma ファイルは [ここ](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty) からアクセスできます。
-2. **サインイン:** まだサインインしていない場合、Figma はサインインを促します。
- 開発者モードや専用のフレーム選択など、キー機能はサインインしたユーザーのみが利用できます。
+1. **Access the shared link:** You can access the project's Figma file [here](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty).
+2. **Sign in:** If you're not already signed in, Figma will prompt you to do so.
+ Key features are only available to logged-in users, such as the developer mode and the ability to select a dedicated frame.
- アカウントがないと効果的に協力することはできません。
+ You will not be able to collaborate effectively without an account.
-## Figma 構造
+## Figma structure
-左側のサイドバーで、Twenty の Figma の異なるページにアクセスできます。 それらは次のように整理されています: それらは次のように整理されています: それらは次のように整理されています: それらは次のように整理されています: それらは次のように整理されています:
+On the left sidebar, you can access the different pages of Twenty's Figma. This is how they're organized:
-* **コンポーネントページ:** これは最初のページです。 デザイナーはこれを使用して、デザインファイル全体で使用される再利用可能なデザイン要素を作成および整理します。 例えば、ボタン、アイコン、シンボル、またはその他の再利用可能なコンポーネントとして使用されます。 これにより、デザイン全体で一貫性を保つことができます。
-* **メインページ:** 2 番目のページはメインページで、プロジェクトの完全なユーザーインターフェースを示しています。 ***再生*** を押すことで、アプリプロトタイプを完全に使用できます。 **メインページ:** 2 番目のページはメインページで、プロジェクトの完全なユーザーインターフェースを示しています。 ***再生*** を押すことで、アプリプロトタイプを完全に使用できます。 ***再生*** を押すことで、アプリプロトタイプを完全に使用できます。
-* **特徴ページ:** その他のページは、通常、進行中の機能に専念しています。 それらはアプリケーションまたはウェブサイトの特定の機能またはモジュールのデザインを含みます。 通常、まだ進行中です。 それらはアプリケーションまたはウェブサイトの特定の機能またはモジュールのデザインを含みます。 通常、まだ進行中です。 それらはアプリケーションまたはウェブサイトの特定の機能またはモジュールのデザインを含みます。 通常、まだ進行中です。 それらはアプリケーションまたはウェブサイトの特定の機能またはモジュールのデザインを含みます。 通常、まだ進行中です。
+* **Components page:** This is the first page. The designer uses it to create and organize the reusable design elements used throughout the design file. For example, buttons, icons, symbols, or any other reusable components. It serves to maintain consistency across the design.
+* **Main page:** The second page is the main page, which shows the complete user interface of the project. You can press ***Play*** to use the full app prototype.
+* **Features pages:** The other pages are typically dedicated to features in progress. They contain the design of specific features or modules of the application or website. They are typically still in progress.
-## 役立つヒント
+## Useful Tips
-閲覧専用アクセスでは、デザインの編集はできませんが、デザインをコードに変換する際に役立つすべての機能にアクセスできます。
+With read-only access, you can't edit the design, but you can access all features that will be useful to convert the designs into code.
-### 開発者モードを使用する
+### Use the Dev mode
-Figma の Dev モードは、デザインナビゲーションの容易化、効果的なアセット管理、効率的な通信ツール、ツールボックス統合、迅速なコードスニペット、主要レイヤー情報の提供により、開発者の生産性を向上させ、デザインと開発の間のギャップを埋めます。 Dev Mode についての詳細は [こちら](https://www.figma.com/dev-mode/) で確認できます。
+Figma's Dev Mode enhances developers' productivity by providing easy design navigation, effective asset management, efficient communication tools, toolbox integrations, quick code snippets, and key layer information, bridging the gap between design and development. You can learn more about Dev Mode [here](https://www.figma.com/dev-mode/).
-ツールバーの右部分で「開発者」モードに切り替えることで、デザインスペックの確認、CSS のコピー、アセットへのアクセスが可能です。
+Switch to the "Developer" mode in the right part of the toolbar to see design specs, copy CSS, and access assets.
-### プロトタイプを使用する
+### Use the Prototype
-キャンバス上の任意の要素をクリックし、インターフェースの右上隅にある「再生」ボタンを押してプロトタイプビューにアクセスします。 プロトタイプモードでは、あたかも最終製品であるかのようにデザインに触れることができます。 画面間のフローや、ボタン、リンク、メニューなどのインターフェース要素が操作時にどのように動作するかを示します。
+Click on any element on the canvas and press the “Play” button at the top right edge of the interface to access the prototype view. Prototype mode allows you to interact with the design as if it were the final product. It demonstrates the flow between screens and how interface elements like buttons, links, or menus behave when interacted with.
-1. **トランジションとアニメーションの理解:** プロトタイプモードでは、デザイナーによって画面や UI 要素間に追加されたトランジションやアニメーションを表示でき、開発者に意図された動作やスタイルを視覚的に明確に指示します。
-2. **実装の明確化:** プロトタイプは曖昧さを減らすのにも役立ちます。 開発者はそれを操作することで、特定の要素の機能や外観をより良く理解することができます。
+1. **Understanding transitions and animations:** In the Prototype mode, you can view any transitions or animations added by a designer between screens or UI elements, providing clear visual instructions to developers on the intended behavior and style.
+2. **Implementation clarification:** A prototype can also help reduce ambiguities. Developers can interact with it to gain a better understanding of the functionality or appearance of particular elements.
-Figma プラットフォームの学習に関するより包括的な詳細とガイダンスについては、公式の [Figma ドキュメント](https://help.figma.com/hc/en-us) を訪れることができます。
+For more comprehensive details and guidance on learning the Figma platform, you can visit the official [Figma Documentation](https://help.figma.com/hc/en-us).
-### 距離を測定する
+### Measure distances
-要素を選択し、`Option` キー(Mac)または `Alt` キー(Windows)を押したまま、別の要素の上にカーソルを合わせると、それらの間の距離が表示されます。
+Select an element, hold `Option` key (Mac) or `Alt` key (Windows), then hover over another element to see the distance between them.
-### VSCode 用 Figma 拡張機能(推奨)
+### Figma extension for VSCode (Recommended)
-[Figma for VS Code](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension) を使用すると、デザインファイルのナビゲート、検査、デザイナーとのコラボレーション、変更の追跡、実装の促進ができます - すべてをテキストエディターから離れることなく行えます。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
-これは推奨拡張機能の一部です。
+[Figma for VS Code](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension)
+lets you navigate and inspect design files, collaborate with designers, track changes, and speed up implementation - all without leaving your text editor.
+It's part of our recommended extensions.
-## コラボレーション
+## Collaboration
-1. **コメントの使用:** ツールバーの左側にあるバブルアイコンをクリックしてコメント機能を使用できます。
-2. **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。
+1. **Using Comments:** You are welcome to use the comment feature by clicking on the bubble icon in the left part of the toolbar.
+2. **Cursor chat:** A nice feature of Figma is the Cursor chat. Just press `;` on Mac and `/` on Windows to send a message if you see someone else using Figma as the same time as you.
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/local-setup.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/local-setup.mdx
new file mode 100644
index 0000000000..c5c2f04ceb
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/local-setup.mdx
@@ -0,0 +1,333 @@
+---
+title: Local Setup
+description: The guide for contributors (or curious developers) who want to run Twenty locally.
+---
+
+## Prerequisites
+
+
+
+ Before you can install and use Twenty, make sure you install the following on your computer:
+
+ * [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+ * [Node v24.5.0](https://nodejs.org/en/download)
+ * [yarn v4](https://yarnpkg.com/getting-started/install)
+ * [nvm](https://github.com/nvm-sh/nvm/blob/master/README.md)
+
+
+ `npm` won't work, you should use `yarn` instead. Yarn is now shipped with Node.js, so you don't need to install it separately.
+ You only have to run `corepack enable` to enable Yarn if you haven't done it yet.
+
+
+
+
+ 1. Install WSL
+ Open PowerShell as Administrator and run:
+
+ ```powershell
+ wsl --install
+ ```
+
+ You should now see a prompt to restart your computer. If not, restart it manually.
+
+ Upon restart, a powershell window will open and install Ubuntu. This may take up some time.
+ You'll see a prompt to create a username and password for your Ubuntu installation.
+
+ 2. Install and configure git
+
+ ```bash
+ sudo apt-get install git
+
+ git config --global user.name "Your Name"
+
+ git config --global user.email "youremail@domain.com"
+ ```
+
+ 3. Install nvm, node.js and yarn
+
+
+ Use `nvm` to install the correct `node` version. The `.nvmrc` ensures all contributors use the same version.
+
+
+ ```bash
+ sudo apt-get install curl
+
+ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
+ ```
+
+ Close and reopen your terminal to use nvm. Then run the following commands.
+
+ ```bash
+
+ nvm install # installs recommended node version
+
+ nvm use # use recommended node version
+
+ corepack enable
+ ```
+
+
+
+---
+
+## Step 1: Git Clone
+
+In your terminal, run the following command.
+
+
+
+ If you haven't already set up SSH keys, you can learn how to do so [here](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/about-ssh).
+
+ ```bash
+ git clone git@github.com:twentyhq/twenty.git
+ ```
+
+
+
+ ```bash
+ git clone https://github.com/twentyhq/twenty.git
+ ```
+
+
+
+## Step 2: Position yourself at the root
+
+```bash
+cd twenty
+```
+
+You should run all commands in the following steps from the root of the project.
+
+## Step 3: Set up a PostgreSQL Database
+
+
+
+ **Option 1 (preferred):** To provision your database locally:
+ Use the following link to install Postgresql on your Linux machine: [Postgresql Installation](https://www.postgresql.org/download/linux/)
+
+ ```bash
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ Note: You might need to add `sudo -u postgres` to the command before `psql` to avoid permission errors.
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+ **Option 1 (preferred):** To provision your database locally with `brew`:
+
+ ```bash
+ brew install postgresql@16
+ export PATH="/opt/homebrew/opt/postgresql@16/bin:$PATH"
+ brew services start postgresql@16
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ You can verify if the PostgreSQL server is running by executing:
+
+ ```bash
+ brew services list
+ ```
+
+ The installer might not create the `postgres` user by default when installing
+ via Homebrew on MacOS. Instead, it creates a PostgreSQL role that matches your macOS
+ username (e.g., "john").
+ To check and create the `postgres` user if necessary, follow these steps:
+
+ ```bash
+ # Connect to PostgreSQL
+ psql postgres
+ or
+ psql -U $(whoami) -d postgres
+ ```
+
+ Once at the psql prompt (postgres=#), run:
+
+ ```bash
+ # List existing PostgreSQL roles
+ \du
+ ```
+
+ You'll see output similar to:
+
+ ```bash
+ Role name | Attributes | Member of
+ -----------+-------------+-----------
+ john | Superuser | {}
+ ```
+
+ If you do not see a `postgres` role listed, proceed to the next step.
+ Create the `postgres` role manually:
+
+ ```bash
+ CREATE ROLE postgres WITH SUPERUSER LOGIN;
+ ```
+
+ This creates a superuser role named `postgres` with login access.
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+ All the following steps are to be run in the WSL terminal (within your virtual machine)
+
+ **Option 1:** To provision your Postgresql locally:
+ Use the following link to install Postgresql on your Linux virtual machine: [Postgresql Installation](https://www.postgresql.org/download/linux/)
+
+ ```bash
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ Note: You might need to add `sudo -u postgres` to the command before `psql` to avoid permission errors.
+
+ **Option 2:** If you have docker installed:
+ Running Docker on WSL adds an extra layer of complexity.
+ Only use this option if you are comfortable with the extra steps involved, including turning on [Docker Desktop WSL2](https://docs.docker.com/desktop/wsl).
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+You can now access the database at [localhost:5432](localhost:5432), with user `postgres` and password `postgres` .
+
+## Step 4: Set up a Redis Database (cache)
+
+Twenty requires a redis cache to provide the best performance
+
+
+
+ **Option 1:** To provision your Redis locally:
+ Use the following link to install Redis on your Linux machine: [Redis Installation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+ **Option 1 (preferred):** To provision your Redis locally with `brew`:
+
+ ```bash
+ brew install redis
+ ```
+
+ Start your redis server:
+ `brew services start redis`
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+ **Option 1:** To provision your Redis locally:
+ Use the following link to install Redis on your Linux virtual machine: [Redis Installation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+If you need a Client GUI, we recommend [redis insight](https://redis.io/insight/) (free version available)
+
+## Step 5: Setup environment variables
+
+Use environment variables or `.env` files to configure your project. More info [here](/l/ja/developers/self-host/capabilities/setup)
+
+Copy the `.env.example` files in `/front` and `/server`:
+
+```bash
+cp ./packages/twenty-front/.env.example ./packages/twenty-front/.env
+cp ./packages/twenty-server/.env.example ./packages/twenty-server/.env
+```
+
+
+ **Multi-Workspace Mode:** By default, Twenty runs in single-workspace mode where only one workspace can be created. To enable multi-workspace support (useful for testing subdomain-based features), set `IS_MULTIWORKSPACE_ENABLED=true` in your server `.env` file. See [Multi-Workspace Mode](/l/ja/developers/self-host/capabilities/setup#multi-workspace-mode) for details.
+
+
+## Step 6: Installing dependencies
+
+To build Twenty server and seed some data into your database, run the following command:
+
+```bash
+yarn
+```
+
+Note that `npm` or `pnpm` won't work
+
+## Step 7: Running the project
+
+
+
+ Depending on your Linux distribution, Redis server might be started automatically.
+ If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro.
+
+
+
+ Redis should already be running. If not, run:
+
+ ```bash
+ brew services start redis
+ ```
+
+
+
+ Depending on your Linux distribution, Redis server might be started automatically.
+ If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro.
+
+
+
+Set up your database with the following command:
+
+```bash
+npx nx database:reset twenty-server
+```
+
+Start the server, the worker and the frontend services:
+
+```bash
+npx nx start twenty-server
+npx nx worker twenty-server
+npx nx start twenty-front
+```
+
+Alternatively, you can start all services at once:
+
+```bash
+npx nx start
+```
+
+## Step 8: Use Twenty
+
+**Frontend**
+
+Twenty's frontend will be running at [http://localhost:3001](http://localhost:3001).
+You can log in using the default demo account: `tim@apple.dev` (password: `tim@apple.dev`)
+
+**Backend**
+
+* Twenty's server will be up and running at [http://localhost:3000](http://localhost:3000)
+* The GraphQL API can be accessed at [http://localhost:3000/graphql](http://localhost:3000/graphql)
+* The REST API can be reached at [http://localhost:3000/rest](http://localhost:3000/rest)
+
+## Troubleshooting
+
+If you encounter any problem, check [Troubleshooting](/l/ja/developers/self-host/capabilities/troubleshooting) for solutions.
diff --git a/packages/twenty-docs/l/ja/developers/contribute/contribute.mdx b/packages/twenty-docs/l/ja/developers/contribute/contribute.mdx
new file mode 100644
index 0000000000..dbeb7d1517
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/contribute.mdx
@@ -0,0 +1,32 @@
+---
+title: Contribute
+description: Contribute to Twenty's open-source development.
+---
+
+
+
+
+
+## Overview
+
+Twenty is open-source and welcomes contributions from the community. Whether you're fixing bugs, adding features, or improving documentation, your contributions help make Twenty better for everyone.
+
+## Ways to Contribute
+
+* **Report bugs**: Help identify and document issues
+* **Submit features**: Propose and implement new functionality
+* **Improve documentation**: Make our docs clearer and more helpful
+* **Frontend development**: Work on the React-based UI
+* **Backend development**: Contribute to the NestJS server
+
+## Getting Started
+
+
+
+ Report issues or request features
+
+
+
+ Contribute to the UI
+
+
diff --git a/packages/twenty-docs/l/ja/developers/extend/capabilities/apis.mdx b/packages/twenty-docs/l/ja/developers/extend/capabilities/apis.mdx
new file mode 100644
index 0000000000..0b2c8b826e
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/extend/capabilities/apis.mdx
@@ -0,0 +1,147 @@
+---
+title: APIs
+description: Query and modify your CRM data programmatically using REST or GraphQL.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Twenty was built to be developer-friendly, offering powerful APIs that adapt to your custom data model. We provide four distinct API types to meet different integration needs.
+
+## Developer-First Approach
+
+Twenty generates APIs specifically for your data model:
+
+* **No long IDs required**: Use your object and field names directly in endpoints
+* **Standard and custom objects treated equally**: Your custom objects get the same API treatment as built-in ones
+* **Dedicated endpoints**: Each object and field gets its own API endpoint
+* **Custom documentation**: Generated specifically for your workspace's data model
+
+
+ Your personalized API documentation is available under **Settings → API & Webhooks** after creating an API key. Since Twenty generates APIs that match your custom data model, the documentation is unique to your workspace.
+
+
+## The Two API Types
+
+### Core API
+
+Accessed on `/rest/` or `/graphql/`
+
+Work with your actual **records** (the data):
+
+* Create, read, update, delete People, Companies, Opportunities, etc.
+* Query and filter data
+* Manage record relationships
+
+### Metadata API
+
+Accessed on `/rest/metadata/` or `/metadata/`
+
+Manage your **workspace and data model**:
+
+* Create, modify, or delete objects and fields
+* Configure workspace settings
+* Define relationships between objects
+
+## REST vs GraphQL
+
+Both Core and Metadata APIs are available in REST and GraphQL formats:
+
+| Format | Available Operations |
+| ----------- | ---------------------------------------------------------- |
+| **REST** | CRUD, batch operations, upserts |
+| **GraphQL** | Same + **batch upserts**, relationship queries in one call |
+
+Choose based on your needs — both formats access the same data.
+
+## API Endpoints
+
+| Environment | Base URL |
+| --------------- | ------------------------- |
+| **Cloud** | `https://api.twenty.com/` |
+| **Self-Hosted** | `https://{your-domain}/` |
+
+## Authentication
+
+Every API request requires an API key in the header:
+
+```
+Authorization: Bearer YOUR_API_KEY
+```
+
+### Create an API Key
+
+1. Go to **Settings → APIs & Webhooks**
+2. Click **+ Create key**
+3. Configure:
+ * **Name**: Descriptive name for the key
+ * **Expiration Date**: When the key expires
+4. Click **Save**
+5. **Copy immediately** — the key is only shown once
+
+
+
+
+ Your API key grants access to sensitive data. Don't share it with untrusted services. If compromised, disable it immediately and generate a new one.
+
+
+### Assign a Role to an API Key
+
+For better security, assign a specific role to limit access:
+
+1. Go to **Settings → Roles**
+2. Click on the role to assign
+3. Open the **Assignment** tab
+4. Under **API Keys**, click **+ Assign to API key**
+5. Select the API key
+
+The key will inherit that role's permissions. See [Permissions](/l/ja/user-guide/permissions-access/capabilities/permissions) for details.
+
+### Manage API Keys
+
+**Regenerate**: Settings → APIs & Webhooks → Click key → **Regenerate**
+
+**Delete**: Settings → APIs & Webhooks → Click key → **Delete**
+
+## API Playground
+
+Test your APIs directly in the browser with our built-in playground — available for both **REST** and **GraphQL**.
+
+### Access the Playground
+
+1. Go to **Settings → APIs & Webhooks**
+2. Create an API key (required)
+3. Click on **REST API** or **GraphQL API** to open the playground
+
+### What You Get
+
+* **Interactive documentation**: Generated for your specific data model
+* **Live testing**: Execute real API calls against your workspace
+* **Schema explorer**: Browse available objects, fields, and relationships
+* **Request builder**: Construct queries with autocomplete
+
+The playground reflects your custom objects and fields, so documentation is always accurate for your workspace.
+
+## Batch Operations
+
+Both REST and GraphQL support batch operations:
+
+* **Batch size**: Up to 60 records per request
+* **Operations**: Create, update, delete multiple records
+
+**GraphQL-only features:**
+
+* **Batch Upsert**: Create or update in one call
+* Use plural object names (e.g., `CreateCompanies` instead of `CreateCompany`)
+
+## Rate Limits
+
+API requests are throttled to ensure platform stability:
+
+| Limit | Value |
+| -------------- | -------------------- |
+| **Requests** | 100 calls per minute |
+| **Batch size** | 60 records per call |
+
+
+ Use batch operations to maximize throughput — process up to 60 records in a single API call instead of making individual requests.
+
diff --git a/packages/twenty-docs/l/ja/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/ja/developers/extend/capabilities/apps.mdx
new file mode 100644
index 0000000000..dc528fa780
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/extend/capabilities/apps.mdx
@@ -0,0 +1,522 @@
+---
+title: Twenty Apps
+description: Build and manage Twenty customizations as code.
+---
+
+
+ Apps are currently in alpha testing. The feature is functional but still evolving.
+
+
+## What Are Apps?
+
+Apps let you build and manage Twenty customizations **as code**. Instead of configuring everything through the UI, you define your data model and serverless functions in code — making it faster to build, maintain, and roll out to multiple workspaces.
+
+**What you can do today:**
+
+* Define custom objects and fields as code (managed data model)
+* Build serverless functions with custom triggers
+* Deploy the same app across multiple workspaces
+
+**Coming soon:**
+
+* Custom UI layouts and components
+
+## Prerequisites
+
+* Node.js 24+ and Yarn 4
+* A Twenty workspace and an API key (create one at https://app.twenty.com/settings/api-webhooks)
+
+## Getting Started
+
+Create a new app using the official scaffolder, then authenticate and start developing:
+
+```bash filename="Terminal"
+# Scaffold a new app
+npx create-twenty-app@latest my-twenty-app
+cd my-twenty-app
+
+# Authenticate using your API key (you'll be prompted)
+yarn auth
+
+# Start dev mode: automatically syncs local changes to your workspace
+yarn dev
+```
+
+From here you can:
+
+```bash filename="Terminal"
+# Add a new entity to your application (guided)
+yarn create-entity
+
+# Generate a typed Twenty client and workspace entity types
+yarn generate
+
+# Run a one‑time sync (instead of watch mode)
+yarn sync
+
+# Watch your application's functions logs
+yarn logs
+
+# Uninstall the application from the current workspace
+yarn uninstall
+
+# Display commands' help
+yarn help
+```
+
+See also: the CLI reference pages for [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) and [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk).
+
+## Project structure (scaffolded)
+
+When you run `npx create-twenty-app@latest my-twenty-app`, the scaffolder:
+
+* Copies a minimal base application into `my-twenty-app/`
+* Adds a local `twenty-sdk` dependency and Yarn 4 configuration
+* Creates config files and scripts wired to the `twenty` CLI
+* Generates a default application config and a default function role
+
+A freshly scaffolded app looks like this:
+
+```text filename="my-twenty-app/"
+my-twenty-app/
+ package.json
+ yarn.lock
+ .gitignore
+ .nvmrc
+ .yarnrc.yml
+ .yarn/
+ releases/
+ yarn-4.9.2.cjs
+ install-state.gz
+ eslint.config.mjs
+ tsconfig.json
+ README.md
+ src/
+ application.config.ts
+ role.config.ts
+ // your entities, actions, and other app files
+```
+
+At a high level:
+
+* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall`, and `auth` that delegate to the local `twenty` CLI.
+* **.gitignore**: Ignores common artifacts such as `node_modules`, `.yarn`, `generated/` (typed client), `dist/`, `build/`, coverage folders, log files, and `.env*` files.
+* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Lock and configure the Yarn 4 toolchain used by the project.
+* **.nvmrc**: Pins the Node.js version expected by the project.
+* **eslint.config.mjs** and **tsconfig.json**: Provide linting and TypeScript configuration for your app’s TypeScript sources.
+* **README.md**: A short README in the app root with basic instructions.
+* **src/**: The main place where you define your application-as-code:
+ * `application.config.ts`: Global configuration for your app (metadata and runtime wiring). See “Application config” below.
+ * `role.config.ts`: Default function role used by your serverless functions. See “Default function role” below.
+ * Future entities, actions/functions, and any supporting code you add.
+
+Later commands will add more files and folders:
+
+* `yarn generate` will create a `generated/` folder (typed Twenty client + workspace types).
+* `yarn create-entity` will add entity definition files under `src/` for your custom objects.
+
+## Authentication
+
+The first time you run `yarn auth`, you'll be prompted for:
+
+* API URL (defaults to http://localhost:3000 or your current workspace profile)
+* API key
+
+Your credentials are stored per-user in `~/.twenty/config.json`. You can maintain multiple profiles and switch using `--workspace `.
+
+Examples:
+
+```bash filename="Terminal"
+# Login interactively (recommended)
+yarn auth
+
+# Use a specific workspace profile
+yarn auth --workspace my-custom-workspace
+```
+
+## Use the SDK resources (types & config)
+
+The twenty-sdk provides typed building blocks you use inside your app. Below are the key pieces you'll touch most often.
+
+### Defining objects
+
+Custom objects are regular TypeScript classes annotated with decorators from `twenty-sdk`. They live under `src/objects/` in your app and describe both schema and behavior for records in your workspace.
+
+Here is an example `postCard` object from the Hello World app:
+
+```typescript
+import { type Note } from '../../generated';
+
+import {
+ type AddressField,
+ Field,
+ FieldType,
+ type FullNameField,
+ Object,
+ OnDeleteAction,
+ Relation,
+ RelationType,
+ STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS,
+} from 'twenty-sdk';
+
+enum PostCardStatus {
+ DRAFT = 'DRAFT',
+ SENT = 'SENT',
+ DELIVERED = 'DELIVERED',
+ RETURNED = 'RETURNED',
+}
+
+@Object({
+ universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05',
+ nameSingular: 'postCard',
+ namePlural: 'postCards',
+ labelSingular: 'Post card',
+ labelPlural: 'Post cards',
+ description: ' A post card object',
+ icon: 'IconMail',
+})
+export class PostCard {
+ @Field({
+ universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b',
+ type: FieldType.TEXT,
+ label: 'Content',
+ description: "Postcard's content",
+ icon: 'IconAbc',
+ })
+ content: string;
+
+ @Field({
+ universalIdentifier: 'c6aa31f3-da76-4ac6-889f-475e226009ac',
+ type: FieldType.FULL_NAME,
+ label: 'Recipient name',
+ icon: 'IconUser',
+ })
+ recipientName: FullNameField;
+
+ @Field({
+ universalIdentifier: '95045777-a0ad-49ec-98f9-22f9fc0c8266',
+ type: FieldType.ADDRESS,
+ label: 'Recipient address',
+ icon: 'IconHome',
+ })
+ recipientAddress: AddressField;
+
+ @Field({
+ universalIdentifier: '87b675b8-dd8c-4448-b4ca-20e5a2234a1e',
+ type: FieldType.SELECT,
+ label: 'Status',
+ icon: 'IconSend',
+ defaultValue: `'${PostCardStatus.DRAFT}'`,
+ options: [
+ { value: PostCardStatus.DRAFT, label: 'Draft', position: 0, color: 'gray' },
+ { value: PostCardStatus.SENT, label: 'Sent', position: 1, color: 'orange' },
+ { value: PostCardStatus.DELIVERED, label: 'Delivered', position: 2, color: 'green' },
+ { value: PostCardStatus.RETURNED, label: 'Returned', position: 3, color: 'orange' },
+ ],
+ })
+ status: PostCardStatus;
+
+ @Relation({
+ universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe',
+ type: RelationType.ONE_TO_MANY,
+ label: 'Notes',
+ icon: 'IconComment',
+ inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note,
+ onDelete: OnDeleteAction.CASCADE,
+ })
+ notes: Note[];
+
+ @Field({
+ universalIdentifier: 'e06abe72-5b44-4e7f-93be-afc185a3c433',
+ type: FieldType.DATE_TIME,
+ label: 'Delivered at',
+ icon: 'IconCheck',
+ isNullable: true,
+ defaultValue: null,
+ })
+ deliveredAt?: Date;
+}
+```
+
+Key points:
+
+* The `@Object` decorator defines the object identity and labels used across the workspace; its `universalIdentifier` must be unique and stable across deployments.
+* Each `@Field` decorator defines a field on the object with a type, label, and its own stable `universalIdentifier`.
+* `@Relation` wires this object to other objects (standard or custom) and controls cascade behavior with `onDelete`.
+* You can scaffold new objects using `yarn create-entity`, which guides you through naming, fields, and relationships, then generates object files similar to the `postCard` example.
+
+### Application config (application.config.ts)
+
+Every app has a single `application.config.ts` file that describes:
+
+* **Who the app is**: identifiers, display name, and description.
+* **How its functions run**: which role they use for permissions.
+* **(Optional) variables**: key–value pairs exposed to your functions as environment variables.
+
+When you scaffold a new app, you start with a minimal config:
+
+```typescript
+import { type ApplicationConfig } from 'twenty-sdk';
+
+const config: ApplicationConfig = {
+ universalIdentifier: '',
+ displayName: 'My Twenty App',
+ description: 'My first Twenty app',
+ functionRoleUniversalIdentifier: '',
+};
+
+export default config;
+```
+
+You can gradually extend this file as your app grows. For example, you can add an icon and application-scoped variables:
+
+```typescript
+import { type ApplicationConfig } from 'twenty-sdk';
+
+const config: ApplicationConfig = {
+ universalIdentifier: '',
+ displayName: 'My App',
+ description: 'What your app does',
+ icon: 'IconWorld', // Choose an icon by name
+ applicationVariables: {
+ DEFAULT_RECIPIENT_NAME: {
+ universalIdentifier: '',
+ description: 'Default recipient used by functions',
+ value: 'Jane Doe',
+ isSecret: false,
+ },
+ },
+ functionRoleUniversalIdentifier: '',
+};
+
+export default config;
+```
+
+Notes:
+
+* `universalIdentifier` fields are deterministic IDs you own; generate them once and keep them stable across syncs.
+* `applicationVariables` become environment variables for your functions (for example, `DEFAULT_RECIPIENT_NAME` is available as `process.env.DEFAULT_RECIPIENT_NAME`).
+* `functionRoleUniversalIdentifier` must match the role you define in `role.config.ts` (see below).
+
+#### Roles and permissions
+
+Applications can define roles that encapsulate permissions on your workspace’s objects and actions. The field `functionRoleUniversalIdentifier` in `application.config.ts` designates the default role used by your app’s serverless functions.
+
+* The runtime API key injected as `TWENTY_API_KEY` is derived from this default function role.
+* The typed client will be restricted to the permissions granted to that role.
+* Follow least‑privilege: create a dedicated role with only the permissions your functions need, then reference its universal identifier.
+
+##### Default function role (role.config.ts)
+
+When you scaffold a new app, the CLI also creates `src/role.config.ts`. This file exports the default role your serverless functions will use at runtime:
+
+```typescript
+import { PermissionFlag, type RoleConfig } from 'twenty-sdk';
+
+export const functionRole: RoleConfig = {
+ universalIdentifier: '',
+ label: 'My Twenty App default function role',
+ description: 'My Twenty App default function role',
+ canReadAllObjectRecords: true,
+ canUpdateAllObjectRecords: true,
+ canSoftDeleteAllObjectRecords: true,
+ canDestroyAllObjectRecords: false,
+};
+```
+
+The `universalIdentifier` of this role is automatically wired into `application.config.ts` as `functionRoleUniversalIdentifier`. In other words:
+
+* **role.config.ts** defines what the default function role can do.
+* **application.config.ts** points to that role so your functions inherit its permissions.
+
+As you move beyond the initial scaffold, you should tighten this role and make it explicit about what it can access. A more production-ready role might look closer to:
+
+```typescript
+import { PermissionFlag, type RoleConfig } from 'twenty-sdk';
+
+export const functionRole: RoleConfig = {
+ universalIdentifier: '',
+ label: 'Default function role',
+ description: 'Default role for function Twenty client',
+ canReadAllObjectRecords: false,
+ canUpdateAllObjectRecords: false,
+ canSoftDeleteAllObjectRecords: false,
+ canDestroyAllObjectRecords: false,
+ canUpdateAllSettings: false,
+ canBeAssignedToAgents: false,
+ canBeAssignedToUsers: false,
+ canBeAssignedToApiKeys: false,
+ objectPermissions: [
+ {
+ objectNameSingular: 'postCard',
+ canReadObjectRecords: true,
+ canUpdateObjectRecords: true,
+ canSoftDeleteObjectRecords: false,
+ canDestroyObjectRecords: false,
+ },
+ ],
+ fieldPermissions: [
+ {
+ objectNameSingular: 'postCard',
+ fieldName: 'content',
+ canReadFieldValue: false,
+ canUpdateFieldValue: false,
+ },
+ ],
+ permissionFlags: ['APPLICATIONS'],
+};
+```
+
+Notes:
+
+* Start from the scaffolded role, then progressively restrict it following least‑privilege.
+* Replace the `objectPermissions` and `fieldPermissions` with the objects/fields your functions need.
+* `permissionFlags` control access to platform-level capabilities. Keep them minimal; add only what you need.
+* See a working example in the Hello World app: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
+
+### Serverless function config and entrypoint
+
+Each function exports a main handler and a config describing its triggers. You can mix multiple trigger types.
+
+```typescript
+// src/actions/create-new-post-card.ts
+import type {
+ FunctionConfig,
+ DatabaseEventPayload,
+ ObjectRecordCreateEvent,
+ CronPayload,
+} from 'twenty-sdk';
+import Twenty, { type Person } from '../generated';
+
+// main handler can accept parameters from route, cron, or database events
+export const main = async (
+ params:
+ | { name?: string }
+ | DatabaseEventPayload>
+ | CronPayload,
+) => {
+ const client = new Twenty(); // generated typed client
+ const name = 'name' in params
+ ? params.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world'
+ : 'Hello world';
+
+ const result = await client.mutation({
+ createPostCard: {
+ __args: { data: { name } },
+ id: true,
+ name: true,
+ },
+ });
+ return result;
+};
+
+export const config: FunctionConfig = {
+ universalIdentifier: '',
+ name: 'create-new-post-card',
+ timeoutSeconds: 2,
+ triggers: [
+ // Public HTTP route trigger '/s/post-card/create'
+ {
+ universalIdentifier: '',
+ type: 'route',
+ path: '/post-card/create',
+ httpMethod: 'GET',
+ isAuthRequired: false,
+ },
+ // Cron trigger (CRON pattern)
+ {
+ universalIdentifier: '',
+ type: 'cron',
+ pattern: '0 0 1 1 *',
+ },
+ // Database event trigger
+ {
+ universalIdentifier: '',
+ type: 'databaseEvent',
+ eventName: 'person.created',
+ },
+ ],
+};
+```
+
+Common trigger types:
+
+* route: Exposes your function on an HTTP path and method **under the `/s/` endpoint**:
+
+> e.g. `path: '/post-card/create',` -> call on `/s/post-card/create`
+
+* cron: Runs your function on a schedule using a CRON expression.
+* databaseEvent: Runs on workspace object lifecycle events
+
+> e.g. `person.created`
+
+You can create new functions in two ways:
+
+* **Scaffolded**: Run `yarn create-entity --path ` and choose the option to add a new function. This generates a starter file under `` with a `main` handler and a `config` block similar to the example above.
+* **Manual**: Create a new file and export `main` and `config` yourself, following the same pattern.
+
+### Generated typed client
+
+Run yarn generate to create a local typed client in generated/ based on your workspace schema. Use it in your functions:
+
+```typescript
+import Twenty from './generated';
+
+const client = new Twenty();
+const { me } = await client.query({ me: { id: true, displayName: true } });
+```
+
+The client is re-generated by `yarn generate`. Re-run after changing your objects and `yarn sync` or when onboarding to a new workspace.
+
+#### Runtime credentials in serverless functions
+
+When your function runs on Twenty, the platform injects credentials as environment variables before your code executes:
+
+* `TWENTY_API_URL`: Base URL of the Twenty API your app targets.
+* `TWENTY_API_KEY`: Short‑lived key scoped to your application’s default function role.
+
+Notes:
+
+* You do not need to pass URL or API key to the generated client. It reads `TWENTY_API_URL` and `TWENTY_API_KEY` from process.env at runtime.
+* The API key’s permissions are determined by the role referenced in your `application.config.ts` via `functionRoleUniversalIdentifier`. This is the default role used by serverless functions of your application.
+* Applications can define roles to follow least‑privilege. Grant only the permissions your functions need, then point `functionRoleUniversalIdentifier` to that role’s universal identifier.
+
+### Hello World example
+
+Explore a minimal, end-to-end example that demonstrates objects, functions, and multiple triggers [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps/hello-world):
+
+## Manual setup (without the scaffolder)
+
+While we recommend using `create-twenty-app` for the best getting-started experience, you can also set up a project manually. Do not install the CLI globally. Instead, add `twenty-sdk` as a local dependency and wire scripts in your package.json:
+
+```bash filename="Terminal"
+yarn add -D twenty-sdk
+```
+
+Then add scripts like these:
+
+```json filename="package.json"
+{
+ "scripts": {
+ "auth": "twenty auth login",
+ "generate": "twenty app generate",
+ "dev": "twenty app dev",
+ "sync": "twenty app sync",
+ "uninstall": "twenty app uninstall",
+ "logs": "twenty app logs",
+ "create-entity": "twenty app add",
+ "help": "twenty --help"
+ }
+}
+```
+
+Now you can run the same commands via Yarn, e.g. `yarn dev`, `yarn sync`, etc.
+
+## Troubleshooting
+
+* Authentication errors: run `yarn auth` and ensure your API key has the required permissions.
+* Cannot connect to server: verify the API URL and that the Twenty server is reachable.
+* Types or client missing/outdated: run `yarn generate` and then `yarn dev`.
+* Dev mode not syncing: ensure `yarn dev` is running and that changes are not ignored by your environment.
+
+Discord Help Channel: https://discord.com/channels/1130383047699738754/1130386664812982322
diff --git a/packages/twenty-docs/l/ja/developers/extend/capabilities/webhooks.mdx b/packages/twenty-docs/l/ja/developers/extend/capabilities/webhooks.mdx
new file mode 100644
index 0000000000..6c2180e07c
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/extend/capabilities/webhooks.mdx
@@ -0,0 +1,112 @@
+---
+title: Webhooks
+description: Receive real-time notifications when events occur in your CRM.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Webhooks push data to your systems in real-time when events occur in Twenty — no polling required. Use them to keep external systems in sync, trigger automations, or send alerts.
+
+## Create a Webhook
+
+1. Go to **Settings → APIs & Webhooks → Webhooks**
+2. Click **+ Create webhook**
+3. Enter your webhook URL (must be publicly accessible)
+4. Click **Save**
+
+The webhook activates immediately and starts sending notifications.
+
+
+
+### Manage Webhooks
+
+**Edit**: Click the webhook → Update URL → **Save**
+
+**Delete**: Click the webhook → **Delete** → Confirm
+
+## Events
+
+Twenty sends webhooks for these event types:
+
+| Event | Example |
+| ------------------ | ---------------------------------------------------------- |
+| **Record Created** | `person.created`, `company.created`, `note.created` |
+| **Record Updated** | `person.updated`, `company.updated`, `opportunity.updated` |
+| **Record Deleted** | `person.deleted`, `company.deleted` |
+
+All event types are sent to your webhook URL. Event filtering may be added in future releases.
+
+## Payload Format
+
+Each webhook sends an HTTP POST with a JSON body:
+
+```json
+{
+ "event": "person.created",
+ "data": {
+ "id": "abc12345",
+ "firstName": "Alice",
+ "lastName": "Doe",
+ "email": "alice@example.com",
+ "createdAt": "2025-02-10T15:30:45Z",
+ "createdBy": "user_123"
+ },
+ "timestamp": "2025-02-10T15:30:50Z"
+}
+```
+
+| Field | Description |
+| ----------- | ------------------------------------------------ |
+| `event` | What happened (e.g., `person.created`) |
+| `data` | The full record that was created/updated/deleted |
+| `timestamp` | When the event occurred (UTC) |
+
+
+ Respond with a **2xx HTTP status** (200-299) to acknowledge receipt. Non-2xx responses are logged as delivery failures.
+
+
+## Webhook Validation
+
+Twenty signs each webhook request for security. Validate signatures to ensure requests are authentic.
+
+### Headers
+
+| Header | Description |
+| ---------------------------- | --------------------- |
+| `X-Twenty-Webhook-Signature` | HMAC SHA256 signature |
+| `X-Twenty-Webhook-Timestamp` | Request timestamp |
+
+### Validation Steps
+
+1. Get the timestamp from `X-Twenty-Webhook-Timestamp`
+2. Create the string: `{timestamp}:{JSON payload}`
+3. Compute HMAC SHA256 using your webhook secret
+4. Compare with `X-Twenty-Webhook-Signature`
+
+### Example (Node.js)
+
+```javascript
+const crypto = require("crypto");
+
+const timestamp = req.headers["x-twenty-webhook-timestamp"];
+const payload = JSON.stringify(req.body);
+const secret = "your-webhook-secret";
+
+const stringToSign = `${timestamp}:${payload}`;
+const expectedSignature = crypto
+ .createHmac("sha256", secret)
+ .update(stringToSign)
+ .digest("hex");
+
+const isValid = expectedSignature === req.headers["x-twenty-webhook-signature"];
+```
+
+## Webhooks vs Workflows
+
+| Method | Direction | Use Case |
+| ---------------------------- | --------- | ---------------------------------------------------------- |
+| **Webhooks** | OUT | Automatically notify external systems of any record change |
+| **Workflow + HTTP Request** | OUT | Send data out with custom logic (filters, transformations) |
+| **Workflow Webhook Trigger** | IN | Receive data into Twenty from external systems |
+
+For receiving external data, see [Set Up a Webhook Trigger](/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger).
diff --git a/packages/twenty-docs/l/ja/developers/extend/extend.mdx b/packages/twenty-docs/l/ja/developers/extend/extend.mdx
new file mode 100644
index 0000000000..2f973d8002
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/extend/extend.mdx
@@ -0,0 +1,34 @@
+---
+title: Extend
+description: Extend Twenty's functionality with APIs, webhooks, and custom apps.
+---
+
+
+
+
+
+## Overview
+
+Twenty is designed to be extensible. Use our APIs, webhooks, and app framework to integrate with your existing tools and build custom functionality.
+
+## What You Can Do
+
+* **APIs**: Query and modify your CRM data programmatically using REST or GraphQL
+* **Webhooks**: Receive real-time notifications when events occur in Twenty
+* **Apps**: Build custom applications that extend Twenty's capabilities - Coming soon!
+
+## Getting Started
+
+
+
+ Connect to Twenty programmatically
+
+
+
+ Get notified of events in real-time
+
+
+
+ Build customizations as code (Alpha)
+
+
diff --git a/packages/twenty-docs/l/ja/developers/introduction.mdx b/packages/twenty-docs/l/ja/developers/introduction.mdx
new file mode 100644
index 0000000000..7bc187d2d1
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/introduction.mdx
@@ -0,0 +1,23 @@
+---
+title: Getting Started
+description: Welcome to Twenty Developer Documentation, your resources for extending, self-hosting, and contributing to Twenty.
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+
+
+ Extend
+ Build integrations with APIs, webhooks, and custom apps.
+
+
+
+ Self-Host
+ Deploy and manage Twenty on your own infrastructure.
+
+
+
+ Contribute
+ Join our open-source community and contribute to Twenty.
+
+
diff --git a/packages/twenty-docs/l/ja/developers/self-host/capabilities/cloud-providers.mdx b/packages/twenty-docs/l/ja/developers/self-host/capabilities/cloud-providers.mdx
index d5e2db0b91..809388612a 100644
--- a/packages/twenty-docs/l/ja/developers/self-host/capabilities/cloud-providers.mdx
+++ b/packages/twenty-docs/l/ja/developers/self-host/capabilities/cloud-providers.mdx
@@ -1,46 +1,45 @@
---
-title: その他の方法
+title: Other methods
---
- このドキュメントはコミュニティによって管理されています。 問題を含む可能性があります。
- 問題を含む可能性があります。
+ This document is maintained by the community. It might contain issues.
-## Terraformとマニフェストを通したKubernetes
+## Kubernetes via Terraform and Manifests
-Kubernetesデプロイメントに関するコミュニティ主導のドキュメントは[こちら](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s)です。
+Community-led documentation for Kubernetes deployment is available [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s)
### Coolify
-Coolifyを使用してサーバーにTwentyをデプロイします。 (Coolify上の公式イメージは近日公開予定です) (Coolify上の公式イメージは近日公開予定です)
+Deploy Twenty on servers using Coolify. (official image on Coolify will be available soon)
-[Coolifyのドキュメント](https://coolify.io/docs/get-started/introduction)
+[Coolify documentation](https://coolify.io/docs/get-started/introduction)
### EasyPanel
-以下のコミュニティ維持テンプレートを使用して、EasyPanelにTwentyをデプロイします。
+Deploy Twenty on EasyPanel with the community maintained template below.
-以下のコミュニティ維持テンプレートを使用して、EasyPanelにTwentyをデプロイします。
+[Deploy on EasyPanel](https://easypanel.io/docs/templates/twenty)
### Elest.io
-以下のリンクを使用して、Elest.ioにTwentyをサーバー上にデプロイします。
+Deploy Twenty on servers with Elest.io using link below.
-[Elest.ioにデプロイする](https://elest.io/open-source/twenty)
+[Deploy on Elest.io](https://elest.io/open-source/twenty)
-### Railway上のTwenty
+### Twenty on Railway
-以下のコミュニティ維持テンプレートを使用して、RailwayにTwentyをデプロイします。
+Deploy Twenty on Railway with the community maintained template below.
-[](https://railway.com/deploy/nAL3hA)
+[](https://railway.com/deploy/nAL3hA)
-### Sealos上のTwenty
+### Twenty on Sealos
-以下のコミュニティがメンテナンスしているテンプレートを使用して、SealosにTwentyをデプロイします。
+Deploy Twenty on Sealos with the community maintained template below.
-[](https://sealos.io/products/app-store/twenty)
+[](https://sealos.io/products/app-store/twenty)
-## その他
+## Others
-もっと多くのクラウドプロバイダーオプションを追加するために、PRを自由に作成してください。
+Please feel free to Open a PR to add more Cloud Provider options.
diff --git a/packages/twenty-docs/l/ja/developers/self-host/capabilities/docker-compose.mdx b/packages/twenty-docs/l/ja/developers/self-host/capabilities/docker-compose.mdx
new file mode 100644
index 0000000000..1c59a9b1f0
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/self-host/capabilities/docker-compose.mdx
@@ -0,0 +1,253 @@
+---
+title: 1-Click w/ Docker Compose
+---
+
+
+ Docker containers are for production hosting or self-hosting, for the contribution please check the [Local Setup](/l/ja/developers/contribute/capabilities/local-setup).
+
+
+## Overview
+
+This guide provides step-by-step instructions to install and configure the Twenty application using Docker Compose. The aim is to make the process straightforward and prevent common pitfalls that could break your setup.
+
+**Important:** Only modify settings explicitly mentioned in this guide. Altering other configurations may lead to issues.
+
+See docs [Setup Environment Variables](/l/ja/developers/self-host/capabilities/setup) for advanced configuration. All environment variables must be declared in the docker-compose.yml file at the server and / or worker level depending on the variable.
+
+## System Requirements
+
+* RAM: Ensure your environment has at least 2GB of RAM. Insufficient memory can cause processes to crash.
+* Docker & Docker Compose: Make sure both are installed and up-to-date.
+
+## Option 1: One-line script
+
+Install the latest stable version of Twenty with a single command:
+
+```bash
+bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
+```
+
+To install a specific version or branch:
+
+```bash
+VERSION=vx.y.z BRANCH=branch-name bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
+```
+
+* Replace x.y.z with the desired version number.
+* Replace branch-name with the name of the branch you want to install.
+
+## Option 2: Manual steps
+
+Follow these steps for a manual setup.
+
+### Step 1: Set Up the Environment File
+
+1. **Create the .env File**
+
+ Copy the example environment file to a new .env file in your working directory:
+
+ ```bash
+ curl -o .env https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/.env.example
+ ```
+
+2. **Generate Secret Tokens**
+
+ Run the following command to generate a unique random string:
+
+ ```bash
+ openssl rand -base64 32
+ ```
+
+ **Important:** Keep this value secret / do not share it.
+
+3. **Update the `.env`**
+
+ Replace the placeholder value in your .env file with the generated token:
+
+ ```ini
+ APP_SECRET=first_random_string
+ ```
+
+4. **Set the Postgres Password**
+
+ Update the `PG_DATABASE_PASSWORD` value in the .env file with a strong password without special characters.
+
+ ```ini
+ PG_DATABASE_PASSWORD=my_strong_password
+ ```
+
+### Step 2: Obtain the Docker Compose File
+
+Download the `docker-compose.yml` file to your working directory:
+
+```bash
+curl -o docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/docker-compose.yml
+```
+
+### Step 3: Launch the Application
+
+Start the Docker containers:
+
+```bash
+docker compose up -d
+```
+
+### Step 4: Access the Application
+
+If you host twentyCRM on your own computer, open your browser and navigate to [http://localhost:3000](http://localhost:3000).
+
+If you host it on a server, check that the server is running and that everything is ok with
+
+```bash
+curl http://localhost:3000
+```
+
+## Configuration
+
+### Expose Twenty to External Access
+
+By default, Twenty runs on `localhost` at port `3000`. To access it via an external domain or IP address, you need to configure the `SERVER_URL` in your `.env` file.
+
+#### Understanding `SERVER_URL`
+
+* **Protocol:** Use `http` or `https` depending on your setup.
+ * Use `http` if you haven't set up SSL.
+ * Use `https` if you have SSL configured.
+* **Domain/IP:** This is the domain name or IP address where your application is accessible.
+* **Port:** Include the port number if you're not using the default ports (`80` for `http`, `443` for `https`).
+
+### SSL Requirements
+
+SSL (HTTPS) is required for certain browser features to work properly. While these features might work during local development (as browsers treat localhost differently), a proper SSL setup is needed when hosting Twenty on a regular domain.
+
+For example, the clipboard API might require a secure context - some features like copy buttons throughout the application might not work without HTTPS enabled.
+
+We strongly recommend setting up Twenty behind a reverse proxy with SSL termination for optimal security and functionality.
+
+#### Configuring `SERVER_URL`
+
+1. **Determine Your Access URL**
+ * **Without Reverse Proxy (Direct Access):**
+
+ If you're accessing the application directly without a reverse proxy:
+
+ ```ini
+ SERVER_URL=http://your-domain-or-ip:3000
+ ```
+
+ * **With Reverse Proxy (Standard Ports):**
+
+ If you're using a reverse proxy like Nginx or Traefik and have SSL configured:
+
+ ```ini
+ SERVER_URL=https://your-domain-or-ip
+ ```
+
+ * **With Reverse Proxy (Custom Ports):**
+
+ If you're using non-standard ports:
+
+ ```ini
+ SERVER_URL=https://your-domain-or-ip:custom-port
+ ```
+
+2. **Update the `.env` File**
+
+ Open your `.env` file and update the `SERVER_URL`:
+
+ ```ini
+ SERVER_URL=http(s)://your-domain-or-ip:your-port
+ ```
+
+ **Examples:**
+
+ * Direct access without SSL:
+ ```ini
+ SERVER_URL=http://123.45.67.89:3000
+ ```
+ * Access via domain with SSL:
+ ```ini
+ SERVER_URL=https://mytwentyapp.com
+ ```
+
+3. **Restart the Application**
+
+ For changes to take effect, restart the Docker containers:
+
+ ```bash
+ docker compose down
+ docker compose up -d
+ ```
+
+#### Considerations
+
+* **Reverse Proxy Configuration:**
+
+ Ensure your reverse proxy forwards requests to the correct internal port (`3000` by default). Configure SSL termination and any necessary headers.
+
+* **Firewall Settings:**
+
+ Open necessary ports in your firewall to allow external access.
+
+* **Consistency:**
+
+ The `SERVER_URL` must match how users access your application in their browsers.
+
+#### Persistence
+
+* **Data Volumes:**
+
+ The Docker Compose configuration uses volumes to persist data for the database and server storage.
+
+* **Stateless Environments:**
+
+ If deploying to a stateless environment (e.g., certain cloud services), configure external storage to persist data.
+
+## Backup and Restore
+
+Regular backups protect your CRM data from loss.
+
+### Create a Database Backup
+
+```bash
+docker exec twenty-postgres pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql
+```
+
+### Automate Daily Backups
+
+Add to your crontab (`crontab -e`):
+
+```bash
+0 2 * * * docker exec twenty-postgres pg_dump -U postgres twenty > /backups/twenty_$(date +\%Y\%m\%d).sql
+```
+
+### Restore from Backup
+
+1. Stop the application:
+
+```bash
+docker compose stop twenty-server twenty-front
+```
+
+2. Restore the database:
+
+```bash
+docker exec -i twenty-postgres psql -U postgres twenty < backup_20240115.sql
+```
+
+3. Restart services:
+
+```bash
+docker compose up -d
+```
+
+### Backup Best Practices
+
+* **Test restores regularly** — verify backups actually work
+* **Store backups off-site** — use cloud storage (S3, GCS, etc.)
+* **Encrypt sensitive data** — protect backups with encryption
+* **Retain multiple copies** — keep daily, weekly, and monthly backups
+
+## Troubleshooting
+
+If you encounter any problem, check [Troubleshooting](/l/ja/developers/self-host/capabilities/troubleshooting) for solutions.
diff --git a/packages/twenty-docs/l/ja/developers/self-host/capabilities/setup.mdx b/packages/twenty-docs/l/ja/developers/self-host/capabilities/setup.mdx
new file mode 100644
index 0000000000..adfd285e70
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/self-host/capabilities/setup.mdx
@@ -0,0 +1,293 @@
+---
+title: Setup
+---
+
+# Configuration Management
+
+
+ **First time installing?** Follow the [Docker Compose installation guide](/l/ja/developers/self-host/capabilities/docker-compose) to get Twenty running, then return here for configuration.
+
+
+Twenty offers **two configuration modes** to suit different deployment needs:
+
+**Admin panel access:** Only users with admin privileges (`canAccessFullAdminPanel: true`) can access the configuration interface.
+
+## 1. Admin Panel Configuration (Default)
+
+```bash
+IS_CONFIG_VARIABLES_IN_DB_ENABLED=true # default
+```
+
+**Most configuration happens through the UI** after installation:
+
+1. Access your Twenty instance (usually `http://localhost:3000`)
+2. Go to **Settings / Admin Panel / Configuration Variables**
+3. Configure integrations, email, storage, and more
+4. Changes take effect immediately (within 15 seconds for multi-container deployments)
+
+
+ **Multi-Container Deployments:** When using database configuration (`IS_CONFIG_VARIABLES_IN_DB_ENABLED=true`), both server and worker containers read from the same database. Admin panel changes affect both automatically, eliminating the need to duplicate environment variables between containers (except for infrastructure variables).
+
+
+**What you can configure through the admin panel:**
+
+* **Authentication** - Google/Microsoft OAuth, password settings
+* **Email** - SMTP settings, templates, verification
+* **Storage** - S3 configuration, local storage paths
+* **Integrations** - Gmail, Google Calendar, Microsoft services
+* **Workflow & Rate Limiting** - Execution limits, API throttling
+* **And much more...**
+
+
+
+
+ Each variable is documented with descriptions in your admin panel at **Settings → Admin Panel → Configuration Variables**.
+ Some infrastructure settings like database connections (`PG_DATABASE_URL`), server URLs (`SERVER_URL`), and app secrets (`APP_SECRET`) can only be configured via `.env` file.
+
+ [Complete technical reference →](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts)
+
+
+## 2. Environment-Only Configuration
+
+```bash
+IS_CONFIG_VARIABLES_IN_DB_ENABLED=false
+```
+
+**All configuration managed through `.env` files:**
+
+1. Set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` in your `.env` file
+2. Add all configuration variables to your `.env` file
+3. Restart containers for changes to take effect
+4. Admin panel will show current values but cannot modify them
+
+## Multi-Workspace Mode
+
+By default, Twenty runs in **single-workspace mode** — ideal for most self-hosted deployments where you need one CRM instance for your organization.
+
+### Single-Workspace Mode (Default)
+
+```bash
+IS_MULTIWORKSPACE_ENABLED=false # default
+```
+
+* One workspace per Twenty instance
+* First user automatically becomes admin with full privileges (`canImpersonate` and `canAccessFullAdminPanel`)
+* New signups are disabled after the first workspace is created
+* Simple URL structure: `https://your-domain.com`
+
+### Enabling Multi-Workspace Mode
+
+```bash
+IS_MULTIWORKSPACE_ENABLED=true
+DEFAULT_SUBDOMAIN=app # default value
+```
+
+Enable multi-workspace mode for SaaS-like deployments where multiple independent teams need their own workspaces on the same Twenty instance.
+
+**Key differences from single-workspace mode:**
+
+* Multiple workspaces can be created on the same instance
+* Each workspace gets its own subdomain (e.g., `sales.your-domain.com`, `marketing.your-domain.com`)
+* Users sign up and log in at `{DEFAULT_SUBDOMAIN}.your-domain.com` (e.g., `app.your-domain.com`)
+* No automatic admin privileges — first user in each workspace is a regular user
+* Workspace-specific settings like subdomain and custom domain become available in workspace settings
+
+
+ **Environment-only setting:** `IS_MULTIWORKSPACE_ENABLED` can only be configured via `.env` file and requires a restart. It cannot be changed through the admin panel.
+
+
+### DNS Configuration for Multi-Workspace
+
+When using multi-workspace mode, configure your DNS with a wildcard record to allow dynamic subdomain creation:
+
+```
+*.your-domain.com -> your-server-ip
+```
+
+This enables automatic subdomain routing for new workspaces without manual DNS configuration.
+
+### Restricting Workspace Creation
+
+In multi-workspace mode, you may want to limit who can create new workspaces:
+
+```bash
+IS_WORKSPACE_CREATION_LIMITED_TO_SERVER_ADMINS=true
+```
+
+When enabled, only users with `canAccessFullAdminPanel` can create additional workspaces. Users can still create their first workspace during initial signup.
+
+## Gmail & Google Calendar Integration
+
+### Create Google Cloud Project
+
+1. Go to [Google Cloud Console](https://console.cloud.google.com/)
+2. Create a new project or select existing one
+3. Enable these APIs:
+
+* [Gmail API](https://console.cloud.google.com/apis/library/gmail.googleapis.com)
+* [Google Calendar API](https://console.cloud.google.com/apis/library/calendar-json.googleapis.com)
+* [People API](https://console.cloud.google.com/apis/library/people.googleapis.com)
+
+### Configure OAuth
+
+1. Go to [Credentials](https://console.cloud.google.com/apis/credentials)
+2. Create OAuth 2.0 Client ID
+3. Add these redirect URIs:
+ * `https://{your-domain}/auth/google/redirect` (for SSO)
+ * `https://{your-domain}/auth/google-apis/get-access-token` (for integrations)
+
+### Configure in Twenty
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Google Auth** section
+3. Set these variables:
+ * `MESSAGING_PROVIDER_GMAIL_ENABLED=true`
+ * `CALENDAR_PROVIDER_GOOGLE_ENABLED=true`
+ * `AUTH_GOOGLE_CLIENT_ID={client-id}`
+ * `AUTH_GOOGLE_CLIENT_SECRET={client-secret}`
+ * `AUTH_GOOGLE_CALLBACK_URL=https://{your-domain}/auth/google/redirect`
+ * `AUTH_GOOGLE_APIS_CALLBACK_URL=https://{your-domain}/auth/google-apis/get-access-token`
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
+
+**Required scopes** (automatically configured):
+[See relevant source code](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes.ts#L4-L10)
+
+* `https://www.googleapis.com/auth/calendar.events`
+* `https://www.googleapis.com/auth/gmail.readonly`
+* `https://www.googleapis.com/auth/profile.emails.read`
+
+### If your app is in test mode
+
+If your app is in test mode, you will need to add test users to your project.
+
+Under [OAuth consent screen](https://console.cloud.google.com/apis/credentials/consent), add your test users to the "Test users" section.
+
+## Microsoft 365 Integration
+
+
+ Users must have a [Microsoft 365 Licence](https://admin.microsoft.com/Adminportal/Home) to be able to use the Calendar and Messaging API. They will not be able to sync their account on Twenty without one.
+
+
+### Create a project in Microsoft Azure
+
+You will need to create a project in [Microsoft Azure](https://portal.azure.com/#view/Microsoft_AAD_IAM/AppGalleryBladeV2) and get the credentials.
+
+### Enable APIs
+
+On Microsoft Azure Console enable the following APIs in "Permissions":
+
+* Microsoft Graph: Mail.ReadWrite
+* Microsoft Graph: Mail.Send
+* Microsoft Graph: Calendars.Read
+* Microsoft Graph: User.Read
+* Microsoft Graph: openid
+* Microsoft Graph: email
+* Microsoft Graph: profile
+* Microsoft Graph: offline_access
+
+Note: "Mail.ReadWrite" and "Mail.Send" are only mandatory if you want to send emails using our workflow actions. You can use "Mail.Read" instead if you only want to receive emails.
+
+### Authorized redirect URIs
+
+You need to add the following redirect URIs to your project:
+
+* `https://{your-domain}/auth/microsoft/redirect` if you want to use Microsoft SSO
+* `https://{your-domain}/auth/microsoft-apis/get-access-token`
+
+### Configure in Twenty
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Microsoft Auth** section
+3. Set these variables:
+ * `MESSAGING_PROVIDER_MICROSOFT_ENABLED=true`
+ * `CALENDAR_PROVIDER_MICROSOFT_ENABLED=true`
+ * `AUTH_MICROSOFT_ENABLED=true`
+ * `AUTH_MICROSOFT_CLIENT_ID={client-id}`
+ * `AUTH_MICROSOFT_CLIENT_SECRET={client-secret}`
+ * `AUTH_MICROSOFT_CALLBACK_URL=https://{your-domain}/auth/microsoft/redirect`
+ * `AUTH_MICROSOFT_APIS_CALLBACK_URL=https://{your-domain}/auth/microsoft-apis/get-access-token`
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
+
+### Configure scopes
+
+[See relevant source code](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes.ts#L2-L9)
+
+* 'openid'
+* 'email'
+* 'profile'
+* 'offline_access'
+* 'Mail.ReadWrite'
+* 'Mail.Send'
+* 'Calendars.Read'
+
+### If your app is in test mode
+
+If your app is in test mode, you will need to add test users to your project.
+
+Add your test users to the "Users and groups" section.
+
+## Background Jobs for Calendar & Messaging
+
+After configuring Gmail, Google Calendar, or Microsoft 365 integrations, you need to start the background jobs that sync data.
+
+Register the following recurring jobs in your worker container:
+
+```bash
+# from your worker container
+yarn command:prod cron:messaging:messages-import
+yarn command:prod cron:messaging:message-list-fetch
+yarn command:prod cron:calendar:calendar-event-list-fetch
+yarn command:prod cron:calendar:calendar-events-import
+yarn command:prod cron:messaging:ongoing-stale
+yarn command:prod cron:calendar:ongoing-stale
+yarn command:prod cron:workflow:automated-cron-trigger
+```
+
+## Email Configuration
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Email** section
+3. Configure your SMTP settings:
+
+
+
+ You will need to provision an [App Password](https://support.google.com/accounts/answer/185833).
+
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=smtp.gmail.com
+ * EMAIL_SMTP_PORT=465
+ * EMAIL_SMTP_USER=gmail_email_address
+ * EMAIL_SMTP_PASSWORD='gmail_app_password'
+
+
+
+ Keep in mind that if you have 2FA enabled, you will need to provision an [App Password](https://support.microsoft.com/en-us/account-billing/manage-app-passwords-for-two-step-verification-d6dc8c6d-4bf7-4851-ad95-6d07799387e9).
+
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=smtp.office365.com
+ * EMAIL_SMTP_PORT=587
+ * EMAIL_SMTP_USER=office365_email_address
+ * EMAIL_SMTP_PASSWORD='office365_password'
+
+
+
+ **smtp4dev** is a fake SMTP email server for development and testing.
+
+ * Run the smtp4dev image: `docker run --rm -it -p 8090:80 -p 2525:25 rnwood/smtp4dev`
+ * Access the smtp4dev ui here: [http://localhost:8090](http://localhost:8090)
+ * Set the following variables:
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=localhost
+ * EMAIL_SMTP_PORT=2525
+
+
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
diff --git a/packages/twenty-docs/l/ja/developers/self-host/capabilities/troubleshooting.mdx b/packages/twenty-docs/l/ja/developers/self-host/capabilities/troubleshooting.mdx
new file mode 100644
index 0000000000..d2187aedac
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/self-host/capabilities/troubleshooting.mdx
@@ -0,0 +1,227 @@
+---
+title: Troubleshooting
+---
+
+## Troubleshooting
+
+If you encounter any problem while setting up environment for development, upgrading your instance or self-hosting,
+here are some solutions for common problems.
+
+### Self-hosting
+
+#### First install results in `password authentication failed for user "postgres"`
+
+🚨 **IMPORTANT: This solution is ONLY for fresh installations** 🚨
+If you have an existing Twenty instance with production data, **DO NOT** follow these steps as they will permanently delete your database!
+
+While installing Twenty for the first time, you might want to change the default database password.
+The password you set during the first installation becomes permanently stored in the database volume. If you later try to change this password in your configuration without removing the old volume, you'll get authentication errors because the database is still using the original password.
+
+⚠️ WARNING: Following steps will PERMANENTLY DELETE all database data! ⚠️
+Only proceed if this is a fresh installation with no important data.
+
+In order to update the `PG_DATABASE_PASSWORD` you need to:
+
+```sh
+# Update the PG_DATABASE_PASSWORD in .env
+docker compose down --volumes
+docker compose up -d
+```
+
+#### CR line breaks found [Windows]
+
+This is due to the line break characters of Windows and the git configuration. Try running:
+
+```
+git config --global core.autocrlf false
+```
+
+Then delete the repository and clone it again.
+
+#### Missing metadata schema
+
+During Twenty installation, you need to provision your postgres database with the right schemas, extensions, and users.
+If you're successful in running this provisioning, you should have `default` and `metadata` schemas in your database.
+If you don't, make sure you don't have more than one postgres instance running on your computer.
+
+#### Cannot find module 'twenty-emails' or its corresponding type declarations.
+
+You have to build the package `twenty-emails` before running the initialization of the database with `npx nx run twenty-emails:build`
+
+#### Missing twenty-x package
+
+Make sure to run yarn in the root directory and then run `npx nx server:dev twenty-server`. If this still doesn't work try building the missing package manually.
+
+#### Lint on Save not working
+
+This should work out of the box with the eslint extension installed. If this doesn't work try adding this to your vscode setting (on the dev container scope):
+
+```
+"editor.codeActionsOnSave": {
+
+ "source.fixAll.eslint": "explicit"
+
+}
+```
+
+#### While running `npx nx start` or `npx nx start twenty-front`, Out of memory error is thrown
+
+In `packages/twenty-front/.env` uncomment `VITE_DISABLE_TYPESCRIPT_CHECKER=true` to disable background checks thus reducing amount of needed RAM.
+
+**If it does not work:**
+Run only the services you need, instead of `npx nx start`. For instance, if you work on the server, run only `npx nx worker twenty-server`
+
+**If it does not work:**
+If you tried to run only `npx nx run twenty-server:start` on WSL and it's failing with the below memory error:
+
+`FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory`
+
+Workaround is to execute below command in terminal or add it in .bashrc profile to get setup automatically:
+
+`export NODE_OPTIONS="--max-old-space-size=8192"`
+
+The --max-old-space-size=8192 flag sets an upper limit of 8GB for the Node.js heap; usage scales with application demand.
+Reference: https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048
+
+**If it does not work:**
+Investigate which processes are taking you most of your machine RAM. At Twenty, we noticed that some VScode extensions were taking a lot of RAM so we temporarily disable them.
+
+**If it does not work:**
+Restart your machine helps to clean up ghost processes.
+
+#### While running `npx nx start` there are weird [0] and [1] in logs
+
+That's expected as command `npx nx start` is running more commands under the hood
+
+#### No emails are sent
+
+Most of the time, it's because the `worker` is not running in the background. Try to run
+
+```
+npx nx worker twenty-server
+```
+
+#### Cannot connect my Microsoft 365 account
+
+Most of the time, it's because your admin has not enabled the Microsoft 365 Licence for your account. Check [https://admin.microsoft.com/](https://admin.microsoft.com/Adminportal/Home).
+
+If you have an error code `AADSTS50020`, it probably means that you are using a personal Microsoft account. This is not supported yet. More info [here](https://learn.microsoft.com/fr-fr/troubleshoot/entra/entra-id/app-integration/error-code-aadsts50020-user-account-identity-provider-does-not-exist)
+
+#### While running `yarn` warnings appear in console
+
+Warnings are informing about pulling additional dependencies which aren't explicitly stated in `package.json`, so as long as no breaking error appears, everything should work as expected.
+
+#### When user accesses login page, error about unauthorized user trying to access workspace appears in logs
+
+That's expected as user is unauthorized when logged out since its identity is not verified.
+
+#### How to check if your worker is running?
+
+* Go to [webhook-test.com](https://webhook-test.com/) and copy **Your Unique Webhook URL**.
+
+
+
+
+
+* Open your Twenty app, navigate to `/settings`, and enable the **Advanced** toggle at the bottom left of the screen.
+* Create a new webhook.
+* Paste **Your Unique Webhook URL** in the **Endpoint Url** field in Twenty. Set the **Filters** to `Companies` and `Created`.
+
+
+
+
+
+* Go to `/objects/companies` and create a new company record.
+* Return to [webhook-test.com](https://webhook-test.com/) and check if a new **POST request** has been received.
+
+
+
+
+
+* If a **POST request** is received, your worker is running successfully. Otherwise, you need to troubleshoot your worker.
+
+#### Front-end fails to start and returns error TS5042: Option 'project' cannot be mixed with source files on a command line
+
+Comment out checker plugin in `packages/twenty-ui/vite-config.ts` like in example below
+
+```
+plugins: [
+ react({ jsxImportSource: '@emotion/react' }),
+ tsconfigPaths(),
+ svgr(),
+ dts(dtsConfig),
+ // checker(checkersConfig),
+ wyw({
+ include: [
+ '**/OverflowingTextWithTooltip.tsx',
+ '**/Chip.tsx',
+ '**/Tag.tsx',
+ '**/Avatar.tsx',
+ '**/AvatarChip.tsx',
+ ],
+ babelOptions: {
+ presets: ['@babel/preset-typescript', '@babel/preset-react'],
+ },
+ }),
+ ],
+```
+
+#### Admin panel not accessible
+
+Run `UPDATE core."user" SET "canAccessFullAdminPanel" = TRUE WHERE email = 'you@yourdomain.com';` in database container to get access to admin panel.
+
+### 1-click Docker compose
+
+#### Unable to Log In
+
+If you can't log in after setup:
+
+1. Run the following commands:
+ ```bash
+ docker exec -it twenty-server-1 yarn
+ docker exec -it twenty-server-1 npx nx database:reset --configuration=no-seed
+ ```
+2. Restart the Docker containers:
+ ```bash
+ docker compose down
+ docker compose up -d
+ ```
+
+Note the database:reset command will completely erase your database and recreate it from scratch.
+
+#### Connection Issues Behind a Reverse Proxy
+
+If you're running Twenty behind a reverse proxy and experiencing connection issues:
+
+1. **Verify SERVER_URL:**
+
+ Ensure `SERVER_URL` in your `.env` file matches your external access URL, including `https` if SSL is enabled.
+
+2. **Check Reverse Proxy Settings:**
+
+ * Confirm that your reverse proxy is correctly forwarding requests to the Twenty server.
+ * Ensure headers like `X-Forwarded-For` and `X-Forwarded-Proto` are properly set.
+
+3. **Restart Services:**
+
+ After making changes, restart both the reverse proxy and Twenty containers.
+
+#### Error when uploading an image - permission denied
+
+Switching the data folder ownership on the host from root to another user and group resolves this problem.
+
+## Getting Help
+
+If you encounter issues not covered in this guide:
+
+* Check Logs:
+
+ View container logs for error messages:
+
+ ```bash
+ docker compose logs
+ ```
+
+* Community Support:
+
+ Reach out to the [Twenty community](https://github.com/twentyhq/twenty/issues) or [support channels](https://discord.gg/cx5n4Jzs57) for assistance.
diff --git a/packages/twenty-docs/l/ja/developers/self-host/capabilities/upgrade-guide.mdx b/packages/twenty-docs/l/ja/developers/self-host/capabilities/upgrade-guide.mdx
new file mode 100644
index 0000000000..03a53f5685
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/self-host/capabilities/upgrade-guide.mdx
@@ -0,0 +1,381 @@
+---
+title: Upgrade guide
+---
+
+## General guidelines
+
+**Always make sure to back up your database before starting the upgrade process** by running `docker exec -it {db_container_name_or_id} pg_dumpall -U {postgres_user} > databases_backup.sql`.
+
+To restore backup, run `cat databases_backup.sql | docker exec -i {db_container_name_or_id} psql -U {postgres_user}`.
+
+If you used Docker Compose, follow these steps:
+
+1. In a terminal, on the host where Twenty is running, turn off Twenty: `docker compose down`
+
+2. Upgrade the version by changing the `TAG` value in the .env file near your docker-compose. ( We recommend consuming `major.minor` version such as `v0.53` )
+
+3. Bring Twenty back online with `docker compose up -d`
+
+If you want to upgrade your instance by few versions, e.g. from v0.33.0 to v0.35.0, you have to upgrade your instance sequentially, in this example from v0.33.0 to v0.34.0, then from v0.34.0 to v0.35.0.
+
+**Make sure that after each upgraded version you have non-corrupted backup.**
+
+## Version-specific upgrade steps
+
+## v1.0
+
+Hello Twenty v1.0! 🎉
+
+## v0.60
+
+### Performance Enhancements
+
+All interactions with the metadata API have been optimized for better performance, particularly for object metadata manipulation and workspace creation operations.
+
+We've refactored our caching strategy to prioritize cache hits over database queries when possible, significantly improving the performance of metadata API operations.
+
+If you encounter any runtime issues after upgrading, you may need to flush your cache to ensure it's synchronized with the latest changes. Run this command in your twenty-server container:
+
+```bash
+yarn command:prod cache:flush
+```
+
+### v0.55
+
+Upgrade your Twenty instance to use v0.55 image
+
+You don't need to run any command anymore, the new image will automatically care about running all required migrations.
+
+### `User does not have permission` error
+
+If you encounter authorization errors on most requests after upgrading, you may need to flush your cache to recompute the latest permissions.
+
+In your `twenty-server` container, run:
+
+```bash
+yarn command:prod cache:flush
+```
+
+This issue is specific to this Twenty version and should not be required for future upgrades.
+
+### v0.54
+
+Since version `0.53`, no manual actions needed.
+
+#### Metadata schema deprecation
+
+We've merged the `metadata` schema into the `core` one to simplify data retrieval from `TypeORM`.
+We have merged the `migrate` command step within the `upgrade` command. We do not recommend running `migrate` manually within any of your server/worker containers.
+
+### Since v0.53
+
+Starting from `0.53`, upgrade is programmatically done within the `DockerFile`, this means from now on, you shouldn't have to run any command manually anymore.
+
+Make sure to keep upgrading your instance sequentially, without skipping any major version (e.g. `0.43.3` to `0.44.0` is allowed, but `0.43.1` to `0.45.0` isn't), else could lead to workspace version desynchronization that could result in runtime error and missing functionality.
+
+To check if a workspace has been correctly migrated you can review its version in database in `core.workspace` table.
+
+It should always be in the range of your current Twenty's instance `major.minor` version, you can view your instance version in the admin panel (at `/settings/admin-panel`, accessible if your user has `canAccessFullAdminPanel` property set to true in the database) or by running `echo $APP_VERSION` in your `twenty-server` container.
+
+To fix a desynchronized workspace version, you will have to upgrade from the corresponding twenty's version following related upgrade guide sequentially and so on until it reaches desired version.
+
+#### `auditLog` removal
+
+We've removed the auditLog standard object, which means your backup size might be significantly reduced after this migration.
+
+### v0.51 to v0.52
+
+Upgrade your Twenty instance to use v0.52 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+#### I have a workspace blocked in version between `0.52.0` and `0.52.6`
+
+Unfortunately `0.52.0` and `0.52.6` have been completely removed from dockerHub.
+You will have to manually update your workspace version to `0.51.0` in database and upgrade using twenty version `0.52.11` following its just above upgrade guide.
+
+### v0.50 to v0.51
+
+Upgrade your Twenty instance to use v0.51 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+### v0.44.0 to v0.50.0
+
+Upgrade your Twenty instance to use v0.50.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+#### Docker-compose.yml mutation
+
+This version includes a `docker-compose.yml` mutation to give `worker` service access to the `server-local-data` volume.
+Please update your local `docker-compose.yml` with [v0.50.0 docker-compose.yml](https://github.com/twentyhq/twenty/blob/v0.50.0/packages/twenty-docker/docker-compose.yml)
+
+### v0.43.0 to v0.44.0
+
+Upgrade your Twenty instance to use v0.44.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+### v0.42.0 to v0.43.0
+
+Upgrade your Twenty instance to use v0.43.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+In this version, we have also switched to postgres:16 image in docker-compose.yml.
+
+#### (Option 1) Database migration
+
+Keeping the existing postgres-spilo image is fine, but you will have to freeze the version in your docker-compose.yml to be 0.43.0.
+
+#### (Option 2) Database migration
+
+If you want to migrate your database to the new postgres:16 image, please follow these steps:
+
+1. Dump your database from the old postgres-spilo container
+
+```
+docker exec -it twenty-db-1 sh
+pg_dump -U {YOUR_POSTGRES_USER} -d {YOUR_POSTGRES_DB} > databases_backup.sql
+exit
+docker cp twenty-db-1:/home/postgres/databases_backup.sql .
+```
+
+Make sure your dump file is not empty.
+
+2. Upgrade your docker-compose.yml to use postgres:16 image as in the [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) file.
+
+3. Restore the database to the new postgres:16 container
+
+```
+docker cp databases_backup.sql twenty-db-1:/databases_backup.sql
+docker exec -it twenty-db-1 sh
+psql -U {YOUR_POSTGRES_USER} -d {YOUR_POSTGRES_DB} -f databases_backup.sql
+exit
+```
+
+### v0.41.0 to v0.42.0
+
+Upgrade your Twenty instance to use v0.42.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.42
+```
+
+**Environment Variables**
+
+* Removed: `FRONT_PORT`, `FRONT_PROTOCOL`, `FRONT_DOMAIN`, `PORT`
+* Added: `FRONTEND_URL`, `NODE_PORT`, `MAX_NUMBER_OF_WORKSPACES_DELETED_PER_EXECUTION`, `MESSAGING_PROVIDER_MICROSOFT_ENABLED`, `CALENDAR_PROVIDER_MICROSOFT_ENABLED`, `IS_MICROSOFT_SYNC_ENABLED`
+
+### v0.40.0 to v0.41.0
+
+Upgrade your Twenty instance to use v0.41.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.41
+```
+
+**Environment Variables**
+
+* Removed: `AUTH_MICROSOFT_TENANT_ID`
+
+### v0.35.0 to v0.40.0
+
+Upgrade your Twenty instance to use v0.40.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.40
+```
+
+**Environment Variables**
+
+* Added: `IS_EMAIL_VERIFICATION_REQUIRED`, `EMAIL_VERIFICATION_TOKEN_EXPIRES_IN`, `WORKFLOW_EXEC_THROTTLE_LIMIT`, `WORKFLOW_EXEC_THROTTLE_TTL`
+
+### v0.34.0 to v0.35.0
+
+Upgrade your Twenty instance to use v0.35.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.35
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.35` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+* We replaced `ENABLE_DB_MIGRATIONS` with `DISABLE_DB_MIGRATIONS` (default value is now `false`, you probably don't have to set anything)
+
+### v0.33.0 to v0.34.0
+
+Upgrade your Twenty instance to use v0.34.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.34
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.34` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+* Removed: `FRONT_BASE_URL`
+* Added: `FRONT_DOMAIN`, `FRONT_PROTOCOL`, `FRONT_PORT`
+
+We have updated the way we handle the frontend URL.
+You can now set the frontend URL using the `FRONT_DOMAIN`, `FRONT_PROTOCOL` and `FRONT_PORT` variables.
+If FRONT_DOMAIN is not set, the frontend URL will fall back to `SERVER_URL`.
+
+### v0.32.0 to v0.33.0
+
+Upgrade your Twenty instance to use v0.33.0 image
+
+```
+yarn command:prod cache:flush
+yarn database:migrate:prod
+yarn command:prod upgrade-0.33
+```
+
+The `yarn command:prod cache:flush` command will flush the Redis cache.
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.33` takes care of the data migration of all workspaces.
+
+Starting from this version, twenty-postgres image for DB became deprecated and twenty-postgres-spilo is used instead.
+If you want to keep using twenty-postgres image, simply replace `twentycrm/twenty-postgres:${TAG}` with `twentycrm/twenty-postgres` in docker-compose.yml.
+
+### v0.31.0 to v0.32.0
+
+Upgrade your Twenty instance to use v0.32.0 image
+
+**Schema and data migration**
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.32
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.32` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+We have updated the way we handle the Redis connection.
+
+* Removed: `REDIS_HOST`, `REDIS_PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD`
+* Added: `REDIS_URL`
+
+Update your `.env` file to use the new `REDIS_URL` variable instead of the individual Redis connection parameters.
+
+We have also simplified the way we handle the JWT tokens.
+
+* Removed: `ACCESS_TOKEN_SECRET`, `LOGIN_TOKEN_SECRET`, `REFRESH_TOKEN_SECRET`, `FILE_TOKEN_SECRET`
+* Added: `APP_SECRET`
+
+Update your `.env` file to use the new `APP_SECRET` variable instead of the individual tokens secrets (you can use the same secret as before or generate a new random string)
+
+**Connected Account**
+
+If you are using connected account to synchronize your Google emails and calendars, you will need to activate the [People API](https://developers.google.com/people) on your Google Admin console.
+
+### v0.30.0 to v0.31.0
+
+Upgrade your Twenty instance to use v0.31.0 image
+
+**Schema and data migration**:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.31
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.31` takes care of the data migration of all workspaces.
+
+### v0.24.0 to v0.30.0
+
+Upgrade your Twenty instance to use v0.30.0 image
+
+**Breaking change**:
+To enhance performances, Twenty now requires redis cache to be configured. We have updated our [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) to reflect this.
+Make sure to update your configuration and to update your environment variables accordingly:
+
+```
+REDIS_HOST={your-redis-host}
+REDIS_PORT={your-redis-port}
+CACHE_STORAGE_TYPE=redis
+```
+
+**Schema and data migration**:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.30
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.30` takes care of the data migration of all workspaces.
+
+### v0.23.0 to v0.24.0
+
+Upgrade your Twenty instance to use v0.24.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.24
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.24` takes care of the data migration of all workspaces.
+
+### v0.22.0 to v0.23.0
+
+Upgrade your Twenty instance to use v0.23.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.23
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the Database.
+The `yarn command:prod upgrade-0.23` takes care of the data migration, including transferring activities to tasks/notes.
+
+### v0.21.0 to v0.22.0
+
+Upgrade your Twenty instance to use v0.22.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod workspace:sync-metadata -f
+yarn command:prod upgrade-0.22
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the Database.
+The `yarn command:prod workspace:sync-metadata -f` command will sync the definition of standard objects to the metadata tables and apply to required migrations to existing workspaces.
+The `yarn command:prod upgrade-0.22` command will apply specific data transformations to adapt to the new object defaultRequestInstrumentationOptions.
diff --git a/packages/twenty-docs/l/ja/developers/self-host/self-host.mdx b/packages/twenty-docs/l/ja/developers/self-host/self-host.mdx
new file mode 100644
index 0000000000..79b6d060df
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/self-host/self-host.mdx
@@ -0,0 +1,30 @@
+---
+title: Self-Host
+description: Deploy and manage Twenty on your own infrastructure.
+---
+
+
+
+
+
+## Overview
+
+Twenty can be self-hosted on your own infrastructure, giving you full control over your data and deployment.
+
+## Why Self-Host?
+
+* **Data ownership**: Keep all CRM data on your own servers
+* **Compliance**: Meet regulatory requirements for data residency
+* **Customization**: Full access to modify and extend the platform
+
+## Getting Started
+
+
+
+ Quick setup with Docker
+
+
+
+ Deploy on AWS, GCP, or Azure
+
+
diff --git a/packages/twenty-docs/l/ja/navigation.json b/packages/twenty-docs/l/ja/navigation.json
index ce12486516..8096fbf4ac 100644
--- a/packages/twenty-docs/l/ja/navigation.json
+++ b/packages/twenty-docs/l/ja/navigation.json
@@ -1,91 +1,203 @@
{
"tabs": {
"userGuide": {
- "label": "ユーザーガイド",
+ "label": "User Guide",
"groups": {
- "gettingStarted": {
- "label": "始めに"
+ "discoverTwenty": {
+ "label": "Discover Twenty",
+ "groups": {
+ "gettingStartedCapabilities": {
+ "label": "Capabilities"
+ },
+ "gettingStartedHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"dataModel": {
- "label": "データモデル"
+ "label": "Data Model",
+ "groups": {
+ "dataModelCapabilities": {
+ "label": "Capabilities"
+ },
+ "dataModelHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "crmEssentials": {
- "label": "CRM の基本"
+ "dataMigration": {
+ "label": "Data Migration",
+ "groups": {
+ "dataMigrationCapabilities": {
+ "label": "Capabilities"
+ },
+ "dataMigrationHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "views": {
- "label": "ビュー"
+ "calendarEmails": {
+ "label": "Calendar & Emails",
+ "groups": {
+ "calendarEmailsCapabilities": {
+ "label": "Capabilities"
+ },
+ "calendarEmailsHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"workflows": {
- "label": "ワークフロー"
+ "label": "Workflows",
+ "groups": {
+ "workflowsCapabilities": {
+ "label": "Capabilities"
+ },
+ "workflowsHowTos": {
+ "label": "How-Tos",
+ "groups": {
+ "crmAutomations": {
+ "label": "CRM Automations"
+ },
+ "connectToOtherTools": {
+ "label": "Connect to Other Tools"
+ },
+ "advancedConfigurations": {
+ "label": "Advanced Configurations"
+ },
+ "needMoreHelp": {
+ "label": "Need More Help"
+ }
+ }
+ }
+ }
},
- "collaboration": {
- "label": "コラボレーション"
+ "ai": {
+ "label": "AI",
+ "groups": {
+ "aiCapabilities": {
+ "label": "Capabilities"
+ },
+ "aiHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "integrationsApi": {
- "label": "連携とAPI"
+ "viewsPipelines": {
+ "label": "Views & Pipelines",
+ "groups": {
+ "viewsPipelinesCapabilities": {
+ "label": "Capabilities"
+ },
+ "viewsPipelinesHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "reporting": {
- "label": "レポーティング"
+ "dashboards": {
+ "label": "Dashboards",
+ "groups": {
+ "dashboardsCapabilities": {
+ "label": "Capabilities"
+ },
+ "dashboardsHowTos": {
+ "label": "How-Tos"
+ }
+ }
+ },
+ "permissionsAccess": {
+ "label": "Permissions & Access",
+ "groups": {
+ "permissionsAccessCapabilities": {
+ "label": "Capabilities"
+ },
+ "permissionsAccessHowTos": {
+ "label": "How-Tos"
+ }
+ }
+ },
+ "billing": {
+ "label": "Billing",
+ "groups": {
+ "billingCapabilities": {
+ "label": "Capabilities"
+ },
+ "billingHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"settings": {
- "label": "設定"
- },
- "pricing": {
- "label": "料金"
- },
- "resources": {
- "label": "リソース"
+ "label": "Settings",
+ "groups": {
+ "settingsCapabilities": {
+ "label": "Capabilities"
+ },
+ "settingsHowTos": {
+ "label": "How-Tos"
+ }
+ }
}
}
},
"developers": {
- "label": "開発者",
+ "label": "Developers",
"groups": {
"developersGroup": {
- "label": "開発者"
+ "label": "Developers"
},
- "devGettingStarted": {
- "label": "始めに",
+ "extend": {
+ "label": "Extend",
"groups": {
- "selfHosting": {
- "label": "セルフホスティング"
- },
- "apiAndWebhooks": {
- "label": "APIとWebhooks"
+ "extendCapabilities": {
+ "label": "Capabilities"
}
}
},
- "contributing": {
- "label": "貢献",
+ "selfHost": {
+ "label": "Self-Host",
"groups": {
- "frontendDevelopment": {
- "label": "フロントエンド開発",
+ "selfHostCapabilities": {
+ "label": "Capabilities"
+ }
+ }
+ },
+ "contribute": {
+ "label": "Contribute",
+ "groups": {
+ "contributeCapabilities": {
+ "label": "Capabilities",
"groups": {
- "twentyUi": {
- "label": "Twenty UI",
+ "frontendDevelopment": {
+ "label": "Frontend Development",
"groups": {
- "display": {
- "label": "表示"
- },
- "feedback": {
- "label": "フィードバック"
- },
- "input": {
- "label": "Input"
- },
- "navigation": {
- "label": "Navigation"
+ "twentyUi": {
+ "label": "Twenty UI",
+ "groups": {
+ "display": {
+ "label": "Display"
+ },
+ "feedback": {
+ "label": "Feedback"
+ },
+ "input": {
+ "label": "Input"
+ },
+ "navigation": {
+ "label": "Navigation"
+ }
+ }
}
}
+ },
+ "backendDevelopment": {
+ "label": "Backend Development"
}
}
- },
- "backendDevelopment": {
- "label": "バックエンド開発"
}
}
}
}
}
}
-}
\ No newline at end of file
+}
diff --git a/packages/twenty-docs/l/ja/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/ja/twenty-ui/display/app-tooltip.mdx
index f0226bc91d..4e620eedc7 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/display/app-tooltip.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/display/app-tooltip.mdx
@@ -1,16 +1,16 @@
---
-title: アプリツールチップ
+title: App Tooltip
image: /images/user-guide/tips/light-bulb.png
---
-
+
-ユーザーが要素とやり取りするときに追加情報を表示する短いメッセージ。
+A brief message that displays additional information when a user interacts with an element.
-
+
```jsx
import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
@@ -18,12 +18,12 @@ image: /images/user-guide/tips/light-bulb.png
return (
<>
- カスタマーインサイト
+ Customer Insights
-
- | プロパティ | タイプ | 説明 |
- | ---------------- | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
- | className | string | 追加のスタイリング用のオプションのCSSクラス |
- | anchorSelect | CSSセレクタ | ツールチップのアンカー(ツールチップをトリガーする要素)のセレクタ |
- | content | string | ツールチップ内に表示したいコンテンツ |
- | delayHide | 数 | アンカーからカーソルが離れた後、ツールチップを非表示にする前の遅延(秒) |
- | offset | 数 | ツールチップの位置を決めるためのオフセット(ピクセル) |
- | noArrow | ブール型 | `true`の場合、ツールチップの矢印を非表示にします |
- | isOpen | ブール型 | `true`の場合、ツールチップはデフォルトで開かれています |
- | place | `react-tooltip`からの`PlacesType`文字列 | ツールチップの配置を指定します。 値は`bottom`、`left`、`right`、`top`、`top-start`、`top-end`、`right-start`、`right-end`、`bottom-start`、`bottom-end`、`left-start`、`left-end`などがあります |
- | positionStrategy | `react-tooltip`からの`PositionStrategy`文字列 | ツールチップの位置戦略。 2つの値があります: `absolute` と `fixed` |
+
+ | Props | Type | Description |
+ | ---------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional CSS class for additional styling |
+ | anchorSelect | CSS selector | Selector for the tooltip anchor (the element that triggers the tooltip) |
+ | content | string | The content you want to display within the tooltip |
+ | delayHide | number | The delay in seconds before hiding the tooltip after the cursor leaves the anchor |
+ | offset | number | The offset in pixels for positioning the tooltip |
+ | noArrow | boolean | If `true`, hides the arrow on the tooltip |
+ | isOpen | boolean | If `true`, the tooltip is open by default |
+ | place | `PlacesType` string from `react-tooltip` | Specifies the placement of the tooltip. Values include `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, and `left-end` |
+ | positionStrategy | `PositionStrategy` string from `react-tooltip` | Position strategy for the tooltip. Has two values: `absolute` and `fixed` |
-## ツールチップを伴うオーバーフローテキスト
+## Overflowing Text with Tooltip
-オーバーフローテキストを処理し、テキストがオーバーフローしたときにツールチップを表示します。
+Handles overflowing text and displays a tooltip when the text overflows.
-
+
```jsx
import { OverflowingTextWithTooltip } from 'twenty-ui/display';
export const MyComponent = () => {
const crmTaskDescription =
- '最近の製品照会に関してクライアントをフォローアップします。 価格オプションについて議論し、懸念事項に対応し、追加の製品情報を提供します。 将来の参照のために、会話の詳細をCRMに記録します。';
+ 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
return ;
};
```
-
- | プロパティ | タイプ | 説明 |
- | ----- | ------ | -------------------------- |
- | テキスト | string | オーバーフローテキストエリア内に表示したいコンテンツ |
+
+ | Props | Type | Description |
+ | ----- | ------ | ------------------------------------------------------------ |
+ | text | string | The content you want to display in the overflowing text area |
diff --git a/packages/twenty-docs/l/ja/twenty-ui/display/checkmark.mdx b/packages/twenty-docs/l/ja/twenty-ui/display/checkmark.mdx
index 228d4b883d..ef84d5c2d5 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/display/checkmark.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/display/checkmark.mdx
@@ -1,69 +1,58 @@
---
-title: チェックマーク
-image: '""'
+title: Checkmark
+image: /images/user-guide/tasks/tasks_header.png
---
-成功したまたは完了したアクションを示します。
+Represents a successful or completed action.
-
+
+ ```jsx
+ import { Checkmark } from 'twenty-ui/display';
-```jsx
-import { Checkmark } from 'twenty-ui/display';
-
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-
-`div` 要素の全てのプロパティを受け取る他、`React.ComponentPropsWithoutRef<'div'>`を拡張します。
-
-
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+ Extends `React.ComponentPropsWithoutRef<'div'>` and accepts all the props of a regular `div` element.
+
-## アニメーション付きチェックマーク
+## Animated Checkmark
-アニメーション機能を追加したチェックマークアイコンを示します。
+Represents a checkmark icon with the added feature of animation.
+
+ ```jsx
+ import { AnimatedCheckmark } from 'twenty-ui/display';
-
-
-```jsx
-import { AnimatedCheckmark } from 'twenty-ui/display';
-
-export const MyComponent = () => {
- return (
-
- );
-};
-```
-
-
-
-
-
-| プロパティ | タイプ | 説明 | デフォルト |
-| ---------- | ------ | --------------------- | -------------------- |
-| アニメーションの有無 | ブール型 | チェックマークのアニメーションを制御します | 偽 |
-| カラー | string | チェックマークの色 | |
-| 継続時間 | 数 | アニメーションの持続時間(秒) | 0.5秒 |
-| サイズ | 数 | チェックマークのサイズ | 28ピクセル |
-
-
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+ | Props | Type | Description | Default |
+ | ----------- | ------- | ------------------------------------------- | ----------- |
+ | isAnimating | boolean | Controls whether the checkmark is animating | false |
+ | color | string | Color of the checkmark | |
+ | duration | number | The duration of the animation in seconds | 0.5 seconds |
+ | size | number | The size of the checkmark | 28 pixels |
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/display/chip.mdx b/packages/twenty-docs/l/ja/twenty-ui/display/chip.mdx
index 15a73a06c8..ded2fd1c77 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/display/chip.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/display/chip.mdx
@@ -1,5 +1,5 @@
---
-title: チップ
+title: Chip
image: /images/user-guide/github/github-header.png
---
@@ -7,53 +7,48 @@ image: /images/user-guide/github/github-header.png
-ラベル、オプションの左および右コンポーネント、さまざまなスタイルオプションを使用してラベルやタグを表示するクリック可能または非クリック可能なコンテナとして使用できるビジュアル要素。
+A visual element that you can use as a clickable or non-clickable container with a label, optional left and right components, and various styling options to display labels and tags.
+
+ ```jsx
+ import { Chip } from 'twenty-ui/components';
-
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
-```jsx
-import { Chip } from 'twenty-ui/components';
+ ```
+
-export const MyComponent = () => {
- return (
-
- );
-};
-
-```
-
-
-
-
-
-| プロパティ | タイプ | 説明 |
-| ------------ | ----------------------- | ------------------------------------------------------------------------------ |
-| linkToEntity | string | エンティティへのリンク |
-| entityId | string | エンティティの一意識別子 |
-| 名前 | string | エンティティの名前 |
-| pictureUrl | string | 写真", |
-| avatarType | アバタータイプ | 表示したいアバターのタイプ。 表示したいアバターのタイプ。 オプションは2つ:`rounded` と `squared` |
-| バリアント | `EntityChipVariant` 列挙型 | 表示したいエンティティチップのバリアント。 表示したいエンティティチップのバリアント。 オプションは2つ:`regular` と `transparent` |
-| 左アイコン | アイコンコンポーネント | アイコンを表す React コンポーネント。 チップの左側に表示されます チップの左側に表示されます チップの左側に表示されます チップの左側に表示されます |
-
-
+
+ | Props | Type | Description |
+ | ------------ | ------------------------ | -------------------------------------------------------------------------------------------- |
+ | linkToEntity | string | The link to the entity |
+ | entityId | string | The unique identifier for the entity |
+ | name | string | The name of the entity |
+ | pictureUrl | string | s picture", |
+ | avatarType | Avatar Type | The type of avatar you want to display. Has two options: `rounded` and `squared` |
+ | variant | `EntityChipVariant` enum | Variant of the entity chip you want to display. Has two options: `regular` and `transparent` |
+ | LeftIcon | IconComponent | A React component representing an icon. Displayed on the left side of the chip |
+
-## 例
+## Examples
-### 透明無効チップ
+### Transparent Disabled Chip
```jsx
import { Chip } from 'twenty-ui/components';
@@ -76,9 +71,9 @@ export const MyComponent = () => {
```
-
+
-### ツールチップ付き無効チップ
+### Disabled Chip with Tooltip
```jsx
import { Chip } from "twenty-ui/components";
@@ -100,49 +95,44 @@ export const MyComponent = () => {
};
```
-## エンティティチップ
+## Entity Chip
-エンティティに関する情報を表示するチップ風の要素。
+A Chip-like element to display information about an entity.
+
+ ```jsx
+ import { BrowserRouter as Router } from 'react-router-dom';
+ import { IconTwentyStar } from 'twenty-ui/display';
+ import { Chip } from 'twenty-ui/components';
-
+ export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
-```jsx
-import { BrowserRouter as Router } from 'react-router-dom';
-import { IconTwentyStar } from 'twenty-ui/display';
-import { Chip } from 'twenty-ui/components';
-
-export const MyComponent = () => {
- return (
-
-
-
- );
-};
-```
-
-
-
-
-
-| プロパティ | タイプ | 説明 |
-| ------------ | ----------------------- | ------------------------------------------------------------------------------ |
-| linkToEntity | string | エンティティへのリンク |
-| entityId | string | エンティティの一意識別子 |
-| 名前 | string | エンティティの名前 |
-| pictureUrl | string | 写真", |
-| avatarType | アバタータイプ | 表示したいアバターのタイプ。 表示したいアバターのタイプ。 オプションは2つ:`rounded` と `squared` |
-| バリアント | `EntityChipVariant` 列挙型 | 表示したいエンティティチップのバリアント。 表示したいエンティティチップのバリアント。 オプションは2つ:`regular` と `transparent` |
-| 左アイコン | アイコンコンポーネント | アイコンを表す React コンポーネント。 チップの左側に表示されます チップの左側に表示されます チップの左側に表示されます チップの左側に表示されます |
-
-
+
+ | Props | Type | Description |
+ | ------------ | ------------------------ | -------------------------------------------------------------------------------------------- |
+ | linkToEntity | string | The link to the entity |
+ | entityId | string | The unique identifier for the entity |
+ | name | string | The name of the entity |
+ | pictureUrl | string | s picture", |
+ | avatarType | Avatar Type | The type of avatar you want to display. Has two options: `rounded` and `squared` |
+ | variant | `EntityChipVariant` enum | Variant of the entity chip you want to display. Has two options: `regular` and `transparent` |
+ | LeftIcon | IconComponent | A React component representing an icon. Displayed on the left side of the chip |
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/display/icons.mdx b/packages/twenty-docs/l/ja/twenty-ui/display/icons.mdx
new file mode 100644
index 0000000000..2d73154c8d
--- /dev/null
+++ b/packages/twenty-docs/l/ja/twenty-ui/display/icons.mdx
@@ -0,0 +1,73 @@
+---
+title: Icons
+image: /images/user-guide/objects/objects.png
+---
+
+
+
+
+
+A list of icons used throughout our app.
+
+## Tabler Icons
+
+We use Tabler icons for React throughout the app.
+
+
+
+
+
+ ```
+ yarn add @tabler/icons-react
+ ```
+
+
+
+ You can import each icon as a component. Here's an example:
+
+
+
+ ```jsx
+ import { IconArrowLeft } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ------ | ------ | ------------------------------------------ | ------------ |
+ | size | number | The height and width of the icon in pixels | 24 |
+ | color | string | The color of the icons | currentColor |
+ | stroke | number | The stroke width of the icon in pixels | 2 |
+
+
+
+## Custom Icons
+
+In addition to Tabler icons, the app also uses some custom icons.
+
+### Icon Address Book
+
+Displays an address book icon.
+
+
+
+ ```jsx
+ import { IconAddressBook } from 'twenty-ui/display';
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ------ | ------ | ------------------------------------------ | ------- |
+ | size | number | The height and width of the icon in pixels | 24 |
+ | stroke | number | The stroke width of the icon in pixels | 2 |
+
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/display/soon-pill.mdx b/packages/twenty-docs/l/ja/twenty-ui/display/soon-pill.mdx
new file mode 100644
index 0000000000..56ace0bae7
--- /dev/null
+++ b/packages/twenty-docs/l/ja/twenty-ui/display/soon-pill.mdx
@@ -0,0 +1,18 @@
+---
+title: Soon Pill
+image: /images/user-guide/kanban-views/kanban.png
+---
+
+
+
+
+
+A small badge or "pill" to indicate something is coming soon.
+
+```jsx
+import { SoonPill } from "@/ui/display/pill/components/SoonPill";
+
+export const MyComponent = () => {
+ return ;
+};
+```
diff --git a/packages/twenty-docs/l/ja/twenty-ui/display/tag.mdx b/packages/twenty-docs/l/ja/twenty-ui/display/tag.mdx
index be619b2aaf..a2226c88d4 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/display/tag.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/display/tag.mdx
@@ -1,5 +1,5 @@
---
-title: タグ
+title: Tag
image: /images/user-guide/table-views/table.png
---
@@ -7,38 +7,32 @@ image: /images/user-guide/table-views/table.png
-コンテンツを視覚的に分類またはラベル付けするためのコンポーネント。
+Component to visually categorize or label content.
+
+ ```jsx
+ import { Tag } from "@/ui/display/tag/components/Tag";
-
-
-```jsx
-import { Tag } from "@/ui/display/tag/components/Tag";
-
-export const MyComponent = () => {
- return (
- console.log("click")}
- />
- );
-};
-```
-
-
-
-
-
-| プロパティ | タイプ | 説明 |
-| --------- | ------ | ---------------------------------------------------------------------------------------------------------------- |
-| className | string | 追加のスタイリングのためのオプション名 |
-| カラー | string | タグの色。 タグの色。 タグの色。 タグの色。 オプションは次のとおりです: `緑`, `トルコ石`, `空`, `青`, `紫`, `ピンク`, `赤`, `オレンジ`, `黄`, `灰色` |
-| テキスト | string | タグの内容 |
-| onClick | 機能 | ユーザーがタグをクリックすると呼び出される任意の関数 |
-
-
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+ | Props | Type | Description |
+ | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | color | string | Color of the tag. Options include: `green`, `turquoise`, `sky`, `blue`, `purple`, `pink`, `red`, `orange`, `yellow`, `gray` |
+ | text | string | The content of the tag |
+ | onClick | function | Optional function called when a user clicks on the tag |
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/input.mdx b/packages/twenty-docs/l/ja/twenty-ui/input.mdx
index 2283178d8b..2da701caf5 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/input.mdx
@@ -1,8 +1,8 @@
---
-title: 入力
+title: Input
image: /images/user-guide/tips/light-bulb.png
---
-
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/input/block-editor.mdx b/packages/twenty-docs/l/ja/twenty-ui/input/block-editor.mdx
index 93fd70dd8f..9943fa5f5d 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/input/block-editor.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/input/block-editor.mdx
@@ -1,5 +1,5 @@
---
-title: ブロックエディター
+title: Block Editor
image: /images/user-guide/api/api.png
---
@@ -7,28 +7,25 @@ image: /images/user-guide/api/api.png
-ブロックベースのリッチテキストエディター[BlockNote](https://www.blocknotejs.org/)を使用して、ユーザーがコンテンツのブロックを編集および表示できるようにします。
+Uses a block-based rich text editor from [BlockNote](https://www.blocknotejs.org/) to allow users to edit and view blocks of content.
-
+
+ ```jsx
+ import { useBlockNote } from "@blocknote/react";
+ import { BlockEditor } from "@/ui/input/editor/components/BlockEditor";
-```jsx
-import { useBlockNote } from "@blocknote/react";
-import { BlockEditor } from "@/ui/input/editor/components/BlockEditor";
+ export const MyComponent = () => {
+ const BlockNoteEditor = useBlockNote();
-export const MyComponent = () => {
- const BlockNoteEditor = useBlockNote();
+ return ;
+ };
+ ```
+
- return ;
-};
-```
-
-
-
-
-| プロパティ | タイプ | 説明 |
-| ----- | ----------------- | -------------------- |
-| エディター | `BlockNoteEditor` | ブロックエディターインスタンスまたは構成 |
-
-
+
+ | Props | Type | Description |
+ | ------ | ----------------- | ------------------------------------------ |
+ | editor | `BlockNoteEditor` | The block editor instance or configuration |
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/input/buttons.mdx b/packages/twenty-docs/l/ja/twenty-ui/input/buttons.mdx
new file mode 100644
index 0000000000..1c53eb1816
--- /dev/null
+++ b/packages/twenty-docs/l/ja/twenty-ui/input/buttons.mdx
@@ -0,0 +1,439 @@
+---
+title: Buttons
+image: /images/user-guide/views/filter.png
+---
+
+
+
+
+
+A list of buttons and button groups used throughout the app.
+
+## Button
+
+
+
+ ```jsx
+ import { Button } from "@/ui/input/button/components/Button";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional class name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | fullWidth | boolean | Defines whether the button should span the whole width of its container |
+ | variant | string | The visual style variant of the button. Options include `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` |
+ | accent | string | The accent color of the button. Options include: `default`, `blue`, and `danger` |
+ | soon | boolean | Indicates if the button is marked as "soon" (such as for upcoming features) |
+ | disabled | boolean | Specifies whether the button is disabled or not |
+ | focus | boolean | Determines if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Button Group
+
+
+
+ ```jsx
+ import { Button } from "@/ui/input/button/components/Button";
+ import { ButtonGroup } from "@/ui/input/button/components/ButtonGroup";
+
+ export const MyComponent = () => {
+ return (
+
+ console.log("click")}
+ />
+ console.log("click")}
+ />
+ console.log("click")}
+ />
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------- | ---------------------------------------------------------------------------------------------------------------- |
+ | variant | string | The visual style variant of the buttons within the group. Options include `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the buttons within the group. Has two options: `medium` and `small` |
+ | accent | string | The accent color of the buttons within the group. Options include `default`, `blue` and `danger` |
+ | className | string | Optional class name for additional styling |
+ | children | ReactNode | An array of React elements representing the individual buttons within the group |
+
+
+
+## Floating Button
+
+
+
+ ```jsx
+ import { FloatingButton } from "@/ui/input/button/components/FloatingButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | --------------------- | ---------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `middle`, `right` |
+ | applyShadow | boolean | Determines whether to apply shadow to a button |
+ | applyBlur | boolean | Determines whether to apply a blur effect to the button |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+
+
+
+## Floating Button Group
+
+
+
+ ```jsx
+ import { FloatingButton } from "@/ui/input/button/components/FloatingButton";
+ import { FloatingButtonGroup } from "@/ui/input/button/components/FloatingButtonGroup";
+ import { IconClipboardText, IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+
+
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | -------- | --------- | ------------------------------------------------------------------------------- | ------- |
+ | size | string | The size of the button. Has two options: `small` and `medium` | small |
+ | children | ReactNode | An array of React elements representing the individual buttons within the group | |
+
+
+
+## Floating Icon Button
+
+
+
+ ```jsx
+ import { FloatingIconButton } from "@/ui/input/button/components/FloatingIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ isActive={true}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` |
+ | applyShadow | boolean | Determines whether to apply shadow to a button |
+ | applyBlur | boolean | Determines whether to apply a blur effect to the button |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+ | isActive | boolean | Determines if the button is in an active state |
+
+
+
+## Floating Icon Button Group
+
+
+
+ ```jsx
+ import { FloatingIconButtonGroup } from "@/ui/input/button/components/FloatingIconButtonGroup";
+ import { IconClipboardText, IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ const iconButtons = [
+ {
+ Icon: IconClipboardText,
+ onClick: () => console.log("Button 1 clicked"),
+ isActive: true,
+ },
+ {
+ Icon: IconCheckbox,
+ onClick: () => console.log("Button 2 clicked"),
+ isActive: true,
+ },
+ ];
+
+ return (
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | iconButtons | array | An array of objects, each representing an icon button in the group. Each object should include the icon component you want to display in the button, the function you want to call when a user clicks on the button, and whether the button should be active or not. |
+
+
+
+## Light Button
+
+
+
+ ```jsx
+ import { LightButton } from "@/ui/input/button/components/LightButton";
+
+ export const MyComponent = () => {
+ return console.log('click')}
+ />;
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ----------------- | --------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | icon | `React.ReactNode` | The icon you want to display in the button |
+ | title | string | The text content of the button |
+ | accent | string | The accent color of the button. Options include: `secondary` and `tertiary` |
+ | active | boolean | Determines if the button is in an active state |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Light Icon Button
+
+
+
+ ```jsx
+ import { LightIconButton } from "@/ui/input/button/components/LightIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------------------- | --------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | testId | string | Test identifier for the button |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | accent | string | The accent color of the button. Options include: `secondary` and `tertiary` |
+ | active | boolean | Determines if the button is in an active state |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Main Button
+
+
+
+ ```jsx
+ import { MainButton } from "@/ui/input/button/components/MainButton";
+ import { IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------------- | -------------------------------- | --------------------------------------------------------------------------------- |
+ | title | string | The text content of the button |
+ | fullWidth | boolean | Defines whether the button should span the whole width of its container |
+ | variant | string | The visual style variant of the button. Options include `primary` and `secondary` |
+ | soon | boolean | Indicates if the button is marked as "soon" (such as for upcoming features) |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | React `button` props | `React.ComponentProps<'button'>` | All standard HTML button props are supported |
+
+
+
+## Rounded Icon Button
+
+
+
+ ```jsx
+ import { RoundedIconButton } from "@/ui/input/button/components/RoundedIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------------- | ----------------------------------------------- | ----------- |
+ | Icon | `React.ComponentType` | |
+ | React `button` props | `React.ButtonHTMLAttributes` | |
+
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/input/checkbox.mdx b/packages/twenty-docs/l/ja/twenty-ui/input/checkbox.mdx
new file mode 100644
index 0000000000..b25eeba052
--- /dev/null
+++ b/packages/twenty-docs/l/ja/twenty-ui/input/checkbox.mdx
@@ -0,0 +1,44 @@
+---
+title: Checkbox
+image: /images/user-guide/tasks/tasks_header.png
+---
+
+
+
+
+
+Used when a user needs to select multiple values from several options.
+
+
+
+ ```jsx
+ import { Checkbox } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ return (
+ console.log("onChange function fired")}
+ onCheckedChange={() => console.log("onCheckedChange function fired")}
+ variant="primary"
+ size="small"
+ shape="squared"
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------------- | -------- | -------------------------------------------------------------------------------------------- |
+ | checked | boolean | Indicates whether the checkbox is checked |
+ | indeterminate | boolean | Indicates whether the checkbox is in an indeterminate state (neither checked nor unchecked) |
+ | onChange | function | The callback function you want to trigger when the checkbox state changes |
+ | onCheckedChange | function | The callback function you want to trigger when the `checked` state changes |
+ | variant | string | The visual style variant of the box. Options include: `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the checkbox. Has two options: `small` and `large` |
+ | shape | string | The shape of the checkbox. Has two options: `squared` and `rounded` |
+
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/input/color-scheme.mdx b/packages/twenty-docs/l/ja/twenty-ui/input/color-scheme.mdx
new file mode 100644
index 0000000000..1b1505d481
--- /dev/null
+++ b/packages/twenty-docs/l/ja/twenty-ui/input/color-scheme.mdx
@@ -0,0 +1,63 @@
+---
+title: Color Scheme
+image: /images/user-guide/fields/field.png
+---
+
+
+
+
+
+## Color Scheme Card
+
+Represents different color schemes and is specially tailored for light and dark themes.
+
+
+
+ ```jsx
+ import { ColorSchemeCard } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ---------------- | --------------------------------------- | ----------------------------------------------------------------------- | ------- |
+ | variant | string | The color scheme variant. Options include `Dark`, `Light`, and `System` | light |
+ | selected | boolean | If `true`, displays a checkmark to indicate the selected color scheme | |
+ | additional props | `React.ComponentPropsWithoutRef<'div'>` | Standard HTML `div` element props | |
+
+
+
+## Color Scheme Picker
+
+Allows users to choose between different color schemes.
+
+
+
+ ```jsx
+ import { ColorSchemePicker } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------- | -------------- | ---------------------------------------------------------------------------- |
+ | value | `Color Scheme` | The currently selected color scheme |
+ | onChange | function | The callback function you want to trigger when a user selects a color scheme |
+
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/ja/twenty-ui/input/icon-picker.mdx
index 5f10a5caff..59d269242e 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/input/icon-picker.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/input/icon-picker.mdx
@@ -1,16 +1,16 @@
---
-title: アイコンピッカー
+title: Icon Picker
image: /images/user-guide/github/github-header.png
---
-
+
-ドロップダウンベースのアイコンピッカーで、ユーザーがリストからアイコンを選択できます。
+A dropdown-based icon picker that allows users to select an icon from a list.
-
+
```jsx
import { RecoilRoot } from "recoil";
import React, { useState } from "react";
@@ -20,7 +20,7 @@ image: /images/user-guide/github/github-header.png
const [selectedIcon, setSelectedIcon] = useState("");
const handleIconChange = ({ iconKey, Icon }) => {
- console.log("選択されたアイコン:", iconKey);
+ console.log("Selected Icon:", iconKey);
setSelectedIcon(iconKey);
};
@@ -38,15 +38,15 @@ image: /images/user-guide/github/github-header.png
```
-
- | プロパティ | タイプ | 説明 |
- | --------------- | ------ | ------------------------------------------------------------------------------ |
- | 無効 | ブール型 | `true` に設定されるとアイコンピッカーは無効になります |
- | onChange | 関数 | ユーザーがアイコンを選択したときにトリガーされるコールバック関数。 それは `iconKey` と `Icon` プロパティを持つオブジェクトを受け取ります |
- | selectedIconKey | string | 最初に選択されたアイコンのキー |
- | onClickOutside | 関数 | ユーザーがドロップダウン外をクリックしたときにトリガーされるコールバック関数 |
- | onClose | 関数 | ドロップダウンが閉じられたときにトリガーされるコールバック関数 |
- | onOpen | 関数 | ドロップダウンが開かれたときにトリガーされるコールバック関数 |
- | バリアント | string | クリック可能なアイコンのビジュアルスタイルバリアント。 オプションには `primary`、 `secondary`、 `tertiary` が含まれます |
+
+ | Props | Type | Description |
+ | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------- |
+ | disabled | boolean | Disables the icon picker if set to `true` |
+ | onChange | function | The callback function triggered when the user selects an icon. It receives an object with `iconKey` and `Icon` properties |
+ | selectedIconKey | string | The key of the initially selected icon |
+ | onClickOutside | function | Callback function triggered when the user clicks outside the dropdown |
+ | onClose | function | Callback function triggered when the dropdown is closed |
+ | onOpen | function | Callback function triggered when the dropdown is opened |
+ | variant | string | The visual style variant of the clickable icon. Options include: `primary`, `secondary`, and `tertiary` |
diff --git a/packages/twenty-docs/l/ja/twenty-ui/input/image-input.mdx b/packages/twenty-docs/l/ja/twenty-ui/input/image-input.mdx
new file mode 100644
index 0000000000..0d563d7c37
--- /dev/null
+++ b/packages/twenty-docs/l/ja/twenty-ui/input/image-input.mdx
@@ -0,0 +1,34 @@
+---
+title: Image Input
+image: /images/user-guide/objects/objects.png
+---
+
+
+
+
+
+Allows users to upload and remove an image.
+
+
+
+ ```jsx
+ import { ImageInput } from "@/ui/input/components/ImageInput";
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------ | -------- | ------------------------------------------------------------------------------------------------- |
+ | picture | string | The image source URL |
+ | onUpload | function | The function called when a user uploads a new image. It receives the `File` object as a parameter |
+ | onRemove | function | The function called when the user clicks on the remove button |
+ | onAbort | function | The function called when a user clicks on the abort button during image upload |
+ | isUploading | boolean | Indicates whether an image is currently being uploaded |
+ | errorMessage | string | An optional error message to display below the image input |
+ | disabled | boolean | If `true`, the entire input is disabled, and the buttons are not clickable |
+
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/input/radio.mdx b/packages/twenty-docs/l/ja/twenty-ui/input/radio.mdx
new file mode 100644
index 0000000000..e6246e631f
--- /dev/null
+++ b/packages/twenty-docs/l/ja/twenty-ui/input/radio.mdx
@@ -0,0 +1,97 @@
+---
+title: Radio
+image: /images/user-guide/create-workspace/workspace-cover.png
+---
+
+
+
+
+
+Used when users may only choose one option from a series of options.
+
+
+
+ ```jsx
+ import { Radio } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+
+ const handleRadioChange = (event) => {
+ console.log("Radio button changed:", event.target.checked);
+ };
+
+ const handleCheckedChange = (checked) => {
+ console.log("Checked state changed:", checked);
+ };
+
+
+ return (
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------------- | ---------------------- | ------------------------------------------------------------------------------------------------ |
+ | style | `React.CSS` properties | Additional inline styles for the component |
+ | className | string | Optional CSS class for additional styling |
+ | checked | boolean | Indicates whether the radio button is checked |
+ | value | string | The label or text associated with the radio button |
+ | onChange | function | The function called when the selected radio button is changed |
+ | onCheckedChange | function | The function called when the `checked` state of the radio button changes |
+ | size | string | The size of the radio button. Options include: `large` and `small` |
+ | disabled | boolean | If `true`, the radio button is disabled and not clickable |
+ | labelPosition | string | The position of the label text relative to the radio button. Has two options: `left` and `right` |
+
+
+
+## Radio Group
+
+Groups together related radio buttons.
+
+
+
+ ```jsx
+ import React, { useState } from "react";
+ import { Radio, RadioGroup } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+
+ const [selectedValue, setSelectedValue] = useState("Option 1");
+
+ const handleChange = (event) => {
+ setSelectedValue(event.target.value);
+ };
+
+ return (
+
+
+
+
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------- | ----------------- | ---------------------------------------------------------------------------------- |
+ | value | string | The value of the currently selected radio button |
+ | onChange | function | The callback function triggered when the radio button is changed |
+ | onValueChange | function | The callback function triggered when the selected value in the group changes. |
+ | children | `React.ReactNode` | Allows you to pass React components (such as Radio) as children to the Radio Group |
+
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/input/select.mdx b/packages/twenty-docs/l/ja/twenty-ui/input/select.mdx
new file mode 100644
index 0000000000..d685bf4012
--- /dev/null
+++ b/packages/twenty-docs/l/ja/twenty-ui/input/select.mdx
@@ -0,0 +1,51 @@
+---
+title: Select
+image: /images/user-guide/what-is-twenty/20.png
+---
+
+
+
+
+
+Allows users to pick a value from a list of predefined options.
+
+
+
+ ```jsx
+ import { RecoilRoot } from 'recoil';
+ import { IconTwentyStar } from 'twenty-ui/display';
+
+ import { Select } from '@/ui/input/components/Select';
+
+ export const MyComponent = () => {
+
+ return (
+
+
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional CSS class for additional styling |
+ | disabled | boolean | When set to `true`, disables user interaction with the component |
+ | label | string | The label to describe the purpose of the `Select` component |
+ | onChange | function | The function called when the selected values change |
+ | options | array | Represents the options available for the `Selected` component. It's an array of objects where each object has a `value` (the unique identifier), `label` (the unique identifier), and an optional `Icon` |
+ | value | string | Represents the currently selected value. It should match one of the `value` properties in the `options` array |
+
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/input/text.mdx b/packages/twenty-docs/l/ja/twenty-ui/input/text.mdx
new file mode 100644
index 0000000000..8cad1352ae
--- /dev/null
+++ b/packages/twenty-docs/l/ja/twenty-ui/input/text.mdx
@@ -0,0 +1,137 @@
+---
+title: Text
+image: /images/user-guide/notes/notes_header.png
+---
+
+
+
+
+
+## Text Input
+
+Allows users to enter and edit text.
+
+
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import { TextInput } from "@/ui/input/components/TextInput";
+
+ export const MyComponent = () => {
+ const handleChange = (text) => {
+ console.log("Input changed:", text);
+ };
+
+ const handleKeyDown = (event) => {
+ console.log("Key pressed:", event.key);
+ };
+
+ return (
+
+
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | label | string | Represents the label for the input |
+ | onChange | function | The function called when the input value changes |
+ | fullWidth | boolean | Indicates whether the input should take up 100% of the width |
+ | disableHotkeys | boolean | Indicates whether hotkeys are enabled for the input |
+ | error | string | Represents the error message to be displayed. When provided, it also adds an icon error on the right side of the input |
+ | onKeyDown | function | Called when a key is pressed down while the input field is focused. Receives a `React.KeyboardEvent` as an argument |
+ | RightIcon | IconComponent | An optional icon component displayed on the right side of the input |
+
+ The component also accepts other HTML input element props.
+
+
+
+## Autosize Text Input
+
+Text input component that automatically adjusts its height based on the content.
+
+
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import { AutosizeTextInput } from "@/ui/input/components/AutosizeTextInput";
+
+ export const MyComponent = () => {
+ return (
+
+ console.log("onValidate function fired")}
+ minRows={1}
+ placeholder="Write a comment"
+ onFocus={() => console.log("onFocus function fired")}
+ variant="icon"
+ buttonTitle
+ value="Task: "
+ />
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | -------- | --------------------------------------------------------------------------- |
+ | onValidate | function | The callback function you want to trigger when the user validates the input |
+ | minRows | number | The minimum number of rows for the text area |
+ | placeholder | string | The placeholder text you want to display when the text area is empty |
+ | onFocus | function | The callback function you want to trigger when the text area gains focus |
+ | variant | string | The variant of the input. Options include: `default`, `icon`, and `button` |
+ | buttonTitle | string | The title for the button (only applicable for the button variant) |
+ | value | string | The initial value for the text area |
+
+
+
+## Text Area
+
+Allows you to create multi-line text inputs.
+
+
+
+ ```jsx
+ import { TextArea } from "@/ui/input/components/TextArea";
+
+ export const MyComponent = () => {
+ return (
+
+
+
+ | Props | Type | Description |
+ | ----------- | -------- | -------------------------------------------------------------- |
+ | disabled | boolean | Indicates whether the text area is disabled |
+ | minRows | number | Minimum number of visible rows for the text area. |
+ | onChange | function | Callback function triggered when the text area content changes |
+ | placeholder | string | Placeholder text displayed when the text area is empty |
+ | value | string | The current value of the text area |
+
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/input/toggle.mdx b/packages/twenty-docs/l/ja/twenty-ui/input/toggle.mdx
new file mode 100644
index 0000000000..39f1645abd
--- /dev/null
+++ b/packages/twenty-docs/l/ja/twenty-ui/input/toggle.mdx
@@ -0,0 +1,36 @@
+---
+title: Toggle
+image: /images/user-guide/table-views/table.png
+---
+
+
+
+
+
+
+
+ ```jsx
+ import { Toggle } from "twenty-ui/input";
+
+ export const MyComponent = () => {
+ return (
+ console.log('On Change event')}
+ color="green"
+ toggleSize = "medium"
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ---------- | -------- | ------------------------------------------------------------------------------------------- | ------------ |
+ | value | boolean | The current state of the toggle | `false` |
+ | onChange | function | Callback function triggered when the toggle state changes | |
+ | color | string | Color of the toggle when it\ | s blue color |
+ | toggleSize | string | Size of the toggle, affecting both height and weight. Has two options: `small` and `medium` | medium |
+
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/introduction.mdx b/packages/twenty-docs/l/ja/twenty-ui/introduction.mdx
new file mode 100644
index 0000000000..88bad64156
--- /dev/null
+++ b/packages/twenty-docs/l/ja/twenty-ui/introduction.mdx
@@ -0,0 +1,30 @@
+---
+title: Overview
+description: Component library for Twenty CRM
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+## Components
+
+
+
+ Display
+ Display components for showing information visually
+
+
+
+ Feedback
+ Feedback components for user notifications
+
+
+
+ Input
+ Input components for user interaction
+
+
+
+ Navigation
+ Navigation components for user interface
+
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/navigation.mdx b/packages/twenty-docs/l/ja/twenty-ui/navigation.mdx
index b51d35678b..b17dad4220 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/navigation.mdx
@@ -1,8 +1,8 @@
---
-title: ナビゲーション
-image: '""'
+title: Navigation
+image: /images/user-guide/tasks/tasks_header.png
---
-
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/ja/twenty-ui/navigation/breadcrumb.mdx
index 470155fd39..aadbee8ee4 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/navigation/breadcrumb.mdx
@@ -1,26 +1,26 @@
---
-title: ブレッドクラム
+title: Breadcrumb
image: /images/user-guide/fields/field.png
---
-
+
-ブレッドクラムナビゲーションバーをレンダリングします。
+Renders a breadcrumb navigation bar.
-
+
```jsx
import { BrowserRouter } from "react-router-dom";
import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
export const MyComponent = () => {
const breadcrumbLinks = [
- { children: "ホーム", href: "/" },
- { children: "カテゴリ", href: "/category" },
- { children: "サブカテゴリ", href: "/category/subcategory" },
- { children: "現在のページ" },
+ { children: "Home", href: "/" },
+ { children: "Category", href: "/category" },
+ { children: "Subcategory", href: "/category/subcategory" },
+ { children: "Current Page" },
];
return (
@@ -32,10 +32,10 @@ image: /images/user-guide/fields/field.png
```
-
- | プロパティ | タイプ | 説明 |
- | --------- | ------ | --------------------------------------------------------------------------------------------------------------------- |
- | className | string | 追加のスタイリングのためのオプションクラス名 |
- | リンク | 配列 | 各オブジェクトはブレッドクラムリンクを表します。 各オブジェクトには `children` プロパティ(リンクのテキストコンテンツ)とオプションの `href` プロパティ(リンクをクリックしたときに移動するURL)が含まれています。 |
+
+ | Props | Type | Description |
+ | --------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional class name for additional styling |
+ | links | array | An array of objects, each representing a breadcrumb link. Each object has a `children` property (the text content of the link) and an optional `href` property (the URL to navigate to when the link is clicked) |
diff --git a/packages/twenty-docs/l/ja/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/ja/twenty-ui/navigation/links.mdx
index 0a2f28664d..e9f7e3d80f 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/navigation/links.mdx
@@ -1,18 +1,18 @@
---
-title: リンク
+title: Links
image: /images/user-guide/what-is-twenty/20.png
---
-
+
-## 連絡先リンク
+## Contact Link
-連絡先情報を表示するためのスタイライズされたリンクコンポーネントです。
+A stylized link component for displaying contact information.
-
+
```jsx
import { BrowserRouter as Router } from 'react-router-dom';
@@ -20,7 +20,7 @@ image: /images/user-guide/what-is-twenty/20.png
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log('連絡先リンクがクリックされました!', event);
+ console.log('Contact link clicked!', event);
};
return (
@@ -38,71 +38,72 @@ image: /images/user-guide/what-is-twenty/20.png
```
-
- | プロパティ | タイプ | 説明 |
- | --------- | ----------------- | ---------------------------- |
- | className | string | 追加のスタイリングのためのオプション名 |
- | href | string | リンクのターゲットURLまたはパス |
- | onClick | function | リンクがクリックされた際にトリガーされるコールバック関数 |
- | children | `React.ReactNode` | リンク内に表示されるコンテンツ |
+
+ | Props | Type | Description |
+ | --------- | ----------------- | ---------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | href | string | The target URL or path for the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
-## 生リンク
+## Raw Link
-リンクを表示するためのスタイライズされたリンクコンポーネントです。
+A stylized link component for displaying links.
-
+
```jsx
import { RawLink } from "/navigation";
import { BrowserRouter as Router } from "react-router-dom";
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log("連絡先リンクがクリックされました!", event);
+ console.log("Contact link clicked!", event);
};
return (
- お問い合わせ
+ Contact Us
);
};
+
```
-
- | プロパティ | タイプ | 説明 |
- | --------- | ----------------- | ---------------------------- |
- | className | string | 追加のスタイリングのためのオプション名 |
- | href | string | リンクのターゲットURLまたはパス |
- | onClick | 機能 | リンクがクリックされた際にトリガーされるコールバック関数 |
- | children | `React.ReactNode` | リンク内に表示されるコンテンツ |
+
+ | Props | Type | Description |
+ | --------- | ----------------- | ---------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | href | string | The target URL or path for the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
-## 丸リンク
+## Rounded Link
-リンクのためのチップコンポーネントを備えた丸いスタイルのリンクです。
+A rounded-styled link with a Chip component for links.
-
+
```jsx
import { RoundedLink } from "/navigation";
import { BrowserRouter as Router } from "react-router-dom";
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log("連絡先リンクがクリックされました!", event);
+ console.log("Contact link clicked!", event);
};
return (
- お問い合わせ
+ Contact Us
);
@@ -110,21 +111,21 @@ image: /images/user-guide/what-is-twenty/20.png
```
-
- | プロパティ | タイプ | 説明 |
- | -------- | ----------------- | ---------------------------- |
- | href | string | リンクのターゲットURLまたはパス |
- | children | `React.ReactNode` | リンク内に表示されるコンテンツ |
- | onClick | 機能 | リンクがクリックされた際にトリガーされるコールバック関数 |
+
+ | Props | Type | Description |
+ | -------- | ----------------- | ---------------------------------------------------------- |
+ | href | string | The target URL or path for the link |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
-## ソーシャルリンク
+## Social Link
-URL、LinkedIn、X(またはTwitter)など、さまざまなソーシャルリンクタイプに対応したスタイライズされたソーシャルリンクです。
+Stylized social links, with support for various social link types, such as URLs, LinkedIn, and X (or Twitter).
-
+
```jsx
import { SocialLink } from "twenty-ui/navigation";
import { BrowserRouter as Router } from "react-router-dom";
@@ -142,12 +143,12 @@ URL、LinkedIn、X(またはTwitter)など、さまざまなソーシャルリ
```
-
- | プロパティ | タイプ | 説明 |
- | -------- | ----------------- | ------------------------------------------------------- |
- | href | string | リンクのターゲットURLまたはパス |
- | children | `React.ReactNode` | リンク内に表示されるコンテンツ |
- | タイプ | string | ソーシャルリンクの種類です。 オプションには、`url`、`LinkedIn`、`Twitter`があります。 |
- | onClick | function | リンクがクリックされた際にトリガーされるコールバック関数 |
+
+ | Props | Type | Description |
+ | -------- | ----------------- | --------------------------------------------------------------------------- |
+ | href | string | The target URL or path for the link |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
+ | type | string | The type of social links. Options include: `url`, `LinkedIn`, and `Twitter` |
+ | onClick | function | Callback function to be triggered when the link is clicked |
diff --git a/packages/twenty-docs/l/ja/twenty-ui/navigation/menu-item.mdx b/packages/twenty-docs/l/ja/twenty-ui/navigation/menu-item.mdx
new file mode 100644
index 0000000000..209c6270ea
--- /dev/null
+++ b/packages/twenty-docs/l/ja/twenty-ui/navigation/menu-item.mdx
@@ -0,0 +1,428 @@
+---
+title: Menu Item
+image: /images/user-guide/kanban-views/kanban.png
+---
+
+
+
+
+
+A versatile menu item designed to be used in a menu or navigation list.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { IconAlertCircle } from "@tabler/icons-react";
+ import { MenuItem } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleMenuItemClick = (event) => {
+ console.log("Menu item clicked!", event);
+ };
+
+ const handleButtonClick = (event) => {
+ console.log("Icon button clicked!", event);
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------- | ------------- | ---------------------------------------------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | accent | string | Specifies the accent color of the menu item. Options include: `default`, `danger`, and `placeholder` |
+ | text | string | The text content of the menu item |
+ | iconButtons | array | An array of objects representing additional icon buttons associated with the menu item |
+ | isTooltipOpen | boolean | Controls the visibility of the tooltip associated with the menu item |
+ | testId | string | The data-testid attribute for testing purposes |
+ | onClick | function | Callback function triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+## Variants
+
+The different variants of the menu item component include the following:
+
+### Command
+
+A command-style menu item within a menu to indicate keyboard shortcuts.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemCommand } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleCommandClick = () => {
+ console.log("Command clicked!");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------ | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | firstHotKey | string | The first keyboard shortcut associated with the command |
+ | secondHotKey | string | The second keyboard shortcut associated with the command |
+ | isSelected | boolean | Indicates whether the menu item is selected or highlighted |
+ | onClick | function | Callback function triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Draggable
+
+A draggable menu item component designed to be used in a menu or list where items can be dragged, and additional actions can be performed through icon buttons.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { IconAlertCircle } from "@tabler/icons-react";
+ import { MenuItemDraggable } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleMenuItemClick = (event) => {
+ console.log("Menu item clicked!", event);
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ------------------------------------------------------------------------------------------ |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | accent | string | The accent color of the menu item. It can either be `default`, `placeholder`, and `danger` |
+ | iconButtons | array | An array of objects representing additional icon buttons associated with the menu item |
+ | isTooltipOpen | boolean | Controls the visibility of the tooltip associated with the menu item |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | text | string | The text content of the menu item |
+ | isDragDisabled | boolean | Indicates whether dragging is disabled |
+ | className | string | Optional name for additional styling |
+
+
+
+### Multi Select
+
+Provides a way to implement multi-select functionality with an associated checkbox.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemMultiSelect } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | onSelectChange | function | Callback function triggered when the checkbox state changes |
+ | className | string | Optional name for additional styling |
+
+
+
+### Multi Select Avatar
+
+A multi-select menu item with an avatar, a checkbox for selection, and textual content.
+
+
+
+ ```jsx
+ import { MenuItemMultiSelectAvatar } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const imageUrl =
+ "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
+
+ return (
+ }
+ text="First Option"
+ selected={false}
+ className
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ----------- | -------------------------------------------------------------------- |
+ | avatar | `ReactNode` | The avatar or icon to be displayed on the left side of the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | onSelectChange | function | Callback function triggered when the checkbox state changes |
+ | className | string | Optional name for additional styling |
+
+
+
+### Navigate
+
+A menu item featuring an optional left icon, textual content, and a right-chevron icon.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemNavigate } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleNavigation = () => {
+ console.log("Navigate to another page");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Select
+
+A selectable menu item, featuring optional left content (icon and text) and an indicator (check icon) for the selected state.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemSelect } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Select Avatar
+
+A selectable menu item with an avatar, featuring optional left content (avatar and text) and an indicator (check icon) for the selected state.
+
+
+
+ ```jsx
+ import { MenuItemSelectAvatar } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const imageUrl =
+ "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
+
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
+
+ return (
+ }
+ text="First Option"
+ selected={true}
+ disabled={false}
+ hovered={false}
+ testId="menu-item-test"
+ onClick={handleSelection}
+ className
+ />
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ----------- | -------------------------------------------------------------------- |
+ | avatar | `ReactNode` | The avatar or icon to be displayed on the left side of the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | testId | string | The data-testid attribute for testing purposes |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Select Color
+
+A selectable menu item with a color sample for scenarios where you want users to choose a color from a menu.
+
+
+
+ ```jsx
+ import { MenuItemSelectColor } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | color | string | The theme color to be displayed as a sample in the menu item. Options include: `green`, `turquoise`, `sky`, `blue`, `purple`, `pink`, `red`, `orange`, `yellow`, and `gray` |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | variant | string | The variant of the color sample. It can either be `default` or `pipeline` |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Toggle
+
+A menu item with an associated toggle switch to allow users to enable or disable a specific feature
+
+
+
+ ```jsx
+ import { IconBell } from '@tabler/icons-react';
+
+ import { MenuItemToggle } from 'twenty-ui/display';
+
+ export const MyComponent = () => {
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ----------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | toggled | boolean | Indicates whether the toggle switch is in the "on" or "off" state |
+ | onToggleChange | function | Callback function triggered when the toggle switch state changes |
+ | toggleSize | string | The size of the toggle switch. It can be either \ |
+ | className | string | Optional name for additional styling |
+
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/ja/twenty-ui/navigation/navigation-bar.mdx
index 6224e67904..a77e9f34e6 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/navigation/navigation-bar.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/navigation/navigation-bar.mdx
@@ -1,16 +1,16 @@
---
-title: ナビゲーションバー
+title: Navigation Bar
image: /images/user-guide/table-views/table.png
---
-
+
-複数の`NavigationBarItem`コンポーネントを含むナビゲーションバーをレンダリングします。
+Renders a navigation bar that contains multiple `NavigationBarItem` components.
-
+
```jsx
import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
@@ -19,31 +19,31 @@ image: /images/user-guide/table-views/table.png
const navigationItems = [
{
- name: "ホーム",
+ name: "Home",
Icon: IconHome,
- onClick: () => console.log("ホームがクリックされました"),
+ onClick: () => console.log("Home clicked"),
},
{
- name: "プロフィール",
+ name: "Profile",
Icon: IconUser,
- onClick: () => console.log("プロフィールがクリックされました"),
+ onClick: () => console.log("Profile clicked"),
},
{
- name: "設定",
+ name: "Settings",
Icon: IconSettings,
- onClick: () => console.log("設定がクリックされました"),
+ onClick: () => console.log("Settings clicked"),
},
];
- return ;
+ return ;
};
```
-
- | プロパティ | タイプ | 説明 |
- | -------------- | ------ | ------------------------------------------------------------------------------------------------------------------- |
- | activeItemName | string | 現在アクティブなナビゲーション項目の名前 |
- | アイテム | 配列 | 各ナビゲーションアイテムを表すオブジェクトの配列。 各オブジェクトには、アイテムの `name`、表示する `Icon` コンポーネント、およびアイテムがクリックされたときに呼び出される `onClick` 関数が含まれています。 |
+
+ | Props | Type | Description |
+ | -------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | activeItemName | string | The name of the currently active navigation item |
+ | items | array | An array of objects representing each navigation item. Each object contains the `name` of the item, the `Icon` component to display, and an `onClick` function to be called when the item is clicked |
diff --git a/packages/twenty-docs/l/ja/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/ja/twenty-ui/navigation/step-bar.mdx
index 335fa2fab1..66c420f561 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/navigation/step-bar.mdx
@@ -1,16 +1,16 @@
---
-title: ステップバー
+title: Step Bar
image: /images/user-guide/api/api.png
---
-
+
-アクティブなステップをハイライトして、一連の番号付きステップの進行状況を表示します。 各 `Step` コンポーネントによって表されるステップを含むコンテナをレンダリングします。 各 `Step` コンポーネントによって表されるステップを含むコンテナをレンダリングします。 アクティブなステップをハイライトして、一連の番号付きステップの進行状況を表示します。 各 `Step` コンポーネントによって表されるステップを含むコンテナをレンダリングします。 各 `Step` コンポーネントによって表されるステップを含むコンテナをレンダリングします。 各 `Step` コンポーネントによって表されるステップを含むコンテナをレンダリングします。
+Displays progress through a sequence of numbered steps by highlighting the active step. It renders a container with steps, each represented by the `Step` component.
-
+
```jsx
import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
@@ -26,9 +26,9 @@ image: /images/user-guide/api/api.png
```
-
- | プロパティ | タイプ | 説明 |
- | --------- | --- | ----------------------------------------------------- |
- | アクティブステップ | 数 | 現在アクティブなステップのインデックス。 これにより、どのステップを視覚的にハイライトするかが決まります。 |
+
+ | Props | Type | Description |
+ | ---------- | ------ | ------------------------------------------------------------------------------------------------- |
+ | activeStep | number | The index of the currently active step. This determines which step should be visually highlighted |
diff --git a/packages/twenty-docs/l/ja/twenty-ui/progress-bar.mdx b/packages/twenty-docs/l/ja/twenty-ui/progress-bar.mdx
new file mode 100644
index 0000000000..2e4735ab30
--- /dev/null
+++ b/packages/twenty-docs/l/ja/twenty-ui/progress-bar.mdx
@@ -0,0 +1,66 @@
+---
+title: Feedback
+image: /images/user-guide/emails/emails_header.png
+---
+
+
+
+
+
+Indicates progress or countdown and moves from right to left.
+
+
+
+ ```jsx
+ import { ProgressBar } from "twenty-ui/feedback";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | --------- | ------- | ------------------------------------------------------------------------------------ | --------- |
+ | duration | number | The total duration of the progress bar animation in milliseconds | 3 |
+ | delay | number | The delay in starting the progress bar animation in milliseconds | 0 |
+ | easing | string | Easing function for the progress bar animation | easeInOut |
+ | barHeight | number | The height of the bar in pixels | 24 |
+ | barColor | string | The color of the bar | gray80 |
+ | autoStart | boolean | If `true`, the progress bar animation starts automatically when the component mounts | `true` |
+
+
+
+## Circular Progress Bar
+
+Indicates the progress of a task, often used in loading screens or areas where you want to communicate ongoing processes to the user.
+
+
+
+ ```jsx
+ import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | -------- | ------ | ------------------------------------- | ------------ |
+ | size | number | The size of the circular progress bar | 50 |
+ | barWidth | number | The width of the progress bar line | 5 |
+ | barColor | string | The color of the progress bar | currentColor |
+
+
diff --git a/packages/twenty-docs/l/ja/user-guide/ai/capabilities/ai-agents.mdx b/packages/twenty-docs/l/ja/user-guide/ai/capabilities/ai-agents.mdx
new file mode 100644
index 0000000000..18a4cd90bc
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/ai/capabilities/ai-agents.mdx
@@ -0,0 +1,34 @@
+---
+title: AI Agents
+description: Integrate AI capabilities directly into your automation workflows.
+---
+
+
+ This feature is in development and will be available in beta soon.
+
+
+## Overview
+
+Integrate AI capabilities directly into your automation workflows for intelligent data processing and decision-making.
+
+## Capabilities
+
+| Feature | Description |
+| ------------------- | ------------------------------------------------ |
+| **AI actions** | Add AI-powered steps to any workflow |
+| **Data enrichment** | Automatically enhance records with external data |
+| **Classification** | Categorize records based on content analysis |
+| **Summarization** | Generate summaries from text fields |
+| **Custom prompts** | Define exactly how AI processes your data |
+
+## Use Cases
+
+* **Lead scoring**: Automatically score and prioritize inbound leads
+* **Data cleanup**: Standardize company names and contact information
+* **Email drafts**: Generate follow-up emails based on meeting notes
+* **Record routing**: Assign records to the right team member based on content
+
+## Related
+
+* [Workflows Overview](/l/ja/user-guide/workflows/overview) — automation basics
+* [AI Permissions](/l/ja/user-guide/ai/capabilities/permissions-access-control) — access control for AI agents
diff --git a/packages/twenty-docs/l/ja/user-guide/ai/capabilities/ai-chatbot.mdx b/packages/twenty-docs/l/ja/user-guide/ai/capabilities/ai-chatbot.mdx
new file mode 100644
index 0000000000..d7cbbc04fc
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/ai/capabilities/ai-chatbot.mdx
@@ -0,0 +1,41 @@
+---
+title: AI Chatbot
+description: An intelligent assistant that helps you interact with your CRM data using natural language.
+---
+
+
+ This feature is in development and will be available in beta soon.
+
+
+## Overview
+
+An intelligent assistant that helps you interact with your CRM data using natural language.
+
+## Capabilities
+
+| Feature | Description |
+| ---------------------------- | ------------------------------------------------------------------------- |
+| **Natural language queries** | Ask questions in plain English instead of building filters |
+| **Full data access** | Query records, relationships, and metrics across your workspace |
+| **Page context** | Reference "this company" or "this opportunity" based on your current view |
+| **Conversational** | Follow-up questions maintain context from previous queries |
+
+## Example Interactions
+
+### Finding Records
+
+* "Show me all opportunities over $50,000"
+* "Find contacts I haven't emailed in 2 weeks"
+* "List companies in the healthcare industry"
+
+### Getting Insights
+
+* "What's my total pipeline value?"
+* "How many deals closed last month?"
+* "Which stage has the most stuck opportunities?"
+
+### Using Page Context
+
+* "Summarize my interactions with this person" (on a contact page)
+* "What opportunities are linked to this company?" (on a company page)
+* "When was this deal last updated?" (on an opportunity page)
diff --git a/packages/twenty-docs/l/ja/user-guide/ai/capabilities/permissions-access-control.mdx b/packages/twenty-docs/l/ja/user-guide/ai/capabilities/permissions-access-control.mdx
new file mode 100644
index 0000000000..ebbfb1d9c7
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/ai/capabilities/permissions-access-control.mdx
@@ -0,0 +1,35 @@
+---
+title: Permissions & Access Control
+description: Control what AI agents can access and modify in your workspace.
+---
+
+## Overview
+
+AI agents respect your existing permission structure. This is particularly important for teams who want to control exactly what automated AI processes can access or modify in their workspace.
+
+## Assign a Role to an AI Agent
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **AI Agents**, click **+ Assign to AI agent**
+5. Select the AI agent from the list
+6. Confirm the assignment
+
+## Why Assign Roles to AI Agents?
+
+| Benefit | Description |
+| ---------------- | ------------------------------------------------- |
+| **Security** | Limit what data AI agents can access or modify |
+| **Compliance** | Ensure AI only processes the data it needs |
+| **Control** | Prevent unintended actions from AI automations |
+| **Auditability** | Track which actions were performed by which agent |
+
+
+ For AI agents running within workflows, role assignment ensures the agent cannot access or modify data outside its intended scope—even if the workflow has broader permissions.
+
+
+## Related
+
+* [Permissions](/l/ja/user-guide/permissions-access/capabilities/permissions) — detailed information on creating and managing roles
+* [AI Agents](/l/ja/user-guide/ai/capabilities/ai-agents) — AI capabilities in workflows
diff --git a/packages/twenty-docs/l/ja/user-guide/ai/how-tos/ai-faq.mdx b/packages/twenty-docs/l/ja/user-guide/ai/how-tos/ai-faq.mdx
new file mode 100644
index 0000000000..774eae15c4
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/ai/how-tos/ai-faq.mdx
@@ -0,0 +1,29 @@
+---
+title: AI FAQ
+description: Frequently asked questions about AI features in Twenty.
+---
+
+
+
+ AI features are currently in development and will be released in beta soon. Stay tuned for updates!
+
+
+
+ We're building two main AI capabilities:
+
+ 1. **AI Chatbot**: A context-aware assistant that can access your Twenty data and help you with queries
+ 2. **AI Agents in Workflows**: Intelligent automation that can process data, make decisions, and execute tasks within your workflows
+
+
+
+ AI agents will operate under the permission system. You can assign specific roles to AI agents under **Settings → Roles**, giving you full control over what data they can access and what actions they can perform.
+
+
+
+ AI actions will consume workflow credits based on the complexity of the task and the AI model used. More details will be available when the features launch.
+
+
+
+ Initially, Twenty will use built-in AI models. Support for custom or external AI models may be added in future releases based on user feedback.
+
+
diff --git a/packages/twenty-docs/l/ja/user-guide/ai/overview.mdx b/packages/twenty-docs/l/ja/user-guide/ai/overview.mdx
new file mode 100644
index 0000000000..bd4ee68a79
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/ai/overview.mdx
@@ -0,0 +1,62 @@
+---
+title: AI
+description: AI-powered features coming soon to Twenty.
+---
+
+
+
+
+
+## What's Coming
+
+Twenty is building AI capabilities to help your team work smarter. We're focusing on two major areas:
+
+### 1. AI Chatbot
+
+A conversational assistant that understands your context and has access to all your Twenty data.
+
+**Key capabilities:**
+
+* **Full data access**: Query any record, relationship, or metric in your workspace
+* **Page context awareness**: Reference "this company" or "this opportunity" based on where you are in Twenty
+* **Natural language**: Ask questions and get answers without navigating menus
+
+**Example prompts:**
+
+* "What opportunities are closing this month?"
+* "Which deals have been in Negotiation for more than 30 days?"
+* "Summarize my interactions with this person"
+
+### 2. AI Agents in Workflows
+
+Extend your workflows with AI-powered actions and autonomous agents.
+
+**Key capabilities:**
+
+* **AI actions**: Use AI to enrich data, classify records, generate summaries, and more
+* **Autonomous agents**: Let agents execute multi-step tasks within a workflow
+* **Custom prompts**: Define exactly how AI should process your data
+
+**Use cases:**
+
+* Automatically categorize inbound leads
+* Enrich company data from public sources
+* Generate follow-up email drafts based on meeting notes
+* Score opportunities based on engagement patterns
+
+## Permissions and Access Control
+
+AI agents will be managed through the existing permissions system:
+
+1. Go to **Settings → Roles**
+2. Configure which data each AI agent can access
+3. Set read/write permissions per object
+
+This ensures AI agents respect your data governance policies and only access what they need.
+
+## Stay Updated
+
+We'll update this section as AI features become available. In the meantime:
+
+* Follow our [GitHub](https://github.com/twentyhq/twenty) for development updates
+* Join our [Discord](https://discord.gg/twenty) to share feedback and feature requests
diff --git a/packages/twenty-docs/l/ja/user-guide/billing/capabilities/pricing-plans.mdx b/packages/twenty-docs/l/ja/user-guide/billing/capabilities/pricing-plans.mdx
new file mode 100644
index 0000000000..90bf7e7cbb
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/billing/capabilities/pricing-plans.mdx
@@ -0,0 +1,79 @@
+---
+title: Pricing Plans
+description: Learn about Twenty's pricing plans and how to switch between them.
+---
+
+## Overview
+
+Twenty offers flexible pricing to fit teams of all sizes, whether you prefer cloud hosting or self-hosting.
+
+## Cloud Plans
+
+### Pro (Cloud)
+
+For teams ready to scale:
+
+* All core CRM features
+* Email and calendar sync
+* Workflows and automations
+* Standard support
+
+
+ Premium features (SSO and row-level permissions) are not included in the Pro plan.
+
+
+### Organization (Cloud)
+
+For larger teams with advanced needs:
+
+* Everything in Pro
+* **Premium features**: SSO integration and row-level permissions
+* Priority support
+
+## Self-Hosted Plans
+
+### Free (Self-Hosted)
+
+Host Twenty on your own infrastructure at no cost:
+
+* All Pro features included
+* Community support via Discord
+* Full control over your data
+
+### Organization (Self-Hosted)
+
+For teams who need premium features while self-hosting:
+
+* All Pro features
+* **Premium features**: SSO integration and row-level permissions
+* Twenty team support
+* No requirement to publish custom code as open-source before distributing
+
+## Premium Features
+
+Premium features are only available on the Organization plans (Cloud or Self-Hosted):
+
+* **SSO integration**: Single Sign-On with your identity provider
+* **Row-level permissions**: Fine-grained access control at the record level
+
+## Switching Plans
+
+### Upgrade to Organization
+
+1. Go to **Settings → Billing**
+2. Click **Switch to Organization**
+3. Confirm your upgrade
+
+### Downgrade to Pro
+
+Contact support to downgrade your plan.
+
+### Switch to Yearly Billing
+
+1. Go to **Settings → Billing**
+2. Click **Switch to Yearly**
+3. Save with annual billing
+
+### Switch to Monthly Billing
+
+Contact support to switch back to monthly billing.
diff --git a/packages/twenty-docs/l/ja/user-guide/billing/capabilities/workflow-credits.mdx b/packages/twenty-docs/l/ja/user-guide/billing/capabilities/workflow-credits.mdx
new file mode 100644
index 0000000000..0ce8e3be72
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/billing/capabilities/workflow-credits.mdx
@@ -0,0 +1,49 @@
+---
+title: Workflow Credits
+description: Understanding workflow credits, consumption, and how to purchase more.
+---
+
+## Overview
+
+Credits power your workflow automations in Twenty. Every workflow action consumes credits based on its complexity.
+
+## Credit Allocation
+
+Credits are based on your billing cycle, not your plan:
+
+| Billing Cycle | Credits |
+| ------------- | --------------- |
+| Monthly | 5 million/month |
+| Yearly | 50 million/year |
+
+
+ The 5 million monthly credits are designed to empower you to run automations without worrying about costs. For most workflows using standard actions, this is more than enough. You'll only need additional credits when running advanced code nodes or AI-powered features.
+
+
+## Credit Consumption
+
+Different actions consume different amounts of credits:
+
+| Action Type | Credit Usage |
+| ------------------------------------------------------- | ----------------------- |
+| **Basic operations** (search, update, create records) | Minimal |
+| **Complex operations** (code nodes, external API calls) | More credits |
+| **AI prompts** (coming soon) | Variable based on usage |
+
+Credits are deducted in real-time when workflows execute.
+
+## Monitoring Usage
+
+Track your credit consumption:
+
+1. Go to **Settings → Billing**
+2. View your current usage and remaining credits
+3. Monitor trends to plan for additional credits if needed
+
+## Purchasing Additional Credits
+
+Need more credits?
+
+1. Go to **Settings → Billing**
+2. Click on the option to purchase additional credit packs
+3. Select the amount you need
diff --git a/packages/twenty-docs/l/ja/user-guide/billing/how-tos/billing-faq.mdx b/packages/twenty-docs/l/ja/user-guide/billing/how-tos/billing-faq.mdx
new file mode 100644
index 0000000000..ee1d560cb1
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/billing/how-tos/billing-faq.mdx
@@ -0,0 +1,86 @@
+---
+title: Billing FAQ
+description: Frequently asked questions about Twenty pricing and billing.
+---
+
+## Pricing
+
+
+
+ Yes, you can use Twenty for free while self-hosting. You will get access to everything included in the Pro (Cloud) plan, except the support from our core-team. Support is accessible via our Discord community.
+
+ If you want to self-host and need the Premium features (SSO and row-level permissions), you can choose the paid Organization (Self-Hosted) license. This also includes support from the Twenty team and removes the requirement to publish custom code as open-source before distributing.
+
+
+
+ Premium features are only available on the Organization plans (Cloud or Self-Hosted):
+
+ * **SSO integration**: Single Sign-On with your identity provider
+ * **Row-level permissions**: Fine-grained access control at the record level
+
+
+
+ We do not offer free seats. Pricing is per user and each user needs a licence to access Twenty.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `Switch to Organization`.
+
+
+
+ Please reach out to our team directly via the Support, there is no easy way to do this using the UI at the moment.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `Switch to Yearly`.
+
+
+
+ Please reach out to our team directly via the Support, there is no easy way to do this using the UI at the moment.
+
+
+
+ You will find this under `Settings → Billing`.
+
+
+
+ The number of credits depends on your billing cycle, not your plan:
+
+ * **Monthly subscriptions**: 5 million credits per month
+ * **Yearly subscriptions**: 50 million credits per year
+
+
+
+ Each workflow action consumes credits based on its complexity:
+
+ * **Basic internal operations** (such as search, update, create records) consume very few credits
+ * **More complex operations** like code nodes and requests to external services consume more credits
+ * **AI prompts** (coming soon!) will also consume more credits based on usage
+
+ Credits are deducted in real-time when workflows execute. You can monitor your usage in **Settings → Billing** to track consumption and remaining credits.
+
+
+
+ You can buy additional credits under `Settings → Billing`.
+
+
+
+## Billing
+
+
+
+ You can do so under `Settings → Billing`.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll be able to add a new payment method there.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll be able to edit the billing information there.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll see all your invoices at the bottom of the screen.
+
+
diff --git a/packages/twenty-docs/l/ja/user-guide/billing/overview.mdx b/packages/twenty-docs/l/ja/user-guide/billing/overview.mdx
new file mode 100644
index 0000000000..767116719c
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/billing/overview.mdx
@@ -0,0 +1,45 @@
+---
+title: Billing
+description: Understand Twenty pricing and manage your subscription.
+image: /images/user-guide/setup/pricing.png
+---
+
+
+
+
+
+Twenty offers flexible pricing plans to fit your team's needs. Manage your subscription, track workflow credits, and access invoices all from **Settings → Billing**.
+
+## What's in this section
+
+
+
+ Learn about Twenty's pricing plans and what's included.
+
+
+
+ Frequently asked questions about pricing and billing.
+
+
+
+## At a glance
+
+| Plan | Key Features |
+| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| **Free (Self-Hosted)** | All Pro features, community support |
+| **Pro (Cloud)** | Everything apart from the Premium features (SSO and row-level permissions), standard support |
+| **Organization (Cloud)** | All from Pro + the Premium features (SSO and row-level permissions), priority support |
+| **Organization (Self-Hosted)** | All from Pro + the Premium features (SSO, row-level permissions), Twenty team support, not required to publish your custom code as open-source before distributing |
+
+## Quick answers
+
+**Where do I manage billing?**
+Go to **Settings → Billing** to view your plan, update payment methods, and access invoices.
+
+**Can I use Twenty for free?**
+Yes! Self-host Twenty and get all Pro features at no cost.
+
+**How do I upgrade?**
+Go to **Settings → Billing** and click **Switch to Organization** or **Switch to Yearly**.
+
+For more questions, see the [Billing FAQ](/l/ja/user-guide/billing/how-tos/billing-faq).
diff --git a/packages/twenty-docs/l/ja/user-guide/calendar-emails/capabilities/calendar.mdx b/packages/twenty-docs/l/ja/user-guide/calendar-emails/capabilities/calendar.mdx
new file mode 100644
index 0000000000..fa774b40a7
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/calendar-emails/capabilities/calendar.mdx
@@ -0,0 +1,43 @@
+---
+title: Calendar
+description: Understanding calendar integration features in Twenty.
+---
+
+**Note**: To connect your calendar and configure sync settings, visit [Email & Calendar Setup](/l/ja/user-guide/calendar-emails/overview).
+
+## How Calendar Integration Works
+
+Twenty automatically syncs your calendar events and links them to the relevant CRM records, giving you a complete view of your meeting history with contacts and companies.
+
+## Calendar Tab
+
+Next to the Emails tab on records, you'll find a `Calendar` tab that contains the history of meetings scheduled with the record.
+
+### Available For
+
+* **People**: View all meetings scheduled with a specific contact
+* **Companies**: See all meetings related to a company and its employees
+* **Opportunities**: Access meeting history related to the company linked to this opportunity
+
+### Viewing Meeting History
+
+1. **Navigate to a Record**: Go to any Person, Company, or Opportunity record
+2. **Select the Calendar Tab**: Click on the `Calendar` tab next to the Emails tab
+3. **Browse Meeting History**: View all scheduled meetings and their details
+4. **Access Meeting Context**: See meeting participants, times, and related information
+
+## Visibility Settings
+
+Calendar data follows the same visibility settings as emails, ensuring consistent privacy controls across both communication channels.
+
+## What Gets Synced
+
+* **External Meetings**: All meetings with contacts outside your organization
+* **Automatic Linking**: Meetings connect to existing People and Company records based on attendee email addresses
+* **Meeting Details**: Subject, time, duration, and participants
+* **Updates**: New calendar events sync automatically
+
+## What Doesn't Get Synced
+
+* **Internal Meetings**: Meetings with only colleagues (same domain) remain private
+* **Private Events**: Events marked as private in your calendar
diff --git a/packages/twenty-docs/l/ja/user-guide/calendar-emails/capabilities/mailbox.mdx b/packages/twenty-docs/l/ja/user-guide/calendar-emails/capabilities/mailbox.mdx
new file mode 100644
index 0000000000..d7bdb8552b
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/calendar-emails/capabilities/mailbox.mdx
@@ -0,0 +1,85 @@
+---
+title: Mailbox
+description: Understanding email integration features in Twenty.
+---
+
+**Note**: To connect your email accounts and configure sync settings, visit [Email & Calendar Setup](/l/ja/user-guide/calendar-emails/overview).
+
+## How Email Integration Works
+
+Twenty automatically links emails from your connected mailboxes to the relevant CRM records, keeping all communication history in one place.
+
+### Objects Where Emails Can Be Found
+
+Email conversations appear in three main objects:
+
+* **People**: View all emails exchanged with a specific contact
+* **Companies**: See all emails related to a company and its employees
+* **Opportunities**: Access email threads related to the company linked to this opportunity. Email threads from individual people on the opportunity are not shown yet.
+
+### Viewing Email Threads
+
+1. **Navigate to a Record**: Go to any Person, Company, or Opportunity record
+2. **Select the Emails Tab**: Click on the `Emails` tab to view synced emails
+3. **Open an Email Thread**: Click on any email to open and read the full conversation
+4. **Browse History**: Scroll through the complete email history with that contact
+
+
+
+## What You'll See
+
+### Email Thread View
+
+When you open an email thread, you can:
+
+* **Read Full Conversations**: See the complete email exchange
+* **View Participants**: See all people involved in the email thread
+* **Check Timestamps**: Know exactly when each email was sent
+* **Access Context**: Understand the full communication history
+
+### Email Visibility
+
+Depending on your mailbox settings, you might see:
+
+* **Full Content**: Complete email text and details
+* **Subject + Metadata**: Subject line, sender, recipient, and timestamp
+* **Metadata Only**: Basic information without email content
+
+## Email Sync Behavior
+
+### What Gets Synced
+
+* **External Emails**: All emails with contacts outside your organization
+* **Automatic Linking**: Emails connect to existing People and Company records
+* **Multiple Addresses**: Emails from any address link to the same contact record
+* **Updates**: New emails appear within 5 minutes
+
+### What Doesn't Get Synced
+
+* **Internal Emails**: Emails between colleagues (same domain) remain private
+* **Group Emails**: Distribution lists and group emails are excluded
+* **Excluded Folders**: Folders you've chosen not to sync (configured under Settings → Accounts → Email)
+
+### Selective Folder Sync (Lab Feature)
+
+Control which email folders sync with Twenty:
+
+1. Enable `Message Folder` in Settings → Releases → Lab
+2. Configure folders under Settings → Accounts → Email
+3. Choose specific folders to include or exclude (Inbox, Sent, Archive, custom folders)
+
+## Troubleshooting Email Sync
+
+### Common Sync Issues
+
+* **Sync Delays**: Emails appear within 5 minutes, but initial imports take longer
+* **Missing Emails**: Check if:
+ * Folders are excluded in Message Folder settings
+ * Contact auto-creation is disabled (emails need existing Twenty records)
+ * Email is from colleagues (same domain) or group lists
+ * Mailbox is still completing initial sync
+
+### Email Limitations
+
+* **System Folders**: Some email folders may not be available for sync
+* **Aliases**: Only true mailboxes can be connected (not email aliases)
diff --git a/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx b/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx
new file mode 100644
index 0000000000..edee83875d
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx
@@ -0,0 +1,28 @@
+---
+title: Can I Book Meetings from Twenty?
+description: Information about booking meetings directly from Twenty.
+---
+
+## Current Status
+
+**No, Twenty does not currently support booking meetings directly from the platform.**
+
+Twenty's calendar integration is designed to **sync and display** your existing calendar events, not to create new ones. All meeting scheduling should be done through your native calendar application (Google Calendar, Microsoft Outlook, etc.).
+
+## What You Can Do
+
+* **View meeting history** on People, Companies, and Opportunities records
+* **See upcoming meetings** with contacts in your CRM
+* **Track meeting context** alongside email communications
+* **Auto-create contacts** from meeting participants
+
+## How to Schedule Meetings
+
+1. Use your native calendar app (Google Calendar, Outlook, etc.)
+2. Create the meeting as you normally would
+3. The meeting will automatically sync to Twenty within 5 minutes
+4. View the meeting on the relevant CRM records
+
+## Future Plans
+
+Meeting creation from within Twenty is on our roadmap. Join our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to share your use case and help prioritize this feature.
diff --git a/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx b/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx
new file mode 100644
index 0000000000..7f731f6e6a
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx
@@ -0,0 +1,44 @@
+---
+title: Can I Send Emails from Twenty?
+description: Information about sending emails directly from Twenty.
+---
+
+## Current Status
+
+Twenty's email integration is designed to **sync and display** your email history. Emails cannot be composed or sent directly from Twenty's interface.
+
+When you view an email thread on a record page and click **Reply**, you'll be redirected to the original thread in your mailbox (Gmail, Outlook, etc.). This is where you compose and send your reply.
+
+## What You Can Do Today
+
+* **View email history** on People, Companies, and Opportunities records
+* **Read full email threads** with contacts in your CRM
+* **Track communication context** alongside calendar events
+* **Auto-create contacts** from email interactions
+* **Reply via redirect** — click Reply to jump to your mailbox
+
+## Sending Emails via Workflows
+
+While you can't send emails manually from Twenty, you **can send emails automatically using Workflows**. This is useful for:
+
+* Automated follow-ups
+* Notifications to contacts
+* Triggered communications based on record changes
+
+Emails sent via workflows go through your connected mailbox account.
+
+→ Learn about the [Send Email action](/l/ja/user-guide/workflows/capabilities/workflow-actions#send-email)
+
+## Email Sequences and Newsletters
+
+For email sequences and newsletters, we recommend using workflows to connect Twenty to a dedicated email marketing tool.
+
+
+ Mass emails should not be sent directly from your mailbox to protect your domain reputation. Use a dedicated tool for bulk communications.
+
+
+→ See [How to send emails from workflows](/l/ja/user-guide/workflows/capabilities/send-emails-from-workflows) for setup instructions
+
+## Future Plans
+
+Native email composition from within Twenty is on our roadmap. Join our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to share your use case and help prioritize this feature.
diff --git a/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx b/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx
new file mode 100644
index 0000000000..de258baef3
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx
@@ -0,0 +1,35 @@
+---
+title: Can I Track Email Activity on All Objects?
+description: Understanding email activity tracking across different objects.
+---
+
+## Supported Objects
+
+Email activity is currently available on **three standard objects**:
+
+| Object | What You See |
+| ----------------- | ---------------------------------------------------------------- |
+| **People** | All emails exchanged with that specific contact |
+| **Companies** | All emails with anyone from that company (based on email domain) |
+| **Opportunities** | Emails related to the company linked to the opportunity |
+
+## Why Only These Objects?
+
+People, Companies, and Opportunities are the core relationship objects where email context adds the most value. Email threads are automatically linked based on:
+
+* **Email address** → matched to People records
+* **Email domain** → matched to Company records
+* **Company relation** → linked to Opportunities
+
+## Custom Objects
+
+**Email tracking is not available on custom objects** at this time.
+
+If you need email context on a custom object, consider:
+
+* Using a relation field to link your custom object to People or Companies
+* Viewing email history on the linked People/Company record
+
+## Future Plans
+
+Extending email visibility to custom objects is being considered. Share your use case on our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to help prioritize this feature.
diff --git a/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx b/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx
new file mode 100644
index 0000000000..83da30bd83
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx
@@ -0,0 +1,42 @@
+---
+title: Connect Several Mailboxes per User
+description: Connect multiple email accounts for a single user.
+---
+
+## Overview
+
+Twenty supports **unlimited email accounts per user**. This is useful if you manage multiple inboxes, such as:
+
+* Personal work email + shared team inbox
+* Multiple client-facing email addresses
+* Different email accounts for different roles
+
+## How to Add Multiple Mailboxes
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Connect your additional Google or Microsoft account
+4. Configure sync settings for this mailbox
+5. Repeat for each mailbox you want to connect
+
+## Managing Multiple Accounts
+
+Each connected mailbox has its own settings:
+
+* **Email visibility**: Choose what teammates can see
+* **Contact auto-creation**: Enable/disable per mailbox
+* **Folder selection**: Choose which folders to sync (Lab feature)
+
+## How Emails Appear
+
+Emails from all your connected mailboxes are synced to Twenty and appear on:
+
+* **People records**: Based on the contact's email address
+* **Company records**: Based on the email domain
+* **Opportunities**: Based on the linked company
+
+Each email shows which mailbox it was sent from/received to, so you can track which account was used for each communication.
+
+## Important Notes
+
+Only true mailboxes can be connected. Email aliases that forward to another mailbox cannot be connected separately—they'll sync through the main mailbox.
diff --git a/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx b/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx
new file mode 100644
index 0000000000..c5db7745a0
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx
@@ -0,0 +1,53 @@
+---
+title: I Don't See Emails on Records
+description: Troubleshooting missing emails on records.
+---
+
+## Common Reasons
+
+### 1. Initial Sync Still in Progress
+
+Email sync takes time, especially for large mailboxes.
+
+* **Calendar sync**: Completes in minutes
+* **Email sync**: Can take several hours for large mailboxes
+
+**Solution**: Wait up to a few hours for the initial import to complete.
+
+### 2. Contact Doesn't Exist in Twenty
+
+Emails only appear on existing People records. If the contact wasn't created yet:
+
+* Enable **Contact Auto-Creation** in your mailbox settings
+* Or manually create the Person record first
+
+**Solution**: Go to **Settings → Accounts**, select your mailbox, and enable contact auto-creation.
+
+### 3. Internal Emails Are Excluded
+
+Emails between colleagues (same email domain) are never synced to maintain privacy.
+
+**Solution**: This is expected behavior. Only external emails are synced.
+
+### 4. Email Is from a Group or Distribution List
+
+Group emails and distribution lists are excluded from sync.
+
+**Solution**: This is expected behavior.
+
+### 5. Folder Not Selected for Sync
+
+If you're using the Message Folder feature, some folders might be excluded.
+
+**Solution**: Go to **Settings → Accounts**, select your mailbox, and check folder sync settings.
+
+### 6. Wrong Email Address on Record
+
+The Person record might have a different email address than the one used in the email.
+
+**Solution**: Add the correct email address to the Person record.
+
+## Still Not Working?
+
+1. Try disconnecting and reconnecting your mailbox
+2. Contact support if issues persist
diff --git a/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx b/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
new file mode 100644
index 0000000000..9569d2651a
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
@@ -0,0 +1,52 @@
+---
+title: Limit Emails Imported
+description: Control which emails are imported into Twenty.
+---
+
+## Overview
+
+By default, Twenty syncs all external emails from your connected mailbox. You can limit what gets imported using **folder selection** and **visibility settings**.
+
+## Method 1: Folder Selection (Recommended)
+
+Control which email folders sync with Twenty:
+
+1. Go to **Settings → Releases → Lab**
+2. Enable **Message Folder**
+3. Return to **Settings → Accounts**
+4. Select your connected email account
+5. Choose which folders to sync:
+
+| Folder | Description |
+| ------------------ | ----------------------------- |
+| **Inbox** | Primary incoming emails |
+| **Sent** | Outgoing emails you've sent |
+| **Archive** | Archived messages |
+| **Custom Folders** | Any specific folders you want |
+
+6. Exclude folders you don't want synced (Spam, Trash, personal folders)
+
+This gives you precise control over which emails appear in your CRM without syncing everything.
+
+## Method 2: Contact Auto-Creation Settings
+
+Control when contacts are created from emails:
+
+1. Go to **Settings → Accounts**
+2. Select your connected mailbox
+3. Choose an option:
+ * **Deactivated**: No contacts created, but emails still sync to existing contacts
+ * **Sent & Received**: Create contacts from all external emails
+ * **Sent Only**: Only create contacts from emails you send
+
+## What's Always Excluded
+
+These emails are never synced, regardless of settings:
+
+* **Internal emails**: Messages between colleagues (same domain)
+* **Group emails**: Distribution lists and group messages
+* **Spam/Trash**: System folders are typically excluded
+
+## Important Note
+
+We don't provide a CC email address for selective syncing. Use the folder selection feature above to achieve the same level of control.
diff --git a/packages/twenty-docs/l/ja/user-guide/calendar-emails/overview.mdx b/packages/twenty-docs/l/ja/user-guide/calendar-emails/overview.mdx
new file mode 100644
index 0000000000..a36e1fbccd
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/calendar-emails/overview.mdx
@@ -0,0 +1,132 @@
+---
+title: Calendar & Emails
+description: Connect your email and calendar accounts to Twenty.
+image: /images/user-guide/emails/emails_header.png
+---
+
+
+
+
+
+## Connection Options
+
+### Google Account (Gmail & Google Calendar)
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Select **Continue with Google**
+4. Authorize Twenty to access your Gmail and Google Calendar
+5. Configure email sync settings (visibility, auto-creation) → click **Next**
+6. Configure calendar sync settings (visibility, auto-creation) → click **Add Account**
+7. Your emails and calendar events will start syncing automatically
+
+### Microsoft Account (Outlook & Microsoft Calendar)
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Select **Continue with Microsoft**
+4. Authorize Twenty to access your Outlook and Microsoft Calendar
+5. Configure email sync settings (visibility, auto-creation) → click **Next**
+6. Configure calendar sync settings (visibility, auto-creation) → click **Add Account**
+7. Your emails and calendar events will start syncing automatically
+
+### SMTP/CalDAV Setup (Other Providers)
+
+For other email and calendar providers:
+
+1. Go to **Settings → Releases → Lab** to enable the feature
+2. Return to **Settings → Accounts**
+3. Configure SMTP settings for email
+4. Configure CalDAV settings for calendar
+5. Test the connection
+
+### Multiple Mailboxes
+
+* **Unlimited Accounts**: Connect multiple email accounts per user
+* **Account Management**: Switch between different mailboxes
+* **Sync Settings**: Configure different settings per mailbox
+
+
+ Only true mailboxes can be connected (e.g., support@domain.com with its own inbox). Email aliases that forward to another mailbox cannot be connected to Twenty.
+
+
+## Email Configuration
+
+### Message Visibility
+
+Choose different levels of visibility for your emails:
+
+* **Metadata Only**: Share only basic information (sender, recipient, date, time)
+* **Subject and Metadata**: Share subject line along with metadata
+* **All Email Content**: Share entire email content including attachments
+
+### Contact Auto-Creation
+
+* **Deactivated**: No automatic contact creation
+* **For messages sent & received**: Create contacts for all external email interactions
+* **For messages sent only**: Create contacts only for emails you send
+* **Note**: Internal emails (same domain) are never synced to maintain privacy
+
+When enabled, contacts are automatically linked to their Company records based on their email domain. If the company doesn't exist yet, Twenty creates it for you.
+
+### Control which emails get sync with Message Folder Selection (Lab Feature)
+
+Control which email folders sync with Twenty:
+
+1. Go to **Settings → Releases → Lab** and enable **Message Folder**
+2. Return to **Settings → Accounts** and select your connected email account
+3. Choose which folders to sync:
+ * **Inbox**: Primary incoming emails
+ * **Sent**: Outgoing emails you've sent
+ * **Custom Folders**: Any specific folders you want to include
+ * **Exclude Folders**: Skip folders like Spam, Trash, or personal folders
+
+This gives you precise control over which emails appear in your CRM without syncing everything.
+
+**What Gets Synced:**
+
+* **External Emails**: All emails with external contacts from selected folders
+* **Internal Emails**: Not synced (same domain emails remain private)
+* **Attachments**: Coming in H1 2026
+
+**Note**: We don't provide a CC email address for selective syncing. Instead, use the Message Folder feature above to achieve the same level of control over which emails sync with Twenty.
+
+## Calendar Configuration
+
+### Event Visibility
+
+Choose what will be visible to other users in your workspace:
+
+* **Everything**: The whole event details will be shared with your team
+* **Metadata**: Only date & participants will be shared with your team
+
+### Contact Auto-Creation for Meetings
+
+* **Yes**: Automatically create contacts for meeting participants not in your CRM
+* **No**: Only link meetings to existing contacts
+
+When enabled, contacts are automatically linked to their Company records based on their email domain. If the company doesn't exist yet, Twenty creates it for you.
+
+### Control which events get sync
+
+* **Meeting Import**: Automatically import calendar events
+* **Contact Linking**: Link meetings to People and Company records
+
+**What Gets Synced:**
+
+* **Meetings**: Calendar events with external participants
+* **Contact Linking**: Events automatically linked to CRM records
+* **Team Events**: Shared calendar visibility
+
+## Sync Frequency
+
+**Updates every 5 minutes**: Both email and calendar data sync automatically every 5 minutes after the initial import.
+
+
+ **Initial sync timing**: Calendar sync completes quickly (usually within minutes), while email sync takes longer for large mailboxes—up to a few hours depending on volume. Don't worry if you see contacts from calendar events appearing before your email contacts; this is normal behavior.
+
+
+## Next Steps
+
+* [Mailbox capabilities](/l/ja/user-guide/calendar-emails/capabilities/mailbox)
+* [Troubleshoot missing emails](/l/ja/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records)
diff --git a/packages/twenty-docs/l/ja/user-guide/dashboards/capabilities/dashboards.mdx b/packages/twenty-docs/l/ja/user-guide/dashboards/capabilities/dashboards.mdx
new file mode 100644
index 0000000000..b3d731e668
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/dashboards/capabilities/dashboards.mdx
@@ -0,0 +1,74 @@
+---
+title: Dashboards
+description: Create and organize dashboards with tabs to visualize your CRM data.
+---
+
+## Overview
+
+Dashboards in Twenty are organized in a hierarchy: **Dashboards → Tabs → Widgets**. Each dashboard can contain multiple tabs, and each tab contains widgets (charts, numbers, iFrames).
+
+## Creating a Dashboard
+
+1. Go to **Dashboards** in the navigation
+2. Click **+ New Dashboard**
+3. Give your dashboard a name
+4. Start adding tabs and widgets
+
+## Working with Tabs
+
+Tabs help you organize your dashboard into logical sections.
+
+### Creating Tabs
+
+1. In edit mode, click **+ Add Tab**
+2. Name your tab (e.g., "Pipeline Overview", "Team Performance")
+3. Add widgets to the tab
+
+### Duplicating Tabs
+
+1. Click on the tab you want to duplicate
+2. Click the **Duplicate** button in the side panel
+
+## Dashboard Layout
+
+### Arranging Widgets
+
+* Drag and drop to position
+* Resize for emphasis
+* Group related charts together
+
+### Duplicating a Dashboard
+
+1. Exit edit mode (view mode only)
+2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
+3. Select **Duplicate dashboard**
+
+### Best Practices
+
+* **Logical flow**: Arrange from overview to detail
+* **Visual hierarchy**: Larger charts for key metrics
+* **Consistent styling**: Use matching colors and fonts
+
+## Visibility & Access
+
+### Dashboard Visibility
+
+Dashboards are visible to everyone who has access to your Twenty workspace. There is no private dashboard option at the moment.
+
+### Favorites
+
+You can add dashboards to your favorites for quick access. This is a personal setting—your favorites are not visible to other users.
+
+To add a dashboard to favorites, open the dashboard and click the star icon.
+
+### Timezone Behavior
+
+Dashboards currently display data based on the timezone of the user viewing them. This means the same dashboard may show different metrics for team members in different regions (e.g., APAC vs. US).
+
+
+ **Coming soon**: We will add the ability to set a specific timezone for a dashboard, so all users see consistent data regardless of their location.
+
+
+
+ **Coming soon**: Dashboard-level filters will allow you to apply filters across all widgets at once, making it faster to explore your data.
+
diff --git a/packages/twenty-docs/l/ja/user-guide/dashboards/capabilities/widgets.mdx b/packages/twenty-docs/l/ja/user-guide/dashboards/capabilities/widgets.mdx
new file mode 100644
index 0000000000..fc12e61339
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/dashboards/capabilities/widgets.mdx
@@ -0,0 +1,131 @@
+---
+title: Widgets
+description: Explore the widget types and visualization options in Twenty.
+---
+
+## Available Widgets
+
+Twenty provides various widget types to visualize your CRM data.
+
+### Bar Charts
+
+Display data as horizontal or vertical bars.
+
+**Best for:**
+
+* Comparing values across categories
+* Showing rankings
+* Tracking metrics by time period
+
+**Example uses:**
+
+* Deals by stage
+* Revenue by sales rep
+* Contacts added per month
+
+
+ **Display limits**: Bar charts can show a maximum of 100 bars (horizontal) or 50 bars (vertical). If you see the warning "Undisplayed data: max X bars per chart", add filters to narrow down your data or change the grouping (e.g., group by week instead of days).
+
+
+### Pie Charts
+
+Show proportions of a whole.
+
+**Best for:**
+
+* Showing composition or distribution
+* Comparing parts to whole
+* Highlighting major segments
+
+**Example uses:**
+
+* Deal distribution by source
+* Contact breakdown by industry
+* Pipeline composition by owner
+
+### Line Charts
+
+Display trends over time.
+
+**Best for:**
+
+* Tracking changes over time
+* Identifying trends
+* Comparing multiple metrics
+
+**Example uses:**
+
+* Monthly deal count trend
+* Revenue growth over quarters
+* Activity levels over time
+
+### Number Metrics
+
+Display single key values prominently.
+
+**Best for:**
+
+* Highlighting KPIs
+* Showing totals or averages
+* Quick status checks
+
+**Example uses:**
+
+* Total pipeline value
+* Number of open opportunities
+* Conversion rate
+
+**Advanced options:**
+
+* **Ratio**: For Select fields, calculate ratios between values. Go to **Data on display** → select your field → enable the **Ratio** option.
+* **Prefix & Suffix**: Add custom text before or after the number (e.g., "$" prefix or "%" suffix) for better readability.
+
+### iFrames
+
+Embed external tools and content directly in your dashboard.
+
+**Best for:**
+
+* Displaying external reports or dashboards
+* Integrating third-party sales tools
+* Showing live content from other systems
+
+**Example uses:**
+
+* Metrics from your Support tool
+* Metrics from your dialer
+* Live content from your Sales sequence tool
+
+
+ **Coming soon**: Gauge charts and tables are not yet available but are on our roadmap.
+
+
+## Configuring Widgets
+
+### Data Source
+
+1. Select the object to visualize (Opportunities, People, etc.)
+2. Choose the metric to display (count, sum, average)
+3. Apply filters to focus on specific data
+
+### Grouping
+
+Group data by:
+
+* Fields (stage, owner, industry)
+* Time periods (day, week, month, quarter)
+* Custom segments
+
+### Styling
+
+Customize your charts with:
+
+* Colors and themes
+* Labels and legends
+* Size and positioning
+
+### Duplicating Widgets
+
+1. Click on the widget
+2. Open **Options**
+3. Click **Duplicate widget**
diff --git a/packages/twenty-docs/l/ja/user-guide/dashboards/how-tos/dashboards-faq.mdx b/packages/twenty-docs/l/ja/user-guide/dashboards/how-tos/dashboards-faq.mdx
new file mode 100644
index 0000000000..7af41b4efa
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/dashboards/how-tos/dashboards-faq.mdx
@@ -0,0 +1,59 @@
+---
+title: Dashboards FAQ
+description: Frequently asked questions about dashboards in Twenty.
+---
+
+
+
+ No, dashboards are currently visible to everyone with access to your Twenty workspace. Private dashboards are not yet available.
+
+
+
+ Dashboards currently display data based on the viewer's timezone. If you're in different regions (e.g., APAC vs. US), you may see slightly different numbers for the same dashboard. We're working on adding a timezone setting per dashboard to ensure consistent data across teams.
+
+
+
+ Exporting dashboards is not available at the moment. This feature is on our roadmap.
+
+
+
+ No, sharing dashboards with users outside your Twenty workspace (non-Twenty users) is not currently supported.
+
+
+
+ Open the dashboard you want to favorite, then click the star icon. Favorites are personal—they won't affect other users.
+
+
+
+ * **Tabs** organize your dashboard into sections (like pages within the dashboard)
+ * **Widgets** are the individual visualizations (charts, numbers, iFrames) within each tab
+
+ Structure: Dashboard → Tabs → Widgets
+
+
+
+ Bar charts have display limits: 100 bars for horizontal charts, 50 for vertical. If your data exceeds this, add filters to narrow down the results or change the grouping (e.g., group by week instead of day).
+
+
+
+ Dashboard-level filters are not available yet, but this feature is on our roadmap. Currently, you need to apply filters to each widget individually.
+
+
+
+ Not yet. Gauge charts and tables are on our roadmap and will be added in a future release.
+
+
+
+ 1. Make sure you're in view mode (not editing)
+ 2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
+ 3. Select **Duplicate dashboard**
+
+
+
+ Widgets update automatically as your CRM data changes:
+
+ * Real-time updates for most metrics
+ * Use the refresh button for a manual update if needed
+ * Historical data is preserved for trend analysis
+
+
diff --git a/packages/twenty-docs/l/ja/user-guide/dashboards/overview.mdx b/packages/twenty-docs/l/ja/user-guide/dashboards/overview.mdx
new file mode 100644
index 0000000000..41d62bddd7
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/dashboards/overview.mdx
@@ -0,0 +1,79 @@
+---
+title: Dashboards
+description: Learn the basics of reporting and dashboards in Twenty.
+image: /images/user-guide/reporting/pie-chart.png
+---
+
+
+
+
+
+## Understanding Dashboards
+
+Dashboards in Twenty provide a visual way to track your key performance metrics and gain insights from your CRM data.
+
+
+
+## Key Concepts
+
+### Dashboards
+
+A dashboard is a collection of tabs that display your CRM data at a glance. You can create multiple dashboards for different purposes:
+
+* Sales performance
+* Team activity
+* Pipeline health
+* Custom metrics
+
+### Tabs
+
+Tabs allow you to organize your dashboard into sections. Each tab contains one or more widgets.
+
+### Widgets
+
+Widgets are individual visualizations that display specific data. Types include:
+
+* Bar charts
+* Pie charts
+* Line charts
+* Number metrics
+* iFrames
+
+
+ **Current limitations**:
+
+ * Exporting dashboards and sharing with external users (non-Twenty users) are not available at the moment.
+ * Gauge charts and tables are not yet available.
+
+
+## Getting Started
+
+### Creating Your First Dashboard
+
+1. Navigate to the **Dashboards** section
+2. Click **+ New Dashboard**
+3. Give your dashboard a name
+4. Add tabs to organize your content
+5. Add widgets to display your data
+6. Save
+
+### Adding Widgets
+
+1. Open a tab on your dashboard
+2. Click **+ Add Widget**
+3. Select the widget type
+4. Choose the data source (object)
+5. Configure the widget settings
+6. Save and view your widget
+
+## Best Practices
+
+* **Start simple**: Begin with a few key metrics and add more over time
+* **Focus on actionable data**: Display metrics that drive decisions
+* **Regular review**: Check your dashboards regularly to spot trends
+* **Share with team**: Make dashboards visible to relevant team members
+
+## Next Steps
+
+* [Widgets and visualizations](/l/ja/user-guide/dashboards/capabilities/widgets)
+* [Dashboards FAQ](/l/ja/user-guide/dashboards/how-tos/dashboards-faq)
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/error-handling.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/error-handling.mdx
new file mode 100644
index 0000000000..5860a302a0
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/error-handling.mdx
@@ -0,0 +1,76 @@
+---
+title: Error Handling & Validation
+description: Review and fix import errors directly in the UI before confirming.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Pre-Import Validation
+
+After uploading your file and mapping fields, Twenty validates your data **before** importing. This allows you to catch and fix errors without affecting your existing data.
+
+## How It Works
+
+1. **Upload** your CSV file
+2. **Map** your columns to Twenty fields
+3. **Review** the potential errors highlighted in yellow
+4. **Fix errors** directly in the UI
+5. **Confirm** the import
+
+
+
+## Error Display
+
+Rows with issues are highlighted in **yellow**. You can:
+
+* **Edit the cell directly** to fix the error
+* **Remove the row** to skip it entirely
+
+This inline editing saves time—no need to go back to your spreadsheet, fix errors, and re-upload.
+
+## Common Error Types
+
+### Duplicate Values
+
+**Cause**: A unique field (email, domain) already exists in Twenty or appears twice in your file.
+
+**Fix**:
+
+* Edit the duplicate value in the import UI
+* Remove one of the duplicate rows
+
+See [Uniqueness Constraints](/l/ja/user-guide/data-migration/capabilities/uniqueness-constraints) for more details on how uniqueness is enforced.
+
+### Invalid Format
+
+**Cause**: Data doesn't match the expected format (e.g., invalid email, wrong date format).
+
+**Fix**: Edit the cell to use the correct format.
+
+See [Field Mapping](/l/ja/user-guide/data-migration/capabilities/field-mapping) for the expected format of each field type.
+
+### Missing Required Fields
+
+**Cause**: A required field is empty.
+
+**Fix**: Enter a value in the required field or remove the row.
+
+### Relation Not Found
+
+**Cause**: The referenced record doesn't exist (e.g., a Company domain that wasn't imported).
+
+**Fix**:
+
+* Import the parent records first
+* Or correct the reference value
+
+See [Import Relations](/l/ja/user-guide/data-migration/capabilities/import-relations) for the correct import order and how to link records.
+
+## Tips for Fewer Errors
+
+1. **Download the template** to see expected format prior to importing your file
+2. **Clean your data** in the spreadsheet first
+3. **Import files in correct order** to import relations (Companies → People → Opportunities)
+4. **Test with small batches** before full import
+5. **Check for duplicates** before uploading
+6. **Limit the size of your file to 10,000 records** per file
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/field-mapping.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/field-mapping.mdx
new file mode 100644
index 0000000000..3f7751c8d0
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/field-mapping.mdx
@@ -0,0 +1,198 @@
+---
+title: Field Mapping
+description: How field mapping works during data import.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## How Field Mapping Works
+
+When you upload a file, Twenty analyzes your columns and attempts to match them to existing fields.
+
+### Automatic Mapping
+
+Twenty tries to match columns based on:
+
+* Column header names (exact or similar matches)
+* Data type detection (dates, numbers, emails)
+* Common field patterns
+
+**Quick tip:** Export a few rows from the object you want to import. The exported file will have the exact column names Twenty expects, making automatic mapping seamless during import.
+
+### Manual Mapping Options
+
+For each column, you can:
+
+* **Map to a field**: Select the matching Twenty field from a dropdown
+* **Do not map**: Skip the column entirely (data won't be imported)
+
+**Fields must exist before import.** The import creates records, not fields. Create custom fields under **Settings → Data Model** before importing.
+
+## Field Type Compatibility
+
+All field types available in the Data Model are supported for import.
+
+You can also import `id` values to either assign a specific ID to new records or update existing ones.
+
+
+
+## Data Format Requirements
+
+**Some fields have special syntax.** We recommend downloading the sample file before preparing your import to see the expected syntax for each field type.
+
+### Address Fields
+
+Address is a nested field with multiple columns. Some can be left empty.
+
+* **Address / Address 1**: Street address line 1
+* **Address / Address 2**: Street address line 2
+* **Address / City**: City name
+* **Address / State**: State or province
+* **Address / Country**: Country name
+* **Address / Post Code**: Postal/ZIP code
+
+### Array Fields
+
+Use the following format:
+
+```
+["value1","value2"]
+```
+
+### Boolean Fields
+
+Use `TRUE` or `FALSE` (uppercase) - not `true` or `false`
+
+### Currency Fields
+
+Currency is a nested field with two columns that **both must be filled**:
+
+* **Amount / Amount**: The numeric value (e.g., `1234.56`)
+* **Amount / Currency**: The currency code (e.g., `USD`, `EUR`)
+
+### Date Fields
+
+Supported formats:
+
+* `YYYY-MM-DD` (recommended)
+* `MM/DD/YYYY`
+* `DD/MM/YYYY`
+* ISO 8601 format
+
+### Domain Fields
+
+* It is recommended to use the format `https://domain.com` to avoid creating duplicates, as this is the format used for Companies created by the mailbox and calendar synchronizations
+* A `Domain Label` and `Domain URL` can be filled: best practice is to fill `domain.com` in the label and `https://domain.com` in the url
+* Domains must be unique within the Companies object
+* **Domains must be unique within the file to import**
+
+### Email Fields
+
+* Must be valid email format
+* Emails must be unique within the People object
+* **Emails must be unique within the file to import**
+* For additional emails: use **Emails / Primary Email** for the main email, and **Emails / Additional Emails** with this format:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Id Fields
+
+Specifying an `id` during import is optional. Twenty auto-generates one if not provided.
+
+Use cases for mapping an `id` column:
+
+* **Set a specific ID**: Choose the UUID for newly created records
+* **Update existing records**: Match against existing records to update them instead of creating duplicates. In that case, it is recommended to not map the other unique fields: mapping only one unique field ensures a smoother import.
+
+If you provide an `id`, it must be in UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
+
+### JSON Fields
+
+Use valid JSON format:
+
+```
+{"key":"value","key2":"value2"}
+```
+
+### Links Fields
+
+Similar to Domain fields:
+
+* Fill both the label and URL columns: **Links / Link URL** and **Links / Link Label**
+* Use full URL format: `https://example.com`
+* For secondary links, use **Links / Secondary Links** column with this format:
+
+```
+[{"url":"https://twenty.com","label":"Twenty"}]
+```
+
+### Multi-Select Fields
+
+Use the **API names** (not the display labels) in the following format:
+
+```
+["VALUE1","VALUE2"]
+```
+
+See [here](#finding-api-names-for-select-fields) where to find the API names.
+
+New select options will not be created automatically by the import. They must be added under **Settings → Data Model** before importing.
+
+
+ **Import overwrites, it does not add.**
+
+ If a record already has `VALUE2` and `VALUE3` selected, and you import `["VALUE1"]`, the record will only have `VALUE1` after import. The previous selections are replaced, not merged.
+
+
+### Number Fields
+
+* Numbers only
+* Decimals use period: `1234.56`
+* No thousands separators
+
+### Phone Fields
+
+Phone is a nested field with multiple columns that **must be filled**
+
+* **Phones / Primary Phone Number**: The phone number (e.g., `4159095555`)
+* **Phones / Primary Phone Country Code**: Country code (e.g., `US`)
+* **Phones / Primary Phone Calling Code**: Dialing code (e.g., `+1`)
+
+### Rating Fields
+
+Use the API name format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, `RATING_5`
+
+### Relation Fields
+
+Please see our dedicated article: [Import Relations Between Objects](/l/ja/user-guide/data-migration/capabilities/import-relations)
+
+### Select Fields
+
+Use the **API name** of the option (not the display label):
+
+```
+VALUE1
+```
+
+See [here](#finding-api-names-for-select-fields) where to find the API names.
+New select options will not be created automatically by the import. They must be added under **Settings → Data Model** before importing.
+
+### Text Fields
+
+* No special formatting required
+* Leading/trailing spaces are trimmed
+
+## Finding API Names
+
+For Select, Multi-Select, and Array fields with predefined options, you must use the **API names**, not the display labels.
+
+### How to Find API Names
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at the bottom right of the settings page)
+4. View the API name for each option
+
+
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/file-formats.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/file-formats.mdx
new file mode 100644
index 0000000000..24be6eaded
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/file-formats.mdx
@@ -0,0 +1,48 @@
+---
+title: Supported File Formats
+description: File formats supported for data import in Twenty.
+---
+
+## Supported Formats
+
+Twenty supports three file formats for import:
+
+| Format | Extension | Notes |
+| ------------------ | --------- | ---------------------------- |
+| **CSV** | .csv | Recommended, most compatible |
+| **Excel** | .xlsx | Modern Excel format |
+| **Excel (Legacy)** | .xls | Older Excel format |
+
+## File Requirements
+
+| Requirement | Value |
+| ---------------- | ------------------------------------- |
+| **Encoding** | UTF-8 recommended |
+| **Record limit** | 10,000 records per file |
+| **Structure** | First row must contain column headers |
+| **Content** | One object type per file |
+
+## CSV Best Practices
+
+* **Delimiter**: Use comma (`,`) or semicolon (`;`)
+* **Text qualifier**: Use double quotes (`"`) for text containing commas
+* **Line endings**: Windows (CRLF) or Unix (LF) both supported
+* **Empty values**: Leave cells empty, don't use "NULL" or "N/A"
+
+## Excel Best Practices
+
+When exporting from Excel:
+
+* Remove formulas (export values only)
+* Delete empty rows at the end
+* Ensure no merged cells
+* Use the first sheet only
+
+## Large Datasets
+
+For datasets larger than 10,000 records:
+
+* Split into multiple files
+* Or use the [API import](/l/ja/user-guide/data-migration/how-tos/import-data-via-api) for unlimited records
+
+For very large migrations (100,000+ records), the API is significantly faster and more reliable than CSV imports.
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/import-relations.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/import-relations.mdx
new file mode 100644
index 0000000000..2c2ea60c23
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/import-relations.mdx
@@ -0,0 +1,148 @@
+---
+title: Import Relations Between Objects
+description: Import relationships between records via CSV.
+---
+
+## Overview
+
+Twenty supports importing relationships between objects during CSV import. This allows you to link records (e.g., attach People to Companies) as part of your data migration.
+
+**Currently supported for import**: One-to-many relations pointing to a single object type on each side (e.g., People → Companies). Relations pointing to multiple object types are not yet supported in import/export.
+
+## How Relations Work in Twenty
+
+### One to Many / Many to One
+
+Twenty supports standard relations where one record links to many others:
+
+* **One Company → Many People**: A company can have multiple employees, but each person belongs to one company
+* **One Company → Many Opportunities**: A company can have multiple deals, but each opportunity belongs to one company
+
+### Relations That Can Point to Multiple Object Types
+
+Some relations can connect to different types of objects. This works in two ways:
+
+**Pattern 1: Many records linking to one record each from different object types**
+
+Several Notes, Tasks, or Activities can each be attached to multiple object types at once:
+
+* **Notes** can be linked to one Person, one Company, and one Opportunity simultaneously
+* **Tasks** can be linked to one Person, one Company, and one Opportunity simultaneously
+
+Here, the Notes/Tasks are on the "many" side. Each links to one record per object type.
+
+
+
+**Pattern 2: One record receiving links from many records of different object types**
+
+A Project can receive links from multiple records across different object types:
+
+* **A Project** can have many People linked to it, many Companies linked to it, and many Notes attached to it
+
+Here, the Project is on the "one" side. Multiple records from different objects can all link to the same Project.
+
+
+
+
+ **Import/Export limitation**: Relations that point to multiple object types (like Notes → People/Companies/Opportunities) are **not yet supported** in CSV import or export.
+
+ * **Import**: Only one-to-many relations pointing to a single object type on each side can be imported
+ * **Export**: Columns for relations pointing to multiple object types are currently left empty
+
+ This is on our roadmap.
+
+
+### What's Not Supported Today
+
+**Many to Many relations** are not yet available. For example, you cannot currently create a relation where:
+
+* Many People are linked to many Projects
+
+Many to Many relations are planned for H1 2026.
+
+## Linking Records During Import
+
+**Reminder**: Only one-to-many relations pointing to a single object type can be imported (e.g., People → Companies). Relations pointing to multiple object types (e.g., Notes → People/Companies/Opportunities) are not yet supported.
+
+### Step 1: Identify the "One" and "Many" Sides
+
+First, determine which object is on the "one" side and which is on the "many" side of the relationship.
+
+**Example**:
+
+* **Company** is the "one" side (one company has many employees)
+* **People** is the "many" side (each person belongs to one company)
+
+### Step 2: Ensure the "One" Side Records Exist
+
+Before importing the "many" side, the "one" side records must already exist in Twenty.
+
+* Import or create the "one" side records first (e.g., Companies)
+* Validate their unique identifier. This can be:
+ * The `id` (Twenty's UUID)
+ * A field set as unique (e.g., `domain` for Companies, or an external ID from your previous system)
+
+The import will fail if a reference is made to a record that does not exist.
+
+### Step 3: Prepare Your CSV File
+
+Add a column in your "many" side CSV file that references the "one" side record.
+
+**Example**: For a People CSV file linking to Companies:
+
+```
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+**Important**:
+
+* The value must **exactly match** the unique field on the Company record
+* For domains, use the **Domain URL** (e.g., `https://acme.com`), not the Domain Label
+* Map only **one** unique identifier per relation: this leads to a smoother import
+
+### Step 4: Ensure the Relation Field Exists
+
+Before uploading your file, make sure the relation field exists between your objects.
+
+If it doesn't exist:
+
+1. Go to **Settings → Data Model**
+2. Select your object (e.g., People)
+3. Create a relation field pointing to the target object (e.g., Company)
+
+### Step 5: Upload and Map the Relation
+
+1. Upload your CSV file via the import UI
+2. In the field mapping step, find your relation column (e.g., `companyDomain`)
+3. Map it to the relation field (e.g., Company)
+4. Twenty will automatically link each record to the matching parent
+
+### Available Unique Fields for Relations
+
+| Object | Unique Fields Available |
+| ------------------------------------- | --------------------------------------- |
+| **Companies** | `id`, `domain`, any custom unique field |
+| **People** | `id`, `email`, any custom unique field |
+| **Workspace Members** | `id`, `email` (not name) |
+| **Other standard and custom objects** | `id`, any field marked as unique |
+
+**Linking to Workspace Members**: When the relation points to Workspace Members (your team logging into Twenty), reference them by their **email address**, not their name.
+
+We recommend using `domain` for Companies and `email` for People, as these are human-readable and easy to maintain in spreadsheets.
+
+**Reminder**: Soft-deleted records (visible under Command Menu → See deleted records) count toward uniqueness criteria. If you import a record with the same unique value as a deleted record, the deleted record will be restored. See [Uniqueness Constraints](/l/ja/user-guide/data-migration/capabilities/uniqueness-constraints) for more details.
+
+## Import Order Rule
+
+
+ **Always import the "one" side first!**
+
+ 1. **Companies** first (no dependencies)
+ 2. **People** second (linked to Companies)
+ 3. **Opportunities** third (linked to Companies/People)
+ 4. **Custom objects** following their dependencies
+
+ The parent record must exist before you can reference it.
+
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/uniqueness-constraints.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/uniqueness-constraints.mdx
new file mode 100644
index 0000000000..5f6d05701b
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/capabilities/uniqueness-constraints.mdx
@@ -0,0 +1,72 @@
+---
+title: Uniqueness Constraints
+description: How Twenty enforces data uniqueness during import.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Overview
+
+Twenty enforces uniqueness on certain fields to prevent duplicate records and ensure data integrity. Understanding these constraints is essential for successful imports.
+
+## Default Unique Fields
+
+| Object | Unique Fields |
+| ------------------ | ---------------------- |
+| **People** | `id`, `email` |
+| **Companies** | `id`, `domain` |
+| **Custom objects** | `id` only (by default) |
+
+The `id` field is Twenty's internal identifier, auto-generated for each record. It uses UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
+
+## Custom Unique Fields
+
+You can define additional unique fields under **Settings → Data Model**:
+
+1. Go to **Settings → Data Model**
+2. Select the object
+3. Click on a field
+4. Enable **Unique** in field settings
+
+### Use Cases for Custom Unique Fields
+
+* **External IDs**: Store IDs from other systems (Salesforce ID, HubSpot ID)
+* **Business identifiers**: Employee numbers, customer codes
+* **Alternative contact info**: LinkedIn profile, phone number
+
+The field name `id` is reserved for Twenty's internal ID. Use a different name like `externalId` or `legacyId` for external identifiers.
+
+## Import Behavior
+
+### Creating New Records
+
+If a unique field value doesn't exist, a new record is created.
+
+### Updating Existing Records
+
+If a unique field value matches an existing record, that record is **updated** with the new data.
+To **update existing records**, it is recommended to **only match one unique field**.
+
+### Soft-Deleted Records
+
+
+ **Deleted records count toward uniqueness.**
+
+ Soft-deleted records (visible under Command Menu → See deleted records) are included in uniqueness checks. If you import a record with the same unique value as a deleted record, the deleted record will be **restored** with the new data.
+
+
+## Duplicate Detection During Import
+
+During the validation phase:
+
+* Duplicates within your file are highlighted in yellow
+* You can edit or remove duplicate rows from the UI before starting the import
+
+
+
+## Best Practices
+
+1. **Remove duplicates** from your file before importing
+2. **Check for existing records** in Twenty before importing
+3. **Use external IDs** when migrating from other systems
+4. **Include unique fields** if you want to update existing records
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/export-your-data.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/export-your-data.mdx
new file mode 100644
index 0000000000..b980e32088
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/export-your-data.mdx
@@ -0,0 +1,209 @@
+---
+title: Export Your Data
+description: Complete step-by-step guide to exporting data from Twenty.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Overview
+
+Export your workspace data to CSV for backups, reporting, or migration.
+
+**Use cases:**
+
+* **Regular backups** — keep copies of your data
+* **External reporting** — analyze data in Excel, Google Sheets, or BI tools
+* **Migration** — move data to another system
+* **Bulk updates** — export, edit, and re-import to update records
+
+## What You Need to Know
+
+### Export Limits
+
+* **Maximum 20,000 records** per export
+* Only **visible columns** are exported
+* Only **filtered records** are exported (based on your current view)
+
+For larger exports (20,000+ records), use filters to export in batches or use the [API](/l/ja/developers/extend/capabilities/apis).
+
+### Permissions
+
+You need the **"Export CSV"** permission to export data. Contact your workspace admin if you don't have this option.
+
+## Step 1: Navigate to the Object
+
+Go to the object you want to export:
+
+* **People** — for contacts
+* **Companies** — for organizations
+* **Opportunities** — for deals
+* **Custom objects** — any object you've created
+
+## Step 2: Configure Your View
+
+**Important:** The export includes only what's visible in your current view.
+
+### Add/Remove Columns
+
+1. Click **Options → Fields** (or the **+** at the end of columns)
+2. Check the fields you want to export
+3. Uncheck fields you don't need
+
+### Filter Records (Optional)
+
+If you only need a subset of data:
+
+1. Click **Filter**
+2. Add filter conditions (e.g., "Created date > January 1, 2024")
+3. Only matching records will be exported
+
+### Sort Records (Optional)
+
+1. Click a column header to sort
+2. The export will follow your sort order
+
+**Create a dedicated export view.** Save a view specifically configured for exports so you don't need to reconfigure each time.
+
+## Step 3: Export the Data
+
+1. Click the **⋮** icon on the top right of the table
+2. Select **Export view**
+3. Choose where to save the CSV file
+4. Wait for the download to complete
+
+## What Gets Exported
+
+| Included | Not Included |
+| -------------------------------- | ---------------------- |
+| All visible columns | Hidden columns |
+| Records matching current filters | Filtered-out records |
+| Custom field values | Fields not in the view |
+| Record IDs | File attachments |
+| Relation IDs | Images |
+
+### Relation Fields
+
+Relation IDs are only exported on the **"many" side** of a relationship:
+
+* **People export** includes a `companyId` column (People → Company relation)
+* **Companies export** does NOT include `peopleIds` (Companies is the "one" side)
+
+This means you can use the People export to re-import and maintain the Company link, but you'll need to re-import People after Companies to recreate the relationships.
+
+## Exporting for Specific Purposes
+
+### For Backups
+
+1. Create a view with **all fields** visible
+2. Remove all filters to include all records
+3. Export each object type separately
+4. Store exports in a secure location
+5. Set a recurring reminder (weekly/monthly)
+
+### For External Reporting
+
+1. Include only the fields you need for analysis
+2. Apply filters to focus on relevant data
+3. Consider sorting by the field you'll analyze
+
+### For Bulk Updates
+
+1. Export the records you want to update
+2. Include the unique identifier (`email`, `domain`, or `id`)
+3. Edit the exported file
+4. Re-import to update records
+ See: [How to Update Existing Records](/l/ja/user-guide/data-migration/how-tos/update-existing-records-via-import)
+
+### For Migration
+
+If you're exporting to migrate to another system:
+
+1. **Export each object separately** — People, Companies, Opportunities, etc.
+2. **Include ID fields** — these help maintain relationships
+3. **Document field mappings** — note how Twenty fields map to your target system
+
+## Handling Large Datasets (20,000+ Records)
+
+The export limit is 20,000 records. For larger datasets:
+
+### Option 1: Export in Batches
+
+1. Add a filter (e.g., "Created date" ranges)
+2. Export the first batch
+3. Change the filter
+4. Export the next batch
+5. Combine files in your spreadsheet
+
+**Example filters for batching:**
+
+* By date range (January, February, March...)
+* By owner (Team member A, Team member B...)
+* By status (Active, Inactive...)
+
+### Option 2: Use the API
+
+The API has no record limit:
+
+1. Get your API key from **Settings → Developers**
+2. Use the GraphQL API to query records
+3. Process results in your application
+
+See: [API Documentation](/l/ja/developers/extend/capabilities/apis)
+
+## Tips and Best Practices
+
+### Create Export Views
+
+Save views configured specifically for exports:
+
+1. Configure columns and filters
+2. Click **View options** → **Save as new view**
+3. Name it "Export - [Purpose]"
+
+### Secure Your Exports
+
+Exported files may contain sensitive data:
+
+* Store in secure locations
+* Delete old exports when no longer needed
+* Be careful sharing export files
+
+### Check Before Exporting
+
+Correct columns are visible
+Filters are set correctly (or removed for full export)
+You have Export permission
+
+## FAQ
+
+
+
+ Only visible columns are exported. Add the columns you need via **Options → Fields** before exporting.
+
+
+
+ Check your filters. The export only includes records matching your current view filters. Remove filters to export all records.
+
+
+
+ Not in a single export. Use filters to export in batches, or use the API for larger datasets.
+
+
+
+ CSV (Comma Separated Values). Opens in Excel, Google Sheets, or any spreadsheet application.
+
+
+
+ Yes, but only on the "many" side of relationships. For example, a People export includes `companyId`, but a Companies export does not include people IDs.
+
+
+
+ Not directly through the UI. Use the API to build automated export workflows.
+
+
+
+## Next Steps
+
+* [How to Update Existing Records](/l/ja/user-guide/data-migration/how-tos/update-existing-records-via-import) — edit and re-import your export
+* [How to Import Data via API](/l/ja/user-guide/data-migration/how-tos/import-data-via-api) — for large datasets
+* [API Documentation](/l/ja/developers/extend/capabilities/apis) — build custom export workflows
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/fix-import-errors.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/fix-import-errors.mdx
new file mode 100644
index 0000000000..50698ef1cc
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/fix-import-errors.mdx
@@ -0,0 +1,430 @@
+---
+title: Fix Import Errors
+description: Complete troubleshooting guide for resolving CSV import errors.
+---
+
+## Overview
+
+Import not working? This guide helps you identify and fix common import errors step by step.
+
+## How Import Validation Works
+
+After uploading your file and mapping columns, Twenty validates your data:
+
+1. **Validation runs** — Twenty checks each row for errors
+2. **Errors are highlighted** — problematic rows appear in **yellow**
+3. **You can fix in-place** — edit cells directly in the import UI
+4. **Or remove rows** — skip problematic records entirely
+
+**Fix errors in the UI.** You don't need to go back to your spreadsheet. Edit cells directly during import to save time.
+
+## Step-by-Step Troubleshooting
+
+### Step 1: Identify the Error Type
+
+Click on a highlighted row to see the specific error message. Common error types:
+
+| Error Message | What It Means |
+| --------------------------------------------------------------------- | ------------------------------------------------------------ |
+| Duplicate values highlighted in yellow | Value already exists in Twenty or appears twice in your file |
+| `{field} is not a valid {type}` (hover on yellow cell) | Data doesn't match expected format |
+| Required field highlighted | A required field is empty |
+| `Can't connect to {object}. No unique record found...` (import fails) | Referenced record doesn't exist |
+| `Too many records. Up to 10000 allowed` (upload blocked) | File has more than 10,000 records |
+
+### Step 2: Fix the Error
+
+Follow the specific instructions below for each error type.
+
+---
+
+## Error: Duplicate Value
+
+### What You'll See
+
+Rows with duplicate values are **highlighted in yellow** in the import UI before the import starts.
+
+### What It Means
+
+A unique field (email, domain) either:
+
+* Already exists in Twenty
+* Appears twice in your file
+
+### How to Fix
+
+**Option 1: Edit the duplicate value**
+
+1. Click the cell with the error
+2. Change to a unique value
+3. Continue with import
+
+**Option 2: Remove the duplicate row**
+
+1. Click the X next to the row
+2. The row will be skipped during import
+
+**Option 3: Let Twenty update the existing record**
+
+1. Ensure your file includes a unique identifier (`email`, `domain`, or `id`)
+2. Map the unique identifier field
+3. Twenty will update the existing record instead of creating a duplicate
+
+
+ **You can update unique fields too.**
+
+ * If you keep the `id` but change the `email` → the email will be updated
+ * If you keep the `email` but change the `id` → the id will be updated
+
+ As long as one unique identifier matches, Twenty updates the record.
+
+
+### How to Prevent This Error
+
+Before importing:
+
+1. Sort your spreadsheet by the unique field
+2. Remove duplicate rows
+3. Check if records already exist in Twenty
+
+
+ **Soft-deleted records count toward uniqueness.**
+
+ Check Command Menu → See deleted records. Records there still enforce uniqueness. Permanently delete them or restore and update.
+
+
+For more details: [Uniqueness Constraints](/l/ja/user-guide/data-migration/capabilities/uniqueness-constraints)
+
+---
+
+## Error: Invalid Format
+
+### What You'll See
+
+The cell value is highlighted in yellow. Hover over it to see the error message:
+
+```
+{field name} is not a valid {field type}
+```
+
+### What It Means
+
+The data doesn't match the expected format for that field type.
+
+### How to Fix — By Field Type
+
+#### Email
+
+**Problem:** Invalid email format
+**Solution:** Use format `name@domain.com`
+
+```
+❌ john.smith@
+❌ john smith@acme.com
+✓ john.smith@acme.com
+```
+
+#### Domain
+
+**Problem:** Inconsistent format may cause duplicates
+**Solution:** Use `https://domain.com` format (recommended)
+
+```
+⚠️ acme.com (valid, but not recommended)
+⚠️ www.acme.com (valid, but not recommended)
+✅ https://acme.com (recommended)
+```
+
+All formats are valid, but `https://domain.com` is recommended because it matches the format used by email/calendar sync. Using other formats may create duplicate companies.
+
+#### Date
+
+**Problem:** Unrecognized date format
+**Solution:** Use consistent format throughout file
+
+```
+✓ 2024-03-15 (YYYY-MM-DD - recommended)
+✓ 03/15/2024 (MM/DD/YYYY)
+✓ 15/03/2024 (DD/MM/YYYY)
+```
+
+#### Phone
+
+**Problem:** Missing required columns
+**Solution:** Include all phone columns
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+#### Boolean
+
+**Problem:** Wrong boolean value
+**Solution:** Use uppercase `TRUE` or `FALSE`
+
+```
+❌ true
+❌ yes
+❌ 1
+✓ TRUE
+✓ FALSE
+```
+
+#### Select / Multi-Select
+
+**Problem:** Value doesn't match existing options
+**Solution:** Use **API names**, not display labels
+
+How to find API names:
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at bottom right)
+4. Use the API name (e.g., `OPTION_1`, not "Option 1")
+
+```
+❌ High Priority
+✓ HIGH_PRIORITY
+```
+
+#### Currency
+
+**Problem:** Missing amount or currency code
+**Solution:** Fill both columns
+
+| Column | Example |
+| --------------------- | --------- |
+| **Amount / Amount** | `1234.56` |
+| **Amount / Currency** | `USD` |
+
+#### Number
+
+**Problem:** Non-numeric characters
+**Solution:** Numbers only, period for decimals
+
+```
+❌ $1,234.56
+❌ 1,234.56
+✓ 1234.56
+```
+
+For complete format reference: [Field Mapping](/l/ja/user-guide/data-migration/capabilities/field-mapping)
+
+---
+
+## Error: Required Field Missing
+
+### What You'll See
+
+The row is highlighted in yellow with the required field cell marked.
+
+### What It Means
+
+A required field is empty for this row.
+
+### How to Fix
+
+**Option 1: Enter a value**
+
+1. Click the empty cell
+2. Enter a value
+3. Continue with import
+
+**Option 2: Remove the row**
+
+1. If you don't have the data, click X to skip the row
+
+### How to Prevent This Error
+
+Before importing, identify required fields:
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Check which fields are marked as required
+
+---
+
+## Error: Relation Not Found
+
+### What You'll See
+
+This error appears **after the import starts** — the import fails with a message like:
+
+```
+Can't connect to company. No unique record found with condition: id = 7776ee49-f608-4a77-8cc8-6fe96ae1e43f
+```
+
+This means there is no Company in Twenty with that specific identifier.
+
+Unlike other errors, this one is not caught during the data review step. The import will start and then fail when it encounters the missing relation.
+
+### What It Means
+
+You're trying to link to a record that doesn't exist in Twenty.
+
+### How to Fix
+
+**Option 1: Import parent records first**
+
+1. Cancel the current import
+2. Import the parent records (e.g., Companies)
+3. Then import the child records (e.g., People)
+
+**Option 2: Fix the reference value**
+
+1. Check the reference value in your file
+2. Ensure it exactly matches an existing record
+3. Verify format: domains should be `https://domain.com`
+
+**Option 3: Remove the relation**
+
+1. Clear the cell to import without the relation
+2. Add the relation manually later
+
+### How to Prevent This Error
+
+1. **Import in the correct order:**
+ * Companies first
+ * People second (with company references)
+ * Opportunities third
+
+2. **Verify reference values:**
+ * Export parent records to get exact identifiers
+ * Use domain format `https://domain.com`
+ * Check for typos and case sensitivity
+
+
+ **Import will fail if a reference is made to a non-existent record.**
+
+ Always import parent objects before child objects.
+
+
+For more details: [Import Relations](/l/ja/user-guide/data-migration/capabilities/import-relations)
+
+---
+
+## Error: File Too Large
+
+### What You'll See
+
+This error appears **when uploading your file** — the upload is blocked entirely:
+
+```
+Too many records. Up to 10000 allowed
+```
+
+You won't be able to proceed to the data review step until you reduce the file size.
+
+### What It Means
+
+Your file has more than 10,000 records.
+
+### How to Fix
+
+**Option 1: Split into multiple files**
+
+1. Divide your data into files of 10,000 records or fewer
+2. Import each file separately
+3. Maintain import order (Companies before People)
+
+**Option 2: Use API import**
+For very large datasets, use the API which has no record limit.
+See: [How to Import Data via API](/l/ja/user-guide/data-migration/how-tos/import-data-via-api)
+
+---
+
+## Error: Field Not Recognized
+
+### What It Means
+
+A column in your file can't be mapped because the field doesn't exist in Twenty.
+
+### How to Fix
+
+1. Go to **Settings → Data Model**
+2. Select the object you're importing
+3. Click **+ Add field**
+4. Create the custom field with the appropriate type
+5. Re-upload your file
+
+The CSV import creates records, not fields. All fields must exist before importing.
+
+---
+
+## Error: User Relation Empty
+
+### What It Means
+
+You're trying to assign a record to a user (Owner, Assignee) but the relation isn't being mapped.
+
+### Common Causes
+
+1. **User hasn't accepted their invitation** — the user doesn't exist in Twenty yet
+2. **Using user ID from old system** — Twenty can't match IDs from another system
+3. **Wrong email format** — the email doesn't match the user's Twenty account
+
+### How to Fix
+
+1. Ensure all users have **accepted their invitation** to your Twenty workspace
+2. Use the user's **email address** (not their name or old system ID)
+3. Use the same email they used to join Twenty
+
+
+ **Users must accept invitations before importing.**
+
+ If a user hasn't accepted their invitation, records referencing them will have empty user relations.
+
+
+---
+
+## Pre-Import Checklist
+
+Avoid errors by checking these before importing:
+
+### File Requirements
+
+File is CSV, XLSX, or XLS format
+File has fewer than 10,000 records
+File uses UTF-8 encoding
+
+### Data Quality
+
+No duplicate emails (for People)
+No duplicate domains (for Companies)
+All dates use consistent format
+All domains use `https://domain.com` format
+
+### Field Formats
+
+Boolean fields use `TRUE` or `FALSE` (uppercase)
+Select fields use API names, not display labels
+Phone fields have all required columns
+Currency fields have both Amount and Currency Code
+
+### Relations
+
+Parent records imported before child records
+Relation columns reference existing records
+Domain format matches Twenty's format exactly
+
+### Data Model
+
+All custom fields exist in Settings → Data Model
+Select options exist before importing
+
+---
+
+## Still Having Issues?
+
+If you've tried the above solutions:
+
+1. **Download the sample file** — see the exact format Twenty expects
+2. **Export existing records** — compare your file to working data
+3. **Test with a small batch** — try 5-10 rows first
+4. **Check the reference articles:**
+ * [Field Mapping](/l/ja/user-guide/data-migration/capabilities/field-mapping)
+ * [Uniqueness Constraints](/l/ja/user-guide/data-migration/capabilities/uniqueness-constraints)
+ * [Import Relations](/l/ja/user-guide/data-migration/capabilities/import-relations)
+ * [Error Handling](/l/ja/user-guide/data-migration/capabilities/error-handling)
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/import-companies-via-csv.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
new file mode 100644
index 0000000000..d330adf1e4
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
@@ -0,0 +1,201 @@
+---
+title: Import Companies via CSV
+description: Complete step-by-step guide to importing companies into Twenty.
+---
+
+## Overview
+
+This guide walks you through importing your companies into Twenty. **Companies should be imported first** because People and Opportunities link to Companies.
+
+## Before You Start
+
+### Prerequisites Checklist
+
+
+ Your file is CSV, XLSX, or XLS format
+
+
+
+ File has fewer than 10,000 records
+
+
+
+ No duplicate domains in your file
+
+
+
+ All custom fields exist in **Settings → Data Model**
+
+
+
+ Need to import more than 10,000 companies? Split into multiple files or use the [API import](/l/ja/user-guide/data-migration/how-tos/import-data-via-api).
+
+
+## Step 1: Prepare Your Company Data
+
+### Required and Recommended Fields
+
+| Field | Required? | Format | Notes |
+| ----------------- | ----------- | -------------------- | ------------------------ |
+| **Name** | Recommended | Text | Company display name |
+| **Domain** | Recommended | `https://domain.com` | Unique identifier |
+| **Address** | Optional | Multiple columns | See below |
+| **Employees** | Optional | Number | Employee count |
+| **Custom fields** | Optional | Varies | Must exist in Data Model |
+
+### Domain Format
+
+
+ **Use the format `https://domain.com` for domains.**
+
+ This matches the format used when Companies are auto-created from email/calendar sync, preventing duplicates later.
+
+
+**Domain columns:**
+
+* **Domain / Domain Label**: `acme.com`
+* **Domain / Domain URL**: `https://acme.com`
+
+### Address Format
+
+Address is a nested field with multiple columns:
+
+```
+Address / Address 1,Address / City,Address / State,Address / Country,Address / Post Code
+123 Main Street,San Francisco,CA,USA,94105
+```
+
+### Sample CSV Structure
+
+```csv
+name,Domain / Domain URL,Domain / Domain Label,Address / City,Address / Country,employees
+Acme Corp,https://acme.com,acme.com,San Francisco,USA,250
+Widget Co,https://widgets.co,widgets.co,New York,USA,50
+```
+
+
+ **Pro tip:** Click **Download sample file** during import to see the exact column names Twenty expects.
+
+
+## Step 2: Access the Import Feature
+
+**Option 1: From the Companies View**
+
+1. Navigate to **Companies** in the left sidebar
+2. Click the **⋮** icon on the top right
+3. Select **Import records**
+
+**Option 2: Using Command Menu**
+
+1. Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+2. Type "import"
+3. Select **Import records**
+4. Choose **Companies**
+
+## Step 3: Upload Your File
+
+1. Click **Select file**
+2. Choose your CSV, XLSX, or XLS file
+3. Wait for Twenty to analyze your file
+
+## Step 4: Map Your Columns
+
+Twenty automatically tries to match your columns to fields. Review and adjust:
+
+1. **Check automatic mappings** — verify they're correct
+2. **Fix incorrect mappings** — click the dropdown to select the right field
+3. **Skip columns** — select **Do not map** for columns you don't want to import
+
+### Important Mapping Rules
+
+* **Domain**: Map to **Domain / Domain URL** (not Domain Label)
+* **Address**: Map each part to its specific column (City, State, etc.)
+* **Select fields**: Values must match existing options (or you'll map them in the next step)
+
+
+
+## Step 5: Map Select Field Values
+
+If you have Select or Multi-Select fields:
+
+1. Twenty shows your values alongside existing options
+2. Match each value in your file to a Twenty option
+3. Or create new options if needed
+
+
+ Select options use **API names**, not display labels. Check **Settings → Data Model** → Enable **Advanced mode** to see API names.
+
+
+## Step 6: Review and Fix Errors
+
+Before completing the import, Twenty validates your data:
+
+1. Click **Next Steps**
+2. Rows with errors are highlighted in **yellow**
+3. **Fix errors directly** — click a cell and edit the value
+4. **Remove problematic rows** — click the X to skip that row
+
+### Common Company Import Errors
+
+| Error | Cause | Solution |
+| -------------------------- | ------------------------------- | ------------------------------------------ |
+| **Duplicate domain** | Domain already exists in Twenty | Remove from file or update existing record |
+| **Invalid domain format** | Wrong format | Use `https://domain.com` |
+| **Missing required field** | Required field is empty | Fill in the value or remove the row |
+
+## Step 7: Complete the Import
+
+1. Review the import summary
+2. Click **Confirm** to import
+3. Wait for the import to complete
+4. Verify by checking a few records
+
+## After Importing Companies
+
+Now you can import records that link to Companies:
+
+1. **[Import People](/l/ja/user-guide/data-migration/how-tos/import-contacts-via-csv)** — link them to Companies using the domain
+2. **Import Opportunities** — link them to Companies
+3. **Verify the import** — spot-check a few records to ensure data is correct
+
+## Updating Existing Companies
+
+To update companies instead of creating new ones:
+
+1. Include the `domain` or `id` column in your file
+2. Twenty matches records by this unique identifier
+3. Existing companies are updated; new ones are created
+
+See [How to Update Existing Records](/l/ja/user-guide/data-migration/how-tos/update-existing-records-via-import) for details.
+
+## FAQ
+
+
+
+ Domain is a unique identifier in Twenty. This prevents duplicate companies and ensures email sync correctly links emails to the right company.
+
+
+
+ You can leave the domain empty. However, we recommend adding domains when possible for better data quality and automatic email linking.
+
+
+
+ Yes! You can import companies first, then import People later and link them using the company domain.
+
+
+
+ If you include a unique identifier (domain or id) that matches an existing company, Twenty updates that company instead of creating a duplicate.
+
+
+
+ Either remove the duplicate from your file, or include the company's `id` to update the existing record instead.
+
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/ja/user-guide/data-migration/how-tos/fix-import-errors)
+* [Field Mapping Reference](/l/ja/user-guide/data-migration/capabilities/field-mapping)
+* [Uniqueness Constraints](/l/ja/user-guide/data-migration/capabilities/uniqueness-constraints)
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
new file mode 100644
index 0000000000..447e4da8c7
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
@@ -0,0 +1,242 @@
+---
+title: Import Contacts via CSV
+description: Complete step-by-step guide to importing people/contacts into Twenty.
+---
+
+## Overview
+
+This guide walks you through importing your contacts (People) into Twenty. **Import Companies first** if you want to link People to Companies.
+
+## Before You Start
+
+### Prerequisites Checklist
+
+
+ Your file is CSV, XLSX, or XLS format
+
+
+
+ File has fewer than 10,000 records
+
+
+
+ No duplicate email addresses in your file
+
+
+
+ **Companies imported first** (if linking People to Companies)
+
+
+
+ All custom fields exist in **Settings → Data Model**
+
+
+
+ **Import Companies Before People**
+
+ If you want to link People to Companies, import Companies first. The Company must exist before you can reference it.
+
+
+## Step 1: Prepare Your Contact Data
+
+### Required and Recommended Fields
+
+| Field | Required? | Format | Notes |
+| ----------------- | ----------- | ----------------- | ------------------------- |
+| **Email** | Recommended | `name@domain.com` | Must be unique |
+| **First Name** | Recommended | Text | |
+| **Last Name** | Recommended | Text | |
+| **Company** | Optional | Domain or ID | Links to existing Company |
+| **Phone** | Optional | Multiple columns | See below |
+| **Job Title** | Optional | Text | |
+| **Custom fields** | Optional | Varies | Must exist in Data Model |
+
+### Email Format
+
+* Must be valid email format: `name@domain.com`
+* **Must be unique** — no duplicates in your file or in Twenty
+* For additional emails, use the **Emails / Additional Emails** column:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Phone Format
+
+Phone is a **nested field** requiring multiple columns:
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+### Linking to Companies
+
+Add a column with the Company's unique identifier:
+
+| Column Name | Format | Example |
+| --------------- | ---------- | -------------------------------------- |
+| `companyDomain` | URL format | `https://acme.com` |
+| `companyId` | UUID | `c776ee49-f608-4a77-8cc8-6fe96ae1e43f` |
+
+
+ **Use Domain URL format** (`https://acme.com`), not the label. This matches how Companies are stored in Twenty.
+
+
+### Sample CSV Structure
+
+```csv
+firstName,lastName,email,jobTitle,companyDomain,Phones / Primary Phone Number,Phones / Primary Phone Country Code
+John,Smith,john@acme.com,CEO,https://acme.com,4159095555,US
+Jane,Doe,jane@widgets.co,CTO,https://widgets.co,2125551234,US
+```
+
+
+ **Pro tip:** Click **Download sample file** during import or export a few existing People to see the exact column names Twenty expects.
+
+
+## Step 2: Access the Import Feature
+
+**Option 1: From the People View**
+
+1. Navigate to **People** in the left sidebar
+2. Click the **⋮** icon on the top right
+3. Select **Import records**
+
+**Option 2: Using Command Menu**
+
+1. Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+2. Type "import"
+3. Select **Import records**
+4. Choose **People**
+
+## Step 3: Upload Your File
+
+1. Click **Select file**
+2. Choose your CSV, XLSX, or XLS file
+3. Wait for Twenty to analyze your file
+
+## Step 4: Map Your Columns
+
+Twenty automatically tries to match your columns to fields. Review and adjust:
+
+1. **Check automatic mappings** — verify they're correct
+2. **Fix incorrect mappings** — click the dropdown to select the right field
+3. **Skip columns** — select **Do not map** for columns you don't want to import
+
+### Important Mapping Rules
+
+| Column Type | Map To | Notes |
+| ----------------- | ------------------------------ | ---------------------------------- |
+| Company reference | **Company** relation field | Use domain OR id, not both |
+| Email | **Email** | Primary email address |
+| Additional emails | **Emails / Additional Emails** | Array format |
+| Phone | Separate columns | Number, Country Code, Calling Code |
+
+
+
+### Mapping the Company Relation
+
+When mapping the company column:
+
+1. Find your company reference column (e.g., `companyDomain`)
+2. Map it to the **Company** relation field
+3. Twenty will link each Person to the matching Company
+
+
+ **Map only ONE unique identifier for relations.**
+
+ Don't map both `companyId` AND `companyDomain`. Choose one—preferably domain since it's human-readable.
+
+
+## Step 5: Map Select Field Values
+
+If you have Select or Multi-Select fields (like Lead Source):
+
+1. Twenty shows your values alongside existing options
+2. Match each value in your file to a Twenty option
+3. Or create new options if needed
+
+
+ Select options use **API names**, not display labels. Check **Settings → Data Model** → Enable **Advanced mode** to see API names.
+
+
+## Step 6: Review and Fix Errors
+
+Before completing the import, Twenty validates your data:
+
+1. Click **Next Steps**
+2. Rows with errors are highlighted in **yellow**
+3. **Fix errors directly** — click a cell and edit the value
+4. **Remove problematic rows** — click the X to skip that row
+
+### Common Contact Import Errors
+
+| Error | Cause | Solution |
+| -------------------------- | -------------------------------------- | ------------------------------------------- |
+| **Duplicate email** | Email already exists in Twenty or file | Remove duplicate or update existing record |
+| **Invalid email format** | Email format incorrect | Fix to `name@domain.com` |
+| **Relation not found** | Company doesn't exist | Import Companies first or fix the reference |
+| **Missing required field** | Required field is empty | Fill in the value or remove the row |
+
+## Step 7: Complete the Import
+
+1. Review the import summary
+2. Click **Confirm** to import
+3. Wait for the import to complete
+4. Verify by checking a few records and their Company links
+
+## After Importing Contacts
+
+Your contacts are now in Twenty! Next steps:
+
+1. **Verify Company links** — open a few People records to confirm they're linked to the right Company
+2. **Import Opportunities** — if needed, link them to People and Companies
+3. **Set up email sync** — connect your mailbox to see email history on contact records
+
+## Updating Existing Contacts
+
+To update contacts instead of creating new ones:
+
+1. Include the `email` or `id` column in your file
+2. Twenty matches records by this unique identifier
+3. Existing contacts are updated; new ones are created
+
+See [How to Update Existing Records](/l/ja/user-guide/data-migration/how-tos/update-existing-records-via-import) for details.
+
+## FAQ
+
+
+
+ Email is a unique identifier in Twenty. This prevents duplicate contacts and ensures email sync correctly links emails to the right person.
+
+
+
+ You can leave the email empty. However, we recommend adding emails when possible for better data quality and email sync functionality.
+
+
+
+ Add a column with the Company's domain (e.g., `https://acme.com`) or ID. During mapping, connect this column to the Company relation field.
+
+
+
+ Import Companies first, then import People. The Company must exist before you can reference it.
+
+
+
+ Yes! Create a custom field marked as "unique" in your data model to store the external ID. Note: the field name `id` is reserved for Twenty's internal ID.
+
+
+
+ The Company you're referencing doesn't exist. Either import the Company first, or check that the domain/ID exactly matches an existing Company.
+
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/ja/user-guide/data-migration/how-tos/fix-import-errors)
+* [How to Import Relations](/l/ja/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+* [Field Mapping Reference](/l/ja/user-guide/data-migration/capabilities/field-mapping)
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/import-data-via-api.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/import-data-via-api.mdx
new file mode 100644
index 0000000000..17e5402632
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/import-data-via-api.mdx
@@ -0,0 +1,176 @@
+---
+title: Import Data via API
+description: When and how to use Twenty's APIs for large-scale data imports.
+---
+
+## Overview
+
+Twenty provides both **GraphQL** and **REST APIs** for programmatic data import. Use the API when CSV import isn't practical for your data volume or when you need automated, recurring imports.
+
+## When to Use API Import
+
+| Scenario | Recommended Method |
+| ---------------------------------- | ----------------------------- |
+| Under 10,000 records | CSV Import |
+| 10,000 - 50,000 records | CSV Import (split into files) |
+| **50,000+ records** | **API Import** |
+| One-time migration | Either (based on volume) |
+| **Recurring imports** | **API Import** |
+| **Real-time sync** | **API Import** |
+| **Integration with other systems** | **API Import** |
+
+For datasets in the hundreds of thousands, the API is significantly faster and more reliable than multiple CSV imports.
+
+## API Rate Limits
+
+Twenty enforces rate limits to ensure system stability:
+
+| Limit | Value |
+| -------------------------- | --------------------- |
+| **Requests per minute** | 100 |
+| **Records per batch call** | 60 |
+| **Maximum throughput** | ~6,000 records/minute |
+
+
+ **Plan your import around these limits.**
+
+ For 100,000 records at maximum throughput, expect approximately 17 minutes of import time. Add buffer time for error handling and retries.
+
+
+## Getting Started
+
+### Step 1: Get Your API Key
+
+1. Go to **Settings → Developers**
+2. Click **+ Create API key**
+3. Give your key a descriptive name
+4. Copy the API key immediately (it won't be shown again)
+5. Store it securely
+
+
+ **Keep your API key secret.**
+
+ Anyone with your API key can access and modify your workspace data. Never commit it to code repositories or share it publicly.
+
+
+### Step 2: Choose Your API
+
+Twenty supports two API types:
+
+| API | Best For | Documentation |
+| ----------- | ----------------------------------------------------------- | ------------------------------------------------ |
+| **GraphQL** | Flexible queries, fetching related data, complex operations | [API Docs](/l/ja/developers/extend/capabilities/apis) |
+| **REST** | Simple CRUD operations, familiar REST patterns | [API Docs](/l/ja/developers/extend/capabilities/apis) |
+
+Both APIs support:
+
+* Creating, reading, updating, and deleting records
+* **Batch operations** — create or update up to 60 records per call
+
+**For imports, use batch operations** to maximize throughput within rate limits.
+
+### Step 3: Plan Your Import Order
+
+Just like CSV imports, **order matters** for relations:
+
+1. **Companies** first (no dependencies)
+2. **People** second (can link to Companies)
+3. **Opportunities** third (can link to Companies and People)
+4. **Tasks/Notes** (can link to any of the above)
+5. **Custom objects** (following their dependencies)
+
+## Best Practices
+
+### Batch Your Requests
+
+* Don't send records one at a time
+* Group up to **60 records per API call**
+* This maximizes throughput within rate limits
+
+### Handle Rate Limits
+
+* Implement delays between requests (600ms minimum for sustained imports)
+* Use exponential backoff when you hit limits
+* Monitor for 429 (Too Many Requests) responses
+
+### Validate Data First
+
+* Clean and validate your data before importing
+* Check required fields are populated
+* Verify formats match Twenty's requirements (see [Field Mapping](/l/ja/user-guide/data-migration/capabilities/field-mapping))
+
+### Log Everything
+
+* Log every record imported (including IDs)
+* Log errors with full context
+* This helps debug issues and verify completion
+
+### Test First
+
+* Test with a small batch (10-20 records)
+* Verify data appears correctly in Twenty
+* Then run the full import
+
+### Upsert to Avoid Duplicates
+
+The GraphQL API supports **batch upsert** — update if the record exists, create if not. This prevents duplicates when re-running imports.
+
+## Finding Object and Field Names
+
+To see available objects and fields:
+
+1. Go to **Settings → API and Webhooks**
+2. Browse the **Metadata API**
+3. View all standard and custom objects with their fields
+
+The documentation shows all standard and custom objects, their fields, and the expected data types.
+
+## Professional Services
+
+For complex API migrations, our partners can help:
+
+| Service | What's Included |
+| ----------------------- | ---------------------------------- |
+| **Data Model Design** | design your optimal data structure |
+| **Migration Scripts** | write and run the import scripts |
+| **Data Transformation** | handle complex mapping and cleanup |
+| **Validation & QA** | verify the migration is complete |
+
+**Best for:**
+
+* Migrations of 100,000+ records
+* Complex data transformations
+* Tight timelines
+* Teams without developer resources
+
+Contact us at [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/ja/user-guide/getting-started/capabilities/implementation-services).
+
+## FAQ
+
+
+
+ GraphQL lets you request exactly the data you need in a single query and is better for complex operations. REST uses standard HTTP methods (GET, POST, PUT, DELETE) and may be more familiar if you've worked with traditional APIs.
+
+
+
+ Yes! Use update mutations (GraphQL) or PUT/PATCH requests (REST) with the record's `id`.
+
+
+
+ Query for existing records first using unique identifiers (email, domain). Update if exists, create if not.
+
+
+
+ Yes, use delete mutations (GraphQL) or DELETE requests (REST).
+
+
+
+ Not currently, but both APIs work with any HTTP client in any language.
+
+
+
+## API Documentation
+
+For full implementation details, code examples, and schema reference:
+
+* [API Documentation](/l/ja/developers/extend/capabilities/apis)
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx
new file mode 100644
index 0000000000..562620b68f
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx
@@ -0,0 +1,228 @@
+---
+title: Import Relations Between Objects via CSV
+description: Complete step-by-step guide to linking records during CSV import.
+---
+
+## Overview
+
+This guide walks you through importing relations between objects—for example, linking People to Companies, or Opportunities to People.
+
+**What can be imported:** Only one-to-many relations pointing to a single object type. Relations pointing to multiple object types (like Notes linking to People AND Companies) are not yet supported for import.
+
+## Understanding Relations
+
+### What is a "One-to-Many" Relation?
+
+In a one-to-many relation:
+
+* **One** Company has **many** People (employees)
+* **One** Company has **many** Opportunities
+* **One** Person has **many** Tasks
+
+The "one" side is the **parent**. The "many" side is the **child**.
+
+### Common Relations in Twenty
+
+| Relation | "One" Side (Parent) | "Many" Side (Child) |
+| ------------------------- | ------------------- | ------------------- |
+| Companies → People | Company | People |
+| Companies → Opportunities | Company | Opportunities |
+| People → Tasks | Person | Tasks |
+| People → Notes | Person | Notes |
+
+## Step 1: Identify the "One" and "Many" Sides
+
+Before importing, determine which object is the parent and which is the child.
+
+**Ask yourself:** "Does ONE [Object A] have MANY [Object B]?"
+
+* One Company → Many People ✓ (Company is parent)
+* One Person → Many Companies ✗ (This is wrong—a person belongs to one company)
+
+## Step 2: Import the Parent Records First
+
+The parent ("one" side) must exist in Twenty before you can reference it.
+
+**Import order:**
+
+1. **Companies** first (no dependencies)
+2. **People** second (link to Companies)
+3. **Opportunities** third (link to Companies and/or People)
+4. **Tasks/Notes** (link to any of the above)
+
+
+ **If the parent record doesn't exist, the import will fail.**
+
+ Always verify that Companies are imported before importing People with company references.
+
+
+## Step 3: Note the Parent's Unique Identifier
+
+You need to reference the parent record using a **unique identifier**. Available options:
+
+| Parent Object | Available Unique Identifiers |
+| --------------------- | --------------------------------------------------------------- |
+| **Companies** | `id` (UUID), `domain` (recommended), or any custom unique field |
+| **People** | `id` (UUID), `email`, or any custom unique field |
+| **Workspace Members** | `id` (UUID), `email` (not name) |
+| **Custom Objects** | `id` (UUID), or any field marked as unique |
+
+**Recommended:** Use `domain` for Companies and `email` for People. These are human-readable and easy to verify in your spreadsheet.
+
+### Finding the Identifier
+
+If you need the `id`:
+
+1. Export the parent records from Twenty
+2. The export includes the `id` column
+3. Use these IDs in your child records file
+
+## Step 4: Verify the Relation Field Exists
+
+Before importing, ensure the relation field exists between your objects.
+
+**To check or create:**
+
+1. Go to **Settings → Data Model**
+2. Select your child object (e.g., People)
+3. Look for a relation field pointing to the parent (e.g., Company)
+4. If it doesn't exist, create it:
+ * Click **+ Add field**
+ * Select **Relation** type
+ * Choose the parent object
+
+## Step 5: Prepare Your CSV File
+
+Add a column to your child CSV that references the parent using its unique identifier.
+
+### Example: People Linking to Companies
+
+**Your People CSV:**
+
+```csv
+firstName,lastName,email,jobTitle,companyDomain
+John,Smith,john@acme.com,CEO,https://acme.com
+Jane,Doe,jane@widgets.co,CTO,https://widgets.co
+Bob,Johnson,bob@techstart.io,Developer,https://techstart.io
+```
+
+The `companyDomain` column references the Company's domain.
+
+### Format Requirements
+
+| Identifier | Format | Example |
+| ---------- | -------------- | -------------------------------------- |
+| Domain | URL format | `https://acme.com` |
+| Email | Standard email | `john@acme.com` |
+| ID | UUID | `c776ee49-f608-4a77-8cc8-6fe96ae1e43f` |
+
+
+ **Domain format matters!**
+
+ Use `https://domain.com` (not just `domain.com`). This matches how Twenty stores Company domains and prevents matching errors.
+
+
+### Important Rules
+
+1. **Exact match required** — the value must exactly match the parent record
+2. **Map only ONE unique identifier** — don't include both `companyId` AND `companyDomain`
+3. **Case sensitive** — `Acme.com` ≠ `acme.com`
+
+## Step 6: Upload and Map the Relation
+
+1. Navigate to the child object (e.g., People)
+2. Click **⋮** → **Import records**
+3. Upload your CSV file
+4. In the field mapping step:
+ * Find your relation column (e.g., `companyDomain`)
+ * Map it to the **Company** relation field
+5. Complete the remaining mapping
+6. Review errors and confirm
+
+Twenty will automatically link each child record to the matching parent.
+
+## Step 7: Verify the Import
+
+After importing:
+
+1. Open a few child records (e.g., People)
+2. Verify the relation field shows the correct parent (e.g., Company)
+3. Open a parent record and check the related records section
+
+## Common Mistakes to Avoid
+
+| Mistake | Problem | Solution |
+| -------------------------- | -------------------------------------------------- | ------------------------------------------------------- |
+| **Wrong import order** | Importing People before Companies | Always import parents first, then children |
+| **Wrong domain format** | Using `acme.com` instead of `https://acme.com` | Use full URL format with `https://` |
+| **Multiple unique fields** | Mapping both `companyId` AND `companyDomain` | Map only ONE unique identifier |
+| **Missing relation field** | The relation field doesn't exist in the data model | Create it in **Settings → Data Model** before importing |
+| **Non-existent records** | The parent record doesn't exist in Twenty | Import parent records first, or check for typos |
+| **Case mismatch** | `Acme.com` in file but `acme.com` in Twenty | Ensure exact case matching |
+
+## Linking to Workspace Members
+
+When linking to Workspace Members (your team):
+
+* Use their **email address**, not their name
+* Example: `owner@yourcompany.com`, not "John Smith"
+
+```csv
+taskName,assignedTo
+Follow up with client,john@yourcompany.com
+Review proposal,jane@yourcompany.com
+```
+
+## FAQ
+
+
+
+ You have two options:
+
+ 1. Use the Twenty `id` (export parent records to get their IDs)
+ 2. Create a custom unique field in your data model to store an external ID from your previous system
+
+
+
+ Yes! Include the child record's unique identifier (e.g., `email` for People) and the new relation value. The import will update the relation.
+
+
+
+ Many-to-Many relations are not yet supported for import. This is planned for H1 2026.
+
+
+
+ Relations pointing to multiple object types are not yet supported for import/export. This is on our roadmap.
+
+
+
+ The import will show an error for that row. You can either:
+
+ * Import the parent record first, then re-import
+ * Fix the reference value
+ * Remove the row from import
+
+
+
+ Common causes:
+
+ * Wrong format (use `https://domain.com` for domains)
+ * Case mismatch (check exact spelling)
+ * Parent doesn't exist (import parents first)
+ * Mapping multiple identifiers (use only one)
+
+
+
+
+ **Remember: Soft-deleted records count toward uniqueness.**
+
+ If you're getting "not found" errors but the record seems to exist, check Command Menu → See deleted records. The parent may have been soft-deleted.
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/ja/user-guide/data-migration/how-tos/fix-import-errors)
+* [Import Relations Capabilities](/l/ja/user-guide/data-migration/capabilities/import-relations)
+* [Uniqueness Constraints](/l/ja/user-guide/data-migration/capabilities/uniqueness-constraints)
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
new file mode 100644
index 0000000000..65bf3cf811
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
@@ -0,0 +1,293 @@
+---
+title: Migrating from Other CRMs
+description: Step-by-step guide to migrate your data from any CRM to Twenty.
+---
+
+## Overview
+
+This guide walks you through migrating your data from any CRM to Twenty. The process involves auditing your data, preparing your Twenty workspace, exporting from your current system, and importing into Twenty.
+
+Views, workflows, and permissions must be recreated manually after migration. Plan time for this configuration work.
+
+## Step 1: Audit Your Current Data
+
+Migration is an opportunity for a fresh start. Don't bring over clutter.
+
+**What to keep:**
+
+* Active contacts and companies
+* Open opportunities and deals
+* Important notes and activities
+* Custom fields you actually use
+
+**What to leave behind:**
+
+* Outdated contacts (no activity in 2+ years)
+* Duplicate records
+* Test data
+* Unused custom fields
+
+## Step 2: Map Your Data Model
+
+Create a mapping document between your current CRM and Twenty:
+
+| Your CRM | Twenty |
+| ---------------------- | -------------------- |
+| Account / Organization | **Company** |
+| Contact / Person | **People** |
+| Deal / Opportunity | **Opportunity** |
+| Activity | **Task** or **Note** |
+| Custom Object | **Custom Object** |
+
+**For each field, document:**
+
+* The source field name
+* The target Twenty field
+* Any format transformations needed (dates, phone numbers, etc.)
+
+Keep this mapping document handy during import—you'll reference it when mapping columns.
+
+## Step 3: Set Up Your Twenty Workspace
+
+Before importing data, prepare your Twenty workspace:
+
+### Create Custom Objects and Fields
+
+1. Go to **Settings → Data Model**
+2. Create any custom objects you need
+3. Add custom fields to standard and custom objects
+4. Configure field settings (unique, required, select options, etc.)
+
+
+ **Fields must exist before import.**
+
+ The CSV import creates records, not fields. Create all custom fields in Settings → Data Model before importing.
+
+
+### Invite Your Team
+
+
+ **Invite users BEFORE importing data.**
+
+ If your data includes user references (Account Owner, Assignee, etc.), those users must exist in Twenty before import. Otherwise, those relations cannot be mapped.
+
+
+1. Go to **Settings → Members**
+2. Invite all team members
+3. **Wait for everyone to accept** their invitation
+4. Verify all users appear in your Members list
+
+## Step 4: Export from Your Current CRM
+
+Export your data from your current CRM:
+
+1. Look for an **Export** function (usually under Settings, Data Management, or Admin)
+2. Export to **CSV format** when possible
+3. Export each object type separately (Companies, Contacts, Deals, etc.)
+4. Include all fields you want to migrate
+
+**Export these objects (in this order for reference):**
+
+1. Companies / Accounts / Organizations
+2. Contacts / People
+3. Deals / Opportunities
+4. Notes and Activities
+5. Custom objects
+
+## Step 5: Clean and Format Your Data
+
+Open each exported CSV in a spreadsheet application and prepare it for Twenty.
+
+### Remove Duplicates
+
+1. Sort by the unique field (email for People, domain for Companies)
+2. Remove or merge duplicate rows
+3. Verify no duplicates exist in Twenty already
+
+### Format Fields Correctly
+
+| Field Type | Required Format |
+| ----------------- | ------------------------------------------------- |
+| **Domain** | `https://domain.com` |
+| **Email** | `name@domain.com` (must be unique) |
+| **Date** | `YYYY-MM-DD` |
+| **Phone** | Three columns: Number, Country Code, Calling Code |
+| **Boolean** | `TRUE` or `FALSE` (uppercase) |
+| **Select fields** | Use API names, not display labels |
+
+
+ **Domain format is critical.**
+
+ Use `https://domain.com` (not `domain.com` or `www.domain.com`). This matches Twenty's format and prevents duplicates when you connect email/calendar sync.
+
+
+See [How to Prepare Your CSV Files](/l/ja/user-guide/data-migration/how-tos/prepare-your-csv-files) for complete formatting requirements for all field types.
+
+### Add Relation Columns
+
+To link records (e.g., People to Companies), add a column with the parent's unique identifier.
+
+**Example: People CSV with Company link**
+
+```csv
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+See [How to Import Relations](/l/ja/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for detailed instructions on linking records.
+
+### Update User References
+
+If your data includes user assignments (Owner, Assignee):
+
+1. Add a column with the **user's email** (not just their ID from the old system)
+2. Use the same email addresses that users used to join your Twenty workspace
+
+See [How to Prepare Your CSV Files](/l/ja/user-guide/data-migration/how-tos/prepare-your-csv-files) for complete formatting guide.
+
+## Step 6: Import to Twenty
+
+
+ **Import Order Matters!**
+
+ Always import in this order:
+
+ 1. **Companies** first (no dependencies)
+ 2. **People** second (link to Companies)
+ 3. **Opportunities** third (link to Companies/People)
+ 4. **Notes and Tasks** (link to records)
+ 5. **Custom objects** following their dependencies
+
+ The parent record must exist before you can reference it.
+
+
+### Import Each Object
+
+For each CSV file, in order:
+
+1. Navigate to the object in Twenty
+2. Click **⋮ → Import records**
+3. Upload the CSV file
+4. Map columns to fields:
+ * Map user email columns to the appropriate relation fields
+ * Map relation columns (like `companyDomain`) to relation fields
+5. Review and fix any errors in the UI
+6. Confirm the import
+7. Verify a few records before proceeding to the next file
+
+**Detailed guides:**
+
+* [How to Import Companies](/l/ja/user-guide/data-migration/how-tos/import-companies-via-csv)
+* [How to Import Contacts](/l/ja/user-guide/data-migration/how-tos/import-contacts-via-csv)
+* [How to Import Relations](/l/ja/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+
+## Step 7: Large Migrations (50,000+ Records)
+
+For large migrations:
+
+| Volume | Recommended Approach |
+| ----------------------- | ----------------------------- |
+| Under 10,000 records | Single CSV import |
+| 10,000 - 50,000 records | Split into multiple CSV files |
+| 50,000+ records | Use the API |
+
+**For API imports:**
+
+* Faster and more reliable for large datasets
+* Supports batch operations (up to 60 records per call)
+* See [How to Import Data via API](/l/ja/user-guide/data-migration/how-tos/import-data-via-api)
+
+## Step 8: Post-Migration Setup
+
+After importing data, complete your workspace configuration:
+
+### Recreate Views
+
+* Set up saved views with filters, sorts, and column configurations
+* Create any kanban or calendar views you need
+
+### Recreate Workflows
+
+* Rebuild your automations in **Settings → Workflows**
+* Start with the most critical workflows
+* Test each one before relying on it
+
+### Configure Roles and Permissions
+
+* Set up roles in **Settings → Roles**
+* Assign users to appropriate roles
+
+### Connect Email and Calendar
+
+* Each user connects their own account in **Settings → Accounts**
+* Twenty will start syncing emails to contact records
+* See [Email & Calendar](/l/ja/user-guide/calendar-emails/overview)
+
+### Train Your Team
+
+* Walk through the new interface together
+* Document any team-specific processes
+
+## Common Issues and Solutions
+
+| Issue | Cause | Solution |
+| ----------------------- | --------------------------- | ------------------------------------------------------------------------------------ |
+| **Duplicate errors** | Email/domain already exists | Remove duplicates from file, or include unique identifier to update existing records |
+| **Relation not found** | Parent record doesn't exist | Import parent objects first (Companies before People) |
+| **Missing fields** | Custom field doesn't exist | Create field in Settings → Data Model before importing |
+| **Select field errors** | Using display labels | Use API names (enable Advanced mode in Settings to find them) |
+| **User relation empty** | User hasn't accepted invite | Ensure all users accept invitations before importing |
+
+See [How to Fix Import Errors](/l/ja/user-guide/data-migration/how-tos/fix-import-errors) for detailed troubleshooting steps.
+
+## Post-Migration Checklist
+
+### Data Integrity
+
+All records imported (compare counts with source system)
+Relations working correctly (People linked to Companies)
+User assignments mapped correctly (Owner, Assignee)
+Custom fields populated
+No unexpected duplicates
+
+### Configuration
+
+Views recreated
+Workflows recreated and tested
+Roles and permissions configured
+Email/calendar sync connected
+
+### Team Readiness
+
+Team trained on new system
+Old CRM access plan decided (keep for reference? When to disable?)
+
+## FAQ
+
+
+
+ Not currently. Workflows must be recreated manually in Twenty.
+
+
+
+ File attachments are not included in CSV exports. You'll need to re-upload them manually, migrate via API, or contact our team for assistance.
+
+
+
+ Yes, we recommend keeping your old CRM running until you've verified the migration is complete. Just be careful not to create new data in both places.
+
+
+
+ Depends on data volume and complexity. Small migrations (under 10,000 records) can be done in a few hours. Large migrations may take several days including data cleanup and testing.
+
+
+
+## Need Help?
+
+For complex migrations or large datasets:
+
+* **Guided setup:** Book a 4-hour onboarding pack
+* **Full migration service:** Our partners can handle the entire migration
+
+Contact [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/ja/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx
new file mode 100644
index 0000000000..dc1baa38a4
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx
@@ -0,0 +1,171 @@
+---
+title: Migrating from Self-Hosted to Cloud
+description: Step-by-step guide to migrate your Twenty self-hosted instance to Twenty Cloud.
+---
+
+## Overview
+
+This guide walks you through migrating your data from a Twenty self-hosted instance to Twenty Cloud. The process involves setting up your cloud workspace, exporting your data, and re-importing it.
+
+Views, workflows, and roles must be recreated manually after migration. Plan time for this configuration work.
+
+## Step 1: Create Your Cloud Workspace
+
+1. Go to [app.twenty.com](https://app.twenty.com) and create a new workspace
+2. Complete the initial setup wizard
+3. Note your new workspace URL
+
+## Step 2: Recreate Your Data Model
+
+Before importing data, recreate your custom objects and fields:
+
+1. Go to **Settings → Data Model** in your cloud instance
+2. Create custom objects that match your self-hosted setup
+3. Add custom fields to standard and custom objects
+4. Configure field settings (unique, required, etc.)
+
+Take screenshots of your self-hosted data model for reference, or keep both instances open side by side.
+
+## Step 3: Invite All Users
+
+
+ **Critical: Invite users BEFORE importing data.**
+
+ Users must accept their invitations before you import any records that reference them (like Account Owner fields). If users don't exist yet, those relations cannot be mapped.
+
+
+1. Go to **Settings → Members** in your cloud instance
+2. Invite all team members who had accounts on self-hosted
+3. **Wait for everyone to accept** their invitation
+4. Verify all users appear in your Members list
+
+## Step 4: Export Data from Self-Hosted
+
+Export each object from your self-hosted instance:
+
+1. Navigate to each object (Companies, People, Opportunities, etc.)
+2. Configure the view to show **all columns** you want to migrate
+3. Click **⋮ → Export view**
+4. Save each CSV file with a clear name (e.g., `companies-export.csv`)
+
+**Export in this order** (for reference when importing):
+
+1. Companies
+2. People
+3. Opportunities
+4. Custom objects (following their dependencies)
+5. Tasks, Notes
+
+## Step 5: Update Workspace Member References
+
+The exported CSVs contain user IDs from your self-hosted instance. These IDs won't match your cloud instance, so you need to replace them with emails.
+
+**For each CSV file with user references (Owner, Assignee, etc.):**
+
+1. Open the CSV in a spreadsheet application
+2. Add a new column next to each user ID column (e.g., `accountOwnerEmail` next to `accountOwnerId`)
+3. Fill in the **email address** of each user
+4. You can delete the old ID column or leave it (it will be skipped during import)
+
+**Example:**
+
+Before:
+
+```csv
+name,domain,accountOwnerId
+Acme Corp,https://acme.com,old-uuid-123
+```
+
+After:
+
+```csv
+name,domain,accountOwnerEmail
+Acme Corp,https://acme.com,john@yourcompany.com
+```
+
+Use the same email addresses that users used to accept their cloud workspace invitation.
+
+## Step 6: Plan Your Import Order
+
+Import files in the correct order to maintain relationships:
+
+1. **Companies** first (no dependencies)
+2. **People** second (link to Companies)
+3. **Opportunities** third (link to Companies and People)
+4. **Custom objects** (following their dependencies)
+5. **Tasks and Notes** last (link to other records)
+
+See [How to Import Relations](/l/ja/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for details on maintaining relationships.
+
+## Step 7: Import to Cloud
+
+For each CSV file, in order:
+
+1. Navigate to the object in your cloud instance
+2. Click **⋮ → Import records**
+3. Upload the CSV file
+4. Map columns to fields:
+ * Map user email columns to the appropriate relation fields
+ * Map other columns as usual
+5. Review and fix any errors
+6. Confirm the import
+7. Verify a few records before proceeding to the next file
+
+## Step 8: Recreate Configuration
+
+After importing data, manually recreate:
+
+### Views
+
+* Recreate saved views with filters, sorts, and column configurations
+* Set up any kanban or calendar views
+
+### Workflows
+
+* Recreate automations in **Settings → Workflows**
+* Test each workflow before relying on it
+
+### Roles and Permissions
+
+* Configure roles in **Settings → Roles**
+* Assign users to appropriate roles
+
+### Integrations
+
+* Reconnect email and calendar sync for each user
+* Reconfigure any API integrations with new API keys
+
+## Post-Migration Checklist
+
+All data imported successfully
+Relations between objects working correctly
+User assignments (Owner, Assignee) mapped correctly
+Views recreated
+Workflows recreated and tested
+Roles and permissions configured
+Email/calendar sync reconnected
+API integrations updated with new keys
+
+## FAQ
+
+
+
+ Not currently. Workflows must be recreated manually in your cloud instance.
+
+
+
+ File attachments are not included in CSV exports. You'll need to re-upload any attachments manually, migrate them via API or contact our team for assistance with large migrations.
+
+
+
+ Yes, we recommend keeping your self-hosted instance running until you've verified the cloud migration is complete. Just be careful not to create new data in both places.
+
+
+
+ Records referencing that user will fail to import or the relation will be empty. Ensure all users accept invitations before importing data.
+
+
+
+## Need Help?
+
+For complex migrations or large datasets, contact us at [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/ja/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
new file mode 100644
index 0000000000..6377c8783c
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
@@ -0,0 +1,270 @@
+---
+title: Prepare Your CSV Files
+description: Complete step-by-step guide to format your data for import into Twenty.
+---
+
+## Overview
+
+This guide walks you through preparing your CSV file for a successful import. Follow these steps in order to avoid errors.
+
+## Step 1: Check File Requirements
+
+Before you start, ensure your file meets these requirements:
+
+| Requirement | Details |
+| -------------- | ------------------------ |
+| **Format** | CSV, XLSX, or XLS |
+| **Size limit** | 10,000 records per file |
+| **Encoding** | UTF-8 recommended |
+| **Structure** | One object type per file |
+
+For datasets larger than 10,000 records, split into multiple files or use the [API import](/l/ja/user-guide/data-migration/how-tos/import-data-via-api).
+
+## Step 2: Download the Sample File
+
+**This is the most important step.** The sample file shows you the exact column names and format Twenty expects.
+
+1. Go to the object view (People, Companies, etc.)
+2. Click **⋮** → **Import records**
+3. Click **Download sample file**
+4. Use this file as your template
+
+**Pro tip:** Export a few existing records instead. This gives you real examples of how data should be formatted, and the column names will map automatically during import.
+
+## Step 3: Remove Duplicate Values
+
+Twenty enforces uniqueness on certain fields. Duplicates will cause import errors.
+
+| Object | Unique Fields |
+| ------------------ | ----------------------------------------- |
+| **People** | `id`, `email` |
+| **Companies** | `id`, `domain` |
+| **Custom objects** | `id`, plus any field you marked as unique |
+
+**Before importing:**
+
+1. Sort your spreadsheet by the unique field (email or domain)
+2. Remove or merge duplicate rows
+3. Check for duplicates that already exist in Twenty
+
+**Soft-deleted records count toward uniqueness.** Records in Command Menu → See deleted records will cause duplicate errors. Delete them permanently or restore and update them.
+
+## Step 4: Format Each Field Type Correctly
+
+Different field types require specific formats. Here's the complete reference:
+
+### Text Fields
+
+* No special formatting required
+* Leading/trailing spaces are automatically trimmed
+
+### Email Fields
+
+* Must be valid email format: `name@domain.com`
+* Must be unique (no duplicates in file or in Twenty)
+* For additional emails, use this format in the **Emails / Additional Emails** column:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Domain Fields
+
+* **Recommended format**: `https://domain.com`
+* This matches the format used by mailbox/calendar sync (prevents duplicates)
+* Fill both columns:
+ * **Domain / Domain Label**: `domain.com`
+ * **Domain / Domain URL**: `https://domain.com`
+* Must be unique within your file and in Twenty
+
+### Phone Fields
+
+Phone is a **nested field** requiring multiple columns:
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+### Address Fields
+
+Address is a **nested field** with multiple columns (some can be left empty):
+
+* **Address / Address 1**: Street address line 1
+* **Address / Address 2**: Street address line 2 (optional)
+* **Address / City**: City name
+* **Address / State**: State or province
+* **Address / Country**: Country name
+* **Address / Post Code**: Postal/ZIP code
+
+### Date Fields
+
+Use consistent formatting throughout your file:
+
+* `YYYY-MM-DD` (recommended): `2024-03-15`
+* `MM/DD/YYYY`: `03/15/2024`
+* `DD/MM/YYYY`: `15/03/2024`
+* ISO 8601: `2024-03-15T10:30:00Z`
+
+### Number Fields
+
+* Numbers only (no text)
+* Use period for decimals: `1234.56`
+* No thousands separators (not `1,234.56`)
+
+### Currency Fields
+
+Currency is a **nested field** requiring two columns that **both must be filled**:
+
+| Column | Example |
+| --------------------- | --------- |
+| **Amount / Amount** | `1234.56` |
+| **Amount / Currency** | `USD` |
+
+### Boolean Fields
+
+Use uppercase: `TRUE` or `FALSE`
+
+Lowercase `true` or `false` will not work.
+
+### Select Fields
+
+Use the **API name** of the option, not the display label.
+
+**How to find API names:**
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at bottom right)
+4. Copy the API name (e.g., `OPTION_1`, not "Option 1")
+
+New select options are not created automatically. Add them in **Settings → Data Model** before importing.
+
+### Multi-Select Fields
+
+Use API names in array format:
+
+```
+["VALUE1","VALUE2"]
+```
+
+### Array Fields
+
+Use JSON array format:
+
+```
+["value1","value2"]
+```
+
+### Rating Fields
+
+Use the format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, or `RATING_5`
+
+### Links/URL Fields
+
+Fill both columns:
+
+* **Links / Link Label**: `Twenty`
+* **Links / Link URL**: `https://twenty.com`
+
+For secondary links, use the **Links / Secondary Links** column:
+
+```
+[{"url":"https://twenty.com","label":"Twenty"}]
+```
+
+### JSON Fields
+
+Use valid JSON format:
+
+```
+{"key":"value","key2":"value2"}
+```
+
+### ID Fields
+
+* **Optional**: Twenty auto-generates IDs if not provided
+* **Format**: UUID (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`)
+* **Use case**: Include ID to update existing records instead of creating new ones
+
+## Step 5: Add Relation Columns (If Linking Records)
+
+To link records to other objects (e.g., People to Companies), add a column with the unique identifier of the related record.
+
+**Example**: Linking People to Companies
+
+Add a column to your People CSV:
+
+```
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+**Important rules for relations:**
+
+* The parent record must already exist in Twenty
+* Use the **Domain URL** format (`https://domain.com`), not the label
+* Map only ONE unique identifier (don't include both `companyId` AND `companyDomain`)
+* For Workspace Members, use their **email** (not name)
+
+
+ **Import Order Matters!**
+
+ Import the "one" side before the "many" side:
+
+ 1. **Companies** first
+ 2. **People** second (with company reference)
+ 3. **Opportunities** third
+
+ The parent record must exist before you can reference it.
+
+
+See [How to Import Relations](/l/ja/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for detailed instructions.
+
+## Step 6: Ensure Fields Exist in Twenty
+
+The import creates **records**, not **fields**. All fields you want to import must already exist in your data model.
+
+**Before importing:**
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Create any custom fields you need
+4. Note the exact field names (they must match your column headers)
+
+## Step 7: Final Checklist
+
+Before uploading your file, verify:
+
+File is CSV, XLSX, or XLS format
+File has fewer than 10,000 records
+Encoding is UTF-8
+No duplicate emails (for People) or domains (for Companies)
+Dates use consistent format throughout
+Domains use `https://domain.com` format
+Boolean fields use `TRUE` or `FALSE` (uppercase)
+Select fields use API names, not display labels
+All custom fields exist in Settings → Data Model
+Parent records imported before child records
+Relation columns reference existing records
+
+## Common Mistakes to Avoid
+
+| Mistake | Solution |
+| -------------------------------------------- | ------------------------------------- |
+| Using `true` instead of `TRUE` | Boolean values must be uppercase |
+| Using display labels for Select fields | Find and use API names in Settings |
+| Importing People before Companies | Always import parent objects first |
+| Missing currency code for Currency fields | Fill both Amount and Currency columns |
+| Wrong domain format | Use `https://domain.com` consistently |
+| Mapping multiple unique fields for relations | Map only ONE (domain OR id, not both) |
+
+## Next Steps
+
+Your file is ready! Now:
+
+* [Import Companies](/l/ja/user-guide/data-migration/how-tos/import-companies-via-csv) (import these first)
+* [Import Contacts](/l/ja/user-guide/data-migration/how-tos/import-contacts-via-csv)
+* [Fix any import errors](/l/ja/user-guide/data-migration/how-tos/fix-import-errors)
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx
new file mode 100644
index 0000000000..1d903a37c5
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx
@@ -0,0 +1,198 @@
+---
+title: Update Existing Records via Import
+description: Complete step-by-step guide to bulk updating records using CSV import.
+---
+
+## Overview
+
+Need to update many records at once? Instead of editing them one by one, use the CSV import to bulk update existing records.
+
+**Use cases:**
+
+* Update job titles for multiple people
+* Change company information in bulk
+* Add data to new custom fields
+* Correct data errors across many records
+
+## How It Works
+
+When you import a file containing a **unique identifier** that matches an existing record, Twenty updates that record instead of creating a duplicate.
+
+| If unique identifier... | Twenty will... |
+| -------------------------- | ------------------------------------------------ |
+| Matches an existing record | **Update** the existing record |
+| Doesn't match any record | **Create** a new record |
+| Is missing from your file | **Create** a new record (with auto-generated ID) |
+
+
+ **Multi-Select fields are overwritten, not merged.**
+
+ If a record has `Option A` and `Option B` selected, and you import `["Option C"]`, the record will only have `Option C` after import. The import replaces all previous selections—it does not add to them.
+
+ To keep existing values, include them all in your import: `["Option A","Option B","Option C"]`
+
+
+## Step 1: Export Your Current Data
+
+First, export the records you want to update:
+
+1. Navigate to the object (People, Companies, etc.)
+2. **Add the columns you need** — click **Options → Fields** to show the fields you want to update
+3. **Filter if needed** — narrow down to only the records you want to update
+4. Click **⋮** → **Export view**
+5. Save the CSV file
+
+**Why export first?** The exported file has the correct format, includes unique identifiers, and maps automatically during import.
+
+### What Gets Exported
+
+* All visible columns in your current view
+* The record's unique identifiers (`id`, `email`, `domain`)
+* Current field values you can modify
+
+## Step 2: Edit the CSV File
+
+Open the exported file in your spreadsheet application (Excel, Google Sheets, etc.):
+
+1. **Keep the unique identifier column** — don't delete `id`, `email`, or `domain`
+2. **Update the values** in the columns you want to change
+3. **Remove columns you don't need to update** (optional, but cleaner)
+4. **Don't change unique identifier values** — or Twenty will create new records
+
+### Example: Updating Job Titles
+
+**Exported file:**
+
+```csv
+id,email,firstName,lastName,jobTitle
+550e8400-e29b-41d4-a716-446655440001,john@acme.com,John,Smith,Sales Rep
+550e8400-e29b-41d4-a716-446655440002,jane@acme.com,Jane,Doe,Sales Rep
+550e8400-e29b-41d4-a716-446655440003,bob@acme.com,Bob,Johnson,Sales Rep
+```
+
+**After your edits:**
+
+```csv
+id,email,firstName,lastName,jobTitle
+550e8400-e29b-41d4-a716-446655440001,john@acme.com,John,Smith,Account Executive
+550e8400-e29b-41d4-a716-446655440002,jane@acme.com,Jane,Doe,Senior Account Executive
+550e8400-e29b-41d4-a716-446655440003,bob@acme.com,Bob,Johnson,Account Executive
+```
+
+
+ **Don't change the unique identifier values.**
+
+ If you change `john@acme.com` to `john.smith@acme.com`, Twenty will create a new record instead of updating the existing one.
+
+
+## Step 3: Import the Updated File
+
+1. Navigate to the object
+2. Click **⋮** → **Import records**
+3. Upload your edited CSV file
+4. **Ensure the unique identifier is mapped** — verify `email`, `domain`, or `id` is mapped correctly
+5. Review the field mappings
+6. Check for errors
+7. Click **Confirm**
+
+Twenty matches records by the unique identifier and updates them with new values.
+
+## Choosing the Right Unique Identifier
+
+| Object | Recommended | Alternative | Notes |
+| ------------------ | ---------------- | ----------- | ---------------------------- |
+| **People** | `email` | `id` | Email is human-readable |
+| **Companies** | `domain` | `id` | Domain is human-readable |
+| **Custom objects** | Any unique field | `id` | Use your custom unique field |
+
+**Use only ONE unique identifier.** Don't map both `email` AND `id`. This can cause confusion and errors.
+
+### Using Custom Unique Fields
+
+If you have a custom field marked as unique (like an external ID from another system):
+
+1. Include that field in your export and import
+2. Map it during import
+3. Twenty will match on that field
+
+## Step 4: Verify the Updates
+
+After importing:
+
+1. Open a few updated records
+2. Verify the changes were applied
+3. Check that no duplicate records were created
+
+## What About Fields Not in Your File?
+
+**Fields not included in your import file remain unchanged.**
+
+| Your file includes... | Result |
+| ---------------------------- | ------------------------------------------------------ |
+| `email`, `jobTitle` | Only `jobTitle` is updated; other fields stay the same |
+| `email`, `jobTitle`, `phone` | `jobTitle` and `phone` are updated |
+
+This means you only need to include the fields you want to change (plus the unique identifier).
+
+## Combining Updates and New Records
+
+You can update existing records AND create new ones in the same import:
+
+```csv
+email,firstName,lastName,jobTitle
+john@acme.com,John,Smith,Senior Manager ← Updates existing (email matches)
+newperson@acme.com,New,Person,Analyst ← Creates new (email doesn't match)
+```
+
+## Common Mistakes to Avoid
+
+| Mistake | Problem | Result | Solution |
+| ------------------------------ | ------------------------------------------------------- | -------------------------------------- | ----------------------------------------- |
+| **Changing unique identifier** | Changed `john@acme.com` to `john.smith@acme.com` | Creates new record instead of updating | Keep unique identifiers unchanged |
+| **Multiple unique fields** | Mapping both `email` AND `id` | Potential matching conflicts | Map only ONE unique identifier |
+| **No unique identifier** | File only has `firstName`, `lastName`, `jobTitle` | All rows create new records | Always include `email`, `domain`, or `id` |
+| **Case mismatch** | File has `John@acme.com` but Twenty has `john@acme.com` | Creates new record | Export from Twenty to get exact values |
+
+## FAQ
+
+
+
+ Records with unique identifiers that don't match existing records will be created as new records. This lets you update and create in the same import.
+
+
+
+ Yes, leave the cell empty in your CSV. The import will clear that field's value on the existing record.
+
+
+
+ Fields not in your import file remain unchanged on existing records. Only fields you include are updated.
+
+
+
+ Yes! Include the relation's unique identifier (e.g., `companyDomain`) and map it to the relation field. The relation will be updated.
+
+
+
+ During the import review step, Twenty shows you how many records will be updated vs. created based on unique identifier matches.
+
+
+
+ There's no automatic undo. We recommend exporting your data as a backup before making bulk updates.
+
+
+
+## Best Practices
+
+1. **Export first** — always start from an export to ensure correct format
+2. **Backup before updating** — export your data before making bulk changes
+3. **Test with a few records** — try updating 5-10 records first before doing a large batch
+4. **Use human-readable identifiers** — `email` and `domain` are easier to verify than `id`
+5. **Only include necessary columns** — fewer columns means less chance for errors
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/ja/user-guide/data-migration/how-tos/fix-import-errors)
+* [Uniqueness Constraints](/l/ja/user-guide/data-migration/capabilities/uniqueness-constraints)
+* [Field Mapping Reference](/l/ja/user-guide/data-migration/capabilities/field-mapping)
diff --git a/packages/twenty-docs/l/ja/user-guide/data-migration/overview.mdx b/packages/twenty-docs/l/ja/user-guide/data-migration/overview.mdx
new file mode 100644
index 0000000000..a1ddbce042
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-migration/overview.mdx
@@ -0,0 +1,89 @@
+---
+title: Data Migration
+description: Import and export your CRM data via CSV files or API.
+image: /images/user-guide/import-export-data/cloud.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+
+
+## Import Methods
+
+Twenty supports two main methods for importing data:
+
+| Method | Best For | Volume Limit |
+| -------------- | ------------------------------------ | ----------------------- |
+| **CSV Import** | Standard migrations, regular updates | 10,000 records per file |
+| **API Import** | Large-scale migrations, automation | Unlimited |
+
+For very large datasets (hundreds of thousands of records), use the API. Our [implementation partners](/l/ja/user-guide/getting-started/capabilities/implementation-services) can help run these scripts if needed.
+
+## CSV Import Basics
+
+You can import data for any object using CSV, XLSX, or XLS files. Each file should contain **only one type of object** (e.g., only People records).
+
+**Fields must exist before import.** Uploading a CSV creates records but does not create fields. If you need custom fields, create them first under **Settings → Data Model**.
+
+### Steps
+
+1. Navigate to the object where you want to import data
+2. Click the **⋮** icon on the top right (this is the Command Menu) and click on **Import records**
+3. Download the template file to ensure your data is in the expected format
+4. Upload your formatted CSV file
+5. Map your columns to Twenty fields
+6. Review errors (highlighted in yellow) and fix them, directly editing in the UI
+7. Confirm the import
+
+### Importing relations between objects
+
+You can import relations between objects using the csv import function. You need to reference the related object using a unique field from this object: the `id`, the `email` for People and Workspace Members, the `domain` for companies, any other field set as unique in the data model for any other object.
+
+**Deleted records count toward uniqueness.** Soft-deleted records (visible under Command Menu → See deleted records) are included in uniqueness checks. If you import a record with the same unique value as a deleted record, the deleted record will be restored.
+
+
+ **Import Order Matters!**
+
+ When importing related objects, upload files in this order:
+
+ 1. **Companies** first (the "one" side of relationships)
+ 2. **People** second (linked to companies via companyId)
+ 3. **Opportunities** third (linked to companies/people)
+ 4. **Custom objects** with relations last
+
+ Why? The "one" side of a one-to-many relationship must exist before you can reference it. For example, the Company record must exist before you import a Person with that company's ID.
+
+
+Please refer to [this article](/l/ja/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for a step-by-step guide on how to proceed.
+
+## Export Data
+
+Export your workspace data for backups, reporting, or migration.
+
+### Steps
+
+1. Navigate to the object you want to export
+2. Configure the view with the columns you need
+3. Click **⋮** → **Export view**
+4. Save the CSV file
+
+**Only visible columns are exported.** The CSV file will only contain the columns displayed in your current view. Add or hide columns before exporting to control what data is included.
+
+**Export limits**: Up to 20,000 records per export.
+
+## Permissions
+
+Data import and export require specific permissions:
+
+* **Import**: Requires "Import CSV" permission
+* **Export**: Requires "Export CSV" permission
+
+Contact your workspace admin if you don't have these permissions.
+
+## Next Steps
+
+* [Prepare your CSV files](/l/ja/user-guide/data-migration/how-tos/prepare-your-csv-files)
+* [Import relations between objects](/l/ja/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+* [Import via API for large datasets](/l/ja/user-guide/data-migration/how-tos/import-data-via-api)
diff --git a/packages/twenty-docs/l/ja/user-guide/data-model/capabilities/fields.mdx b/packages/twenty-docs/l/ja/user-guide/data-model/capabilities/fields.mdx
new file mode 100644
index 0000000000..ef477158c2
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-model/capabilities/fields.mdx
@@ -0,0 +1,122 @@
+---
+title: Fields
+description: Understand the role of fields and how to manage them.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## About Fields
+
+Fields are like columns in a spreadsheet. They store different types of data like text, numbers, or dates. Fields can be standard (built-in) or custom (the ones you create).
+
+### Standard Fields
+
+Standard fields come built-in with Twenty to handle common business needs.
+
+For example, `First Name` and `Last Name` are standard fields in the `People` object. They store text data for individual names.
+
+You cannot delete standard fields, but you can deactivate them if you don't need them.
+
+You can also customize the options of the standard `SELECT` type fields, for example the options for the `Stage` on Opportunities.
+
+
+
+### Custom Fields
+
+Custom fields can be added to any object. You can store text, numbers, dates, dropdown selections, and more. Use custom fields to track information that's specific to your business.
+
+For instance, a custom field for SpaceX could be `Rocket Active Status`, indicating if a rocket is operational.
+
+
+
+## Field Types
+
+Twenty supports various field types:
+
+| Type | Description | Example |
+| ------------ | ----------------------------------------------------------------- | ------------------ |
+| Address | Structured address with street, city, state, country, postal code | Office Address |
+| Array | List of text values | Tags |
+| Boolean | True/false checkbox | Is Active |
+| Currency | Monetary value with currency code | Deal Amount (USD) |
+| Date | Date values | Close Date |
+| Date & Time | Date with time | Meeting Time |
+| Domain | Website domain (used for Companies) | acme.com |
+| Email | Email addresses (with primary + additional) | Contact Email |
+| JSON | Structured JSON data | Custom metadata |
+| Links | URLs with labels (primary + secondary) | Website, LinkedIn |
+| Long Text | Multi-line text | Description, Notes |
+| Multi-Select | Multiple choices from a predefined list | Tags, Categories |
+| Number | Numeric values (integers or decimals) | Quantity, Score |
+| Phone | Phone numbers with country code | Work Phone |
+| Rating | Star rating (1-5) | Priority, Score |
+| Relation | Links to records in other objects | Company → People |
+| Select | Single choice from a predefined list | Stage, Status |
+| Text | Single line of text | Name, Title |
+
+## Create a Custom Field
+
+To add a custom field to any object, follow these steps:
+
+1. Go to `Settings` in the left sidebar.
+2. Go to `Data Model`, then select the object you wish to customize.
+3. Proceed by clicking on `Add Field`.
+4. Choose a field name and type that suits your requirements. Consider adding a field description for better understanding.
+
+Your newly created field is now available within the application's fields. To display it on a specific view, click on the options menu, then select `Fields`.
+
+
+
+**Quick way:** Click the **+** button at the top right of any object table, then select `Customize fields`. This takes you directly to the Data Model settings.
+
+
+
+## Deactivate a Field
+
+You can deactivate a field to hide it from the app without losing your data. Think of it as hiding the field rather than deleting it.
+
+Here's how you can do it:
+
+1. Find the field you want to deactivate in your object settings.
+
+2. Click the three dots `⋮` next to the field to open the menu.
+
+3. Select `Deactivate` from the dropdown.
+
+
+
+What happens when you deactivate a field?
+
+1. **In the app:** The field disappears and you can't add new values to it.
+
+2. **Existing relationships:** If it's a relation field, existing connections stay but you can't create new ones.
+
+3. **API access:** You can still access the field and its data through the API.
+
+You can reactivate Standard and Custom Fields or have the option to permanently delete them.
+
+## Make Fields Unique
+
+Make a field unique to ensure distinct records cannot have the same value. For example, email addresses are unique for each person.
+
+If you get an error when setting uniqueness, check for duplicate values in your data (including deleted records).
+
+## Field Configuration Best Practices
+
+### Naming Conventions and Limitations
+
+* **Singular and plural named must be distinct**: Our GraphQL API needs distinct names for mutations
+* **Protected field names**: some names are reserved for system usage (e.g., `Type`, `Application`)
+
+### Currency and Phone Fields
+
+* **Default currency**: can be configured via the data model
+* **Default country codes**: can be configured for phone fields via the data model
+
+### Select Fields
+
+* **A default option can be selected** for each Select field
+
+### Record Text Fields
+
+* **Each object has one main display field**: This field appears in the leftmost column and represents the record when linked to other objects. It must be a text field. For example, People uses `Name` as the main field, so when you link a person to a company, you'll see their name in the company's view.
diff --git a/packages/twenty-docs/l/ja/user-guide/data-model/capabilities/objects.mdx b/packages/twenty-docs/l/ja/user-guide/data-model/capabilities/objects.mdx
new file mode 100644
index 0000000000..f2f1105277
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-model/capabilities/objects.mdx
@@ -0,0 +1,91 @@
+---
+title: Objects
+description: Learn about standard and custom objects in Twenty.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Standard Objects
+
+Standard objects are predefined entities in your workspace to help you get started. They're part of a shared data model accessible to all users of Twenty. You can use them as-is, customize them or deactivate them.
+
+
+
+### People
+
+The `People` object stores your contacts. It includes contact details and interaction history, so you can see all your customer interactions in one place.
+
+### Company
+
+The `Companies` object stores your business accounts. It includes details like industry, size and location. Companies connect to both `People` and `Opportunities` objects.
+
+### Opportunities
+
+The `Opportunities` object stores deal-related data. It tracks the progression of potential sales, from prospecting to closure, recording stages, deal sizes, associated account, and expected close date. You can view your sales pipeline in a kanban layout.
+
+### Notes
+
+The `Notes` object stores free-form notes that can be attached to People, Companies, Opportunities, and other records. Use notes to capture meeting summaries, important details, or any contextual information.
+
+### Tasks
+
+The `Tasks` object stores to-dos and action items. Tasks can be linked to People, Companies, Opportunities, and other records. Track due dates, assignees, and completion status to stay on top of your follow-ups.
+
+## Custom Objects
+
+Custom objects let you store information that's unique to your organization and that standard objects can't handle. For example, if you're SpaceX, you may want to create a custom object for Rockets and Launches.
+
+
+
+### Creating a New Custom Object
+
+To create a new custom object:
+
+1. Go to Settings in the sidebar on the left.
+2. Under Workspace, go to Data model. Here you'll be able to see an overview of all your existing Standard and Custom objects (both active and disabled).
+
+
+
+3. Click on `+ New object` at the top. Enter the name (both singular and plural), choose an icon, and add a description for your custom object and hit Save (at the top right). Using Listing as an example of custom object, the singular would be "listing" and the plural would be "listings" along with a description like "Listings that hosts created to showcase their property."
+
+4. Your custom object is now created and will appear in your sidebar. You can start adding records to it right away.
+
+## Managing Objects
+
+### Deactivating Objects
+
+If you don't need a standard or custom object:
+
+1. Go to Settings → Data Model
+2. Find the object you want to deactivate
+3. Click the toggle to deactivate it
+4. The object will be hidden from your workspace but data is preserved
+
+### Reactivating Objects
+
+To bring back a deactivated object:
+
+1. Go to Settings → Data Model
+2. Look for deactivated objects (they'll be grayed out)
+3. Click the toggle to reactivate it
+4. The object and all its data will be restored
+
+## Best Practices
+
+### When to Create Custom Objects
+
+* **Unique business entities**: Things specific to your industry or process
+* **Complex relationships**: When you need to track connections between multiple entities
+* **Scalable data**: When you might have many instances of something
+
+### When to Use Fields Instead
+
+* **Simple attributes**: Properties that describe existing objects
+* **Categories or labels**: Ways to classify existing records
+* **Single values**: Information that doesn't need its own lifecycle
+
+### Object Naming
+
+* **Use clear, descriptive names**: Make it obvious what the object represents
+* **Follow conventions**: Use singular for the object name, plural for the collection
+* **Consider your team**: Choose names everyone will understand
diff --git a/packages/twenty-docs/l/ja/user-guide/data-model/capabilities/relation-fields.mdx b/packages/twenty-docs/l/ja/user-guide/data-model/capabilities/relation-fields.mdx
new file mode 100644
index 0000000000..ddcd3c709e
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-model/capabilities/relation-fields.mdx
@@ -0,0 +1,92 @@
+---
+title: Relation Fields
+description: Connect records across different objects using relation fields.
+---
+
+## Types of Relations
+
+### One-to-Many
+
+One record in Object A can be linked to many records in Object B.
+
+**Example:** One Company can have many People (employees).
+
+### Many-to-One
+
+Many records in Object A can be linked to one record in Object B.
+
+**Example:** Many People can belong to one Company.
+
+### Relations to Multiple Object Types
+
+Some objects can link to multiple object types on one side of the relation.
+
+**Example:** A Note can be attached to one Person AND one Company AND one Opportunity simultaneously. The Note is on the "many" side, connecting to multiple "one" sides.
+
+
+
+Similarly, a Project (on the "one" side) could receive links from multiple People, multiple Companies, and multiple Notes.
+
+
+
+
+ **Import/Export limitation**: Relations pointing to multiple object types are not yet supported for CSV import/export. This is on our roadmap.
+
+
+### Many-to-Many
+
+Many records in Object A can be linked to many records in Object B.
+
+**Example:** Many People can be linked to many Projects, and vice versa.
+
+
+ **Many-to-Many is not yet supported.**
+
+ This relation type is planned for H1 2026. As a workaround, create an intermediate "junction" object (e.g., "Project Assignments") that has Many-to-One relations to both objects.
+
+
+## Creating a Relation Field
+
+1. Go to **Settings → Data Model**
+2. Select the object where you want to add the relation
+3. Click **+ Add Field**
+4. Select **Relation** as the field type
+5. Choose the target object(s) to relate to
+6. Configure the relation settings:
+ * **Field name on source object**: The name of the relation field on the object you're editing
+ * **Field name on destination object**: The name of the relation field that will appear on the target object
+ * Relation type (one-to-many, many-to-one)
+7. Click **Save**
+
+## Standard Relations
+
+Twenty comes with pre-built relations between standard objects:
+
+| From Object | To Object | Relation Type |
+| ------------- | --------- | ------------- |
+| People | Companies | Many-to-One |
+| Opportunities | Companies | Many-to-One |
+| Opportunities | People | Many-to-One |
+
+## Best Practices
+
+### Planning Relations
+
+* **Map your data model**: Plan relations before creating them
+* **Consider direction**: Think about which object "owns" the relationship
+* **Avoid circular dependencies**: Keep your data model clean
+
+### Naming Relations
+
+* **Use clear names**: Make it obvious what the relation represents
+* **Be consistent**: Use similar naming patterns across relations
+* **Consider both sides**: Name both sides of the relation appropriately
+
+### Performance
+
+* **Don't over-relate**: Too many relations can slow down your workspace
+
+## Limitations
+
+* **Deleting relations** removes the link but not the related records
+* **Circular relations** should be avoided for data integrity
diff --git a/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/create-custom-fields.mdx b/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/create-custom-fields.mdx
new file mode 100644
index 0000000000..ad22653b85
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/create-custom-fields.mdx
@@ -0,0 +1,72 @@
+---
+title: Create Custom Fields
+description: Step-by-step guide to adding custom fields to any object.
+---
+
+Custom fields let you capture information specific to your business. Add them to any object—standard or custom.
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Select the object you want to add a field to
+3. Click **+ Add Field**
+4. Choose a **field type** (see [Fields](/l/ja/user-guide/data-model/capabilities/fields) for all types)
+5. Enter the **field name** and optional description
+6. Configure field-specific settings (see below)
+7. Click **Save**
+
+**Quick method:** Click the **+** at the end of column headers in any table view → **Customize fields**.
+
+## Show the Field in Views
+
+New fields aren't automatically visible. To display:
+
+1. Open the object's table view
+2. Click **Options → Fields**
+3. Click the **eye icon** next to your field to show it
+4. Drag to reorder
+
+## Configuration Options
+
+### For Select / Multi-Select
+
+1. Click **+ Add option** to create choices
+2. Set a **default option** if desired
+3. Drag to reorder options
+
+
+ **Use API names for imports.** Enable **Advanced mode** in Settings to see API names. See [Field Mapping](/l/ja/user-guide/data-migration/capabilities/field-mapping).
+
+
+### For Currency Fields
+
+Set the **default currency** (USD, EUR, etc.) for new records.
+
+### For Phone Fields
+
+Set the **default country code** to pre-fill for new phone numbers.
+
+### Making a Field Unique
+
+Toggle **Unique** to prevent duplicate values across records.
+
+
+ If duplicates exist (including in deleted records), you'll get an error. Clean up duplicates first.
+
+
+### Setting Default Values
+
+For Select fields, you can choose which option is pre-selected for new records. For Checkbox fields, set whether it's checked or unchecked by default.
+
+## Deactivating a Field
+
+1. Go to **Settings → Data Model**
+2. Find the field
+3. Click **⋮ → Deactivate**
+
+Data is preserved. You can reactivate or permanently delete later.
+
+## Related
+
+* [Fields](/l/ja/user-guide/data-model/capabilities/fields) — all field types explained
+* [Data Model FAQ](/l/ja/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/create-custom-objects.mdx b/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/create-custom-objects.mdx
new file mode 100644
index 0000000000..9de7ffaab1
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/create-custom-objects.mdx
@@ -0,0 +1,51 @@
+---
+title: Create Custom Objects
+description: Step-by-step guide to creating custom objects in Twenty.
+---
+
+Custom objects let you store information unique to your business that standard objects don't cover. For example: Projects, Products, Tickets, or Listings.
+
+
+ **Not sure if you need an object or a field?** See [Understanding Your Data Model](/l/ja/user-guide/data-model/overview) for guidance.
+
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Click **+ New object**
+3. Fill in:
+ * **Singular name** (e.g., "Listing")
+ * **Plural name** (e.g., "Listings")
+ * **Icon**
+ * **Description** (optional)
+4. Click **Save**
+
+Your object appears in the sidebar immediately.
+
+## Next: Add Fields
+
+New objects start with basic fields. Add custom fields to capture the data you need:
+
+1. In **Settings → Data Model**, select your object
+2. Click **+ Add Field**
+3. Choose a field type, configure, and save
+
+See [How to Create Custom Fields](/l/ja/user-guide/data-model/how-tos/create-custom-fields) for details on field types and configuration.
+
+## Connecting to Other Objects
+
+To link your object to People, Companies, or other objects, create a relation field. See [How to Create Relation Fields](/l/ja/user-guide/data-model/how-tos/create-relation-fields).
+
+## Deactivating an Object
+
+If you no longer need an object:
+
+1. Go to **Settings → Data Model**
+2. Toggle the object off
+
+The object is hidden but data is preserved. You can reactivate or permanently delete later.
+
+## Related
+
+* [Objects](/l/ja/user-guide/data-model/capabilities/objects) — standard vs custom objects
+* [Data Model FAQ](/l/ja/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/create-relation-fields.mdx b/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/create-relation-fields.mdx
new file mode 100644
index 0000000000..300a03a75e
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/create-relation-fields.mdx
@@ -0,0 +1,60 @@
+---
+title: Create Relation Fields
+description: Step-by-step guide to connecting objects with relation fields.
+---
+
+Relation fields connect records from different objects—for example, linking People to Companies.
+
+
+ **Relation names cannot be changed after creation** (they affect the API). Plan your names carefully.
+
+
+## Before You Start
+
+Decide:
+
+* Which objects are you connecting? (e.g., People → Companies)
+* Which is the "one" side? (e.g., Company)
+* Which is the "many" side? (e.g., People — many people work at one company)
+* What should the field be named on each side?
+
+See [Relation Fields](/l/ja/user-guide/data-model/capabilities/relation-fields) for relation types explained.
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Select the object where you want the relation (typically the "many" side)
+3. Click **+ Add Field**
+4. Select **Relation** as the field type
+5. Choose the **target object**
+6. Select **One-to-Many** or **Many-to-One**
+7. Enter field names for **both sides** of the relation
+8. Click **Save**
+
+## Example: People → Companies
+
+* Go to **Settings → Data Model → People**
+* Add a Relation field
+* Target: **Companies**
+* Type: **Many-to-One**
+* Field on People: **Company**
+* Field on Companies: **Employees**
+
+Now each Person can be linked to a Company, and each Company shows its People.
+
+## Deleting a Relation
+
+1. Go to **Settings → Data Model**
+2. Find the relation field
+3. Click **⋮ → Deactivate**
+
+Links are preserved but hidden. Reactivate to restore.
+
+
+ **Deleting a relation doesn't delete records.** Only the link between them is removed.
+
+
+## Related
+
+* [Relation Fields](/l/ja/user-guide/data-model/capabilities/relation-fields) — types and limitations
+* [How to Import Relations](/l/ja/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) — bulk import linked records
diff --git a/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/customize-your-data-model.mdx b/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/customize-your-data-model.mdx
new file mode 100644
index 0000000000..a37cc1ea1a
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/customize-your-data-model.mdx
@@ -0,0 +1,22 @@
+---
+title: Customize Your Data Model
+description: Overview of data model customization options.
+---
+
+Twenty's data model is fully customizable. Create objects, fields, and relations to match your business.
+
+## Quick Links
+
+| I want to... | Guide |
+| ------------------------ | -------------------------------------------------------------------------------------- |
+| Create a new object | [How to Create Custom Objects](/l/ja/user-guide/data-model/how-tos/create-custom-objects) |
+| Add fields to an object | [How to Create Custom Fields](/l/ja/user-guide/data-model/how-tos/create-custom-fields) |
+| Connect objects together | [How to Create Relation Fields](/l/ja/user-guide/data-model/how-tos/create-relation-fields) |
+
+## Learn More
+
+* [Understanding Your Data Model](/l/ja/user-guide/data-model/overview) — key concepts and planning tips
+* [Objects](/l/ja/user-guide/data-model/capabilities/objects) — standard vs custom objects
+* [Fields](/l/ja/user-guide/data-model/capabilities/fields) — all field types
+* [Relation Fields](/l/ja/user-guide/data-model/capabilities/relation-fields) — connecting objects
+* [Data Model FAQ](/l/ja/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/data-model-faq.mdx b/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/data-model-faq.mdx
new file mode 100644
index 0000000000..414a9e4a52
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-model/how-tos/data-model-faq.mdx
@@ -0,0 +1,155 @@
+---
+title: Data Model FAQ
+description: Frequently asked questions about Twenty's data model.
+---
+
+## Object Management
+
+
+
+ Yes, custom objects can be deleted. You can also deactivate them first, which hides the object and its data from the interface while preserving the data.
+
+
+
+ No, standard objects cannot be deleted. You can only deactivate them, which hides them from the interface but preserves the data.
+
+
+
+ You can create as many custom objects and fields as you need — the price doesn't change.
+
+
+
+ You can rename the label of standard objects (People, Companies, Opportunities), but not their API names. The API names are fixed for consistency across all Twenty workspaces.
+
+
+
+ Yes, you can change the icon for both standard and custom objects in **Settings → Data Model**.
+
+
+
+ Not yet. Object ordering in the navigation is currently fixed, but this feature is planned for a future release.
+
+
+
+ All active objects appear in the navigation. You can deactivate objects you don't need under **Settings → Data Model**.
+
+
+
+## Field Capabilities
+
+
+
+ No, field types cannot be changed after creation. If you need a different type, create a new field with the correct type, migrate your data, then deactivate the old field.
+
+
+
+ Our GraphQL API uses both forms for different operations:
+
+ * `createPerson` (singular) for single record actions
+ * `createPeople` (plural) for bulk operations
+
+ This creates limitations when singular and plural forms are the same, but it improves the developer experience.
+
+
+
+ Certain field names like `Type` or `Application` are reserved for system use. Choose alternative names like `Category` or `Classification` instead.
+
+
+
+ * The field is hidden from the interface
+ * Existing data is preserved
+ * You can still access the field via API
+ * Existing relations remain but you can't create new ones
+ * You can reactivate the field later
+
+
+
+ Currently, you cannot make custom fields required. All fields accept empty values. You can use workflows to enforce required fields by sending alerts or blocking actions when fields are empty.
+
+
+
+ * **Unique**: No two records can have the same value in this field
+ * **Required**: The field must have a value (not currently supported for custom fields)
+
+
+
+ Formula fields are coming in **Q1 2026**. In the meantime, you can use workflows to calculate and update field values automatically.
+
+
+
+ Nested fields are coming in **Q1 2026**. Currently, you can use workflows to bring field values from related objects. For example, to display a company's industry on a Person record, create a custom field on People and use a workflow to synchronize the value.
+
+
+
+ Field reordering will be available with custom layouts in **Q4 2025**. Currently, fields appear in alphabetical order.
+
+
+
+## Relations
+
+
+
+ Yes! Self-referencing relations are supported and recommended for use cases like account hierarchies. For example, create a relation from Companies to Companies to track parent/child accounts.
+
+
+
+ Many-to-many relationships are coming in **H1 2026**. Currently, create an intermediate object with two one-to-many relationships as a workaround.
+
+ For example, to link People and Projects (many-to-many), create a "Project Assignments" object with:
+
+ * A relation to People (many assignments → one person)
+ * A relation to Projects (many assignments → one project)
+
+
+
+ These allow one object to relate to multiple different object types through a single field. For example, Notes can be attached to People AND Companies AND Opportunities simultaneously.
+
+ Each Note links to one Person, one Company, and one Opportunity at the same time.
+
+ Learn more in [Relation Fields](/l/ja/user-guide/data-model/capabilities/relation-fields).
+
+
+
+ Yes, you can create multiple relations between the same two objects. For example, a Company could have both a "Primary Contact" and "Billing Contact" relation to People.
+
+
+
+ When you delete a record, the relation link is removed from the related records. The related records themselves are not deleted.
+
+
+
+ While technically possible, circular relations (A → B → C → A) should be avoided as they can cause confusion and potential performance issues.
+
+
+
+## Access and Permissions
+
+
+
+ Go to **Settings → Data Model** to view and edit all your objects and fields.
+
+
+
+ Reach out to your workspace administrator. Data model access is usually restricted to administrators only.
+
+
+
+## Data Management
+
+
+
+ There's no hard limit on record counts. However, very large datasets may impact performance in some views. Use filters and views to manage large datasets effectively.
+
+
+
+ Yes, you can import CSV data into any object, including custom objects. The import process supports field mapping for custom fields. See [How to Prepare Your CSV Files](/l/ja/user-guide/data-migration/how-tos/prepare-your-csv-files).
+
+
+
+ Currently, there's no built-in export for data model configuration. Contact support if you need to migrate your data model between workspaces.
+
+
+
+## Need More Help?
+
+Check our [Implementation Services](/l/ja/user-guide/getting-started/capabilities/implementation-services) for help with complex data model design.
diff --git a/packages/twenty-docs/l/ja/user-guide/data-model/overview.mdx b/packages/twenty-docs/l/ja/user-guide/data-model/overview.mdx
new file mode 100644
index 0000000000..39c288f112
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/data-model/overview.mdx
@@ -0,0 +1,180 @@
+---
+title: Data Model
+description: Learn what a data model is and how to design one that fits your business.
+image: /images/user-guide/fields/custom_data_model.png
+---
+
+
+
+
+
+## What is a Data Model?
+
+A data model is the structure that defines how information is organized in your CRM. Think of it as the **blueprint** of your customer data — you design it once, then fill it with your actual data.
+
+## Key Concepts
+
+### Objects
+
+**Objects** are the main categories of data in your CRM. Each object represents a type of thing you want to track.
+
+Twenty comes with standard objects:
+
+* **People** — individuals (contacts, leads, partners)
+* **Companies** — organizations
+* **Opportunities** — deals or sales
+* **Notes** — attached notes on records
+* **Tasks** — to-dos linked to records
+
+You can also create **custom objects** for anything specific to your business (e.g., Projects, Subscriptions, Events).
+
+### Fields
+
+**Fields** are the properties or attributes that describe each object. They store the actual information.
+
+For example, the **People** object has fields like:
+
+* Name
+* Email
+* Phone
+* Job Title
+* Company (a relation to the Companies object)
+
+Fields have different **types**: text, number, date, select, multi-select, relation, and more. You can add custom fields to any object.
+
+### Records
+
+**Records** are the individual entries within an object — the actual data you create and manage.
+
+For example:
+
+* "John Smith" is a **record** in the People object
+* "Acme Corp" is a **record** in the Companies object
+
+**An analogy:**
+
+| Data Model Concept | Real-World Analogy |
+| ------------------ | ------------------------------------------ |
+| **Objects** | Sections in a book (the categories) |
+| **Fields** | Columns in a spreadsheet (the properties) |
+| **Records** | Rows in a spreadsheet (the actual entries) |
+
+You design the data model (objects + fields) once, then create many records within that structure.
+
+## Why Customize Your Data Model?
+
+Every business works differently. Customizing your data model means you can shape Twenty around **your** processes instead of forcing yours into a rigid system.
+
+Twenty offers full flexibility:
+
+* Create as many custom objects as you need
+* Add unlimited custom fields
+* The price doesn't change based on customization
+
+## Tips to Design Your Data Model
+
+### 1. Start with Your Core Objects
+
+Identify the main concepts you work with. Twenty already provides:
+
+* **People** — your contacts
+* **Companies** — your accounts
+* **Opportunities** — your deals
+
+Think about what else you might need:
+
+* Stripe would need a `Subscriptions` object
+* Airbnb would need a `Trips` object
+* An accelerator would need a `Batches` object
+
+### 2. Use Fields for Variations, Not New Objects
+
+If something is just a characteristic of an existing object, make it a **field**.
+
+**Use fields for:**
+
+* Categories and labels (e.g., `Industry` for Companies)
+* Status values (e.g., `Stage` for Opportunities)
+* Attributes and properties
+
+### 3. Create an Object When It Stands on Its Own
+
+If the concept has its own lifecycle, properties, or relationships, it deserves an object.
+
+**Create an object for:**
+
+* **Projects** — have deadlines, owners, and tasks
+* **Subscriptions** — connect companies, products, and invoices
+* **Events** — involve attendees and follow-up actions
+
+These go beyond a single field because they carry their own data and relationships.
+
+### 4. Create an Object When Records Are Open-Ended
+
+If something can be linked multiple times and you don't know how many, use an object.
+
+**Bad approach:**
+Creating fields like `Product 1`, `Product 2`, `Product 3`...
+
+**Good approach:**
+Create a `Products` object and relate it to records. This supports one, two, or a hundred products without changing your model.
+
+### 5. Keep It Simple First
+
+Start with fields. Move to new objects only when you feel the limits:
+
+* Too many fields on one object
+* Repeated records that should be separate
+* Relationships that don't fit neatly
+
+## Special Note on People, Companies, and Opportunities
+
+
+ **Email and calendar sync only works with People, Companies, and Opportunities.**
+
+ These are the only objects where you can access synchronized emails and meetings from your mailbox/calendar. We recommend using them as much as possible.
+
+
+**Best practices:**
+
+* If you need categories of People, use fields (not new objects)
+* Example: Use a `Person Type` field with values "Prospect" and "Partner" instead of creating separate objects
+* Create different **views** to filter: one showing partners, another showing prospects
+
+**It's okay to have fields that don't apply to every record.** For example, a `Referral Link` field on People that only applies when `Person Type = Partner`. Hide this field from views where it's not relevant.
+
+## Questions to Guide Your Choice
+
+Ask yourself:
+
+Is this just a property of something I already have, or does it need its own properties?
+Will I ever need to track multiple of these per record, without knowing how many?
+Does this concept connect to several different objects, not just one?
+Will it have its own lifecycle (stages, start/end dates)?
+
+If the answer is "yes" to one or more, it's probably time for a new object.
+
+## Accessing Your Data Model
+
+1. Go to **Settings** in the left sidebar
+2. Click **Data Model**
+3. View all your objects (standard and custom)
+4. Click any object to see and edit its fields
+
+
+ **Don't see Data Model in Settings?**
+
+ Access to the data model is usually restricted to administrators. Contact your workspace admin if you need access.
+
+
+## Next Steps
+
+Once you've planned your data model:
+
+* [How to Create Custom Objects](/l/ja/user-guide/data-model/how-tos/create-custom-objects)
+* [How to Create Custom Fields](/l/ja/user-guide/data-model/how-tos/create-custom-fields)
+* [How to Create Relation Fields](/l/ja/user-guide/data-model/how-tos/create-relation-fields)
+
+## Need Help?
+
+Our team can help you design and create the data model you need. Discover our [Implementation Services](/l/ja/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/ja/user-guide/getting-started/capabilities/glossary.mdx b/packages/twenty-docs/l/ja/user-guide/getting-started/capabilities/glossary.mdx
new file mode 100644
index 0000000000..71ac91622f
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/getting-started/capabilities/glossary.mdx
@@ -0,0 +1,108 @@
+---
+title: Glossary
+description: Get familiar with essential terminology used in Twenty.
+---
+
+## API
+
+API (Application Programming Interface) allows you to connect Twenty with other software systems and build custom integrations.
+
+## Apps
+
+Apps are custom extensions built as code that can define data models and serverless functions. They enable developers to create reusable customizations that can be deployed across multiple workspaces.
+
+## Code Actions
+
+Code Actions are workflow steps that let you write custom JavaScript to transform data, make calculations, or perform complex logic that isn't possible with built-in actions.
+
+## Command Menu
+
+The Command Menu is a quick-access interface (opened with `Cmd + K` on Mac and `Ctrl + K` on Windows) that lets you perform actions, create records, and navigate your workspace efficiently.
+
+## Company & People
+
+The CRM has two fundamental types of records:
+
+* A `Company` represents a business or organization.
+* `People` represent your company's current and prospective customers or clients.
+
+## Custom Fields
+
+Custom Fields are data fields you create to capture information specific to your business needs and processes.
+
+## Data Model
+
+A Data Model is the structure that defines how information is organized in your CRM, including what objects exist, their properties (fields), and how they relate to each other.
+
+## Favorites
+
+Favorites are records you've marked for quick access, appearing in your sidebar for instant navigation to important data.
+
+## Field
+
+A field refers to a specific area where particular data is stored for an entity.
+
+## Integration
+
+Integrations are built-in tools that allow you to link Twenty with other software or systems.
+
+## Iterator
+
+An Iterator is a workflow action that loops through an array of items, executing subsequent actions for each item in the list.
+
+## Kanban
+
+A `Kanban` is a visual way to track your business processes using cards and columns. Each column represents a stage in your process (for example: new, ongoing, won, lost), and you move records through these stages as they progress.
+
+## Object
+
+An Object is a data structure that represents a specific type of entity in your CRM (like People, Companies, or Opportunities). Objects can be standard (built-in) or custom (created by you).
+
+## Opportunities
+
+Opportunities in Twenty CRM are potential deals or sales with accounts or contacts.
+
+## Record
+
+A Record indicates an instance of an object, like a specific account or contact.
+
+## Relation Fields
+
+Relation Fields create connections between different objects, allowing you to link records together (like connecting a Person to a Company).
+
+## Standard Fields
+
+Standard Fields are pre-built data fields that come with objects by default and provide common functionality across all workspaces.
+
+## Tasks
+
+Tasks in Twenty CRM are assigned activities relating to contacts, accounts, or opportunities.
+
+## Triggers
+
+Triggers are the starting point of a workflow — the event or condition that initiates the automation. Examples include record creation, record updates, webhooks, or scheduled times.
+
+## Views
+
+You can customize the display of your records using views, setting different filters, layouts and sorting options for each view.
+
+## Upsert
+
+Upsert is an operation that combines "update" and "insert" — it updates an existing record if a match is found, or creates a new record if no match exists.
+
+## Webhooks
+
+Webhooks are automated messages sent from Twenty to other applications when specific events occur, enabling real-time data synchronization.
+
+## Workflows
+
+Workflows are automated processes that trigger actions based on specific conditions, helping you automate repetitive tasks and business processes.
+
+## Workspace
+
+A `Workspace` typically represents a company using Twenty. It holds all the records and data that you and your team members add to Twenty.
+It has a single domain name, which is typically the domain name your company uses for employee email addresses.
+
+## Workspace Members
+
+Workspace Members are the Twenty users from your team who have access to your workspace. They can be assigned as owners or assignees for records.
diff --git a/packages/twenty-docs/l/ja/user-guide/getting-started/capabilities/implementation-services.mdx b/packages/twenty-docs/l/ja/user-guide/getting-started/capabilities/implementation-services.mdx
new file mode 100644
index 0000000000..706de4d2a0
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/getting-started/capabilities/implementation-services.mdx
@@ -0,0 +1,16 @@
+---
+title: Implementation Services
+description: Whether you need help getting started or creating advanced customizations, we have a solution.
+---
+
+## Onboarding Packs
+
+Get help from our core team to set up your Twenty workspace with our 4-hour Onboarding packs:
+
+* **Data Model Design**: Design and create your custom data model with objects, fields, and relationships
+* **Data Migration**: Migrate your existing data from your current CRM to Twenty
+* **Workflow Creation**: Create custom workflows to support your business processes
+
+## Implementation Partners
+
+Work with certified Twenty partners for more advanced customizations and integrations. Reach out to our team via [contact@twenty.com](mailto:contact@twenty.com) to be matched with our partners.
diff --git a/packages/twenty-docs/l/ja/user-guide/getting-started/capabilities/what-is-twenty.mdx b/packages/twenty-docs/l/ja/user-guide/getting-started/capabilities/what-is-twenty.mdx
new file mode 100644
index 0000000000..c8158a1b9d
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/getting-started/capabilities/what-is-twenty.mdx
@@ -0,0 +1,42 @@
+---
+title: What is Twenty
+description: Twenty is an open-source CRM that gives you the building blocks to create exactly what your business needs.
+---
+
+## Vision
+
+Creating a good CRM is hard because it's a balancing act.
+For each business, the requirements seem straightforward, yet everyone's needs are distinct.
+The result is a CRM that's either too basic, or one that's attempting to be a jack-of-all-trades but ending up as a master of none.
+
+At first, Twenty looks like most CRMs you already know: you can track deals, organize contacts, manage tasks and notes.
+**But what sets it apart is our approach to extensibility. We are building an open platform that provides the building blocks for you to solve your unique business problems.**
+
+We prioritize universal principles and common patterns over feature lists.
+We don't try to have all the answers and instead empower users to find what works best for them.
+Open-source is the bedrock of our approach, ensuring that Twenty evolves with its community, for its community.
+
+## Benefits
+
+**Customizable:** Designed to fit your business needs.
+
+**Community-driven:** Built and maintained by a large open-source community.
+
+**Cost-effective:** You'll never be vendor-locked, because you can always self-host.
+
+## Main Features
+
+* **Calendar & Emails:** Sync your mailbox and calendar to see all communications on your CRM records. [Learn more](/l/ja/user-guide/calendar-emails/overview).
+* **Data Model:** Create custom objects and fields to match your unique business processes. [Explore](/l/ja/user-guide/data-model/overview).
+* **Data Migration:** Import and export your data via CSV or API. [Get started](/l/ja/user-guide/data-migration/overview).
+* **Views & Pipelines:** Organize your data with table views, kanban boards, and sales pipelines. [Discover](/l/ja/user-guide/views-pipelines/overview).
+* **Workflows:** Automate your business processes and integrate with external tools. [Build automations](/l/ja/user-guide/workflows/overview).
+* **AI:** Enhance your CRM with AI-powered features and agents. [Explore AI](/l/ja/user-guide/ai/overview).
+* **Dashboards:** Track performance with custom reports and visualizations. [View dashboards](/l/ja/user-guide/dashboards/overview).
+* **Permissions & Access:** Control who can view, edit, and manage your data with role-based permissions. [Configure access](/l/ja/user-guide/permissions-access/overview).
+* **Notes & Tasks:** Create notes and tasks linked to your records for better collaboration.
+* **API & Webhooks:** Connect to other apps and build custom integrations. [Start integrating](/l/ja/developers/extend/capabilities/apis).
+
+## Join now
+
+[Register here](https://app.twenty.com) or [become a contributor on GitHub](https://github.com/twentyhq/twenty).
diff --git a/packages/twenty-docs/l/ja/user-guide/getting-started/how-tos/configure-your-workspace.mdx b/packages/twenty-docs/l/ja/user-guide/getting-started/how-tos/configure-your-workspace.mdx
new file mode 100644
index 0000000000..8fe48a7db9
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/getting-started/how-tos/configure-your-workspace.mdx
@@ -0,0 +1,77 @@
+---
+title: Configure Your Workspace
+description: Every business works differently. Start with these 3 steps to shape Twenty around your needs.
+---
+
+**Quick Win**: Start with connecting your mailbox. This gives you immediate value and helps your team see Twenty in action with real data. You can do so under Settings → Accounts.
+
+## 1. Customize your data model
+
+Twenty offers the flexibility you need to shape the data model that will best support your day-to-day.
+Create objects and fields of any type, including relations between your different objects. You can do so under Settings → Data Model.
+Here are a few tips:
+
+* **You are not limited in the number of custom fields nor custom objects**. Adding custom objects and fields will not lead to upgrading your plan.
+* **People, Companies and Opportunities are the three objects from where you can access the emails and meetings synchronized from your mailbox and calendar**. We recommend using those as much as possible, adding fields to categorize your records if need be. Here is an example:
+ * It is best to use the People object for your prospects and partners, creating a field on the People object named `Person Type`, instead of creating a Partner custom object. Because you would not be able to access the emails exchanged with this person from the Partner records.
+ * Create different views under People, one to display partners and one to display prospects.
+* Two People cannot have the same email address. Two Companies cannot have the same domain.
+* You can deactivate standard fields and objects you do not want to use.
+* You can hide fields from views: don't be afraid of creating fields, you won't have to display all of them.
+
+Read [this article](/l/ja/user-guide/data-model/overview) to learn how to design your data model.
+
+## 2. Bring your data in
+
+Bringing your existing data into Twenty gives your team context from the start.
+
+### Connect your mailbox
+
+If you have not done so when creating your workspace, connect your **Google or Microsoft account** under Settings → Accounts. This allows Twenty to:
+
+* Import your messages and meetings
+* Auto-create contacts based on interactions (optional)
+* Keep communication history visible for your team
+
+**Using another provider?**
+You can add another mailbox via SMTP or another calendar via CalDAV. You will need to activate the feature under Settings → Releases → Lab, and then go back to the Settings → Accounts tab.
+
+### Import data via csv
+
+Use the Command menu (`Cmd + K` or `Ctrl + K`) to import People, Companies, Opportunities, or any custom objects via CSV.
+
+**Key guidelines**:
+
+* Download the sample file to understand the expected format
+* Limit each file to 10k records
+* Remove duplicate emails for People or duplicate domains for Companies
+* Review and fix errors (highlighted in yellow) before importing
+
+Read [this article](/l/ja/user-guide/data-migration/overview) to learn more about data import.
+
+## 3. Create your first view
+
+Creating different views is key to make the data actionable for your team.
+Here is how to proceed:
+
+* **Add or hide columns**
+ Manage the fields visible in a given view clicking on Options → Fields (from the top right). You can show/hide fields from there.
+
+* **Reorder fields**
+ Reorder the fields from a given view clicking on Options → Fields (from the top right). Drag and drop the fields to reorder them.
+
+* **Filter your view**
+ Narrow down the records displayed using the Filters from the top right.
+
+* **Sort records**
+ Reorder records displayed using the Sort function from the top right, or by clicking directly on the column name.
+
+* **Choose the layout**
+ You can switch to a **Kanban layout** or a list **Group By** layout, as long as the object has a `Stage` or similar select-type field.
+
+* **Save your view as Favorites**
+ This can be done using the dropdown menu showing the different views.
+
+## What's next?
+
+Start creating automations using [workflows](/l/ja/user-guide/workflows/overview).
diff --git a/packages/twenty-docs/l/ja/user-guide/getting-started/how-tos/create-workspace.mdx b/packages/twenty-docs/l/ja/user-guide/getting-started/how-tos/create-workspace.mdx
new file mode 100644
index 0000000000..f93617f83f
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/getting-started/how-tos/create-workspace.mdx
@@ -0,0 +1,48 @@
+---
+title: Create a Workspace
+description: Follow a step-by-step guide on how to register on Twenty, choose a subscription plan, and set up your account.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Step 1: Registration
+
+1. Navigate to [Twenty Sign Up](https://app.twenty.com).
+2. Select your preferred sign-up method:
+ * **Continue with Google** for Google account registration.
+ * **Continue with Microsoft** for Microsoft account registration.
+ * Or, **Continue With Email** for email registration.
+
+
+
+## Step 2: Choosing a Trial Period
+
+Choose between two trial periods:
+
+### 30 days
+
+With credit card
+
+### 7 days
+
+Without credit card
+
+Both trials include:
+
+* Full access
+* Unlimited contacts
+* Email integration
+* Custom objects
+* API & Webhooks
+
+You can click on "Change plan" to choose a different plan or billing interval.
+
+
+
+## Step 3: Payment Confirmation & Account Setup
+
+Post payment approval via Stripe, you're directed to create your workspace and user profile. Remember that you can cancel your subscription anytime.
+
+## Support
+
+For queries or help, connect with the dedicated support team at [contact@twenty.com](mailto:contact@twenty.com) or send a message on [Discord](https://discord.gg/cx5n4Jzs57).
diff --git a/packages/twenty-docs/l/ja/user-guide/getting-started/how-tos/navigate-around-twenty.mdx b/packages/twenty-docs/l/ja/user-guide/getting-started/how-tos/navigate-around-twenty.mdx
new file mode 100644
index 0000000000..8071decfd3
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/getting-started/how-tos/navigate-around-twenty.mdx
@@ -0,0 +1,83 @@
+---
+title: Navigate Around Twenty
+description: Get a quick overview of how to navigate through the platform and where to take different types of actions.
+---
+
+## The Main Layout
+
+The center of the screen is **where your records live**: people, companies, opportunities, tasks, notes, dashboards, workflows and any other object you created. This is where the day-to-day work happens.
+You can **view, edit, delete records** from there as well as **creating new views**.
+
+
+
+## The Navigation Bar
+
+On the left side, from the top to the bottom, you'll be able to:
+
+* Switch between your **several workspaces** using the dropdown menu or create a new workspace
+* Use the **search bar** (press `/` to focus on it instantly)
+* Open the **Settings** section
+* Have direct access to your **Favourites views**. Favourites are unique for each user.
+* Switch between different objects
+* **Create automations** using workflows
+* Reach out to Support and open our User Guide.
+
+
+
+## The Command Menu
+
+The command menu gives you **quick access to actions** in Twenty. You can access it in two ways:
+
+* **Keyboard shortcut**: Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+* **Mouse**: Click the three dots in the top right corner
+ From there, you can:
+* Create new records
+* **Import and export data via csv**
+* Create new views
+* Access deleted records (Twenty supports soft and hard deletes)
+* See the keyboard shortcuts to quickly access objects in your workspace
+
+
+
+## The Search Bar
+
+The search bar is accesible via the Command Menu, at the top of your navigation bar, or by pressing `/` to focus on it instantly. Search works across all object.
+
+
+
+## The Side Panel
+
+When you click on a record, the side panel appears on the right. This gives you a quick overview of the record's key information, without bringing you to another page. From there, you can decide to close this overview or to get additional information about this record, clicking on the Open button.
+
+
+
+## Views
+
+Every object (like Opportunities or People) supports multiple views. You're not limited in the number of views per object.
+
+Use the dropdown menu at the top left of the main layout to switch between the different views. For example:
+
+* Use a Kanban view to track opportunities by stage
+* Use Group By view to create sections and improve efficiency
+* Use filters to focus on specific records (e.g. leads created last week)
+* Save filtered views to reuse them later
+* Favourite views for fast access
+
+
+
+If you're new to Views, read our [Views & Pipelines guide](/l/ja/user-guide/views-pipelines/overview) to learn how to create and customize them.
+
+## Settings
+
+Open your Settings from the top left to:
+
+* **Connect your mailbox and calendar** accounts for seamless email and calendar sync
+* Customize your **data model**: create custom objects, fields, and relationships
+* **Access the API playground and configure webhooks**
+* **Manage user permissions** and workspace access controls
+* Invite team members and manage user roles
+* Edit your profile and workspace preferences
+* Configure billing and monitor workflow credits usage
+* Discover the latest releases and upcoming features (under Releases → Lab tab)
+
+If you do not see all those sections under Settings, reach out to your workspace administrator - some of them have restricted access.
diff --git a/packages/twenty-docs/l/ja/user-guide/introduction.mdx b/packages/twenty-docs/l/ja/user-guide/introduction.mdx
new file mode 100644
index 0000000000..24b7b3ccb3
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/introduction.mdx
@@ -0,0 +1,63 @@
+---
+title: Discover Twenty
+description: Welcome to Twenty User Guide, your resources for advanced configurations and best practices.
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+
+
+ Discover Twenty
+ Learn what Twenty is and how it can help your business.
+
+
+
+ Data Model
+ Customize your data model to fit your business processes.
+
+
+
+ Data Migration
+ Import and export your data via CSV or API.
+
+
+
+ Calendar & Emails
+ Centralize your team's meetings and emails.
+
+
+
+ Workflows
+ Automate processes and integrate with external tools.
+
+
+
+ AI
+ Enhance your team with AI agents.
+
+
+
+ Views & Pipelines
+ Organize your data with actionable views and pipelines.
+
+
+
+ Dashboards
+ Real-time insights to track performance.
+
+
+
+ Permissions & Access
+ Manage roles and access to Twenty.
+
+
+
+ Billing
+ Understand how Twenty pricing and billing works.
+
+
+
+ Settings
+ Configure your workspace preferences.
+
+
diff --git a/packages/twenty-docs/l/ja/user-guide/permissions-access/capabilities/permissions.mdx b/packages/twenty-docs/l/ja/user-guide/permissions-access/capabilities/permissions.mdx
new file mode 100644
index 0000000000..a5d614b008
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/permissions-access/capabilities/permissions.mdx
@@ -0,0 +1,198 @@
+---
+title: Permissions
+description: Control access to objects, fields, and settings with role-based permissions.
+image: /images/user-guide/permissions/permissions.png
+---
+
+Twenty's permission system allows you to control access to three main areas:
+
+* **Objects and Fields**: Control who can view, edit, or delete records and individual fields
+* **Settings**: Manage access to workspace configuration and administrative functions
+* **Actions**: Control general workspace actions like importing data or sending emails
+
+## Create a Role
+
+To create a new role:
+
+1. Go to **Settings → Roles**
+2. Under **All Roles**, click on **+ Create Role**
+3. Enter a role name
+4. In the default **Permissions** tab, [configure permissions](#customize-permissions)
+5. Click **Save** to finish
+
+## Delete a Role
+
+To delete a role:
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to remove
+3. Open the **Settings** tab, then click **Delete Role**
+4. Click **Confirm** in the modal
+
+
+ If a role is deleted, any workspace member assigned to it will be automatically reassigned to the default role. All except the **Admin** role can be deleted. There must always be at least one member assigned to the **Admin** role.
+
+
+## Assign Roles to Members
+
+### View Current Assignments
+
+* Go to **Settings → Roles**
+* See all roles and how many members are assigned to each
+* View which members have which roles
+
+### Assign a Role to a Member
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Click **+ Assign to member**
+5. Select the workspace member from the list
+6. Confirm the assignment
+
+### Set Default Role
+
+1. Go to **Settings → Roles**
+2. In the **Options** section, find **Default Role**
+3. Select which role new members should automatically receive
+4. New workspace members will be assigned this role when they join
+
+
+ You can only assign roles to existing workspace members. To invite new members, use [Member Management](/l/ja/user-guide/settings/capabilities/member-management).
+
+
+## Customize Permissions
+
+Permissions determine what each role can access or modify within your workspace, including workspace objects records, settings, and actions.
+
+### Object Permissions
+
+The **Objects** section controls what this role can do with records across your workspace.
+
+#### Set Default Permissions (All Objects)
+
+First, configure the baseline permissions that apply to **all objects** by default:
+
+| Permission | Description |
+| ---------------------------------- | -------------------------------------- |
+| **See Records on All Objects** | View records in lists and detail pages |
+| **Edit Records on All Objects** | Modify existing records |
+| **Delete Records on All Objects** | Soft-delete records (can be restored) |
+| **Destroy Records on All Objects** | Permanently delete records |
+
+Select or unselect based on what should be the default behavior for this role.
+
+
+ **Example — Intern role**: An intern should be able to see all objects but not edit them by default. Enable "See Records on All Objects" but leave "Edit Records on All Objects" unchecked.
+
+
+#### Add Object-Level Exceptions
+
+After setting defaults, use the **Object-Level** sub-section to add rules that override the defaults for specific objects.
+
+Click **+ Add rule** and select an object to create an exception.
+
+**Example rules for an Intern role:**
+
+| Rule | Effect |
+| ------------------------------------- | ------------------------------------------------------ |
+| Opportunities → disable "See Records" | Intern cannot see the Opportunities object at all |
+| People → enable "Edit Records" | Intern can edit People records (but not other objects) |
+
+### Field Permissions
+
+Within each object-level rule, you can go further and configure **field-level permissions** to control access to specific fields.
+
+| Permission | Description |
+| -------------- | -------------------------- |
+| **See Field** | View the field value |
+| **Edit Field** | Modify the field value |
+| **No Access** | Field is completely hidden |
+
+**Example — Restrict sensitive fields:**
+
+For the Intern role with People edit access, you might want to restrict certain fields:
+
+* People → Email → **See Field** only (cannot edit)
+* People → Address → **No Access** (completely hidden)
+
+This allows the intern to edit most People fields while protecting sensitive information.
+
+### How Permission Inheritance Works
+
+Permissions cascade from general to specific:
+
+1. **All Objects** → sets the baseline for all objects
+2. **Object-Level rules** → override the baseline for specific objects
+3. **Field-Level rules** → override the object setting for specific fields
+
+More specific settings always take precedence.
+
+### Managing Permission Overrides
+
+To override inherited permissions:
+
+1. Click **X** to remove the inherited rule
+2. Select the specific permissions you want
+3. Click the orange **Undo** icon (circular arrow) to revert changes
+
+When done, click **Finish**, then **Save** once redirected to the role page.
+
+### Workspace Settings Permissions
+
+Control access to workspace settings in two ways:
+
+* Toggle **Settings All Access** to grant full access
+* Or enable specific permissions (e.g., API key generation, workspace preferences, role assignment, data model configuration, security settings, and workflow management)
+
+
+ **Current limitation**: Access to workflow management is currently required to manually trigger workflows. This behavior may change in future releases.
+
+
+### Workspace Action Permissions
+
+Control access to general workspace actions:
+
+* Toggle **Application All Access** to grant full permissions
+* Or enable individual actions such as **Send Email**, **Import CSV**, and **Export CSV**
+
+## Assigning Roles to API Keys and AI Agents
+
+Beyond workspace members, roles can also be assigned to **API Keys** and **AI Agents**. This is particularly helpful for teams who want to control exactly "who" can do what in their workspace—including automated processes and integrations.
+
+### Why Assign Roles to API Keys and AI Agents?
+
+* **Security**: Limit what automated processes can access or modify
+* **Compliance**: Ensure integrations only touch the data they need
+* **Control**: Prevent accidental data changes from misconfigured automations
+* **Auditability**: Track which actions were performed by which integration or agent
+
+### Assign a Role to an API Key
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **API Keys**, click **+ Assign to API key**
+5. Select the API key from the list
+6. Confirm the assignment
+
+The API key will now inherit all permissions defined by that role. Any API calls made with this key will be restricted accordingly.
+
+
+ API keys without an assigned role use default permissions. For tighter security, always assign a specific role to production API keys.
+
+
+### Assign a Role to an AI Agent
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **AI Agents**, click **+ Assign to AI agent**
+5. Select the AI agent from the list
+6. Confirm the assignment
+
+The AI agent will only be able to access data and perform actions allowed by its assigned role.
+
+
+ For AI agents running within workflows, this ensures the agent cannot access or modify data outside its intended scope—even if the workflow has broader permissions.
+
diff --git a/packages/twenty-docs/l/ja/user-guide/permissions-access/capabilities/sso-configuration.mdx b/packages/twenty-docs/l/ja/user-guide/permissions-access/capabilities/sso-configuration.mdx
new file mode 100644
index 0000000000..310c161605
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/permissions-access/capabilities/sso-configuration.mdx
@@ -0,0 +1,125 @@
+---
+title: SSO Configuration
+description: Configure Single Sign-On for secure enterprise authentication.
+---
+
+## About SSO
+
+Single Sign-On (SSO) allows your team members to log into Twenty using your organization's identity provider. This provides:
+
+* **Centralized access control**: Manage access from one place
+* **Enhanced security**: Leverage your existing security policies
+* **Better user experience**: One set of credentials for all tools
+
+## Supported Providers
+
+Twenty supports SSO with:
+
+* **SAML 2.0**: Works with most enterprise identity providers
+* **Google Workspace**: For organizations using Google
+* **Microsoft Entra ID**: (formerly Azure AD) For Microsoft environments
+
+## Setting Up SSO
+
+### Prerequisites
+
+* Organization plan (cloud and self-hosted workspaces)
+* Admin access to your identity provider
+* Admin access to Twenty workspace
+
+
+ **For self-hosting users willing to set up SSO**, reach out to contact@twenty.com
+
+
+### Configuration Steps
+
+#### 1. Access SSO Settings
+
+1. Go to **Settings → Security**
+2. Find the **SSO Configuration** section
+3. Click **Configure SSO**
+
+#### 2) Choose Your Provider
+
+Select your identity provider from the list or choose "Custom SAML" for other providers.
+
+#### 3. Configure Your Identity Provider
+
+You'll need to configure your identity provider with:
+
+* **Entity ID**: Provided by Twenty
+* **ACS URL**: The callback URL for authentication
+* **Certificate**: For secure communication
+
+#### 4. Enter Provider Details in Twenty
+
+* **SSO URL**: Login URL from your provider
+* **Entity ID**: Your provider's identifier
+* **Certificate**: X.509 certificate from your provider
+
+#### 5. Test and Enable
+
+1. Click **Test Configuration** to verify setup
+2. Enable SSO when testing is successful
+3. Configure user provisioning preferences
+
+## User Provisioning
+
+### Just-in-Time (JIT) Provisioning
+
+* Users are created automatically on first login
+* Assigned default role automatically
+* No manual user creation needed
+
+### Manual Provisioning
+
+* Invite users before they can log in
+* Pre-assign specific roles
+* More control over who can access
+
+## Managing SSO Users
+
+### Role Assignment
+
+SSO users can be assigned roles like regular users:
+
+1. Go to **Settings → Members**
+2. Find the user
+3. Change their role as needed
+
+### Access Revocation
+
+To remove access for SSO users:
+
+* Remove them from your identity provider, or
+* Remove them from the Twenty workspace
+
+## Best Practices
+
+### Security
+
+* **Require SSO**: Disable password login for SSO users
+* **Regular audits**: Review access periodically
+* **Strong IdP policies**: Enforce MFA at the identity provider
+
+### User Management
+
+* **Clear naming**: Use consistent naming from your directory
+* **Group mapping**: Map IdP groups to Twenty roles (if available)
+* **Offboarding process**: Include Twenty in your deprovisioning workflow
+
+## Troubleshooting
+
+### Common Issues
+
+* **Certificate errors**: Ensure certificate hasn't expired
+* **URL mismatches**: Verify ACS URL matches exactly
+* **User not found**: Check JIT provisioning settings
+
+### Getting Help
+
+If you encounter issues, contact support with:
+
+* Error messages received
+* Identity provider being used
+* Configuration details (without sensitive data)
diff --git a/packages/twenty-docs/l/ja/user-guide/permissions-access/how-tos/permissions-faq.mdx b/packages/twenty-docs/l/ja/user-guide/permissions-access/how-tos/permissions-faq.mdx
new file mode 100644
index 0000000000..6700b48297
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/permissions-access/how-tos/permissions-faq.mdx
@@ -0,0 +1,126 @@
+---
+title: Permissions FAQ
+description: Frequently asked questions about roles and permissions.
+---
+
+## Roles
+
+
+
+ Twenty comes with an **Admin** and **Member** roles by default. You can create additional custom roles based on your team's needs (e.g., Sales Rep, Manager, Read-Only User).
+
+
+
+ No, the Admin role cannot be deleted. There must always be at least one member assigned to the Admin role.
+
+
+
+ Any workspace member assigned to that role will be automatically reassigned to the default role.
+
+
+
+ Go to **Settings → Roles**, find the **Default Role** option, and select which role new members should automatically receive when they join.
+
+
+
+ No, each user can only have one role at a time. Create a custom role if you need a combination of permissions.
+
+
+
+## Permissions
+
+
+
+ * **Object permissions**: Control access to entire records (e.g., can see/edit/delete People records)
+ * **Field permissions**: Control access to specific fields within an object (e.g., can see but not edit the Salary field)
+
+ Field permissions allow more granular control over sensitive data.
+
+
+
+ Permissions cascade from global to specific:
+
+ 1. **All Objects** sets the baseline for all objects
+ 2. **Object-Level Permissions** can override the global setting for specific objects
+ 3. **Field-Level Permissions** can override the object setting for specific fields
+
+ More specific settings always take precedence.
+
+
+
+ For objects:
+
+ * **See Records**: View records in lists and detail pages
+ * **Edit Records**: Modify existing records
+ * **Delete Records**: Soft-delete records (can be restored)
+ * **Destroy Records**: Permanently delete records
+
+ For fields:
+
+ * **See Field**: View the field value
+ * **Edit Field**: Modify the field value
+ * **No Access**: Field is completely hidden
+
+
+
+ Row-level permissions will be available on the **Organization** plan by Q1 2026. This allows you to restrict access to specific records based on criteria (e.g., only see your own opportunities).
+
+
+
+ 1. Go to **Settings → Roles**
+ 2. Select the role
+ 3. Navigate to the object containing the field
+ 4. Set the field permission to **See Field** (without Edit Field)
+
+
+
+## Settings & Actions
+
+
+
+ You can control access to:
+
+ * API key generation
+ * Workspace preferences
+ * Role assignment
+ * Data model configuration
+ * Security settings
+ * Workflow management
+
+ Use **Settings All Access** to grant full access, or enable specific permissions.
+
+
+
+ You can control:
+
+ * **Send Email**: Ability to send emails from Twenty
+ * **Import CSV**: Ability to import data via CSV
+ * **Export CSV**: Ability to export data to CSV
+
+ Use **Application All Access** to grant all actions, or enable specific ones.
+
+
+
+## SSO
+
+
+
+ No, SSO is a Premium feature available on the **Organization** plan only.
+
+
+
+ Twenty supports:
+
+ * **SAML 2.0** (works with most enterprise identity providers)
+ * **Google Workspace**
+ * **Microsoft Entra ID** (formerly Azure AD)
+
+
+
+ With JIT provisioning, user accounts are automatically created in Twenty when someone logs in via SSO for the first time. They're assigned the default role automatically.
+
+
+
+ Yes, once SSO is configured, you can disable password login for SSO users to enforce authentication through your identity provider.
+
+
diff --git a/packages/twenty-docs/l/ja/user-guide/permissions-access/overview.mdx b/packages/twenty-docs/l/ja/user-guide/permissions-access/overview.mdx
new file mode 100644
index 0000000000..60e01e45ac
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/permissions-access/overview.mdx
@@ -0,0 +1,40 @@
+---
+title: Permissions & Access
+description: Manage roles, permissions, and access control in your workspace.
+---
+
+
+
+
+
+Twenty's permission system lets you control who can access and modify data in your workspace. Create roles, assign permissions, and configure SSO for secure access.
+
+## What's in this section
+
+
+
+ Create roles and configure object, field, and settings permissions.
+
+
+
+ Set up Single Sign-On with your identity provider.
+
+
+
+ Common questions about roles, permissions, and SSO.
+
+
+
+## Key features
+
+* **Role-based access**: Create custom roles with specific permissions
+* **Object permissions**: Control who can view, edit, or delete records
+* **Field permissions**: Restrict access to sensitive fields
+* **Settings permissions**: Control access to workspace configuration
+* **SSO integration**: Configure single sign-on for enterprise security (Organization plan)
+
+## Quick links
+
+* [Create a role](/l/ja/user-guide/permissions-access/capabilities/permissions#create-a-role)
+* [Configure SSO](/l/ja/user-guide/permissions-access/capabilities/sso-configuration)
+* [Manage team members](/l/ja/user-guide/settings/capabilities/member-management)
diff --git a/packages/twenty-docs/l/ja/user-guide/settings/capabilities/domains-settings.mdx b/packages/twenty-docs/l/ja/user-guide/settings/capabilities/domains-settings.mdx
new file mode 100644
index 0000000000..b2c49c5ae2
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/settings/capabilities/domains-settings.mdx
@@ -0,0 +1,47 @@
+---
+title: Domain Settings
+description: Configure workspace domain, approved access domains, and public domains.
+---
+
+Configure domain settings under **Settings → Domains**.
+
+## Workspace Domain
+
+Edit your subdomain name or set a custom domain for your workspace.
+
+### Customize Domain
+
+1. Click **Customize Domain**
+2. Edit your subdomain (e.g., `yourcompany.twenty.com`)
+3. Or set up a custom domain (e.g., `crm.yourcompany.com`)
+
+For custom domains, you'll need to configure DNS settings with your domain provider.
+
+## Approved Domains
+
+Anyone with an email address at these domains is allowed to sign up for this workspace automatically.
+
+### Add Approved Access Domain
+
+1. Click **Add Approved Access Domain**
+2. Enter your company domain (e.g., `yourcompany.com`)
+3. Save
+
+Once configured, anyone with an email address at that domain can join your workspace without needing a direct invitation.
+
+
+ This is useful for allowing your entire team to self-register while keeping the workspace restricted to your organization.
+
+
+## Public Domains
+
+Provision a complete and secure hosting environment on these domains.
+
+### Add Public Domain
+
+1. Click **Add Public Domain**
+2. Enter the domain you want to use
+3. Configure DNS settings as instructed
+4. Verify the domain
+
+SSL certificates are automatically provisioned for public domains.
diff --git a/packages/twenty-docs/l/ja/user-guide/settings/capabilities/experience-settings.mdx b/packages/twenty-docs/l/ja/user-guide/settings/capabilities/experience-settings.mdx
index 8cb2fa89fc..e279f7d88b 100644
--- a/packages/twenty-docs/l/ja/user-guide/settings/capabilities/experience-settings.mdx
+++ b/packages/twenty-docs/l/ja/user-guide/settings/capabilities/experience-settings.mdx
@@ -1,38 +1,38 @@
---
-title: エクスペリエンス設定
-description: インターフェーステーマや地域の設定をカスタマイズします。
+title: Experience Settings
+description: Customize your interface theme and regional preferences.
---
-**設定 → エクスペリエンス** で、Twenty のエクスペリエンスをパーソナライズできます。
+Personalize your Twenty experience under **Settings → Experience**.
-## 外観
+## Appearance
-ビジュアルテーマを選択してください:
+Choose your visual theme:
-* **ライト**:クリーンで明るいインターフェース
-* **ダーク**:光が少ない条件で目に優しい
-* **システム設定**:デバイスのテーマに自動的に合わせます
+* **Light**: Clean, bright interface
+* **Dark**: Easier on the eyes in low-light conditions
+* **System settings**: Automatically matches your device's theme
-## 言語
+## Language
-Twenty インターフェースの表示言語をドロップダウンメニューから選択してください。
+Select your preferred language for the Twenty interface from the dropdown menu.
-## 形式
+## Formats
-日付、時間、数値、タイムゾーン、カレンダーの開始日を設定します。
+Configure date, time, number, timezone, and calendar start day.
-| 設定 | 説明 |
-| ------------- | ------------------------------- |
-| **タイムゾーン** | 正確なタイムスタンプとスケジュールのためのローカルタイムゾーン |
-| **日付形式** | 日付の表示形式(例:Dec 12, 2025) |
-| **時間形式** | 12時間制(午後7:22)または24時間制 |
-| **数字の形式** | 小数点と桁区切り(例:1,234.56) |
-| **カレンダーの開始日** | 週の開始曜日(日曜日または月曜日) |
+| Setting | Description |
+| ---------------------- | ---------------------------------------------------------- |
+| **Time zone** | Your local timezone for accurate timestamps and scheduling |
+| **Date format** | How dates appear (e.g., Dec 12, 2025) |
+| **Time format** | 12-hour (7:22 PM) or 24-hour format |
+| **Number format** | Decimal and thousands separators (e.g., 1,234.56) |
+| **Calendar start day** | First day of the week (Sunday or Monday) |
-各設定は**システム設定**にするとデバイスの設定に自動的に合わせられます。特定の形式を選択することもできます。
+Each setting can be set to **System settings** to automatically match your device preferences, or you can choose a specific format.
-## 更新方法
+## How to Update
-1. **設定 → エクスペリエンス** へ移動
-2. 各セクションで好みを調整します
-3. 変更は自動的に保存されます
+1. Go to **Settings → Experience**
+2. Adjust your preferences in each section
+3. Changes save automatically
diff --git a/packages/twenty-docs/l/ja/user-guide/settings/capabilities/member-management.mdx b/packages/twenty-docs/l/ja/user-guide/settings/capabilities/member-management.mdx
new file mode 100644
index 0000000000..f57d107697
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/settings/capabilities/member-management.mdx
@@ -0,0 +1,87 @@
+---
+title: Member Management
+description: Invite team members and manage workspace access.
+---
+
+Manage who has access to your workspace under **Settings → Members**.
+
+## Invite New Members
+
+### Using Email Invitation
+
+1. Go to **Settings → Members**
+2. Click **+ Invite**
+3. Enter the person's email address
+4. Select a role for the new member
+5. Click **Send invite**
+
+The invited person will receive an email with a link to join your workspace.
+
+### Using Invite Link
+
+1. Go to **Settings → Members**
+2. Copy the workspace invite link
+3. Share the link with new team members
+4. They'll receive access once they sign up
+
+## View and Manage Members
+
+### View All Members
+
+Go to **Settings → Members** to see:
+
+* All active members
+* Pending invitations
+
+### Edit a Member's Profile
+
+Click on a member to open their profile page. As an admin, you can:
+
+* Edit their **name**
+* Update their **profile picture**
+* **Impersonate** their account (useful for troubleshooting)
+* **Delete** their account
+
+### Change a Member's Role
+
+On the member's profile page:
+
+1. Open the **Permissions** tab
+2. View the currently assigned role
+3. Select a different role from the dropdown
+4. The change takes effect immediately
+
+→ [Learn more about roles and permissions](/l/ja/user-guide/permissions-access/capabilities/permissions)
+
+### Remove a Member
+
+1. Click on the member to open their profile
+2. Click **Delete** to remove them from the workspace
+
+
+ Removed members lose access immediately. Their data (records, notes, tasks) remains in the workspace.
+
+
+
+ **Email sync is also removed.** If the deleted user was the only one who synced certain emails, those emails will be permanently removed from the workspace.
+
+
+## Pending Invitations
+
+Manage invitations that haven't been accepted:
+
+* **Resend**: Send the invitation email again
+* **Cancel**: Revoke the invitation before it's accepted
+
+## Approved Access Domains
+
+Allow team members to join automatically based on their email domain:
+
+1. Go to **Settings → Domains**
+2. Add your company domain (e.g., `yourcompany.com`)
+3. Anyone with that email domain can join without an invitation
+
+## Related
+
+* [Permissions](/l/ja/user-guide/permissions-access/capabilities/permissions) — configure what each role can do
+* [Domains Settings](/l/ja/user-guide/settings/capabilities/domains-settings) — configure approved domains
diff --git a/packages/twenty-docs/l/ja/user-guide/settings/capabilities/profile-settings.mdx b/packages/twenty-docs/l/ja/user-guide/settings/capabilities/profile-settings.mdx
new file mode 100644
index 0000000000..febfa4a86f
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/settings/capabilities/profile-settings.mdx
@@ -0,0 +1,43 @@
+---
+title: Profile Settings
+description: Manage your personal profile and security settings.
+---
+
+## Personal Information
+
+### Name and Email
+
+* **Display Name**: Update how your name appears to other workspace members
+* **Email Address**: Change your login email (requires verification)
+* **Profile Picture**: Upload a custom avatar or use your initials
+
+## Security Settings
+
+### Two-Factor Authentication (2FA)
+
+Enable 2FA to add an extra layer of security to your account:
+
+1. Go to **Settings → Profile Settings**
+2. Click **Enable 2FA**
+3. Scan the QR code with your authenticator app
+4. Enter the verification code to confirm
+
+### Password Management
+
+* **Change Password**: Update your current password
+* **Password Requirements**: Must be at least 8 characters long
+
+## Profile Management
+
+### Delete Account
+
+
+ Deleting your account will permanently remove your access to all workspaces. This action cannot be undone, you'll lose access to all workspaces where you're a member, and you should consider leaving individual workspaces instead if you only want to exit specific teams.
+
+
+To delete your account:
+
+1. Go to **Settings → Profile Settings**
+2. Scroll to **Danger Zone**
+3. Click **Delete Account**
+4. Confirm by typing your email address
diff --git a/packages/twenty-docs/l/ja/user-guide/settings/capabilities/releases-settings.mdx b/packages/twenty-docs/l/ja/user-guide/settings/capabilities/releases-settings.mdx
new file mode 100644
index 0000000000..4180b67161
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/settings/capabilities/releases-settings.mdx
@@ -0,0 +1,31 @@
+---
+title: Releases Settings
+description: Enable experimental features in Twenty.
+---
+
+## About Releases Settings
+
+The Releases section allows you to enable experimental features before they're generally available.
+
+## Lab Features
+
+Lab features are experimental capabilities that are still being developed. They may change or be removed without notice.
+
+### How to Enable Lab Features
+
+1. Go to **Settings → Releases**
+2. Find the feature you want to enable
+3. Toggle it on
+4. The feature will be available immediately
+
+
+ Lab features are experimental and may not work as expected. Use them with caution in production environments.
+
+
+## Feature Feedback
+
+Your feedback helps improve Twenty:
+
+* Report issues with experimental features
+* Share how you're using new features
+* Suggest improvements via the community Discord
diff --git a/packages/twenty-docs/l/ja/user-guide/settings/capabilities/workspace-settings.mdx b/packages/twenty-docs/l/ja/user-guide/settings/capabilities/workspace-settings.mdx
new file mode 100644
index 0000000000..f72f71a814
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/settings/capabilities/workspace-settings.mdx
@@ -0,0 +1,30 @@
+---
+title: Workspace Settings
+description: Customize your workspace name and branding.
+---
+
+Those are accessible under **Settings → General**.
+
+## Workspace Picture
+
+* **Upload Logo**: Add a custom workspace logo
+* **Supported formats**: PNG, JPEG, and GIF files under 10MB
+* **Remove**: Delete the current workspace logo
+
+## Workspace Name
+
+* **Name**: Change your workspace display name
+* This name appears to all workspace members
+
+## Danger Zone
+
+
+ Deleting your workspace permanently removes all data and cannot be undone. All workspace data will be lost forever, all members will lose access immediately, and this action cannot be reversed.
+
+
+To delete your workspace:
+
+1. Click **Delete workspace** button
+2. Confirm the deletion when prompted
+
+**Note**: Only workspace administrators can delete workspaces.
diff --git a/packages/twenty-docs/l/ja/user-guide/settings/how-tos/settings-faq.mdx b/packages/twenty-docs/l/ja/user-guide/settings/how-tos/settings-faq.mdx
new file mode 100644
index 0000000000..19aa50e5a0
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/settings/how-tos/settings-faq.mdx
@@ -0,0 +1,171 @@
+---
+title: Settings FAQ
+description: Frequently asked questions about Twenty settings.
+image: /images/user-guide/setup/settings.png
+---
+
+## Workspace Settings
+
+
+
+ 1. Go to **Settings → General**
+ 2. Find the Workspace Name field
+ 3. Enter your new name
+ 4. Changes save automatically
+
+
+
+ 1. Go to **Settings → General**
+ 2. Click on the current logo or upload area
+ 3. Select an image file (PNG, JPEG, or GIF under 10MB)
+ 4. The logo updates immediately
+
+
+
+ Yes, you can create and be a member of multiple workspaces. Each workspace has its own data, settings, and subscription.
+
+
+
+ 1. Go to **Settings → General**
+ 2. Scroll to Danger Zone
+ 3. Click **Delete workspace**
+ 4. Confirm the deletion
+
+ Note: This permanently deletes all data and cannot be undone.
+
+
+
+ Delete the workspaces you no longer need under **Settings → General → Delete workspace**.
+
+
+ Do not delete your **account** (accessible under Settings → Profile): your account is shared among all your workspaces. Deleting your account removes access to ALL workspaces.
+
+
+
+
+ If you want to temporarily disable your workspace (not permanently delete it), go to **Settings → Billing** and click **Cancel Plan**. Your data will be preserved for a grace period.
+
+
+
+## Profile Settings
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Find the Password section
+ 3. Enter your current password
+ 4. Enter your new password
+ 5. Save changes
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Find the 2FA section
+ 3. Click **Enable 2FA**
+ 4. Scan the QR code with your authenticator app
+ 5. Enter the verification code
+
+
+
+ To change your email address, please reach out to [contact@twenty.com](mailto:contact@twenty.com).
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Scroll to Danger Zone
+ 3. Click **Delete Account**
+ 4. Confirm by typing your email
+
+ Note: This removes your access to all workspaces and deletes all emails synced from your connected accounts.
+
+
+
+## Experience Settings
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find the Theme section
+ 3. Select Light, Dark, or System
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Date Format
+ 3. Select your preferred format
+ 4. Changes apply immediately
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Time Zone
+ 3. Select your local time zone
+ 4. All timestamps will adjust
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Language
+ 3. Select from available languages
+ 4. The interface updates to your selection
+
+
+
+## Account Settings
+
+
+
+ 1. Go to **Settings → Accounts**
+ 2. Click **Add account**
+ 3. Choose Google or Microsoft
+ 4. Authorize access
+ 5. Configure sync settings
+
+
+
+ Yes, you can connect multiple email accounts. Go to **Settings → Accounts** and add additional accounts as needed.
+
+
+
+ 1. Go to **Settings → Accounts**
+ 2. Find the account to remove
+ 3. Click **Disconnect**
+ 4. Confirm the action
+
+
+
+## Domains
+
+
+
+ Yes! Go to **Settings → Domains** and click **Customize Domain**. You have two options:
+
+ * **Subdomain**: Use a Twenty subdomain like `yourcompany.twenty.com`
+ * **Custom domain**: Use your own domain like `crm.yourcompany.com` (requires DNS configuration)
+
+ A subdomain is quick to set up, while a custom domain provides a fully branded experience for your team.
+
+
+
+ You can configure approved access domains so team members with company email addresses can automatically join your workspace. Go to **Settings → Domains** and add your company domain (e.g., `yourcompany.com`).
+
+
+
+## Lab Features
+
+
+
+ Lab features are experimental capabilities being tested before general release. They may change or be removed without notice.
+
+
+
+ Lab features are functional but may have bugs or unexpected behavior. Use them cautiously in production environments.
+
+
+
+ 1. Go to **Settings → Releases → Lab**
+ 2. Find the feature you want
+ 3. Toggle it on
+ 4. The feature becomes available immediately
+
+
diff --git a/packages/twenty-docs/l/ja/user-guide/settings/overview.mdx b/packages/twenty-docs/l/ja/user-guide/settings/overview.mdx
new file mode 100644
index 0000000000..afe8173625
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/settings/overview.mdx
@@ -0,0 +1,67 @@
+---
+title: Settings
+description: Set up your Twenty workspace with essential configurations.
+image: /images/user-guide/setup/settings.png
+---
+
+
+
+
+
+## Initial Setup
+
+When you first create your workspace, there are several key settings to configure.
+
+### Workspace Name and Logo
+
+1. Go to **Settings → General**
+2. Update your workspace name
+3. Upload your company logo
+4. Save your changes
+
+### Time Zone and Date Format
+
+1. Go to **Settings → Experience**
+2. Select your time zone
+3. Choose your preferred date format
+4. Save your changes
+
+## Essential Configurations
+
+### Connect Email and Calendar
+
+Set up email and calendar sync:
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Connect your Google or Microsoft account
+4. Configure sync settings
+
+→ [Complete email & calendar setup guide](/l/ja/user-guide/calendar-emails/overview)
+
+### Invite Your Team
+
+Add team members to your workspace:
+
+1. Go to **Settings → Members**
+2. Click **+ Invite**
+3. Enter email addresses
+4. Assign appropriate roles
+
+
+ Before inviting your team, check the default role under **Settings → Roles**. New members are automatically assigned this role when they join.
+
+
+## Workspace Settings Checklist
+
+* Workspace name and logo configured
+* Time zone and date format set
+* Email and calendar connected
+* Team members invited
+* Roles and permissions configured
+
+## Next Steps
+
+* [Workspace settings](/l/ja/user-guide/settings/capabilities/workspace-settings)
+* [Profile settings](/l/ja/user-guide/settings/capabilities/profile-settings)
+* [Experience settings](/l/ja/user-guide/settings/capabilities/experience-settings)
diff --git a/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/calendar-view.mdx b/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/calendar-view.mdx
new file mode 100644
index 0000000000..5dce426eb7
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/calendar-view.mdx
@@ -0,0 +1,46 @@
+---
+title: Calendar View
+description: Display records with date fields on a calendar.
+---
+
+## About Calendar View
+
+Calendar view displays your records on a calendar based on a date field. Each record appears as an event on the corresponding date.
+
+
+
+## Creating a Calendar View
+
+1. Navigate to an object with date fields
+2. Click the view dropdown → **+ Add view**
+3. Name your view and click **Create**
+4. Open the **Options** on the right
+5. Select **Calendar** as the layout
+6. Choose the **date field** to use for positioning records
+7. Click **Update view**
+
+## Configuring the Calendar
+
+### Choose the Date Field
+
+Under **Options**, select which date field determines where records appear on the calendar.
+
+### Display Fields
+
+Configure which fields show on each calendar event:
+
+1. Click **Options → Fields**
+2. Toggle fields on/off
+3. Drag to reorder
+
+## Use Cases
+
+* **Meetings and calls**: View upcoming appointments
+* **Deadlines**: Track due dates and close dates
+* **Events**: Plan and visualize scheduled activities
+* **Follow-ups**: See when tasks are due
+
+## Related
+
+* [Views Overview](/l/ja/user-guide/views-pipelines/overview) — creating and managing views
+* [Filters and Sorting](/l/ja/user-guide/views-pipelines/capabilities/filters-and-sorting) — filtering calendar data
diff --git a/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/fields-and-columns.mdx b/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/fields-and-columns.mdx
new file mode 100644
index 0000000000..22334f8a19
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/fields-and-columns.mdx
@@ -0,0 +1,52 @@
+---
+title: Fields & Columns
+description: Choose which fields to display and how to organize them.
+---
+
+## Selecting Fields to Display
+
+Each view can show a different set of fields. Customize what's visible to focus on the information that matters.
+
+### Show or Hide Fields
+
+1. Click **Options** in the top right
+2. Click **Fields**
+3. Click the **eye icon** next to each field to show/hide it
+
+### Reorder Fields
+
+Change the order fields appear in your view:
+
+1. Click **Options → Fields**
+2. Drag fields up or down
+3. Changes save automatically
+
+## Field Display by View Type
+
+### Table Views
+
+* Fields appear as columns
+* Resize columns by dragging borders
+
+### Kanban Views
+
+* Fields appear on cards
+* Reorder via Options → Fields
+* Use Compact view to hide all fields
+
+### Calendar Views
+
+* Selected fields show on calendar events
+* Configure via Options → Fields
+
+## Best Practices
+
+* **Show only what's needed** — too many fields clutters the view
+* **Put important fields first** — most-used columns on the left
+* **Create multiple views** — different field sets for different purposes
+* **Use field visibility per view** — same object, different focus
+
+## Related
+
+* [Table Views](/l/ja/user-guide/views-pipelines/capabilities/table-views) — list view features
+* [Kanban Views](/l/ja/user-guide/views-pipelines/capabilities/kanban-views) — card-based views
diff --git a/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx b/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx
new file mode 100644
index 0000000000..7dabbec528
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx
@@ -0,0 +1,78 @@
+---
+title: Filters & Sorting
+description: Filter and sort records to find exactly what you need.
+---
+
+## Filtering Data
+
+Filters help you focus on specific records by showing only those that match your criteria.
+
+### Adding a Filter
+
+1. Click the **Filter** button in the toolbar
+2. Select the field to filter by
+3. Choose the operator (equals, contains, etc.)
+4. Enter the filter value
+5. Click **Apply**
+
+### Filter Operators
+
+| Field Type | Available Operators |
+| ---------- | -------------------------------------------------- |
+| Text | Equals, Contains, Starts with, Ends with, Is empty |
+| Number | Equals, Greater than, Less than, Between, Is empty |
+| Date | Equals, Before, After, Between, Is empty |
+| Select | Equals, Is any of, Is empty |
+| Checkbox | Is true, Is false |
+| Relation | Equals, Is empty |
+
+### Multiple Filters
+
+Combine multiple filters to narrow down results:
+
+* All filters are applied with AND logic
+* Each additional filter further restricts results
+
+### Removing Filters
+
+* Click the **X** on individual filter chips
+* Click **Clear all** to remove all filters
+
+## Sorting Data
+
+Sorting determines the order records appear.
+
+### Adding a Sort
+
+1. Click the **Sort** button in the toolbar
+2. Select the field to sort by
+3. Choose ascending (A-Z, 0-9) or descending (Z-A, 9-0)
+4. Click **Apply**
+
+### Multiple Sorts
+
+Add multiple sort levels:
+
+* First sort is primary
+* Subsequent sorts apply within groups of equal values
+
+### Quick Column Sorting
+
+Click any column header to sort:
+
+* First click: Ascending
+* Second click: Descending
+* Third click: Remove sort
+
+## Saving Filter and Sort Settings
+
+Filters and sorts are saved with the view:
+
+1. Configure your filters and sorts
+2. Click **Save** to update the current view
+3. Or click **Save as new view** to create a variant
+
+## Related
+
+* [Table Views](/l/ja/user-guide/views-pipelines/capabilities/table-views) — group by feature
+* [Views Overview](/l/ja/user-guide/views-pipelines/overview) — building and managing views
diff --git a/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/kanban-views.mdx b/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/kanban-views.mdx
new file mode 100644
index 0000000000..fa616d2f3d
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/kanban-views.mdx
@@ -0,0 +1,99 @@
+---
+title: Kanban Board Views
+description: Learn how to use Kanban views to visualize and manage your workflows.
+image: /images/user-guide/kanban-views/kanban.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## About Kanban Views
+
+Kanban views visually map out process flows, where each column stands for a distinct stage and each card represents a record.
+
+## Move Cards between Stages
+
+You can move each card between stages as it goes through your workflow by dragging and dropping. To proceed, hold your click on a card and move it to the next stage.
+
+
+
+## Add and Delete Stages
+
+You can tailor your workflow to suit your needs using stages, which represent a value in a Select Field:
+
+### Add Stages
+
+To add a stage, access the Select field settings by navigating to Settings > Data Model, selecting your object, and then the field your Kanban board depends on.
+
+
+
+### Remove Stages
+
+To remove a stage, hover the stage name or the `⋮` icon, click `Edit from settings` in the Select field settings, and then click **Delete** next to the relevant stage.
+
+## Display Fields
+
+You can configure your Kanban board to display some fields and hide others. To hide a field, click on **Options** on the top right, then on **Fields** to bring up the list of options. Look for the field needed in the Hidden Fields section and click on the eye button to display the field.
+
+You can also rearrange the order of fields by holding down the field name and dragging it to where you want it.
+
+
+
+## Compact View
+
+You can hide all the fields and get an overview of all records at a glance. To enable:
+
+1. Click **Options** on the top right
+2. Turn on the toggle for **Compact view**
+
+
+
+## Column Aggregations
+
+Each column in a Kanban view can display aggregated values at the top, helping you understand your data at a glance.
+
+### Available Aggregations
+
+| Aggregation | Description |
+| ----------- | --------------------------------------------- |
+| **Count** | Number of records in the column |
+| **Sum** | Total of a numeric field (e.g., deal amounts) |
+| **Average** | Average value of a numeric field |
+| **Min** | Lowest value |
+| **Max** | Highest value |
+
+### Configuring Aggregations
+
+1. Click on the number displayed next to the Stage value, at the top of a column
+2. Select the aggregation type
+3. Choose the field to aggregate
+
+**Example:** Show total deal value per stage by aggregating the Amount field with Sum.
+
+## When to Use Kanban Views
+
+Kanban views are ideal for:
+
+* **Sales pipelines**: Track deals through stages from lead to close
+* **Project management**: Monitor tasks through workflow states
+* **Recruitment**: Track candidates through hiring stages
+* **Any staged process**: Visualize any workflow with defined stages
+
+## Best Practices
+
+### Organize Your Stages
+
+* **Limit stages**: 5-7 stages is ideal for visibility
+* **Clear naming**: Use descriptive stage names
+* **Logical order**: Arrange stages in process order
+
+### Optimize Card Display
+
+* **Show key fields**: Display only the most important information
+* **Use compact view**: For high-level overviews
+* **Color coding**: Use stage colors to quickly identify status
+
+### Maintain Data Quality
+
+* **Update regularly**: Keep cards moving through stages
+* **Archive completed**: Move closed items out of active view
+* **Review stale cards**: Follow up on cards stuck in stages
diff --git a/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/table-views.mdx b/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/table-views.mdx
new file mode 100644
index 0000000000..90c793efe9
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/table-views.mdx
@@ -0,0 +1,64 @@
+---
+title: Table Views
+description: Display your data in a spreadsheet-like list format.
+---
+
+## About Table Views
+
+Table views display records in rows with customizable columns—like a spreadsheet. This is the default view type for most objects.
+
+
+
+## Features
+
+### Column Configuration
+
+* Show or hide columns (fields)
+* Resize column widths
+* Reorder columns by dragging
+
+### Group By a Select Field
+
+Organize records into collapsible groups based on a field of select type.
+
+
+
+1. Click **Options**
+2. Select **Group**
+3. Choose a Select field
+4. Configure group order under **Options → Group → Sort**:
+ * **Alphabetical** or **Reverse alphabetical**
+ * **Manual order**: Drag groups under "Visible groups" to reorder
+ * Click the **eye icon** next to a group to hide it
+
+**Use cases:**
+
+* Group Company by Type
+* Group Opportunities by Stage
+* Group Tasks by Status
+
+
+ **For best performance, limit to 10-15 visible groups per view.** If you need more groups, consider using a Dashboard instead.
+
+
+### Column Widths
+
+Resize columns to show more or less content:
+
+1. Hover between two column headers
+2. Click and drag the column border
+3. Release to set the new width
+
+## When to Use Table Views
+
+Table views work best for:
+
+* **Browsing large datasets** — scan many records quickly
+* **Data entry** — edit multiple records efficiently
+* **Detailed analysis** — see many fields at once
+* **Sorting and filtering** — find specific records
+
+## Related
+
+* [Fields and Columns](/l/ja/user-guide/views-pipelines/capabilities/fields-and-columns) — configuring which fields to display
+* [Filters and Sorting](/l/ja/user-guide/views-pipelines/capabilities/filters-and-sorting) — narrowing down records
diff --git a/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/view-settings.mdx b/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/view-settings.mdx
new file mode 100644
index 0000000000..89318845df
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/views-pipelines/capabilities/view-settings.mdx
@@ -0,0 +1,74 @@
+---
+title: View Settings
+description: Manage view visibility, naming, icons, and organization.
+---
+
+## View Visibility
+
+Control who can see your custom views.
+
+### Visibility Options
+
+| Setting | Who Can See |
+| ------------- | --------------------- |
+| **Workspace** | All workspace members |
+| **Unlisted** | Only you |
+
+### Changing Visibility
+
+1. Open the view
+2. Click **Options → Visibility**
+3. Select **Workspace** or **Unlisted**
+
+
+ The default "All [Object Name]" views cannot have their visibility changed.
+
+
+## Rename a View
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Edit**
+4. Enter the new name
+
+## Change View Icon
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Edit**
+4. Click the icon to change it
+
+## Reorder Views
+
+Change the order views appear in the dropdown:
+
+1. Open the view dropdown
+2. Drag views by their handle
+3. Drop in the desired position
+4. Order saves automatically
+
+## Favorites
+
+Pin frequently used views for quick access:
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to a view
+3. Select **Add to favorites**
+
+Favorited views appear in a dedicated section for easy access.
+
+## Delete a View
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Delete**
+4. Confirm deletion
+
+
+ Deleted views cannot be recovered.
+
+
+## Related
+
+* [Views Overview](/l/ja/user-guide/views-pipelines/overview) — creating views
+* [How to Restrict Access](/l/ja/user-guide/views-pipelines/how-tos/restrict-access-to-your-view) — step-by-step guide
diff --git a/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx b/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
new file mode 100644
index 0000000000..43fb38f691
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
@@ -0,0 +1,61 @@
+---
+title: Create a Calendar View for Tasks Due
+description: Visualize your tasks and deadlines on a calendar.
+---
+
+
+
+## Prerequisites
+
+Your Tasks object needs a **Due Date** field (Date or Date & Time type).
+
+## Steps
+
+1. Navigate to **Tasks**
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Tasks Calendar")
+4. Click **Create**
+5. Click **Options** and select **Calendar** as the layout
+6. Choose **Due Date** as the date field
+7. Click **Save**
+
+## Configure Your Calendar
+
+### Display Fields on Events
+
+1. Click **Options → Fields**
+2. Click the **eye icon** to show/hide fields
+3. Drag to reorder
+
+Recommended fields to display:
+
+* **Title** — task name
+* **Assignee** — who's responsible
+* **Status** — current progress
+
+### Filter Your Calendar
+
+Create focused views:
+
+* **My Tasks**: Filter by Assignee = Me
+* **This Week**: Filter by Due Date = This week
+* **Overdue**: Filter by Due Date < Today, Status ≠ Done
+
+## Other Calendar Use Cases
+
+| Object | Date Field | Purpose |
+| ------------- | ---------- | ------------------------- |
+| Opportunities | Close Date | Track expected closes |
+| Custom Events | Event Date | Plan activities |
+| Projects | Deadline | Monitor project timelines |
+
+## Tips
+
+* **Review weekly**: Start each week by checking your calendar view
+* **Combine with table view**: Use calendar for overview, table for details
+* **Set visibility**: Keep personal task calendars as Unlisted
+
+## Related
+
+* [Calendar View](/l/ja/user-guide/views-pipelines/capabilities/calendar-view) — all calendar features
+* [Filters and Sorting](/l/ja/user-guide/views-pipelines/capabilities/filters-and-sorting) — filter your calendar
diff --git a/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx b/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
new file mode 100644
index 0000000000..a8007e124c
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
@@ -0,0 +1,80 @@
+---
+title: Create a Kanban View for Projects
+description: Track projects through stages using a visual board.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Use a Kanban view to visualize your projects (or any object with stages) as cards moving through columns.
+
+
+
+## Prerequisites
+
+Your object needs a **Select field** to use as columns (e.g., Status, Stage, Phase).
+
+If you don't have one:
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Add a Select field with your stage options
+
+## Steps
+
+1. Navigate to your object (e.g., Projects, Tasks)
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Project Board")
+4. Click **Create**
+5. Click **Options** and select **Kanban** as the layout
+6. The view uses your Select field for columns automatically
+7. Click **Save**
+
+## Configure Your Board
+
+### Show Key Fields on Cards
+
+1. Click **Options → Fields**
+2. Find fields in the "Hidden Fields" section
+3. Click the **eye icon** to display them on cards
+4. Drag to reorder
+
+
+
+### Enable Compact View
+
+For a high-level overview:
+
+1. Click **Options**
+2. Turn on **Compact view**
+
+Cards show only the record name.
+
+
+
+### Add Aggregations
+
+Show counts or totals at the top of each column:
+
+1. Click the number next to a column name
+2. Select an aggregation (Count, Sum, etc.)
+3. Choose a field if needed
+
+## Moving Cards
+
+Drag and drop cards between columns to update their status.
+
+
+
+## Example: Task Board
+
+| Column (Status) | Cards |
+| --------------- | ----------------- |
+| **To Do** | New tasks |
+| **In Progress** | Active work |
+| **Review** | Awaiting approval |
+| **Done** | Completed |
+
+## Related
+
+* [Kanban Views](/l/ja/user-guide/views-pipelines/capabilities/kanban-views) — aggregations, compact view, stages
+* [How to Set Up a Sales Pipeline](/l/ja/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline) — Kanban for Opportunities
diff --git a/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx b/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx
new file mode 100644
index 0000000000..055afc3717
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx
@@ -0,0 +1,51 @@
+---
+title: Create a Table View with Grouping
+description: Organize your records into collapsible groups by field value.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Group your table view by a Select field to organize records into collapsible sections.
+
+
+
+## Steps
+
+1. Navigate to the object (People, Companies, etc.)
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Companies by Type")
+4. Click **Create**
+5. Click **Options → Group**
+6. Choose a Select field to group by
+7. Click **Save**
+
+## Configure Group Order
+
+Under **Options → Group → Sort**, choose how groups are ordered:
+
+| Option | Description |
+| ------------------------ | --------------------------------------------- |
+| **Alphabetical** | A to Z |
+| **Reverse alphabetical** | Z to A |
+| **Manual order** | Drag groups to reorder under "Visible groups" |
+
+Click the **eye icon** next to a group to hide it from the view.
+
+
+ **For best performance, limit to 10-15 visible groups.** If you need more, consider using a Dashboard instead.
+
+
+## Example: Companies by Industry
+
+1. Go to **Companies**
+2. Create a new view named "By Industry"
+3. Click **Options → Group**
+4. Select the **Industry** field
+5. Save
+
+Now your companies are organized by industry, making it easy to focus on one segment at a time.
+
+## Related
+
+* [Table Views](/l/ja/user-guide/views-pipelines/capabilities/table-views) — all table view features
+* [Filters and Sorting](/l/ja/user-guide/views-pipelines/capabilities/filters-and-sorting) — combine grouping with filters
diff --git a/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx b/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
new file mode 100644
index 0000000000..def753af81
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
@@ -0,0 +1,32 @@
+---
+title: Restrict Access to Your View
+description: Control who can see your custom views.
+---
+
+Each view (except the default "All [Object Name]" views) has its own visibility setting.
+
+## Steps
+
+1. Open the view you want to restrict
+2. Click **Options** in the top right
+3. Click **Visibility**
+4. Select **Unlisted**
+
+Your view is now visible only to you.
+
+## Visibility Options
+
+| Setting | Who Can See |
+| ------------- | --------------------- |
+| **Workspace** | All workspace members |
+| **Unlisted** | Only you |
+
+## Notes
+
+* The default "All [Object Name]" views cannot be made unlisted
+* Unlisted views don't appear in other users' view dropdowns
+* You can change visibility back to Workspace at any time
+
+## Related
+
+* [View Settings](/l/ja/user-guide/views-pipelines/capabilities/view-settings) — all view configuration options
diff --git a/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx b/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx
new file mode 100644
index 0000000000..289c525ddc
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx
@@ -0,0 +1,120 @@
+---
+title: Set Up a Sales Pipeline
+description: Configure your sales pipeline to track opportunities through stages.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+A sales pipeline in Twenty is a Kanban view of your Opportunities object, where each column represents a stage in your sales process.
+
+## Step 1: Configure Your Stages
+
+Stages are defined in the Opportunities object's **Stage** field.
+
+1. Go to **Settings → Data Model**
+2. Select **Opportunities**
+3. Find and click the **Stage** field
+4. Add, remove, or rename stages to match your process
+
+
+
+### Recommended Stages
+
+| Stage | Purpose |
+| --------------- | ----------------------------------- |
+| **New** | Fresh opportunities just identified |
+| **Qualified** | Confirmed as a good fit |
+| **Meeting** | Engaged in discussions |
+| **Proposal** | Proposal sent |
+| **Negotiation** | Working on terms |
+| **Closed Won** | Deal successful |
+| **Closed Lost** | Deal unsuccessful |
+
+
+ **5-7 stages is optimal.** Too many stages makes the pipeline hard to scan; too few loses visibility into deal progress.
+
+
+## Step 2: Create a Pipeline View
+
+1. Go to **Opportunities**
+2. Click the view dropdown → **+ Add view**
+3. Name it "Sales Pipeline"
+4. Click **Create**
+5. Open **Options** and select **Kanban** as the layout
+
+The view automatically uses the Stage field for columns.
+
+## Step 3: Configure Your View
+
+### Show Key Fields
+
+1. Click **Options → Fields**
+2. Look for fields in the "Hidden Fields" section
+3. Click the **eye icon** to display: Company, Amount, Close Date, Owner
+
+### Enable Aggregations
+
+Show totals at the top of each column:
+
+1. Click the number displayed next to a Stage name at the top of a column
+2. Select the aggregation type (Count, Sum, Average, etc.)
+3. Choose the field to aggregate (e.g., Amount)
+
+**Example:** Show total deal value per stage by aggregating Amount with Sum.
+
+### Use Compact View (Optional)
+
+For a high-level overview with minimal card content:
+
+1. Click **Options**
+2. Turn on the toggle for **Compact view**
+
+## Step 4: Create Personal and Team Views
+
+### "My Pipeline"
+
+* **Filter**: Owner = Me
+* **Visibility**: Unlisted (personal view)
+
+### "Team Pipeline"
+
+* **Filter**: None (show all)
+* **Visibility**: Workspace (shared view)
+
+### "Closing This Month"
+
+* **Type**: Table
+* **Filter**: Close Date = This month, Stage ≠ Closed Won, Stage ≠ Closed Lost
+* **Sort**: Close Date ascending
+
+## Working with Opportunities
+
+### Creating Opportunities
+
+* Click **+ New** in the Opportunities view
+* Or click **+** in a specific stage column
+
+### Moving Through Stages
+
+Drag and drop opportunity cards between columns to update their stage.
+
+
+
+## Best Practices
+
+### Pipeline Hygiene
+
+* Update deals daily as they progress
+* Move or close stale deals promptly
+* Keep close dates realistic
+
+### Stage Discipline
+
+* Define clear criteria for each stage
+* Move deals promptly when criteria are met
+* Don't let deals sit in stages too long
+
+## Related
+
+* [Kanban Views](/l/ja/user-guide/views-pipelines/capabilities/kanban-views) — aggregations and compact view
+* [Filters and Sorting](/l/ja/user-guide/views-pipelines/capabilities/filters-and-sorting) — creating filtered views
diff --git a/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx b/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
new file mode 100644
index 0000000000..deadf181ce
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
@@ -0,0 +1,149 @@
+---
+title: Show Expected Amount in Your Pipeline
+description: Calculate and display weighted deal values based on stage probability.
+---
+
+The Expected Amount is a calculated value: **Amount × Probability**. This helps you forecast revenue by weighting deals based on how likely they are to close.
+
+
+ This is an example of creating [Formula Fields](/l/ja/user-guide/workflows/how-tos/crm-automations/formula-fields) using workflows.
+
+
+This guide walks you through setting up the custom fields and workflows needed to calculate and display expected amounts in your pipeline.
+
+## Step 1: Create Custom Fields
+
+You need two custom fields on the Opportunities object.
+
+### Create the Probability Field
+
+1. Go to **Settings → Data Model → Opportunities**
+2. Click **+ Add Field**
+3. Configure:
+ * **Name**: Probability
+ * **Type**: Number
+ * **Description**: Stage-based probability (0-100%)
+4. Click **Save**
+
+### Create the Expected Amount Field
+
+1. Click **+ Add Field**
+2. Configure:
+ * **Name**: Expected Amount
+ * **Type**: Currency
+ * **Description**: Calculated: Amount × Probability
+3. Click **Save**
+
+### Optional: Make Fields Read-Only for Users
+
+If you don't want users manually editing these calculated fields:
+
+1. Go to **Settings → Roles**
+2. Select the role to configure
+3. Find the Opportunities object
+4. Set **Probability** and **Expected Amount** fields to read-only
+
+This ensures only the workflows can update these values.
+
+## Step 2: Create Workflow #1 — Update Probability on Stage Change
+
+This workflow automatically sets the Probability when an opportunity moves to a new stage.
+
+### Create the Workflow
+
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Update Probability on Stage Change"
+
+### Configure the Trigger
+
+1. Add a **Record Created or Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Stage** field is updated
+
+### Add Branches for Each Stage
+
+Create a branch for each stage with its probability:
+
+| Stage | Probability |
+| ----------- | ----------- |
+| New | 10% |
+| Qualified | 25% |
+| Meeting | 40% |
+| Proposal | 60% |
+| Negotiation | 80% |
+| Closed Won | 100% |
+| Closed Lost | 0% |
+
+
+ To create a new branch, right click on the workflow canvas and click **New action**. Then, link this action to the previous node by dragging the arrow from the previous node to this new action.
+
+
+For each stage:
+
+1. Add a **Filter** node: Stage = [stage name]
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Probability
+ * Value: [probability for that stage]
+
+### Calculate Expected Amount
+
+After the branches rejoin:
+
+1. Add a **Filter** node: Amount is not empty
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Expected Amount
+ * Value: Amount × Probability
+
+## Step 3: Create Workflow #2 — Recalculate on Amount Change
+
+This workflow updates the Expected Amount when the deal Amount changes.
+
+### Create the Workflow
+
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Recalculate Expected Amount on Amount Change"
+
+### Configure the Trigger
+
+1. Add a **Record Created or Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Amount** field is updated
+
+### Add the Logic
+
+1. Add a **Filter** node: Amount is not empty
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Expected Amount
+ * Value: Amount × Probability
+
+## Step 4: Display in Your Pipeline
+
+Now show the Expected Amount totals in your Kanban view:
+
+1. Open your **Sales Pipeline** Kanban view
+2. Click the **number** next to any Stage name at the top of a column
+3. Select **Sum**
+4. Choose **Expected Amount**
+
+Each column now shows the total weighted pipeline value for that stage.
+
+## Summary
+
+| Component | Purpose |
+| ------------------------- | ------------------------------------------------------------------------- |
+| **Probability field** | Stores the stage-based win probability |
+| **Expected Amount field** | Stores Amount × Probability |
+| **Workflow #1** | Updates Probability when Stage changes, then recalculates Expected Amount |
+| **Workflow #2** | Recalculates Expected Amount when Amount changes |
+| **Aggregation** | Displays Sum of Expected Amount per stage |
+
+## Related
+
+* [Formula Fields](/l/ja/user-guide/workflows/how-tos/crm-automations/formula-fields) — create calculated fields using workflows
+* [Kanban Views](/l/ja/user-guide/views-pipelines/capabilities/kanban-views) — column aggregations
+* [How to Create Custom Fields](/l/ja/user-guide/data-model/how-tos/create-custom-fields) — field configuration
diff --git a/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx b/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
new file mode 100644
index 0000000000..7d997135eb
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
@@ -0,0 +1,231 @@
+---
+title: Track How Long Opportunities Stay in Each Stage
+description: Monitor deal velocity by tracking when opportunities enter each stage.
+---
+
+
+ This is an example of creating [Formula Fields](/l/ja/user-guide/workflows/how-tos/crm-automations/formula-fields) using workflows — specifically date calculations.
+
+
+Tracking when opportunities enter each stage helps you identify bottlenecks and measure deal velocity.
+
+This guide walks you through setting up custom fields and a workflow to automatically record when an opportunity moves to each stage, and calculate how many days it spent in the previous stage.
+
+## Step 1: Create Custom Fields
+
+You need two types of fields for each stage:
+
+* **Date & Time fields**: Record when the opportunity entered each stage
+* **Number fields**: Store how many days the opportunity spent in each stage
+
+### Create the "Last Entered" Fields
+
+1. Go to **Settings → Data Model → Opportunities**
+2. For each stage, click **+ Add Field** and configure:
+ * **Name**: Last Entered [Stage Name] (e.g., "Last Entered New", "Last Entered Qualified")
+ * **Type**: Date & Time
+ * **Description**: Timestamp when opportunity entered this stage
+3. Click **Save**
+
+Create these fields:
+
+* Last Entered New
+* Last Entered Qualified
+* Last Entered Meeting
+* Last Entered Proposal
+* Last Entered Negotiation
+* Last Entered Closed Won
+* Last Entered Closed Lost
+
+### Create the "Days in Stage" Fields
+
+1. For each stage, click **+ Add Field** and configure:
+ * **Name**: Days in [Stage Name] (e.g., "Days in New", "Days in Qualified")
+ * **Type**: Number
+ * **Description**: Number of days spent in this stage
+2. Click **Save**
+
+Create these fields:
+
+* Days in New
+* Days in Qualified
+* Days in Meeting
+* Days in Proposal
+* Days in Negotiation
+
+
+ You don't need "Days in" fields for Closed Won and Closed Lost since those are final stages.
+
+
+### Optional: Make Fields Read-Only
+
+If you don't want users manually editing these calculated fields:
+
+1. Go to **Settings → Roles**
+2. Select the role to configure
+3. Find the Opportunities object
+4. Set the "Last Entered" and "Days in" fields to read-only
+
+## Step 2: Create the Workflow
+
+This single workflow handles both tasks:
+
+* Records the timestamp when entering a new stage
+* Calculates days spent in the previous stage
+
+### Create the Workflow
+
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Track Stage Time"
+
+### Configure the Trigger
+
+1. Add a **Record Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Stage** field is updated
+
+### Add Branches for Each Stage
+
+
+ To create a new branch, right click on the workflow canvas and click **New action**. Then, link this action to the previous node by dragging the arrow from the previous node to this new action.
+
+
+---
+
+**Branch 1: Stage = New (first stage)**
+
+Since this is the first stage, we only record the entry timestamp—no previous stage to calculate.
+
+1. Add a **Filter** node: Stage = New
+2. Add a **Code** action:
+
+```javascript
+export const main = async (): Promise => {
+ return { now: new Date().toISOString() };
+};
+```
+
+3. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Last Entered New
+ * Value: `now` from Code node
+
+---
+
+**Branch 2: Stage = Qualified**
+
+When moving to Qualified, record entry time AND calculate days spent in New.
+
+1. Add a **Filter** node: Stage = Qualified
+2. Add a **Code** action:
+
+```javascript
+export const main = async (params: {
+ lastEnteredPreviousStage: Date;
+}): Promise => {
+ const { lastEnteredPreviousStage } = params;
+
+ const now = new Date();
+ const entryDate = new Date(lastEnteredPreviousStage);
+ const diffTime = Math.abs(now.getTime() - entryDate.getTime());
+ const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return {
+ now: now.toISOString(),
+ daysInPreviousStage: daysInPreviousStage
+ };
+};
+```
+
+3. Configure the Code node input: map `lastEnteredPreviousStage` to the **Last Entered New** field
+4. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Fields to update:
+ * Last Entered Qualified = `now`
+ * Days in New = `daysInPreviousStage`
+
+---
+
+**Branch 3: Stage = Meeting**
+
+When moving to Meeting, record entry time AND calculate days spent in Qualified.
+
+1. Add a **Filter** node: Stage = Meeting
+2. Add a **Code** action:
+
+```javascript
+export const main = async (params: {
+ lastEnteredPreviousStage: Date;
+}): Promise => {
+ const { lastEnteredPreviousStage } = params;
+
+ const now = new Date();
+ const entryDate = new Date(lastEnteredPreviousStage);
+ const diffTime = Math.abs(now.getTime() - entryDate.getTime());
+ const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return {
+ now: now.toISOString(),
+ daysInPreviousStage: daysInPreviousStage
+ };
+};
+```
+
+3. Configure the Code node input: map `lastEnteredPreviousStage` to the **Last Entered Qualified** field
+4. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Fields to update:
+ * Last Entered Meeting = `now`
+ * Days in Qualified = `daysInPreviousStage`
+
+---
+
+**Continue for remaining stages:**
+
+| Stage | Records | Calculates |
+| ----------- | ------------------------ | ------------------- |
+| Proposal | Last Entered Proposal | Days in Meeting |
+| Negotiation | Last Entered Negotiation | Days in Proposal |
+| Closed Won | Last Entered Closed Won | Days in Negotiation |
+| Closed Lost | Last Entered Closed Lost | Days in Negotiation |
+
+The branches do not need to rejoin—each runs independently when its stage condition is met.
+
+## Step 3: Analyze Time in Stage
+
+With timestamps and day counts recorded, you can now analyze deal velocity.
+
+### Create a "Slow Deals" View
+
+1. Create a Table view of Opportunities
+2. Add columns: Name, Stage, Days in [previous stage], Amount
+3. Sort by "Days in" field (descending)
+4. Filter by Stage to focus on one stage at a time
+
+Deals at the top spent the most time in the previous stage.
+
+### Use Aggregations
+
+In your pipeline Kanban view:
+
+1. Click the number next to a Stage name
+2. Select **Average**
+3. Choose a "Days in" field
+
+This shows the average time deals spend in each stage.
+
+## Summary
+
+| Component | Purpose |
+| ------------------------ | ------------------------------------------------- |
+| **Last Entered fields** | Store when opportunity entered each stage |
+| **Days in fields** | Store how many days spent in each stage |
+| **Workflow** | Records timestamp AND calculates days in one pass |
+| **Views & Aggregations** | Analyze deal velocity and identify bottlenecks |
+
+## Related
+
+* [Workflows](/l/ja/user-guide/workflows/overview) — automation basics
+* [How to Create Custom Fields](/l/ja/user-guide/data-model/how-tos/create-custom-fields) — field configuration
+* [Kanban Views](/l/ja/user-guide/views-pipelines/capabilities/kanban-views) — aggregations
diff --git a/packages/twenty-docs/l/ja/user-guide/views-pipelines/overview.mdx b/packages/twenty-docs/l/ja/user-guide/views-pipelines/overview.mdx
new file mode 100644
index 0000000000..2e46c753ed
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/views-pipelines/overview.mdx
@@ -0,0 +1,137 @@
+---
+title: Views & Pipelines
+description: Learn how to create and manage views in Twenty.
+image: /images/user-guide/table-views/table.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+
+
+## Understanding Views
+
+Views are saved configurations that determine how your data is displayed. Each view can have its own:
+
+* **Layout**: Table, Kanban, or Calendar
+* **Filters**: Which records to show
+* **Sorting**: How records are ordered
+* **Fields**: Which columns are visible
+
+## View Types
+
+### Table View
+
+The default spreadsheet-like view showing records in rows with customizable columns.
+
+### Kanban View
+
+A visual board view where records appear as cards organized by stages. Ideal for:
+
+* Sales pipelines
+* Project tracking
+* Any workflow with defined stages
+
+### Calendar View
+
+Display records with date fields on a calendar. Perfect for:
+
+* Meetings and events
+* Deadlines and due dates
+* Time-based planning
+
+## Creating a View
+
+There are two ways to create a new view.
+
+### Use the View Dropdown Menu
+
+1. Navigate to any object (People, Companies, etc.)
+2. Click the view name at the top left (shows current view with a dropdown arrow)
+3. Click **+ Add view**
+4. Name your view and click **Create**
+5. Choose a layout (Table, Kanban, or Calendar) under **Options**
+6. Add filters and sorting as needed
+7. Select which fields to display and reorder them
+8. Click **Save**
+
+
+
+### Start by editting an existing view
+
+1. Navigate to any object (People, Companies, etc.)
+2. Choose a layout (Table, Kanban, or Calendar) under **Options** or Add filters and sorting as needed
+3. Click on **Save as new view**
+4. Name your view and click **Create**
+5. Keep editing your new view
+6. Click on **Update view** to save your additional configurations
+
+
+
+## Managing Views
+
+### Edit a View
+
+1. Select the view from the dropdown
+2. Make your changes (filters, sorting, columns)
+3. Click **Save** to update the view
+
+### Rename a View or Change Its Icon
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view name
+3. Select **Edit**
+4. Change the name or icon
+5. Click **Save**
+
+### Reorder Views
+
+1. Open the view dropdown
+2. Click and drag a view by its handle
+3. Drop it in the desired position
+4. The new order is saved automatically
+
+### Add to Favorites
+
+Pin frequently used views for quick access:
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to a view
+3. Select **Add to favorites**
+4. The view appears in your favorites section
+
+### Delete a View
+
+1. Select the view to delete
+2. Click the view dropdown
+3. Click the **⋮** menu next to the view
+4. Select **Delete**
+5. Confirm deletion
+
+
+ Deleted views cannot be recovered. Make sure you want to remove it before confirming.
+
+
+## View Visibility
+
+Each view (except the default "All [Object Name]" views) has its own visibility setting.
+
+To change visibility:
+
+1. Open the view
+2. Click **Options → Visibility**
+3. Choose:
+ * **Workspace**: Visible to all workspace members
+ * **Unlisted**: Visible only to you
+
+
+ The default "All [Object Name]" views cannot have their visibility changed.
+
+
+## Next Steps
+
+* [Table Views](/l/ja/user-guide/views-pipelines/capabilities/table-views)
+* [Kanban Views](/l/ja/user-guide/views-pipelines/capabilities/kanban-views)
+* [Filters and Sorting](/l/ja/user-guide/views-pipelines/capabilities/filters-and-sorting)
+* [View Settings](/l/ja/user-guide/views-pipelines/capabilities/view-settings)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/send-emails-from-workflows.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/send-emails-from-workflows.mdx
new file mode 100644
index 0000000000..af21237036
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/send-emails-from-workflows.mdx
@@ -0,0 +1,149 @@
+---
+title: Send Emails from Workflows
+description: Send personalized emails automatically using workflow actions.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Automatically send emails when specific events occur in your CRM—welcome new contacts, follow up on opportunities, or notify team members.
+
+## Prerequisites
+
+Before you can send emails from workflows:
+
+1. Connect an email account under **Settings → Accounts**
+2. Ensure the account has sending permissions enabled
+
+## Basic Email Workflow
+
+### Example: Welcome Email for New Contacts
+
+**Goal**: Send a welcome email when a new person is added to the CRM.
+
+**Setup**:
+
+1. **Create workflow**: Go to **Settings → Workflows** and click **+ New Workflow**
+
+2. **Add trigger**: Select **Record is Created** → **People**
+
+3. **Add Send Email action**:
+ * Click **+** to add an action
+ * Select **Send Email**
+ * Configure the email:
+
+| Field | Value |
+| ----------- | -------------------------------------- |
+| **To** | `{{trigger.object.email}}` |
+| **Subject** | `Welcome to {{Your Company Name}}` |
+| **Body** | `Hi {{trigger.object.firstName}}, ...` |
+
+4. **Test and activate**: Test with a sample record, then activate
+
+## Using Variables in Emails
+
+Reference data from previous steps using `{{variable}}` syntax:
+
+```text
+Hi {{trigger.object.firstName}},
+
+Thank you for connecting with us!
+
+Your company, {{trigger.object.company.name}}, is now in our system.
+
+Best regards,
+The Team
+```
+
+### Available Variables from Triggers
+
+| Trigger Type | Common Variables |
+| -------------------------- | -------------------------------------- |
+| **Record Created/Updated** | `{{trigger.object.fieldName}}` |
+| **Manual** | `{{trigger.selectedRecord.fieldName}}` |
+| **Webhook** | `{{trigger.body.fieldName}}` |
+
+## Advanced: Conditional Emails
+
+### Example: Different Emails Based on Lead Source
+
+**Goal**: Send different welcome emails based on where the lead came from.
+
+**Setup**:
+
+1. **Trigger**: Record is Created (People)
+
+2. **Add Filter action**:
+ * Condition: `{{trigger.object.source}}` equals `"Website"`
+ * If true → continue to website welcome email
+
+3. **Branch for other sources**:
+ * Create parallel branches for different sources
+ * Each branch has its own Send Email action
+
+## Sending Emails to Multiple Recipients
+
+### Example: Notify Team When Deal Closes
+
+**Goal**: Email the sales rep and their manager when an opportunity is won.
+
+**Setup**:
+
+1. **Trigger**: Record is Updated (Opportunities, Stage = "Closed Won")
+
+2. **Search Records**: Find the opportunity owner's manager
+
+3. **Send Email #1**: To opportunity owner
+ * To: `{{trigger.object.owner.email}}`
+ * Subject: `Congratulations on closing {{trigger.object.name}}!`
+
+4. **Send Email #2**: To manager
+ * To: `{{searchRecords.manager.email}}`
+ * Subject: `Deal Won: {{trigger.object.name}}`
+
+## Scheduled Follow-up Emails
+
+### Example: Follow Up 3 Days After Meeting
+
+**Goal**: Send a follow-up email 3 days after a meeting is logged.
+
+**Setup**:
+
+1. **Trigger**: Record is Created (Activities, Type = "Meeting")
+
+2. **Delay action**: Wait 3 days
+
+3. **Send Email**:
+ * To: Meeting attendee
+ * Subject: Following up on our conversation
+ * Body: Reference meeting details from trigger
+
+## Best Practices
+
+### Email Content
+
+* Keep subject lines concise and relevant
+* Personalize with recipient's name
+* Include a clear call to action
+* Test emails before activating
+
+### Deliverability
+
+* Don't send too many emails too quickly
+* Use professional email signatures
+* Avoid spam trigger words
+* Ensure unsubscribe options for marketing emails
+
+### Troubleshooting
+
+* Verify email account is connected and active
+* Check recipient email address is valid
+* Review workflow runs for error messages
+* Test with your own email address first
+
+
+ **Coming soon**: Email attachments will be available in Q1 2026.
+
+
+## Related
+
+* [Workflow Triggers](/l/ja/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/use-branches-in-workflows.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
new file mode 100644
index 0000000000..9ca8697c50
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
@@ -0,0 +1,90 @@
+---
+title: Use Branches in Workflows
+description: Understand how branches work and how to control which path is executed.
+---
+
+## How Branches Work
+
+In the workflow editor, you can create multiple paths (branches) going out from a single node. This allows you to build complex automations with different outcomes.
+
+**Important**: When a workflow runs, **all branches execute in parallel by default**. There is no built-in "if/else" logic to choose one branch over another—every path will run simultaneously.
+
+## Controlling Which Branch Runs
+
+To execute only one branch based on specific conditions, **add a Filter node at the beginning of each branch**.
+
+### Example Setup
+
+1. Create your workflow with multiple branches from a single node
+2. Add a **Filter** node as the first step in each branch
+3. Set conditions on each Filter to determine when that branch should continue
+4. Only the branch(es) whose Filter conditions are met will proceed
+
+
+
+### How Filters Work
+
+* If the Filter condition is **met**: The branch continues executing
+* If the Filter condition is **not met**: The branch stops at the Filter node
+
+This effectively creates conditional logic where only the appropriate branch runs based on your data.
+
+## Example: Route by Deal Size
+
+**Scenario**: When a deal is closed, send different notifications based on deal size.
+
+1. **Trigger**: Opportunity updated (Stage = Closed Won)
+2. **Branch 1**: Filter for Amount > $10,000 → Send Slack message to #big-deals
+3. **Branch 2**: Filter for Amount ≤ $10,000 → Send email to sales manager
+
+Both branches start, but only the one matching the deal amount will continue past its Filter.
+
+## Creating Branches
+
+
+ To create a new branch from an existing step, click the **+** button on the step and add your action. You can add multiple branches by clicking **+** multiple times.
+
+
+1. In the workflow editor, select the step you want to branch from
+2. Click the **+** button to add an action
+3. This creates one branch
+4. Click **+** again on the same step to create additional branches
+5. Each branch can have its own sequence of actions
+
+## Merging Branches Back Together
+
+After parallel branches complete their work, you can merge them back into a single path:
+
+1. Complete your branched actions
+2. Add a new step that should run after all branches
+3. Drag a connection from the last step of each branch to this new step
+4. The merged step waits for all connected branches to complete before executing
+
+### Example: Process Then Notify
+
+```
+Trigger
+ │
+ ├── Branch A: Update Customer Record
+ │
+ └── Branch B: Create Support Ticket
+
+ ↘ ↙
+
+ Merged Step: Send Confirmation Email
+```
+
+The confirmation email sends only after both the customer update and ticket creation are done.
+
+## Best Practices
+
+* Always use **Filter nodes** at the start of branches when you want conditional execution
+* Keep branch conditions **mutually exclusive** to avoid duplicate actions
+* Test your workflows with different data to ensure the correct branches run
+* **Rename branch steps** descriptively so it's clear what each path does
+* **Merge branches** when you need a final action after parallel processing
+
+## Related
+
+* [Workflows FAQ](/l/ja/user-guide/workflows/how-tos/need-more-help/workflows-faq) — answers about parallel execution
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions) — available actions for branches
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/use-iterator.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/use-iterator.mdx
new file mode 100644
index 0000000000..20a1ed7d2b
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/use-iterator.mdx
@@ -0,0 +1,180 @@
+---
+title: Use Iterator
+description: Loop through arrays of records to perform actions on each item.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Iterator lets you loop through an array of records and perform actions on each one. It's essential for workflows that need to process multiple records returned by Search Records or received via webhooks.
+
+
+ Iterator is currently in beta. Activate it under **Settings → Releases → Lab**.
+
+
+## When to Use Iterator
+
+| Scenario | Example |
+| -------------------------- | ---------------------------------------------- |
+| **Process search results** | Send email to each person found |
+| **Handle webhook arrays** | Create records for each item in order |
+| **Bulk updates** | Update multiple records with calculated values |
+| **Notifications** | Alert multiple people about an event |
+
+## Understanding Iterator
+
+Iterator expects an **array** as input. It then:
+
+1. Takes the first item from the array
+2. Runs all actions inside the iterator with that item
+3. Moves to the next item
+4. Repeats until all items are processed
+
+## Basic Setup
+
+### Example: Email Everyone in Search Results
+
+**Goal**: Find all contacts in a specific company and send each one a personalized email.
+
+### Step 1: Search for Records
+
+1. Add **Search Records** action
+2. Object: **People**
+3. Filter: Company equals "Acme Inc"
+4. This returns an array of people
+
+### Step 2: Check Results Exist
+
+1. Add **Filter** action
+2. Condition: `{{searchRecords.length}}` is greater than 0
+3. This prevents Iterator errors on empty results
+
+### Step 3: Add Iterator
+
+1. Add **Iterator** action
+2. Array input: Select `{{searchRecords}}`
+3. This creates a loop
+
+### Step 4: Add Actions Inside Iterator
+
+Actions placed after Iterator run for each item:
+
+1. Add **Send Email** action (inside iterator)
+2. To: `{{iterator.currentItem.email}}`
+3. Subject: Hello `{{iterator.currentItem.firstName}}`!
+4. Body: Personalized message using current item fields
+
+### Result
+
+If Search Records returns 5 people, the Iterator:
+
+* Sends email to person 1
+* Sends email to person 2
+* ... continues for all 5
+
+## Accessing Current Item Data
+
+Inside Iterator, use `{{iterator.currentItem}}` to access the current record:
+
+| Variable | Description |
+| --------------------------------------- | ----------------------------------- |
+| `{{iterator.currentItem}}` | The entire current record object |
+| `{{iterator.currentItem.id}}` | Record ID |
+| `{{iterator.currentItem.email}}` | Email field |
+| `{{iterator.currentItem.company.name}}` | Related company name |
+| `{{iterator.index}}` | Current position in array (0-based) |
+
+## Common Patterns
+
+### Update Multiple Records
+
+**Goal**: Mark all overdue tasks as "Late"
+
+```
+1. Search Records (Tasks, Due Date < Today, Status ≠ Completed)
+2. Filter (length > 0)
+3. Iterator (searchRecords)
+ └── Update Record
+ - Object: Tasks
+ - Record: {{iterator.currentItem.id}}
+ - Status: Late
+```
+
+### Create Records from Array
+
+**Goal**: Webhook receives order with multiple items, create a record for each
+
+```
+1. Webhook Trigger (receives items array)
+2. Filter (items.length > 0)
+3. Iterator (trigger.body.items)
+ └── Create Record
+ - Object: Order Items
+ - Name: {{iterator.currentItem.name}}
+ - Quantity: {{iterator.currentItem.qty}}
+ - Related Order: {{trigger.body.orderId}}
+```
+
+### Conditional Processing Inside Loop
+
+**Goal**: Only send email to contacts with valid emails
+
+```
+1. Search Records (People)
+2. Iterator (searchRecords)
+ └── Filter (currentItem.email is not empty)
+ └── Send Email
+ - To: {{iterator.currentItem.email}}
+```
+
+## Troubleshooting
+
+### "Iterator expects an array"
+
+**Cause**: You passed a single record instead of an array.
+
+**Fix**: Make sure you're passing the result of Search Records or an array field, not a single record.
+
+```
+✅ Correct: {{searchRecords}}
+❌ Wrong: {{searchRecords[0]}}
+```
+
+### Iterator Doesn't Run
+
+**Cause**: The array is empty.
+
+**Fix**: Add a Filter before Iterator to check array length:
+
+```
+Filter: {{searchRecords.length}} > 0
+```
+
+### Actions Run Too Many Times
+
+**Cause**: Search Records returned more records than expected.
+
+**Fix**:
+
+* Add more specific filters to Search Records
+* Set a limit on Search Records (max 200)
+* Add Filter inside Iterator for additional conditions
+
+## Performance Considerations
+
+* **Credit usage**: Each iteration consumes credits for its actions
+* **Time**: Large arrays take longer to process
+* **Limits**: Consider batching very large operations
+* **Rate limits**: External API calls may hit rate limits with many iterations
+
+## Best Practices
+
+1. **Always check array length** before Iterator to avoid errors
+2. **Add filters inside loops** when not all items need processing
+3. **Rename your Iterator step** to describe what it's looping through
+4. **Test with small arrays** before processing large datasets
+5. **Monitor workflow runs** to ensure iterations complete as expected
+
+## Related
+
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions)
+* [How to Use Branches](/l/ja/user-guide/workflows/capabilities/use-branches-in-workflows)
+* [Workflows FAQ](/l/ja/user-guide/workflows/how-tos/need-more-help/workflows-faq)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-actions.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-actions.mdx
new file mode 100644
index 0000000000..bdd79cb3a9
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-actions.mdx
@@ -0,0 +1,311 @@
+---
+title: Workflow Actions
+description: Learn about the actions available in Twenty workflows.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## About Actions
+
+Actions define what happens after a trigger fires. You can chain multiple actions together to build complex automations.
+
+
+ * Use the variable picker (click the `(x+)` icon) to browse available data from previous steps
+ * Hover over any input field to see which step a variable comes from — helpful when the same field (e.g., ID) exists in multiple previous steps
+ * Give each action a descriptive name for easier maintenance
+
+
+## Record Actions
+
+
+
+### Create a Record
+
+Adds a new record to a selected object.
+
+**Configuration**:
+
+* Select the target object
+* Fill out the required and optional fields
+* Use data from previous steps or input values manually to populate fields
+
+**Output**: The newly created record data is available for use in subsequent steps.
+
+### Update Record
+
+Modifies an existing record in a selected object.
+
+
+
+**Configuration**:
+
+* Select the target object
+* Choose the specific record to update.
+ * You can either choose a fixed record, using the drop down menu displaying all available records.
+ * Or you can have the record dynamically selected, by designating a record found in a previous step, using the `(x+)`. You cannot search for the record based on different criteria at this stage. If you've not yet identified the record, add a `Search Record` step before this `Update Record` step.
+* Select fields to modify and enter new values
+
+**Output**: The updated record data is available for use in subsequent steps.
+
+### Delete Record
+
+Removes a record from a selected object.
+
+**Configuration**:
+
+* Select the target object
+* Choose the specific record to delete
+
+**Output**: The deleted record data remains available for use in subsequent steps.
+
+### Search Records
+
+Finds records within a selected object using filter conditions.
+
+**Configuration**:
+
+* Select the object to search
+* Set filter criteria to narrow results
+* Configure sorting and limits
+
+**Output**: Returns matching records that can be used in subsequent steps.
+
+
+ **Limit**: Search Records returns a maximum of **200 records**. If you need to process more, add specific filters to reduce results or use scheduled workflows to process in batches.
+
+
+**Best Practice**: Use [branches](/l/ja/user-guide/workflows/capabilities/workflow-branches) after Search Records to handle "found" vs "not found" scenarios.
+
+### Upsert Record
+
+Creates a new record or updates an existing one based on matching criteria. This is useful when you're not sure if a record already exists.
+
+
+
+**Configuration**:
+
+* Select the target object
+* Note which fields can be used for matching: email for People, domain for Companies, ID for any object, or any field marked as Unique. You'll need to populate at least one of these below.
+* Fill out the field values. Do not forget to populate at least one of the unique identifiers.
+
+
+ **Matching usually works even better when adding only one unique identifier.** For example, the screenshot below will match companies based on their domain. The ID is not necessarily needed.
+
+
+
+
+* Use data from previous steps to populate fields
+
+**How it works**:
+
+1. Searches for a record matching your criteria
+2. If found → updates the existing record
+3. If not found → creates a new record
+
+**Output**: The created or updated record data is available for use in subsequent steps.
+
+## Flow Actions
+
+### Iterator
+
+**Loops through an array of records** returned from a previous step, allowing you to perform actions on each record individually.
+
+**Configuration**:
+
+* Select the array of records from a previous step (e.g., results from Search Records, from a Manual trigger with Bulk availability, from a code node)
+* Define the actions to perform on each record in the loop.
+
+
+ - You can add several actions within an iterator.
+ - When using branches inside an iterator, make sure the last step of each branch connects back to the iterator to close the loop.
+
+
+* Access `Current Item` Fields: to use fields from the record currently being processed, click on the **Iterator** step, then select **Current item**. The list of available fields from that record will be displayed and can be selected for use in subsequent actions.
+
+
+
+### Filter
+
+Filters records based on specified conditions, allowing only records that meet the criteria to pass through.
+
+**Configuration**:
+
+* Select the record to filter
+* Define filter conditions and criteria
+* Configure which records should pass through to subsequent steps
+
+
+ 1. **Output**: Filter nodes don't return data—they act as gates. If the conditions are met, the workflow continues. If not, the workflow stops at that branch.
+ 2. The `IS` operator can be used with numeric fields. It performs as an `EQUAL`.
+
+
+### Delay
+
+Pauses workflow execution for a specified duration or until a specific date/time.
+
+**Delay Types**:
+
+| Type | Description |
+| ------------------ | ------------------------------------------------------------------ |
+| **Duration** | Wait for a specific amount of time (days, hours, minutes, seconds) |
+| **Scheduled Date** | Wait until a specific date and time |
+
+**Configuration for Duration**:
+
+* Set days, hours, minutes, and/or seconds
+* Combine multiple units (e.g., 2 days and 4 hours)
+
+**Configuration for Scheduled Date**:
+
+* Select a date and time
+* Can reference a date field from a previous step (e.g., follow up 3 days after a meeting)
+
+**Use cases**:
+
+* Wait 24 hours before sending a follow-up email
+* Pause until an opportunity's close date
+* Schedule actions for business hours
+
+
+ The scheduled date cannot be in the past. If a date field from a previous step is used and the date has already passed, the workflow will fail.
+
+
+**Limits & Credits**:
+
+* **No maximum duration limit**—you can set delays of minutes, days, weeks, or longer
+* **1 credit consumed** when the Delay node executes, regardless of duration
+* **No credits consumed** while waiting—a 5-minute delay costs the same as a 5-day delay
+
+## Communication Actions
+
+### Send Email
+
+Sends an email from your workflow. This is great for templated group emails. Emails will look like the ones you send from your mailbox.
+Not suited for newsletters (which require richer formatting) or automated email sequences.
+
+**Prerequisites**: Add an email account in Settings → Accounts
+
+**Configuration**:
+
+* Select the sender email account
+
+
+ You can only send emails from mailboxes synced to your own Twenty account. Sending from other team members' mailboxes (e.g., the account owner's email) is on the roadmap.
+
+
+For all the following steps, you can reference variables from previous steps for personalization.
+
+* Enter recipient email address.
+
+
+ Only one recipient is possible at the moment.
+
+
+* Set subject line.
+* Compose message body. You can format links, create numbered list, bullet point lists, add attachments.
+
+
+ Adding HTML signatures is not possible at the moment.
+
+
+### Form
+
+Prompts a form during workflow execution to collect user input. The responses can then be used in subsequent steps to create records, send emails, or execute any other action based on the input.
+
+
+ **Forms are designed for manual triggers only**. For workflows with other triggers (Record Created, Updated, etc.), forms are only accessible via the workflow run interface, which is not the expected user experience. A notifications center will be released in 2026 to properly support forms in automated workflows.
+
+
+**Configuration**:
+
+* Configure the fields that users will be asked to fill. For each field, choose
+ * a type among text, number, date, a given record, a select field. Select fields from all objects are available.
+ * a label
+ * a default value under `Placeholder` (optional)
+* Edit the form title
+
+**Output**: Form responses are available for use in subsequent steps.
+
+**Example**: The "Quick Lead" workflow is available by default in all workspaces, available anywhere in the Command Menu `Cmd + K`.
+
+**How to fill the form**:
+
+* Trigger your manual workflow from the command menu `Cmd K`
+* Fill the form that is displayed in the side panel and click `Submit`.
+
+
+ The fields cannot be made mandatory.
+
+
+
+
+## Integration Actions
+
+### Code
+
+Runs custom JavaScript within your workflow.
+
+**Configuration**:
+
+* Access variables from previous steps. You can edit the variables names dynamically.
+
+
+
+* Write JavaScript code in the editor
+* Return variables for use in subsequent steps
+* Test code directly in the step
+
+
+ If you need to use external API keys in your code, you must input them directly in the function body. You cannot configure API keys elsewhere and reference them in the serverless function.
+
+
+
+ **Working with arrays?** Arrays from external systems or previous steps may come as strings. See [How to handle arrays in Code actions](/l/ja/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions) for the solution.
+
+
+
+ Click the square icon at the top right of the code editor to display it in full screen — helpful since the default editor width is limited.
+
+
+### HTTP Request
+
+Sends a request to an external API as part of your workflow.
+
+
+
+**Configuration**:
+
+* Enter the API endpoint URL. Using parameters from previous steps is possible.
+* Select HTTP method (GET, POST, PUT, PATCH, DELETE)
+* Add required headers and values
+* Provide sample response for structure preview
+
+## AI Actions
+
+### AI Agent - Coming Soon
+
+Runs an AI agent within your workflow to perform intelligent tasks.
+
+**Configuration**:
+
+* **Agent**: Select an existing AI agent or use the default agent
+* **Prompt**: Write the instruction for the AI agent
+* Reference variables from previous steps in the prompt
+
+**What AI Agents can do**:
+
+* Analyze and summarize data
+* Classify or categorize records
+* Generate text content
+* Make decisions based on data
+* Interact with your CRM data using tools
+
+**Output**: The AI agent's response is available for use in subsequent steps. If the agent has a structured output schema, the response will follow that format.
+
+
+ AI Agent actions consume workflow credits based on the AI model used. See [Workflow Credits](/l/ja/user-guide/workflows/capabilities/workflow-credits) for details.
+
+
+
+ AI agents respect role-based permissions. You can assign specific roles to agents under **Settings → Roles** to control what data they can access. See [Permissions](/l/ja/user-guide/permissions-access/capabilities/permissions) for details.
+
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-branches.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-branches.mdx
new file mode 100644
index 0000000000..51c16f7cb0
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-branches.mdx
@@ -0,0 +1,66 @@
+---
+title: Workflow Branches
+description: Create parallel paths and conditional logic in your workflows.
+---
+
+Branches allow you to split your workflow into multiple paths that can run simultaneously or conditionally based on your data.
+
+
+
+## How Branches Work
+
+When you create multiple connections from a single node, each path becomes a branch. By default, **all branches execute in parallel**—they don't wait for each other.
+
+## Creating Branches
+
+### Add a New Branch
+
+1. **Right-click on the main canvas** of the workflow (not on an existing node)
+2. Click **Add node**
+3. Choose the node type for your new branch
+4. Drag an arrow from the bottom of the previous step to the top of this new action
+5. Repeat to add more branches from the same node
+
+
+ Each branch is independent. Adding a branch doesn't affect other existing paths from that node.
+
+
+### Visual Layout
+
+Branches appear as parallel paths in the workflow editor. You can drag nodes to rearrange the visual layout without affecting execution.
+
+## Conditional Branches
+
+Since all branches run by default, use **Filter** nodes to control which paths actually execute:
+
+| Branch | Filter Condition | Action |
+| ------ | --------------------- | -------------------------- |
+| A | Stage = "Won" | Send congratulations email |
+| B | Stage = "Lost" | Create follow-up task |
+| C | Stage = "Negotiation" | Notify manager |
+
+1. Create branches from your trigger or action
+2. Add a **Filter** node as the first step of each branch
+3. Configure each filter with mutually exclusive conditions
+4. Add your actions after each filter
+
+Only the branch(es) where the filter condition is met will continue executing.
+
+## Merging Branches
+
+**Branches don't automatically merge.** Each branch runs independently until it ends. You have full flexibility in how you handle this:
+
+* **Option 1: Keep branches separate**
+ Each branch handles its own follow-up actions independently. This is the simplest approach when branches don't need to converge.
+
+* **Option 2: Merge branches manually**
+ When creating your workflow, you can manually connect multiple branches to the same downstream action. Simply drag arrows from the end of each branch to a common node.
+
+
+ While you can use a [Delay](/l/ja/user-guide/workflows/capabilities/workflow-actions#delay) node to pause execution, it's not currently configurable to wait "until another branch ends."
+
+
+## Related
+
+* [How to Use Branches in Workflows](/l/ja/user-guide/workflows/capabilities/use-branches-in-workflows) - Step-by-step guide
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions) - Available actions including Filter
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-credits.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-credits.mdx
new file mode 100644
index 0000000000..437aee5822
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-credits.mdx
@@ -0,0 +1,76 @@
+---
+title: Workflow Credits
+description: Understand workflow credit consumption and management.
+---
+
+Workflow credits power your automations in Twenty. Understanding how they work helps you optimize costs and manage your automation budget effectively.
+
+## Credit Allocation
+
+Workflow credits are allocated based on your billing cycle, not your plan tier:
+
+| Billing Cycle | Credits |
+| ------------------------ | --------------------------- |
+| **Monthly subscription** | 5 million credits per month |
+| **Yearly subscription** | 50 million credits per year |
+
+
+ 5 million monthly credits are generous for standard automations. Most teams won't exceed this limit with typical workflow usage. Additional credits are primarily needed for advanced Code actions and AI-powered workflows.
+
+
+## How Credit Consumption Works
+
+Credits are consumed when workflows execute, not when you create them. Each workflow action consumes credits based on its complexity:
+
+### Credit Consumption by Action Type
+
+* **Basic internal operations**: Very low credit consumption
+ * Search Records
+ * Create Record
+ * Update Record
+ * Delete Record
+ * Form actions
+
+* **Complex operations**: Higher credit consumption
+ * Code actions (JavaScript execution)
+ * HTTP Requests to external services
+
+* **AI features**: Higher credit consumption
+ * AI Agent actions consume credits based on the AI model used
+ * More complex prompts and longer outputs use more credits
+
+* **Delay actions**: Minimal credit consumption
+ * The Delay node consumes **1 credit** when it executes
+ * **No credits are consumed** during the wait period
+ * A 5-minute delay costs the same as a 5-day delay
+
+### Real-Time Deduction
+
+Credits are deducted in real-time as workflows execute. This means:
+
+* Draft workflows don't consume credits
+* Only active, running workflows use your credit allocation
+* Failed workflows still consume credits for completed steps
+
+## Managing Credits
+
+### Check Credit Usage
+
+1. Go to **Settings → Billing**
+2. View your current credit consumption and remaining balance
+3. Monitor usage patterns to optimize your workflows
+
+### Purchasing Additional Credits
+
+If you need more credits beyond your plan allocation:
+
+1. Go to **Settings → Billing**
+2. Click on the option to purchase additional credits. Packages of different sizes are available.
+3. Credits are added to your current balance
+
+## Best Practices
+
+* **Batch Processing**: Use bulk operations and Iterator actions efficiently
+* **Manual Trigger Optimization**: For manual triggers, choose `Bulk` availability to process multiple records in a single workflow run
+* Optimize Code actions for efficiency
+* Batch operations to reduce individual action calls
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-runs.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-runs.mdx
new file mode 100644
index 0000000000..a30f5108b3
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-runs.mdx
@@ -0,0 +1,92 @@
+---
+title: Workflow Runs
+description: Monitor and manage workflow executions.
+image: /images/user-guide/workflows/workflow.png
+---
+
+## About Runs
+
+A **Run** is a record of a workflow execution. Every time a workflow is triggered—whether by a record event, schedule, manual action, or webhook—a new run is created.
+
+## Viewing Runs
+
+### From the Workflow Editor
+
+1. Open the workflow you want to monitor
+2. Click the **Runs** panel on the right side
+3. See a list of recent runs with their status
+
+### From the Workflow Runs View
+
+1. Go to **Workflow Runs** in the sidebar
+2. View runs across all workflows
+3. Filter by status, workflow, or date
+
+## Run Statuses
+
+| Status | Description |
+| ------------- | ------------------------------------------------------------------------ |
+| **Running** | Workflow is currently executing |
+| **Completed** | Workflow finished successfully |
+| **Failed** | Workflow encountered an error and stopped |
+| **Waiting** | Workflow is paused (e.g., waiting for a Delay action or Form submission) |
+
+## Run Details
+
+Click on any run to see:
+
+* **Status**: Current state of the run
+* **Started at**: When the run began
+* **Duration**: How long the run took
+* **Trigger data**: The input that started the workflow
+* **Step outputs**: Data returned by each step
+* **Error messages**: If the run failed, what went wrong
+
+## Step-by-Step Execution
+
+Each run shows the progression through your workflow:
+
+1. See which steps completed successfully
+2. Identify where failures occurred
+3. View the data passed between steps
+4. Debug issues by examining step inputs and outputs
+
+## Error Handling
+
+When a run fails:
+
+1. Open the failed run
+2. Find the step that caused the failure
+3. Check the error message for details
+4. Common issues:
+ * Missing required fields
+ * Invalid data format
+ * External API errors
+ * Permission issues
+
+## Re-running Workflows
+
+If a run fails, you can:
+
+* Fix the underlying issue and wait for the next trigger
+* For manual workflows, trigger again with the same or updated data
+* Review the workflow logic to prevent future failures
+
+## Performance Tips
+
+### Managing Run History
+
+* Runs are retained for historical reference
+* Very old runs may be archived automatically
+* Export run data if you need to keep records
+
+### Monitoring Best Practices
+
+* Check runs regularly after activating new workflows
+* Review failed runs to identify patterns
+
+## Related
+
+* [Workflow Triggers](/l/ja/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions)
+* [Workflow Troubleshooting](/l/ja/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-triggers.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-triggers.mdx
new file mode 100644
index 0000000000..dfa39d0f03
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-triggers.mdx
@@ -0,0 +1,136 @@
+---
+title: Workflow Triggers
+description: Learn about the different triggers that start your workflows.
+---
+
+## About Triggers
+
+Workflows always start with a single trigger that defines when the automation should run.
+
+
+
+
+ **Advanced objects are supported!** Beyond standard CRM objects (People, Companies, Opportunities), you can also trigger workflows and perform actions on:
+
+ * Workspace Members
+ * Calendar Events
+ * Messages (Emails)
+ * Tasks, Notes, and many other system objects
+
+ This opens up powerful automations like notifying team members when calendar events are created, or processing incoming emails automatically.
+
+
+## Record is Created
+
+Starts the workflow when a new record is created in a selected object (People, Companies, Opportunities, or any custom object).
+
+**Configuration**: Select the object type to monitor for new records.
+
+
+ * This trigger is great for records created by csv, mailbox and calendar synchronization, API.
+ * **It is not recommended for records created manually**: with this trigger, workflows start as soon as the record is created. Since Twenty UI offers auto-save on the fly (there is not an edit mode and then a validation to save records), the workflow will be triggered before the user inputs all the fields.
+ To trigger this workflow on records created manually, it is recommended to use the trigger `Record is created or updated` instead.
+
+
+## Record is Updated
+
+Starts the workflow when changes are made to an existing record.
+
+**Configuration**:
+
+* Select the object type
+* Optionally specify which fields to monitor for changes
+
+## Record is Updated or Created
+
+Starts the workflow when a record is either created or updated in a selected object.
+
+**Why This Matters**: This trigger is particularly helpful because records created via different methods behave differently:
+
+* **API/CSV imports**: Records are created with all fields populated immediately
+* **Manual creation**: Records are created first, then fields are added in subsequent updates
+
+**Configuration**:
+
+* Select the object type to monitor
+* Optionally specify which fields to monitor for changes
+* The workflow will trigger both on initial creation and any subsequent updates
+
+## Record is Deleted
+
+Starts the workflow when a record is removed from an object.
+
+**Configuration**: Select the object type to monitor for deletions.
+
+## Manual Trigger
+
+Starts the workflow when triggered by a user action. This trigger can be accessed through the `Cmd+K` menu or via a custom button that will be displayed in the top navbar after selecting record(s).
+
+
+
+**Availability Configuration**:
+Choose how the workflow should handle record selection:
+
+* **Global**: No record is required to trigger this workflow. The workflow is triggered from the command menu `Cmd + K` anywhere (from any object) and does not use record(s) as input.
+
+* **Single**: The selected record(s) will be passed to your workflow. This is configured for a given object. Several records can be selected before triggering the workflow. The workflow will run from beginning to end as many times as there are records selected.
+
+
+ **Soft limit: 100 runs/minute**. Beyond this, workflows remain in "Not Started" status and are processed gradually—either by a background job or when another workflow enters the queue. This means you can select more than 100 records with a Single trigger; execution will just be slower.
+
+
+* **Bulk**: The selected record(s) will be passed to your workflow. This is configured for a given object. Several records can be selected before triggering the workflow. The workflow will run once, providing the entire list of records as input. This means the workflow needs to contain an [Iterator action](/l/ja/user-guide/workflows/capabilities/workflow-actions#iterator).
+
+
+ This is more advanced, and best for people who want to optimize the number of workflow runs.
+
+
+
+
+**Additional Configuration**:
+
+* Select the target object (for Single and Bulk availability)
+* Choose a command icon for the workflow trigger
+* Configure navbar placement (Pinned or Not Pinned)
+
+**Access Methods**:
+
+* `Cmd+K` menu to find and launch manual workflows
+* Custom button in the top navbar (if configured)
+
+## Time-Based Trigger: On a Schedule
+
+Starts the workflow on a recurring basis you define.
+
+**Configuration**:
+
+* Select time unit (minutes, hours, days)
+* Enter a value or use custom cron expressions for advanced scheduling
+
+
+ **Timezone**: Scheduled workflows run in **UTC**. When setting hours for daily schedules, convert your local time to UTC.
+
+
+## External Trigger: Webhook
+
+Starts the workflow when a GET or POST request is received from an external service.
+
+
+
+**Configuration**:
+
+* The workflow provides a unique webhook URL—copy this and add it to your external system as the endpoint to call.
+* For POST requests, define the expected body structure so Twenty knows what data to expect. Add here the fields you will receive that will be needed below in your workflow.
+* Configure authentication (coming soon).
+
+## Choosing the Right Trigger
+
+| Use Case | Recommended Trigger |
+| --------------------------- | ---------------------------- |
+| New leads need processing | Record is Created |
+| Data changes need sync | Record is Updated |
+| Import/manual data handling | Record is Updated or Created |
+| Cleanup after deletion | Record is Deleted |
+| User-initiated action | Launch Manually |
+| Recurring reports | On a Schedule |
+| External integration | Webhook or On a Schedule |
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-versions.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-versions.mdx
new file mode 100644
index 0000000000..69de4f7135
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/capabilities/workflow-versions.mdx
@@ -0,0 +1,85 @@
+---
+title: Workflow Versions
+description: Manage workflow versions and drafts.
+image: /images/user-guide/workflows/workflow.png
+---
+
+## About Versions
+
+Every time you activate a workflow, a new version is created. This allows you to track changes over time and revert to previous configurations if needed.
+
+## Version Statuses
+
+| Status | Description |
+| --------------- | -------------------------------------- |
+| **Draft** | Being edited, not yet published |
+| **Active** | Live version responding to triggers |
+| **Deactivated** | Previously active but manually stopped |
+| **Archived** | Past versions kept for history |
+
+## Working with Drafts
+
+When you edit an active workflow, your changes are saved as a **draft**. The active version continues to run while you work on updates.
+
+Once you're done editing, you can:
+
+* **Activate**: Publish the draft as the new active version (the previous version is archived)
+* **Discard**: Delete the draft and keep the current active version
+
+## Version History
+
+### Viewing Past Versions
+
+1. Open the workflow
+2. Click the **Versions** tab
+3. See all previous versions with timestamps
+
+### Restoring a Version
+
+1. Find the version you want to restore
+2. Click **Use as draft**
+3. The version is copied to a new draft
+4. Make any necessary updates
+5. Activate when ready
+
+## Best Practices
+
+### Version Management
+
+* Activate only when ready for production
+* Keep meaningful changes between versions
+* Document major changes in workflow names or descriptions
+* Test in draft mode before activating
+
+### Reverting Changes
+
+* If a new version causes issues, restore the previous version
+* Use the version history to track what changed
+* Always test restored versions before activating
+
+## Common Workflows
+
+### Quick Edit
+
+1. Make minor changes to an active workflow
+2. Test in draft mode
+3. Activate the new version
+
+### Major Revision
+
+1. Use the previous version as a starting point
+2. Make significant changes in draft
+3. Thoroughly test all scenarios
+4. Activate when confident
+
+### Rollback
+
+1. Identify the issue with the current version
+2. Find the last working version in history
+3. Click **Use as draft**
+4. Activate to restore the old behavior
+
+## Related
+
+* [Getting Started with Workflows](/l/ja/user-guide/workflows/overview)
+* [Workflow Runs](/l/ja/user-guide/workflows/capabilities/workflow-runs)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx
new file mode 100644
index 0000000000..bbc096202f
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx
@@ -0,0 +1,82 @@
+---
+title: Handle Arrays in Code Actions
+description: Learn how to properly handle array inputs in workflow Code actions.
+---
+
+When working with arrays in Code actions, you may encounter two common challenges:
+
+1. **Arrays passed as strings** — data from external systems or previous steps arrives as a string instead of an actual array
+2. **Can't select individual items** — you can only select the entire array, not specific fields within it
+
+Both can be solved with a Code node.
+
+## Parsing Arrays from Strings
+
+Arrays are often passed between workflow steps as strings or JSON rather than native arrays. This happens when:
+
+* Receiving data from external APIs via HTTP Request
+* Processing webhook payloads
+* Passing data between workflow steps
+
+**Solution**: Add this pattern at the start of your Code action:
+
+```javascript
+export const main = async (params: {
+ users: any;
+}): Promise => {
+ const { users } = params;
+
+ // Handle input that may come as a string or an array
+ const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;
+
+ // Now you can safely work with usersFormatted as an array
+ return {
+ users: usersFormatted.map((user) => ({
+ ...user,
+ activityStatus: String(user.activityStatus).toUpperCase(),
+ })),
+ };
+};
+```
+
+The key line `typeof users === "string" ? JSON.parse(users) : users` checks if the input is a string, parses it if needed, or uses it directly if it's already an array.
+
+## Extracting Individual Fields from Arrays
+
+A webhook might return an array like `answers: [...]`, but in subsequent workflow steps you can only select the **entire array** — not individual items within it.
+
+**Solution**: Add a Code node to extract specific fields and return them as a structured object:
+
+```javascript
+export const main = async (params: {
+ answers: any;
+}): Promise => {
+ const { answers } = params;
+
+ // Handle input that may come as a string or an array
+ const answersFormatted = typeof answers === "string"
+ ? JSON.parse(answers)
+ : answers;
+
+ // Extract specific fields from the array
+ const firstname = answersFormatted[0]?.text || "";
+ const name = answersFormatted[1]?.text || "";
+
+ return {
+ answer: {
+ firstname,
+ name
+ }
+ };
+};
+```
+
+The Code node returns a structured object instead of an array. In subsequent steps, you can now select individual fields like `answer.firstname` and `answer.name` from the variable picker.
+
+
+ We're actively working on making array handling easier in future updates.
+
+
+
+ Click the square icon at the top right of the code editor to display it in full screen — helpful since the default editor width is limited.
+
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx
new file mode 100644
index 0000000000..75efb555e5
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx
@@ -0,0 +1,182 @@
+---
+title: Bring Product Data into Twenty
+description: Sync product catalog data from a data warehouse into your CRM on a schedule.
+---
+
+Use this pattern to keep Twenty in sync with product data from your data warehouse (e.g., Snowflake, BigQuery, PostgreSQL).
+
+## Workflow Structure
+
+1. **Trigger**: On a Schedule
+2. **Code**: Query your data warehouse
+3. **Code** (optional): Format data as array
+4. **Iterator**: Loop through each product
+5. **Upsert Record**: Create or update in Twenty
+
+
+
+## Step 1: Schedule the Trigger
+
+Set the workflow to run at a frequency matching your data freshness needs:
+
+* Every 5 minutes for near real-time sync
+* Every hour for less critical data
+* Daily for batch updates
+
+## Step 2: Query Your Data Warehouse
+
+Add a **Code** action to fetch recent data:
+
+```javascript
+export const main = async () => {
+ const intervalMinutes = 10; // Match your schedule frequency
+ const cutoffTime = new Date(Date.now() - intervalMinutes * 60 * 1000).toISOString();
+
+ // Replace with your actual data warehouse connection
+ const response = await fetch("https://your-warehouse-api.com/query", {
+ method: "POST",
+ headers: {
+ "Authorization": "Bearer YOUR_API_KEY",
+ "Content-Type": "application/json"
+ },
+ body: JSON.stringify({
+ query: `
+ SELECT id, name, sku, price, stock_quantity, updated_at
+ FROM products
+ WHERE updated_at >= '${cutoffTime}'
+ `
+ })
+ });
+
+ const data = await response.json();
+ return { products: data.results };
+};
+```
+
+
+ Filter by `updated_at >= last X minutes` to retrieve only recently changed records. This keeps the sync efficient.
+
+
+## Step 3: Format Data (Optional)
+
+If your warehouse returns data in a format that needs transformation, add another **Code** action. Common transformations include type conversions, field renaming, and data cleanup.
+
+### Example: User Data with Boolean and Status Fields
+
+```javascript
+export const main = async (params: {
+ users: any;
+}): Promise => {
+ const { users } = params;
+ const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;
+
+ // Convert string "true"/"false" to actual booleans
+ const toBool = (v: any) => v === true || v === "true";
+
+ return {
+ users: usersFormatted.map((user) => ({
+ ...user,
+ activityStatus: String(user.activityStatus).toUpperCase(),
+ isActiveLast30d: toBool(user.isActiveLast30d),
+ isActiveLast7d: toBool(user.isActiveLast7d),
+ isActiveLast24h: toBool(user.isActiveLast24h),
+ isTwenty: toBool(user.isTwenty),
+ })),
+ };
+};
+```
+
+### Example: Product Data with Type Conversions
+
+```javascript
+export const main = async (params: { products: any }) => {
+ const products = typeof params.products === "string"
+ ? JSON.parse(params.products)
+ : params.products;
+
+ return {
+ products: products.map(product => ({
+ externalId: product.id,
+ name: product.name,
+ sku: product.sku,
+ price: parseFloat(product.price), // String → Number
+ stockQuantity: parseInt(product.stock_quantity),
+ isActive: product.status === "active" // String → Boolean
+ }))
+ };
+};
+```
+
+### Example: Date and Currency Formatting
+
+```javascript
+export const main = async (params: { deals: any }) => {
+ const deals = typeof params.deals === "string"
+ ? JSON.parse(params.deals)
+ : params.deals;
+
+ return {
+ deals: deals.map(deal => ({
+ ...deal,
+ // Convert Unix timestamp to ISO date
+ closedAt: deal.closed_timestamp
+ ? new Date(deal.closed_timestamp * 1000).toISOString()
+ : null,
+ // Ensure amount is a number (remove currency symbols)
+ amount: parseFloat(String(deal.amount).replace(/[^0-9.-]/g, "")),
+ // Normalize stage names
+ stage: deal.stage?.toLowerCase().replace(/_/g, " ")
+ }))
+ };
+};
+```
+
+### Common Transformations
+
+| Source Format | Target Format | Code |
+| -------------------- | ---------------- | ---------------------------------------- |
+| `"true"` / `"false"` | `true` / `false` | `v === true \|\| v === "true"` |
+| `"123.45"` | `123.45` | `parseFloat(value)` |
+| `"active"` | `"ACTIVE"` | `value.toUpperCase()` |
+| `1704067200` (Unix) | ISO date | `new Date(v * 1000).toISOString()` |
+| `"$1,234.56"` | `1234.56` | `parseFloat(v.replace(/[^0-9.-]/g, ""))` |
+| `null` / `undefined` | `""` | `value \|\| ""` |
+
+## Step 4: Iterate Through Products
+
+Add an **Iterator** action:
+
+* Input: `{{code.products}}`
+
+This loops through each product in the array.
+
+## Step 5: Upsert Each Record
+
+Inside the iterator, add an **Upsert Record** action:
+
+| Setting | Value |
+| ------------ | -------------------------------------- |
+| **Object** | Your custom Product object |
+| **Match by** | External ID or SKU (unique identifier) |
+| **Name** | `{{iterator.item.name}}` |
+| **SKU** | `{{iterator.item.sku}}` |
+| **Price** | `{{iterator.item.price}}` |
+
+
+ Use **Upsert** (update or create) instead of building separate branches for create vs. update. It's faster to build and easier to debug.
+
+
+## Example Use Cases
+
+| Source | Data |
+| ----------------------- | ----------------------------------- |
+| **ERP system** | Product catalog, pricing, inventory |
+| **E-commerce platform** | Orders, customers, product updates |
+| **Data warehouse** | Aggregated metrics, enriched data |
+| **Inventory system** | Stock levels, reorder alerts |
+
+## Related
+
+* [Workflow Triggers](/l/ja/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions)
+* [Handle Arrays in Code Actions](/l/ja/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx
new file mode 100644
index 0000000000..2ec7f86b93
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx
@@ -0,0 +1,130 @@
+---
+title: Bring Typeform Submissions into Twenty
+description: Handle Typeform's webhook payload to create leads from form submissions.
+---
+
+For standard webhook setup, see [Set Up a Webhook Trigger](/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger). This article covers the specific handling required for Typeform's custom payload structure.
+
+### Step 1: Create a Webhook Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Select **Webhook** as the trigger
+4. Copy the webhook URL
+
+### Step 2: Configure Typeform
+
+1. In Typeform, open your form
+2. Go to **Connect → Webhooks**
+3. Paste your Twenty webhook URL
+4. Save
+
+### Step 3: Understand the Typeform Payload
+
+Typeform sends a nested JSON structure. Here's a simplified example:
+
+```json
+{
+ "event_type": "form_response",
+ "form_response": {
+ "form_id": "abc123",
+ "submitted_at": "2025-01-15T10:30:00Z",
+ "answers": [
+ {
+ "text": "Jane",
+ "type": "text",
+ "field": { "id": "field1", "type": "short_text", "title": "First Name" }
+ },
+ {
+ "text": "Smith",
+ "type": "text",
+ "field": { "id": "field2", "type": "short_text", "title": "Last Name" }
+ },
+ {
+ "text": "Acme Corp",
+ "type": "text",
+ "field": { "id": "field3", "type": "short_text", "title": "Company" }
+ },
+ {
+ "email": "jane@acme.com",
+ "type": "email",
+ "field": { "id": "field4", "type": "email", "title": "Email" }
+ },
+ {
+ "type": "choice",
+ "field": { "id": "field5", "type": "dropdown", "title": "Team Size" },
+ "choice": { "label": "10-50" }
+ }
+ ]
+ }
+}
+```
+
+Key things to note:
+
+* Form data is nested under `form_response`
+* **Answers are returned as an array**, not as named fields
+* Each answer includes the field type and title for reference
+
+### Step 4: Extract Fields from the Answers Array
+
+Since `answers` is an array, you can only select the entire array in subsequent steps — not individual fields. Add a **Code** action to extract the fields you need:
+
+```javascript
+export const main = async (params: {
+ answers: any;
+}): Promise => {
+ const { answers } = params;
+
+ // Handle input that may come as a string or an array
+ const answersFormatted = typeof answers === "string"
+ ? JSON.parse(answers)
+ : answers;
+
+ // Extract fields by position or by finding the field type
+ const firstName = answersFormatted[0]?.text || "";
+ const lastName = answersFormatted[1]?.text || "";
+ const company = answersFormatted[2]?.text || "";
+ const email = answersFormatted.find(a => a.type === "email")?.email || "";
+ const teamSize = answersFormatted.find(a => a.type === "choice")?.choice?.label || "";
+
+ return {
+ contact: {
+ firstName,
+ lastName,
+ company,
+ email,
+ teamSize
+ }
+ };
+};
+```
+
+Now in subsequent steps, you can select `contact.firstName`, `contact.email`, etc. from the variable picker.
+
+
+ For more details on handling arrays in Code actions, see [Handle Arrays in Code Actions](/l/ja/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
+
+
+### Step 5: Create the Record
+
+Add a **Create Record** action:
+
+| Field | Value |
+| -------------- | ---------------------------------------------------- |
+| **Object** | People |
+| **First Name** | `{{code.contact.firstName}}` |
+| **Last Name** | `{{code.contact.lastName}}` |
+| **Email** | `{{code.contact.email}}` |
+| **Company** | Search or create based on `{{code.contact.company}}` |
+
+### Step 6: Test and Activate
+
+1. Submit a test response in Typeform
+2. Check the workflow run to verify data was captured
+3. Activate the workflow
+
+## Related
+
+* [Set Up a Webhook Trigger](/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger)
+* [Handle Arrays in Code Actions](/l/ja/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx
new file mode 100644
index 0000000000..676c4d146c
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx
@@ -0,0 +1,143 @@
+---
+title: Generate a Quote or Invoice from Twenty
+description: Automatically create invoices in external tools when deals close.
+---
+
+Automatically send deal data to your invoicing system (Stripe, QuickBooks, Xero, etc.) when an opportunity is won.
+
+## Workflow Structure
+
+1. **Trigger**: Record is Updated (Opportunity)
+2. **Filter**: Stage = Closed Won
+3. **Search Record**: Get Company details
+4. **Code** (optional): Format payload
+5. **HTTP Request**: Send to invoicing system
+
+## Step 1: Set Up the Trigger
+
+1. Create a new workflow
+2. Select **Record is Updated** trigger
+3. Choose **Opportunity** as the object
+
+## Step 2: Filter for Closed Won
+
+Add a **Filter** action to only continue when the deal is won:
+
+| Setting | Value |
+| ------------- | --------------------------------- |
+| **Field** | Stage |
+| **Condition** | Equals |
+| **Value** | `CLOSED_WON` (or your stage name) |
+
+
+ The trigger fires on any Opportunity update. The Filter ensures the workflow only continues when the stage changes to Closed Won.
+
+
+## Step 3: Get Company Details
+
+The Opportunity record may not include all Company fields you need for the invoice. Add a **Search Record** action:
+
+| Setting | Value |
+| ------------ | ---------------------------------------- |
+| **Object** | Company |
+| **Match by** | ID equals `{{trigger.object.companyId}}` |
+
+This retrieves the full Company record with billing address, tax ID, etc.
+
+## Step 4: Format the Payload (Optional)
+
+If your invoicing system expects a specific format, add a **Code** action:
+
+```javascript
+export const main = async (params: {
+ opportunity: any;
+ company: any;
+}): Promise => {
+ const { opportunity, company } = params;
+
+ return {
+ invoice: {
+ // Customer info from Company
+ customer_name: company.name,
+ customer_email: company.email || "",
+ billing_address: {
+ line1: company.address?.street || "",
+ city: company.address?.city || "",
+ postal_code: company.address?.postalCode || "",
+ country: company.address?.country || ""
+ },
+ tax_id: company.taxId || null,
+
+ // Invoice details from Opportunity
+ amount: opportunity.amount,
+ currency: opportunity.currency || "USD",
+ description: `Invoice for ${opportunity.name}`,
+ due_days: 30,
+
+ // Reference back to Twenty
+ metadata: {
+ opportunity_id: opportunity.id,
+ company_id: company.id
+ }
+ }
+ };
+};
+```
+
+## Step 5: Send to Invoicing System
+
+Add an **HTTP Request** action:
+
+| Setting | Value |
+| ----------- | ----------------------------------------- |
+| **Method** | POST |
+| **URL** | Your invoicing API endpoint |
+| **Headers** | `Authorization: Bearer YOUR_API_KEY` |
+| **Body** | `{{code.invoice}}` or map fields directly |
+
+### Example: Stripe Invoice
+
+```
+POST https://api.stripe.com/v1/invoices
+Headers:
+ Authorization: Bearer sk_live_xxx
+ Content-Type: application/x-www-form-urlencoded
+
+Body:
+ customer: {{company.stripeCustomerId}}
+ collection_method: send_invoice
+ days_until_due: 30
+```
+
+### Example: QuickBooks Invoice
+
+```
+POST https://quickbooks.api.intuit.com/v3/company/{realmId}/invoice
+Headers:
+ Authorization: Bearer YOUR_ACCESS_TOKEN
+ Content-Type: application/json
+
+Body: {{code.invoice}}
+```
+
+## Complete Workflow Summary
+
+| Step | Action | Purpose |
+| ---- | ----------------------- | ------------------------------------ |
+| 1 | Trigger: Record Updated | Fires when any Opportunity changes |
+| 2 | Filter | Only proceed if Stage = Closed Won |
+| 3 | Search Record | Get full Company details for billing |
+| 4 | Code | Format data for invoicing API |
+| 5 | HTTP Request | Create invoice in external system |
+
+## Tips
+
+* **Store external IDs**: Save the invoice ID returned by the API back to the Opportunity using an **Update Record** action
+* **Error handling**: Add a branch to send a notification if the HTTP request fails
+* **Test first**: Use your invoicing system's sandbox/test mode before going live
+
+## Related
+
+* [Workflow Triggers](/l/ja/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions)
+* [Closed Won Automations](/l/ja/user-guide/workflows/how-tos/crm-automations/closed-won-automations)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx
new file mode 100644
index 0000000000..09d5e5bdbb
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx
@@ -0,0 +1,171 @@
+---
+title: Set Up a Webhook Trigger
+description: Receive data from external services to trigger workflows.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Webhook triggers allow external services to start your workflows by sending data to a unique URL. Use them to connect forms, third-party apps, and custom integrations.
+
+## When to Use Webhooks
+
+| Use Case | Example |
+| ----------------------- | --------------------------------------- |
+| **Web forms** | Contact form submissions create leads |
+| **Third-party apps** | Stripe payment → create customer record |
+| **Custom integrations** | Your app → Twenty automation |
+| **No-code tools** | Zapier, Make, n8n connections |
+
+## Step-by-Step Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it (e.g., "Website Form Submission")
+
+### Step 2: Configure the Webhook Trigger
+
+1. Click on the trigger block
+2. Select **Webhook**
+3. You'll receive a unique webhook URL like:
+ ```
+ https://api.twenty.com/webhooks/workflow/abc123...
+ ```
+4. Copy this URL—you'll need it for your external service
+
+### Step 3: Define Expected Data Structure
+
+For **POST** requests, define the expected body structure:
+
+1. Click **Define expected body**
+2. Enter a sample JSON that matches what your service will send:
+
+```json
+{
+ "firstName": "John",
+ "lastName": "Doe",
+ "email": "john@example.com",
+ "company": "Acme Inc",
+ "message": "Interested in your product"
+}
+```
+
+3. Click **Save**—this creates variables you can use in subsequent steps
+
+### Step 4: Add Actions
+
+Now add actions that use the webhook data:
+
+**Example: Create a Person record**
+
+1. Add **Create Record** action
+2. Select **People** object
+3. Map fields:
+
+| Field | Value |
+| ---------- | ---------------------------------------------------- |
+| First Name | `{{trigger.body.firstName}}` |
+| Last Name | `{{trigger.body.lastName}}` |
+| Email | `{{trigger.body.email}}` |
+| Company | Search or create based on `{{trigger.body.company}}` |
+
+### Step 5: Test the Webhook
+
+Before activating, test your webhook:
+
+**Using cURL**:
+
+```bash
+curl -X POST https://api.twenty.com/webhooks/workflow/abc123... \
+ -H "Content-Type: application/json" \
+ -d '{"firstName":"Test","lastName":"User","email":"test@example.com"}'
+```
+
+**Using Postman or similar**:
+
+1. Create a POST request to your webhook URL
+2. Set Content-Type header to `application/json`
+3. Add your test JSON body
+4. Send and check workflow runs
+
+### Step 6: Activate
+
+Once tested, click **Activate** to make the workflow live.
+
+## Handling Different Data Structures
+
+### Nested Data
+
+If your webhook sends nested data:
+
+```json
+{
+ "contact": {
+ "name": "John Doe",
+ "email": "john@example.com"
+ },
+ "source": "website"
+}
+```
+
+Reference with: `{{trigger.body.contact.email}}`
+
+### Arrays
+
+If data includes arrays:
+
+```json
+{
+ "items": [
+ {"name": "Product A", "qty": 2},
+ {"name": "Product B", "qty": 1}
+ ]
+}
+```
+
+How you handle arrays depends on your use case:
+
+**Unknown number of items → Use Iterator**
+
+If you need to process each item in the array (e.g., create a record for each), add a **Code** action to parse the array, then use **Iterator**:
+
+```javascript
+export const main = async (params: { items: any }) => {
+ const items = typeof params.items === "string"
+ ? JSON.parse(params.items)
+ : params.items;
+ return { items };
+};
+```
+
+Then use Iterator to loop through: `{{code.items}}`
+
+**Known/specific fields → Extract to named fields**
+
+If the array contains specific fields you want to access individually (e.g., form answers where position 0 is always "first name", position 1 is always "last name"), add a **Code** action to extract them:
+
+```javascript
+export const main = async (params: { items: any }) => {
+ const items = typeof params.items === "string"
+ ? JSON.parse(params.items)
+ : params.items;
+
+ return {
+ product: {
+ name: items[0]?.name || "",
+ qty: items[0]?.qty || 0
+ }
+ };
+};
+```
+
+Now you can select `product.name` and `product.qty` individually in subsequent steps.
+
+
+ For more details on handling arrays, see [Handle Arrays in Code Actions](/l/ja/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
+
+
+## Related
+
+* [Workflow Triggers](/l/ja/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx
new file mode 100644
index 0000000000..013435b9ef
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx
@@ -0,0 +1,179 @@
+---
+title: Closed Won Automations
+description: Automate post-win activities when opportunities close.
+---
+
+When a deal closes, multiple things need to happen: update company status, notify team members, create onboarding tasks. Automate all of this with a single workflow.
+
+## The Problem
+
+When an opportunity moves to "Closed Won":
+
+* Company type needs to change from "Prospect" to "Customer"
+* Onboarding tasks need to be created
+* Customer success team needs to be notified
+* Sales rep needs confirmation
+
+Doing this manually is time-consuming and error-prone.
+
+## The Solution
+
+Create a workflow that handles all post-win activities automatically.
+
+## Complete Workflow Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it "Deal Won - Post-Win Automation"
+
+### Step 2: Configure the Trigger
+
+1. Select **Record is Updated**
+2. Choose **Opportunities**
+3. Under "Fields to monitor", select **Stage**
+
+### Step 3: Add Stage Filter
+
+1. Add **Filter** action
+2. Condition: `{{trigger.object.stage}}` equals "Closed Won"
+
+### Step 4: Update Company Type
+
+1. Add **Update Record** action
+2. Configure:
+
+| Field | Value |
+| ------------------- | ------------------------------- |
+| **Object** | Companies |
+| **Record** | `{{trigger.object.company.id}}` |
+| **Type** | Customer |
+| **First Deal Date** | `{{trigger.object.closedAt}}` |
+| **Account Owner** | `{{trigger.object.owner.id}}` |
+
+### Step 5: Create Onboarding Task
+
+1. Add **Create Record** action
+2. Configure:
+
+| Field | Value |
+| ----------------------- | ---------------------------------------------------------------------------------------------------- |
+| **Object** | Tasks |
+| **Title** | `Onboarding: {{trigger.object.name}}` |
+| **Assignee** | Customer Success team member |
+| **Due Date** | 3 days from now |
+| **Priority** | High |
+| **Related Company** | `{{trigger.object.company.id}}` |
+| **Related Opportunity** | `{{trigger.object.id}}` |
+| **Description** | `New customer onboarding for {{trigger.object.company.name}}. Deal value: {{trigger.object.amount}}` |
+
+### Step 6: Notify Customer Success
+
+1. Add **Send Email** action
+2. Configure:
+
+| Field | Value |
+| ----------- | -------------------------------------------------- |
+| **To** | customer-success@yourcompany.com |
+| **Subject** | `🎉 New Customer: {{trigger.object.company.name}}` |
+| **Body** | See example below |
+
+**Email body example**:
+
+```
+Hi CS Team,
+
+We have a new customer!
+
+Company: {{trigger.object.company.name}}
+Deal: {{trigger.object.name}}
+Value: {{trigger.object.amount}}
+Sales Rep: {{trigger.object.owner.name}}
+Close Date: {{trigger.object.closedAt}}
+
+An onboarding task has been created automatically.
+
+Let's give them a great start!
+```
+
+### Step 7: Confirm to Sales Rep
+
+1. Add another **Send Email** action
+2. Configure:
+
+| Field | Value |
+| ----------- | -------------------------------------------------------------------------------------------------------------------- |
+| **To** | `{{trigger.object.owner.email}}` |
+| **Subject** | `✅ Deal Closed: {{trigger.object.name}}` |
+| **Body** | Congratulations! Your deal has been processed. The customer success team has been notified and onboarding has begun. |
+
+### Step 8: Test and Activate
+
+1. Test by moving a test opportunity to "Closed Won"
+2. Verify:
+ * Company type changed to "Customer"
+ * Onboarding task created
+ * CS team received email
+ * Sales rep received confirmation
+3. Activate when ready
+
+## Handling Closed Lost
+
+Create a similar workflow for lost deals:
+
+### Trigger
+
+* Record is Updated (Opportunities, Stage = "Closed Lost")
+
+### Actions
+
+1. **Create Record**: Task for "Lost Deal Analysis"
+2. **Update Record**: Add lost reason to company record
+3. **Send Email**: Notify manager of lost deal
+
+## Advanced: Multi-Step Onboarding
+
+For complex onboarding, create multiple tasks:
+
+```javascript
+export const main = async (params) => {
+ const tasks = [
+ { title: "Welcome call", daysFromNow: 1, assignee: "CS" },
+ { title: "Send onboarding materials", daysFromNow: 2, assignee: "CS" },
+ { title: "Technical setup", daysFromNow: 5, assignee: "Support" },
+ { title: "30-day check-in", daysFromNow: 30, assignee: "CS" }
+ ];
+
+ return { tasks };
+};
+```
+
+Use **Iterator** to create each task from the array.
+
+## Customization Ideas
+
+### Keep your other tools up-to-date
+
+* Create customer in billing system with an **HTTP Request**
+
+### Conditional Actions
+
+Use **Filter** actions to:
+
+* Different onboarding for enterprise vs SMB
+* Different assignees based on region
+* Skip notifications for small deals
+
+### Include Deal Details
+
+Use **Code** action to format:
+
+* Deal summary documents
+* Handoff notes for CS team
+* Custom onboarding checklists
+
+## Related
+
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/ja/user-guide/workflows/capabilities/send-emails-from-workflows)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx
new file mode 100644
index 0000000000..efeaa37797
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx
@@ -0,0 +1,136 @@
+---
+title: Detect Stale Opportunities
+description: Automatically notify managers when opportunities haven't been updated.
+---
+
+Keep your pipeline healthy by alerting managers when opportunities go stale. This workflow checks for opportunities that haven't been updated in a specified number of days.
+
+## The Problem
+
+Opportunities sitting without updates lead to:
+
+* Deals going cold
+* Unreliable forecasts
+* Lost revenue
+
+## The Solution
+
+Create a scheduled workflow that finds stale opportunities and emails their managers.
+
+## Step-by-Step Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it "Stale Opportunity Alert"
+
+### Step 2: Configure the Trigger
+
+1. Select **On a Schedule**
+2. Set to run daily (e.g., every day at 8 AM)
+
+### Step 3: Search for Stale Opportunities
+
+1. Add **Search Records** action
+2. Configure:
+
+| Field | Value |
+| ---------- | ----------------------------------------------- |
+| **Object** | Opportunities |
+| **Filter** | Updated At is before (today - 7 days) |
+| **Filter** | Stage is not "Closed Won" AND not "Closed Lost" |
+| **Limit** | 100 |
+
+### Step 4: Check If Any Found
+
+1. Add **Filter** action
+2. Condition: `{{searchRecords.length}}` is greater than 0
+3. If no stale opportunities, the workflow stops here
+
+### Step 5: Format the Alert (Code Action)
+
+Add a **Code** action to format the email:
+
+```javascript
+export const main = async (params) => {
+ const opportunities = params.opportunities;
+
+ // Group opportunities by owner
+ const byOwner = {};
+ opportunities.forEach(opp => {
+ const ownerEmail = opp.owner?.email || 'unassigned';
+ if (!byOwner[ownerEmail]) {
+ byOwner[ownerEmail] = [];
+ }
+ byOwner[ownerEmail].push({
+ name: opp.name,
+ amount: opp.amount,
+ lastUpdated: opp.updatedAt,
+ stage: opp.stage
+ });
+ });
+
+ // Format summary for manager
+ let summary = "Stale Opportunities Report\n\n";
+ Object.entries(byOwner).forEach(([owner, opps]) => {
+ summary += `${owner}: ${opps.length} stale opportunities\n`;
+ opps.forEach(opp => {
+ summary += ` - ${opp.name} (${opp.stage})\n`;
+ });
+ summary += "\n";
+ });
+
+ return {
+ summary,
+ totalCount: opportunities.length
+ };
+};
+```
+
+### Step 6: Send Alert Email
+
+Add **Send Email** action:
+
+| Field | Value |
+| ----------- | ----------------------------------------------------------- |
+| **To** | sales-manager@yourcompany.com |
+| **Subject** | `🚨 {{code.totalCount}} Stale Opportunities Need Attention` |
+| **Body** | `{{code.summary}}` |
+
+### Step 7: Test and Activate
+
+1. Click **Test** to run the workflow
+2. Check that the email contains the right data
+3. Activate when ready
+
+## Customization Options
+
+### Change Staleness Threshold
+
+Modify the Search Records filter to change from 7 days to your preferred period:
+
+* 3 days for high-velocity sales
+* 14 days for enterprise deals
+* 30 days for long sales cycles
+
+### Alert Individual Reps
+
+Instead of one manager email, use **Iterator** to send personalized emails to each rep about their own stale deals.
+
+### Add Escalation
+
+Create multiple workflows with increasing severity:
+
+1. Day 7: Email to rep
+2. Day 14: Email to rep + manager
+3. Day 21: Create task for manager to intervene
+
+### Include in Slack
+
+Use **HTTP Request** to post to a Slack webhook instead of or in addition to email.
+
+## Related
+
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/ja/user-guide/workflows/capabilities/send-emails-from-workflows)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
new file mode 100644
index 0000000000..2abce2ea85
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
@@ -0,0 +1,74 @@
+---
+title: Display Number of Emails Received
+description: Create a workflow to automatically count and display the number of emails received from each contact.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+## Overview
+
+This workflow triggers every time a new email is received and updates a custom field on the Person record with the total count of emails from that sender.
+
+## Prerequisites
+
+Before setting up this workflow, create a custom field on the **People** object:
+
+1. Go to **Settings → Data Model → People**
+2. Add a new **Number** field
+3. Name it something like "Number of emails received from this person"
+
+## Step-by-Step Setup
+
+
+
+### Step 1: Configure the Trigger
+
+1. Go to **Workflows** and create a new workflow
+2. Select **Record is Created** as the trigger
+3. Choose **Message Participants** (available under Advanced objects)
+
+
+ A Message Participant is a combination of a message ID and a person ID, creating one unique record per message. This is easier to track than Messages directly because we can access the `handle` field, which contains the sender's (or recipient's) email address.
+
+
+### Step 2: Filter on Role
+
+1. Add a **Filter** action
+2. Set the condition: **Role** equals **FROM**
+
+This ensures you only count messages sent by this person, not messages sent to them.
+
+### Step 3: Search All Message Participants with Same Handle
+
+1. Add a **Search Records** action
+2. Select **Message Participants** as the object
+3. Add filters: **Handle** equals the handle from the trigger (the sender's email address) and **Role** equals **FROM**
+4. Increase the **Limit** from 1 to **200** (the maximum)
+
+This finds all messages from this email address to get the total count.
+
+
+ The Search Records action is limited to returning 200 records maximum. However, since you're only using the `totalCount` value (not the individual records), this step will return the total number of emails sent by this person.
+
+
+### Step 4: Update the Person Record with a Create or Update Record action
+
+1. Add a **Create or Update Record** action
+
+
+ Use **Upsert Record** instead of **Update Record** here. This lets you identify the person by their email address (the `handle` field) rather than requiring a record ID from a previous step.
+
+
+2. Select **People** as the object
+3. Find the person by matching their email to the `handle` from the Message Participant
+4. Set your custom "Number of emails received" field to `{{searchRecords.totalCount}}`
+
+The `totalCount` value from the Search Records action represents the total number of emails received from this person.
+
+## Related
+
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions)
+* [Create Custom Fields](/l/ja/user-guide/data-model/how-tos/customize-your-data-model)
+* [Search Records Action](/l/ja/user-guide/workflows/capabilities/workflow-actions#search-records)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx
new file mode 100644
index 0000000000..a1f1287eeb
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx
@@ -0,0 +1,170 @@
+---
+title: Display Related Record Data
+description: Show data from related records (e.g., Company info on Opportunities) using workflows.
+---
+
+Display data from related records directly on your records — for example, show the employee count from a Company on its Opportunities. This workflow workaround is useful until nested fields are natively available.
+
+## Common Use Cases
+
+| Source | Destination | Fields to Copy |
+| ----------- | ----------- | ------------------------------- |
+| Company | Opportunity | Industry, Company Size, ARR |
+| Person | Opportunity | Email, Phone, Title |
+| Opportunity | Company | Last Deal Amount, Last Won Date |
+
+## Basic Field Copy
+
+### Example: Copy Contact Email to Opportunity
+
+**Goal**: When setting a Point of Contact on an opportunity, copy their email to the opportunity for easy access.
+
+### Prerequisite
+
+Create the destination fields in **Settings → Data Model → Opportunities** before building the workflow:
+
+* Contact Email (type: Email)
+* Contact Phone (type: Phone)
+
+### Setup
+
+1. **Trigger**: Record is Updated (Opportunities, Point of Contact field)
+
+2. **Filter**: Check that Point of Contact is not empty
+
+3. **Search Records**: Find the linked person
+ * Object: People
+ * Filter: ID equals `{{trigger.object.pointOfContact.id}}`
+
+4. **Update Record**:
+ * Object: Opportunities
+ * Record: `{{trigger.object.id}}`
+ * Contact Email: `{{searchRecords[0].email}}`
+ * Contact Phone: `{{searchRecords[0].phone}}`
+
+## Copy Multiple Fields
+
+### Example: Sync Company Info to All Related Opportunities
+
+**Goal**: When company details change, update all related opportunities.
+
+### Setup
+
+1. **Trigger**: Record is Updated (Companies)
+ * Fields: Industry, Company Size, Annual Revenue
+
+2. **Search Records**: Find all opportunities for this company
+ * Object: Opportunities
+ * Filter: Company ID equals `{{trigger.object.id}}`
+
+3. **Iterator**: Loop through each opportunity
+
+4. **Update Record** (inside iterator):
+ * Object: Opportunities
+ * Record: `{{iterator.currentItem.id}}`
+ * Company Industry: `{{trigger.object.industry}}`
+ * Company Size: `{{trigger.object.companySize}}`
+ * Company ARR: `{{trigger.object.annualRevenue}}`
+
+## Copy on Record Creation
+
+### Example: Pre-fill Opportunity with Company Data
+
+**Goal**: When creating an opportunity linked to a company, automatically copy key company info.
+
+### Prerequisite
+
+Create the destination fields in **Settings → Data Model → Opportunities**:
+
+* Company Industry (type: Text)
+* Company Size (type: Number)
+
+### Setup
+
+1. **Trigger**: Record is Created (Opportunities)
+ * Filter: Company is not empty
+
+2. **Search Records**: Get the linked company's details
+ * Object: Companies
+ * Filter: ID equals `{{trigger.object.company.id}}`
+
+3. **Update Record**:
+ * Object: Opportunities
+ * Record: `{{trigger.object.id}}`
+ * Company Industry: `{{searchRecords[0].industry}}`
+ * Company Size: `{{searchRecords[0].employees}}`
+
+
+ **Tasks and Notes limitation**: Relations on Tasks and Notes are hardcoded as many-to-many and are not yet available in workflow triggers or actions. To access these relations, use the [API](/l/ja/developers/extend/capabilities/apis) instead.
+
+
+## Bidirectional Sync
+
+### Example: Keep Primary Contact in Sync
+
+**Goal**: When a company's primary contact changes, update the contact. When a person becomes primary, update the company.
+
+### Workflow 1: Company → Person
+
+1. **Trigger**: Record is Updated (Companies, Primary Contact field)
+2. **Update Record**: Set person's "Is Primary Contact" to true
+3. **Search Records**: Find previous primary contact
+4. **Update Record**: Set previous contact's "Is Primary Contact" to false
+
+### Workflow 2: Person → Company
+
+1. **Trigger**: Record is Updated (People, Is Primary Contact = true)
+2. **Update Record**: Set company's Primary Contact to this person
+
+
+ Be careful with bidirectional syncs to avoid infinite loops. Use filters to check if the value actually changed before updating.
+
+
+## Using Code for Complex Mapping
+
+### Example: Transform Data During Copy
+
+**Goal**: Copy and format phone number from person to opportunity.
+
+```javascript
+export const main = async (params) => {
+ const { phone } = params;
+
+ if (!phone) return { formattedPhone: null };
+
+ // Remove non-numeric characters
+ const digits = phone.replace(/\D/g, '');
+
+ // Format as (XXX) XXX-XXXX
+ const formatted = digits.length === 10
+ ? `(${digits.slice(0,3)}) ${digits.slice(3,6)}-${digits.slice(6)}`
+ : phone;
+
+ return { formattedPhone: formatted };
+};
+```
+
+## Best Practices
+
+### Avoid Loops
+
+* Don't create workflows that trigger each other endlessly
+* Use specific field conditions
+* Add checks to see if value actually changed
+
+### Handle Missing Data
+
+* Always check if source record exists before copying
+* Provide default values for optional fields
+* Use filters to skip when source field is empty
+
+### Performance
+
+* Batch updates when copying to many records
+* Use scheduled workflows for bulk sync operations
+* Consider using Iterator for multiple record updates
+
+## Related
+
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions)
+* [Workflow Triggers](/l/ja/user-guide/workflows/capabilities/workflow-triggers)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx
new file mode 100644
index 0000000000..42fb6bd8a7
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx
@@ -0,0 +1,202 @@
+---
+title: Formula Fields
+description: Create formula fields using workflows until native support is available.
+---
+
+Twenty doesn't yet support native formula fields yet (coming in 2026), but you can achieve the same result using workflows. This workaround lets you automatically calculate and populate field values—from simple concatenations to complex business logic.
+
+## Common Use Cases
+
+| Use Case | Formula Example |
+| ------------------- | --------------------------------- |
+| **Full name** | First Name + " " + Last Name |
+| **Expected amount** | Amount × Probability |
+| **Days until due** | Due Date - Today |
+| **Days in stage** | Today - Stage Entry Date |
+| **Lead score** | Points based on multiple criteria |
+
+
+ For a complete example of tracking time in pipeline stages, see [Track How Long Opportunities Stay in Each Stage](/l/ja/user-guide/views-pipelines/how-tos/track-time-in-stage).
+
+
+## Basic Formula: Concatenation
+
+### Example: Auto-Fill Full Name
+
+**Goal**: Automatically combine first and last name into a full name field.
+
+### Setup
+
+1. **Trigger**: Record is Updated or Created (People)
+
+2. **Filter**: Check that first name or last name changed
+
+3. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { firstName, lastName } = params;
+
+ const fullName = [firstName, lastName]
+ .filter(Boolean)
+ .join(' ');
+
+ return { fullName };
+};
+```
+
+4. **Update Record**: Set Full Name to `{{code.fullName}}`
+
+## Numeric Formula: Expected Amount
+
+### Example: Calculate Expected Revenue
+
+**Goal**: Multiply opportunity amount by probability to get expected amount.
+
+See [How to Show Expected Amount in Pipeline](/l/ja/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline) for the complete workflow.
+
+### Quick Setup
+
+1. **Trigger**: Record is Updated (Opportunities, Amount OR Probability field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { amount, probability } = params;
+
+ const expectedAmount = (amount || 0) * (probability || 0) / 100;
+
+ return { expectedAmount };
+};
+```
+
+3. **Update Record**: Set Expected Amount to `{{code.expectedAmount}}`
+
+## Date Formula: Days Calculation
+
+### Example: Days Until Task Due
+
+**Goal**: Calculate how many days remain until a task's due date.
+
+### Setup
+
+1. **Trigger**: Record is Updated or Created (Tasks, Due Date field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { dueDate } = params;
+
+ if (!dueDate) {
+ return { daysUntilDue: null };
+ }
+
+ const due = new Date(dueDate);
+ const today = new Date();
+ const diffTime = due - today;
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return { daysUntilDue: diffDays };
+};
+```
+
+3. **Update Record**: Set Days Until Due to `{{code.daysUntilDue}}`
+
+
+ Negative values indicate overdue tasks. You can use this field to filter or sort tasks by urgency.
+
+
+## Conditional Formula: Lead Score
+
+### Example: Calculate Lead Score Based on Criteria
+
+**Goal**: Score leads based on company size, industry, and engagement.
+
+### Setup
+
+1. **Trigger**: Record is Updated (People or Companies)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { companySize, industry, hasEmail, hasPhone, source } = params;
+
+ let score = 0;
+
+ // Company size scoring
+ if (companySize === 'Enterprise') score += 30;
+ else if (companySize === 'Mid-Market') score += 20;
+ else if (companySize === 'SMB') score += 10;
+
+ // Industry scoring
+ const targetIndustries = ['Technology', 'Finance', 'Healthcare'];
+ if (targetIndustries.includes(industry)) score += 25;
+
+ // Contact info scoring
+ if (hasEmail) score += 10;
+ if (hasPhone) score += 15;
+
+ // Source scoring
+ if (source === 'Referral') score += 20;
+ else if (source === 'Website') score += 10;
+
+ return { leadScore: score };
+};
+```
+
+3. **Update Record**: Set Lead Score to `{{code.leadScore}}`
+
+## Text Formula: Domain Extraction
+
+### Example: Extract Domain from Email
+
+**Goal**: Automatically extract and store the email domain.
+
+### Setup
+
+1. **Trigger**: Record is Updated (People, Email field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { email } = params;
+
+ if (!email) return { domain: null };
+
+ const domain = email.split('@')[1]?.toLowerCase();
+
+ return { domain };
+};
+```
+
+3. **Update Record**: Set Domain field to `{{code.domain}}`
+
+## Best Practices
+
+### Performance
+
+* Only trigger on relevant field changes
+* Use filters to skip records that don't need calculation
+* Avoid complex calculations in high-volume workflows
+
+### Error Handling
+
+* Check for null/undefined values before calculations
+* Use default values when data is missing
+* Return clear error messages when calculations fail
+
+### Testing
+
+* Test with edge cases (empty fields, zero values)
+* Verify calculations manually before activating
+* Monitor workflow runs for unexpected results
+
+## Related
+
+* [How to Show Expected Amount in Pipeline](/l/ja/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline)
+* [How to Track Time in Stage](/l/ja/user-guide/views-pipelines/how-tos/track-time-in-stage)
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
new file mode 100644
index 0000000000..540d5405ab
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
@@ -0,0 +1,106 @@
+---
+title: Send Email Alerts with Tasks Due
+description: Automatically notify team members about their upcoming or overdue tasks.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+Send daily email reminders to each team member about their tasks due today.
+
+## Overview
+
+This workflow runs on a schedule and:
+
+1. Fetches all workspace members
+2. Loops through each member
+3. Finds their tasks due today
+4. Formats and sends a personalized email
+
+## Step-by-Step Setup
+
+
+
+### Step 1: Configure the Trigger
+
+1. Go to **Settings → Workflows** and create a new workflow
+2. Select **On a Schedule** as the trigger
+3. Use a cron expression for daily at 8:00 AM: `0 8 * * *`
+
+### Step 2: Search for All Workspace Members
+
+1. Add a **Search Records** action
+2. Select **Workspace Members** (under advanced objects)
+3. No filters needed — this returns all members
+
+### Step 3: Add an Iterator
+
+1. Add an **Iterator** action
+2. Set the input array to the workspace members from the previous step
+3. All actions inside the iterator will run once per member
+
+### Step 4: Search for Tasks Due Today (Inside Iterator)
+
+1. Inside the iterator, add a **Search Records** action
+2. Select **Tasks** as the object
+3. Add filters:
+ * **Assignee** = current workspace member (from the iterator)
+ * **Due Date** = today
+
+### Step 5: Format Tasks into Email Body (Inside Iterator)
+
+Add a **Code** action to format the tasks into a readable list with links:
+
+```javascript
+export const main = async (params: {
+ tasksDue?: Array<{ id: string; title: string }> | null | string;
+}) => {
+ const tasksDue =
+ typeof params.tasksDue === "string"
+ ? JSON.parse(params.tasksDue)
+ : params.tasksDue;
+
+ if (!Array.isArray(tasksDue) || tasksDue.length === 0) {
+ return {
+ formattedTasks: "No tasks due today."
+ };
+ }
+
+ const formattedTasks = tasksDue
+ .map(
+ t =>
+ `${t.title}\nhttps://yourSubDomain.twenty.com/object/task/${t.id}`
+ )
+ .join("\n\n");
+
+ return { formattedTasks };
+};
+```
+
+
+ Replace `yourSubDomain` with your actual Twenty workspace subdomain.
+
+
+### Step 6: Send Email (Inside Iterator)
+
+1. Add a **Send Email** action (still inside the iterator)
+2. Configure:
+
+| Field | Value |
+| ----------- | --------------------------------------------------------------- |
+| **To** | `{{iterator.currentItem.userEmail}}` (workspace member's email) |
+| **Subject** | Your Tasks Due Today |
+| **Body** | `{{code.formattedTasks}}` |
+
+### Step 7: Test and Activate
+
+1. Click **Test** to run the workflow manually
+2. Check inboxes for the emails
+3. Activate the workflow
+
+## Related
+
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/ja/user-guide/workflows/capabilities/send-emails-from-workflows)
+* [Handle Arrays in Code Actions](/l/ja/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/need-more-help/professional-services.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
new file mode 100644
index 0000000000..674ca6229f
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
@@ -0,0 +1,29 @@
+---
+title: Professional Services
+description: Get professional help building complex workflows and automations from Twenty's team and certified partners.
+---
+
+## When Do You Need Professional Help?
+
+Consider professional services for:
+
+* Complex multi-system integrations
+* Advanced business logic and automation rules
+* Large-scale data processing workflows
+* Custom API development
+* Team training and workflow optimization
+* When you don't have internal resources
+
+## Service Options
+
+### Onboarding Packs
+
+Get help from our core team with our 4-hour [Onboarding packs](https://twenty.com/onboarding-packages):
+
+* **Workflow Creation**: Build custom workflows for your business processes
+* **Data Model Design**: Optimize your data structure for workflow automation
+* **Data Migration**: Import existing data with proper workflow integration
+
+### Implementation Partners
+
+Work with certified partners for advanced customizations. Contact us at contact@twenty.com to connect with our [implementation partners](https://twenty.com/partners).
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx
new file mode 100644
index 0000000000..b243fc4acb
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx
@@ -0,0 +1,170 @@
+---
+title: Workflow Troubleshooting
+description: Common workflow issues and how to resolve them.
+---
+
+## Common Issues and Solutions
+
+### Workflow Not Triggering
+
+**Symptoms**: Your workflow doesn't run when you expect it to.
+
+**Possible Causes**:
+
+1. **Workflow not activated**: Ensure the workflow is set to "Active" not "Draft"
+2. **Trigger conditions not met**: Verify the trigger matches your expected event
+3. **Field not monitored**: For "Record is Updated" triggers, ensure the specific field is being watched
+4. **Permissions**: Check you have permission to run workflows
+
+**Solutions**:
+
+* Verify workflow status in the workflow list
+* Test with the specific action you expect to trigger it
+* Review trigger configuration
+* Contact your admin about permissions
+
+### Workflow Triggers Too Early (Empty Fields)
+
+**Symptoms**: When manually creating a record in the UI, your workflow triggers before you've had time to fill in all the fields. The workflow runs with mostly empty field values.
+
+**Why this happens**: Twenty saves everything in real-time — there's no separate "edit" vs "read" mode. When you create a record, it's saved immediately, triggering the "Record is created" event before you can fill in additional fields.
+
+**When "Record is created" works well**:
+
+* Records created via API calls (fields are populated in a single request)
+* Records created via import
+* Automated record creation from other workflows
+
+**Solution**: For records created manually in the UI, use **"Record is created or updated"** as your trigger instead. This way:
+
+* The workflow triggers after the user has finished filling in and saving the fields
+* You get the complete data rather than empty values
+
+
+ If you only want the workflow to run once per record, add a Filter action to check a field like `createdAt equals updatedAt` (first save) or use a custom checkbox field to track if the workflow has already run.
+
+
+### Actions Failing
+
+**Symptoms**: Workflow runs but some actions fail.
+
+**Possible Causes**:
+
+1. **Missing data**: Required fields are empty
+2. **Invalid references**: Variables from previous steps don't exist
+3. **API errors**: External services returning errors
+4. **Permission issues**: Action requires permissions you don't have
+
+**Solutions**:
+
+* Check the workflow run details for error messages
+* Verify all required fields have values
+* Test API connections independently
+* Review role permissions
+
+### HTTP Request Errors
+
+**Symptoms**: HTTP Request actions fail or return unexpected results.
+
+**Common Error Codes**:
+
+* **400**: Bad request - check your request body format
+* **401**: Unauthorized - verify API key
+* **403**: Forbidden - check API permissions
+* **404**: Not found - verify endpoint URL
+* **429**: Too many requests - implement rate limiting
+* **500**: Server error - external service issue
+
+**Solutions**:
+
+* Verify API endpoint URL
+* Check authentication headers
+* Test the API call outside of Twenty first
+* Add error handling in Code actions
+
+### Code Action Errors
+
+**Symptoms**: JavaScript code fails to execute.
+
+**Common Issues**:
+
+1. **Syntax errors**: Typos or invalid JavaScript
+2. **Undefined variables**: Referencing variables that don't exist
+3. **Type errors**: Operations on wrong data types
+4. **Timeouts**: Code taking too long to execute
+
+**Solutions**:
+
+* Use the built-in code editor validation
+* Test code logic in a JavaScript console first
+* Add console.log statements for debugging
+* Simplify complex operations
+
+### Email Not Sending
+
+**Symptoms**: Send Email action doesn't deliver emails.
+
+**Possible Causes**:
+
+1. **No email account connected**: Check Settings → Accounts
+2. **Invalid email address**: Recipient email is malformed
+3. **Sending limits**: Email provider rate limits reached
+4. **Spam filters**: Emails being blocked
+
+**Solutions**:
+
+* Verify email account connection
+* Validate recipient email addresses
+* Check email provider limits
+* Review email content for spam triggers
+
+## Debugging Workflows
+
+### Using Workflow Runs
+
+1. Go to the workflow editor
+2. Open the **Runs** panel
+3. Find the failed run
+4. Click to see step-by-step details
+5. Review error messages and output data
+
+### Testing Individual Steps
+
+1. For Code actions, use the **Test** button
+2. For HTTP requests, test the endpoint separately
+3. Create test records to trigger workflows
+4. Use manual triggers for controlled testing
+
+### Common Debugging Patterns
+
+**Add logging**:
+Use Code actions to log intermediate values for debugging.
+
+**Isolate steps**:
+Test each step independently to identify failures.
+
+**Check data flow**:
+Verify that each step receives the expected input data.
+
+## Best Practices to Avoid Issues
+
+### Before Activation
+
+* Test thoroughly in draft mode
+* Validate all API connections
+* Review trigger conditions carefully
+* Document expected behavior
+
+### During Development
+
+* Use descriptive step names
+* Add comments in Code actions
+* Test with realistic data
+* Plan for edge cases
+
+### After Activation
+
+* Monitor initial runs closely
+* Set up alerts for failures
+* Review run history regularly
+* Keep workflows simple when possible
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx
new file mode 100644
index 0000000000..13519aebcf
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx
@@ -0,0 +1,254 @@
+---
+title: Workflows FAQ
+description: Frequently asked questions about workflows in Twenty.
+---
+
+
+
+ This is likely a permissions issue. You need access to workflows to create and activate them.
+
+ **Solution**: Contact your workspace administrator to grant you workflow access under **Settings → Roles**.
+
+ If you don't see the Workflows section at all in your sidebar, this confirms it's a permissions issue.
+
+
+
+ Manual workflows only appear in the navbar if properly configured:
+
+ 1. The workflow must be **activated** (not in draft mode)
+ 2. The navbar placement must be set to **Pinned**
+ 3. For Single/Bulk triggers, you must be on the correct object page
+
+ **To check**: Open the workflow → click the trigger → verify "Navbar placement" is set to "Pinned".
+
+ You can always access manual workflows via **Cmd + K** (or **Ctrl + K**) regardless of navbar settings.
+
+
+
+ | Type | Records Required | Workflow Runs |
+ | ---- | ---------------- | ------------- |
+
+ \| **Global** | None | Once, no record input |
+ \| **Single** | One or more selected | Once per selected record |
+ \| **Bulk** | One or more selected | Once, with all records as array |
+
+ * **Global**: Use when the workflow doesn't need any record context (e.g., generate a report)
+ * **Single**: Use when you want to process each selected record independently (e.g., send individual emails)
+ * **Bulk**: Use when you need to process records together or optimize credit usage (requires Iterator action)
+
+ See [Workflow Triggers](/l/ja/user-guide/workflows/capabilities/workflow-triggers) for details.
+
+
+
+ An explicit If/Else node is not yet available but is on our roadmap.
+
+ **Current workaround**: Create multiple branches from your step, each starting with a **Filter** action:
+
+ ```
+ Step 1
+ │
+ ├── Branch A: Filter (condition = true) → Actions...
+ │
+ └── Branch B: Filter (condition = false) → Actions...
+ ```
+
+ Only the branch where the filter condition passes will execute its subsequent actions.
+
+ See [How to Use Branches](/l/ja/user-guide/workflows/capabilities/workflow-branches) for a step-by-step guide.
+
+
+
+ **Yes**, branches run in parallel by default.
+
+ If you want only one branch to execute:
+
+ * Add a **Filter** action at the start of each branch
+ * Set opposite conditions (e.g., Branch A: status = "Open", Branch B: status ≠ "Open")
+
+ Branches that fail their filter condition stop executing, while others continue.
+
+
+
+ **Yes**. After your parallel branches complete, you can add a step that both branches connect to.
+
+ In the workflow editor:
+
+ 1. Complete your branched actions
+ 2. Add a new step after the branches
+ 3. Drag connections from the end of each branch to this new step
+
+ The merged step will execute after all connected branches complete.
+
+
+
+ **Search Records returns a maximum of 200 records.**
+
+ If you need to process more:
+
+ * Add more specific filters to reduce results
+ * Use scheduled workflows to process in batches
+ * Consider using the API for bulk operations
+
+ For most workflows, 200 records is sufficient. If you regularly hit this limit, consider restructuring your automation.
+
+
+
+ **Not yet.** CC and BCC fields for the Send Email action are on our roadmap.
+
+ **Current workaround**: Add multiple Send Email actions to send to additional recipients, or use an HTTP Request to send via an external email service that supports CC.
+
+
+
+ Every action produces output data that can be used in subsequent steps.
+
+ **To reference previous step data**:
+
+ * Use the variable picker when configuring a field
+ * Or type `{{stepName.fieldName}}` directly
+
+ **Examples**:
+
+ * Trigger data: `{{trigger.object.email}}`
+ * Search results: `{{searchRecords[0].name}}`
+ * Code output: `{{code.calculatedValue}}`
+
+ Hover over any field in the action configuration to see available variables from previous steps.
+
+
+
+ **Iterator requires an array input.** Common issues:
+
+ 1. **Input is not an array**: Ensure you're passing results from Search Records or another action that returns an array
+ 2. **Array is empty**: Add a filter before Iterator to check `{{searchRecords.length}} > 0`
+ 3. **Wrong variable selected**: Make sure you select the array itself, not a single record
+
+ **Correct setup**:
+
+ 1. Search Records (returns array)
+ 2. Filter: length > 0
+ 3. Iterator: select `{{searchRecords}}`
+ 4. Actions inside iterator use `{{iterator.currentItem.fieldName}}`
+
+
+
+ Code actions (serverless functions) have a **default timeout of 5 minutes** (300 seconds).
+
+ The maximum configurable timeout is **15 minutes** (900 seconds).
+
+ If your code exceeds this limit, the action will fail with a timeout error.
+
+ **Tips to avoid timeouts**:
+
+ * Break large operations into smaller chunks using Iterator
+ * Avoid heavy computations; use external services via HTTP Request for intensive processing
+ * Optimize your code to reduce execution time
+ * If you need longer processing, consider using scheduled workflows that process data in batches
+
+
+
+ Workflow runs show the execution history and help you debug issues.
+
+ **Access runs**:
+
+ * In workflow editor → **Runs** panel on the right
+ * Or go to **Workflow Runs** in the sidebar
+
+ **Understanding a run**:
+
+ * **Status**: Running, Completed, Failed, Waiting
+ * **Steps**: See which steps executed and their output
+ * **Errors**: Click failed steps to see error messages
+ * **Data**: View input/output data at each step
+
+ See [Workflow Runs](/l/ja/user-guide/workflows/capabilities/workflow-runs) for details.
+
+
+
+ Workflow runs might be failing immediately due to rate limits.
+
+ **Hard limit: 5,000 runs per hour per workspace.**
+
+ If you exceed this limit, workflows are immediately marked as failed and won't appear in your runs list as expected.
+
+ **Common scenarios that hit this limit**:
+
+ * Selecting more than 5,000 records with a Single manual trigger
+ * Multiple workflows running simultaneously across your workspace
+ * High-frequency automated triggers (e.g., Record Updated on a busy object)
+
+ **Solutions**:
+
+ * Use **Bulk** triggers instead of Single to process many records in one run
+ * Space out large batch operations
+ * Use filters to reduce trigger frequency
+ * Schedule heavy workflows during off-peak hours
+
+
+
+ Twenty has two rate limits to ensure system stability:
+
+ | Limit | Value | Behavior |
+ | ----- | ----- | -------- |
+
+ \| **Soft limit** | 100 runs/minute | Runs queue in "Not Started" status, processed gradually |
+ \| **Hard limit** | 5,000 runs/hour | Runs immediately fail |
+
+ **Soft limit (100/min)**: Your workflows won't fail—they just wait in the queue and are processed over time. You can trigger more than 100 records; execution will be slower.
+
+ **Hard limit (5,000/hr)**: This applies to your entire workspace. If all your workflows combined exceed 5,000 runs in an hour, additional runs will fail immediately.
+
+ **Tips to stay within limits**:
+
+ * Use Bulk triggers with Iterator instead of Single triggers for large batches
+ * Combine related automations into fewer workflows
+ * Use scheduled workflows to spread load over time
+
+
+
+ **No, there is no automatic retry functionality at the moment.**
+
+ If a workflow run fails, you'll need to:
+
+ 1. Review the error in **Settings → Workflows → [Your Workflow] → Runs**
+ 2. Fix the issue (data, configuration, or external service)
+ 3. Manually trigger the workflow again on the affected record(s)
+
+ **Tips to reduce failures**:
+
+ * Add **Filter** nodes to validate data before actions
+ * Use **Search Records** to check if related records exist
+ * Test thoroughly with a few records before bulk operations
+
+ Automatic retry functionality is on our roadmap for a future release.
+
+
+
+ **Yes, if your workflows are triggered by record creation or updates.**
+
+ When you import data via CSV, each record created or updated can trigger workflows. A large import (thousands of records) could:
+
+ * Hit the 5,000 runs/hour limit
+ * Consume significant workflow credits
+ * Send unexpected emails or notifications
+ * Create duplicate tasks or records
+
+ **Before a mass import**:
+
+ 1. Go to **Settings → Workflows**
+ 2. Identify workflows triggered by the object you're importing
+ 3. **Deactivate** them temporarily
+ 4. Run your CSV import
+ 5. **Reactivate** the workflows when done
+
+ **Alternative**: If you need the workflows to run on imported data, import in smaller batches to stay within rate limits.
+
+
+
+ If your workflow canvas looks messy with nodes scattered around, you can automatically organize it:
+
+ 1. Right-click anywhere on the workflow canvas
+ 2. Click **Tidy up workflow**
+
+ This will automatically rearrange all nodes into a clean, organized layout.
+
+
diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/overview.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/overview.mdx
new file mode 100644
index 0000000000..ffea08eb23
--- /dev/null
+++ b/packages/twenty-docs/l/ja/user-guide/workflows/overview.mdx
@@ -0,0 +1,80 @@
+---
+title: Workflows
+description: Learn how to build automations in Twenty.
+image: /images/user-guide/workflows/workflow.png
+---
+
+
+
+
+
+## Why Workflows Matter
+
+Twenty was built to bring maximum flexibility to its users. Rather than forcing you to adapt your business processes to rigid, pre-built features, workflows enable you to build automations that create the CRM that best supports your unique business use cases.
+
+Workflows are Twenty's in-app feature for building these automations. They give you the building blocks to create exactly what your business needs, when it needs it.
+
+## What can I do with workflows?
+
+We recommend building automations for two main purposes:
+
+1. **Internal automations to facilitate your team's day-to-day**: Reduce the amount of manual entries and repetitive tasks that slow down your team.
+2. **Bring data in and out of Twenty**: Connect Twenty via API calls and webhooks to your database and other tools.
+
+## Building Your First Workflow
+
+### Step 1: Create a New Workflow
+
+1. Go to **Workflows** accessible below the other objects
+2. Click **+ New Record**
+3. Give your workflow a name
+
+### Step 2: Add a Trigger
+
+Every workflow starts with a trigger. Choose from:
+
+* **Record events**: When a record is created, updated, or deleted
+* **Schedule**: Run at specific times (daily, weekly, etc.)
+* **Manual**: Triggered by a user action
+* **Webhook**: Triggered by a webhook
+
+
+
+### Step 3: Add Actions
+
+After your trigger, add one or more actions:
+
+* **Create Record**: Add new records to any object
+* **Update Record**: Modify existing record data
+* **Delete Record**: Remove records from objects
+* **Search Records**: Find records matching criteria
+* **Upsert Record**: Create or update based on matching criteria
+* **Iterator**: Loop through arrays of records
+* **Filter**: Control which records proceed
+* **Delay**: Wait before continuing (duration or scheduled date)
+* **Send Email**: Send emails via your connected account
+* **Code**: Run custom JavaScript
+* **HTTP Request**: Call external APIs
+* **Form**: Get inputs from users within Twenty UI at the time of execution
+* **AI Agent** (Coming soon): Run intelligent AI tasks
+
+
+
+### Step 4: Test and Activate
+
+1. Use the **Test** button to run your workflow with sample data
+2. Review the results to ensure it works as expected
+3. Toggle the workflow **Active** when ready
+
+## Workflow Best Practices
+
+* **Edit step names**: Rename your workflow steps to clearly describe what each one does. This helps with maintenance and makes it easier to hand off to coworkers
+* **Leverage previous step data**: You can use fields from records returned by any previous step in your workflow
+* **Start simple**: Begin with basic workflows and add complexity over time as you become more comfortable with the system
+* **Plan before building**: Map out your workflow logic before you start building to avoid getting stuck halfway through
+
+## Next Steps
+
+* [Workflow Triggers](/l/ja/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/ja/user-guide/workflows/capabilities/workflow-actions)
+* [CRM Automations](/l/ja/user-guide/workflows/how-tos/crm-automations/closed-won-automations)
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/best-practices-server.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/best-practices-server.mdx
index 6338a8e808..d8f5c5ea7c 100644
--- a/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/best-practices-server.mdx
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/best-practices-server.mdx
@@ -1,22 +1,22 @@
---
-title: 모범 사례
+title: Best Practices
---
-이 문서는 백엔드 작업 시 따를 모범 사례를 설명합니다.
+This document outlines the best practices you should follow when working on the backend.
-## 모듈형 접근법 따르기
+## Follow a modular approach
-백엔드는 NestJS로 작업할 때 기본 원칙 중 하나인 모듈형 접근법을 따릅니다. 코드베이스를 깔끔하고 체계적으로 유지하려면 코드를 재사용 가능한 모듈로 분리하십시오.
-각 모듈은 특정 기능을 캡슐화하고 명확하게 정의된 범위를 가져야 합니다. 이 모듈형 접근법은 관심사의 명확한 분리를 가능하게 하고 불필요한 복잡성을 제거합니다.
+The backend follows a modular approach, which is a fundamental principle when working with NestJS. Make sure you break down your code into reusable modules to maintain a clean and organized codebase.
+Each module should encapsulate a particular feature or functionality and have a well-defined scope. This modular approach enables clear separation of concerns and removes unnecessary complexities.
-## 모듈에서 사용할 서비스를 노출시키십시오.
+## Expose services to use in modules
-항상 명확하고 단일한 책임을 가진 서비스를 생성하여 코드 가독성과 유지보수성을 향상시킵니다. 서비스의 이름을 일관되게 설명적으로 지정하십시오.
+Always create services that have a clear and single responsibility, which enhances code readability and maintainability. Name the services descriptively and consistently.
-다른 모듈에서 사용하고자 하는 서비스를 노출해야 합니다. 다른 모듈에 서비스를 노출하는 것은 NestJS의 강력한 의존성 주입 시스템을 통해 가능하며, 구성 요소 간의 느슨한 결합을 촉진합니다.
+You should also expose services that you want to use in other modules. Exposing services to other modules is possible through NestJS's powerful dependency injection system, and promotes loose coupling between components.
-## `any` 타입 사용 피하기
+## Avoid using `any` type
-변수를 `any`로 선언하면 TypeScript의 타입 검사자가 타입 검사를 수행하지 않으므로 변수에 모든 유형의 값을 할당할 수 있게 됩니다. TypeScript는 값에 따라 변수의 타입을 추론하기 위해 타입 추론을 사용합니다. 이를 `any`로 선언하면 TypeScript는 더 이상 타입을 추론할 수 없습니다. 이는 개발 중 타입 관련 오류를 잡기 어렵게 만들어 런타임 오류로 이어지고, 코드의 유지보수성과 신뢰성이 떨어지며, 다른 사람이 이해하기도 어려워집니다.
+When you declare a variable as `any`, TypeScript's type checker doesn't perform any type checking, making it possible to assign any type of values to the variable. TypeScript uses type inference to determine the type of variable based on the value. By declaring it as `any`, TypeScript can no longer infer the type. This makes it hard to catch type-related errors during development, leading to runtime errors and makes the code less maintainable, less reliable, and harder to understand for others.
-이것이 모든 것이 타입을 가져야 하는 이유입니다. 따라서 이름(first name)과 성(last name)을 가진 새 개체를 만든다면, 다루는 개체의 구조를 정의하는 이름과 성을 포함한 인터페이스나 타입을 만들어야 합니다.
+This is why everything should have a type. So if you create a new object with a first name and last name, you should create an interface or type that contains a first name and last name that defines the shape of the object you are manipulating.
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/custom-objects.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/custom-objects.mdx
new file mode 100644
index 0000000000..7feec7a639
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/custom-objects.mdx
@@ -0,0 +1,39 @@
+---
+title: Custom Objects
+---
+
+Objects are structures that allow you to store data (records, attributes, and values) specific to an organization. Twenty provides both standard and custom objects.
+
+Standard objects are in-built objects with a set of attributes available for all users. Examples of standard objects in Twenty include Company and Person. Standard objects have standard fields that are also available for all Twenty users, like Company.displayName.
+
+Custom objects are objects that you can create to store information that is unique to your organization. They are not built-in; members of your workspace can create and customize custom objects to hold information that standard objects aren't suitable for.
+
+## High-level schema
+
+
+
+
+
+
+
+## How it works
+
+Custom objects come from metadata tables that determine the shape, name, and type of the objects. All this information is present in the metadata schema database, consisting of tables:
+
+* **DataSource**: Details where the data is present.
+* **Object**: Describes the object and links to a DataSource.
+* **Field**: Outlines an Object's fields and connects to the Object.
+
+To add a custom object, the workspaceMember will query the /metadata API. This updates the metadata accordingly and computes a GraphQL schema based on the metadata, storing it in a GQL cache for later use.
+
+
+
+
+
+
+
+To fetch data, the process involves making queries through the /graphql endpoint and passing them through the Query Resolver.
+
+
+
+
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/feature-flags.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/feature-flags.mdx
new file mode 100644
index 0000000000..a261cfec3c
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/feature-flags.mdx
@@ -0,0 +1,46 @@
+---
+title: Feature Flags
+---
+
+Feature flags are used to hide experimental features. For Twenty, they are set on workspace level and not on a user level.
+
+## Adding a new feature flag
+
+In `FeatureFlagKey.ts` add the feature flag:
+
+```ts
+type FeatureFlagKey =
+ | 'IS_FEATURENAME_ENABLED'
+ | ...;
+```
+
+Also add it to the enum in `feature-flag.entity.ts`:
+
+```ts
+enum FeatureFlagKeys {
+ IsFeatureNameEnabled = 'IS_FEATURENAME_ENABLED',
+ ...
+}
+```
+
+To apply a feature flag on a **backend** feature use:
+
+```ts
+@Gate({
+ featureFlag: 'IS_FEATURENAME_ENABLED',
+})
+```
+
+To apply a feature flag on a **frontend** feature use:
+
+```ts
+const isFeatureNameEnabled = useIsFeatureEnabled('IS_FEATURENAME_ENABLED');
+```
+
+## Configure feature flags for the deployment
+
+Change the corresponding record in the Table `core.featureFlag`:
+
+| id | key | workspaceId | value |
+| ------ | ------------------------ | ----------- | ------ |
+| Random | `IS_FEATURENAME_ENABLED` | WorkspaceID | `true` |
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx
new file mode 100644
index 0000000000..233d92ac8a
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx
@@ -0,0 +1,125 @@
+---
+title: Folder Architecture
+info: A detailed look into our server folder architecture
+---
+
+The backend directory structure is as follows:
+
+```
+server
+ └───ability
+ └───constants
+ └───core
+ └───database
+ └───decorators
+ └───filters
+ └───guards
+ └───health
+ └───integrations
+ └───metadata
+ └───workspace
+ └───utils
+```
+
+## Ability
+
+Defines permissions and includes handlers for each entity.
+
+## Decorators
+
+Defines custom decorators in NestJS for added functionality.
+
+See [custom decorators](https://docs.nestjs.com/custom-decorators) for more details.
+
+## Filters
+
+Includes exception filters to handle exceptions that might occur in GraphQL endpoints.
+
+## Guards
+
+See [guards](https://docs.nestjs.com/guards) for more details.
+
+## Health
+
+Includes a publicly available REST API (healthz) that returns a JSON to confirm whether the database is working as expected.
+
+## Metadata
+
+Defines custom objects and makes available a GraphQL API (graphql/metadata).
+
+## Workspace
+
+Generates and serves custom GraphQL schema based on the metadata.
+
+### Workspace Directory Structure
+
+```
+workspace
+
+ └───workspace-schema-builder
+ └───factories
+ └───graphql-types
+ └───database
+ └───interfaces
+ └───object-definitions
+ └───services
+ └───storage
+ └───utils
+ └───workspace-resolver-builder
+ └───factories
+ └───interfaces
+ └───workspace-query-builder
+ └───factories
+ └───interfaces
+ └───workspace-query-runner
+ └───interfaces
+ └───utils
+ └───workspace-datasource
+ └───workspace-manager
+ └───workspace-migration-runner
+ └───utils
+ └───workspace.module.ts
+ └───workspace.factory.spec.ts
+ └───workspace.factory.ts
+```
+
+The root of the workspace directory includes the `workspace.factory.ts`, a file containing the `createGraphQLSchema` function. This function generates workspace-specific schema by using the metadata to tailor a schema for individual workspaces. By separating the schema and resolver construction, we use the `makeExecutableSchema` function, which combines these discrete elements.
+
+This strategy is not just about organization, but also helps with optimization, such as caching generated type definitions to enhance performance and scalability.
+
+### Workspace Schema builder
+
+Generates the GraphQL schema, and includes:
+
+#### Factories:
+
+Specialised constructors to generate GraphQL-related constructs.
+
+* The type.factory translates field metadata into GraphQL types using `TypeMapperService`.
+* The type-definition.factory creates GraphQL input or output objects derived from `objectMetadata`.
+
+#### GraphQL Types
+
+Includes enumerations, inputs, objects, and scalars, and serves as the building blocks for the schema construction.
+
+#### Interfaces and Object Definitions
+
+Contains the blueprints for GraphQL entities, and includes both predefined and custom types like `MONEY` or `URL`.
+
+#### Services
+
+Contains the service responsible for associating FieldMetadataType with its appropriate GraphQL scalar or query modifiers.
+
+#### Storage
+
+Includes the `TypeDefinitionsStorage` class that contains reusable type definitions, preventing duplication of GraphQL types.
+
+### Workspace Resolver Builder
+
+Creates resolver functions for querying and mutating the GraphQL schema.
+
+Each factory in this directory is responsible for producing a distinct resolver type, such as the `FindManyResolverFactory`, designed for adaptable application across various tables.
+
+### Workspace Query Runner
+
+Runs the generated queries on the database and parses the result.
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/queue.mdx
new file mode 100644
index 0000000000..6148c0fbf0
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/queue.mdx
@@ -0,0 +1,41 @@
+---
+title: Message Queue
+---
+
+Queues facilitate async operations to be performed. They can be used for performing background tasks such as sending a welcome email on register.
+Each use case will have its own queue class extended from `MessageQueueServiceBase`.
+
+Currently, we only support `bull-mq`[bull-mq](https://bullmq.io/) as the queue driver.
+
+## Steps to create and use a new queue
+
+1. Add a queue name for your new queue under enum `MESSAGE_QUEUES`.
+2. Provide the factory implementation of the queue with the queue name as the dependency token.
+3. Inject the queue that you created in the required module/service with the queue name as the dependency token.
+4. Add worker class with token based injection just like producer.
+
+### Example usage
+
+```ts
+class Resolver {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
+
+ async onSomeAction() {
+ //business logic
+ await this.queue.add(someData);
+ }
+}
+
+//async worker
+class CustomWorker {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
+ this.initWorker();
+ }
+
+ async initWorker() {
+ await this.queue.work(async ({ id, data }) => {
+ //worker logic
+ });
+ }
+}
+```
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/server-commands.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/server-commands.mdx
new file mode 100644
index 0000000000..6951909788
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/server-commands.mdx
@@ -0,0 +1,101 @@
+---
+title: Backend Commands
+---
+
+## Useful commands
+
+These commands should be executed from packages/twenty-server folder.
+From any other folder you can run `npx nx {command} twenty-server` (or `npx nx run twenty-server:{command}`).
+
+### First time setup
+
+```
+npx nx database:reset twenty-server # setup the database with dev seeds
+```
+
+### Starting the server
+
+```
+npx nx run twenty-server:start
+```
+
+### Lint
+
+```
+npx nx run twenty-server:lint # pass --fix to fix lint errors
+```
+
+### Test
+
+```
+npx nx run twenty-server:test:unit # run unit tests
+npx nx run twenty-server:test:integration # run integration tests
+```
+
+Note: you can run `npx nx run twenty-server:test:integration:with-db-reset` in case you need to reset the database before running the integration tests.
+
+### Resetting the database
+
+If you want to reset and seed the database, you can run the following command:
+
+```bash
+npx nx run twenty-server:database:reset
+```
+
+### Migrations
+
+#### For objects in Core/Metadata schemas (TypeORM)
+
+```bash
+npx nx run twenty-server:typeorm migration:generate src/database/typeorm/core/migrations/nameOfYourMigration -d src/database/typeorm/core/core.datasource.ts
+```
+
+#### For Workspace objects
+
+There are no migrations files, migration are generated automatically for each workspace,
+stored in the database, and applied with this command
+
+```bash
+npx nx run twenty-server:command workspace:sync-metadata -f
+```
+
+
+ This will drop the database and re-run the migrations and seed.
+
+ Make sure to back up any data you want to keep before running this command.
+
+
+## Tech Stack
+
+Twenty primarily uses NestJS for the backend.
+
+Prisma was the first ORM we used. But in order to allow users to create custom fields and custom objects, a lower-level made more sense as we need to have fine-grained control. The project now uses TypeORM.
+
+Here's what the tech stack now looks like.
+
+**Core**
+
+* [NestJS](https://nestjs.com/)
+* [TypeORM](https://typeorm.io/)
+* [GraphQL Yoga](https://the-guild.dev/graphql/yoga-server)
+
+**Database**
+
+* [Postgres](https://www.postgresql.org/)
+
+**Third-party integrations**
+
+* [Sentry](https://sentry.io/welcome/) for tracking bugs
+
+**Testing**
+
+* [Jest](https://jestjs.io/)
+
+**Tooling**
+
+* [Yarn](https://yarnpkg.com/)
+* [ESLint](https://eslint.org/)
+
+**Development**
+
+* [AWS EKS](https://aws.amazon.com/eks/)
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/zapier.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/zapier.mdx
new file mode 100644
index 0000000000..46bcd563fc
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/zapier.mdx
@@ -0,0 +1,83 @@
+---
+title: Zapier App
+---
+
+Effortlessly sync Twenty with 3000+ apps using [Zapier](https://zapier.com/). Automate tasks, boost productivity, and supercharge your customer relationships!
+
+## About Zapier
+
+Zapier is a tool that allows you to automate workflows by connecting the apps that your team uses every day. The fundamental concept of Zapier is automation workflows, called Zaps, and include triggers and actions.
+
+You can learn more about how Zapier works [here](https://zapier.com/how-it-works).
+
+## Setup
+
+### Step 1: Install Zapier packages
+
+```bash
+cd packages/twenty-zapier
+
+yarn
+```
+
+### Step 2: Login with the CLI
+
+Use your Zapier credentials to log in using the CLI:
+
+```bash
+zapier login
+```
+
+### Step 3: Set environment variables
+
+From the `packages/twenty-zapier` folder, run:
+
+```bash
+cp .env.example .env
+```
+
+Run the application locally, go to [http://localhost:3000/settings/api-webhooks](http://localhost:3000/settings/api-webhooks), and generate an API key.
+
+Replace the **YOUR_API_KEY** value in the `.env` file with the API key you just generated.
+
+## Development
+
+
+ Make sure to run `yarn build` before any `zapier` command.
+
+
+### Test
+
+```bash
+yarn test
+```
+
+### Lint
+
+```bash
+yarn format
+```
+
+### Watch and compile as you edit code
+
+```bash
+yarn watch
+```
+
+### Validate your Zapier app
+
+```bash
+yarn validate
+```
+
+### Deploy your Zapier app
+
+```bash
+yarn deploy
+```
+
+### List all Zapier CLI commands
+
+```bash
+zapier
+```
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/bug-and-requests.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/bug-and-requests.mdx
new file mode 100644
index 0000000000..4db64b703d
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/bug-and-requests.mdx
@@ -0,0 +1,78 @@
+---
+title: Bugs, Requests & Pull Requests
+info: Report issues, request features, and contribute code
+---
+
+## Reporting Bugs
+
+To report a bug, please [create an issue on GitHub](https://github.com/twentyhq/twenty/issues/new).
+
+You can also ask for help on [Discord](https://discord.gg/cx5n4Jzs57).
+
+## Feature Requests
+
+If you're not sure if it's a bug, and you feel it's closer to a feature request, then you should probably [open a discussion instead](https://github.com/twentyhq/twenty/discussions/new).
+
+## Submit a Pull Request
+
+Contributing code to Twenty starts with a pull request (PR).
+
+### Before You Start
+
+1. Check [existing issues](https://github.com/twentyhq/twenty/issues) for related work
+2. For new features, open an issue first to discuss
+3. Review our [Code of Conduct](https://github.com/twentyhq/twenty/blob/main/CODE_OF_CONDUCT.md)
+
+### Fork and Clone
+
+1. Fork the repository on GitHub
+2. Clone your fork:
+
+```bash
+git clone https://github.com/YOUR_USERNAME/twenty.git
+cd twenty
+```
+
+3. Add upstream remote:
+
+```bash
+git remote add upstream https://github.com/twentyhq/twenty.git
+```
+
+### Create a Branch
+
+```bash
+git checkout -b feature/your-feature-name
+```
+
+Use descriptive branch names:
+
+* `feature/add-export-button`
+* `fix/login-redirect-issue`
+* `docs/update-api-guide`
+
+### Make Your Changes
+
+1. Write clean, well-documented code
+2. Follow existing code style
+3. Add tests for new functionality
+4. Update documentation if needed
+
+### Submit Your PR
+
+1. Push your branch:
+
+```bash
+git push origin feature/your-feature-name
+```
+
+2. Open a PR on GitHub
+3. Fill in the PR template
+4. Link related issues
+
+### PR Checklist
+
+* [ ] Code follows project style guidelines
+* [ ] Tests pass locally
+* [ ] Documentation is updated
+* [ ] PR description explains the changes
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/best-practices-front.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
new file mode 100644
index 0000000000..187c2d848c
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
@@ -0,0 +1,325 @@
+---
+title: Best Practices
+---
+
+This document outlines the best practices you should follow when working on the frontend.
+
+## State management
+
+React and Recoil handle state management in the codebase.
+
+### Use `useRecoilState` to store state
+
+It's good practice to create as many atoms as you need to store your state.
+
+
+ It's better to use extra atoms than trying to be too concise with props drilling.
+
+
+```tsx
+export const myAtomState = atom({
+ key: 'myAtomState',
+ default: 'default value',
+});
+
+export const MyComponent = () => {
+ const [myAtom, setMyAtom] = useRecoilState(myAtomState);
+
+ return (
+
+ setMyAtom(e.target.value)}
+ />
+
+ );
+}
+```
+
+### Do not use `useRef` to store state
+
+Avoid using `useRef` to store state.
+
+If you want to store state, you should use `useState` or `useRecoilState`.
+
+See [how to manage re-renders](#managing-re-renders) if you feel like you need `useRef` to prevent some re-renders from happening.
+
+## Managing re-renders
+
+Re-renders can be hard to manage in React.
+
+Here are some rules to follow to avoid unnecessary re-renders.
+
+Keep in mind that you can **always** avoid re-renders by understanding their cause.
+
+### Work at the root level
+
+Avoiding re-renders in new features is now made easy by eliminating them at the root level.
+
+The `PageChangeEffect` sidecar component contains just one `useEffect` that holds all the logic to execute on a page change.
+
+That way you know that there's just one place that can trigger a re-render.
+
+### Always think twice before adding `useEffect` in your codebase
+
+Re-renders are often caused by unnecessary `useEffect`.
+
+You should think whether you need `useEffect`, or if you can move the logic in a event handler function.
+
+You'll find it generally easy to move the logic in a `handleClick` or `handleChange` function.
+
+You can also find them in libraries like Apollo: `onCompleted`, `onError`, etc.
+
+### Use a sibling component to extract `useEffect` or data fetching logic
+
+If you feel like you need to add a `useEffect` in your root component, you should consider extracting it in a sidecar component.
+
+You can apply the same for data fetching logic, with Apollo hooks.
+
+```tsx
+// ❌ Bad, will cause re-renders even if data is not changing,
+// because useEffect needs to be re-evaluated
+export const PageComponent = () => {
+ const [data, setData] = useRecoilState(dataState);
+ const [someDependency] = useRecoilState(someDependencyState);
+
+ useEffect(() => {
+ if(someDependency !== data) {
+ setData(someDependency);
+ }
+ }, [someDependency]);
+
+ return {data}
;
+};
+
+export const App = () => (
+
+
+
+);
+```
+
+```tsx
+// ✅ Good, will not cause re-renders if data is not changing,
+// because useEffect is re-evaluated in another sibling component
+export const PageComponent = () => {
+ const [data, setData] = useRecoilState(dataState);
+
+ return {data}
;
+};
+
+export const PageData = () => {
+ const [data, setData] = useRecoilState(dataState);
+ const [someDependency] = useRecoilState(someDependencyState);
+
+ useEffect(() => {
+ if(someDependency !== data) {
+ setData(someDependency);
+ }
+ }, [someDependency]);
+
+ return <>>;
+};
+
+export const App = () => (
+
+
+
+
+);
+```
+
+### Use recoil family states and recoil family selectors
+
+Recoil family states and selectors are a great way to avoid re-renders.
+
+They are useful when you need to store a list of items.
+
+### You shouldn't use `React.memo(MyComponent)`
+
+Avoid using `React.memo()` because it does not solve the cause of the re-render, but instead breaks the re-render chain, which can lead to unexpected behavior and make the code very hard to refactor.
+
+### Limit `useCallback` or `useMemo` usage
+
+They are often not necessary and will make the code harder to read and maintain for a gain of performance that is unnoticeable.
+
+## Console.logs
+
+`console.log` statements are valuable during development, offering real-time insights into variable values and code flow. But, leaving them in production code can lead to several issues:
+
+1. **Performance**: Excessive logging can affect the runtime performance, especially on client-side applications.
+
+2. **Security**: Logging sensitive data can expose critical information to anyone who inspects the browser's console.
+
+3. **Cleanliness**: Filling up the console with logs can obscure important warnings or errors that developers or tools need to see.
+
+4. **Professionalism**: End users or clients checking the console and seeing a myriad of log statements might question the code's quality and polish.
+
+Make sure you remove all `console.logs` before pushing the code to production.
+
+## Naming
+
+### Variable Naming
+
+Variable names ought to precisely depict the purpose or function of the variable.
+
+#### The issue with generic names
+
+Generic names in programming are not ideal because they lack specificity, leading to ambiguity and reduced code readability. Such names fail to convey the variable or function's purpose, making it challenging for developers to understand the code's intent without deeper investigation. This can result in increased debugging time, higher susceptibility to errors, and difficulties in maintenance and collaboration. Meanwhile, descriptive naming makes the code self-explanatory and easier to navigate, enhancing code quality and developer productivity.
+
+```tsx
+// ❌ Bad, uses a generic name that doesn't communicate its
+// purpose or content clearly
+const [value, setValue] = useState('');
+```
+
+```tsx
+// ✅ Good, uses a descriptive name
+const [email, setEmail] = useState('');
+```
+
+#### Some words to avoid in variable names
+
+* dummy
+
+### Event handlers
+
+Event handler names should start with `handle`, while `on` is a prefix used to name events in components props.
+
+```tsx
+// ❌ Bad
+const onEmailChange = (val: string) => {
+ // ...
+};
+```
+
+```tsx
+// ✅ Good
+const handleEmailChange = (val: string) => {
+ // ...
+};
+```
+
+## Optional Props
+
+Avoid passing the default value for an optional prop.
+
+**EXAMPLE**
+
+Take the`EmailField` component defined below:
+
+```tsx
+type EmailFieldProps = {
+ value: string;
+ disabled?: boolean;
+};
+
+const EmailField = ({ value, disabled = false }: EmailFieldProps) => (
+
+);
+```
+
+**Usage**
+
+```tsx
+// ❌ Bad, passing in the same value as the default value adds no value
+const Form = () => ;
+```
+
+```tsx
+// ✅ Good, assumes the default value
+const Form = () => ;
+```
+
+## Component as props
+
+Try as much as possible to pass uninstantiated components as props, so children can decide on their own of what props they need to pass.
+
+The most common example for that is icon components:
+
+```tsx
+const SomeParentComponent = () => ;
+
+// In MyComponent
+const MyComponent = ({ MyIcon }: { MyIcon: IconComponent }) => {
+ const theme = useTheme();
+
+ return (
+
+
+
+ )
+};
+```
+
+For React to understand that the component is a component, you need to use PascalCase, to later instantiate it with ``
+
+## Prop Drilling: Keep It Minimal
+
+Prop drilling, in the React context, refers to the practice of passing state variables and their setters through many component layers, even if intermediary components don't use them. While sometimes necessary, excessive prop drilling can lead to:
+
+1. **Decreased Readability**: Tracing where a prop originates or where it's utilized can become convoluted in a deeply nested component structure.
+
+2. **Maintenance Challenges**: Changes in one component's prop structure might require adjustments in several components, even if they don't directly use the prop.
+
+3. **Reduced Component Reusability**: A component receiving a lot of props solely for passing them down becomes less general-purpose and harder to reuse in different contexts.
+
+If you feel that you are using excessive prop drilling, see [state management best practices](#state-management).
+
+## Imports
+
+When importing, opt for the designated aliases rather than specifying complete or relative paths.
+
+**The Aliases**
+
+```js
+{
+ alias: {
+ "~": path.resolve(__dirname, "src"),
+ "@": path.resolve(__dirname, "src/modules"),
+ "@testing": path.resolve(__dirname, "src/testing"),
+ },
+}
+```
+
+**Usage**
+
+```tsx
+// ❌ Bad, specifies the entire relative path
+import {
+ CatalogDecorator
+} from '../../../../../testing/decorators/CatalogDecorator';
+import {
+ ComponentDecorator
+} from '../../../../../testing/decorators/ComponentDecorator';
+```
+
+```tsx
+// ✅ Good, utilises the designated aliases
+import { CatalogDecorator } from '~/testing/decorators/CatalogDecorator';
+import { ComponentDecorator } from 'twenty-ui/testing';
+```
+
+## Schema Validation
+
+[Zod](https://github.com/colinhacks/zod) is the schema validator for untyped objects:
+
+```js
+const validationSchema = z
+ .object({
+ exist: z.boolean(),
+ email: z
+ .string()
+ .email('Email must be a valid email'),
+ password: z
+ .string()
+ .regex(PASSWORD_REGEX, 'Password must contain at least 8 characters'),
+ })
+ .required();
+
+type Form = z.infer;
+```
+
+## Breaking Changes
+
+Always perform thorough manual testing before proceeding to guarantee that modifications haven’t caused disruptions elsewhere, given that tests have not yet been extensively integrated.
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
index fe85b7b819..064ac5c256 100644
--- a/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
@@ -1,11 +1,11 @@
---
-title: 폴더 아키텍처
-info: 우리의 폴더 아키텍처를 자세히 살펴보기
+title: Folder Architecture
+info: A detailed look into our folder architecture
---
-이 가이드에서는 프로젝트 디렉토리 구조의 세부 사항과 그것이 Twenty의 구조화와 유지관리성에 어떻게 기여하는지 살펴봅니다.
+In this guide, you will explore the details of the project directory structure and how it contributes to the organization and maintainability of Twenty.
-이 폴더 아키텍처 관례를 따르면 특정 기능과 관련된 파일을 더 쉽게 찾을 수 있고, 애플리케이션의 확장성과 유지관리성을 보장하기가 쉬워집니다.
+By following this folder architecture convention, it's easier to find the files related to specific features and ensure that the application is scalable and maintainable.
```
front
@@ -22,14 +22,14 @@ front
└───...
```
-## 페이지
+## Pages
-애플리케이션 라우트로 정의된 최상위 컴포넌트를 포함합니다. 모듈 폴더에서 더 하위 수준의 컴포넌트를 가져옵니다(자세한 내용은 아래를 참조하세요).
+Includes the top-level components defined by the application routes. They import more low-level components from the modules folder (more details below).
-## 모듈
+## Modules
-각 모듈은 특정 컴포넌트, 상태 및 운영 로직을 포함하는 기능 또는 기능 그룹을 나타냅니다.
-모두 아래 구조를 따라야 합니다. 모듈 안에 모듈을 중첩할 수 있으며(이를 서브모듈이라고 하며), 동일한 규칙이 적용됩니다.
+Each module represents a feature or a group of feature, comprising its specific components, states, and operational logic.
+They should all follow the structure below. You can nest modules within modules (referred to as submodules) and the same rules will apply.
```
module1
@@ -50,60 +50,60 @@ module1
└───utils
```
-### 컨텍스트
+### Contexts
-컨텍스트는 각 레벨에서 수동으로 props를 전달하지 않고, 컴포넌트 트리를 통해 데이터를 전달할 수 있는 방법입니다.
+A context is a way to pass data through the component tree without having to pass props down manually at every level.
-자세한 내용은 [React Context](https://react.dev/reference/react#context-hooks)를 참조하세요.
+See [React Context](https://react.dev/reference/react#context-hooks) for more details.
### GraphQL
-프래그먼트, 쿼리 및 뮤테이션이 포함됩니다.
+Includes fragments, queries, and mutations.
-자세한 내용은 [GraphQL](https://graphql.org/learn/)을 참조하세요.
+See [GraphQL](https://graphql.org/learn/) for more details.
-* 프래그먼트
+* Fragments
-프래그먼트는 쿼리의 재사용 가능한 조각으로, 여러 장소에서 사용할 수 있습니다. 프래그먼트를 사용하면 코드 중복을 피하기가 더 쉬워집니다.
+A fragment is a reusable piece of a query, which you can use in different places. By using fragments, it's easier to avoid duplicating code.
-자세한 내용은 [GraphQL 프래그먼트](https://graphql.org/learn/queries/#fragments)를 참조하세요.
+See [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) for more details.
-* 쿼리
+* Queries
-자세한 내용은 [GraphQL 쿼리](https://graphql.org/learn/queries/)를 참조하세요.
+See [GraphQL Queries](https://graphql.org/learn/queries/) for more details.
-* 뮤테이션
+* Mutations
-자세한 내용은 [GraphQL 뮤테이션](https://graphql.org/learn/queries/#mutations)을 참조하세요.
+See [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) for more details.
-### 훅
+### Hooks
-자세한 내용은 [훅](https://react.dev/learn/reusing-logic-with-custom-hooks)을 참조하세요.
+See [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) for more details.
-### 상태
+### States
-상태 관리 로직이 포함되어 있습니다. [RecoilJS](https://recoiljs.org)가 이것을 처리합니다.
+Contains the state management logic. [RecoilJS](https://recoiljs.org) handles this.
-* 셀렉터: 자세한 내용은 [RecoilJS 셀렉터](https://recoiljs.org/docs/basic-tutorial/selectors)를 참조하세요.
+* Selectors: See [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) for more details.
-React의 내장 상태 관리는 구성 요소 내에서의 상태를 여전히 처리합니다.
+React's built-in state management still handles state within a component.
-### 유틸
+### Utils
-재사용 가능한 순수 함수를 포함해야 합니다. 그렇지 않으면 `hooks` 폴더에 커스텀 훅을 만들어야 합니다.
+Should just contain reusable pure functions. Otherwise, create custom hooks in the `hooks` folder.
## UI
-애플리케이션에서 사용되는 모든 재사용 가능한 UI 컴포넌트를 포함합니다.
+Contains all the reusable UI components used in the application.
-이 폴더는 `data`, `display`, `feedback`, `input`과 같은 특정 유형의 컴포넌트에 대한 하위 폴더를 포함할 수 있습니다. 각 컴포넌트는 자기 완결적이고 재사용 가능해야 하며, 애플리케이션의 다른 부분에서 사용할 수 있어야 합니다.
+This folder can contain sub-folders, like `data`, `display`, `feedback`, and `input` for specific types of components. Each component should be self-contained and reusable, so that you can use it in different parts of the application.
-`modules` 폴더의 다른 컴포넌트에서 UI 컴포넌트를 분리함으로써 일관된 디자인을 유지하고, 코드베이스의 다른 부분(비즈니스 로직)에 영향을 주지 않고 UI를 변경하기가 더 쉬워집니다.
+By separating the UI components from the other components in the `modules` folder, it's easier to maintain a consistent design and to make changes to the UI without affecting other parts (business logic) of the codebase.
-## 인터페이스 및 종속성
+## Interface and dependencies
-`ui` 폴더를 제외한 모든 모듈에서 다른 모듈 코드를 가져올 수 있습니다. 이렇게 하면 코드를 쉽게 테스트할 수 있습니다.
+You can import other module code from any module except for the `ui` folder. This will keep its code easy to test.
-### 내부
+### Internal
-각 부분(훅, 상태, ...) 모듈의 각 부분은 모듈 내에서만 사용하는 `internal` 폴더를 가질 수 있습니다.
+Each part (hooks, states, ...) of a module can have an `internal` folder, which contains parts that are just used within the module.
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
index ed68230820..6fb00a65af 100644
--- a/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -1,54 +1,54 @@
---
-title: 프론트엔드 명령어
+title: Frontend Commands
---
-## 유용한 명령어
+## Useful commands
-### 앱 시작하기
+### Starting the app
```bash
npx nx start twenty-front
```
-### API GraphQL 스키마를 기반으로 GraphQL 스키마 재생성
+### Regenerate graphql schema based on API graphql schema
```bash
npx nx run twenty-front:graphql:generate --configuration=metadata
```
-또는
+OR
```bash
npx nx run twenty-front:graphql:generate
```
-### 린트
+### Lint
```bash
-npx nx run twenty-front:lint # lint 오류를 수정하려면 --fix 전달
+npx nx run twenty-front:lint # pass --fix to fix lint errors
```
-## 번역
+## Translations
```bash
npx nx run twenty-front:lingui:extract
npx nx run twenty-front:lingui:compile
```
-### 테스트
+### Test
```bash
-npx nx run twenty-front:test # jest 테스트 실행
-npx nx run twenty-front:storybook:serve:dev # storybook 실행
-npx nx run twenty-front:storybook:test # 테스트 실행 # (yarn storybook:serve:dev 실행 필요)
-npx nx run twenty-front:storybook:coverage # (yarn storybook:serve:dev 실행 필요)
+npx nx run twenty-front:test # run jest tests
+npx nx run twenty-front:storybook:serve:dev # run storybook
+npx nx run twenty-front:storybook:test # run tests # (needs yarn storybook:serve:dev to be running)
+npx nx run twenty-front:storybook:coverage # (needs yarn storybook:serve:dev to be running)
```
-## 기술 스택
+## Tech Stack
-프로젝트는 최소한의 보일러플레이트 코드로 깔끔하고 단순한 스택을 가지고 있습니다.
+The project has a clean and simple stack, with minimal boilerplate code.
-**앱**
+**App**
* [React](https://react.dev/)
* [Apollo](https://www.apollographql.com/docs/)
@@ -56,35 +56,35 @@ npx nx run twenty-front:storybook:coverage # (yarn storybook:serve:dev 실행
* [Recoil](https://recoiljs.org/docs/introduction/core-concepts)
* [TypeScript](https://www.typescriptlang.org/)
-**테스트**
+**Testing**
* [Jest](https://jestjs.io/)
* [Storybook](https://storybook.js.org/)
-**도구**
+**Tooling**
* [Yarn](https://yarnpkg.com/)
* [Craco](https://craco.js.org/docs/)
* [ESLint](https://eslint.org/)
-## 아키텍처
+## Architecture
-### 라우팅
+### Routing
-[React Router](https://reactrouter.com/)가 라우팅을 처리합니다.
+[React Router](https://reactrouter.com/) handles the routing.
-불필요한 [재렌더링](/l/ko/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders)을 피하기 위해 모든 라우팅 로직은 `PageChangeEffect`의 `useEffect`에 있습니다.
+To avoid unnecessary [re-renders](/l/ko/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) all the routing logic is in a `useEffect` in `PageChangeEffect`.
-### 상태 관리
+### State Management
-[Recoil](https://recoiljs.org/docs/introduction/core-concepts)이 상태 관리를 처리합니다.
+[Recoil](https://recoiljs.org/docs/introduction/core-concepts) handles state management.
-상태 관리에 대한 자세한 정보는 [최고의 관례](/l/ko/developers/contribute/capabilities/frontend-development/best-practices-front#state-management)를 참조하십시오.
+See [best practices](/l/ko/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) for more information on state management.
-## 테스트
+## Testing
-[Jest](https://jestjs.io/)는 유닛 테스트 도구로 사용되고 [Storybook](https://storybook.js.org/)은 컴포넌트 테스트에 사용됩니다.
+[Jest](https://jestjs.io/) serves as the tool for unit testing while [Storybook](https://storybook.js.org/) is for component testing.
-Jest는 주로 유틸리티 함수 테스트에 사용되며, 직접 컴포넌트를 테스트하지는 않습니다.
+Jest is mainly for testing utility functions, and not components themselves.
-Storybook은 개별 컴포넌트의 동작을 테스트하고 디자인 시스템을 표시하는 데 사용됩니다.
+Storybook is for testing the behavior of isolated components, as well as displaying the design system.
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/hotkeys.mdx
new file mode 100644
index 0000000000..43cde50e63
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -0,0 +1,178 @@
+---
+title: Hotkeys
+---
+
+## Introduction
+
+When you need to listen to a hotkey, you would normally use the `onKeyDown` event listener.
+
+In `twenty-front` however, you might have conflicts between same hotkeys that are used in different components, mounted at the same time.
+
+For example, if you have a page that listens for the Enter key, and a modal that listens for the Enter key, with a Select component inside that modal that listens for the Enter key, you might have a conflict when all are mounted at the same time.
+
+## The `useScopedHotkeys` hook
+
+To handle this problem, we have a custom hook that makes it possible to listen to hotkeys without any conflict.
+
+You place it in a component, and it will listen to the hotkeys only when the component is mounted AND when the specified **hotkey scope** is active.
+
+## How to listen for hotkeys in practice?
+
+There are two steps involved in setting up hotkey listening :
+
+1. Set the [hotkey scope](#what-is-a-hotkey-scope-) that will listen to hotkeys
+2. Use the `useScopedHotkeys` hook to listen to hotkeys
+
+Setting up hotkey scopes is required even in simple pages, because other UI elements like left menu or command menu might also listen to hotkeys.
+
+## Use cases for hotkeys
+
+In general, you'll have two use cases that require hotkeys :
+
+1. In a page or a component mounted in a page
+2. In a modal-type component that takes the focus due to a user action
+
+The second use case can happen recursively : a dropdown in a modal for example.
+
+### Listening to hotkeys in a page
+
+Example :
+
+```tsx
+const PageListeningEnter = () => {
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ // 1. Set the hotkey scope in a useEffect
+ useEffect(() => {
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ // Revert to the previous hotkey scope when the component is unmounted
+ return () => {
+ goBackToPreviousHotkeyScope();
+ };
+ }, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
+
+ // 2. Use the useScopedHotkeys hook
+ useScopedHotkeys(
+ Key.Enter,
+ () => {
+ // Some logic executed on this page when the user presses Enter
+ // ...
+ },
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ return My page that listens for Enter
;
+};
+```
+
+### Listening to hotkeys in a modal-type component
+
+For this example we'll use a modal component that listens for the Escape key to tell its parent to close it.
+
+Here the user interaction is changing the scope.
+
+```tsx
+const ExamplePageWithModal = () => {
+ const [showModal, setShowModal] = useState(false);
+
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ const handleOpenModalClick = () => {
+ // 1. Set the hotkey scope when user opens the modal
+ setShowModal(true);
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleModal,
+ );
+ };
+
+ const handleModalClose = () => {
+ // 1. Revert to the previous hotkey scope when the modal is closed
+ setShowModal(false);
+ goBackToPreviousHotkeyScope();
+ };
+
+ return
+
My page with a modal
+ Open modal
+ {showModal && }
+ ;
+};
+```
+
+Then in the modal component :
+
+```tsx
+const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
+ // 2. Use the useScopedHotkeys hook to listen for Escape.
+ // Note that escape is a common hotkey that could be used by many other components
+ // So it's important to use a hotkey scope to avoid conflicts
+ useScopedHotkeys(
+ Key.Escape,
+ () => {
+ onClose()
+ },
+ ExampleHotkeyScopes.ExampleModal,
+ );
+
+ return My modal component
;
+};
+```
+
+It's important to use this pattern when you're not sure that just using a useEffect with mount/unmount will be enough to avoid conflicts.
+
+Those conflicts can be hard to debug, and it might happen more often than not with useEffects.
+
+## What is a hotkey scope?
+
+A hotkey scope is a string that represents a context in which the hotkeys are active. It is generally encoded as an enum.
+
+When you change the hotkey scope, the hotkeys that are listening to this scope will be enabled and the hotkeys that are listening to other scopes will be disabled.
+
+You can set only one scope at a time.
+
+As an example, the hotkey scopes for each page are defined in the `PageHotkeyScope` enum:
+
+```tsx
+export enum PageHotkeyScope {
+ Settings = 'settings',
+ CreateWorkspace = 'create-workspace',
+ SignInUp = 'sign-in-up',
+ CreateProfile = 'create-profile',
+ PlanRequired = 'plan-required',
+ ShowPage = 'show-page',
+ PersonShowPage = 'person-show-page',
+ CompanyShowPage = 'company-show-page',
+ CompaniesPage = 'companies-page',
+ PeoplePage = 'people-page',
+ OpportunitiesPage = 'opportunities-page',
+ ProfilePage = 'profile-page',
+ WorkspaceMemberPage = 'workspace-member-page',
+ TaskPage = 'task-page',
+}
+```
+
+Internally, the currently selected scope is stored in a Recoil state that is shared across the application :
+
+```tsx
+export const currentHotkeyScopeState = createState({
+ key: 'currentHotkeyScopeState',
+ defaultValue: INITIAL_HOTKEYS_SCOPE,
+});
+```
+
+But this Recoil state should never be handled manually ! We'll see how to use it in the next section.
+
+## How is it working internally?
+
+We made a thin wrapper on top of [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) that makes it more performant and avoids unnecessary re-renders.
+
+We also create a Recoil state to handle the hotkey scope state and make it available everywhere in the application.
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/storybook.mdx
new file mode 100644
index 0000000000..5c7f5fa52a
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -0,0 +1,8 @@
+---
+title: Storybook
+description: Browse Twenty's UI component library
+---
+
+View our complete component library and documentation in Storybook.
+
+[Open Storybook →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/style-guide.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/style-guide.mdx
new file mode 100644
index 0000000000..e3ba4a44f0
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/style-guide.mdx
@@ -0,0 +1,290 @@
+---
+title: Style Guide
+---
+
+This document includes the rules to follow when writing code.
+
+The goal here is to have a consistent codebase, which is easy to read and easy to maintain.
+
+For this, it's better to be a bit more verbose than to be too concise.
+
+Always keep in mind that people read code more often than they write it, specially on an open source project, where anyone can contribute.
+
+There are a lot of rules that are not defined here, but that are automatically checked by linters.
+
+## React
+
+### Use functional components
+
+Always use TSX functional components.
+
+Do not use default `import` with `const`, because it's harder to read and harder to import with code completion.
+
+```tsx
+// ❌ Bad, harder to read, harder to import with code completion
+const MyComponent = () => {
+ return Hello World
;
+};
+
+export default MyComponent;
+
+// ✅ Good, easy to read, easy to import with code completion
+export function MyComponent() {
+ return Hello World
;
+};
+```
+
+### Props
+
+Create the type of the props and call it `(ComponentName)Props` if there's no need to export it.
+
+Use props destructuring.
+
+```tsx
+// ❌ Bad, no type
+export const MyComponent = (props) => Hello {props.name}
;
+
+// ✅ Good, type
+type MyComponentProps = {
+ name: string;
+};
+
+export const MyComponent = ({ name }: MyComponentProps) => Hello {name}
;
+```
+
+#### Refrain from using `React.FC` or `React.FunctionComponent` to define prop types
+
+```tsx
+/* ❌ - Bad, defines the component type annotations with `FC`
+ * - With `React.FC`, the component implicitly accepts a `children` prop
+ * even if it's not defined in the prop type. This might not always be
+ * desirable, especially if the component doesn't intend to render
+ * children.
+ */
+const EmailField: React.FC<{
+ value: string;
+}> = ({ value }) => ;
+```
+
+```tsx
+/* ✅ - Good, a separate type (OwnProps) is explicitly defined for the
+ * component's props
+ * - This method doesn't automatically include the children prop. If
+ * you want to include it, you have to specify it in OwnProps.
+ */
+type EmailFieldProps = {
+ value: string;
+};
+
+const EmailField = ({ value }: EmailFieldProps) => (
+
+);
+```
+
+#### No Single Variable Prop Spreading in JSX Elements
+
+Avoid using single variable prop spreading in JSX elements, like `{...props}`. This practice often results in code that is less readable and harder to maintain because it's unclear which props the component is receiving.
+
+```tsx
+/* ❌ - Bad, spreads a single variable prop into the underlying component
+ */
+const MyComponent = (props: OwnProps) => {
+ return ;
+}
+```
+
+```tsx
+/* ✅ - Good, Explicitly lists all props
+ * - Enhances readability and maintainability
+ */
+const MyComponent = ({ prop1, prop2, prop3 }: MyComponentProps) => {
+ return ;
+};
+```
+
+Rationale:
+
+* At a glance, it's clearer which props the code passes down, making it easier to understand and maintain.
+* It helps to prevent tight coupling between components via their props.
+* Linting tools make it easier to identify misspelled or unused props when you list props explicitly.
+
+## JavaScript
+
+### Use nullish-coalescing operator `??`
+
+```tsx
+// ❌ Bad, can return 'default' even if value is 0 or ''
+const value = process.env.MY_VALUE || 'default';
+
+// ✅ Good, will return 'default' only if value is null or undefined
+const value = process.env.MY_VALUE ?? 'default';
+```
+
+### Use optional chaining `?.`
+
+```tsx
+// ❌ Bad
+onClick && onClick();
+
+// ✅ Good
+onClick?.();
+```
+
+## TypeScript
+
+### Use `type` instead of `interface`
+
+Always use `type` instead of `interface`, because they almost always overlap, and `type` is more flexible.
+
+```tsx
+// ❌ Bad
+interface MyInterface {
+ name: string;
+}
+
+// ✅ Good
+type MyType = {
+ name: string;
+};
+```
+
+### Use string literals instead of enums
+
+[String literals](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types) are the go-to way to handle enum-like values in TypeScript. They are easier to extend with Pick and Omit, and offer a better developer experience, specially with code completion.
+
+You can see why TypeScript recommends avoiding enums [here](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
+
+```tsx
+// ❌ Bad, utilizes an enum
+enum Color {
+ Red = "red",
+ Green = "green",
+ Blue = "blue",
+}
+
+let color = Color.Red;
+```
+
+```tsx
+// ✅ Good, utilizes a string literal
+
+let color: "red" | "green" | "blue" = "red";
+```
+
+#### GraphQL and internal libraries
+
+You should use enums that GraphQL codegen generates.
+
+It's also better to use an enum when using an internal library, so the internal library doesn't have to expose a string literal type that is not related to the internal API.
+
+Example:
+
+```TSX
+const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+} = usePreviousHotkeyScope();
+
+setHotkeyScopeAndMemorizePreviousScope(
+ RelationPickerHotkeyScope.RelationPicker,
+);
+```
+
+## Styling
+
+### Use StyledComponents
+
+Style the components with [styled-components](https://emotion.sh/docs/styled).
+
+```tsx
+// ❌ Bad
+Hello World
+```
+
+```tsx
+// ✅ Good
+const StyledTitle = styled.div`
+ color: red;
+`;
+```
+
+Prefix styled components with "Styled" to differentiate them from "real" components.
+
+```tsx
+// ❌ Bad
+const Title = styled.div`
+ color: red;
+`;
+```
+
+```tsx
+// ✅ Good
+const StyledTitle = styled.div`
+ color: red;
+`;
+```
+
+### Theming
+
+Utilizing the theme for the majority of component styling is the preferred approach.
+
+#### Units of measurement
+
+Avoid using `px` or `rem` values directly within the styled components. The necessary values are generally already defined in the theme, so it’s recommended to make use of the theme for these purposes.
+
+#### Colors
+
+Refrain from introducing new colors; instead, use the existing palette from the theme. Should there be a situation where the palette does not align, please leave a comment so that the team can rectify it.
+
+```tsx
+// ❌ Bad, directly specifies style values without utilizing the theme
+const StyledButton = styled.button`
+ color: #333333;
+ font-size: 1rem;
+ font-weight: 400;
+ margin-left: 4px;
+ border-radius: 50px;
+`;
+```
+
+```tsx
+// ✅ Good, utilizes the theme
+const StyledButton = styled.button`
+ color: ${({ theme }) => theme.font.color.primary};
+ font-size: ${({ theme }) => theme.font.size.md};
+ font-weight: ${({ theme }) => theme.font.weight.regular};
+ margin-left: ${({ theme }) => theme.spacing(1)};
+ border-radius: ${({ theme }) => theme.border.rounded};
+`;
+```
+
+## Enforcing No-Type Imports
+
+Avoid type imports. To enforce this standard, an ESLint rule checks for and reports any type imports. This helps maintain consistency and readability in the TypeScript code.
+
+```tsx
+// ❌ Bad
+import { type Meta, type StoryObj } from '@storybook/react';
+
+// ❌ Bad
+import type { Meta, StoryObj } from '@storybook/react';
+
+// ✅ Good
+import { Meta, StoryObj } from '@storybook/react';
+```
+
+### Why No-Type Imports
+
+* **Consistency**: By avoiding type imports and using a single approach for both type and value imports, the codebase remains consistent in its module import style.
+
+* **Readability**: No-type imports improve code readability by making it clear when you're importing values or types. This reduces ambiguity and makes it easier to understand the purpose of imported symbols.
+
+* **Maintainability**: It enhances codebase maintainability because developers can identify and locate type-only imports when reviewing or modifying code.
+
+### ESLint Rule
+
+An ESLint rule, `@typescript-eslint/consistent-type-imports`, enforces the no-type import standard. This rule will generate errors or warnings for any type import violations.
+
+Please note that this rule specifically addresses rare edge cases where unintentional type imports occur. TypeScript itself discourages this practice, as mentioned in the [TypeScript 3.8 release notes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). In most situations, you should not need to use type-only imports.
+
+To ensure your code complies with this rule, make sure to run ESLint as part of your development workflow.
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/work-with-figma.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
index 7273c3f74c..6cffcc405e 100644
--- a/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
@@ -1,58 +1,59 @@
---
-title: Figma와 함께 작업하기
-info: Twenty의 Figma와 협업하는 방법을 배우기
+title: Work with Figma
+info: Learn how you can collaborate with Twenty's Figma
---
-Figma는 디자이너와 개발자 간의 소통 장벽을 허무는 협업 인터페이스 디자인 도구입니다.
-이 가이드는 Figma와 협업하는 방법을 설명합니다.
+Figma is a collaborative interface design tool that aids in bridging the communication barrier between designers and developers.
+This guide explains how you can collaborate with Figma.
-## 접근하기
+## Access
-1. **공유 링크에 접근:** 프로젝트의 Figma 파일에 [여기서](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty) 접근할 수 있습니다.
-2. **로그인:** 이미 로그인하지 않은 경우, Figma에서 로그인 하라는 요청을 받을 것입니다.
- 전문 모드 및 전용 프레임 선택 기능과 같이 로그인한 사용자에게만 제공되는 주요 기능이 있습니다.
+1. **Access the shared link:** You can access the project's Figma file [here](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty).
+2. **Sign in:** If you're not already signed in, Figma will prompt you to do so.
+ Key features are only available to logged-in users, such as the developer mode and the ability to select a dedicated frame.
- 계정 없이는 효과적으로 협업할 수 없습니다.
+ You will not be able to collaborate effectively without an account.
-## Figma 구조
+## Figma structure
-왼쪽 사이드바에서 Twenty의 Figma의 다양한 페이지에 접근할 수 있습니다. 이들은 이렇게 구성되어 있습니다:
+On the left sidebar, you can access the different pages of Twenty's Figma. This is how they're organized:
-* **구성 요소 페이지:** 첫 번째 페이지입니다. 디자이너는 디자인 파일 전반에 걸쳐 재사용 가능한 디자인 요소를 생성하고 조직하는 데 사용합니다. 예를 들어, 버튼, 아이콘, 심벌 또는 기타 재사용 가능한 구성 요소가 있습니다. 디자인 전체에서 일관성을 유지하는 역할을 합니다.
-* **메인 페이지:** 두 번째 페이지는 프로젝트의 완전한 사용자 인터페이스를 보여주는 메인 페이지입니다. 전체 앱 프로토타입을 사용하려면 ***재생*** 버튼을 누르세요.
-* **기능 페이지:** 다른 페이지는 일반적으로 진행중인 기능에 전용되어 있습니다. 이 페이지들은 애플리케이션이나 웹사이트의 특정 기능 또는 모듈의 디자인을 포함하고 있습니다. 일반적으로 아직 진행 중인 상태입니다.
+* **Components page:** This is the first page. The designer uses it to create and organize the reusable design elements used throughout the design file. For example, buttons, icons, symbols, or any other reusable components. It serves to maintain consistency across the design.
+* **Main page:** The second page is the main page, which shows the complete user interface of the project. You can press ***Play*** to use the full app prototype.
+* **Features pages:** The other pages are typically dedicated to features in progress. They contain the design of specific features or modules of the application or website. They are typically still in progress.
-## 유용한 팁
+## Useful Tips
-읽기 전용 접근 권한으로는 디자인을 편집할 수 없지만, 디자인을 코드로 변환하는 데 유용한 모든 기능에 접근할 수 있습니다.
+With read-only access, you can't edit the design, but you can access all features that will be useful to convert the designs into code.
-### 개발 모드 사용
+### Use the Dev mode
-Figma의 Dev Mode는 쉬운 디자인 탐색, 효과적인 자산 관리, 효율적인 통신 도구, 도구 상자 통합, 빠른 코드 스니펫, 주요 레이어 정보를 제공하여 디자이너와 개발자 간의 격차를 줄입니다. Dev Mode에 대해 더 알고 싶으시면 [여기](https://www.figma.com/dev-mode/)를 방문하세요.
+Figma's Dev Mode enhances developers' productivity by providing easy design navigation, effective asset management, efficient communication tools, toolbox integrations, quick code snippets, and key layer information, bridging the gap between design and development. You can learn more about Dev Mode [here](https://www.figma.com/dev-mode/).
-툴바의 오른쪽에서 "개발자" 모드로 전환하여 디자인 사양을 보고 CSS를 복사하고 자산에 접근하세요.
+Switch to the "Developer" mode in the right part of the toolbar to see design specs, copy CSS, and access assets.
-### 프로토타입 사용
+### Use the Prototype
-캔버스의 아무 요소나 클릭하고 인터페이스의 오른쪽 상단 모서리에 있는 "재생" 버튼을 눌러 프로토타입 보기에 접근하세요. 프로토타입 모드는 디자인을 최종 제품처럼 상호작용할 수 있게 합니다. 이를 통해 화면 간의 흐름과 버튼, 링크, 메뉴 등과 같은 인터페이스 요소가 상호작용할 때 어떻게 작동하는지 보여줍니다.
+Click on any element on the canvas and press the “Play” button at the top right edge of the interface to access the prototype view. Prototype mode allows you to interact with the design as if it were the final product. It demonstrates the flow between screens and how interface elements like buttons, links, or menus behave when interacted with.
-1. **전환 및 애니메이션 이해하기:** 프로토타입 모드에서는 디자이너가 화면 또는 UI 요소 간에 추가한 전환이나 애니메이션을 볼 수 있어 개발자에게 의도된 동작 및 스타일에 대한 명확한 시각적 지침을 제공합니다.
-2. **실행 명확화:** 프로토타입은 모호성을 줄이는 데 도움을 줄 수 있습니다. 개발자는 특정 요소의 기능이나 모양을 보다 잘 이해하기 위해 이를 상호작용할 수 있습니다.
+1. **Understanding transitions and animations:** In the Prototype mode, you can view any transitions or animations added by a designer between screens or UI elements, providing clear visual instructions to developers on the intended behavior and style.
+2. **Implementation clarification:** A prototype can also help reduce ambiguities. Developers can interact with it to gain a better understanding of the functionality or appearance of particular elements.
-Figma 플랫폼 학습에 대한 포괄적인 세부 정보와 지침을 얻으시려면 [공식 Figma 문서](https://help.figma.com/hc/en-us)를 방문하세요.
+For more comprehensive details and guidance on learning the Figma platform, you can visit the official [Figma Documentation](https://help.figma.com/hc/en-us).
-### 거리 측정
+### Measure distances
-요소를 선택하고 `Option` 키(Mac) 또는 `Alt` 키(Windows)를 누른 상태에서 다른 요소 위에 마우스를 올리면 요소 간 거리를 확인할 수 있습니다.
+Select an element, hold `Option` key (Mac) or `Alt` key (Windows), then hover over another element to see the distance between them.
-### VSCode용 Figma 확장 프로그램 (추천)
+### Figma extension for VSCode (Recommended)
-[VS Code용 Figma](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension) 확장 프로그램은 텍스트 편집기에서 벗어나지 않고 디자인 파일 탐색 및 점검, 디자이너와의 협업, 변경 사항 추적, 구현 속도 향상을 가능하게 합니다.
-추천하는 확장 프로그램의 일부입니다.
+[Figma for VS Code](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension)
+lets you navigate and inspect design files, collaborate with designers, track changes, and speed up implementation - all without leaving your text editor.
+It's part of our recommended extensions.
-## 협업
+## Collaboration
-1. **댓글 사용하기:** 툴바 왼쪽의 말풍선 아이콘을 클릭하여 댓글 기능을 사용할 수 있습니다.
-2. **커서 채팅:** Figma의 멋진 기능 중 하나는 커서 채팅입니다. Figma를 다른 누군가와 동시에 사용하는 것을 보면 `;` (Mac)이나 `/` (Windows) 키를 눌러 메시지를 보낼 수 있습니다.
+1. **Using Comments:** You are welcome to use the comment feature by clicking on the bubble icon in the left part of the toolbar.
+2. **Cursor chat:** A nice feature of Figma is the Cursor chat. Just press `;` on Mac and `/` on Windows to send a message if you see someone else using Figma as the same time as you.
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/local-setup.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/local-setup.mdx
new file mode 100644
index 0000000000..004b28dc4c
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/local-setup.mdx
@@ -0,0 +1,333 @@
+---
+title: Local Setup
+description: The guide for contributors (or curious developers) who want to run Twenty locally.
+---
+
+## Prerequisites
+
+
+
+ Before you can install and use Twenty, make sure you install the following on your computer:
+
+ * [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+ * [Node v24.5.0](https://nodejs.org/en/download)
+ * [yarn v4](https://yarnpkg.com/getting-started/install)
+ * [nvm](https://github.com/nvm-sh/nvm/blob/master/README.md)
+
+
+ `npm` won't work, you should use `yarn` instead. Yarn is now shipped with Node.js, so you don't need to install it separately.
+ You only have to run `corepack enable` to enable Yarn if you haven't done it yet.
+
+
+
+
+ 1. Install WSL
+ Open PowerShell as Administrator and run:
+
+ ```powershell
+ wsl --install
+ ```
+
+ You should now see a prompt to restart your computer. If not, restart it manually.
+
+ Upon restart, a powershell window will open and install Ubuntu. This may take up some time.
+ You'll see a prompt to create a username and password for your Ubuntu installation.
+
+ 2. Install and configure git
+
+ ```bash
+ sudo apt-get install git
+
+ git config --global user.name "Your Name"
+
+ git config --global user.email "youremail@domain.com"
+ ```
+
+ 3. Install nvm, node.js and yarn
+
+
+ Use `nvm` to install the correct `node` version. The `.nvmrc` ensures all contributors use the same version.
+
+
+ ```bash
+ sudo apt-get install curl
+
+ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
+ ```
+
+ Close and reopen your terminal to use nvm. Then run the following commands.
+
+ ```bash
+
+ nvm install # installs recommended node version
+
+ nvm use # use recommended node version
+
+ corepack enable
+ ```
+
+
+
+---
+
+## Step 1: Git Clone
+
+In your terminal, run the following command.
+
+
+
+ If you haven't already set up SSH keys, you can learn how to do so [here](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/about-ssh).
+
+ ```bash
+ git clone git@github.com:twentyhq/twenty.git
+ ```
+
+
+
+ ```bash
+ git clone https://github.com/twentyhq/twenty.git
+ ```
+
+
+
+## Step 2: Position yourself at the root
+
+```bash
+cd twenty
+```
+
+You should run all commands in the following steps from the root of the project.
+
+## Step 3: Set up a PostgreSQL Database
+
+
+
+ **Option 1 (preferred):** To provision your database locally:
+ Use the following link to install Postgresql on your Linux machine: [Postgresql Installation](https://www.postgresql.org/download/linux/)
+
+ ```bash
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ Note: You might need to add `sudo -u postgres` to the command before `psql` to avoid permission errors.
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+ **Option 1 (preferred):** To provision your database locally with `brew`:
+
+ ```bash
+ brew install postgresql@16
+ export PATH="/opt/homebrew/opt/postgresql@16/bin:$PATH"
+ brew services start postgresql@16
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ You can verify if the PostgreSQL server is running by executing:
+
+ ```bash
+ brew services list
+ ```
+
+ The installer might not create the `postgres` user by default when installing
+ via Homebrew on MacOS. Instead, it creates a PostgreSQL role that matches your macOS
+ username (e.g., "john").
+ To check and create the `postgres` user if necessary, follow these steps:
+
+ ```bash
+ # Connect to PostgreSQL
+ psql postgres
+ or
+ psql -U $(whoami) -d postgres
+ ```
+
+ Once at the psql prompt (postgres=#), run:
+
+ ```bash
+ # List existing PostgreSQL roles
+ \du
+ ```
+
+ You'll see output similar to:
+
+ ```bash
+ Role name | Attributes | Member of
+ -----------+-------------+-----------
+ john | Superuser | {}
+ ```
+
+ If you do not see a `postgres` role listed, proceed to the next step.
+ Create the `postgres` role manually:
+
+ ```bash
+ CREATE ROLE postgres WITH SUPERUSER LOGIN;
+ ```
+
+ This creates a superuser role named `postgres` with login access.
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+ All the following steps are to be run in the WSL terminal (within your virtual machine)
+
+ **Option 1:** To provision your Postgresql locally:
+ Use the following link to install Postgresql on your Linux virtual machine: [Postgresql Installation](https://www.postgresql.org/download/linux/)
+
+ ```bash
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ Note: You might need to add `sudo -u postgres` to the command before `psql` to avoid permission errors.
+
+ **Option 2:** If you have docker installed:
+ Running Docker on WSL adds an extra layer of complexity.
+ Only use this option if you are comfortable with the extra steps involved, including turning on [Docker Desktop WSL2](https://docs.docker.com/desktop/wsl).
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+You can now access the database at [localhost:5432](localhost:5432), with user `postgres` and password `postgres` .
+
+## Step 4: Set up a Redis Database (cache)
+
+Twenty requires a redis cache to provide the best performance
+
+
+
+ **Option 1:** To provision your Redis locally:
+ Use the following link to install Redis on your Linux machine: [Redis Installation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+ **Option 1 (preferred):** To provision your Redis locally with `brew`:
+
+ ```bash
+ brew install redis
+ ```
+
+ Start your redis server:
+ `brew services start redis`
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+ **Option 1:** To provision your Redis locally:
+ Use the following link to install Redis on your Linux virtual machine: [Redis Installation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+If you need a Client GUI, we recommend [redis insight](https://redis.io/insight/) (free version available)
+
+## Step 5: Setup environment variables
+
+Use environment variables or `.env` files to configure your project. More info [here](/l/ko/developers/self-host/capabilities/setup)
+
+Copy the `.env.example` files in `/front` and `/server`:
+
+```bash
+cp ./packages/twenty-front/.env.example ./packages/twenty-front/.env
+cp ./packages/twenty-server/.env.example ./packages/twenty-server/.env
+```
+
+
+ **Multi-Workspace Mode:** By default, Twenty runs in single-workspace mode where only one workspace can be created. To enable multi-workspace support (useful for testing subdomain-based features), set `IS_MULTIWORKSPACE_ENABLED=true` in your server `.env` file. See [Multi-Workspace Mode](/l/ko/developers/self-host/capabilities/setup#multi-workspace-mode) for details.
+
+
+## Step 6: Installing dependencies
+
+To build Twenty server and seed some data into your database, run the following command:
+
+```bash
+yarn
+```
+
+Note that `npm` or `pnpm` won't work
+
+## Step 7: Running the project
+
+
+
+ Depending on your Linux distribution, Redis server might be started automatically.
+ If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro.
+
+
+
+ Redis should already be running. If not, run:
+
+ ```bash
+ brew services start redis
+ ```
+
+
+
+ Depending on your Linux distribution, Redis server might be started automatically.
+ If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro.
+
+
+
+Set up your database with the following command:
+
+```bash
+npx nx database:reset twenty-server
+```
+
+Start the server, the worker and the frontend services:
+
+```bash
+npx nx start twenty-server
+npx nx worker twenty-server
+npx nx start twenty-front
+```
+
+Alternatively, you can start all services at once:
+
+```bash
+npx nx start
+```
+
+## Step 8: Use Twenty
+
+**Frontend**
+
+Twenty's frontend will be running at [http://localhost:3001](http://localhost:3001).
+You can log in using the default demo account: `tim@apple.dev` (password: `tim@apple.dev`)
+
+**Backend**
+
+* Twenty's server will be up and running at [http://localhost:3000](http://localhost:3000)
+* The GraphQL API can be accessed at [http://localhost:3000/graphql](http://localhost:3000/graphql)
+* The REST API can be reached at [http://localhost:3000/rest](http://localhost:3000/rest)
+
+## Troubleshooting
+
+If you encounter any problem, check [Troubleshooting](/l/ko/developers/self-host/capabilities/troubleshooting) for solutions.
diff --git a/packages/twenty-docs/l/ko/developers/contribute/contribute.mdx b/packages/twenty-docs/l/ko/developers/contribute/contribute.mdx
new file mode 100644
index 0000000000..9737c61b7c
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/contribute.mdx
@@ -0,0 +1,32 @@
+---
+title: Contribute
+description: Contribute to Twenty's open-source development.
+---
+
+
+
+
+
+## Overview
+
+Twenty is open-source and welcomes contributions from the community. Whether you're fixing bugs, adding features, or improving documentation, your contributions help make Twenty better for everyone.
+
+## Ways to Contribute
+
+* **Report bugs**: Help identify and document issues
+* **Submit features**: Propose and implement new functionality
+* **Improve documentation**: Make our docs clearer and more helpful
+* **Frontend development**: Work on the React-based UI
+* **Backend development**: Contribute to the NestJS server
+
+## Getting Started
+
+
+
+ Report issues or request features
+
+
+
+ Contribute to the UI
+
+
diff --git a/packages/twenty-docs/l/ko/developers/extend/capabilities/apis.mdx b/packages/twenty-docs/l/ko/developers/extend/capabilities/apis.mdx
new file mode 100644
index 0000000000..9ca53aae82
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/extend/capabilities/apis.mdx
@@ -0,0 +1,147 @@
+---
+title: APIs
+description: Query and modify your CRM data programmatically using REST or GraphQL.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Twenty was built to be developer-friendly, offering powerful APIs that adapt to your custom data model. We provide four distinct API types to meet different integration needs.
+
+## Developer-First Approach
+
+Twenty generates APIs specifically for your data model:
+
+* **No long IDs required**: Use your object and field names directly in endpoints
+* **Standard and custom objects treated equally**: Your custom objects get the same API treatment as built-in ones
+* **Dedicated endpoints**: Each object and field gets its own API endpoint
+* **Custom documentation**: Generated specifically for your workspace's data model
+
+
+ Your personalized API documentation is available under **Settings → API & Webhooks** after creating an API key. Since Twenty generates APIs that match your custom data model, the documentation is unique to your workspace.
+
+
+## The Two API Types
+
+### Core API
+
+Accessed on `/rest/` or `/graphql/`
+
+Work with your actual **records** (the data):
+
+* Create, read, update, delete People, Companies, Opportunities, etc.
+* Query and filter data
+* Manage record relationships
+
+### Metadata API
+
+Accessed on `/rest/metadata/` or `/metadata/`
+
+Manage your **workspace and data model**:
+
+* Create, modify, or delete objects and fields
+* Configure workspace settings
+* Define relationships between objects
+
+## REST vs GraphQL
+
+Both Core and Metadata APIs are available in REST and GraphQL formats:
+
+| Format | Available Operations |
+| ----------- | ---------------------------------------------------------- |
+| **REST** | CRUD, batch operations, upserts |
+| **GraphQL** | Same + **batch upserts**, relationship queries in one call |
+
+Choose based on your needs — both formats access the same data.
+
+## API Endpoints
+
+| Environment | Base URL |
+| --------------- | ------------------------- |
+| **Cloud** | `https://api.twenty.com/` |
+| **Self-Hosted** | `https://{your-domain}/` |
+
+## Authentication
+
+Every API request requires an API key in the header:
+
+```
+Authorization: Bearer YOUR_API_KEY
+```
+
+### Create an API Key
+
+1. Go to **Settings → APIs & Webhooks**
+2. Click **+ Create key**
+3. Configure:
+ * **Name**: Descriptive name for the key
+ * **Expiration Date**: When the key expires
+4. Click **Save**
+5. **Copy immediately** — the key is only shown once
+
+
+
+
+ Your API key grants access to sensitive data. Don't share it with untrusted services. If compromised, disable it immediately and generate a new one.
+
+
+### Assign a Role to an API Key
+
+For better security, assign a specific role to limit access:
+
+1. Go to **Settings → Roles**
+2. Click on the role to assign
+3. Open the **Assignment** tab
+4. Under **API Keys**, click **+ Assign to API key**
+5. Select the API key
+
+The key will inherit that role's permissions. See [Permissions](/l/ko/user-guide/permissions-access/capabilities/permissions) for details.
+
+### Manage API Keys
+
+**Regenerate**: Settings → APIs & Webhooks → Click key → **Regenerate**
+
+**Delete**: Settings → APIs & Webhooks → Click key → **Delete**
+
+## API Playground
+
+Test your APIs directly in the browser with our built-in playground — available for both **REST** and **GraphQL**.
+
+### Access the Playground
+
+1. Go to **Settings → APIs & Webhooks**
+2. Create an API key (required)
+3. Click on **REST API** or **GraphQL API** to open the playground
+
+### What You Get
+
+* **Interactive documentation**: Generated for your specific data model
+* **Live testing**: Execute real API calls against your workspace
+* **Schema explorer**: Browse available objects, fields, and relationships
+* **Request builder**: Construct queries with autocomplete
+
+The playground reflects your custom objects and fields, so documentation is always accurate for your workspace.
+
+## Batch Operations
+
+Both REST and GraphQL support batch operations:
+
+* **Batch size**: Up to 60 records per request
+* **Operations**: Create, update, delete multiple records
+
+**GraphQL-only features:**
+
+* **Batch Upsert**: Create or update in one call
+* Use plural object names (e.g., `CreateCompanies` instead of `CreateCompany`)
+
+## Rate Limits
+
+API requests are throttled to ensure platform stability:
+
+| Limit | Value |
+| -------------- | -------------------- |
+| **Requests** | 100 calls per minute |
+| **Batch size** | 60 records per call |
+
+
+ Use batch operations to maximize throughput — process up to 60 records in a single API call instead of making individual requests.
+
diff --git a/packages/twenty-docs/l/ko/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/ko/developers/extend/capabilities/apps.mdx
new file mode 100644
index 0000000000..dc528fa780
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/extend/capabilities/apps.mdx
@@ -0,0 +1,522 @@
+---
+title: Twenty Apps
+description: Build and manage Twenty customizations as code.
+---
+
+
+ Apps are currently in alpha testing. The feature is functional but still evolving.
+
+
+## What Are Apps?
+
+Apps let you build and manage Twenty customizations **as code**. Instead of configuring everything through the UI, you define your data model and serverless functions in code — making it faster to build, maintain, and roll out to multiple workspaces.
+
+**What you can do today:**
+
+* Define custom objects and fields as code (managed data model)
+* Build serverless functions with custom triggers
+* Deploy the same app across multiple workspaces
+
+**Coming soon:**
+
+* Custom UI layouts and components
+
+## Prerequisites
+
+* Node.js 24+ and Yarn 4
+* A Twenty workspace and an API key (create one at https://app.twenty.com/settings/api-webhooks)
+
+## Getting Started
+
+Create a new app using the official scaffolder, then authenticate and start developing:
+
+```bash filename="Terminal"
+# Scaffold a new app
+npx create-twenty-app@latest my-twenty-app
+cd my-twenty-app
+
+# Authenticate using your API key (you'll be prompted)
+yarn auth
+
+# Start dev mode: automatically syncs local changes to your workspace
+yarn dev
+```
+
+From here you can:
+
+```bash filename="Terminal"
+# Add a new entity to your application (guided)
+yarn create-entity
+
+# Generate a typed Twenty client and workspace entity types
+yarn generate
+
+# Run a one‑time sync (instead of watch mode)
+yarn sync
+
+# Watch your application's functions logs
+yarn logs
+
+# Uninstall the application from the current workspace
+yarn uninstall
+
+# Display commands' help
+yarn help
+```
+
+See also: the CLI reference pages for [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) and [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk).
+
+## Project structure (scaffolded)
+
+When you run `npx create-twenty-app@latest my-twenty-app`, the scaffolder:
+
+* Copies a minimal base application into `my-twenty-app/`
+* Adds a local `twenty-sdk` dependency and Yarn 4 configuration
+* Creates config files and scripts wired to the `twenty` CLI
+* Generates a default application config and a default function role
+
+A freshly scaffolded app looks like this:
+
+```text filename="my-twenty-app/"
+my-twenty-app/
+ package.json
+ yarn.lock
+ .gitignore
+ .nvmrc
+ .yarnrc.yml
+ .yarn/
+ releases/
+ yarn-4.9.2.cjs
+ install-state.gz
+ eslint.config.mjs
+ tsconfig.json
+ README.md
+ src/
+ application.config.ts
+ role.config.ts
+ // your entities, actions, and other app files
+```
+
+At a high level:
+
+* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall`, and `auth` that delegate to the local `twenty` CLI.
+* **.gitignore**: Ignores common artifacts such as `node_modules`, `.yarn`, `generated/` (typed client), `dist/`, `build/`, coverage folders, log files, and `.env*` files.
+* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Lock and configure the Yarn 4 toolchain used by the project.
+* **.nvmrc**: Pins the Node.js version expected by the project.
+* **eslint.config.mjs** and **tsconfig.json**: Provide linting and TypeScript configuration for your app’s TypeScript sources.
+* **README.md**: A short README in the app root with basic instructions.
+* **src/**: The main place where you define your application-as-code:
+ * `application.config.ts`: Global configuration for your app (metadata and runtime wiring). See “Application config” below.
+ * `role.config.ts`: Default function role used by your serverless functions. See “Default function role” below.
+ * Future entities, actions/functions, and any supporting code you add.
+
+Later commands will add more files and folders:
+
+* `yarn generate` will create a `generated/` folder (typed Twenty client + workspace types).
+* `yarn create-entity` will add entity definition files under `src/` for your custom objects.
+
+## Authentication
+
+The first time you run `yarn auth`, you'll be prompted for:
+
+* API URL (defaults to http://localhost:3000 or your current workspace profile)
+* API key
+
+Your credentials are stored per-user in `~/.twenty/config.json`. You can maintain multiple profiles and switch using `--workspace `.
+
+Examples:
+
+```bash filename="Terminal"
+# Login interactively (recommended)
+yarn auth
+
+# Use a specific workspace profile
+yarn auth --workspace my-custom-workspace
+```
+
+## Use the SDK resources (types & config)
+
+The twenty-sdk provides typed building blocks you use inside your app. Below are the key pieces you'll touch most often.
+
+### Defining objects
+
+Custom objects are regular TypeScript classes annotated with decorators from `twenty-sdk`. They live under `src/objects/` in your app and describe both schema and behavior for records in your workspace.
+
+Here is an example `postCard` object from the Hello World app:
+
+```typescript
+import { type Note } from '../../generated';
+
+import {
+ type AddressField,
+ Field,
+ FieldType,
+ type FullNameField,
+ Object,
+ OnDeleteAction,
+ Relation,
+ RelationType,
+ STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS,
+} from 'twenty-sdk';
+
+enum PostCardStatus {
+ DRAFT = 'DRAFT',
+ SENT = 'SENT',
+ DELIVERED = 'DELIVERED',
+ RETURNED = 'RETURNED',
+}
+
+@Object({
+ universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05',
+ nameSingular: 'postCard',
+ namePlural: 'postCards',
+ labelSingular: 'Post card',
+ labelPlural: 'Post cards',
+ description: ' A post card object',
+ icon: 'IconMail',
+})
+export class PostCard {
+ @Field({
+ universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b',
+ type: FieldType.TEXT,
+ label: 'Content',
+ description: "Postcard's content",
+ icon: 'IconAbc',
+ })
+ content: string;
+
+ @Field({
+ universalIdentifier: 'c6aa31f3-da76-4ac6-889f-475e226009ac',
+ type: FieldType.FULL_NAME,
+ label: 'Recipient name',
+ icon: 'IconUser',
+ })
+ recipientName: FullNameField;
+
+ @Field({
+ universalIdentifier: '95045777-a0ad-49ec-98f9-22f9fc0c8266',
+ type: FieldType.ADDRESS,
+ label: 'Recipient address',
+ icon: 'IconHome',
+ })
+ recipientAddress: AddressField;
+
+ @Field({
+ universalIdentifier: '87b675b8-dd8c-4448-b4ca-20e5a2234a1e',
+ type: FieldType.SELECT,
+ label: 'Status',
+ icon: 'IconSend',
+ defaultValue: `'${PostCardStatus.DRAFT}'`,
+ options: [
+ { value: PostCardStatus.DRAFT, label: 'Draft', position: 0, color: 'gray' },
+ { value: PostCardStatus.SENT, label: 'Sent', position: 1, color: 'orange' },
+ { value: PostCardStatus.DELIVERED, label: 'Delivered', position: 2, color: 'green' },
+ { value: PostCardStatus.RETURNED, label: 'Returned', position: 3, color: 'orange' },
+ ],
+ })
+ status: PostCardStatus;
+
+ @Relation({
+ universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe',
+ type: RelationType.ONE_TO_MANY,
+ label: 'Notes',
+ icon: 'IconComment',
+ inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note,
+ onDelete: OnDeleteAction.CASCADE,
+ })
+ notes: Note[];
+
+ @Field({
+ universalIdentifier: 'e06abe72-5b44-4e7f-93be-afc185a3c433',
+ type: FieldType.DATE_TIME,
+ label: 'Delivered at',
+ icon: 'IconCheck',
+ isNullable: true,
+ defaultValue: null,
+ })
+ deliveredAt?: Date;
+}
+```
+
+Key points:
+
+* The `@Object` decorator defines the object identity and labels used across the workspace; its `universalIdentifier` must be unique and stable across deployments.
+* Each `@Field` decorator defines a field on the object with a type, label, and its own stable `universalIdentifier`.
+* `@Relation` wires this object to other objects (standard or custom) and controls cascade behavior with `onDelete`.
+* You can scaffold new objects using `yarn create-entity`, which guides you through naming, fields, and relationships, then generates object files similar to the `postCard` example.
+
+### Application config (application.config.ts)
+
+Every app has a single `application.config.ts` file that describes:
+
+* **Who the app is**: identifiers, display name, and description.
+* **How its functions run**: which role they use for permissions.
+* **(Optional) variables**: key–value pairs exposed to your functions as environment variables.
+
+When you scaffold a new app, you start with a minimal config:
+
+```typescript
+import { type ApplicationConfig } from 'twenty-sdk';
+
+const config: ApplicationConfig = {
+ universalIdentifier: '',
+ displayName: 'My Twenty App',
+ description: 'My first Twenty app',
+ functionRoleUniversalIdentifier: '',
+};
+
+export default config;
+```
+
+You can gradually extend this file as your app grows. For example, you can add an icon and application-scoped variables:
+
+```typescript
+import { type ApplicationConfig } from 'twenty-sdk';
+
+const config: ApplicationConfig = {
+ universalIdentifier: '',
+ displayName: 'My App',
+ description: 'What your app does',
+ icon: 'IconWorld', // Choose an icon by name
+ applicationVariables: {
+ DEFAULT_RECIPIENT_NAME: {
+ universalIdentifier: '',
+ description: 'Default recipient used by functions',
+ value: 'Jane Doe',
+ isSecret: false,
+ },
+ },
+ functionRoleUniversalIdentifier: '',
+};
+
+export default config;
+```
+
+Notes:
+
+* `universalIdentifier` fields are deterministic IDs you own; generate them once and keep them stable across syncs.
+* `applicationVariables` become environment variables for your functions (for example, `DEFAULT_RECIPIENT_NAME` is available as `process.env.DEFAULT_RECIPIENT_NAME`).
+* `functionRoleUniversalIdentifier` must match the role you define in `role.config.ts` (see below).
+
+#### Roles and permissions
+
+Applications can define roles that encapsulate permissions on your workspace’s objects and actions. The field `functionRoleUniversalIdentifier` in `application.config.ts` designates the default role used by your app’s serverless functions.
+
+* The runtime API key injected as `TWENTY_API_KEY` is derived from this default function role.
+* The typed client will be restricted to the permissions granted to that role.
+* Follow least‑privilege: create a dedicated role with only the permissions your functions need, then reference its universal identifier.
+
+##### Default function role (role.config.ts)
+
+When you scaffold a new app, the CLI also creates `src/role.config.ts`. This file exports the default role your serverless functions will use at runtime:
+
+```typescript
+import { PermissionFlag, type RoleConfig } from 'twenty-sdk';
+
+export const functionRole: RoleConfig = {
+ universalIdentifier: '',
+ label: 'My Twenty App default function role',
+ description: 'My Twenty App default function role',
+ canReadAllObjectRecords: true,
+ canUpdateAllObjectRecords: true,
+ canSoftDeleteAllObjectRecords: true,
+ canDestroyAllObjectRecords: false,
+};
+```
+
+The `universalIdentifier` of this role is automatically wired into `application.config.ts` as `functionRoleUniversalIdentifier`. In other words:
+
+* **role.config.ts** defines what the default function role can do.
+* **application.config.ts** points to that role so your functions inherit its permissions.
+
+As you move beyond the initial scaffold, you should tighten this role and make it explicit about what it can access. A more production-ready role might look closer to:
+
+```typescript
+import { PermissionFlag, type RoleConfig } from 'twenty-sdk';
+
+export const functionRole: RoleConfig = {
+ universalIdentifier: '',
+ label: 'Default function role',
+ description: 'Default role for function Twenty client',
+ canReadAllObjectRecords: false,
+ canUpdateAllObjectRecords: false,
+ canSoftDeleteAllObjectRecords: false,
+ canDestroyAllObjectRecords: false,
+ canUpdateAllSettings: false,
+ canBeAssignedToAgents: false,
+ canBeAssignedToUsers: false,
+ canBeAssignedToApiKeys: false,
+ objectPermissions: [
+ {
+ objectNameSingular: 'postCard',
+ canReadObjectRecords: true,
+ canUpdateObjectRecords: true,
+ canSoftDeleteObjectRecords: false,
+ canDestroyObjectRecords: false,
+ },
+ ],
+ fieldPermissions: [
+ {
+ objectNameSingular: 'postCard',
+ fieldName: 'content',
+ canReadFieldValue: false,
+ canUpdateFieldValue: false,
+ },
+ ],
+ permissionFlags: ['APPLICATIONS'],
+};
+```
+
+Notes:
+
+* Start from the scaffolded role, then progressively restrict it following least‑privilege.
+* Replace the `objectPermissions` and `fieldPermissions` with the objects/fields your functions need.
+* `permissionFlags` control access to platform-level capabilities. Keep them minimal; add only what you need.
+* See a working example in the Hello World app: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
+
+### Serverless function config and entrypoint
+
+Each function exports a main handler and a config describing its triggers. You can mix multiple trigger types.
+
+```typescript
+// src/actions/create-new-post-card.ts
+import type {
+ FunctionConfig,
+ DatabaseEventPayload,
+ ObjectRecordCreateEvent,
+ CronPayload,
+} from 'twenty-sdk';
+import Twenty, { type Person } from '../generated';
+
+// main handler can accept parameters from route, cron, or database events
+export const main = async (
+ params:
+ | { name?: string }
+ | DatabaseEventPayload>
+ | CronPayload,
+) => {
+ const client = new Twenty(); // generated typed client
+ const name = 'name' in params
+ ? params.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world'
+ : 'Hello world';
+
+ const result = await client.mutation({
+ createPostCard: {
+ __args: { data: { name } },
+ id: true,
+ name: true,
+ },
+ });
+ return result;
+};
+
+export const config: FunctionConfig = {
+ universalIdentifier: '',
+ name: 'create-new-post-card',
+ timeoutSeconds: 2,
+ triggers: [
+ // Public HTTP route trigger '/s/post-card/create'
+ {
+ universalIdentifier: '',
+ type: 'route',
+ path: '/post-card/create',
+ httpMethod: 'GET',
+ isAuthRequired: false,
+ },
+ // Cron trigger (CRON pattern)
+ {
+ universalIdentifier: '',
+ type: 'cron',
+ pattern: '0 0 1 1 *',
+ },
+ // Database event trigger
+ {
+ universalIdentifier: '',
+ type: 'databaseEvent',
+ eventName: 'person.created',
+ },
+ ],
+};
+```
+
+Common trigger types:
+
+* route: Exposes your function on an HTTP path and method **under the `/s/` endpoint**:
+
+> e.g. `path: '/post-card/create',` -> call on `/s/post-card/create`
+
+* cron: Runs your function on a schedule using a CRON expression.
+* databaseEvent: Runs on workspace object lifecycle events
+
+> e.g. `person.created`
+
+You can create new functions in two ways:
+
+* **Scaffolded**: Run `yarn create-entity --path ` and choose the option to add a new function. This generates a starter file under `` with a `main` handler and a `config` block similar to the example above.
+* **Manual**: Create a new file and export `main` and `config` yourself, following the same pattern.
+
+### Generated typed client
+
+Run yarn generate to create a local typed client in generated/ based on your workspace schema. Use it in your functions:
+
+```typescript
+import Twenty from './generated';
+
+const client = new Twenty();
+const { me } = await client.query({ me: { id: true, displayName: true } });
+```
+
+The client is re-generated by `yarn generate`. Re-run after changing your objects and `yarn sync` or when onboarding to a new workspace.
+
+#### Runtime credentials in serverless functions
+
+When your function runs on Twenty, the platform injects credentials as environment variables before your code executes:
+
+* `TWENTY_API_URL`: Base URL of the Twenty API your app targets.
+* `TWENTY_API_KEY`: Short‑lived key scoped to your application’s default function role.
+
+Notes:
+
+* You do not need to pass URL or API key to the generated client. It reads `TWENTY_API_URL` and `TWENTY_API_KEY` from process.env at runtime.
+* The API key’s permissions are determined by the role referenced in your `application.config.ts` via `functionRoleUniversalIdentifier`. This is the default role used by serverless functions of your application.
+* Applications can define roles to follow least‑privilege. Grant only the permissions your functions need, then point `functionRoleUniversalIdentifier` to that role’s universal identifier.
+
+### Hello World example
+
+Explore a minimal, end-to-end example that demonstrates objects, functions, and multiple triggers [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps/hello-world):
+
+## Manual setup (without the scaffolder)
+
+While we recommend using `create-twenty-app` for the best getting-started experience, you can also set up a project manually. Do not install the CLI globally. Instead, add `twenty-sdk` as a local dependency and wire scripts in your package.json:
+
+```bash filename="Terminal"
+yarn add -D twenty-sdk
+```
+
+Then add scripts like these:
+
+```json filename="package.json"
+{
+ "scripts": {
+ "auth": "twenty auth login",
+ "generate": "twenty app generate",
+ "dev": "twenty app dev",
+ "sync": "twenty app sync",
+ "uninstall": "twenty app uninstall",
+ "logs": "twenty app logs",
+ "create-entity": "twenty app add",
+ "help": "twenty --help"
+ }
+}
+```
+
+Now you can run the same commands via Yarn, e.g. `yarn dev`, `yarn sync`, etc.
+
+## Troubleshooting
+
+* Authentication errors: run `yarn auth` and ensure your API key has the required permissions.
+* Cannot connect to server: verify the API URL and that the Twenty server is reachable.
+* Types or client missing/outdated: run `yarn generate` and then `yarn dev`.
+* Dev mode not syncing: ensure `yarn dev` is running and that changes are not ignored by your environment.
+
+Discord Help Channel: https://discord.com/channels/1130383047699738754/1130386664812982322
diff --git a/packages/twenty-docs/l/ko/developers/extend/capabilities/webhooks.mdx b/packages/twenty-docs/l/ko/developers/extend/capabilities/webhooks.mdx
new file mode 100644
index 0000000000..a6f0454aae
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/extend/capabilities/webhooks.mdx
@@ -0,0 +1,112 @@
+---
+title: Webhooks
+description: Receive real-time notifications when events occur in your CRM.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Webhooks push data to your systems in real-time when events occur in Twenty — no polling required. Use them to keep external systems in sync, trigger automations, or send alerts.
+
+## Create a Webhook
+
+1. Go to **Settings → APIs & Webhooks → Webhooks**
+2. Click **+ Create webhook**
+3. Enter your webhook URL (must be publicly accessible)
+4. Click **Save**
+
+The webhook activates immediately and starts sending notifications.
+
+
+
+### Manage Webhooks
+
+**Edit**: Click the webhook → Update URL → **Save**
+
+**Delete**: Click the webhook → **Delete** → Confirm
+
+## Events
+
+Twenty sends webhooks for these event types:
+
+| Event | Example |
+| ------------------ | ---------------------------------------------------------- |
+| **Record Created** | `person.created`, `company.created`, `note.created` |
+| **Record Updated** | `person.updated`, `company.updated`, `opportunity.updated` |
+| **Record Deleted** | `person.deleted`, `company.deleted` |
+
+All event types are sent to your webhook URL. Event filtering may be added in future releases.
+
+## Payload Format
+
+Each webhook sends an HTTP POST with a JSON body:
+
+```json
+{
+ "event": "person.created",
+ "data": {
+ "id": "abc12345",
+ "firstName": "Alice",
+ "lastName": "Doe",
+ "email": "alice@example.com",
+ "createdAt": "2025-02-10T15:30:45Z",
+ "createdBy": "user_123"
+ },
+ "timestamp": "2025-02-10T15:30:50Z"
+}
+```
+
+| Field | Description |
+| ----------- | ------------------------------------------------ |
+| `event` | What happened (e.g., `person.created`) |
+| `data` | The full record that was created/updated/deleted |
+| `timestamp` | When the event occurred (UTC) |
+
+
+ Respond with a **2xx HTTP status** (200-299) to acknowledge receipt. Non-2xx responses are logged as delivery failures.
+
+
+## Webhook Validation
+
+Twenty signs each webhook request for security. Validate signatures to ensure requests are authentic.
+
+### Headers
+
+| Header | Description |
+| ---------------------------- | --------------------- |
+| `X-Twenty-Webhook-Signature` | HMAC SHA256 signature |
+| `X-Twenty-Webhook-Timestamp` | Request timestamp |
+
+### Validation Steps
+
+1. Get the timestamp from `X-Twenty-Webhook-Timestamp`
+2. Create the string: `{timestamp}:{JSON payload}`
+3. Compute HMAC SHA256 using your webhook secret
+4. Compare with `X-Twenty-Webhook-Signature`
+
+### Example (Node.js)
+
+```javascript
+const crypto = require("crypto");
+
+const timestamp = req.headers["x-twenty-webhook-timestamp"];
+const payload = JSON.stringify(req.body);
+const secret = "your-webhook-secret";
+
+const stringToSign = `${timestamp}:${payload}`;
+const expectedSignature = crypto
+ .createHmac("sha256", secret)
+ .update(stringToSign)
+ .digest("hex");
+
+const isValid = expectedSignature === req.headers["x-twenty-webhook-signature"];
+```
+
+## Webhooks vs Workflows
+
+| Method | Direction | Use Case |
+| ---------------------------- | --------- | ---------------------------------------------------------- |
+| **Webhooks** | OUT | Automatically notify external systems of any record change |
+| **Workflow + HTTP Request** | OUT | Send data out with custom logic (filters, transformations) |
+| **Workflow Webhook Trigger** | IN | Receive data into Twenty from external systems |
+
+For receiving external data, see [Set Up a Webhook Trigger](/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger).
diff --git a/packages/twenty-docs/l/ko/developers/extend/extend.mdx b/packages/twenty-docs/l/ko/developers/extend/extend.mdx
new file mode 100644
index 0000000000..ab7ec0682f
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/extend/extend.mdx
@@ -0,0 +1,34 @@
+---
+title: Extend
+description: Extend Twenty's functionality with APIs, webhooks, and custom apps.
+---
+
+
+
+
+
+## Overview
+
+Twenty is designed to be extensible. Use our APIs, webhooks, and app framework to integrate with your existing tools and build custom functionality.
+
+## What You Can Do
+
+* **APIs**: Query and modify your CRM data programmatically using REST or GraphQL
+* **Webhooks**: Receive real-time notifications when events occur in Twenty
+* **Apps**: Build custom applications that extend Twenty's capabilities - Coming soon!
+
+## Getting Started
+
+
+
+ Connect to Twenty programmatically
+
+
+
+ Get notified of events in real-time
+
+
+
+ Build customizations as code (Alpha)
+
+
diff --git a/packages/twenty-docs/l/ko/developers/introduction.mdx b/packages/twenty-docs/l/ko/developers/introduction.mdx
new file mode 100644
index 0000000000..359205d949
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/introduction.mdx
@@ -0,0 +1,23 @@
+---
+title: Getting Started
+description: Welcome to Twenty Developer Documentation, your resources for extending, self-hosting, and contributing to Twenty.
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+
+
+ Extend
+ Build integrations with APIs, webhooks, and custom apps.
+
+
+
+ Self-Host
+ Deploy and manage Twenty on your own infrastructure.
+
+
+
+ Contribute
+ Join our open-source community and contribute to Twenty.
+
+
diff --git a/packages/twenty-docs/l/ko/developers/self-host/capabilities/cloud-providers.mdx b/packages/twenty-docs/l/ko/developers/self-host/capabilities/cloud-providers.mdx
new file mode 100644
index 0000000000..809388612a
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/self-host/capabilities/cloud-providers.mdx
@@ -0,0 +1,45 @@
+---
+title: Other methods
+---
+
+
+ This document is maintained by the community. It might contain issues.
+
+
+## Kubernetes via Terraform and Manifests
+
+Community-led documentation for Kubernetes deployment is available [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s)
+
+### Coolify
+
+Deploy Twenty on servers using Coolify. (official image on Coolify will be available soon)
+
+[Coolify documentation](https://coolify.io/docs/get-started/introduction)
+
+### EasyPanel
+
+Deploy Twenty on EasyPanel with the community maintained template below.
+
+[Deploy on EasyPanel](https://easypanel.io/docs/templates/twenty)
+
+### Elest.io
+
+Deploy Twenty on servers with Elest.io using link below.
+
+[Deploy on Elest.io](https://elest.io/open-source/twenty)
+
+### Twenty on Railway
+
+Deploy Twenty on Railway with the community maintained template below.
+
+[](https://railway.com/deploy/nAL3hA)
+
+### Twenty on Sealos
+
+Deploy Twenty on Sealos with the community maintained template below.
+
+[](https://sealos.io/products/app-store/twenty)
+
+## Others
+
+Please feel free to Open a PR to add more Cloud Provider options.
diff --git a/packages/twenty-docs/l/ko/developers/self-host/capabilities/docker-compose.mdx b/packages/twenty-docs/l/ko/developers/self-host/capabilities/docker-compose.mdx
new file mode 100644
index 0000000000..4c1ff39462
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/self-host/capabilities/docker-compose.mdx
@@ -0,0 +1,253 @@
+---
+title: 1-Click w/ Docker Compose
+---
+
+
+ Docker containers are for production hosting or self-hosting, for the contribution please check the [Local Setup](/l/ko/developers/contribute/capabilities/local-setup).
+
+
+## Overview
+
+This guide provides step-by-step instructions to install and configure the Twenty application using Docker Compose. The aim is to make the process straightforward and prevent common pitfalls that could break your setup.
+
+**Important:** Only modify settings explicitly mentioned in this guide. Altering other configurations may lead to issues.
+
+See docs [Setup Environment Variables](/l/ko/developers/self-host/capabilities/setup) for advanced configuration. All environment variables must be declared in the docker-compose.yml file at the server and / or worker level depending on the variable.
+
+## System Requirements
+
+* RAM: Ensure your environment has at least 2GB of RAM. Insufficient memory can cause processes to crash.
+* Docker & Docker Compose: Make sure both are installed and up-to-date.
+
+## Option 1: One-line script
+
+Install the latest stable version of Twenty with a single command:
+
+```bash
+bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
+```
+
+To install a specific version or branch:
+
+```bash
+VERSION=vx.y.z BRANCH=branch-name bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
+```
+
+* Replace x.y.z with the desired version number.
+* Replace branch-name with the name of the branch you want to install.
+
+## Option 2: Manual steps
+
+Follow these steps for a manual setup.
+
+### Step 1: Set Up the Environment File
+
+1. **Create the .env File**
+
+ Copy the example environment file to a new .env file in your working directory:
+
+ ```bash
+ curl -o .env https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/.env.example
+ ```
+
+2. **Generate Secret Tokens**
+
+ Run the following command to generate a unique random string:
+
+ ```bash
+ openssl rand -base64 32
+ ```
+
+ **Important:** Keep this value secret / do not share it.
+
+3. **Update the `.env`**
+
+ Replace the placeholder value in your .env file with the generated token:
+
+ ```ini
+ APP_SECRET=first_random_string
+ ```
+
+4. **Set the Postgres Password**
+
+ Update the `PG_DATABASE_PASSWORD` value in the .env file with a strong password without special characters.
+
+ ```ini
+ PG_DATABASE_PASSWORD=my_strong_password
+ ```
+
+### Step 2: Obtain the Docker Compose File
+
+Download the `docker-compose.yml` file to your working directory:
+
+```bash
+curl -o docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/docker-compose.yml
+```
+
+### Step 3: Launch the Application
+
+Start the Docker containers:
+
+```bash
+docker compose up -d
+```
+
+### Step 4: Access the Application
+
+If you host twentyCRM on your own computer, open your browser and navigate to [http://localhost:3000](http://localhost:3000).
+
+If you host it on a server, check that the server is running and that everything is ok with
+
+```bash
+curl http://localhost:3000
+```
+
+## Configuration
+
+### Expose Twenty to External Access
+
+By default, Twenty runs on `localhost` at port `3000`. To access it via an external domain or IP address, you need to configure the `SERVER_URL` in your `.env` file.
+
+#### Understanding `SERVER_URL`
+
+* **Protocol:** Use `http` or `https` depending on your setup.
+ * Use `http` if you haven't set up SSL.
+ * Use `https` if you have SSL configured.
+* **Domain/IP:** This is the domain name or IP address where your application is accessible.
+* **Port:** Include the port number if you're not using the default ports (`80` for `http`, `443` for `https`).
+
+### SSL Requirements
+
+SSL (HTTPS) is required for certain browser features to work properly. While these features might work during local development (as browsers treat localhost differently), a proper SSL setup is needed when hosting Twenty on a regular domain.
+
+For example, the clipboard API might require a secure context - some features like copy buttons throughout the application might not work without HTTPS enabled.
+
+We strongly recommend setting up Twenty behind a reverse proxy with SSL termination for optimal security and functionality.
+
+#### Configuring `SERVER_URL`
+
+1. **Determine Your Access URL**
+ * **Without Reverse Proxy (Direct Access):**
+
+ If you're accessing the application directly without a reverse proxy:
+
+ ```ini
+ SERVER_URL=http://your-domain-or-ip:3000
+ ```
+
+ * **With Reverse Proxy (Standard Ports):**
+
+ If you're using a reverse proxy like Nginx or Traefik and have SSL configured:
+
+ ```ini
+ SERVER_URL=https://your-domain-or-ip
+ ```
+
+ * **With Reverse Proxy (Custom Ports):**
+
+ If you're using non-standard ports:
+
+ ```ini
+ SERVER_URL=https://your-domain-or-ip:custom-port
+ ```
+
+2. **Update the `.env` File**
+
+ Open your `.env` file and update the `SERVER_URL`:
+
+ ```ini
+ SERVER_URL=http(s)://your-domain-or-ip:your-port
+ ```
+
+ **Examples:**
+
+ * Direct access without SSL:
+ ```ini
+ SERVER_URL=http://123.45.67.89:3000
+ ```
+ * Access via domain with SSL:
+ ```ini
+ SERVER_URL=https://mytwentyapp.com
+ ```
+
+3. **Restart the Application**
+
+ For changes to take effect, restart the Docker containers:
+
+ ```bash
+ docker compose down
+ docker compose up -d
+ ```
+
+#### Considerations
+
+* **Reverse Proxy Configuration:**
+
+ Ensure your reverse proxy forwards requests to the correct internal port (`3000` by default). Configure SSL termination and any necessary headers.
+
+* **Firewall Settings:**
+
+ Open necessary ports in your firewall to allow external access.
+
+* **Consistency:**
+
+ The `SERVER_URL` must match how users access your application in their browsers.
+
+#### Persistence
+
+* **Data Volumes:**
+
+ The Docker Compose configuration uses volumes to persist data for the database and server storage.
+
+* **Stateless Environments:**
+
+ If deploying to a stateless environment (e.g., certain cloud services), configure external storage to persist data.
+
+## Backup and Restore
+
+Regular backups protect your CRM data from loss.
+
+### Create a Database Backup
+
+```bash
+docker exec twenty-postgres pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql
+```
+
+### Automate Daily Backups
+
+Add to your crontab (`crontab -e`):
+
+```bash
+0 2 * * * docker exec twenty-postgres pg_dump -U postgres twenty > /backups/twenty_$(date +\%Y\%m\%d).sql
+```
+
+### Restore from Backup
+
+1. Stop the application:
+
+```bash
+docker compose stop twenty-server twenty-front
+```
+
+2. Restore the database:
+
+```bash
+docker exec -i twenty-postgres psql -U postgres twenty < backup_20240115.sql
+```
+
+3. Restart services:
+
+```bash
+docker compose up -d
+```
+
+### Backup Best Practices
+
+* **Test restores regularly** — verify backups actually work
+* **Store backups off-site** — use cloud storage (S3, GCS, etc.)
+* **Encrypt sensitive data** — protect backups with encryption
+* **Retain multiple copies** — keep daily, weekly, and monthly backups
+
+## Troubleshooting
+
+If you encounter any problem, check [Troubleshooting](/l/ko/developers/self-host/capabilities/troubleshooting) for solutions.
diff --git a/packages/twenty-docs/l/ko/developers/self-host/capabilities/setup.mdx b/packages/twenty-docs/l/ko/developers/self-host/capabilities/setup.mdx
new file mode 100644
index 0000000000..99992f611a
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/self-host/capabilities/setup.mdx
@@ -0,0 +1,293 @@
+---
+title: Setup
+---
+
+# Configuration Management
+
+
+ **First time installing?** Follow the [Docker Compose installation guide](/l/ko/developers/self-host/capabilities/docker-compose) to get Twenty running, then return here for configuration.
+
+
+Twenty offers **two configuration modes** to suit different deployment needs:
+
+**Admin panel access:** Only users with admin privileges (`canAccessFullAdminPanel: true`) can access the configuration interface.
+
+## 1. Admin Panel Configuration (Default)
+
+```bash
+IS_CONFIG_VARIABLES_IN_DB_ENABLED=true # default
+```
+
+**Most configuration happens through the UI** after installation:
+
+1. Access your Twenty instance (usually `http://localhost:3000`)
+2. Go to **Settings / Admin Panel / Configuration Variables**
+3. Configure integrations, email, storage, and more
+4. Changes take effect immediately (within 15 seconds for multi-container deployments)
+
+
+ **Multi-Container Deployments:** When using database configuration (`IS_CONFIG_VARIABLES_IN_DB_ENABLED=true`), both server and worker containers read from the same database. Admin panel changes affect both automatically, eliminating the need to duplicate environment variables between containers (except for infrastructure variables).
+
+
+**What you can configure through the admin panel:**
+
+* **Authentication** - Google/Microsoft OAuth, password settings
+* **Email** - SMTP settings, templates, verification
+* **Storage** - S3 configuration, local storage paths
+* **Integrations** - Gmail, Google Calendar, Microsoft services
+* **Workflow & Rate Limiting** - Execution limits, API throttling
+* **And much more...**
+
+
+
+
+ Each variable is documented with descriptions in your admin panel at **Settings → Admin Panel → Configuration Variables**.
+ Some infrastructure settings like database connections (`PG_DATABASE_URL`), server URLs (`SERVER_URL`), and app secrets (`APP_SECRET`) can only be configured via `.env` file.
+
+ [Complete technical reference →](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts)
+
+
+## 2. Environment-Only Configuration
+
+```bash
+IS_CONFIG_VARIABLES_IN_DB_ENABLED=false
+```
+
+**All configuration managed through `.env` files:**
+
+1. Set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` in your `.env` file
+2. Add all configuration variables to your `.env` file
+3. Restart containers for changes to take effect
+4. Admin panel will show current values but cannot modify them
+
+## Multi-Workspace Mode
+
+By default, Twenty runs in **single-workspace mode** — ideal for most self-hosted deployments where you need one CRM instance for your organization.
+
+### Single-Workspace Mode (Default)
+
+```bash
+IS_MULTIWORKSPACE_ENABLED=false # default
+```
+
+* One workspace per Twenty instance
+* First user automatically becomes admin with full privileges (`canImpersonate` and `canAccessFullAdminPanel`)
+* New signups are disabled after the first workspace is created
+* Simple URL structure: `https://your-domain.com`
+
+### Enabling Multi-Workspace Mode
+
+```bash
+IS_MULTIWORKSPACE_ENABLED=true
+DEFAULT_SUBDOMAIN=app # default value
+```
+
+Enable multi-workspace mode for SaaS-like deployments where multiple independent teams need their own workspaces on the same Twenty instance.
+
+**Key differences from single-workspace mode:**
+
+* Multiple workspaces can be created on the same instance
+* Each workspace gets its own subdomain (e.g., `sales.your-domain.com`, `marketing.your-domain.com`)
+* Users sign up and log in at `{DEFAULT_SUBDOMAIN}.your-domain.com` (e.g., `app.your-domain.com`)
+* No automatic admin privileges — first user in each workspace is a regular user
+* Workspace-specific settings like subdomain and custom domain become available in workspace settings
+
+
+ **Environment-only setting:** `IS_MULTIWORKSPACE_ENABLED` can only be configured via `.env` file and requires a restart. It cannot be changed through the admin panel.
+
+
+### DNS Configuration for Multi-Workspace
+
+When using multi-workspace mode, configure your DNS with a wildcard record to allow dynamic subdomain creation:
+
+```
+*.your-domain.com -> your-server-ip
+```
+
+This enables automatic subdomain routing for new workspaces without manual DNS configuration.
+
+### Restricting Workspace Creation
+
+In multi-workspace mode, you may want to limit who can create new workspaces:
+
+```bash
+IS_WORKSPACE_CREATION_LIMITED_TO_SERVER_ADMINS=true
+```
+
+When enabled, only users with `canAccessFullAdminPanel` can create additional workspaces. Users can still create their first workspace during initial signup.
+
+## Gmail & Google Calendar Integration
+
+### Create Google Cloud Project
+
+1. Go to [Google Cloud Console](https://console.cloud.google.com/)
+2. Create a new project or select existing one
+3. Enable these APIs:
+
+* [Gmail API](https://console.cloud.google.com/apis/library/gmail.googleapis.com)
+* [Google Calendar API](https://console.cloud.google.com/apis/library/calendar-json.googleapis.com)
+* [People API](https://console.cloud.google.com/apis/library/people.googleapis.com)
+
+### Configure OAuth
+
+1. Go to [Credentials](https://console.cloud.google.com/apis/credentials)
+2. Create OAuth 2.0 Client ID
+3. Add these redirect URIs:
+ * `https://{your-domain}/auth/google/redirect` (for SSO)
+ * `https://{your-domain}/auth/google-apis/get-access-token` (for integrations)
+
+### Configure in Twenty
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Google Auth** section
+3. Set these variables:
+ * `MESSAGING_PROVIDER_GMAIL_ENABLED=true`
+ * `CALENDAR_PROVIDER_GOOGLE_ENABLED=true`
+ * `AUTH_GOOGLE_CLIENT_ID={client-id}`
+ * `AUTH_GOOGLE_CLIENT_SECRET={client-secret}`
+ * `AUTH_GOOGLE_CALLBACK_URL=https://{your-domain}/auth/google/redirect`
+ * `AUTH_GOOGLE_APIS_CALLBACK_URL=https://{your-domain}/auth/google-apis/get-access-token`
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
+
+**Required scopes** (automatically configured):
+[See relevant source code](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes.ts#L4-L10)
+
+* `https://www.googleapis.com/auth/calendar.events`
+* `https://www.googleapis.com/auth/gmail.readonly`
+* `https://www.googleapis.com/auth/profile.emails.read`
+
+### If your app is in test mode
+
+If your app is in test mode, you will need to add test users to your project.
+
+Under [OAuth consent screen](https://console.cloud.google.com/apis/credentials/consent), add your test users to the "Test users" section.
+
+## Microsoft 365 Integration
+
+
+ Users must have a [Microsoft 365 Licence](https://admin.microsoft.com/Adminportal/Home) to be able to use the Calendar and Messaging API. They will not be able to sync their account on Twenty without one.
+
+
+### Create a project in Microsoft Azure
+
+You will need to create a project in [Microsoft Azure](https://portal.azure.com/#view/Microsoft_AAD_IAM/AppGalleryBladeV2) and get the credentials.
+
+### Enable APIs
+
+On Microsoft Azure Console enable the following APIs in "Permissions":
+
+* Microsoft Graph: Mail.ReadWrite
+* Microsoft Graph: Mail.Send
+* Microsoft Graph: Calendars.Read
+* Microsoft Graph: User.Read
+* Microsoft Graph: openid
+* Microsoft Graph: email
+* Microsoft Graph: profile
+* Microsoft Graph: offline_access
+
+Note: "Mail.ReadWrite" and "Mail.Send" are only mandatory if you want to send emails using our workflow actions. You can use "Mail.Read" instead if you only want to receive emails.
+
+### Authorized redirect URIs
+
+You need to add the following redirect URIs to your project:
+
+* `https://{your-domain}/auth/microsoft/redirect` if you want to use Microsoft SSO
+* `https://{your-domain}/auth/microsoft-apis/get-access-token`
+
+### Configure in Twenty
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Microsoft Auth** section
+3. Set these variables:
+ * `MESSAGING_PROVIDER_MICROSOFT_ENABLED=true`
+ * `CALENDAR_PROVIDER_MICROSOFT_ENABLED=true`
+ * `AUTH_MICROSOFT_ENABLED=true`
+ * `AUTH_MICROSOFT_CLIENT_ID={client-id}`
+ * `AUTH_MICROSOFT_CLIENT_SECRET={client-secret}`
+ * `AUTH_MICROSOFT_CALLBACK_URL=https://{your-domain}/auth/microsoft/redirect`
+ * `AUTH_MICROSOFT_APIS_CALLBACK_URL=https://{your-domain}/auth/microsoft-apis/get-access-token`
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
+
+### Configure scopes
+
+[See relevant source code](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes.ts#L2-L9)
+
+* 'openid'
+* 'email'
+* 'profile'
+* 'offline_access'
+* 'Mail.ReadWrite'
+* 'Mail.Send'
+* 'Calendars.Read'
+
+### If your app is in test mode
+
+If your app is in test mode, you will need to add test users to your project.
+
+Add your test users to the "Users and groups" section.
+
+## Background Jobs for Calendar & Messaging
+
+After configuring Gmail, Google Calendar, or Microsoft 365 integrations, you need to start the background jobs that sync data.
+
+Register the following recurring jobs in your worker container:
+
+```bash
+# from your worker container
+yarn command:prod cron:messaging:messages-import
+yarn command:prod cron:messaging:message-list-fetch
+yarn command:prod cron:calendar:calendar-event-list-fetch
+yarn command:prod cron:calendar:calendar-events-import
+yarn command:prod cron:messaging:ongoing-stale
+yarn command:prod cron:calendar:ongoing-stale
+yarn command:prod cron:workflow:automated-cron-trigger
+```
+
+## Email Configuration
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Email** section
+3. Configure your SMTP settings:
+
+
+
+ You will need to provision an [App Password](https://support.google.com/accounts/answer/185833).
+
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=smtp.gmail.com
+ * EMAIL_SMTP_PORT=465
+ * EMAIL_SMTP_USER=gmail_email_address
+ * EMAIL_SMTP_PASSWORD='gmail_app_password'
+
+
+
+ Keep in mind that if you have 2FA enabled, you will need to provision an [App Password](https://support.microsoft.com/en-us/account-billing/manage-app-passwords-for-two-step-verification-d6dc8c6d-4bf7-4851-ad95-6d07799387e9).
+
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=smtp.office365.com
+ * EMAIL_SMTP_PORT=587
+ * EMAIL_SMTP_USER=office365_email_address
+ * EMAIL_SMTP_PASSWORD='office365_password'
+
+
+
+ **smtp4dev** is a fake SMTP email server for development and testing.
+
+ * Run the smtp4dev image: `docker run --rm -it -p 8090:80 -p 2525:25 rnwood/smtp4dev`
+ * Access the smtp4dev ui here: [http://localhost:8090](http://localhost:8090)
+ * Set the following variables:
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=localhost
+ * EMAIL_SMTP_PORT=2525
+
+
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
diff --git a/packages/twenty-docs/l/ko/developers/self-host/capabilities/troubleshooting.mdx b/packages/twenty-docs/l/ko/developers/self-host/capabilities/troubleshooting.mdx
new file mode 100644
index 0000000000..d2187aedac
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/self-host/capabilities/troubleshooting.mdx
@@ -0,0 +1,227 @@
+---
+title: Troubleshooting
+---
+
+## Troubleshooting
+
+If you encounter any problem while setting up environment for development, upgrading your instance or self-hosting,
+here are some solutions for common problems.
+
+### Self-hosting
+
+#### First install results in `password authentication failed for user "postgres"`
+
+🚨 **IMPORTANT: This solution is ONLY for fresh installations** 🚨
+If you have an existing Twenty instance with production data, **DO NOT** follow these steps as they will permanently delete your database!
+
+While installing Twenty for the first time, you might want to change the default database password.
+The password you set during the first installation becomes permanently stored in the database volume. If you later try to change this password in your configuration without removing the old volume, you'll get authentication errors because the database is still using the original password.
+
+⚠️ WARNING: Following steps will PERMANENTLY DELETE all database data! ⚠️
+Only proceed if this is a fresh installation with no important data.
+
+In order to update the `PG_DATABASE_PASSWORD` you need to:
+
+```sh
+# Update the PG_DATABASE_PASSWORD in .env
+docker compose down --volumes
+docker compose up -d
+```
+
+#### CR line breaks found [Windows]
+
+This is due to the line break characters of Windows and the git configuration. Try running:
+
+```
+git config --global core.autocrlf false
+```
+
+Then delete the repository and clone it again.
+
+#### Missing metadata schema
+
+During Twenty installation, you need to provision your postgres database with the right schemas, extensions, and users.
+If you're successful in running this provisioning, you should have `default` and `metadata` schemas in your database.
+If you don't, make sure you don't have more than one postgres instance running on your computer.
+
+#### Cannot find module 'twenty-emails' or its corresponding type declarations.
+
+You have to build the package `twenty-emails` before running the initialization of the database with `npx nx run twenty-emails:build`
+
+#### Missing twenty-x package
+
+Make sure to run yarn in the root directory and then run `npx nx server:dev twenty-server`. If this still doesn't work try building the missing package manually.
+
+#### Lint on Save not working
+
+This should work out of the box with the eslint extension installed. If this doesn't work try adding this to your vscode setting (on the dev container scope):
+
+```
+"editor.codeActionsOnSave": {
+
+ "source.fixAll.eslint": "explicit"
+
+}
+```
+
+#### While running `npx nx start` or `npx nx start twenty-front`, Out of memory error is thrown
+
+In `packages/twenty-front/.env` uncomment `VITE_DISABLE_TYPESCRIPT_CHECKER=true` to disable background checks thus reducing amount of needed RAM.
+
+**If it does not work:**
+Run only the services you need, instead of `npx nx start`. For instance, if you work on the server, run only `npx nx worker twenty-server`
+
+**If it does not work:**
+If you tried to run only `npx nx run twenty-server:start` on WSL and it's failing with the below memory error:
+
+`FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory`
+
+Workaround is to execute below command in terminal or add it in .bashrc profile to get setup automatically:
+
+`export NODE_OPTIONS="--max-old-space-size=8192"`
+
+The --max-old-space-size=8192 flag sets an upper limit of 8GB for the Node.js heap; usage scales with application demand.
+Reference: https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048
+
+**If it does not work:**
+Investigate which processes are taking you most of your machine RAM. At Twenty, we noticed that some VScode extensions were taking a lot of RAM so we temporarily disable them.
+
+**If it does not work:**
+Restart your machine helps to clean up ghost processes.
+
+#### While running `npx nx start` there are weird [0] and [1] in logs
+
+That's expected as command `npx nx start` is running more commands under the hood
+
+#### No emails are sent
+
+Most of the time, it's because the `worker` is not running in the background. Try to run
+
+```
+npx nx worker twenty-server
+```
+
+#### Cannot connect my Microsoft 365 account
+
+Most of the time, it's because your admin has not enabled the Microsoft 365 Licence for your account. Check [https://admin.microsoft.com/](https://admin.microsoft.com/Adminportal/Home).
+
+If you have an error code `AADSTS50020`, it probably means that you are using a personal Microsoft account. This is not supported yet. More info [here](https://learn.microsoft.com/fr-fr/troubleshoot/entra/entra-id/app-integration/error-code-aadsts50020-user-account-identity-provider-does-not-exist)
+
+#### While running `yarn` warnings appear in console
+
+Warnings are informing about pulling additional dependencies which aren't explicitly stated in `package.json`, so as long as no breaking error appears, everything should work as expected.
+
+#### When user accesses login page, error about unauthorized user trying to access workspace appears in logs
+
+That's expected as user is unauthorized when logged out since its identity is not verified.
+
+#### How to check if your worker is running?
+
+* Go to [webhook-test.com](https://webhook-test.com/) and copy **Your Unique Webhook URL**.
+
+
+
+
+
+* Open your Twenty app, navigate to `/settings`, and enable the **Advanced** toggle at the bottom left of the screen.
+* Create a new webhook.
+* Paste **Your Unique Webhook URL** in the **Endpoint Url** field in Twenty. Set the **Filters** to `Companies` and `Created`.
+
+
+
+
+
+* Go to `/objects/companies` and create a new company record.
+* Return to [webhook-test.com](https://webhook-test.com/) and check if a new **POST request** has been received.
+
+
+
+
+
+* If a **POST request** is received, your worker is running successfully. Otherwise, you need to troubleshoot your worker.
+
+#### Front-end fails to start and returns error TS5042: Option 'project' cannot be mixed with source files on a command line
+
+Comment out checker plugin in `packages/twenty-ui/vite-config.ts` like in example below
+
+```
+plugins: [
+ react({ jsxImportSource: '@emotion/react' }),
+ tsconfigPaths(),
+ svgr(),
+ dts(dtsConfig),
+ // checker(checkersConfig),
+ wyw({
+ include: [
+ '**/OverflowingTextWithTooltip.tsx',
+ '**/Chip.tsx',
+ '**/Tag.tsx',
+ '**/Avatar.tsx',
+ '**/AvatarChip.tsx',
+ ],
+ babelOptions: {
+ presets: ['@babel/preset-typescript', '@babel/preset-react'],
+ },
+ }),
+ ],
+```
+
+#### Admin panel not accessible
+
+Run `UPDATE core."user" SET "canAccessFullAdminPanel" = TRUE WHERE email = 'you@yourdomain.com';` in database container to get access to admin panel.
+
+### 1-click Docker compose
+
+#### Unable to Log In
+
+If you can't log in after setup:
+
+1. Run the following commands:
+ ```bash
+ docker exec -it twenty-server-1 yarn
+ docker exec -it twenty-server-1 npx nx database:reset --configuration=no-seed
+ ```
+2. Restart the Docker containers:
+ ```bash
+ docker compose down
+ docker compose up -d
+ ```
+
+Note the database:reset command will completely erase your database and recreate it from scratch.
+
+#### Connection Issues Behind a Reverse Proxy
+
+If you're running Twenty behind a reverse proxy and experiencing connection issues:
+
+1. **Verify SERVER_URL:**
+
+ Ensure `SERVER_URL` in your `.env` file matches your external access URL, including `https` if SSL is enabled.
+
+2. **Check Reverse Proxy Settings:**
+
+ * Confirm that your reverse proxy is correctly forwarding requests to the Twenty server.
+ * Ensure headers like `X-Forwarded-For` and `X-Forwarded-Proto` are properly set.
+
+3. **Restart Services:**
+
+ After making changes, restart both the reverse proxy and Twenty containers.
+
+#### Error when uploading an image - permission denied
+
+Switching the data folder ownership on the host from root to another user and group resolves this problem.
+
+## Getting Help
+
+If you encounter issues not covered in this guide:
+
+* Check Logs:
+
+ View container logs for error messages:
+
+ ```bash
+ docker compose logs
+ ```
+
+* Community Support:
+
+ Reach out to the [Twenty community](https://github.com/twentyhq/twenty/issues) or [support channels](https://discord.gg/cx5n4Jzs57) for assistance.
diff --git a/packages/twenty-docs/l/ko/developers/self-host/capabilities/upgrade-guide.mdx b/packages/twenty-docs/l/ko/developers/self-host/capabilities/upgrade-guide.mdx
new file mode 100644
index 0000000000..03a53f5685
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/self-host/capabilities/upgrade-guide.mdx
@@ -0,0 +1,381 @@
+---
+title: Upgrade guide
+---
+
+## General guidelines
+
+**Always make sure to back up your database before starting the upgrade process** by running `docker exec -it {db_container_name_or_id} pg_dumpall -U {postgres_user} > databases_backup.sql`.
+
+To restore backup, run `cat databases_backup.sql | docker exec -i {db_container_name_or_id} psql -U {postgres_user}`.
+
+If you used Docker Compose, follow these steps:
+
+1. In a terminal, on the host where Twenty is running, turn off Twenty: `docker compose down`
+
+2. Upgrade the version by changing the `TAG` value in the .env file near your docker-compose. ( We recommend consuming `major.minor` version such as `v0.53` )
+
+3. Bring Twenty back online with `docker compose up -d`
+
+If you want to upgrade your instance by few versions, e.g. from v0.33.0 to v0.35.0, you have to upgrade your instance sequentially, in this example from v0.33.0 to v0.34.0, then from v0.34.0 to v0.35.0.
+
+**Make sure that after each upgraded version you have non-corrupted backup.**
+
+## Version-specific upgrade steps
+
+## v1.0
+
+Hello Twenty v1.0! 🎉
+
+## v0.60
+
+### Performance Enhancements
+
+All interactions with the metadata API have been optimized for better performance, particularly for object metadata manipulation and workspace creation operations.
+
+We've refactored our caching strategy to prioritize cache hits over database queries when possible, significantly improving the performance of metadata API operations.
+
+If you encounter any runtime issues after upgrading, you may need to flush your cache to ensure it's synchronized with the latest changes. Run this command in your twenty-server container:
+
+```bash
+yarn command:prod cache:flush
+```
+
+### v0.55
+
+Upgrade your Twenty instance to use v0.55 image
+
+You don't need to run any command anymore, the new image will automatically care about running all required migrations.
+
+### `User does not have permission` error
+
+If you encounter authorization errors on most requests after upgrading, you may need to flush your cache to recompute the latest permissions.
+
+In your `twenty-server` container, run:
+
+```bash
+yarn command:prod cache:flush
+```
+
+This issue is specific to this Twenty version and should not be required for future upgrades.
+
+### v0.54
+
+Since version `0.53`, no manual actions needed.
+
+#### Metadata schema deprecation
+
+We've merged the `metadata` schema into the `core` one to simplify data retrieval from `TypeORM`.
+We have merged the `migrate` command step within the `upgrade` command. We do not recommend running `migrate` manually within any of your server/worker containers.
+
+### Since v0.53
+
+Starting from `0.53`, upgrade is programmatically done within the `DockerFile`, this means from now on, you shouldn't have to run any command manually anymore.
+
+Make sure to keep upgrading your instance sequentially, without skipping any major version (e.g. `0.43.3` to `0.44.0` is allowed, but `0.43.1` to `0.45.0` isn't), else could lead to workspace version desynchronization that could result in runtime error and missing functionality.
+
+To check if a workspace has been correctly migrated you can review its version in database in `core.workspace` table.
+
+It should always be in the range of your current Twenty's instance `major.minor` version, you can view your instance version in the admin panel (at `/settings/admin-panel`, accessible if your user has `canAccessFullAdminPanel` property set to true in the database) or by running `echo $APP_VERSION` in your `twenty-server` container.
+
+To fix a desynchronized workspace version, you will have to upgrade from the corresponding twenty's version following related upgrade guide sequentially and so on until it reaches desired version.
+
+#### `auditLog` removal
+
+We've removed the auditLog standard object, which means your backup size might be significantly reduced after this migration.
+
+### v0.51 to v0.52
+
+Upgrade your Twenty instance to use v0.52 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+#### I have a workspace blocked in version between `0.52.0` and `0.52.6`
+
+Unfortunately `0.52.0` and `0.52.6` have been completely removed from dockerHub.
+You will have to manually update your workspace version to `0.51.0` in database and upgrade using twenty version `0.52.11` following its just above upgrade guide.
+
+### v0.50 to v0.51
+
+Upgrade your Twenty instance to use v0.51 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+### v0.44.0 to v0.50.0
+
+Upgrade your Twenty instance to use v0.50.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+#### Docker-compose.yml mutation
+
+This version includes a `docker-compose.yml` mutation to give `worker` service access to the `server-local-data` volume.
+Please update your local `docker-compose.yml` with [v0.50.0 docker-compose.yml](https://github.com/twentyhq/twenty/blob/v0.50.0/packages/twenty-docker/docker-compose.yml)
+
+### v0.43.0 to v0.44.0
+
+Upgrade your Twenty instance to use v0.44.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+### v0.42.0 to v0.43.0
+
+Upgrade your Twenty instance to use v0.43.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+In this version, we have also switched to postgres:16 image in docker-compose.yml.
+
+#### (Option 1) Database migration
+
+Keeping the existing postgres-spilo image is fine, but you will have to freeze the version in your docker-compose.yml to be 0.43.0.
+
+#### (Option 2) Database migration
+
+If you want to migrate your database to the new postgres:16 image, please follow these steps:
+
+1. Dump your database from the old postgres-spilo container
+
+```
+docker exec -it twenty-db-1 sh
+pg_dump -U {YOUR_POSTGRES_USER} -d {YOUR_POSTGRES_DB} > databases_backup.sql
+exit
+docker cp twenty-db-1:/home/postgres/databases_backup.sql .
+```
+
+Make sure your dump file is not empty.
+
+2. Upgrade your docker-compose.yml to use postgres:16 image as in the [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) file.
+
+3. Restore the database to the new postgres:16 container
+
+```
+docker cp databases_backup.sql twenty-db-1:/databases_backup.sql
+docker exec -it twenty-db-1 sh
+psql -U {YOUR_POSTGRES_USER} -d {YOUR_POSTGRES_DB} -f databases_backup.sql
+exit
+```
+
+### v0.41.0 to v0.42.0
+
+Upgrade your Twenty instance to use v0.42.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.42
+```
+
+**Environment Variables**
+
+* Removed: `FRONT_PORT`, `FRONT_PROTOCOL`, `FRONT_DOMAIN`, `PORT`
+* Added: `FRONTEND_URL`, `NODE_PORT`, `MAX_NUMBER_OF_WORKSPACES_DELETED_PER_EXECUTION`, `MESSAGING_PROVIDER_MICROSOFT_ENABLED`, `CALENDAR_PROVIDER_MICROSOFT_ENABLED`, `IS_MICROSOFT_SYNC_ENABLED`
+
+### v0.40.0 to v0.41.0
+
+Upgrade your Twenty instance to use v0.41.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.41
+```
+
+**Environment Variables**
+
+* Removed: `AUTH_MICROSOFT_TENANT_ID`
+
+### v0.35.0 to v0.40.0
+
+Upgrade your Twenty instance to use v0.40.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.40
+```
+
+**Environment Variables**
+
+* Added: `IS_EMAIL_VERIFICATION_REQUIRED`, `EMAIL_VERIFICATION_TOKEN_EXPIRES_IN`, `WORKFLOW_EXEC_THROTTLE_LIMIT`, `WORKFLOW_EXEC_THROTTLE_TTL`
+
+### v0.34.0 to v0.35.0
+
+Upgrade your Twenty instance to use v0.35.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.35
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.35` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+* We replaced `ENABLE_DB_MIGRATIONS` with `DISABLE_DB_MIGRATIONS` (default value is now `false`, you probably don't have to set anything)
+
+### v0.33.0 to v0.34.0
+
+Upgrade your Twenty instance to use v0.34.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.34
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.34` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+* Removed: `FRONT_BASE_URL`
+* Added: `FRONT_DOMAIN`, `FRONT_PROTOCOL`, `FRONT_PORT`
+
+We have updated the way we handle the frontend URL.
+You can now set the frontend URL using the `FRONT_DOMAIN`, `FRONT_PROTOCOL` and `FRONT_PORT` variables.
+If FRONT_DOMAIN is not set, the frontend URL will fall back to `SERVER_URL`.
+
+### v0.32.0 to v0.33.0
+
+Upgrade your Twenty instance to use v0.33.0 image
+
+```
+yarn command:prod cache:flush
+yarn database:migrate:prod
+yarn command:prod upgrade-0.33
+```
+
+The `yarn command:prod cache:flush` command will flush the Redis cache.
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.33` takes care of the data migration of all workspaces.
+
+Starting from this version, twenty-postgres image for DB became deprecated and twenty-postgres-spilo is used instead.
+If you want to keep using twenty-postgres image, simply replace `twentycrm/twenty-postgres:${TAG}` with `twentycrm/twenty-postgres` in docker-compose.yml.
+
+### v0.31.0 to v0.32.0
+
+Upgrade your Twenty instance to use v0.32.0 image
+
+**Schema and data migration**
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.32
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.32` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+We have updated the way we handle the Redis connection.
+
+* Removed: `REDIS_HOST`, `REDIS_PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD`
+* Added: `REDIS_URL`
+
+Update your `.env` file to use the new `REDIS_URL` variable instead of the individual Redis connection parameters.
+
+We have also simplified the way we handle the JWT tokens.
+
+* Removed: `ACCESS_TOKEN_SECRET`, `LOGIN_TOKEN_SECRET`, `REFRESH_TOKEN_SECRET`, `FILE_TOKEN_SECRET`
+* Added: `APP_SECRET`
+
+Update your `.env` file to use the new `APP_SECRET` variable instead of the individual tokens secrets (you can use the same secret as before or generate a new random string)
+
+**Connected Account**
+
+If you are using connected account to synchronize your Google emails and calendars, you will need to activate the [People API](https://developers.google.com/people) on your Google Admin console.
+
+### v0.30.0 to v0.31.0
+
+Upgrade your Twenty instance to use v0.31.0 image
+
+**Schema and data migration**:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.31
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.31` takes care of the data migration of all workspaces.
+
+### v0.24.0 to v0.30.0
+
+Upgrade your Twenty instance to use v0.30.0 image
+
+**Breaking change**:
+To enhance performances, Twenty now requires redis cache to be configured. We have updated our [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) to reflect this.
+Make sure to update your configuration and to update your environment variables accordingly:
+
+```
+REDIS_HOST={your-redis-host}
+REDIS_PORT={your-redis-port}
+CACHE_STORAGE_TYPE=redis
+```
+
+**Schema and data migration**:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.30
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.30` takes care of the data migration of all workspaces.
+
+### v0.23.0 to v0.24.0
+
+Upgrade your Twenty instance to use v0.24.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.24
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.24` takes care of the data migration of all workspaces.
+
+### v0.22.0 to v0.23.0
+
+Upgrade your Twenty instance to use v0.23.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.23
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the Database.
+The `yarn command:prod upgrade-0.23` takes care of the data migration, including transferring activities to tasks/notes.
+
+### v0.21.0 to v0.22.0
+
+Upgrade your Twenty instance to use v0.22.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod workspace:sync-metadata -f
+yarn command:prod upgrade-0.22
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the Database.
+The `yarn command:prod workspace:sync-metadata -f` command will sync the definition of standard objects to the metadata tables and apply to required migrations to existing workspaces.
+The `yarn command:prod upgrade-0.22` command will apply specific data transformations to adapt to the new object defaultRequestInstrumentationOptions.
diff --git a/packages/twenty-docs/l/ko/developers/self-host/self-host.mdx b/packages/twenty-docs/l/ko/developers/self-host/self-host.mdx
new file mode 100644
index 0000000000..5f3a7d8bbe
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/self-host/self-host.mdx
@@ -0,0 +1,30 @@
+---
+title: Self-Host
+description: Deploy and manage Twenty on your own infrastructure.
+---
+
+
+
+
+
+## Overview
+
+Twenty can be self-hosted on your own infrastructure, giving you full control over your data and deployment.
+
+## Why Self-Host?
+
+* **Data ownership**: Keep all CRM data on your own servers
+* **Compliance**: Meet regulatory requirements for data residency
+* **Customization**: Full access to modify and extend the platform
+
+## Getting Started
+
+
+
+ Quick setup with Docker
+
+
+
+ Deploy on AWS, GCP, or Azure
+
+
diff --git a/packages/twenty-docs/l/ko/navigation.json b/packages/twenty-docs/l/ko/navigation.json
index e67fcee072..8096fbf4ac 100644
--- a/packages/twenty-docs/l/ko/navigation.json
+++ b/packages/twenty-docs/l/ko/navigation.json
@@ -3,89 +3,201 @@
"userGuide": {
"label": "User Guide",
"groups": {
- "gettingStarted": {
- "label": "시작하기"
+ "discoverTwenty": {
+ "label": "Discover Twenty",
+ "groups": {
+ "gettingStartedCapabilities": {
+ "label": "Capabilities"
+ },
+ "gettingStartedHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"dataModel": {
- "label": "데이터 모델"
+ "label": "Data Model",
+ "groups": {
+ "dataModelCapabilities": {
+ "label": "Capabilities"
+ },
+ "dataModelHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "crmEssentials": {
- "label": "CRM 필수 요소"
+ "dataMigration": {
+ "label": "Data Migration",
+ "groups": {
+ "dataMigrationCapabilities": {
+ "label": "Capabilities"
+ },
+ "dataMigrationHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "views": {
- "label": "보기들"
+ "calendarEmails": {
+ "label": "Calendar & Emails",
+ "groups": {
+ "calendarEmailsCapabilities": {
+ "label": "Capabilities"
+ },
+ "calendarEmailsHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"workflows": {
- "label": "Workflows"
+ "label": "Workflows",
+ "groups": {
+ "workflowsCapabilities": {
+ "label": "Capabilities"
+ },
+ "workflowsHowTos": {
+ "label": "How-Tos",
+ "groups": {
+ "crmAutomations": {
+ "label": "CRM Automations"
+ },
+ "connectToOtherTools": {
+ "label": "Connect to Other Tools"
+ },
+ "advancedConfigurations": {
+ "label": "Advanced Configurations"
+ },
+ "needMoreHelp": {
+ "label": "Need More Help"
+ }
+ }
+ }
+ }
},
- "collaboration": {
- "label": "협업"
+ "ai": {
+ "label": "AI",
+ "groups": {
+ "aiCapabilities": {
+ "label": "Capabilities"
+ },
+ "aiHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "integrationsApi": {
- "label": "Integrations & API"
+ "viewsPipelines": {
+ "label": "Views & Pipelines",
+ "groups": {
+ "viewsPipelinesCapabilities": {
+ "label": "Capabilities"
+ },
+ "viewsPipelinesHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "reporting": {
- "label": "Reporting"
+ "dashboards": {
+ "label": "Dashboards",
+ "groups": {
+ "dashboardsCapabilities": {
+ "label": "Capabilities"
+ },
+ "dashboardsHowTos": {
+ "label": "How-Tos"
+ }
+ }
+ },
+ "permissionsAccess": {
+ "label": "Permissions & Access",
+ "groups": {
+ "permissionsAccessCapabilities": {
+ "label": "Capabilities"
+ },
+ "permissionsAccessHowTos": {
+ "label": "How-Tos"
+ }
+ }
+ },
+ "billing": {
+ "label": "Billing",
+ "groups": {
+ "billingCapabilities": {
+ "label": "Capabilities"
+ },
+ "billingHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"settings": {
- "label": "설정"
- },
- "pricing": {
- "label": "가격"
- },
- "resources": {
- "label": "자료"
+ "label": "Settings",
+ "groups": {
+ "settingsCapabilities": {
+ "label": "Capabilities"
+ },
+ "settingsHowTos": {
+ "label": "How-Tos"
+ }
+ }
}
}
},
"developers": {
- "label": "개발자",
+ "label": "Developers",
"groups": {
"developersGroup": {
- "label": "개발자"
+ "label": "Developers"
},
- "devGettingStarted": {
- "label": "시작하기",
+ "extend": {
+ "label": "Extend",
"groups": {
- "selfHosting": {
- "label": "셀프 호스팅"
- },
- "apiAndWebhooks": {
- "label": "API 및 웹훅"
+ "extendCapabilities": {
+ "label": "Capabilities"
}
}
},
- "contributing": {
- "label": "기여",
+ "selfHost": {
+ "label": "Self-Host",
"groups": {
- "frontendDevelopment": {
- "label": "프론트엔드 개발",
+ "selfHostCapabilities": {
+ "label": "Capabilities"
+ }
+ }
+ },
+ "contribute": {
+ "label": "Contribute",
+ "groups": {
+ "contributeCapabilities": {
+ "label": "Capabilities",
"groups": {
- "twentyUi": {
- "label": "Twenty UI",
+ "frontendDevelopment": {
+ "label": "Frontend Development",
"groups": {
- "display": {
- "label": "표시"
- },
- "feedback": {
- "label": "피드백"
- },
- "input": {
- "label": "입력"
- },
- "navigation": {
- "label": "네비게이션"
+ "twentyUi": {
+ "label": "Twenty UI",
+ "groups": {
+ "display": {
+ "label": "Display"
+ },
+ "feedback": {
+ "label": "Feedback"
+ },
+ "input": {
+ "label": "Input"
+ },
+ "navigation": {
+ "label": "Navigation"
+ }
+ }
}
}
+ },
+ "backendDevelopment": {
+ "label": "Backend Development"
}
}
- },
- "backendDevelopment": {
- "label": "백엔드 개발"
}
}
}
}
}
}
-}
\ No newline at end of file
+}
diff --git a/packages/twenty-docs/l/ko/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/ko/twenty-ui/display/app-tooltip.mdx
index c36674c726..4e620eedc7 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/display/app-tooltip.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/display/app-tooltip.mdx
@@ -1,50 +1,78 @@
---
-title: 앱 툴팁
+title: App Tooltip
image: /images/user-guide/tips/light-bulb.png
---
-
+
-요소와 상호작용할 때 추가 정보를 표시하는 간단한 메시지입니다.
+A brief message that displays additional information when a user interacts with an element.
-
+
```jsx
- import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";\n\nexport const MyComponent = () => {\n return (\n <>\n \n 고객 인사이트\n
\n \n >\n );\n};
+ import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
+
+ export const MyComponent = () => {
+ return (
+ <>
+
+ Customer Insights
+
+
+ >
+ );
+ };
```
-
- | 프로퍼티 | 유형 | 설명 |
- | ------ | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
- | 클래스 네임 | 문자열 | 추가 스타일링을 위한 선택적 CSS 클래스 |
- | 앵커 선택 | CSS 선택자 | 툴팁 앵커(툴팁을 트리거하는 요소)의 선택자 |
- | 내용 | 문자열 | 툴팁 내에 표시할 내용을 입력하세요 |
- | 지연 숨기기 | 숫자 | 커서가 앵커를 떠난 후 툴팁이 숨겨지기까지의 지연 시간(초) |
- | 오프셋 | 숫자 | 툴팁 위치 조건을 위한 픽셀 단위의 오프셋 |
- | 화살표 없음 | 부울 | `true`이면 툴팁의 화살표가 숨겨집니다 |
- | 열림 여부 | 부울 | `true`이면 툴팁이 기본적으로 열려 있습니다 |
- | 위치 | `react-tooltip`의 `PlacesType` 문자열 | 툴팁의 배치를 지정합니다. 값으로는 `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, `left-end` 등이 있습니다. |
- | 위치 전략 | `react-tooltip`의 `PositionStrategy` 문자열 | 툴팁에 대한 위치 전략입니다. 두 가지 값: `absolute` 및 `fixed` |
+
+ | Props | Type | Description |
+ | ---------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional CSS class for additional styling |
+ | anchorSelect | CSS selector | Selector for the tooltip anchor (the element that triggers the tooltip) |
+ | content | string | The content you want to display within the tooltip |
+ | delayHide | number | The delay in seconds before hiding the tooltip after the cursor leaves the anchor |
+ | offset | number | The offset in pixels for positioning the tooltip |
+ | noArrow | boolean | If `true`, hides the arrow on the tooltip |
+ | isOpen | boolean | If `true`, the tooltip is open by default |
+ | place | `PlacesType` string from `react-tooltip` | Specifies the placement of the tooltip. Values include `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, and `left-end` |
+ | positionStrategy | `PositionStrategy` string from `react-tooltip` | Position strategy for the tooltip. Has two values: `absolute` and `fixed` |
-## 툴팁이 포함된 오버플로 텍스트
+## Overflowing Text with Tooltip
-텍스트가 넘칠 경우 처리하고 툴팁을 표시합니다.
+Handles overflowing text and displays a tooltip when the text overflows.
-
+
```jsx
- import { OverflowingTextWithTooltip } from 'twenty-ui/display';\n\nexport const MyComponent = () => {\n const crmTaskDescription =\n '최근 제품 문의에 대한 클라이언트의 후속 조치 사항을 따릅니다. 가격 옵션을 논의하고, 우려 사항을 해결하며, 추가 제품 정보를 제공합니다. 대화 내용을 미래 참조를 위해 CRM에 기록하세요.';\n\n return ;\n};
+ import { OverflowingTextWithTooltip } from 'twenty-ui/display';
+
+ export const MyComponent = () => {
+ const crmTaskDescription =
+ 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
+
+ return ;
+ };
```
-
- | 프로퍼티 | 유형 | 설명 |
- | ---- | --- | -------------------------- |
- | 텍스트 | 문자열 | 오버플로 텍스트 영역에 표시할 내용을 입력하세요 |
+
+ | Props | Type | Description |
+ | ----- | ------ | ------------------------------------------------------------ |
+ | text | string | The content you want to display in the overflowing text area |
diff --git a/packages/twenty-docs/l/ko/twenty-ui/display/checkmark.mdx b/packages/twenty-docs/l/ko/twenty-ui/display/checkmark.mdx
index d3bfe602af..ef84d5c2d5 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/display/checkmark.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/display/checkmark.mdx
@@ -1,5 +1,5 @@
---
-title: 체크마크
+title: Checkmark
image: /images/user-guide/tasks/tasks_header.png
---
@@ -7,63 +7,52 @@ image: /images/user-guide/tasks/tasks_header.png
-성공하거나 완료된 작업을 나타냅니다.
+Represents a successful or completed action.
-
+
+ ```jsx
+ import { Checkmark } from 'twenty-ui/display';
-```jsx
-import { Checkmark } from 'twenty-ui/display';
-
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-
-`React.ComponentPropsWithoutRef<'div'>` 를 확장하며 일반 `div` 요소의 모든 속성을 수용합니다.
-
-
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+ Extends `React.ComponentPropsWithoutRef<'div'>` and accepts all the props of a regular `div` element.
+
-## 애니메이션 체크마크
+## Animated Checkmark
-애니메이션 기능이 추가된 체크마크 아이콘을 나타냅니다.
+Represents a checkmark icon with the added feature of animation.
+
+ ```jsx
+ import { AnimatedCheckmark } from 'twenty-ui/display';
-
-
-```jsx
-import { AnimatedCheckmark } from 'twenty-ui/display';
-
-export const MyComponent = () => {
- return (
-
- );
-};
-```
-
-
-
-
-
-| 프로퍼티 | 유형 | 설명 | 기본값 |
-| ----------- | --- | ------------------------------------------ | -------------------- |
-| isAnimating | 부울 | 체크마크가 애니메이션 중인지 여부를 제어합니다. | 거짓 |
-| 색상 | 문자열 | 체크마크의 색상 | |
-| 지속 시간 | 숫자 | 애니메이션의 지속 시간(초) | 0.5초 |
-| 크기 | 숫자 | 체크마크의 크기 | 28 픽셀 |
-
-
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+ | Props | Type | Description | Default |
+ | ----------- | ------- | ------------------------------------------- | ----------- |
+ | isAnimating | boolean | Controls whether the checkmark is animating | false |
+ | color | string | Color of the checkmark | |
+ | duration | number | The duration of the animation in seconds | 0.5 seconds |
+ | size | number | The size of the checkmark | 28 pixels |
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/display/chip.mdx b/packages/twenty-docs/l/ko/twenty-ui/display/chip.mdx
new file mode 100644
index 0000000000..ded2fd1c77
--- /dev/null
+++ b/packages/twenty-docs/l/ko/twenty-ui/display/chip.mdx
@@ -0,0 +1,138 @@
+---
+title: Chip
+image: /images/user-guide/github/github-header.png
+---
+
+
+
+
+
+A visual element that you can use as a clickable or non-clickable container with a label, optional left and right components, and various styling options to display labels and tags.
+
+
+
+ ```jsx
+ import { Chip } from 'twenty-ui/components';
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------ | ------------------------ | -------------------------------------------------------------------------------------------- |
+ | linkToEntity | string | The link to the entity |
+ | entityId | string | The unique identifier for the entity |
+ | name | string | The name of the entity |
+ | pictureUrl | string | s picture", |
+ | avatarType | Avatar Type | The type of avatar you want to display. Has two options: `rounded` and `squared` |
+ | variant | `EntityChipVariant` enum | Variant of the entity chip you want to display. Has two options: `regular` and `transparent` |
+ | LeftIcon | IconComponent | A React component representing an icon. Displayed on the left side of the chip |
+
+
+
+## Examples
+
+### Transparent Disabled Chip
+
+```jsx
+import { Chip } from 'twenty-ui/components';
+
+export const MyComponent = () => {
+ return (
+
+ );
+};
+
+```
+
+
+
+### Disabled Chip with Tooltip
+
+```jsx
+import { Chip } from "twenty-ui/components";
+
+export const MyComponent = () => {
+ return (
+
+ );
+};
+```
+
+## Entity Chip
+
+A Chip-like element to display information about an entity.
+
+
+
+ ```jsx
+ import { BrowserRouter as Router } from 'react-router-dom';
+ import { IconTwentyStar } from 'twenty-ui/display';
+ import { Chip } from 'twenty-ui/components';
+
+ export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------ | ------------------------ | -------------------------------------------------------------------------------------------- |
+ | linkToEntity | string | The link to the entity |
+ | entityId | string | The unique identifier for the entity |
+ | name | string | The name of the entity |
+ | pictureUrl | string | s picture", |
+ | avatarType | Avatar Type | The type of avatar you want to display. Has two options: `rounded` and `squared` |
+ | variant | `EntityChipVariant` enum | Variant of the entity chip you want to display. Has two options: `regular` and `transparent` |
+ | LeftIcon | IconComponent | A React component representing an icon. Displayed on the left side of the chip |
+
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/display/icons.mdx b/packages/twenty-docs/l/ko/twenty-ui/display/icons.mdx
index 9b3c77db87..2d73154c8d 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/display/icons.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/display/icons.mdx
@@ -1,5 +1,5 @@
---
-title: 아이콘들
+title: Icons
image: /images/user-guide/objects/objects.png
---
@@ -7,77 +7,67 @@ image: /images/user-guide/objects/objects.png
-앱 전반에 걸쳐 사용되는 아이콘 목록입니다.
+A list of icons used throughout our app.
-## 타블러 아이콘
+## Tabler Icons
-앱 전반에 걸쳐 React에 타블러 아이콘을 사용합니다.
+We use Tabler icons for React throughout the app.
+
+
-
+ ```
+ yarn add @tabler/icons-react
+ ```
+
-```
-yarn add @tabler/icons-react
-```
+
+ You can import each icon as a component. Here's an example:
-
+
-
+ ```jsx
+ import { IconArrowLeft } from "@tabler/icons-react";
-각 아이콘을 컴포넌트로 가져올 수 있습니다. Here's an example:
-
-```jsx
-import { IconArrowLeft } from "@tabler/icons-react";
-
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-
-| 프로퍼티 | 유형 | 설명 | 기본값 |
-| ---- | --- | ------------------ | ------------ |
-| 크기 | 숫자 | 픽셀 단위의 아이콘 높이와 너비 | 24 |
-| 색상 | 문자열 | 아이콘의 색상 | currentColor |
-| 스트로크 | 숫자 | 픽셀 단위의 아이콘 스트로크 너비 | 2 |
-
-
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+ | Props | Type | Description | Default |
+ | ------ | ------ | ------------------------------------------ | ------------ |
+ | size | number | The height and width of the icon in pixels | 24 |
+ | color | string | The color of the icons | currentColor |
+ | stroke | number | The stroke width of the icon in pixels | 2 |
+
-## 커스텀 아이콘
+## Custom Icons
-타블러 아이콘 외에도 앱에는 일부 커스텀 아이콘이 사용됩니다.
+In addition to Tabler icons, the app also uses some custom icons.
-### 아이콘 주소록
+### Icon Address Book
-주소록 아이콘을 표시합니다.
+Displays an address book icon.
+
+ ```jsx
+ import { IconAddressBook } from 'twenty-ui/display';
-
-
-```jsx
-import { IconAddressBook } from 'twenty-ui/display';
-
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-
-| 프로퍼티 | 유형 | 설명 | 기본값 |
-| ---- | -- | ------------------ | --- |
-| 크기 | 숫자 | 픽셀 단위의 아이콘 높이와 너비 | 24 |
-| 스트로크 | 숫자 | 픽셀 단위의 아이콘 스트로크 너비 | 2 |
-
-
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+ | Props | Type | Description | Default |
+ | ------ | ------ | ------------------------------------------ | ------- |
+ | size | number | The height and width of the icon in pixels | 24 |
+ | stroke | number | The stroke width of the icon in pixels | 2 |
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/display/soon-pill.mdx b/packages/twenty-docs/l/ko/twenty-ui/display/soon-pill.mdx
new file mode 100644
index 0000000000..56ace0bae7
--- /dev/null
+++ b/packages/twenty-docs/l/ko/twenty-ui/display/soon-pill.mdx
@@ -0,0 +1,18 @@
+---
+title: Soon Pill
+image: /images/user-guide/kanban-views/kanban.png
+---
+
+
+
+
+
+A small badge or "pill" to indicate something is coming soon.
+
+```jsx
+import { SoonPill } from "@/ui/display/pill/components/SoonPill";
+
+export const MyComponent = () => {
+ return ;
+};
+```
diff --git a/packages/twenty-docs/l/ko/twenty-ui/display/tag.mdx b/packages/twenty-docs/l/ko/twenty-ui/display/tag.mdx
index e6c5ac8969..a2226c88d4 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/display/tag.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/display/tag.mdx
@@ -1,5 +1,5 @@
---
-title: 태그
+title: Tag
image: /images/user-guide/table-views/table.png
---
@@ -7,38 +7,32 @@ image: /images/user-guide/table-views/table.png
-콘텐츠를 시각적으로 분류하거나 라벨을 붙이는 구성 요소입니다.
+Component to visually categorize or label content.
+
+ ```jsx
+ import { Tag } from "@/ui/display/tag/components/Tag";
-
-
-```jsx
-import { Tag } from "@/ui/display/tag/components/Tag";
-
-export const MyComponent = () => {
- return (
- console.log("click")}
- />
- );
-};
-```
-
-
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| ------- | -------- | ------------------------------------------------------------------------------------------------------------------- |
-| 클래스 네임 | 문자열 | 추가 스타일을 위한 선택적 이름 |
-| 색상 | 문자열 | 태그의 색상. 옵션은 `녹색`, `터키옥색`, `하늘색`, `파랑`, `보라색`, `핑크`, `빨강`, `오렌지`, `노랑`, `회색`을 포함합니다. |
-| 텍스트 | 문자열 | 태그의 콘텐츠 |
-| onClick | function | 사용자가 태그를 클릭할 때 호출되는 선택적 함수 |
-
-
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+ | Props | Type | Description |
+ | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | color | string | Color of the tag. Options include: `green`, `turquoise`, `sky`, `blue`, `purple`, `pink`, `red`, `orange`, `yellow`, `gray` |
+ | text | string | The content of the tag |
+ | onClick | function | Optional function called when a user clicks on the tag |
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/input.mdx b/packages/twenty-docs/l/ko/twenty-ui/input.mdx
index 74f860155d..2da701caf5 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/input.mdx
@@ -1,8 +1,8 @@
---
-title: 입력
+title: Input
image: /images/user-guide/tips/light-bulb.png
---
-
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/input/block-editor.mdx b/packages/twenty-docs/l/ko/twenty-ui/input/block-editor.mdx
index ebbb0ac9a6..9943fa5f5d 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/input/block-editor.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/input/block-editor.mdx
@@ -1,5 +1,5 @@
---
-title: 블록 편집기
+title: Block Editor
image: /images/user-guide/api/api.png
---
@@ -7,28 +7,25 @@ image: /images/user-guide/api/api.png
-사용자는 [BlockNote](https://www.blocknotejs.org/)의 블록 기반 리치 텍스트 편집기를 사용해 콘텐츠 블록을 편집하고 볼 수 있습니다.
+Uses a block-based rich text editor from [BlockNote](https://www.blocknotejs.org/) to allow users to edit and view blocks of content.
-
+
+ ```jsx
+ import { useBlockNote } from "@blocknote/react";
+ import { BlockEditor } from "@/ui/input/editor/components/BlockEditor";
-```jsx
-import { useBlockNote } from "@blocknote/react";
-import { BlockEditor } from "@/ui/input/editor/components/BlockEditor";
+ export const MyComponent = () => {
+ const BlockNoteEditor = useBlockNote();
-export const MyComponent = () => {
- const BlockNoteEditor = useBlockNote();
+ return ;
+ };
+ ```
+
- return ;
-};
-```
-
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| ---- | ----------------- | ----------------- |
-| 편집기 | `BlockNoteEditor` | 블록 편집기 인스턴스 또는 구성 |
-
-
+
+ | Props | Type | Description |
+ | ------ | ----------------- | ------------------------------------------ |
+ | editor | `BlockNoteEditor` | The block editor instance or configuration |
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/input/buttons.mdx b/packages/twenty-docs/l/ko/twenty-ui/input/buttons.mdx
new file mode 100644
index 0000000000..1c53eb1816
--- /dev/null
+++ b/packages/twenty-docs/l/ko/twenty-ui/input/buttons.mdx
@@ -0,0 +1,439 @@
+---
+title: Buttons
+image: /images/user-guide/views/filter.png
+---
+
+
+
+
+
+A list of buttons and button groups used throughout the app.
+
+## Button
+
+
+
+ ```jsx
+ import { Button } from "@/ui/input/button/components/Button";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional class name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | fullWidth | boolean | Defines whether the button should span the whole width of its container |
+ | variant | string | The visual style variant of the button. Options include `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` |
+ | accent | string | The accent color of the button. Options include: `default`, `blue`, and `danger` |
+ | soon | boolean | Indicates if the button is marked as "soon" (such as for upcoming features) |
+ | disabled | boolean | Specifies whether the button is disabled or not |
+ | focus | boolean | Determines if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Button Group
+
+
+
+ ```jsx
+ import { Button } from "@/ui/input/button/components/Button";
+ import { ButtonGroup } from "@/ui/input/button/components/ButtonGroup";
+
+ export const MyComponent = () => {
+ return (
+
+ console.log("click")}
+ />
+ console.log("click")}
+ />
+ console.log("click")}
+ />
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------- | ---------------------------------------------------------------------------------------------------------------- |
+ | variant | string | The visual style variant of the buttons within the group. Options include `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the buttons within the group. Has two options: `medium` and `small` |
+ | accent | string | The accent color of the buttons within the group. Options include `default`, `blue` and `danger` |
+ | className | string | Optional class name for additional styling |
+ | children | ReactNode | An array of React elements representing the individual buttons within the group |
+
+
+
+## Floating Button
+
+
+
+ ```jsx
+ import { FloatingButton } from "@/ui/input/button/components/FloatingButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | --------------------- | ---------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `middle`, `right` |
+ | applyShadow | boolean | Determines whether to apply shadow to a button |
+ | applyBlur | boolean | Determines whether to apply a blur effect to the button |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+
+
+
+## Floating Button Group
+
+
+
+ ```jsx
+ import { FloatingButton } from "@/ui/input/button/components/FloatingButton";
+ import { FloatingButtonGroup } from "@/ui/input/button/components/FloatingButtonGroup";
+ import { IconClipboardText, IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+
+
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | -------- | --------- | ------------------------------------------------------------------------------- | ------- |
+ | size | string | The size of the button. Has two options: `small` and `medium` | small |
+ | children | ReactNode | An array of React elements representing the individual buttons within the group | |
+
+
+
+## Floating Icon Button
+
+
+
+ ```jsx
+ import { FloatingIconButton } from "@/ui/input/button/components/FloatingIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ isActive={true}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` |
+ | applyShadow | boolean | Determines whether to apply shadow to a button |
+ | applyBlur | boolean | Determines whether to apply a blur effect to the button |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+ | isActive | boolean | Determines if the button is in an active state |
+
+
+
+## Floating Icon Button Group
+
+
+
+ ```jsx
+ import { FloatingIconButtonGroup } from "@/ui/input/button/components/FloatingIconButtonGroup";
+ import { IconClipboardText, IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ const iconButtons = [
+ {
+ Icon: IconClipboardText,
+ onClick: () => console.log("Button 1 clicked"),
+ isActive: true,
+ },
+ {
+ Icon: IconCheckbox,
+ onClick: () => console.log("Button 2 clicked"),
+ isActive: true,
+ },
+ ];
+
+ return (
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | iconButtons | array | An array of objects, each representing an icon button in the group. Each object should include the icon component you want to display in the button, the function you want to call when a user clicks on the button, and whether the button should be active or not. |
+
+
+
+## Light Button
+
+
+
+ ```jsx
+ import { LightButton } from "@/ui/input/button/components/LightButton";
+
+ export const MyComponent = () => {
+ return console.log('click')}
+ />;
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ----------------- | --------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | icon | `React.ReactNode` | The icon you want to display in the button |
+ | title | string | The text content of the button |
+ | accent | string | The accent color of the button. Options include: `secondary` and `tertiary` |
+ | active | boolean | Determines if the button is in an active state |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Light Icon Button
+
+
+
+ ```jsx
+ import { LightIconButton } from "@/ui/input/button/components/LightIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------------------- | --------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | testId | string | Test identifier for the button |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | accent | string | The accent color of the button. Options include: `secondary` and `tertiary` |
+ | active | boolean | Determines if the button is in an active state |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Main Button
+
+
+
+ ```jsx
+ import { MainButton } from "@/ui/input/button/components/MainButton";
+ import { IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------------- | -------------------------------- | --------------------------------------------------------------------------------- |
+ | title | string | The text content of the button |
+ | fullWidth | boolean | Defines whether the button should span the whole width of its container |
+ | variant | string | The visual style variant of the button. Options include `primary` and `secondary` |
+ | soon | boolean | Indicates if the button is marked as "soon" (such as for upcoming features) |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | React `button` props | `React.ComponentProps<'button'>` | All standard HTML button props are supported |
+
+
+
+## Rounded Icon Button
+
+
+
+ ```jsx
+ import { RoundedIconButton } from "@/ui/input/button/components/RoundedIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------------- | ----------------------------------------------- | ----------- |
+ | Icon | `React.ComponentType` | |
+ | React `button` props | `React.ButtonHTMLAttributes` | |
+
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/input/checkbox.mdx b/packages/twenty-docs/l/ko/twenty-ui/input/checkbox.mdx
index 027ef5da9c..b25eeba052 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/input/checkbox.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/input/checkbox.mdx
@@ -1,16 +1,16 @@
---
-title: 체크박스
+title: Checkbox
image: /images/user-guide/tasks/tasks_header.png
---
-
+
-사용자가 여러 옵션 중 여러 값을 선택해야 할 때 사용됩니다.
+Used when a user needs to select multiple values from several options.
-
+
```jsx
import { Checkbox } from "twenty-ui/display";
@@ -30,15 +30,15 @@ image: /images/user-guide/tasks/tasks_header.png
```
-
- | 프로퍼티 | 유형 | 설명 |
- | --------------- | --- | ----------------------------------------------------------------- |
- | 체크됨 | 부울 | 체크박스가 체크된 상태인지 나타냅니다 |
- | 불확정 | 부울 | 체크박스가 불확정 상태(체크되지 않음과 체크됨의 중간)에 있는지 나타냅니다 |
- | onChange | 함수 | 체크박스 상태가 변경될 때 호출할 콜백 함수입니다. |
- | onCheckedChange | 함수 | `checked` 상태가 변경될 때 호출할 콜백 함수입니다. |
- | 변형 | 문자열 | 박스의 시각적 스타일 변형입니다. 옵션에는 `primary`, `secondary`, `tertiary`가 포함됩니다 |
- | 크기 | 문자열 | 체크박스의 크기입니다. 두 가지 옵션이 있습니다: `small`과 `large` |
- | 모양 | 문자열 | 체크박스의 모양입니다. 두 가지 옵션이 있습니다: `squared`와 `rounded` |
+
+ | Props | Type | Description |
+ | --------------- | -------- | -------------------------------------------------------------------------------------------- |
+ | checked | boolean | Indicates whether the checkbox is checked |
+ | indeterminate | boolean | Indicates whether the checkbox is in an indeterminate state (neither checked nor unchecked) |
+ | onChange | function | The callback function you want to trigger when the checkbox state changes |
+ | onCheckedChange | function | The callback function you want to trigger when the `checked` state changes |
+ | variant | string | The visual style variant of the box. Options include: `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the checkbox. Has two options: `small` and `large` |
+ | shape | string | The shape of the checkbox. Has two options: `squared` and `rounded` |
diff --git a/packages/twenty-docs/l/ko/twenty-ui/input/color-scheme.mdx b/packages/twenty-docs/l/ko/twenty-ui/input/color-scheme.mdx
index 57edbd6980..1b1505d481 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/input/color-scheme.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/input/color-scheme.mdx
@@ -1,5 +1,5 @@
---
-title: 색 구성표
+title: Color Scheme
image: /images/user-guide/fields/field.png
---
@@ -7,67 +7,57 @@ image: /images/user-guide/fields/field.png
-## 색상 구성표 카드
+## Color Scheme Card
-다양한 색상 구성표를 나타내며, 밝은 테마와 어두운 테마를 위해 특별히 설계되었습니다.
+Represents different color schemes and is specially tailored for light and dark themes.
-
+
+ ```jsx
+ import { ColorSchemeCard } from "twenty-ui/display";
-```jsx
-import { ColorSchemeCard } from "twenty-ui/display";
-
-export const MyComponent = () => {
- return (
-
- );
-};
-```
-
-
-
-
-
-| 프로퍼티 | 유형 | 설명 | 기본값 |
-| ----- | --------------------------------------- | ----------------------------------------------------------------------------------- | --- |
-| 변형 | 문자열 | 색상 구성표 변형. 옵션에는 `Dark`, `Light`, 및 `System`이 포함됩니다. | 라이트 |
-| 선택됨 | 부울 | `true`이면 선택한 색상 구성표를 나타내는 체크 표시가 나타납니다. | |
-| 추가 속성 | `React.ComponentPropsWithoutRef<'div'>` | 기본 HTML `div` 요소 속성 | |
-
-
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+ | Props | Type | Description | Default |
+ | ---------------- | --------------------------------------- | ----------------------------------------------------------------------- | ------- |
+ | variant | string | The color scheme variant. Options include `Dark`, `Light`, and `System` | light |
+ | selected | boolean | If `true`, displays a checkmark to indicate the selected color scheme | |
+ | additional props | `React.ComponentPropsWithoutRef<'div'>` | Standard HTML `div` element props | |
+
-## 색상 구성표 선택기
+## Color Scheme Picker
-사용자가 다양한 색상 구성표를 선택할 수 있도록 합니다.
+Allows users to choose between different color schemes.
-
+
+ ```jsx
+ import { ColorSchemePicker } from "twenty-ui/display";
-```jsx
-import { ColorSchemePicker } from "twenty-ui/display";
-
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| -------- | -------- | ----------------------------- |
-| 값 | `색 구성표` | 현재 선택된 색상 구성표 |
-| onChange | function | 사용자가 색상 구성표를 선택할 때 트리거할 콜백 함수 |
-
-
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+ | Props | Type | Description |
+ | -------- | -------------- | ---------------------------------------------------------------------------- |
+ | value | `Color Scheme` | The currently selected color scheme |
+ | onChange | function | The callback function you want to trigger when a user selects a color scheme |
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/ko/twenty-ui/input/icon-picker.mdx
new file mode 100644
index 0000000000..59d269242e
--- /dev/null
+++ b/packages/twenty-docs/l/ko/twenty-ui/input/icon-picker.mdx
@@ -0,0 +1,52 @@
+---
+title: Icon Picker
+image: /images/user-guide/github/github-header.png
+---
+
+
+
+
+
+A dropdown-based icon picker that allows users to select an icon from a list.
+
+
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import React, { useState } from "react";
+ import { IconPicker } from "@/ui/input/components/IconPicker";
+
+ export const MyComponent = () => {
+
+ const [selectedIcon, setSelectedIcon] = useState("");
+ const handleIconChange = ({ iconKey, Icon }) => {
+ console.log("Selected Icon:", iconKey);
+ setSelectedIcon(iconKey);
+ };
+
+ return (
+
+
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------- |
+ | disabled | boolean | Disables the icon picker if set to `true` |
+ | onChange | function | The callback function triggered when the user selects an icon. It receives an object with `iconKey` and `Icon` properties |
+ | selectedIconKey | string | The key of the initially selected icon |
+ | onClickOutside | function | Callback function triggered when the user clicks outside the dropdown |
+ | onClose | function | Callback function triggered when the dropdown is closed |
+ | onOpen | function | Callback function triggered when the dropdown is opened |
+ | variant | string | The visual style variant of the clickable icon. Options include: `primary`, `secondary`, and `tertiary` |
+
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/input/image-input.mdx b/packages/twenty-docs/l/ko/twenty-ui/input/image-input.mdx
index 9f27f5d1c5..0d563d7c37 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/input/image-input.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/input/image-input.mdx
@@ -1,16 +1,16 @@
---
-title: 이미지 입력
+title: Image Input
image: /images/user-guide/objects/objects.png
---
-
+
-사용자가 이미지를 업로드하고 제거할 수 있도록 합니다.
+Allows users to upload and remove an image.
-
+
```jsx
import { ImageInput } from "@/ui/input/components/ImageInput";
@@ -20,15 +20,15 @@ image: /images/user-guide/objects/objects.png
```
-
- | 프로퍼티 | 유형 | 설명 |
- | ------------ | --- | ----------------------------------------------------- |
- | 사진 | 문자열 | 이미지 소스 URL |
- | onUpload | 함수 | 사용자가 새 이미지를 업로드할 때 호출되는 함수입니다. `File` 객체를 매개변수로 받습니다. |
- | onRemove | 함수 | 사용자가 제거 버튼을 클릭할 때 호출되는 함수입니다. |
- | onAbort | 함수 | 사용자가 이미지 업로드 중 중단 버튼을 클릭할 때 호출되는 함수입니다. |
- | isUploading | 부울 | 이미지가 현재 업로드 중인지 여부를 나타냅니다. |
- | errorMessage | 문자열 | 이미지 입력 아래에 표시할 선택적 오류 메시지입니다. |
- | disabled | 부울 | `true`인 경우 전체 입력이 비활성화되고 버튼을 클릭할 수 없습니다. |
+
+ | Props | Type | Description |
+ | ------------ | -------- | ------------------------------------------------------------------------------------------------- |
+ | picture | string | The image source URL |
+ | onUpload | function | The function called when a user uploads a new image. It receives the `File` object as a parameter |
+ | onRemove | function | The function called when the user clicks on the remove button |
+ | onAbort | function | The function called when a user clicks on the abort button during image upload |
+ | isUploading | boolean | Indicates whether an image is currently being uploaded |
+ | errorMessage | string | An optional error message to display below the image input |
+ | disabled | boolean | If `true`, the entire input is disabled, and the buttons are not clickable |
diff --git a/packages/twenty-docs/l/ko/twenty-ui/input/radio.mdx b/packages/twenty-docs/l/ko/twenty-ui/input/radio.mdx
index f8c6d0c69e..e6246e631f 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/input/radio.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/input/radio.mdx
@@ -1,5 +1,5 @@
---
-title: 라디오
+title: Radio
image: /images/user-guide/create-workspace/workspace-cover.png
---
@@ -7,98 +7,91 @@ image: /images/user-guide/create-workspace/workspace-cover.png
-사용자가 여러 옵션 중에서 하나만 선택할 수 있을 때 사용됩니다.
+Used when users may only choose one option from a series of options.
-
+
+ ```jsx
+ import { Radio } from "twenty-ui/display";
-```jsx
-import { Radio } from "twenty-ui/display";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ const handleRadioChange = (event) => {
+ console.log("Radio button changed:", event.target.checked);
+ };
- const handleRadioChange = (event) => {
- console.log("Radio button changed:", event.target.checked);
- };
-
- const handleCheckedChange = (checked) => {
- console.log("Checked state changed:", checked);
- };
+ const handleCheckedChange = (checked) => {
+ console.log("Checked state changed:", checked);
+ };
- return (
-
- );
-};
+ return (
+
+ );
+ };
-```
+ ```
+
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| --------------- | -------------- | ------------------------------------------------------------------------------------- |
-| 스타일 | `React.CSS` 속성 | 컴포넌트의 추가 인라인 스타일 |
-| 클래스 네임 | 문자열 | 추가 스타일링을 위한 선택적 CSS 클래스 |
-| 체크됨 | 부울 | 라디오 버튼이 체크되었는지 여부를 나타냅니다 |
-| 값 | 문자열 | 라디오 버튼과 연결된 라벨 또는 텍스트 |
-| onChange | function | 선택된 라디오 버튼이 변경될 때 호출되는 기능 |
-| onCheckedChange | function | 라디오 버튼의 `체크` 상태가 변경될 때 호출되는 기능 |
-| 크기 | 문자열 | 라디오 버튼의 크기입니다. 옵션에는 `large`와 `small`이 포함됩니다 |
-| disabled | 부울 | `참`이면 라디오 버튼이 비활성화되어 클릭할 수 없습니다 |
-| 라벨 위치 | 문자열 | 라벨 텍스트의 라디오 버튼에 대한 상대 위치입니다. 두 가지 옵션: `left`와 `right` |
-
-
+
+ | Props | Type | Description |
+ | --------------- | ---------------------- | ------------------------------------------------------------------------------------------------ |
+ | style | `React.CSS` properties | Additional inline styles for the component |
+ | className | string | Optional CSS class for additional styling |
+ | checked | boolean | Indicates whether the radio button is checked |
+ | value | string | The label or text associated with the radio button |
+ | onChange | function | The function called when the selected radio button is changed |
+ | onCheckedChange | function | The function called when the `checked` state of the radio button changes |
+ | size | string | The size of the radio button. Options include: `large` and `small` |
+ | disabled | boolean | If `true`, the radio button is disabled and not clickable |
+ | labelPosition | string | The position of the label text relative to the radio button. Has two options: `left` and `right` |
+
-## 라디오 그룹
+## Radio Group
-관련된 라디오 버튼들을 그룹화합니다.
+Groups together related radio buttons.
-
+
+ ```jsx
+ import React, { useState } from "react";
+ import { Radio, RadioGroup } from "twenty-ui/display";
-```jsx
-import React, { useState } from "react";
-import { Radio, RadioGroup } from "twenty-ui/display";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ const [selectedValue, setSelectedValue] = useState("Option 1");
- const [selectedValue, setSelectedValue] = useState("Option 1");
+ const handleChange = (event) => {
+ setSelectedValue(event.target.value);
+ };
+
+ return (
+
+
+
+
+
+ );
+ };
- const handleChange = (event) => {
- setSelectedValue(event.target.value);
- };
-
- return (
-
-
-
-
-
- );
-};
-
-```
-
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| ------------- | ----------------- | -------------------------------------------------- |
-| 값 | 문자열 | 현재 선택된 라디오 버튼의 값 |
-| onChange | function | 라디오 버튼이 변경될 때 트리거되는 콜백 기능 |
-| onValueChange | function | 그룹에서 선택된 값이 변경될 때 트리거되는 콜백 기능. |
-| children | `React.ReactNode` | Radio와 같은 React 컴포넌트를 자식으로 Radio Group에 전달할 수 있습니다 |
-
-
+ ```
+
+
+ | Props | Type | Description |
+ | ------------- | ----------------- | ---------------------------------------------------------------------------------- |
+ | value | string | The value of the currently selected radio button |
+ | onChange | function | The callback function triggered when the radio button is changed |
+ | onValueChange | function | The callback function triggered when the selected value in the group changes. |
+ | children | `React.ReactNode` | Allows you to pass React components (such as Radio) as children to the Radio Group |
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/input/select.mdx b/packages/twenty-docs/l/ko/twenty-ui/input/select.mdx
index 7e09271450..d685bf4012 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/input/select.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/input/select.mdx
@@ -1,5 +1,5 @@
---
-title: 선택
+title: Select
image: /images/user-guide/what-is-twenty/20.png
---
@@ -7,48 +7,45 @@ image: /images/user-guide/what-is-twenty/20.png
-사용자가 미리 정의된 옵션 목록에서 값을 선택할 수 있도록 합니다.
+Allows users to pick a value from a list of predefined options.
-
+
+ ```jsx
+ import { RecoilRoot } from 'recoil';
+ import { IconTwentyStar } from 'twenty-ui/display';
-```jsx
-import { RecoilRoot } from 'recoil';
-import { IconTwentyStar } from 'twenty-ui/display';
+ import { Select } from '@/ui/input/components/Select';
-import { Select } from '@/ui/input/components/Select';
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
- return (
-
-
-
- );
-};
+ ```
+
-```
-
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| -------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| 클래스 네임 | 문자열 | 추가 스타일링을 위한 선택적 CSS 클래스 |
-| disabled | 부울 | `true`로 설정하면 사용자는 이 구성 요소와 상호작용할 수 없습니다. |
-| 라벨 | 문자열 | `선택` 구성 요소의 목적을 설명하는 라벨 |
-| onChange | function | 선택된 값이 변경될 때 호출되는 함수 |
-| 옵션 | 배열 | `선택된` 구성 요소에 사용할 수 있는 옵션들을 나타냅니다. 각 객체에는 `값`(고유 식별자), `라벨`(고유 식별자) 및 선택적 `아이콘`이 포함된 객체의 배열입니다. |
-| 값 | 문자열 | 현재 선택된 값을 나타냅니다. `옵션` 배열에서 하나의 `값` 속성과 일치해야 합니다. |
-
-
+
+ | Props | Type | Description |
+ | --------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional CSS class for additional styling |
+ | disabled | boolean | When set to `true`, disables user interaction with the component |
+ | label | string | The label to describe the purpose of the `Select` component |
+ | onChange | function | The function called when the selected values change |
+ | options | array | Represents the options available for the `Selected` component. It's an array of objects where each object has a `value` (the unique identifier), `label` (the unique identifier), and an optional `Icon` |
+ | value | string | Represents the currently selected value. It should match one of the `value` properties in the `options` array |
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/input/text.mdx b/packages/twenty-docs/l/ko/twenty-ui/input/text.mdx
new file mode 100644
index 0000000000..8cad1352ae
--- /dev/null
+++ b/packages/twenty-docs/l/ko/twenty-ui/input/text.mdx
@@ -0,0 +1,137 @@
+---
+title: Text
+image: /images/user-guide/notes/notes_header.png
+---
+
+
+
+
+
+## Text Input
+
+Allows users to enter and edit text.
+
+
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import { TextInput } from "@/ui/input/components/TextInput";
+
+ export const MyComponent = () => {
+ const handleChange = (text) => {
+ console.log("Input changed:", text);
+ };
+
+ const handleKeyDown = (event) => {
+ console.log("Key pressed:", event.key);
+ };
+
+ return (
+
+
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | label | string | Represents the label for the input |
+ | onChange | function | The function called when the input value changes |
+ | fullWidth | boolean | Indicates whether the input should take up 100% of the width |
+ | disableHotkeys | boolean | Indicates whether hotkeys are enabled for the input |
+ | error | string | Represents the error message to be displayed. When provided, it also adds an icon error on the right side of the input |
+ | onKeyDown | function | Called when a key is pressed down while the input field is focused. Receives a `React.KeyboardEvent` as an argument |
+ | RightIcon | IconComponent | An optional icon component displayed on the right side of the input |
+
+ The component also accepts other HTML input element props.
+
+
+
+## Autosize Text Input
+
+Text input component that automatically adjusts its height based on the content.
+
+
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import { AutosizeTextInput } from "@/ui/input/components/AutosizeTextInput";
+
+ export const MyComponent = () => {
+ return (
+
+ console.log("onValidate function fired")}
+ minRows={1}
+ placeholder="Write a comment"
+ onFocus={() => console.log("onFocus function fired")}
+ variant="icon"
+ buttonTitle
+ value="Task: "
+ />
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | -------- | --------------------------------------------------------------------------- |
+ | onValidate | function | The callback function you want to trigger when the user validates the input |
+ | minRows | number | The minimum number of rows for the text area |
+ | placeholder | string | The placeholder text you want to display when the text area is empty |
+ | onFocus | function | The callback function you want to trigger when the text area gains focus |
+ | variant | string | The variant of the input. Options include: `default`, `icon`, and `button` |
+ | buttonTitle | string | The title for the button (only applicable for the button variant) |
+ | value | string | The initial value for the text area |
+
+
+
+## Text Area
+
+Allows you to create multi-line text inputs.
+
+
+
+ ```jsx
+ import { TextArea } from "@/ui/input/components/TextArea";
+
+ export const MyComponent = () => {
+ return (
+
+
+
+ | Props | Type | Description |
+ | ----------- | -------- | -------------------------------------------------------------- |
+ | disabled | boolean | Indicates whether the text area is disabled |
+ | minRows | number | Minimum number of visible rows for the text area. |
+ | onChange | function | Callback function triggered when the text area content changes |
+ | placeholder | string | Placeholder text displayed when the text area is empty |
+ | value | string | The current value of the text area |
+
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/input/toggle.mdx b/packages/twenty-docs/l/ko/twenty-ui/input/toggle.mdx
new file mode 100644
index 0000000000..39f1645abd
--- /dev/null
+++ b/packages/twenty-docs/l/ko/twenty-ui/input/toggle.mdx
@@ -0,0 +1,36 @@
+---
+title: Toggle
+image: /images/user-guide/table-views/table.png
+---
+
+
+
+
+
+
+
+ ```jsx
+ import { Toggle } from "twenty-ui/input";
+
+ export const MyComponent = () => {
+ return (
+ console.log('On Change event')}
+ color="green"
+ toggleSize = "medium"
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ---------- | -------- | ------------------------------------------------------------------------------------------- | ------------ |
+ | value | boolean | The current state of the toggle | `false` |
+ | onChange | function | Callback function triggered when the toggle state changes | |
+ | color | string | Color of the toggle when it\ | s blue color |
+ | toggleSize | string | Size of the toggle, affecting both height and weight. Has two options: `small` and `medium` | medium |
+
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/introduction.mdx b/packages/twenty-docs/l/ko/twenty-ui/introduction.mdx
new file mode 100644
index 0000000000..143cb5d7b5
--- /dev/null
+++ b/packages/twenty-docs/l/ko/twenty-ui/introduction.mdx
@@ -0,0 +1,30 @@
+---
+title: Overview
+description: Component library for Twenty CRM
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+## Components
+
+
+
+ Display
+ Display components for showing information visually
+
+
+
+ Feedback
+ Feedback components for user notifications
+
+
+
+ Input
+ Input components for user interaction
+
+
+
+ Navigation
+ Navigation components for user interface
+
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/navigation.mdx b/packages/twenty-docs/l/ko/twenty-ui/navigation.mdx
index e9a819550b..b17dad4220 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/navigation.mdx
@@ -1,8 +1,8 @@
---
-title: 네비게이션
+title: Navigation
image: /images/user-guide/tasks/tasks_header.png
---
-
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/ko/twenty-ui/navigation/breadcrumb.mdx
new file mode 100644
index 0000000000..aadbee8ee4
--- /dev/null
+++ b/packages/twenty-docs/l/ko/twenty-ui/navigation/breadcrumb.mdx
@@ -0,0 +1,41 @@
+---
+title: Breadcrumb
+image: /images/user-guide/fields/field.png
+---
+
+
+
+
+
+Renders a breadcrumb navigation bar.
+
+
+
+ ```jsx
+ import { BrowserRouter } from "react-router-dom";
+ import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
+
+ export const MyComponent = () => {
+ const breadcrumbLinks = [
+ { children: "Home", href: "/" },
+ { children: "Category", href: "/category" },
+ { children: "Subcategory", href: "/category/subcategory" },
+ { children: "Current Page" },
+ ];
+
+ return (
+
+
+
+ )
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional class name for additional styling |
+ | links | array | An array of objects, each representing a breadcrumb link. Each object has a `children` property (the text content of the link) and an optional `href` property (the URL to navigate to when the link is clicked) |
+
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/ko/twenty-ui/navigation/links.mdx
index 216ff17bd0..e9f7e3d80f 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/navigation/links.mdx
@@ -1,5 +1,5 @@
---
-title: 링크
+title: Links
image: /images/user-guide/what-is-twenty/20.png
---
@@ -7,162 +7,148 @@ image: /images/user-guide/what-is-twenty/20.png
-## 연락 링크
+## Contact Link
-연락처 정보를 표시하기 위한 스타일화된 링크 구성 요소입니다.
+A stylized link component for displaying contact information.
-
+
+ ```jsx
+ import { BrowserRouter as Router } from 'react-router-dom';
-```jsx
-import { BrowserRouter as Router } from 'react-router-dom';
+ import { ContactLink } from 'twenty-ui/navigation';
-import { ContactLink } from 'twenty-ui/navigation';
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log('Contact link clicked!', event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log('Contact link clicked!', event);
- };
-
- return (
-
-
- example@example.com
-
-
- );
-};
-```
-
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| -------- | ----------------- | --------------------- |
-| 클래스 네임 | 문자열 | 추가 스타일링을 위한 선택적 이름 |
-| href | 문자열 | 링크의 대상 URL 또는 경로 |
-| 클릭 시 | function | 링크가 클릭될 때 트리거되는 콜백 함수 |
-| children | `React.ReactNode` | 링크 내부에 표시할 콘텐츠 |
-
-
+ return (
+
+
+ example@example.com
+
+
+ );
+ };
+ ```
+
+
+ | Props | Type | Description |
+ | --------- | ----------------- | ---------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | href | string | The target URL or path for the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
+
-## 원시 링크
+## Raw Link
-링크를 표시하기 위한 스타일화된 링크 구성 요소입니다.
+A stylized link component for displaying links.
-
+
+ ```jsx
+ import { RawLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { RawLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("Contact link clicked!", event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
+ return (
+
+
+ Contact Us
+
+
+ );
+ };
- return (
-
-
- Contact Us
-
-
- );
-};
+ ```
+
-```
-
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| -------- | ----------------- | --------------------- |
-| 클래스 네임 | 문자열 | 추가 스타일을 위한 선택적 이름 |
-| href | 문자열 | 링크의 대상 URL 또는 경로 |
-| onClick | function | 링크가 클릭될 때 트리거되는 콜백 함수 |
-| children | `React.ReactNode` | 링크 내부에 표시할 콘텐츠 |
-
-
+
+ | Props | Type | Description |
+ | --------- | ----------------- | ---------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | href | string | The target URL or path for the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
+
-## 둥근 링크
+## Rounded Link
-Chip 구성 요소가 있는 라운드 스타일 링크입니다.
+A rounded-styled link with a Chip component for links.
-
+
+ ```jsx
+ import { RoundedLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { RoundedLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("Contact link clicked!", event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
+ return (
+
+
+ Contact Us
+
+
+ );
+ };
+ ```
+
- return (
-
-
- Contact Us
-
-
- );
-};
-```
-
-
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| -------- | ----------------- | --------------------- |
-| href | 문자열 | 링크의 대상 URL 또는 경로 |
-| children | `React.ReactNode` | 링크 내부에 표시할 콘텐츠 |
-| onClick | function | 링크가 클릭될 때 트리거되는 콜백 함수 |
-
-
+
+ | Props | Type | Description |
+ | -------- | ----------------- | ---------------------------------------------------------- |
+ | href | string | The target URL or path for the link |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+
-## 소셜 링크
+## Social Link
-URL, LinkedIn 및 X(또는 Twitter)와 같은 다양한 소셜 링크 유형을 지원하는 스타일화된 소셜 링크입니다.
+Stylized social links, with support for various social link types, such as URLs, LinkedIn, and X (or Twitter).
-
+
+ ```jsx
+ import { SocialLink } from "twenty-ui/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { SocialLink } from "twenty-ui/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
-
-
-
- );
-};
-```
-
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| -------- | ----------------- | --------------------------------------------------------------------------------------- |
-| href | 문자열 | 링크의 대상 URL 또는 경로 |
-| children | `React.ReactNode` | 링크 내부에 표시할 콘텐츠 |
-| 유형 | 문자열 | 소셜 링크 유형입니다. 옵션은 다음과 같습니다: `url`, `LinkedIn`, `Twitter` |
-| 클릭 시 | function | 링크가 클릭될 때 트리거되는 콜백 함수 |
-
-
+
+ | Props | Type | Description |
+ | -------- | ----------------- | --------------------------------------------------------------------------- |
+ | href | string | The target URL or path for the link |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
+ | type | string | The type of social links. Options include: `url`, `LinkedIn`, and `Twitter` |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/navigation/menu-item.mdx b/packages/twenty-docs/l/ko/twenty-ui/navigation/menu-item.mdx
new file mode 100644
index 0000000000..209c6270ea
--- /dev/null
+++ b/packages/twenty-docs/l/ko/twenty-ui/navigation/menu-item.mdx
@@ -0,0 +1,428 @@
+---
+title: Menu Item
+image: /images/user-guide/kanban-views/kanban.png
+---
+
+
+
+
+
+A versatile menu item designed to be used in a menu or navigation list.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { IconAlertCircle } from "@tabler/icons-react";
+ import { MenuItem } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleMenuItemClick = (event) => {
+ console.log("Menu item clicked!", event);
+ };
+
+ const handleButtonClick = (event) => {
+ console.log("Icon button clicked!", event);
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------- | ------------- | ---------------------------------------------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | accent | string | Specifies the accent color of the menu item. Options include: `default`, `danger`, and `placeholder` |
+ | text | string | The text content of the menu item |
+ | iconButtons | array | An array of objects representing additional icon buttons associated with the menu item |
+ | isTooltipOpen | boolean | Controls the visibility of the tooltip associated with the menu item |
+ | testId | string | The data-testid attribute for testing purposes |
+ | onClick | function | Callback function triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+## Variants
+
+The different variants of the menu item component include the following:
+
+### Command
+
+A command-style menu item within a menu to indicate keyboard shortcuts.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemCommand } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleCommandClick = () => {
+ console.log("Command clicked!");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------ | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | firstHotKey | string | The first keyboard shortcut associated with the command |
+ | secondHotKey | string | The second keyboard shortcut associated with the command |
+ | isSelected | boolean | Indicates whether the menu item is selected or highlighted |
+ | onClick | function | Callback function triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Draggable
+
+A draggable menu item component designed to be used in a menu or list where items can be dragged, and additional actions can be performed through icon buttons.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { IconAlertCircle } from "@tabler/icons-react";
+ import { MenuItemDraggable } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleMenuItemClick = (event) => {
+ console.log("Menu item clicked!", event);
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ------------------------------------------------------------------------------------------ |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | accent | string | The accent color of the menu item. It can either be `default`, `placeholder`, and `danger` |
+ | iconButtons | array | An array of objects representing additional icon buttons associated with the menu item |
+ | isTooltipOpen | boolean | Controls the visibility of the tooltip associated with the menu item |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | text | string | The text content of the menu item |
+ | isDragDisabled | boolean | Indicates whether dragging is disabled |
+ | className | string | Optional name for additional styling |
+
+
+
+### Multi Select
+
+Provides a way to implement multi-select functionality with an associated checkbox.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemMultiSelect } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | onSelectChange | function | Callback function triggered when the checkbox state changes |
+ | className | string | Optional name for additional styling |
+
+
+
+### Multi Select Avatar
+
+A multi-select menu item with an avatar, a checkbox for selection, and textual content.
+
+
+
+ ```jsx
+ import { MenuItemMultiSelectAvatar } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const imageUrl =
+ "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
+
+ return (
+ }
+ text="First Option"
+ selected={false}
+ className
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ----------- | -------------------------------------------------------------------- |
+ | avatar | `ReactNode` | The avatar or icon to be displayed on the left side of the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | onSelectChange | function | Callback function triggered when the checkbox state changes |
+ | className | string | Optional name for additional styling |
+
+
+
+### Navigate
+
+A menu item featuring an optional left icon, textual content, and a right-chevron icon.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemNavigate } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleNavigation = () => {
+ console.log("Navigate to another page");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Select
+
+A selectable menu item, featuring optional left content (icon and text) and an indicator (check icon) for the selected state.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemSelect } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Select Avatar
+
+A selectable menu item with an avatar, featuring optional left content (avatar and text) and an indicator (check icon) for the selected state.
+
+
+
+ ```jsx
+ import { MenuItemSelectAvatar } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const imageUrl =
+ "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
+
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
+
+ return (
+ }
+ text="First Option"
+ selected={true}
+ disabled={false}
+ hovered={false}
+ testId="menu-item-test"
+ onClick={handleSelection}
+ className
+ />
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ----------- | -------------------------------------------------------------------- |
+ | avatar | `ReactNode` | The avatar or icon to be displayed on the left side of the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | testId | string | The data-testid attribute for testing purposes |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Select Color
+
+A selectable menu item with a color sample for scenarios where you want users to choose a color from a menu.
+
+
+
+ ```jsx
+ import { MenuItemSelectColor } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | color | string | The theme color to be displayed as a sample in the menu item. Options include: `green`, `turquoise`, `sky`, `blue`, `purple`, `pink`, `red`, `orange`, `yellow`, and `gray` |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | variant | string | The variant of the color sample. It can either be `default` or `pipeline` |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Toggle
+
+A menu item with an associated toggle switch to allow users to enable or disable a specific feature
+
+
+
+ ```jsx
+ import { IconBell } from '@tabler/icons-react';
+
+ import { MenuItemToggle } from 'twenty-ui/display';
+
+ export const MyComponent = () => {
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ----------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | toggled | boolean | Indicates whether the toggle switch is in the "on" or "off" state |
+ | onToggleChange | function | Callback function triggered when the toggle switch state changes |
+ | toggleSize | string | The size of the toggle switch. It can be either \ |
+ | className | string | Optional name for additional styling |
+
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/ko/twenty-ui/navigation/navigation-bar.mdx
new file mode 100644
index 0000000000..a77e9f34e6
--- /dev/null
+++ b/packages/twenty-docs/l/ko/twenty-ui/navigation/navigation-bar.mdx
@@ -0,0 +1,49 @@
+---
+title: Navigation Bar
+image: /images/user-guide/table-views/table.png
+---
+
+
+
+
+
+Renders a navigation bar that contains multiple `NavigationBarItem` components.
+
+
+
+ ```jsx
+ import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
+ import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
+
+ export const MyComponent = () => {
+
+ const navigationItems = [
+ {
+ name: "Home",
+ Icon: IconHome,
+ onClick: () => console.log("Home clicked"),
+ },
+ {
+ name: "Profile",
+ Icon: IconUser,
+ onClick: () => console.log("Profile clicked"),
+ },
+ {
+ name: "Settings",
+ Icon: IconSettings,
+ onClick: () => console.log("Settings clicked"),
+ },
+ ];
+
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | activeItemName | string | The name of the currently active navigation item |
+ | items | array | An array of objects representing each navigation item. Each object contains the `name` of the item, the `Icon` component to display, and an `onClick` function to be called when the item is clicked |
+
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/ko/twenty-ui/navigation/step-bar.mdx
index fc99944018..66c420f561 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/navigation/step-bar.mdx
@@ -1,34 +1,34 @@
---
-title: 단계 막대
+title: Step Bar
image: /images/user-guide/api/api.png
---
-
+
-활성 단계가 강조 표시되어 있는 다단계 진행 상황을 표시합니다. 각각의 `Step` 구성 요소로 표현되는 단계를 포함하는 컨테이너를 렌더링합니다.
+Displays progress through a sequence of numbered steps by highlighting the active step. It renders a container with steps, each represented by the `Step` component.
-
+
```jsx
import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
export const MyComponent = () => {
return (
- 1단계
- 2단계
- 3단계
+ Step 1
+ Step 2
+ Step 3
);
};
```
-
- | 프로퍼티 | 유형 | 설명 |
- | ---------- | -- | --------------------------------------------------- |
- | activeStep | 숫자 | 현재 활성 단계의 인덱스입니다. 어느 단계가 시각적으로 강조 표시되어야 하는지를 결정합니다. |
+
+ | Props | Type | Description |
+ | ---------- | ------ | ------------------------------------------------------------------------------------------------- |
+ | activeStep | number | The index of the currently active step. This determines which step should be visually highlighted |
diff --git a/packages/twenty-docs/l/ko/twenty-ui/progress-bar.mdx b/packages/twenty-docs/l/ko/twenty-ui/progress-bar.mdx
new file mode 100644
index 0000000000..2e4735ab30
--- /dev/null
+++ b/packages/twenty-docs/l/ko/twenty-ui/progress-bar.mdx
@@ -0,0 +1,66 @@
+---
+title: Feedback
+image: /images/user-guide/emails/emails_header.png
+---
+
+
+
+
+
+Indicates progress or countdown and moves from right to left.
+
+
+
+ ```jsx
+ import { ProgressBar } from "twenty-ui/feedback";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | --------- | ------- | ------------------------------------------------------------------------------------ | --------- |
+ | duration | number | The total duration of the progress bar animation in milliseconds | 3 |
+ | delay | number | The delay in starting the progress bar animation in milliseconds | 0 |
+ | easing | string | Easing function for the progress bar animation | easeInOut |
+ | barHeight | number | The height of the bar in pixels | 24 |
+ | barColor | string | The color of the bar | gray80 |
+ | autoStart | boolean | If `true`, the progress bar animation starts automatically when the component mounts | `true` |
+
+
+
+## Circular Progress Bar
+
+Indicates the progress of a task, often used in loading screens or areas where you want to communicate ongoing processes to the user.
+
+
+
+ ```jsx
+ import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | -------- | ------ | ------------------------------------- | ------------ |
+ | size | number | The size of the circular progress bar | 50 |
+ | barWidth | number | The width of the progress bar line | 5 |
+ | barColor | string | The color of the progress bar | currentColor |
+
+
diff --git a/packages/twenty-docs/l/ko/user-guide/ai/capabilities/ai-agents.mdx b/packages/twenty-docs/l/ko/user-guide/ai/capabilities/ai-agents.mdx
new file mode 100644
index 0000000000..bc746c751b
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/ai/capabilities/ai-agents.mdx
@@ -0,0 +1,34 @@
+---
+title: AI Agents
+description: Integrate AI capabilities directly into your automation workflows.
+---
+
+
+ This feature is in development and will be available in beta soon.
+
+
+## Overview
+
+Integrate AI capabilities directly into your automation workflows for intelligent data processing and decision-making.
+
+## Capabilities
+
+| Feature | Description |
+| ------------------- | ------------------------------------------------ |
+| **AI actions** | Add AI-powered steps to any workflow |
+| **Data enrichment** | Automatically enhance records with external data |
+| **Classification** | Categorize records based on content analysis |
+| **Summarization** | Generate summaries from text fields |
+| **Custom prompts** | Define exactly how AI processes your data |
+
+## Use Cases
+
+* **Lead scoring**: Automatically score and prioritize inbound leads
+* **Data cleanup**: Standardize company names and contact information
+* **Email drafts**: Generate follow-up emails based on meeting notes
+* **Record routing**: Assign records to the right team member based on content
+
+## Related
+
+* [Workflows Overview](/l/ko/user-guide/workflows/overview) — automation basics
+* [AI Permissions](/l/ko/user-guide/ai/capabilities/permissions-access-control) — access control for AI agents
diff --git a/packages/twenty-docs/l/ko/user-guide/ai/capabilities/ai-chatbot.mdx b/packages/twenty-docs/l/ko/user-guide/ai/capabilities/ai-chatbot.mdx
new file mode 100644
index 0000000000..d7cbbc04fc
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/ai/capabilities/ai-chatbot.mdx
@@ -0,0 +1,41 @@
+---
+title: AI Chatbot
+description: An intelligent assistant that helps you interact with your CRM data using natural language.
+---
+
+
+ This feature is in development and will be available in beta soon.
+
+
+## Overview
+
+An intelligent assistant that helps you interact with your CRM data using natural language.
+
+## Capabilities
+
+| Feature | Description |
+| ---------------------------- | ------------------------------------------------------------------------- |
+| **Natural language queries** | Ask questions in plain English instead of building filters |
+| **Full data access** | Query records, relationships, and metrics across your workspace |
+| **Page context** | Reference "this company" or "this opportunity" based on your current view |
+| **Conversational** | Follow-up questions maintain context from previous queries |
+
+## Example Interactions
+
+### Finding Records
+
+* "Show me all opportunities over $50,000"
+* "Find contacts I haven't emailed in 2 weeks"
+* "List companies in the healthcare industry"
+
+### Getting Insights
+
+* "What's my total pipeline value?"
+* "How many deals closed last month?"
+* "Which stage has the most stuck opportunities?"
+
+### Using Page Context
+
+* "Summarize my interactions with this person" (on a contact page)
+* "What opportunities are linked to this company?" (on a company page)
+* "When was this deal last updated?" (on an opportunity page)
diff --git a/packages/twenty-docs/l/ko/user-guide/ai/capabilities/permissions-access-control.mdx b/packages/twenty-docs/l/ko/user-guide/ai/capabilities/permissions-access-control.mdx
new file mode 100644
index 0000000000..804b1ccb98
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/ai/capabilities/permissions-access-control.mdx
@@ -0,0 +1,35 @@
+---
+title: Permissions & Access Control
+description: Control what AI agents can access and modify in your workspace.
+---
+
+## Overview
+
+AI agents respect your existing permission structure. This is particularly important for teams who want to control exactly what automated AI processes can access or modify in their workspace.
+
+## Assign a Role to an AI Agent
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **AI Agents**, click **+ Assign to AI agent**
+5. Select the AI agent from the list
+6. Confirm the assignment
+
+## Why Assign Roles to AI Agents?
+
+| Benefit | Description |
+| ---------------- | ------------------------------------------------- |
+| **Security** | Limit what data AI agents can access or modify |
+| **Compliance** | Ensure AI only processes the data it needs |
+| **Control** | Prevent unintended actions from AI automations |
+| **Auditability** | Track which actions were performed by which agent |
+
+
+ For AI agents running within workflows, role assignment ensures the agent cannot access or modify data outside its intended scope—even if the workflow has broader permissions.
+
+
+## Related
+
+* [Permissions](/l/ko/user-guide/permissions-access/capabilities/permissions) — detailed information on creating and managing roles
+* [AI Agents](/l/ko/user-guide/ai/capabilities/ai-agents) — AI capabilities in workflows
diff --git a/packages/twenty-docs/l/ko/user-guide/ai/how-tos/ai-faq.mdx b/packages/twenty-docs/l/ko/user-guide/ai/how-tos/ai-faq.mdx
new file mode 100644
index 0000000000..774eae15c4
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/ai/how-tos/ai-faq.mdx
@@ -0,0 +1,29 @@
+---
+title: AI FAQ
+description: Frequently asked questions about AI features in Twenty.
+---
+
+
+
+ AI features are currently in development and will be released in beta soon. Stay tuned for updates!
+
+
+
+ We're building two main AI capabilities:
+
+ 1. **AI Chatbot**: A context-aware assistant that can access your Twenty data and help you with queries
+ 2. **AI Agents in Workflows**: Intelligent automation that can process data, make decisions, and execute tasks within your workflows
+
+
+
+ AI agents will operate under the permission system. You can assign specific roles to AI agents under **Settings → Roles**, giving you full control over what data they can access and what actions they can perform.
+
+
+
+ AI actions will consume workflow credits based on the complexity of the task and the AI model used. More details will be available when the features launch.
+
+
+
+ Initially, Twenty will use built-in AI models. Support for custom or external AI models may be added in future releases based on user feedback.
+
+
diff --git a/packages/twenty-docs/l/ko/user-guide/ai/overview.mdx b/packages/twenty-docs/l/ko/user-guide/ai/overview.mdx
new file mode 100644
index 0000000000..bd4ee68a79
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/ai/overview.mdx
@@ -0,0 +1,62 @@
+---
+title: AI
+description: AI-powered features coming soon to Twenty.
+---
+
+
+
+
+
+## What's Coming
+
+Twenty is building AI capabilities to help your team work smarter. We're focusing on two major areas:
+
+### 1. AI Chatbot
+
+A conversational assistant that understands your context and has access to all your Twenty data.
+
+**Key capabilities:**
+
+* **Full data access**: Query any record, relationship, or metric in your workspace
+* **Page context awareness**: Reference "this company" or "this opportunity" based on where you are in Twenty
+* **Natural language**: Ask questions and get answers without navigating menus
+
+**Example prompts:**
+
+* "What opportunities are closing this month?"
+* "Which deals have been in Negotiation for more than 30 days?"
+* "Summarize my interactions with this person"
+
+### 2. AI Agents in Workflows
+
+Extend your workflows with AI-powered actions and autonomous agents.
+
+**Key capabilities:**
+
+* **AI actions**: Use AI to enrich data, classify records, generate summaries, and more
+* **Autonomous agents**: Let agents execute multi-step tasks within a workflow
+* **Custom prompts**: Define exactly how AI should process your data
+
+**Use cases:**
+
+* Automatically categorize inbound leads
+* Enrich company data from public sources
+* Generate follow-up email drafts based on meeting notes
+* Score opportunities based on engagement patterns
+
+## Permissions and Access Control
+
+AI agents will be managed through the existing permissions system:
+
+1. Go to **Settings → Roles**
+2. Configure which data each AI agent can access
+3. Set read/write permissions per object
+
+This ensures AI agents respect your data governance policies and only access what they need.
+
+## Stay Updated
+
+We'll update this section as AI features become available. In the meantime:
+
+* Follow our [GitHub](https://github.com/twentyhq/twenty) for development updates
+* Join our [Discord](https://discord.gg/twenty) to share feedback and feature requests
diff --git a/packages/twenty-docs/l/ko/user-guide/billing/capabilities/pricing-plans.mdx b/packages/twenty-docs/l/ko/user-guide/billing/capabilities/pricing-plans.mdx
new file mode 100644
index 0000000000..90bf7e7cbb
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/billing/capabilities/pricing-plans.mdx
@@ -0,0 +1,79 @@
+---
+title: Pricing Plans
+description: Learn about Twenty's pricing plans and how to switch between them.
+---
+
+## Overview
+
+Twenty offers flexible pricing to fit teams of all sizes, whether you prefer cloud hosting or self-hosting.
+
+## Cloud Plans
+
+### Pro (Cloud)
+
+For teams ready to scale:
+
+* All core CRM features
+* Email and calendar sync
+* Workflows and automations
+* Standard support
+
+
+ Premium features (SSO and row-level permissions) are not included in the Pro plan.
+
+
+### Organization (Cloud)
+
+For larger teams with advanced needs:
+
+* Everything in Pro
+* **Premium features**: SSO integration and row-level permissions
+* Priority support
+
+## Self-Hosted Plans
+
+### Free (Self-Hosted)
+
+Host Twenty on your own infrastructure at no cost:
+
+* All Pro features included
+* Community support via Discord
+* Full control over your data
+
+### Organization (Self-Hosted)
+
+For teams who need premium features while self-hosting:
+
+* All Pro features
+* **Premium features**: SSO integration and row-level permissions
+* Twenty team support
+* No requirement to publish custom code as open-source before distributing
+
+## Premium Features
+
+Premium features are only available on the Organization plans (Cloud or Self-Hosted):
+
+* **SSO integration**: Single Sign-On with your identity provider
+* **Row-level permissions**: Fine-grained access control at the record level
+
+## Switching Plans
+
+### Upgrade to Organization
+
+1. Go to **Settings → Billing**
+2. Click **Switch to Organization**
+3. Confirm your upgrade
+
+### Downgrade to Pro
+
+Contact support to downgrade your plan.
+
+### Switch to Yearly Billing
+
+1. Go to **Settings → Billing**
+2. Click **Switch to Yearly**
+3. Save with annual billing
+
+### Switch to Monthly Billing
+
+Contact support to switch back to monthly billing.
diff --git a/packages/twenty-docs/l/ko/user-guide/billing/capabilities/workflow-credits.mdx b/packages/twenty-docs/l/ko/user-guide/billing/capabilities/workflow-credits.mdx
new file mode 100644
index 0000000000..0ce8e3be72
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/billing/capabilities/workflow-credits.mdx
@@ -0,0 +1,49 @@
+---
+title: Workflow Credits
+description: Understanding workflow credits, consumption, and how to purchase more.
+---
+
+## Overview
+
+Credits power your workflow automations in Twenty. Every workflow action consumes credits based on its complexity.
+
+## Credit Allocation
+
+Credits are based on your billing cycle, not your plan:
+
+| Billing Cycle | Credits |
+| ------------- | --------------- |
+| Monthly | 5 million/month |
+| Yearly | 50 million/year |
+
+
+ The 5 million monthly credits are designed to empower you to run automations without worrying about costs. For most workflows using standard actions, this is more than enough. You'll only need additional credits when running advanced code nodes or AI-powered features.
+
+
+## Credit Consumption
+
+Different actions consume different amounts of credits:
+
+| Action Type | Credit Usage |
+| ------------------------------------------------------- | ----------------------- |
+| **Basic operations** (search, update, create records) | Minimal |
+| **Complex operations** (code nodes, external API calls) | More credits |
+| **AI prompts** (coming soon) | Variable based on usage |
+
+Credits are deducted in real-time when workflows execute.
+
+## Monitoring Usage
+
+Track your credit consumption:
+
+1. Go to **Settings → Billing**
+2. View your current usage and remaining credits
+3. Monitor trends to plan for additional credits if needed
+
+## Purchasing Additional Credits
+
+Need more credits?
+
+1. Go to **Settings → Billing**
+2. Click on the option to purchase additional credit packs
+3. Select the amount you need
diff --git a/packages/twenty-docs/l/ko/user-guide/billing/how-tos/billing-faq.mdx b/packages/twenty-docs/l/ko/user-guide/billing/how-tos/billing-faq.mdx
new file mode 100644
index 0000000000..ee1d560cb1
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/billing/how-tos/billing-faq.mdx
@@ -0,0 +1,86 @@
+---
+title: Billing FAQ
+description: Frequently asked questions about Twenty pricing and billing.
+---
+
+## Pricing
+
+
+
+ Yes, you can use Twenty for free while self-hosting. You will get access to everything included in the Pro (Cloud) plan, except the support from our core-team. Support is accessible via our Discord community.
+
+ If you want to self-host and need the Premium features (SSO and row-level permissions), you can choose the paid Organization (Self-Hosted) license. This also includes support from the Twenty team and removes the requirement to publish custom code as open-source before distributing.
+
+
+
+ Premium features are only available on the Organization plans (Cloud or Self-Hosted):
+
+ * **SSO integration**: Single Sign-On with your identity provider
+ * **Row-level permissions**: Fine-grained access control at the record level
+
+
+
+ We do not offer free seats. Pricing is per user and each user needs a licence to access Twenty.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `Switch to Organization`.
+
+
+
+ Please reach out to our team directly via the Support, there is no easy way to do this using the UI at the moment.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `Switch to Yearly`.
+
+
+
+ Please reach out to our team directly via the Support, there is no easy way to do this using the UI at the moment.
+
+
+
+ You will find this under `Settings → Billing`.
+
+
+
+ The number of credits depends on your billing cycle, not your plan:
+
+ * **Monthly subscriptions**: 5 million credits per month
+ * **Yearly subscriptions**: 50 million credits per year
+
+
+
+ Each workflow action consumes credits based on its complexity:
+
+ * **Basic internal operations** (such as search, update, create records) consume very few credits
+ * **More complex operations** like code nodes and requests to external services consume more credits
+ * **AI prompts** (coming soon!) will also consume more credits based on usage
+
+ Credits are deducted in real-time when workflows execute. You can monitor your usage in **Settings → Billing** to track consumption and remaining credits.
+
+
+
+ You can buy additional credits under `Settings → Billing`.
+
+
+
+## Billing
+
+
+
+ You can do so under `Settings → Billing`.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll be able to add a new payment method there.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll be able to edit the billing information there.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll see all your invoices at the bottom of the screen.
+
+
diff --git a/packages/twenty-docs/l/ko/user-guide/billing/overview.mdx b/packages/twenty-docs/l/ko/user-guide/billing/overview.mdx
new file mode 100644
index 0000000000..3fbc87905d
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/billing/overview.mdx
@@ -0,0 +1,45 @@
+---
+title: Billing
+description: Understand Twenty pricing and manage your subscription.
+image: /images/user-guide/setup/pricing.png
+---
+
+
+
+
+
+Twenty offers flexible pricing plans to fit your team's needs. Manage your subscription, track workflow credits, and access invoices all from **Settings → Billing**.
+
+## What's in this section
+
+
+
+ Learn about Twenty's pricing plans and what's included.
+
+
+
+ Frequently asked questions about pricing and billing.
+
+
+
+## At a glance
+
+| Plan | Key Features |
+| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| **Free (Self-Hosted)** | All Pro features, community support |
+| **Pro (Cloud)** | Everything apart from the Premium features (SSO and row-level permissions), standard support |
+| **Organization (Cloud)** | All from Pro + the Premium features (SSO and row-level permissions), priority support |
+| **Organization (Self-Hosted)** | All from Pro + the Premium features (SSO, row-level permissions), Twenty team support, not required to publish your custom code as open-source before distributing |
+
+## Quick answers
+
+**Where do I manage billing?**
+Go to **Settings → Billing** to view your plan, update payment methods, and access invoices.
+
+**Can I use Twenty for free?**
+Yes! Self-host Twenty and get all Pro features at no cost.
+
+**How do I upgrade?**
+Go to **Settings → Billing** and click **Switch to Organization** or **Switch to Yearly**.
+
+For more questions, see the [Billing FAQ](/l/ko/user-guide/billing/how-tos/billing-faq).
diff --git a/packages/twenty-docs/l/ko/user-guide/calendar-emails/capabilities/calendar.mdx b/packages/twenty-docs/l/ko/user-guide/calendar-emails/capabilities/calendar.mdx
new file mode 100644
index 0000000000..4c1818a5f6
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/calendar-emails/capabilities/calendar.mdx
@@ -0,0 +1,43 @@
+---
+title: Calendar
+description: Understanding calendar integration features in Twenty.
+---
+
+**Note**: To connect your calendar and configure sync settings, visit [Email & Calendar Setup](/l/ko/user-guide/calendar-emails/overview).
+
+## How Calendar Integration Works
+
+Twenty automatically syncs your calendar events and links them to the relevant CRM records, giving you a complete view of your meeting history with contacts and companies.
+
+## Calendar Tab
+
+Next to the Emails tab on records, you'll find a `Calendar` tab that contains the history of meetings scheduled with the record.
+
+### Available For
+
+* **People**: View all meetings scheduled with a specific contact
+* **Companies**: See all meetings related to a company and its employees
+* **Opportunities**: Access meeting history related to the company linked to this opportunity
+
+### Viewing Meeting History
+
+1. **Navigate to a Record**: Go to any Person, Company, or Opportunity record
+2. **Select the Calendar Tab**: Click on the `Calendar` tab next to the Emails tab
+3. **Browse Meeting History**: View all scheduled meetings and their details
+4. **Access Meeting Context**: See meeting participants, times, and related information
+
+## Visibility Settings
+
+Calendar data follows the same visibility settings as emails, ensuring consistent privacy controls across both communication channels.
+
+## What Gets Synced
+
+* **External Meetings**: All meetings with contacts outside your organization
+* **Automatic Linking**: Meetings connect to existing People and Company records based on attendee email addresses
+* **Meeting Details**: Subject, time, duration, and participants
+* **Updates**: New calendar events sync automatically
+
+## What Doesn't Get Synced
+
+* **Internal Meetings**: Meetings with only colleagues (same domain) remain private
+* **Private Events**: Events marked as private in your calendar
diff --git a/packages/twenty-docs/l/ko/user-guide/calendar-emails/capabilities/mailbox.mdx b/packages/twenty-docs/l/ko/user-guide/calendar-emails/capabilities/mailbox.mdx
new file mode 100644
index 0000000000..cd2a3172ea
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/calendar-emails/capabilities/mailbox.mdx
@@ -0,0 +1,85 @@
+---
+title: Mailbox
+description: Understanding email integration features in Twenty.
+---
+
+**Note**: To connect your email accounts and configure sync settings, visit [Email & Calendar Setup](/l/ko/user-guide/calendar-emails/overview).
+
+## How Email Integration Works
+
+Twenty automatically links emails from your connected mailboxes to the relevant CRM records, keeping all communication history in one place.
+
+### Objects Where Emails Can Be Found
+
+Email conversations appear in three main objects:
+
+* **People**: View all emails exchanged with a specific contact
+* **Companies**: See all emails related to a company and its employees
+* **Opportunities**: Access email threads related to the company linked to this opportunity. Email threads from individual people on the opportunity are not shown yet.
+
+### Viewing Email Threads
+
+1. **Navigate to a Record**: Go to any Person, Company, or Opportunity record
+2. **Select the Emails Tab**: Click on the `Emails` tab to view synced emails
+3. **Open an Email Thread**: Click on any email to open and read the full conversation
+4. **Browse History**: Scroll through the complete email history with that contact
+
+
+
+## What You'll See
+
+### Email Thread View
+
+When you open an email thread, you can:
+
+* **Read Full Conversations**: See the complete email exchange
+* **View Participants**: See all people involved in the email thread
+* **Check Timestamps**: Know exactly when each email was sent
+* **Access Context**: Understand the full communication history
+
+### Email Visibility
+
+Depending on your mailbox settings, you might see:
+
+* **Full Content**: Complete email text and details
+* **Subject + Metadata**: Subject line, sender, recipient, and timestamp
+* **Metadata Only**: Basic information without email content
+
+## Email Sync Behavior
+
+### What Gets Synced
+
+* **External Emails**: All emails with contacts outside your organization
+* **Automatic Linking**: Emails connect to existing People and Company records
+* **Multiple Addresses**: Emails from any address link to the same contact record
+* **Updates**: New emails appear within 5 minutes
+
+### What Doesn't Get Synced
+
+* **Internal Emails**: Emails between colleagues (same domain) remain private
+* **Group Emails**: Distribution lists and group emails are excluded
+* **Excluded Folders**: Folders you've chosen not to sync (configured under Settings → Accounts → Email)
+
+### Selective Folder Sync (Lab Feature)
+
+Control which email folders sync with Twenty:
+
+1. Enable `Message Folder` in Settings → Releases → Lab
+2. Configure folders under Settings → Accounts → Email
+3. Choose specific folders to include or exclude (Inbox, Sent, Archive, custom folders)
+
+## Troubleshooting Email Sync
+
+### Common Sync Issues
+
+* **Sync Delays**: Emails appear within 5 minutes, but initial imports take longer
+* **Missing Emails**: Check if:
+ * Folders are excluded in Message Folder settings
+ * Contact auto-creation is disabled (emails need existing Twenty records)
+ * Email is from colleagues (same domain) or group lists
+ * Mailbox is still completing initial sync
+
+### Email Limitations
+
+* **System Folders**: Some email folders may not be available for sync
+* **Aliases**: Only true mailboxes can be connected (not email aliases)
diff --git a/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx b/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx
new file mode 100644
index 0000000000..edee83875d
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx
@@ -0,0 +1,28 @@
+---
+title: Can I Book Meetings from Twenty?
+description: Information about booking meetings directly from Twenty.
+---
+
+## Current Status
+
+**No, Twenty does not currently support booking meetings directly from the platform.**
+
+Twenty's calendar integration is designed to **sync and display** your existing calendar events, not to create new ones. All meeting scheduling should be done through your native calendar application (Google Calendar, Microsoft Outlook, etc.).
+
+## What You Can Do
+
+* **View meeting history** on People, Companies, and Opportunities records
+* **See upcoming meetings** with contacts in your CRM
+* **Track meeting context** alongside email communications
+* **Auto-create contacts** from meeting participants
+
+## How to Schedule Meetings
+
+1. Use your native calendar app (Google Calendar, Outlook, etc.)
+2. Create the meeting as you normally would
+3. The meeting will automatically sync to Twenty within 5 minutes
+4. View the meeting on the relevant CRM records
+
+## Future Plans
+
+Meeting creation from within Twenty is on our roadmap. Join our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to share your use case and help prioritize this feature.
diff --git a/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx b/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx
new file mode 100644
index 0000000000..eacc8054a0
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx
@@ -0,0 +1,44 @@
+---
+title: Can I Send Emails from Twenty?
+description: Information about sending emails directly from Twenty.
+---
+
+## Current Status
+
+Twenty's email integration is designed to **sync and display** your email history. Emails cannot be composed or sent directly from Twenty's interface.
+
+When you view an email thread on a record page and click **Reply**, you'll be redirected to the original thread in your mailbox (Gmail, Outlook, etc.). This is where you compose and send your reply.
+
+## What You Can Do Today
+
+* **View email history** on People, Companies, and Opportunities records
+* **Read full email threads** with contacts in your CRM
+* **Track communication context** alongside calendar events
+* **Auto-create contacts** from email interactions
+* **Reply via redirect** — click Reply to jump to your mailbox
+
+## Sending Emails via Workflows
+
+While you can't send emails manually from Twenty, you **can send emails automatically using Workflows**. This is useful for:
+
+* Automated follow-ups
+* Notifications to contacts
+* Triggered communications based on record changes
+
+Emails sent via workflows go through your connected mailbox account.
+
+→ Learn about the [Send Email action](/l/ko/user-guide/workflows/capabilities/workflow-actions#send-email)
+
+## Email Sequences and Newsletters
+
+For email sequences and newsletters, we recommend using workflows to connect Twenty to a dedicated email marketing tool.
+
+
+ Mass emails should not be sent directly from your mailbox to protect your domain reputation. Use a dedicated tool for bulk communications.
+
+
+→ See [How to send emails from workflows](/l/ko/user-guide/workflows/capabilities/send-emails-from-workflows) for setup instructions
+
+## Future Plans
+
+Native email composition from within Twenty is on our roadmap. Join our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to share your use case and help prioritize this feature.
diff --git a/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx b/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx
new file mode 100644
index 0000000000..de258baef3
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx
@@ -0,0 +1,35 @@
+---
+title: Can I Track Email Activity on All Objects?
+description: Understanding email activity tracking across different objects.
+---
+
+## Supported Objects
+
+Email activity is currently available on **three standard objects**:
+
+| Object | What You See |
+| ----------------- | ---------------------------------------------------------------- |
+| **People** | All emails exchanged with that specific contact |
+| **Companies** | All emails with anyone from that company (based on email domain) |
+| **Opportunities** | Emails related to the company linked to the opportunity |
+
+## Why Only These Objects?
+
+People, Companies, and Opportunities are the core relationship objects where email context adds the most value. Email threads are automatically linked based on:
+
+* **Email address** → matched to People records
+* **Email domain** → matched to Company records
+* **Company relation** → linked to Opportunities
+
+## Custom Objects
+
+**Email tracking is not available on custom objects** at this time.
+
+If you need email context on a custom object, consider:
+
+* Using a relation field to link your custom object to People or Companies
+* Viewing email history on the linked People/Company record
+
+## Future Plans
+
+Extending email visibility to custom objects is being considered. Share your use case on our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to help prioritize this feature.
diff --git a/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx b/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx
new file mode 100644
index 0000000000..83da30bd83
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx
@@ -0,0 +1,42 @@
+---
+title: Connect Several Mailboxes per User
+description: Connect multiple email accounts for a single user.
+---
+
+## Overview
+
+Twenty supports **unlimited email accounts per user**. This is useful if you manage multiple inboxes, such as:
+
+* Personal work email + shared team inbox
+* Multiple client-facing email addresses
+* Different email accounts for different roles
+
+## How to Add Multiple Mailboxes
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Connect your additional Google or Microsoft account
+4. Configure sync settings for this mailbox
+5. Repeat for each mailbox you want to connect
+
+## Managing Multiple Accounts
+
+Each connected mailbox has its own settings:
+
+* **Email visibility**: Choose what teammates can see
+* **Contact auto-creation**: Enable/disable per mailbox
+* **Folder selection**: Choose which folders to sync (Lab feature)
+
+## How Emails Appear
+
+Emails from all your connected mailboxes are synced to Twenty and appear on:
+
+* **People records**: Based on the contact's email address
+* **Company records**: Based on the email domain
+* **Opportunities**: Based on the linked company
+
+Each email shows which mailbox it was sent from/received to, so you can track which account was used for each communication.
+
+## Important Notes
+
+Only true mailboxes can be connected. Email aliases that forward to another mailbox cannot be connected separately—they'll sync through the main mailbox.
diff --git a/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx b/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx
new file mode 100644
index 0000000000..c5db7745a0
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx
@@ -0,0 +1,53 @@
+---
+title: I Don't See Emails on Records
+description: Troubleshooting missing emails on records.
+---
+
+## Common Reasons
+
+### 1. Initial Sync Still in Progress
+
+Email sync takes time, especially for large mailboxes.
+
+* **Calendar sync**: Completes in minutes
+* **Email sync**: Can take several hours for large mailboxes
+
+**Solution**: Wait up to a few hours for the initial import to complete.
+
+### 2. Contact Doesn't Exist in Twenty
+
+Emails only appear on existing People records. If the contact wasn't created yet:
+
+* Enable **Contact Auto-Creation** in your mailbox settings
+* Or manually create the Person record first
+
+**Solution**: Go to **Settings → Accounts**, select your mailbox, and enable contact auto-creation.
+
+### 3. Internal Emails Are Excluded
+
+Emails between colleagues (same email domain) are never synced to maintain privacy.
+
+**Solution**: This is expected behavior. Only external emails are synced.
+
+### 4. Email Is from a Group or Distribution List
+
+Group emails and distribution lists are excluded from sync.
+
+**Solution**: This is expected behavior.
+
+### 5. Folder Not Selected for Sync
+
+If you're using the Message Folder feature, some folders might be excluded.
+
+**Solution**: Go to **Settings → Accounts**, select your mailbox, and check folder sync settings.
+
+### 6. Wrong Email Address on Record
+
+The Person record might have a different email address than the one used in the email.
+
+**Solution**: Add the correct email address to the Person record.
+
+## Still Not Working?
+
+1. Try disconnecting and reconnecting your mailbox
+2. Contact support if issues persist
diff --git a/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx b/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
new file mode 100644
index 0000000000..9569d2651a
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
@@ -0,0 +1,52 @@
+---
+title: Limit Emails Imported
+description: Control which emails are imported into Twenty.
+---
+
+## Overview
+
+By default, Twenty syncs all external emails from your connected mailbox. You can limit what gets imported using **folder selection** and **visibility settings**.
+
+## Method 1: Folder Selection (Recommended)
+
+Control which email folders sync with Twenty:
+
+1. Go to **Settings → Releases → Lab**
+2. Enable **Message Folder**
+3. Return to **Settings → Accounts**
+4. Select your connected email account
+5. Choose which folders to sync:
+
+| Folder | Description |
+| ------------------ | ----------------------------- |
+| **Inbox** | Primary incoming emails |
+| **Sent** | Outgoing emails you've sent |
+| **Archive** | Archived messages |
+| **Custom Folders** | Any specific folders you want |
+
+6. Exclude folders you don't want synced (Spam, Trash, personal folders)
+
+This gives you precise control over which emails appear in your CRM without syncing everything.
+
+## Method 2: Contact Auto-Creation Settings
+
+Control when contacts are created from emails:
+
+1. Go to **Settings → Accounts**
+2. Select your connected mailbox
+3. Choose an option:
+ * **Deactivated**: No contacts created, but emails still sync to existing contacts
+ * **Sent & Received**: Create contacts from all external emails
+ * **Sent Only**: Only create contacts from emails you send
+
+## What's Always Excluded
+
+These emails are never synced, regardless of settings:
+
+* **Internal emails**: Messages between colleagues (same domain)
+* **Group emails**: Distribution lists and group messages
+* **Spam/Trash**: System folders are typically excluded
+
+## Important Note
+
+We don't provide a CC email address for selective syncing. Use the folder selection feature above to achieve the same level of control.
diff --git a/packages/twenty-docs/l/ko/user-guide/calendar-emails/overview.mdx b/packages/twenty-docs/l/ko/user-guide/calendar-emails/overview.mdx
new file mode 100644
index 0000000000..a05105e13a
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/calendar-emails/overview.mdx
@@ -0,0 +1,132 @@
+---
+title: Calendar & Emails
+description: Connect your email and calendar accounts to Twenty.
+image: /images/user-guide/emails/emails_header.png
+---
+
+
+
+
+
+## Connection Options
+
+### Google Account (Gmail & Google Calendar)
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Select **Continue with Google**
+4. Authorize Twenty to access your Gmail and Google Calendar
+5. Configure email sync settings (visibility, auto-creation) → click **Next**
+6. Configure calendar sync settings (visibility, auto-creation) → click **Add Account**
+7. Your emails and calendar events will start syncing automatically
+
+### Microsoft Account (Outlook & Microsoft Calendar)
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Select **Continue with Microsoft**
+4. Authorize Twenty to access your Outlook and Microsoft Calendar
+5. Configure email sync settings (visibility, auto-creation) → click **Next**
+6. Configure calendar sync settings (visibility, auto-creation) → click **Add Account**
+7. Your emails and calendar events will start syncing automatically
+
+### SMTP/CalDAV Setup (Other Providers)
+
+For other email and calendar providers:
+
+1. Go to **Settings → Releases → Lab** to enable the feature
+2. Return to **Settings → Accounts**
+3. Configure SMTP settings for email
+4. Configure CalDAV settings for calendar
+5. Test the connection
+
+### Multiple Mailboxes
+
+* **Unlimited Accounts**: Connect multiple email accounts per user
+* **Account Management**: Switch between different mailboxes
+* **Sync Settings**: Configure different settings per mailbox
+
+
+ Only true mailboxes can be connected (e.g., support@domain.com with its own inbox). Email aliases that forward to another mailbox cannot be connected to Twenty.
+
+
+## Email Configuration
+
+### Message Visibility
+
+Choose different levels of visibility for your emails:
+
+* **Metadata Only**: Share only basic information (sender, recipient, date, time)
+* **Subject and Metadata**: Share subject line along with metadata
+* **All Email Content**: Share entire email content including attachments
+
+### Contact Auto-Creation
+
+* **Deactivated**: No automatic contact creation
+* **For messages sent & received**: Create contacts for all external email interactions
+* **For messages sent only**: Create contacts only for emails you send
+* **Note**: Internal emails (same domain) are never synced to maintain privacy
+
+When enabled, contacts are automatically linked to their Company records based on their email domain. If the company doesn't exist yet, Twenty creates it for you.
+
+### Control which emails get sync with Message Folder Selection (Lab Feature)
+
+Control which email folders sync with Twenty:
+
+1. Go to **Settings → Releases → Lab** and enable **Message Folder**
+2. Return to **Settings → Accounts** and select your connected email account
+3. Choose which folders to sync:
+ * **Inbox**: Primary incoming emails
+ * **Sent**: Outgoing emails you've sent
+ * **Custom Folders**: Any specific folders you want to include
+ * **Exclude Folders**: Skip folders like Spam, Trash, or personal folders
+
+This gives you precise control over which emails appear in your CRM without syncing everything.
+
+**What Gets Synced:**
+
+* **External Emails**: All emails with external contacts from selected folders
+* **Internal Emails**: Not synced (same domain emails remain private)
+* **Attachments**: Coming in H1 2026
+
+**Note**: We don't provide a CC email address for selective syncing. Instead, use the Message Folder feature above to achieve the same level of control over which emails sync with Twenty.
+
+## Calendar Configuration
+
+### Event Visibility
+
+Choose what will be visible to other users in your workspace:
+
+* **Everything**: The whole event details will be shared with your team
+* **Metadata**: Only date & participants will be shared with your team
+
+### Contact Auto-Creation for Meetings
+
+* **Yes**: Automatically create contacts for meeting participants not in your CRM
+* **No**: Only link meetings to existing contacts
+
+When enabled, contacts are automatically linked to their Company records based on their email domain. If the company doesn't exist yet, Twenty creates it for you.
+
+### Control which events get sync
+
+* **Meeting Import**: Automatically import calendar events
+* **Contact Linking**: Link meetings to People and Company records
+
+**What Gets Synced:**
+
+* **Meetings**: Calendar events with external participants
+* **Contact Linking**: Events automatically linked to CRM records
+* **Team Events**: Shared calendar visibility
+
+## Sync Frequency
+
+**Updates every 5 minutes**: Both email and calendar data sync automatically every 5 minutes after the initial import.
+
+
+ **Initial sync timing**: Calendar sync completes quickly (usually within minutes), while email sync takes longer for large mailboxes—up to a few hours depending on volume. Don't worry if you see contacts from calendar events appearing before your email contacts; this is normal behavior.
+
+
+## Next Steps
+
+* [Mailbox capabilities](/l/ko/user-guide/calendar-emails/capabilities/mailbox)
+* [Troubleshoot missing emails](/l/ko/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records)
diff --git a/packages/twenty-docs/l/ko/user-guide/dashboards/capabilities/dashboards.mdx b/packages/twenty-docs/l/ko/user-guide/dashboards/capabilities/dashboards.mdx
new file mode 100644
index 0000000000..b3d731e668
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/dashboards/capabilities/dashboards.mdx
@@ -0,0 +1,74 @@
+---
+title: Dashboards
+description: Create and organize dashboards with tabs to visualize your CRM data.
+---
+
+## Overview
+
+Dashboards in Twenty are organized in a hierarchy: **Dashboards → Tabs → Widgets**. Each dashboard can contain multiple tabs, and each tab contains widgets (charts, numbers, iFrames).
+
+## Creating a Dashboard
+
+1. Go to **Dashboards** in the navigation
+2. Click **+ New Dashboard**
+3. Give your dashboard a name
+4. Start adding tabs and widgets
+
+## Working with Tabs
+
+Tabs help you organize your dashboard into logical sections.
+
+### Creating Tabs
+
+1. In edit mode, click **+ Add Tab**
+2. Name your tab (e.g., "Pipeline Overview", "Team Performance")
+3. Add widgets to the tab
+
+### Duplicating Tabs
+
+1. Click on the tab you want to duplicate
+2. Click the **Duplicate** button in the side panel
+
+## Dashboard Layout
+
+### Arranging Widgets
+
+* Drag and drop to position
+* Resize for emphasis
+* Group related charts together
+
+### Duplicating a Dashboard
+
+1. Exit edit mode (view mode only)
+2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
+3. Select **Duplicate dashboard**
+
+### Best Practices
+
+* **Logical flow**: Arrange from overview to detail
+* **Visual hierarchy**: Larger charts for key metrics
+* **Consistent styling**: Use matching colors and fonts
+
+## Visibility & Access
+
+### Dashboard Visibility
+
+Dashboards are visible to everyone who has access to your Twenty workspace. There is no private dashboard option at the moment.
+
+### Favorites
+
+You can add dashboards to your favorites for quick access. This is a personal setting—your favorites are not visible to other users.
+
+To add a dashboard to favorites, open the dashboard and click the star icon.
+
+### Timezone Behavior
+
+Dashboards currently display data based on the timezone of the user viewing them. This means the same dashboard may show different metrics for team members in different regions (e.g., APAC vs. US).
+
+
+ **Coming soon**: We will add the ability to set a specific timezone for a dashboard, so all users see consistent data regardless of their location.
+
+
+
+ **Coming soon**: Dashboard-level filters will allow you to apply filters across all widgets at once, making it faster to explore your data.
+
diff --git a/packages/twenty-docs/l/ko/user-guide/dashboards/capabilities/widgets.mdx b/packages/twenty-docs/l/ko/user-guide/dashboards/capabilities/widgets.mdx
new file mode 100644
index 0000000000..fc12e61339
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/dashboards/capabilities/widgets.mdx
@@ -0,0 +1,131 @@
+---
+title: Widgets
+description: Explore the widget types and visualization options in Twenty.
+---
+
+## Available Widgets
+
+Twenty provides various widget types to visualize your CRM data.
+
+### Bar Charts
+
+Display data as horizontal or vertical bars.
+
+**Best for:**
+
+* Comparing values across categories
+* Showing rankings
+* Tracking metrics by time period
+
+**Example uses:**
+
+* Deals by stage
+* Revenue by sales rep
+* Contacts added per month
+
+
+ **Display limits**: Bar charts can show a maximum of 100 bars (horizontal) or 50 bars (vertical). If you see the warning "Undisplayed data: max X bars per chart", add filters to narrow down your data or change the grouping (e.g., group by week instead of days).
+
+
+### Pie Charts
+
+Show proportions of a whole.
+
+**Best for:**
+
+* Showing composition or distribution
+* Comparing parts to whole
+* Highlighting major segments
+
+**Example uses:**
+
+* Deal distribution by source
+* Contact breakdown by industry
+* Pipeline composition by owner
+
+### Line Charts
+
+Display trends over time.
+
+**Best for:**
+
+* Tracking changes over time
+* Identifying trends
+* Comparing multiple metrics
+
+**Example uses:**
+
+* Monthly deal count trend
+* Revenue growth over quarters
+* Activity levels over time
+
+### Number Metrics
+
+Display single key values prominently.
+
+**Best for:**
+
+* Highlighting KPIs
+* Showing totals or averages
+* Quick status checks
+
+**Example uses:**
+
+* Total pipeline value
+* Number of open opportunities
+* Conversion rate
+
+**Advanced options:**
+
+* **Ratio**: For Select fields, calculate ratios between values. Go to **Data on display** → select your field → enable the **Ratio** option.
+* **Prefix & Suffix**: Add custom text before or after the number (e.g., "$" prefix or "%" suffix) for better readability.
+
+### iFrames
+
+Embed external tools and content directly in your dashboard.
+
+**Best for:**
+
+* Displaying external reports or dashboards
+* Integrating third-party sales tools
+* Showing live content from other systems
+
+**Example uses:**
+
+* Metrics from your Support tool
+* Metrics from your dialer
+* Live content from your Sales sequence tool
+
+
+ **Coming soon**: Gauge charts and tables are not yet available but are on our roadmap.
+
+
+## Configuring Widgets
+
+### Data Source
+
+1. Select the object to visualize (Opportunities, People, etc.)
+2. Choose the metric to display (count, sum, average)
+3. Apply filters to focus on specific data
+
+### Grouping
+
+Group data by:
+
+* Fields (stage, owner, industry)
+* Time periods (day, week, month, quarter)
+* Custom segments
+
+### Styling
+
+Customize your charts with:
+
+* Colors and themes
+* Labels and legends
+* Size and positioning
+
+### Duplicating Widgets
+
+1. Click on the widget
+2. Open **Options**
+3. Click **Duplicate widget**
diff --git a/packages/twenty-docs/l/ko/user-guide/dashboards/how-tos/dashboards-faq.mdx b/packages/twenty-docs/l/ko/user-guide/dashboards/how-tos/dashboards-faq.mdx
new file mode 100644
index 0000000000..7af41b4efa
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/dashboards/how-tos/dashboards-faq.mdx
@@ -0,0 +1,59 @@
+---
+title: Dashboards FAQ
+description: Frequently asked questions about dashboards in Twenty.
+---
+
+
+
+ No, dashboards are currently visible to everyone with access to your Twenty workspace. Private dashboards are not yet available.
+
+
+
+ Dashboards currently display data based on the viewer's timezone. If you're in different regions (e.g., APAC vs. US), you may see slightly different numbers for the same dashboard. We're working on adding a timezone setting per dashboard to ensure consistent data across teams.
+
+
+
+ Exporting dashboards is not available at the moment. This feature is on our roadmap.
+
+
+
+ No, sharing dashboards with users outside your Twenty workspace (non-Twenty users) is not currently supported.
+
+
+
+ Open the dashboard you want to favorite, then click the star icon. Favorites are personal—they won't affect other users.
+
+
+
+ * **Tabs** organize your dashboard into sections (like pages within the dashboard)
+ * **Widgets** are the individual visualizations (charts, numbers, iFrames) within each tab
+
+ Structure: Dashboard → Tabs → Widgets
+
+
+
+ Bar charts have display limits: 100 bars for horizontal charts, 50 for vertical. If your data exceeds this, add filters to narrow down the results or change the grouping (e.g., group by week instead of day).
+
+
+
+ Dashboard-level filters are not available yet, but this feature is on our roadmap. Currently, you need to apply filters to each widget individually.
+
+
+
+ Not yet. Gauge charts and tables are on our roadmap and will be added in a future release.
+
+
+
+ 1. Make sure you're in view mode (not editing)
+ 2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
+ 3. Select **Duplicate dashboard**
+
+
+
+ Widgets update automatically as your CRM data changes:
+
+ * Real-time updates for most metrics
+ * Use the refresh button for a manual update if needed
+ * Historical data is preserved for trend analysis
+
+
diff --git a/packages/twenty-docs/l/ko/user-guide/dashboards/overview.mdx b/packages/twenty-docs/l/ko/user-guide/dashboards/overview.mdx
new file mode 100644
index 0000000000..3a739b5d43
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/dashboards/overview.mdx
@@ -0,0 +1,79 @@
+---
+title: Dashboards
+description: Learn the basics of reporting and dashboards in Twenty.
+image: /images/user-guide/reporting/pie-chart.png
+---
+
+
+
+
+
+## Understanding Dashboards
+
+Dashboards in Twenty provide a visual way to track your key performance metrics and gain insights from your CRM data.
+
+
+
+## Key Concepts
+
+### Dashboards
+
+A dashboard is a collection of tabs that display your CRM data at a glance. You can create multiple dashboards for different purposes:
+
+* Sales performance
+* Team activity
+* Pipeline health
+* Custom metrics
+
+### Tabs
+
+Tabs allow you to organize your dashboard into sections. Each tab contains one or more widgets.
+
+### Widgets
+
+Widgets are individual visualizations that display specific data. Types include:
+
+* Bar charts
+* Pie charts
+* Line charts
+* Number metrics
+* iFrames
+
+
+ **Current limitations**:
+
+ * Exporting dashboards and sharing with external users (non-Twenty users) are not available at the moment.
+ * Gauge charts and tables are not yet available.
+
+
+## Getting Started
+
+### Creating Your First Dashboard
+
+1. Navigate to the **Dashboards** section
+2. Click **+ New Dashboard**
+3. Give your dashboard a name
+4. Add tabs to organize your content
+5. Add widgets to display your data
+6. Save
+
+### Adding Widgets
+
+1. Open a tab on your dashboard
+2. Click **+ Add Widget**
+3. Select the widget type
+4. Choose the data source (object)
+5. Configure the widget settings
+6. Save and view your widget
+
+## Best Practices
+
+* **Start simple**: Begin with a few key metrics and add more over time
+* **Focus on actionable data**: Display metrics that drive decisions
+* **Regular review**: Check your dashboards regularly to spot trends
+* **Share with team**: Make dashboards visible to relevant team members
+
+## Next Steps
+
+* [Widgets and visualizations](/l/ko/user-guide/dashboards/capabilities/widgets)
+* [Dashboards FAQ](/l/ko/user-guide/dashboards/how-tos/dashboards-faq)
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/error-handling.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/error-handling.mdx
new file mode 100644
index 0000000000..7ca870132f
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/error-handling.mdx
@@ -0,0 +1,76 @@
+---
+title: Error Handling & Validation
+description: Review and fix import errors directly in the UI before confirming.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Pre-Import Validation
+
+After uploading your file and mapping fields, Twenty validates your data **before** importing. This allows you to catch and fix errors without affecting your existing data.
+
+## How It Works
+
+1. **Upload** your CSV file
+2. **Map** your columns to Twenty fields
+3. **Review** the potential errors highlighted in yellow
+4. **Fix errors** directly in the UI
+5. **Confirm** the import
+
+
+
+## Error Display
+
+Rows with issues are highlighted in **yellow**. You can:
+
+* **Edit the cell directly** to fix the error
+* **Remove the row** to skip it entirely
+
+This inline editing saves time—no need to go back to your spreadsheet, fix errors, and re-upload.
+
+## Common Error Types
+
+### Duplicate Values
+
+**Cause**: A unique field (email, domain) already exists in Twenty or appears twice in your file.
+
+**Fix**:
+
+* Edit the duplicate value in the import UI
+* Remove one of the duplicate rows
+
+See [Uniqueness Constraints](/l/ko/user-guide/data-migration/capabilities/uniqueness-constraints) for more details on how uniqueness is enforced.
+
+### Invalid Format
+
+**Cause**: Data doesn't match the expected format (e.g., invalid email, wrong date format).
+
+**Fix**: Edit the cell to use the correct format.
+
+See [Field Mapping](/l/ko/user-guide/data-migration/capabilities/field-mapping) for the expected format of each field type.
+
+### Missing Required Fields
+
+**Cause**: A required field is empty.
+
+**Fix**: Enter a value in the required field or remove the row.
+
+### Relation Not Found
+
+**Cause**: The referenced record doesn't exist (e.g., a Company domain that wasn't imported).
+
+**Fix**:
+
+* Import the parent records first
+* Or correct the reference value
+
+See [Import Relations](/l/ko/user-guide/data-migration/capabilities/import-relations) for the correct import order and how to link records.
+
+## Tips for Fewer Errors
+
+1. **Download the template** to see expected format prior to importing your file
+2. **Clean your data** in the spreadsheet first
+3. **Import files in correct order** to import relations (Companies → People → Opportunities)
+4. **Test with small batches** before full import
+5. **Check for duplicates** before uploading
+6. **Limit the size of your file to 10,000 records** per file
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/field-mapping.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/field-mapping.mdx
new file mode 100644
index 0000000000..d9e06a24c0
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/field-mapping.mdx
@@ -0,0 +1,198 @@
+---
+title: Field Mapping
+description: How field mapping works during data import.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## How Field Mapping Works
+
+When you upload a file, Twenty analyzes your columns and attempts to match them to existing fields.
+
+### Automatic Mapping
+
+Twenty tries to match columns based on:
+
+* Column header names (exact or similar matches)
+* Data type detection (dates, numbers, emails)
+* Common field patterns
+
+**Quick tip:** Export a few rows from the object you want to import. The exported file will have the exact column names Twenty expects, making automatic mapping seamless during import.
+
+### Manual Mapping Options
+
+For each column, you can:
+
+* **Map to a field**: Select the matching Twenty field from a dropdown
+* **Do not map**: Skip the column entirely (data won't be imported)
+
+**Fields must exist before import.** The import creates records, not fields. Create custom fields under **Settings → Data Model** before importing.
+
+## Field Type Compatibility
+
+All field types available in the Data Model are supported for import.
+
+You can also import `id` values to either assign a specific ID to new records or update existing ones.
+
+
+
+## Data Format Requirements
+
+**Some fields have special syntax.** We recommend downloading the sample file before preparing your import to see the expected syntax for each field type.
+
+### Address Fields
+
+Address is a nested field with multiple columns. Some can be left empty.
+
+* **Address / Address 1**: Street address line 1
+* **Address / Address 2**: Street address line 2
+* **Address / City**: City name
+* **Address / State**: State or province
+* **Address / Country**: Country name
+* **Address / Post Code**: Postal/ZIP code
+
+### Array Fields
+
+Use the following format:
+
+```
+["value1","value2"]
+```
+
+### Boolean Fields
+
+Use `TRUE` or `FALSE` (uppercase) - not `true` or `false`
+
+### Currency Fields
+
+Currency is a nested field with two columns that **both must be filled**:
+
+* **Amount / Amount**: The numeric value (e.g., `1234.56`)
+* **Amount / Currency**: The currency code (e.g., `USD`, `EUR`)
+
+### Date Fields
+
+Supported formats:
+
+* `YYYY-MM-DD` (recommended)
+* `MM/DD/YYYY`
+* `DD/MM/YYYY`
+* ISO 8601 format
+
+### Domain Fields
+
+* It is recommended to use the format `https://domain.com` to avoid creating duplicates, as this is the format used for Companies created by the mailbox and calendar synchronizations
+* A `Domain Label` and `Domain URL` can be filled: best practice is to fill `domain.com` in the label and `https://domain.com` in the url
+* Domains must be unique within the Companies object
+* **Domains must be unique within the file to import**
+
+### Email Fields
+
+* Must be valid email format
+* Emails must be unique within the People object
+* **Emails must be unique within the file to import**
+* For additional emails: use **Emails / Primary Email** for the main email, and **Emails / Additional Emails** with this format:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Id Fields
+
+Specifying an `id` during import is optional. Twenty auto-generates one if not provided.
+
+Use cases for mapping an `id` column:
+
+* **Set a specific ID**: Choose the UUID for newly created records
+* **Update existing records**: Match against existing records to update them instead of creating duplicates. In that case, it is recommended to not map the other unique fields: mapping only one unique field ensures a smoother import.
+
+If you provide an `id`, it must be in UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
+
+### JSON Fields
+
+Use valid JSON format:
+
+```
+{"key":"value","key2":"value2"}
+```
+
+### Links Fields
+
+Similar to Domain fields:
+
+* Fill both the label and URL columns: **Links / Link URL** and **Links / Link Label**
+* Use full URL format: `https://example.com`
+* For secondary links, use **Links / Secondary Links** column with this format:
+
+```
+[{"url":"https://twenty.com","label":"Twenty"}]
+```
+
+### Multi-Select Fields
+
+Use the **API names** (not the display labels) in the following format:
+
+```
+["VALUE1","VALUE2"]
+```
+
+See [here](#finding-api-names-for-select-fields) where to find the API names.
+
+New select options will not be created automatically by the import. They must be added under **Settings → Data Model** before importing.
+
+
+ **Import overwrites, it does not add.**
+
+ If a record already has `VALUE2` and `VALUE3` selected, and you import `["VALUE1"]`, the record will only have `VALUE1` after import. The previous selections are replaced, not merged.
+
+
+### Number Fields
+
+* Numbers only
+* Decimals use period: `1234.56`
+* No thousands separators
+
+### Phone Fields
+
+Phone is a nested field with multiple columns that **must be filled**
+
+* **Phones / Primary Phone Number**: The phone number (e.g., `4159095555`)
+* **Phones / Primary Phone Country Code**: Country code (e.g., `US`)
+* **Phones / Primary Phone Calling Code**: Dialing code (e.g., `+1`)
+
+### Rating Fields
+
+Use the API name format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, `RATING_5`
+
+### Relation Fields
+
+Please see our dedicated article: [Import Relations Between Objects](/l/ko/user-guide/data-migration/capabilities/import-relations)
+
+### Select Fields
+
+Use the **API name** of the option (not the display label):
+
+```
+VALUE1
+```
+
+See [here](#finding-api-names-for-select-fields) where to find the API names.
+New select options will not be created automatically by the import. They must be added under **Settings → Data Model** before importing.
+
+### Text Fields
+
+* No special formatting required
+* Leading/trailing spaces are trimmed
+
+## Finding API Names
+
+For Select, Multi-Select, and Array fields with predefined options, you must use the **API names**, not the display labels.
+
+### How to Find API Names
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at the bottom right of the settings page)
+4. View the API name for each option
+
+
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/file-formats.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/file-formats.mdx
new file mode 100644
index 0000000000..168f74a002
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/file-formats.mdx
@@ -0,0 +1,48 @@
+---
+title: Supported File Formats
+description: File formats supported for data import in Twenty.
+---
+
+## Supported Formats
+
+Twenty supports three file formats for import:
+
+| Format | Extension | Notes |
+| ------------------ | --------- | ---------------------------- |
+| **CSV** | .csv | Recommended, most compatible |
+| **Excel** | .xlsx | Modern Excel format |
+| **Excel (Legacy)** | .xls | Older Excel format |
+
+## File Requirements
+
+| Requirement | Value |
+| ---------------- | ------------------------------------- |
+| **Encoding** | UTF-8 recommended |
+| **Record limit** | 10,000 records per file |
+| **Structure** | First row must contain column headers |
+| **Content** | One object type per file |
+
+## CSV Best Practices
+
+* **Delimiter**: Use comma (`,`) or semicolon (`;`)
+* **Text qualifier**: Use double quotes (`"`) for text containing commas
+* **Line endings**: Windows (CRLF) or Unix (LF) both supported
+* **Empty values**: Leave cells empty, don't use "NULL" or "N/A"
+
+## Excel Best Practices
+
+When exporting from Excel:
+
+* Remove formulas (export values only)
+* Delete empty rows at the end
+* Ensure no merged cells
+* Use the first sheet only
+
+## Large Datasets
+
+For datasets larger than 10,000 records:
+
+* Split into multiple files
+* Or use the [API import](/l/ko/user-guide/data-migration/how-tos/import-data-via-api) for unlimited records
+
+For very large migrations (100,000+ records), the API is significantly faster and more reliable than CSV imports.
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/import-relations.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/import-relations.mdx
new file mode 100644
index 0000000000..502e1605fe
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/import-relations.mdx
@@ -0,0 +1,148 @@
+---
+title: Import Relations Between Objects
+description: Import relationships between records via CSV.
+---
+
+## Overview
+
+Twenty supports importing relationships between objects during CSV import. This allows you to link records (e.g., attach People to Companies) as part of your data migration.
+
+**Currently supported for import**: One-to-many relations pointing to a single object type on each side (e.g., People → Companies). Relations pointing to multiple object types are not yet supported in import/export.
+
+## How Relations Work in Twenty
+
+### One to Many / Many to One
+
+Twenty supports standard relations where one record links to many others:
+
+* **One Company → Many People**: A company can have multiple employees, but each person belongs to one company
+* **One Company → Many Opportunities**: A company can have multiple deals, but each opportunity belongs to one company
+
+### Relations That Can Point to Multiple Object Types
+
+Some relations can connect to different types of objects. This works in two ways:
+
+**Pattern 1: Many records linking to one record each from different object types**
+
+Several Notes, Tasks, or Activities can each be attached to multiple object types at once:
+
+* **Notes** can be linked to one Person, one Company, and one Opportunity simultaneously
+* **Tasks** can be linked to one Person, one Company, and one Opportunity simultaneously
+
+Here, the Notes/Tasks are on the "many" side. Each links to one record per object type.
+
+
+
+**Pattern 2: One record receiving links from many records of different object types**
+
+A Project can receive links from multiple records across different object types:
+
+* **A Project** can have many People linked to it, many Companies linked to it, and many Notes attached to it
+
+Here, the Project is on the "one" side. Multiple records from different objects can all link to the same Project.
+
+
+
+
+ **Import/Export limitation**: Relations that point to multiple object types (like Notes → People/Companies/Opportunities) are **not yet supported** in CSV import or export.
+
+ * **Import**: Only one-to-many relations pointing to a single object type on each side can be imported
+ * **Export**: Columns for relations pointing to multiple object types are currently left empty
+
+ This is on our roadmap.
+
+
+### What's Not Supported Today
+
+**Many to Many relations** are not yet available. For example, you cannot currently create a relation where:
+
+* Many People are linked to many Projects
+
+Many to Many relations are planned for H1 2026.
+
+## Linking Records During Import
+
+**Reminder**: Only one-to-many relations pointing to a single object type can be imported (e.g., People → Companies). Relations pointing to multiple object types (e.g., Notes → People/Companies/Opportunities) are not yet supported.
+
+### Step 1: Identify the "One" and "Many" Sides
+
+First, determine which object is on the "one" side and which is on the "many" side of the relationship.
+
+**Example**:
+
+* **Company** is the "one" side (one company has many employees)
+* **People** is the "many" side (each person belongs to one company)
+
+### Step 2: Ensure the "One" Side Records Exist
+
+Before importing the "many" side, the "one" side records must already exist in Twenty.
+
+* Import or create the "one" side records first (e.g., Companies)
+* Validate their unique identifier. This can be:
+ * The `id` (Twenty's UUID)
+ * A field set as unique (e.g., `domain` for Companies, or an external ID from your previous system)
+
+The import will fail if a reference is made to a record that does not exist.
+
+### Step 3: Prepare Your CSV File
+
+Add a column in your "many" side CSV file that references the "one" side record.
+
+**Example**: For a People CSV file linking to Companies:
+
+```
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+**Important**:
+
+* The value must **exactly match** the unique field on the Company record
+* For domains, use the **Domain URL** (e.g., `https://acme.com`), not the Domain Label
+* Map only **one** unique identifier per relation: this leads to a smoother import
+
+### Step 4: Ensure the Relation Field Exists
+
+Before uploading your file, make sure the relation field exists between your objects.
+
+If it doesn't exist:
+
+1. Go to **Settings → Data Model**
+2. Select your object (e.g., People)
+3. Create a relation field pointing to the target object (e.g., Company)
+
+### Step 5: Upload and Map the Relation
+
+1. Upload your CSV file via the import UI
+2. In the field mapping step, find your relation column (e.g., `companyDomain`)
+3. Map it to the relation field (e.g., Company)
+4. Twenty will automatically link each record to the matching parent
+
+### Available Unique Fields for Relations
+
+| Object | Unique Fields Available |
+| ------------------------------------- | --------------------------------------- |
+| **Companies** | `id`, `domain`, any custom unique field |
+| **People** | `id`, `email`, any custom unique field |
+| **Workspace Members** | `id`, `email` (not name) |
+| **Other standard and custom objects** | `id`, any field marked as unique |
+
+**Linking to Workspace Members**: When the relation points to Workspace Members (your team logging into Twenty), reference them by their **email address**, not their name.
+
+We recommend using `domain` for Companies and `email` for People, as these are human-readable and easy to maintain in spreadsheets.
+
+**Reminder**: Soft-deleted records (visible under Command Menu → See deleted records) count toward uniqueness criteria. If you import a record with the same unique value as a deleted record, the deleted record will be restored. See [Uniqueness Constraints](/l/ko/user-guide/data-migration/capabilities/uniqueness-constraints) for more details.
+
+## Import Order Rule
+
+
+ **Always import the "one" side first!**
+
+ 1. **Companies** first (no dependencies)
+ 2. **People** second (linked to Companies)
+ 3. **Opportunities** third (linked to Companies/People)
+ 4. **Custom objects** following their dependencies
+
+ The parent record must exist before you can reference it.
+
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/uniqueness-constraints.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/uniqueness-constraints.mdx
new file mode 100644
index 0000000000..5f6d05701b
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/capabilities/uniqueness-constraints.mdx
@@ -0,0 +1,72 @@
+---
+title: Uniqueness Constraints
+description: How Twenty enforces data uniqueness during import.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Overview
+
+Twenty enforces uniqueness on certain fields to prevent duplicate records and ensure data integrity. Understanding these constraints is essential for successful imports.
+
+## Default Unique Fields
+
+| Object | Unique Fields |
+| ------------------ | ---------------------- |
+| **People** | `id`, `email` |
+| **Companies** | `id`, `domain` |
+| **Custom objects** | `id` only (by default) |
+
+The `id` field is Twenty's internal identifier, auto-generated for each record. It uses UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
+
+## Custom Unique Fields
+
+You can define additional unique fields under **Settings → Data Model**:
+
+1. Go to **Settings → Data Model**
+2. Select the object
+3. Click on a field
+4. Enable **Unique** in field settings
+
+### Use Cases for Custom Unique Fields
+
+* **External IDs**: Store IDs from other systems (Salesforce ID, HubSpot ID)
+* **Business identifiers**: Employee numbers, customer codes
+* **Alternative contact info**: LinkedIn profile, phone number
+
+The field name `id` is reserved for Twenty's internal ID. Use a different name like `externalId` or `legacyId` for external identifiers.
+
+## Import Behavior
+
+### Creating New Records
+
+If a unique field value doesn't exist, a new record is created.
+
+### Updating Existing Records
+
+If a unique field value matches an existing record, that record is **updated** with the new data.
+To **update existing records**, it is recommended to **only match one unique field**.
+
+### Soft-Deleted Records
+
+
+ **Deleted records count toward uniqueness.**
+
+ Soft-deleted records (visible under Command Menu → See deleted records) are included in uniqueness checks. If you import a record with the same unique value as a deleted record, the deleted record will be **restored** with the new data.
+
+
+## Duplicate Detection During Import
+
+During the validation phase:
+
+* Duplicates within your file are highlighted in yellow
+* You can edit or remove duplicate rows from the UI before starting the import
+
+
+
+## Best Practices
+
+1. **Remove duplicates** from your file before importing
+2. **Check for existing records** in Twenty before importing
+3. **Use external IDs** when migrating from other systems
+4. **Include unique fields** if you want to update existing records
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/export-your-data.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/export-your-data.mdx
new file mode 100644
index 0000000000..32df22faa7
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/export-your-data.mdx
@@ -0,0 +1,209 @@
+---
+title: Export Your Data
+description: Complete step-by-step guide to exporting data from Twenty.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Overview
+
+Export your workspace data to CSV for backups, reporting, or migration.
+
+**Use cases:**
+
+* **Regular backups** — keep copies of your data
+* **External reporting** — analyze data in Excel, Google Sheets, or BI tools
+* **Migration** — move data to another system
+* **Bulk updates** — export, edit, and re-import to update records
+
+## What You Need to Know
+
+### Export Limits
+
+* **Maximum 20,000 records** per export
+* Only **visible columns** are exported
+* Only **filtered records** are exported (based on your current view)
+
+For larger exports (20,000+ records), use filters to export in batches or use the [API](/l/ko/developers/extend/capabilities/apis).
+
+### Permissions
+
+You need the **"Export CSV"** permission to export data. Contact your workspace admin if you don't have this option.
+
+## Step 1: Navigate to the Object
+
+Go to the object you want to export:
+
+* **People** — for contacts
+* **Companies** — for organizations
+* **Opportunities** — for deals
+* **Custom objects** — any object you've created
+
+## Step 2: Configure Your View
+
+**Important:** The export includes only what's visible in your current view.
+
+### Add/Remove Columns
+
+1. Click **Options → Fields** (or the **+** at the end of columns)
+2. Check the fields you want to export
+3. Uncheck fields you don't need
+
+### Filter Records (Optional)
+
+If you only need a subset of data:
+
+1. Click **Filter**
+2. Add filter conditions (e.g., "Created date > January 1, 2024")
+3. Only matching records will be exported
+
+### Sort Records (Optional)
+
+1. Click a column header to sort
+2. The export will follow your sort order
+
+**Create a dedicated export view.** Save a view specifically configured for exports so you don't need to reconfigure each time.
+
+## Step 3: Export the Data
+
+1. Click the **⋮** icon on the top right of the table
+2. Select **Export view**
+3. Choose where to save the CSV file
+4. Wait for the download to complete
+
+## What Gets Exported
+
+| Included | Not Included |
+| -------------------------------- | ---------------------- |
+| All visible columns | Hidden columns |
+| Records matching current filters | Filtered-out records |
+| Custom field values | Fields not in the view |
+| Record IDs | File attachments |
+| Relation IDs | Images |
+
+### Relation Fields
+
+Relation IDs are only exported on the **"many" side** of a relationship:
+
+* **People export** includes a `companyId` column (People → Company relation)
+* **Companies export** does NOT include `peopleIds` (Companies is the "one" side)
+
+This means you can use the People export to re-import and maintain the Company link, but you'll need to re-import People after Companies to recreate the relationships.
+
+## Exporting for Specific Purposes
+
+### For Backups
+
+1. Create a view with **all fields** visible
+2. Remove all filters to include all records
+3. Export each object type separately
+4. Store exports in a secure location
+5. Set a recurring reminder (weekly/monthly)
+
+### For External Reporting
+
+1. Include only the fields you need for analysis
+2. Apply filters to focus on relevant data
+3. Consider sorting by the field you'll analyze
+
+### For Bulk Updates
+
+1. Export the records you want to update
+2. Include the unique identifier (`email`, `domain`, or `id`)
+3. Edit the exported file
+4. Re-import to update records
+ See: [How to Update Existing Records](/l/ko/user-guide/data-migration/how-tos/update-existing-records-via-import)
+
+### For Migration
+
+If you're exporting to migrate to another system:
+
+1. **Export each object separately** — People, Companies, Opportunities, etc.
+2. **Include ID fields** — these help maintain relationships
+3. **Document field mappings** — note how Twenty fields map to your target system
+
+## Handling Large Datasets (20,000+ Records)
+
+The export limit is 20,000 records. For larger datasets:
+
+### Option 1: Export in Batches
+
+1. Add a filter (e.g., "Created date" ranges)
+2. Export the first batch
+3. Change the filter
+4. Export the next batch
+5. Combine files in your spreadsheet
+
+**Example filters for batching:**
+
+* By date range (January, February, March...)
+* By owner (Team member A, Team member B...)
+* By status (Active, Inactive...)
+
+### Option 2: Use the API
+
+The API has no record limit:
+
+1. Get your API key from **Settings → Developers**
+2. Use the GraphQL API to query records
+3. Process results in your application
+
+See: [API Documentation](/l/ko/developers/extend/capabilities/apis)
+
+## Tips and Best Practices
+
+### Create Export Views
+
+Save views configured specifically for exports:
+
+1. Configure columns and filters
+2. Click **View options** → **Save as new view**
+3. Name it "Export - [Purpose]"
+
+### Secure Your Exports
+
+Exported files may contain sensitive data:
+
+* Store in secure locations
+* Delete old exports when no longer needed
+* Be careful sharing export files
+
+### Check Before Exporting
+
+Correct columns are visible
+Filters are set correctly (or removed for full export)
+You have Export permission
+
+## FAQ
+
+
+
+ Only visible columns are exported. Add the columns you need via **Options → Fields** before exporting.
+
+
+
+ Check your filters. The export only includes records matching your current view filters. Remove filters to export all records.
+
+
+
+ Not in a single export. Use filters to export in batches, or use the API for larger datasets.
+
+
+
+ CSV (Comma Separated Values). Opens in Excel, Google Sheets, or any spreadsheet application.
+
+
+
+ Yes, but only on the "many" side of relationships. For example, a People export includes `companyId`, but a Companies export does not include people IDs.
+
+
+
+ Not directly through the UI. Use the API to build automated export workflows.
+
+
+
+## Next Steps
+
+* [How to Update Existing Records](/l/ko/user-guide/data-migration/how-tos/update-existing-records-via-import) — edit and re-import your export
+* [How to Import Data via API](/l/ko/user-guide/data-migration/how-tos/import-data-via-api) — for large datasets
+* [API Documentation](/l/ko/developers/extend/capabilities/apis) — build custom export workflows
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/fix-import-errors.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/fix-import-errors.mdx
new file mode 100644
index 0000000000..4807541513
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/fix-import-errors.mdx
@@ -0,0 +1,430 @@
+---
+title: Fix Import Errors
+description: Complete troubleshooting guide for resolving CSV import errors.
+---
+
+## Overview
+
+Import not working? This guide helps you identify and fix common import errors step by step.
+
+## How Import Validation Works
+
+After uploading your file and mapping columns, Twenty validates your data:
+
+1. **Validation runs** — Twenty checks each row for errors
+2. **Errors are highlighted** — problematic rows appear in **yellow**
+3. **You can fix in-place** — edit cells directly in the import UI
+4. **Or remove rows** — skip problematic records entirely
+
+**Fix errors in the UI.** You don't need to go back to your spreadsheet. Edit cells directly during import to save time.
+
+## Step-by-Step Troubleshooting
+
+### Step 1: Identify the Error Type
+
+Click on a highlighted row to see the specific error message. Common error types:
+
+| Error Message | What It Means |
+| --------------------------------------------------------------------- | ------------------------------------------------------------ |
+| Duplicate values highlighted in yellow | Value already exists in Twenty or appears twice in your file |
+| `{field} is not a valid {type}` (hover on yellow cell) | Data doesn't match expected format |
+| Required field highlighted | A required field is empty |
+| `Can't connect to {object}. No unique record found...` (import fails) | Referenced record doesn't exist |
+| `Too many records. Up to 10000 allowed` (upload blocked) | File has more than 10,000 records |
+
+### Step 2: Fix the Error
+
+Follow the specific instructions below for each error type.
+
+---
+
+## Error: Duplicate Value
+
+### What You'll See
+
+Rows with duplicate values are **highlighted in yellow** in the import UI before the import starts.
+
+### What It Means
+
+A unique field (email, domain) either:
+
+* Already exists in Twenty
+* Appears twice in your file
+
+### How to Fix
+
+**Option 1: Edit the duplicate value**
+
+1. Click the cell with the error
+2. Change to a unique value
+3. Continue with import
+
+**Option 2: Remove the duplicate row**
+
+1. Click the X next to the row
+2. The row will be skipped during import
+
+**Option 3: Let Twenty update the existing record**
+
+1. Ensure your file includes a unique identifier (`email`, `domain`, or `id`)
+2. Map the unique identifier field
+3. Twenty will update the existing record instead of creating a duplicate
+
+
+ **You can update unique fields too.**
+
+ * If you keep the `id` but change the `email` → the email will be updated
+ * If you keep the `email` but change the `id` → the id will be updated
+
+ As long as one unique identifier matches, Twenty updates the record.
+
+
+### How to Prevent This Error
+
+Before importing:
+
+1. Sort your spreadsheet by the unique field
+2. Remove duplicate rows
+3. Check if records already exist in Twenty
+
+
+ **Soft-deleted records count toward uniqueness.**
+
+ Check Command Menu → See deleted records. Records there still enforce uniqueness. Permanently delete them or restore and update.
+
+
+For more details: [Uniqueness Constraints](/l/ko/user-guide/data-migration/capabilities/uniqueness-constraints)
+
+---
+
+## Error: Invalid Format
+
+### What You'll See
+
+The cell value is highlighted in yellow. Hover over it to see the error message:
+
+```
+{field name} is not a valid {field type}
+```
+
+### What It Means
+
+The data doesn't match the expected format for that field type.
+
+### How to Fix — By Field Type
+
+#### Email
+
+**Problem:** Invalid email format
+**Solution:** Use format `name@domain.com`
+
+```
+❌ john.smith@
+❌ john smith@acme.com
+✓ john.smith@acme.com
+```
+
+#### Domain
+
+**Problem:** Inconsistent format may cause duplicates
+**Solution:** Use `https://domain.com` format (recommended)
+
+```
+⚠️ acme.com (valid, but not recommended)
+⚠️ www.acme.com (valid, but not recommended)
+✅ https://acme.com (recommended)
+```
+
+All formats are valid, but `https://domain.com` is recommended because it matches the format used by email/calendar sync. Using other formats may create duplicate companies.
+
+#### Date
+
+**Problem:** Unrecognized date format
+**Solution:** Use consistent format throughout file
+
+```
+✓ 2024-03-15 (YYYY-MM-DD - recommended)
+✓ 03/15/2024 (MM/DD/YYYY)
+✓ 15/03/2024 (DD/MM/YYYY)
+```
+
+#### Phone
+
+**Problem:** Missing required columns
+**Solution:** Include all phone columns
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+#### Boolean
+
+**Problem:** Wrong boolean value
+**Solution:** Use uppercase `TRUE` or `FALSE`
+
+```
+❌ true
+❌ yes
+❌ 1
+✓ TRUE
+✓ FALSE
+```
+
+#### Select / Multi-Select
+
+**Problem:** Value doesn't match existing options
+**Solution:** Use **API names**, not display labels
+
+How to find API names:
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at bottom right)
+4. Use the API name (e.g., `OPTION_1`, not "Option 1")
+
+```
+❌ High Priority
+✓ HIGH_PRIORITY
+```
+
+#### Currency
+
+**Problem:** Missing amount or currency code
+**Solution:** Fill both columns
+
+| Column | Example |
+| --------------------- | --------- |
+| **Amount / Amount** | `1234.56` |
+| **Amount / Currency** | `USD` |
+
+#### Number
+
+**Problem:** Non-numeric characters
+**Solution:** Numbers only, period for decimals
+
+```
+❌ $1,234.56
+❌ 1,234.56
+✓ 1234.56
+```
+
+For complete format reference: [Field Mapping](/l/ko/user-guide/data-migration/capabilities/field-mapping)
+
+---
+
+## Error: Required Field Missing
+
+### What You'll See
+
+The row is highlighted in yellow with the required field cell marked.
+
+### What It Means
+
+A required field is empty for this row.
+
+### How to Fix
+
+**Option 1: Enter a value**
+
+1. Click the empty cell
+2. Enter a value
+3. Continue with import
+
+**Option 2: Remove the row**
+
+1. If you don't have the data, click X to skip the row
+
+### How to Prevent This Error
+
+Before importing, identify required fields:
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Check which fields are marked as required
+
+---
+
+## Error: Relation Not Found
+
+### What You'll See
+
+This error appears **after the import starts** — the import fails with a message like:
+
+```
+Can't connect to company. No unique record found with condition: id = 7776ee49-f608-4a77-8cc8-6fe96ae1e43f
+```
+
+This means there is no Company in Twenty with that specific identifier.
+
+Unlike other errors, this one is not caught during the data review step. The import will start and then fail when it encounters the missing relation.
+
+### What It Means
+
+You're trying to link to a record that doesn't exist in Twenty.
+
+### How to Fix
+
+**Option 1: Import parent records first**
+
+1. Cancel the current import
+2. Import the parent records (e.g., Companies)
+3. Then import the child records (e.g., People)
+
+**Option 2: Fix the reference value**
+
+1. Check the reference value in your file
+2. Ensure it exactly matches an existing record
+3. Verify format: domains should be `https://domain.com`
+
+**Option 3: Remove the relation**
+
+1. Clear the cell to import without the relation
+2. Add the relation manually later
+
+### How to Prevent This Error
+
+1. **Import in the correct order:**
+ * Companies first
+ * People second (with company references)
+ * Opportunities third
+
+2. **Verify reference values:**
+ * Export parent records to get exact identifiers
+ * Use domain format `https://domain.com`
+ * Check for typos and case sensitivity
+
+
+ **Import will fail if a reference is made to a non-existent record.**
+
+ Always import parent objects before child objects.
+
+
+For more details: [Import Relations](/l/ko/user-guide/data-migration/capabilities/import-relations)
+
+---
+
+## Error: File Too Large
+
+### What You'll See
+
+This error appears **when uploading your file** — the upload is blocked entirely:
+
+```
+Too many records. Up to 10000 allowed
+```
+
+You won't be able to proceed to the data review step until you reduce the file size.
+
+### What It Means
+
+Your file has more than 10,000 records.
+
+### How to Fix
+
+**Option 1: Split into multiple files**
+
+1. Divide your data into files of 10,000 records or fewer
+2. Import each file separately
+3. Maintain import order (Companies before People)
+
+**Option 2: Use API import**
+For very large datasets, use the API which has no record limit.
+See: [How to Import Data via API](/l/ko/user-guide/data-migration/how-tos/import-data-via-api)
+
+---
+
+## Error: Field Not Recognized
+
+### What It Means
+
+A column in your file can't be mapped because the field doesn't exist in Twenty.
+
+### How to Fix
+
+1. Go to **Settings → Data Model**
+2. Select the object you're importing
+3. Click **+ Add field**
+4. Create the custom field with the appropriate type
+5. Re-upload your file
+
+The CSV import creates records, not fields. All fields must exist before importing.
+
+---
+
+## Error: User Relation Empty
+
+### What It Means
+
+You're trying to assign a record to a user (Owner, Assignee) but the relation isn't being mapped.
+
+### Common Causes
+
+1. **User hasn't accepted their invitation** — the user doesn't exist in Twenty yet
+2. **Using user ID from old system** — Twenty can't match IDs from another system
+3. **Wrong email format** — the email doesn't match the user's Twenty account
+
+### How to Fix
+
+1. Ensure all users have **accepted their invitation** to your Twenty workspace
+2. Use the user's **email address** (not their name or old system ID)
+3. Use the same email they used to join Twenty
+
+
+ **Users must accept invitations before importing.**
+
+ If a user hasn't accepted their invitation, records referencing them will have empty user relations.
+
+
+---
+
+## Pre-Import Checklist
+
+Avoid errors by checking these before importing:
+
+### File Requirements
+
+File is CSV, XLSX, or XLS format
+File has fewer than 10,000 records
+File uses UTF-8 encoding
+
+### Data Quality
+
+No duplicate emails (for People)
+No duplicate domains (for Companies)
+All dates use consistent format
+All domains use `https://domain.com` format
+
+### Field Formats
+
+Boolean fields use `TRUE` or `FALSE` (uppercase)
+Select fields use API names, not display labels
+Phone fields have all required columns
+Currency fields have both Amount and Currency Code
+
+### Relations
+
+Parent records imported before child records
+Relation columns reference existing records
+Domain format matches Twenty's format exactly
+
+### Data Model
+
+All custom fields exist in Settings → Data Model
+Select options exist before importing
+
+---
+
+## Still Having Issues?
+
+If you've tried the above solutions:
+
+1. **Download the sample file** — see the exact format Twenty expects
+2. **Export existing records** — compare your file to working data
+3. **Test with a small batch** — try 5-10 rows first
+4. **Check the reference articles:**
+ * [Field Mapping](/l/ko/user-guide/data-migration/capabilities/field-mapping)
+ * [Uniqueness Constraints](/l/ko/user-guide/data-migration/capabilities/uniqueness-constraints)
+ * [Import Relations](/l/ko/user-guide/data-migration/capabilities/import-relations)
+ * [Error Handling](/l/ko/user-guide/data-migration/capabilities/error-handling)
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/import-companies-via-csv.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
new file mode 100644
index 0000000000..d944fd2f0d
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
@@ -0,0 +1,201 @@
+---
+title: Import Companies via CSV
+description: Complete step-by-step guide to importing companies into Twenty.
+---
+
+## Overview
+
+This guide walks you through importing your companies into Twenty. **Companies should be imported first** because People and Opportunities link to Companies.
+
+## Before You Start
+
+### Prerequisites Checklist
+
+
+ Your file is CSV, XLSX, or XLS format
+
+
+
+ File has fewer than 10,000 records
+
+
+
+ No duplicate domains in your file
+
+
+
+ All custom fields exist in **Settings → Data Model**
+
+
+
+ Need to import more than 10,000 companies? Split into multiple files or use the [API import](/l/ko/user-guide/data-migration/how-tos/import-data-via-api).
+
+
+## Step 1: Prepare Your Company Data
+
+### Required and Recommended Fields
+
+| Field | Required? | Format | Notes |
+| ----------------- | ----------- | -------------------- | ------------------------ |
+| **Name** | Recommended | Text | Company display name |
+| **Domain** | Recommended | `https://domain.com` | Unique identifier |
+| **Address** | Optional | Multiple columns | See below |
+| **Employees** | Optional | Number | Employee count |
+| **Custom fields** | Optional | Varies | Must exist in Data Model |
+
+### Domain Format
+
+
+ **Use the format `https://domain.com` for domains.**
+
+ This matches the format used when Companies are auto-created from email/calendar sync, preventing duplicates later.
+
+
+**Domain columns:**
+
+* **Domain / Domain Label**: `acme.com`
+* **Domain / Domain URL**: `https://acme.com`
+
+### Address Format
+
+Address is a nested field with multiple columns:
+
+```
+Address / Address 1,Address / City,Address / State,Address / Country,Address / Post Code
+123 Main Street,San Francisco,CA,USA,94105
+```
+
+### Sample CSV Structure
+
+```csv
+name,Domain / Domain URL,Domain / Domain Label,Address / City,Address / Country,employees
+Acme Corp,https://acme.com,acme.com,San Francisco,USA,250
+Widget Co,https://widgets.co,widgets.co,New York,USA,50
+```
+
+
+ **Pro tip:** Click **Download sample file** during import to see the exact column names Twenty expects.
+
+
+## Step 2: Access the Import Feature
+
+**Option 1: From the Companies View**
+
+1. Navigate to **Companies** in the left sidebar
+2. Click the **⋮** icon on the top right
+3. Select **Import records**
+
+**Option 2: Using Command Menu**
+
+1. Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+2. Type "import"
+3. Select **Import records**
+4. Choose **Companies**
+
+## Step 3: Upload Your File
+
+1. Click **Select file**
+2. Choose your CSV, XLSX, or XLS file
+3. Wait for Twenty to analyze your file
+
+## Step 4: Map Your Columns
+
+Twenty automatically tries to match your columns to fields. Review and adjust:
+
+1. **Check automatic mappings** — verify they're correct
+2. **Fix incorrect mappings** — click the dropdown to select the right field
+3. **Skip columns** — select **Do not map** for columns you don't want to import
+
+### Important Mapping Rules
+
+* **Domain**: Map to **Domain / Domain URL** (not Domain Label)
+* **Address**: Map each part to its specific column (City, State, etc.)
+* **Select fields**: Values must match existing options (or you'll map them in the next step)
+
+
+
+## Step 5: Map Select Field Values
+
+If you have Select or Multi-Select fields:
+
+1. Twenty shows your values alongside existing options
+2. Match each value in your file to a Twenty option
+3. Or create new options if needed
+
+
+ Select options use **API names**, not display labels. Check **Settings → Data Model** → Enable **Advanced mode** to see API names.
+
+
+## Step 6: Review and Fix Errors
+
+Before completing the import, Twenty validates your data:
+
+1. Click **Next Steps**
+2. Rows with errors are highlighted in **yellow**
+3. **Fix errors directly** — click a cell and edit the value
+4. **Remove problematic rows** — click the X to skip that row
+
+### Common Company Import Errors
+
+| Error | Cause | Solution |
+| -------------------------- | ------------------------------- | ------------------------------------------ |
+| **Duplicate domain** | Domain already exists in Twenty | Remove from file or update existing record |
+| **Invalid domain format** | Wrong format | Use `https://domain.com` |
+| **Missing required field** | Required field is empty | Fill in the value or remove the row |
+
+## Step 7: Complete the Import
+
+1. Review the import summary
+2. Click **Confirm** to import
+3. Wait for the import to complete
+4. Verify by checking a few records
+
+## After Importing Companies
+
+Now you can import records that link to Companies:
+
+1. **[Import People](/l/ko/user-guide/data-migration/how-tos/import-contacts-via-csv)** — link them to Companies using the domain
+2. **Import Opportunities** — link them to Companies
+3. **Verify the import** — spot-check a few records to ensure data is correct
+
+## Updating Existing Companies
+
+To update companies instead of creating new ones:
+
+1. Include the `domain` or `id` column in your file
+2. Twenty matches records by this unique identifier
+3. Existing companies are updated; new ones are created
+
+See [How to Update Existing Records](/l/ko/user-guide/data-migration/how-tos/update-existing-records-via-import) for details.
+
+## FAQ
+
+
+
+ Domain is a unique identifier in Twenty. This prevents duplicate companies and ensures email sync correctly links emails to the right company.
+
+
+
+ You can leave the domain empty. However, we recommend adding domains when possible for better data quality and automatic email linking.
+
+
+
+ Yes! You can import companies first, then import People later and link them using the company domain.
+
+
+
+ If you include a unique identifier (domain or id) that matches an existing company, Twenty updates that company instead of creating a duplicate.
+
+
+
+ Either remove the duplicate from your file, or include the company's `id` to update the existing record instead.
+
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/ko/user-guide/data-migration/how-tos/fix-import-errors)
+* [Field Mapping Reference](/l/ko/user-guide/data-migration/capabilities/field-mapping)
+* [Uniqueness Constraints](/l/ko/user-guide/data-migration/capabilities/uniqueness-constraints)
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
new file mode 100644
index 0000000000..5208147292
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
@@ -0,0 +1,242 @@
+---
+title: Import Contacts via CSV
+description: Complete step-by-step guide to importing people/contacts into Twenty.
+---
+
+## Overview
+
+This guide walks you through importing your contacts (People) into Twenty. **Import Companies first** if you want to link People to Companies.
+
+## Before You Start
+
+### Prerequisites Checklist
+
+
+ Your file is CSV, XLSX, or XLS format
+
+
+
+ File has fewer than 10,000 records
+
+
+
+ No duplicate email addresses in your file
+
+
+
+ **Companies imported first** (if linking People to Companies)
+
+
+
+ All custom fields exist in **Settings → Data Model**
+
+
+
+ **Import Companies Before People**
+
+ If you want to link People to Companies, import Companies first. The Company must exist before you can reference it.
+
+
+## Step 1: Prepare Your Contact Data
+
+### Required and Recommended Fields
+
+| Field | Required? | Format | Notes |
+| ----------------- | ----------- | ----------------- | ------------------------- |
+| **Email** | Recommended | `name@domain.com` | Must be unique |
+| **First Name** | Recommended | Text | |
+| **Last Name** | Recommended | Text | |
+| **Company** | Optional | Domain or ID | Links to existing Company |
+| **Phone** | Optional | Multiple columns | See below |
+| **Job Title** | Optional | Text | |
+| **Custom fields** | Optional | Varies | Must exist in Data Model |
+
+### Email Format
+
+* Must be valid email format: `name@domain.com`
+* **Must be unique** — no duplicates in your file or in Twenty
+* For additional emails, use the **Emails / Additional Emails** column:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Phone Format
+
+Phone is a **nested field** requiring multiple columns:
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+### Linking to Companies
+
+Add a column with the Company's unique identifier:
+
+| Column Name | Format | Example |
+| --------------- | ---------- | -------------------------------------- |
+| `companyDomain` | URL format | `https://acme.com` |
+| `companyId` | UUID | `c776ee49-f608-4a77-8cc8-6fe96ae1e43f` |
+
+
+ **Use Domain URL format** (`https://acme.com`), not the label. This matches how Companies are stored in Twenty.
+
+
+### Sample CSV Structure
+
+```csv
+firstName,lastName,email,jobTitle,companyDomain,Phones / Primary Phone Number,Phones / Primary Phone Country Code
+John,Smith,john@acme.com,CEO,https://acme.com,4159095555,US
+Jane,Doe,jane@widgets.co,CTO,https://widgets.co,2125551234,US
+```
+
+
+ **Pro tip:** Click **Download sample file** during import or export a few existing People to see the exact column names Twenty expects.
+
+
+## Step 2: Access the Import Feature
+
+**Option 1: From the People View**
+
+1. Navigate to **People** in the left sidebar
+2. Click the **⋮** icon on the top right
+3. Select **Import records**
+
+**Option 2: Using Command Menu**
+
+1. Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+2. Type "import"
+3. Select **Import records**
+4. Choose **People**
+
+## Step 3: Upload Your File
+
+1. Click **Select file**
+2. Choose your CSV, XLSX, or XLS file
+3. Wait for Twenty to analyze your file
+
+## Step 4: Map Your Columns
+
+Twenty automatically tries to match your columns to fields. Review and adjust:
+
+1. **Check automatic mappings** — verify they're correct
+2. **Fix incorrect mappings** — click the dropdown to select the right field
+3. **Skip columns** — select **Do not map** for columns you don't want to import
+
+### Important Mapping Rules
+
+| Column Type | Map To | Notes |
+| ----------------- | ------------------------------ | ---------------------------------- |
+| Company reference | **Company** relation field | Use domain OR id, not both |
+| Email | **Email** | Primary email address |
+| Additional emails | **Emails / Additional Emails** | Array format |
+| Phone | Separate columns | Number, Country Code, Calling Code |
+
+
+
+### Mapping the Company Relation
+
+When mapping the company column:
+
+1. Find your company reference column (e.g., `companyDomain`)
+2. Map it to the **Company** relation field
+3. Twenty will link each Person to the matching Company
+
+
+ **Map only ONE unique identifier for relations.**
+
+ Don't map both `companyId` AND `companyDomain`. Choose one—preferably domain since it's human-readable.
+
+
+## Step 5: Map Select Field Values
+
+If you have Select or Multi-Select fields (like Lead Source):
+
+1. Twenty shows your values alongside existing options
+2. Match each value in your file to a Twenty option
+3. Or create new options if needed
+
+
+ Select options use **API names**, not display labels. Check **Settings → Data Model** → Enable **Advanced mode** to see API names.
+
+
+## Step 6: Review and Fix Errors
+
+Before completing the import, Twenty validates your data:
+
+1. Click **Next Steps**
+2. Rows with errors are highlighted in **yellow**
+3. **Fix errors directly** — click a cell and edit the value
+4. **Remove problematic rows** — click the X to skip that row
+
+### Common Contact Import Errors
+
+| Error | Cause | Solution |
+| -------------------------- | -------------------------------------- | ------------------------------------------- |
+| **Duplicate email** | Email already exists in Twenty or file | Remove duplicate or update existing record |
+| **Invalid email format** | Email format incorrect | Fix to `name@domain.com` |
+| **Relation not found** | Company doesn't exist | Import Companies first or fix the reference |
+| **Missing required field** | Required field is empty | Fill in the value or remove the row |
+
+## Step 7: Complete the Import
+
+1. Review the import summary
+2. Click **Confirm** to import
+3. Wait for the import to complete
+4. Verify by checking a few records and their Company links
+
+## After Importing Contacts
+
+Your contacts are now in Twenty! Next steps:
+
+1. **Verify Company links** — open a few People records to confirm they're linked to the right Company
+2. **Import Opportunities** — if needed, link them to People and Companies
+3. **Set up email sync** — connect your mailbox to see email history on contact records
+
+## Updating Existing Contacts
+
+To update contacts instead of creating new ones:
+
+1. Include the `email` or `id` column in your file
+2. Twenty matches records by this unique identifier
+3. Existing contacts are updated; new ones are created
+
+See [How to Update Existing Records](/l/ko/user-guide/data-migration/how-tos/update-existing-records-via-import) for details.
+
+## FAQ
+
+
+
+ Email is a unique identifier in Twenty. This prevents duplicate contacts and ensures email sync correctly links emails to the right person.
+
+
+
+ You can leave the email empty. However, we recommend adding emails when possible for better data quality and email sync functionality.
+
+
+
+ Add a column with the Company's domain (e.g., `https://acme.com`) or ID. During mapping, connect this column to the Company relation field.
+
+
+
+ Import Companies first, then import People. The Company must exist before you can reference it.
+
+
+
+ Yes! Create a custom field marked as "unique" in your data model to store the external ID. Note: the field name `id` is reserved for Twenty's internal ID.
+
+
+
+ The Company you're referencing doesn't exist. Either import the Company first, or check that the domain/ID exactly matches an existing Company.
+
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/ko/user-guide/data-migration/how-tos/fix-import-errors)
+* [How to Import Relations](/l/ko/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+* [Field Mapping Reference](/l/ko/user-guide/data-migration/capabilities/field-mapping)
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/import-data-via-api.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/import-data-via-api.mdx
new file mode 100644
index 0000000000..38d88a517a
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/import-data-via-api.mdx
@@ -0,0 +1,176 @@
+---
+title: Import Data via API
+description: When and how to use Twenty's APIs for large-scale data imports.
+---
+
+## Overview
+
+Twenty provides both **GraphQL** and **REST APIs** for programmatic data import. Use the API when CSV import isn't practical for your data volume or when you need automated, recurring imports.
+
+## When to Use API Import
+
+| Scenario | Recommended Method |
+| ---------------------------------- | ----------------------------- |
+| Under 10,000 records | CSV Import |
+| 10,000 - 50,000 records | CSV Import (split into files) |
+| **50,000+ records** | **API Import** |
+| One-time migration | Either (based on volume) |
+| **Recurring imports** | **API Import** |
+| **Real-time sync** | **API Import** |
+| **Integration with other systems** | **API Import** |
+
+For datasets in the hundreds of thousands, the API is significantly faster and more reliable than multiple CSV imports.
+
+## API Rate Limits
+
+Twenty enforces rate limits to ensure system stability:
+
+| Limit | Value |
+| -------------------------- | --------------------- |
+| **Requests per minute** | 100 |
+| **Records per batch call** | 60 |
+| **Maximum throughput** | ~6,000 records/minute |
+
+
+ **Plan your import around these limits.**
+
+ For 100,000 records at maximum throughput, expect approximately 17 minutes of import time. Add buffer time for error handling and retries.
+
+
+## Getting Started
+
+### Step 1: Get Your API Key
+
+1. Go to **Settings → Developers**
+2. Click **+ Create API key**
+3. Give your key a descriptive name
+4. Copy the API key immediately (it won't be shown again)
+5. Store it securely
+
+
+ **Keep your API key secret.**
+
+ Anyone with your API key can access and modify your workspace data. Never commit it to code repositories or share it publicly.
+
+
+### Step 2: Choose Your API
+
+Twenty supports two API types:
+
+| API | Best For | Documentation |
+| ----------- | ----------------------------------------------------------- | ------------------------------------------------ |
+| **GraphQL** | Flexible queries, fetching related data, complex operations | [API Docs](/l/ko/developers/extend/capabilities/apis) |
+| **REST** | Simple CRUD operations, familiar REST patterns | [API Docs](/l/ko/developers/extend/capabilities/apis) |
+
+Both APIs support:
+
+* Creating, reading, updating, and deleting records
+* **Batch operations** — create or update up to 60 records per call
+
+**For imports, use batch operations** to maximize throughput within rate limits.
+
+### Step 3: Plan Your Import Order
+
+Just like CSV imports, **order matters** for relations:
+
+1. **Companies** first (no dependencies)
+2. **People** second (can link to Companies)
+3. **Opportunities** third (can link to Companies and People)
+4. **Tasks/Notes** (can link to any of the above)
+5. **Custom objects** (following their dependencies)
+
+## Best Practices
+
+### Batch Your Requests
+
+* Don't send records one at a time
+* Group up to **60 records per API call**
+* This maximizes throughput within rate limits
+
+### Handle Rate Limits
+
+* Implement delays between requests (600ms minimum for sustained imports)
+* Use exponential backoff when you hit limits
+* Monitor for 429 (Too Many Requests) responses
+
+### Validate Data First
+
+* Clean and validate your data before importing
+* Check required fields are populated
+* Verify formats match Twenty's requirements (see [Field Mapping](/l/ko/user-guide/data-migration/capabilities/field-mapping))
+
+### Log Everything
+
+* Log every record imported (including IDs)
+* Log errors with full context
+* This helps debug issues and verify completion
+
+### Test First
+
+* Test with a small batch (10-20 records)
+* Verify data appears correctly in Twenty
+* Then run the full import
+
+### Upsert to Avoid Duplicates
+
+The GraphQL API supports **batch upsert** — update if the record exists, create if not. This prevents duplicates when re-running imports.
+
+## Finding Object and Field Names
+
+To see available objects and fields:
+
+1. Go to **Settings → API and Webhooks**
+2. Browse the **Metadata API**
+3. View all standard and custom objects with their fields
+
+The documentation shows all standard and custom objects, their fields, and the expected data types.
+
+## Professional Services
+
+For complex API migrations, our partners can help:
+
+| Service | What's Included |
+| ----------------------- | ---------------------------------- |
+| **Data Model Design** | design your optimal data structure |
+| **Migration Scripts** | write and run the import scripts |
+| **Data Transformation** | handle complex mapping and cleanup |
+| **Validation & QA** | verify the migration is complete |
+
+**Best for:**
+
+* Migrations of 100,000+ records
+* Complex data transformations
+* Tight timelines
+* Teams without developer resources
+
+Contact us at [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/ko/user-guide/getting-started/capabilities/implementation-services).
+
+## FAQ
+
+
+
+ GraphQL lets you request exactly the data you need in a single query and is better for complex operations. REST uses standard HTTP methods (GET, POST, PUT, DELETE) and may be more familiar if you've worked with traditional APIs.
+
+
+
+ Yes! Use update mutations (GraphQL) or PUT/PATCH requests (REST) with the record's `id`.
+
+
+
+ Query for existing records first using unique identifiers (email, domain). Update if exists, create if not.
+
+
+
+ Yes, use delete mutations (GraphQL) or DELETE requests (REST).
+
+
+
+ Not currently, but both APIs work with any HTTP client in any language.
+
+
+
+## API Documentation
+
+For full implementation details, code examples, and schema reference:
+
+* [API Documentation](/l/ko/developers/extend/capabilities/apis)
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx
new file mode 100644
index 0000000000..20e20f4985
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx
@@ -0,0 +1,228 @@
+---
+title: Import Relations Between Objects via CSV
+description: Complete step-by-step guide to linking records during CSV import.
+---
+
+## Overview
+
+This guide walks you through importing relations between objects—for example, linking People to Companies, or Opportunities to People.
+
+**What can be imported:** Only one-to-many relations pointing to a single object type. Relations pointing to multiple object types (like Notes linking to People AND Companies) are not yet supported for import.
+
+## Understanding Relations
+
+### What is a "One-to-Many" Relation?
+
+In a one-to-many relation:
+
+* **One** Company has **many** People (employees)
+* **One** Company has **many** Opportunities
+* **One** Person has **many** Tasks
+
+The "one" side is the **parent**. The "many" side is the **child**.
+
+### Common Relations in Twenty
+
+| Relation | "One" Side (Parent) | "Many" Side (Child) |
+| ------------------------- | ------------------- | ------------------- |
+| Companies → People | Company | People |
+| Companies → Opportunities | Company | Opportunities |
+| People → Tasks | Person | Tasks |
+| People → Notes | Person | Notes |
+
+## Step 1: Identify the "One" and "Many" Sides
+
+Before importing, determine which object is the parent and which is the child.
+
+**Ask yourself:** "Does ONE [Object A] have MANY [Object B]?"
+
+* One Company → Many People ✓ (Company is parent)
+* One Person → Many Companies ✗ (This is wrong—a person belongs to one company)
+
+## Step 2: Import the Parent Records First
+
+The parent ("one" side) must exist in Twenty before you can reference it.
+
+**Import order:**
+
+1. **Companies** first (no dependencies)
+2. **People** second (link to Companies)
+3. **Opportunities** third (link to Companies and/or People)
+4. **Tasks/Notes** (link to any of the above)
+
+
+ **If the parent record doesn't exist, the import will fail.**
+
+ Always verify that Companies are imported before importing People with company references.
+
+
+## Step 3: Note the Parent's Unique Identifier
+
+You need to reference the parent record using a **unique identifier**. Available options:
+
+| Parent Object | Available Unique Identifiers |
+| --------------------- | --------------------------------------------------------------- |
+| **Companies** | `id` (UUID), `domain` (recommended), or any custom unique field |
+| **People** | `id` (UUID), `email`, or any custom unique field |
+| **Workspace Members** | `id` (UUID), `email` (not name) |
+| **Custom Objects** | `id` (UUID), or any field marked as unique |
+
+**Recommended:** Use `domain` for Companies and `email` for People. These are human-readable and easy to verify in your spreadsheet.
+
+### Finding the Identifier
+
+If you need the `id`:
+
+1. Export the parent records from Twenty
+2. The export includes the `id` column
+3. Use these IDs in your child records file
+
+## Step 4: Verify the Relation Field Exists
+
+Before importing, ensure the relation field exists between your objects.
+
+**To check or create:**
+
+1. Go to **Settings → Data Model**
+2. Select your child object (e.g., People)
+3. Look for a relation field pointing to the parent (e.g., Company)
+4. If it doesn't exist, create it:
+ * Click **+ Add field**
+ * Select **Relation** type
+ * Choose the parent object
+
+## Step 5: Prepare Your CSV File
+
+Add a column to your child CSV that references the parent using its unique identifier.
+
+### Example: People Linking to Companies
+
+**Your People CSV:**
+
+```csv
+firstName,lastName,email,jobTitle,companyDomain
+John,Smith,john@acme.com,CEO,https://acme.com
+Jane,Doe,jane@widgets.co,CTO,https://widgets.co
+Bob,Johnson,bob@techstart.io,Developer,https://techstart.io
+```
+
+The `companyDomain` column references the Company's domain.
+
+### Format Requirements
+
+| Identifier | Format | Example |
+| ---------- | -------------- | -------------------------------------- |
+| Domain | URL format | `https://acme.com` |
+| Email | Standard email | `john@acme.com` |
+| ID | UUID | `c776ee49-f608-4a77-8cc8-6fe96ae1e43f` |
+
+
+ **Domain format matters!**
+
+ Use `https://domain.com` (not just `domain.com`). This matches how Twenty stores Company domains and prevents matching errors.
+
+
+### Important Rules
+
+1. **Exact match required** — the value must exactly match the parent record
+2. **Map only ONE unique identifier** — don't include both `companyId` AND `companyDomain`
+3. **Case sensitive** — `Acme.com` ≠ `acme.com`
+
+## Step 6: Upload and Map the Relation
+
+1. Navigate to the child object (e.g., People)
+2. Click **⋮** → **Import records**
+3. Upload your CSV file
+4. In the field mapping step:
+ * Find your relation column (e.g., `companyDomain`)
+ * Map it to the **Company** relation field
+5. Complete the remaining mapping
+6. Review errors and confirm
+
+Twenty will automatically link each child record to the matching parent.
+
+## Step 7: Verify the Import
+
+After importing:
+
+1. Open a few child records (e.g., People)
+2. Verify the relation field shows the correct parent (e.g., Company)
+3. Open a parent record and check the related records section
+
+## Common Mistakes to Avoid
+
+| Mistake | Problem | Solution |
+| -------------------------- | -------------------------------------------------- | ------------------------------------------------------- |
+| **Wrong import order** | Importing People before Companies | Always import parents first, then children |
+| **Wrong domain format** | Using `acme.com` instead of `https://acme.com` | Use full URL format with `https://` |
+| **Multiple unique fields** | Mapping both `companyId` AND `companyDomain` | Map only ONE unique identifier |
+| **Missing relation field** | The relation field doesn't exist in the data model | Create it in **Settings → Data Model** before importing |
+| **Non-existent records** | The parent record doesn't exist in Twenty | Import parent records first, or check for typos |
+| **Case mismatch** | `Acme.com` in file but `acme.com` in Twenty | Ensure exact case matching |
+
+## Linking to Workspace Members
+
+When linking to Workspace Members (your team):
+
+* Use their **email address**, not their name
+* Example: `owner@yourcompany.com`, not "John Smith"
+
+```csv
+taskName,assignedTo
+Follow up with client,john@yourcompany.com
+Review proposal,jane@yourcompany.com
+```
+
+## FAQ
+
+
+
+ You have two options:
+
+ 1. Use the Twenty `id` (export parent records to get their IDs)
+ 2. Create a custom unique field in your data model to store an external ID from your previous system
+
+
+
+ Yes! Include the child record's unique identifier (e.g., `email` for People) and the new relation value. The import will update the relation.
+
+
+
+ Many-to-Many relations are not yet supported for import. This is planned for H1 2026.
+
+
+
+ Relations pointing to multiple object types are not yet supported for import/export. This is on our roadmap.
+
+
+
+ The import will show an error for that row. You can either:
+
+ * Import the parent record first, then re-import
+ * Fix the reference value
+ * Remove the row from import
+
+
+
+ Common causes:
+
+ * Wrong format (use `https://domain.com` for domains)
+ * Case mismatch (check exact spelling)
+ * Parent doesn't exist (import parents first)
+ * Mapping multiple identifiers (use only one)
+
+
+
+
+ **Remember: Soft-deleted records count toward uniqueness.**
+
+ If you're getting "not found" errors but the record seems to exist, check Command Menu → See deleted records. The parent may have been soft-deleted.
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/ko/user-guide/data-migration/how-tos/fix-import-errors)
+* [Import Relations Capabilities](/l/ko/user-guide/data-migration/capabilities/import-relations)
+* [Uniqueness Constraints](/l/ko/user-guide/data-migration/capabilities/uniqueness-constraints)
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
new file mode 100644
index 0000000000..d076d5c3dc
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
@@ -0,0 +1,293 @@
+---
+title: Migrating from Other CRMs
+description: Step-by-step guide to migrate your data from any CRM to Twenty.
+---
+
+## Overview
+
+This guide walks you through migrating your data from any CRM to Twenty. The process involves auditing your data, preparing your Twenty workspace, exporting from your current system, and importing into Twenty.
+
+Views, workflows, and permissions must be recreated manually after migration. Plan time for this configuration work.
+
+## Step 1: Audit Your Current Data
+
+Migration is an opportunity for a fresh start. Don't bring over clutter.
+
+**What to keep:**
+
+* Active contacts and companies
+* Open opportunities and deals
+* Important notes and activities
+* Custom fields you actually use
+
+**What to leave behind:**
+
+* Outdated contacts (no activity in 2+ years)
+* Duplicate records
+* Test data
+* Unused custom fields
+
+## Step 2: Map Your Data Model
+
+Create a mapping document between your current CRM and Twenty:
+
+| Your CRM | Twenty |
+| ---------------------- | -------------------- |
+| Account / Organization | **Company** |
+| Contact / Person | **People** |
+| Deal / Opportunity | **Opportunity** |
+| Activity | **Task** or **Note** |
+| Custom Object | **Custom Object** |
+
+**For each field, document:**
+
+* The source field name
+* The target Twenty field
+* Any format transformations needed (dates, phone numbers, etc.)
+
+Keep this mapping document handy during import—you'll reference it when mapping columns.
+
+## Step 3: Set Up Your Twenty Workspace
+
+Before importing data, prepare your Twenty workspace:
+
+### Create Custom Objects and Fields
+
+1. Go to **Settings → Data Model**
+2. Create any custom objects you need
+3. Add custom fields to standard and custom objects
+4. Configure field settings (unique, required, select options, etc.)
+
+
+ **Fields must exist before import.**
+
+ The CSV import creates records, not fields. Create all custom fields in Settings → Data Model before importing.
+
+
+### Invite Your Team
+
+
+ **Invite users BEFORE importing data.**
+
+ If your data includes user references (Account Owner, Assignee, etc.), those users must exist in Twenty before import. Otherwise, those relations cannot be mapped.
+
+
+1. Go to **Settings → Members**
+2. Invite all team members
+3. **Wait for everyone to accept** their invitation
+4. Verify all users appear in your Members list
+
+## Step 4: Export from Your Current CRM
+
+Export your data from your current CRM:
+
+1. Look for an **Export** function (usually under Settings, Data Management, or Admin)
+2. Export to **CSV format** when possible
+3. Export each object type separately (Companies, Contacts, Deals, etc.)
+4. Include all fields you want to migrate
+
+**Export these objects (in this order for reference):**
+
+1. Companies / Accounts / Organizations
+2. Contacts / People
+3. Deals / Opportunities
+4. Notes and Activities
+5. Custom objects
+
+## Step 5: Clean and Format Your Data
+
+Open each exported CSV in a spreadsheet application and prepare it for Twenty.
+
+### Remove Duplicates
+
+1. Sort by the unique field (email for People, domain for Companies)
+2. Remove or merge duplicate rows
+3. Verify no duplicates exist in Twenty already
+
+### Format Fields Correctly
+
+| Field Type | Required Format |
+| ----------------- | ------------------------------------------------- |
+| **Domain** | `https://domain.com` |
+| **Email** | `name@domain.com` (must be unique) |
+| **Date** | `YYYY-MM-DD` |
+| **Phone** | Three columns: Number, Country Code, Calling Code |
+| **Boolean** | `TRUE` or `FALSE` (uppercase) |
+| **Select fields** | Use API names, not display labels |
+
+
+ **Domain format is critical.**
+
+ Use `https://domain.com` (not `domain.com` or `www.domain.com`). This matches Twenty's format and prevents duplicates when you connect email/calendar sync.
+
+
+See [How to Prepare Your CSV Files](/l/ko/user-guide/data-migration/how-tos/prepare-your-csv-files) for complete formatting requirements for all field types.
+
+### Add Relation Columns
+
+To link records (e.g., People to Companies), add a column with the parent's unique identifier.
+
+**Example: People CSV with Company link**
+
+```csv
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+See [How to Import Relations](/l/ko/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for detailed instructions on linking records.
+
+### Update User References
+
+If your data includes user assignments (Owner, Assignee):
+
+1. Add a column with the **user's email** (not just their ID from the old system)
+2. Use the same email addresses that users used to join your Twenty workspace
+
+See [How to Prepare Your CSV Files](/l/ko/user-guide/data-migration/how-tos/prepare-your-csv-files) for complete formatting guide.
+
+## Step 6: Import to Twenty
+
+
+ **Import Order Matters!**
+
+ Always import in this order:
+
+ 1. **Companies** first (no dependencies)
+ 2. **People** second (link to Companies)
+ 3. **Opportunities** third (link to Companies/People)
+ 4. **Notes and Tasks** (link to records)
+ 5. **Custom objects** following their dependencies
+
+ The parent record must exist before you can reference it.
+
+
+### Import Each Object
+
+For each CSV file, in order:
+
+1. Navigate to the object in Twenty
+2. Click **⋮ → Import records**
+3. Upload the CSV file
+4. Map columns to fields:
+ * Map user email columns to the appropriate relation fields
+ * Map relation columns (like `companyDomain`) to relation fields
+5. Review and fix any errors in the UI
+6. Confirm the import
+7. Verify a few records before proceeding to the next file
+
+**Detailed guides:**
+
+* [How to Import Companies](/l/ko/user-guide/data-migration/how-tos/import-companies-via-csv)
+* [How to Import Contacts](/l/ko/user-guide/data-migration/how-tos/import-contacts-via-csv)
+* [How to Import Relations](/l/ko/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+
+## Step 7: Large Migrations (50,000+ Records)
+
+For large migrations:
+
+| Volume | Recommended Approach |
+| ----------------------- | ----------------------------- |
+| Under 10,000 records | Single CSV import |
+| 10,000 - 50,000 records | Split into multiple CSV files |
+| 50,000+ records | Use the API |
+
+**For API imports:**
+
+* Faster and more reliable for large datasets
+* Supports batch operations (up to 60 records per call)
+* See [How to Import Data via API](/l/ko/user-guide/data-migration/how-tos/import-data-via-api)
+
+## Step 8: Post-Migration Setup
+
+After importing data, complete your workspace configuration:
+
+### Recreate Views
+
+* Set up saved views with filters, sorts, and column configurations
+* Create any kanban or calendar views you need
+
+### Recreate Workflows
+
+* Rebuild your automations in **Settings → Workflows**
+* Start with the most critical workflows
+* Test each one before relying on it
+
+### Configure Roles and Permissions
+
+* Set up roles in **Settings → Roles**
+* Assign users to appropriate roles
+
+### Connect Email and Calendar
+
+* Each user connects their own account in **Settings → Accounts**
+* Twenty will start syncing emails to contact records
+* See [Email & Calendar](/l/ko/user-guide/calendar-emails/overview)
+
+### Train Your Team
+
+* Walk through the new interface together
+* Document any team-specific processes
+
+## Common Issues and Solutions
+
+| Issue | Cause | Solution |
+| ----------------------- | --------------------------- | ------------------------------------------------------------------------------------ |
+| **Duplicate errors** | Email/domain already exists | Remove duplicates from file, or include unique identifier to update existing records |
+| **Relation not found** | Parent record doesn't exist | Import parent objects first (Companies before People) |
+| **Missing fields** | Custom field doesn't exist | Create field in Settings → Data Model before importing |
+| **Select field errors** | Using display labels | Use API names (enable Advanced mode in Settings to find them) |
+| **User relation empty** | User hasn't accepted invite | Ensure all users accept invitations before importing |
+
+See [How to Fix Import Errors](/l/ko/user-guide/data-migration/how-tos/fix-import-errors) for detailed troubleshooting steps.
+
+## Post-Migration Checklist
+
+### Data Integrity
+
+All records imported (compare counts with source system)
+Relations working correctly (People linked to Companies)
+User assignments mapped correctly (Owner, Assignee)
+Custom fields populated
+No unexpected duplicates
+
+### Configuration
+
+Views recreated
+Workflows recreated and tested
+Roles and permissions configured
+Email/calendar sync connected
+
+### Team Readiness
+
+Team trained on new system
+Old CRM access plan decided (keep for reference? When to disable?)
+
+## FAQ
+
+
+
+ Not currently. Workflows must be recreated manually in Twenty.
+
+
+
+ File attachments are not included in CSV exports. You'll need to re-upload them manually, migrate via API, or contact our team for assistance.
+
+
+
+ Yes, we recommend keeping your old CRM running until you've verified the migration is complete. Just be careful not to create new data in both places.
+
+
+
+ Depends on data volume and complexity. Small migrations (under 10,000 records) can be done in a few hours. Large migrations may take several days including data cleanup and testing.
+
+
+
+## Need Help?
+
+For complex migrations or large datasets:
+
+* **Guided setup:** Book a 4-hour onboarding pack
+* **Full migration service:** Our partners can handle the entire migration
+
+Contact [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/ko/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx
new file mode 100644
index 0000000000..e4964a9c69
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx
@@ -0,0 +1,171 @@
+---
+title: Migrating from Self-Hosted to Cloud
+description: Step-by-step guide to migrate your Twenty self-hosted instance to Twenty Cloud.
+---
+
+## Overview
+
+This guide walks you through migrating your data from a Twenty self-hosted instance to Twenty Cloud. The process involves setting up your cloud workspace, exporting your data, and re-importing it.
+
+Views, workflows, and roles must be recreated manually after migration. Plan time for this configuration work.
+
+## Step 1: Create Your Cloud Workspace
+
+1. Go to [app.twenty.com](https://app.twenty.com) and create a new workspace
+2. Complete the initial setup wizard
+3. Note your new workspace URL
+
+## Step 2: Recreate Your Data Model
+
+Before importing data, recreate your custom objects and fields:
+
+1. Go to **Settings → Data Model** in your cloud instance
+2. Create custom objects that match your self-hosted setup
+3. Add custom fields to standard and custom objects
+4. Configure field settings (unique, required, etc.)
+
+Take screenshots of your self-hosted data model for reference, or keep both instances open side by side.
+
+## Step 3: Invite All Users
+
+
+ **Critical: Invite users BEFORE importing data.**
+
+ Users must accept their invitations before you import any records that reference them (like Account Owner fields). If users don't exist yet, those relations cannot be mapped.
+
+
+1. Go to **Settings → Members** in your cloud instance
+2. Invite all team members who had accounts on self-hosted
+3. **Wait for everyone to accept** their invitation
+4. Verify all users appear in your Members list
+
+## Step 4: Export Data from Self-Hosted
+
+Export each object from your self-hosted instance:
+
+1. Navigate to each object (Companies, People, Opportunities, etc.)
+2. Configure the view to show **all columns** you want to migrate
+3. Click **⋮ → Export view**
+4. Save each CSV file with a clear name (e.g., `companies-export.csv`)
+
+**Export in this order** (for reference when importing):
+
+1. Companies
+2. People
+3. Opportunities
+4. Custom objects (following their dependencies)
+5. Tasks, Notes
+
+## Step 5: Update Workspace Member References
+
+The exported CSVs contain user IDs from your self-hosted instance. These IDs won't match your cloud instance, so you need to replace them with emails.
+
+**For each CSV file with user references (Owner, Assignee, etc.):**
+
+1. Open the CSV in a spreadsheet application
+2. Add a new column next to each user ID column (e.g., `accountOwnerEmail` next to `accountOwnerId`)
+3. Fill in the **email address** of each user
+4. You can delete the old ID column or leave it (it will be skipped during import)
+
+**Example:**
+
+Before:
+
+```csv
+name,domain,accountOwnerId
+Acme Corp,https://acme.com,old-uuid-123
+```
+
+After:
+
+```csv
+name,domain,accountOwnerEmail
+Acme Corp,https://acme.com,john@yourcompany.com
+```
+
+Use the same email addresses that users used to accept their cloud workspace invitation.
+
+## Step 6: Plan Your Import Order
+
+Import files in the correct order to maintain relationships:
+
+1. **Companies** first (no dependencies)
+2. **People** second (link to Companies)
+3. **Opportunities** third (link to Companies and People)
+4. **Custom objects** (following their dependencies)
+5. **Tasks and Notes** last (link to other records)
+
+See [How to Import Relations](/l/ko/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for details on maintaining relationships.
+
+## Step 7: Import to Cloud
+
+For each CSV file, in order:
+
+1. Navigate to the object in your cloud instance
+2. Click **⋮ → Import records**
+3. Upload the CSV file
+4. Map columns to fields:
+ * Map user email columns to the appropriate relation fields
+ * Map other columns as usual
+5. Review and fix any errors
+6. Confirm the import
+7. Verify a few records before proceeding to the next file
+
+## Step 8: Recreate Configuration
+
+After importing data, manually recreate:
+
+### Views
+
+* Recreate saved views with filters, sorts, and column configurations
+* Set up any kanban or calendar views
+
+### Workflows
+
+* Recreate automations in **Settings → Workflows**
+* Test each workflow before relying on it
+
+### Roles and Permissions
+
+* Configure roles in **Settings → Roles**
+* Assign users to appropriate roles
+
+### Integrations
+
+* Reconnect email and calendar sync for each user
+* Reconfigure any API integrations with new API keys
+
+## Post-Migration Checklist
+
+All data imported successfully
+Relations between objects working correctly
+User assignments (Owner, Assignee) mapped correctly
+Views recreated
+Workflows recreated and tested
+Roles and permissions configured
+Email/calendar sync reconnected
+API integrations updated with new keys
+
+## FAQ
+
+
+
+ Not currently. Workflows must be recreated manually in your cloud instance.
+
+
+
+ File attachments are not included in CSV exports. You'll need to re-upload any attachments manually, migrate them via API or contact our team for assistance with large migrations.
+
+
+
+ Yes, we recommend keeping your self-hosted instance running until you've verified the cloud migration is complete. Just be careful not to create new data in both places.
+
+
+
+ Records referencing that user will fail to import or the relation will be empty. Ensure all users accept invitations before importing data.
+
+
+
+## Need Help?
+
+For complex migrations or large datasets, contact us at [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/ko/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
new file mode 100644
index 0000000000..752e337841
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
@@ -0,0 +1,270 @@
+---
+title: Prepare Your CSV Files
+description: Complete step-by-step guide to format your data for import into Twenty.
+---
+
+## Overview
+
+This guide walks you through preparing your CSV file for a successful import. Follow these steps in order to avoid errors.
+
+## Step 1: Check File Requirements
+
+Before you start, ensure your file meets these requirements:
+
+| Requirement | Details |
+| -------------- | ------------------------ |
+| **Format** | CSV, XLSX, or XLS |
+| **Size limit** | 10,000 records per file |
+| **Encoding** | UTF-8 recommended |
+| **Structure** | One object type per file |
+
+For datasets larger than 10,000 records, split into multiple files or use the [API import](/l/ko/user-guide/data-migration/how-tos/import-data-via-api).
+
+## Step 2: Download the Sample File
+
+**This is the most important step.** The sample file shows you the exact column names and format Twenty expects.
+
+1. Go to the object view (People, Companies, etc.)
+2. Click **⋮** → **Import records**
+3. Click **Download sample file**
+4. Use this file as your template
+
+**Pro tip:** Export a few existing records instead. This gives you real examples of how data should be formatted, and the column names will map automatically during import.
+
+## Step 3: Remove Duplicate Values
+
+Twenty enforces uniqueness on certain fields. Duplicates will cause import errors.
+
+| Object | Unique Fields |
+| ------------------ | ----------------------------------------- |
+| **People** | `id`, `email` |
+| **Companies** | `id`, `domain` |
+| **Custom objects** | `id`, plus any field you marked as unique |
+
+**Before importing:**
+
+1. Sort your spreadsheet by the unique field (email or domain)
+2. Remove or merge duplicate rows
+3. Check for duplicates that already exist in Twenty
+
+**Soft-deleted records count toward uniqueness.** Records in Command Menu → See deleted records will cause duplicate errors. Delete them permanently or restore and update them.
+
+## Step 4: Format Each Field Type Correctly
+
+Different field types require specific formats. Here's the complete reference:
+
+### Text Fields
+
+* No special formatting required
+* Leading/trailing spaces are automatically trimmed
+
+### Email Fields
+
+* Must be valid email format: `name@domain.com`
+* Must be unique (no duplicates in file or in Twenty)
+* For additional emails, use this format in the **Emails / Additional Emails** column:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Domain Fields
+
+* **Recommended format**: `https://domain.com`
+* This matches the format used by mailbox/calendar sync (prevents duplicates)
+* Fill both columns:
+ * **Domain / Domain Label**: `domain.com`
+ * **Domain / Domain URL**: `https://domain.com`
+* Must be unique within your file and in Twenty
+
+### Phone Fields
+
+Phone is a **nested field** requiring multiple columns:
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+### Address Fields
+
+Address is a **nested field** with multiple columns (some can be left empty):
+
+* **Address / Address 1**: Street address line 1
+* **Address / Address 2**: Street address line 2 (optional)
+* **Address / City**: City name
+* **Address / State**: State or province
+* **Address / Country**: Country name
+* **Address / Post Code**: Postal/ZIP code
+
+### Date Fields
+
+Use consistent formatting throughout your file:
+
+* `YYYY-MM-DD` (recommended): `2024-03-15`
+* `MM/DD/YYYY`: `03/15/2024`
+* `DD/MM/YYYY`: `15/03/2024`
+* ISO 8601: `2024-03-15T10:30:00Z`
+
+### Number Fields
+
+* Numbers only (no text)
+* Use period for decimals: `1234.56`
+* No thousands separators (not `1,234.56`)
+
+### Currency Fields
+
+Currency is a **nested field** requiring two columns that **both must be filled**:
+
+| Column | Example |
+| --------------------- | --------- |
+| **Amount / Amount** | `1234.56` |
+| **Amount / Currency** | `USD` |
+
+### Boolean Fields
+
+Use uppercase: `TRUE` or `FALSE`
+
+Lowercase `true` or `false` will not work.
+
+### Select Fields
+
+Use the **API name** of the option, not the display label.
+
+**How to find API names:**
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at bottom right)
+4. Copy the API name (e.g., `OPTION_1`, not "Option 1")
+
+New select options are not created automatically. Add them in **Settings → Data Model** before importing.
+
+### Multi-Select Fields
+
+Use API names in array format:
+
+```
+["VALUE1","VALUE2"]
+```
+
+### Array Fields
+
+Use JSON array format:
+
+```
+["value1","value2"]
+```
+
+### Rating Fields
+
+Use the format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, or `RATING_5`
+
+### Links/URL Fields
+
+Fill both columns:
+
+* **Links / Link Label**: `Twenty`
+* **Links / Link URL**: `https://twenty.com`
+
+For secondary links, use the **Links / Secondary Links** column:
+
+```
+[{"url":"https://twenty.com","label":"Twenty"}]
+```
+
+### JSON Fields
+
+Use valid JSON format:
+
+```
+{"key":"value","key2":"value2"}
+```
+
+### ID Fields
+
+* **Optional**: Twenty auto-generates IDs if not provided
+* **Format**: UUID (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`)
+* **Use case**: Include ID to update existing records instead of creating new ones
+
+## Step 5: Add Relation Columns (If Linking Records)
+
+To link records to other objects (e.g., People to Companies), add a column with the unique identifier of the related record.
+
+**Example**: Linking People to Companies
+
+Add a column to your People CSV:
+
+```
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+**Important rules for relations:**
+
+* The parent record must already exist in Twenty
+* Use the **Domain URL** format (`https://domain.com`), not the label
+* Map only ONE unique identifier (don't include both `companyId` AND `companyDomain`)
+* For Workspace Members, use their **email** (not name)
+
+
+ **Import Order Matters!**
+
+ Import the "one" side before the "many" side:
+
+ 1. **Companies** first
+ 2. **People** second (with company reference)
+ 3. **Opportunities** third
+
+ The parent record must exist before you can reference it.
+
+
+See [How to Import Relations](/l/ko/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for detailed instructions.
+
+## Step 6: Ensure Fields Exist in Twenty
+
+The import creates **records**, not **fields**. All fields you want to import must already exist in your data model.
+
+**Before importing:**
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Create any custom fields you need
+4. Note the exact field names (they must match your column headers)
+
+## Step 7: Final Checklist
+
+Before uploading your file, verify:
+
+File is CSV, XLSX, or XLS format
+File has fewer than 10,000 records
+Encoding is UTF-8
+No duplicate emails (for People) or domains (for Companies)
+Dates use consistent format throughout
+Domains use `https://domain.com` format
+Boolean fields use `TRUE` or `FALSE` (uppercase)
+Select fields use API names, not display labels
+All custom fields exist in Settings → Data Model
+Parent records imported before child records
+Relation columns reference existing records
+
+## Common Mistakes to Avoid
+
+| Mistake | Solution |
+| -------------------------------------------- | ------------------------------------- |
+| Using `true` instead of `TRUE` | Boolean values must be uppercase |
+| Using display labels for Select fields | Find and use API names in Settings |
+| Importing People before Companies | Always import parent objects first |
+| Missing currency code for Currency fields | Fill both Amount and Currency columns |
+| Wrong domain format | Use `https://domain.com` consistently |
+| Mapping multiple unique fields for relations | Map only ONE (domain OR id, not both) |
+
+## Next Steps
+
+Your file is ready! Now:
+
+* [Import Companies](/l/ko/user-guide/data-migration/how-tos/import-companies-via-csv) (import these first)
+* [Import Contacts](/l/ko/user-guide/data-migration/how-tos/import-contacts-via-csv)
+* [Fix any import errors](/l/ko/user-guide/data-migration/how-tos/fix-import-errors)
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx
new file mode 100644
index 0000000000..3544737143
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx
@@ -0,0 +1,198 @@
+---
+title: Update Existing Records via Import
+description: Complete step-by-step guide to bulk updating records using CSV import.
+---
+
+## Overview
+
+Need to update many records at once? Instead of editing them one by one, use the CSV import to bulk update existing records.
+
+**Use cases:**
+
+* Update job titles for multiple people
+* Change company information in bulk
+* Add data to new custom fields
+* Correct data errors across many records
+
+## How It Works
+
+When you import a file containing a **unique identifier** that matches an existing record, Twenty updates that record instead of creating a duplicate.
+
+| If unique identifier... | Twenty will... |
+| -------------------------- | ------------------------------------------------ |
+| Matches an existing record | **Update** the existing record |
+| Doesn't match any record | **Create** a new record |
+| Is missing from your file | **Create** a new record (with auto-generated ID) |
+
+
+ **Multi-Select fields are overwritten, not merged.**
+
+ If a record has `Option A` and `Option B` selected, and you import `["Option C"]`, the record will only have `Option C` after import. The import replaces all previous selections—it does not add to them.
+
+ To keep existing values, include them all in your import: `["Option A","Option B","Option C"]`
+
+
+## Step 1: Export Your Current Data
+
+First, export the records you want to update:
+
+1. Navigate to the object (People, Companies, etc.)
+2. **Add the columns you need** — click **Options → Fields** to show the fields you want to update
+3. **Filter if needed** — narrow down to only the records you want to update
+4. Click **⋮** → **Export view**
+5. Save the CSV file
+
+**Why export first?** The exported file has the correct format, includes unique identifiers, and maps automatically during import.
+
+### What Gets Exported
+
+* All visible columns in your current view
+* The record's unique identifiers (`id`, `email`, `domain`)
+* Current field values you can modify
+
+## Step 2: Edit the CSV File
+
+Open the exported file in your spreadsheet application (Excel, Google Sheets, etc.):
+
+1. **Keep the unique identifier column** — don't delete `id`, `email`, or `domain`
+2. **Update the values** in the columns you want to change
+3. **Remove columns you don't need to update** (optional, but cleaner)
+4. **Don't change unique identifier values** — or Twenty will create new records
+
+### Example: Updating Job Titles
+
+**Exported file:**
+
+```csv
+id,email,firstName,lastName,jobTitle
+550e8400-e29b-41d4-a716-446655440001,john@acme.com,John,Smith,Sales Rep
+550e8400-e29b-41d4-a716-446655440002,jane@acme.com,Jane,Doe,Sales Rep
+550e8400-e29b-41d4-a716-446655440003,bob@acme.com,Bob,Johnson,Sales Rep
+```
+
+**After your edits:**
+
+```csv
+id,email,firstName,lastName,jobTitle
+550e8400-e29b-41d4-a716-446655440001,john@acme.com,John,Smith,Account Executive
+550e8400-e29b-41d4-a716-446655440002,jane@acme.com,Jane,Doe,Senior Account Executive
+550e8400-e29b-41d4-a716-446655440003,bob@acme.com,Bob,Johnson,Account Executive
+```
+
+
+ **Don't change the unique identifier values.**
+
+ If you change `john@acme.com` to `john.smith@acme.com`, Twenty will create a new record instead of updating the existing one.
+
+
+## Step 3: Import the Updated File
+
+1. Navigate to the object
+2. Click **⋮** → **Import records**
+3. Upload your edited CSV file
+4. **Ensure the unique identifier is mapped** — verify `email`, `domain`, or `id` is mapped correctly
+5. Review the field mappings
+6. Check for errors
+7. Click **Confirm**
+
+Twenty matches records by the unique identifier and updates them with new values.
+
+## Choosing the Right Unique Identifier
+
+| Object | Recommended | Alternative | Notes |
+| ------------------ | ---------------- | ----------- | ---------------------------- |
+| **People** | `email` | `id` | Email is human-readable |
+| **Companies** | `domain` | `id` | Domain is human-readable |
+| **Custom objects** | Any unique field | `id` | Use your custom unique field |
+
+**Use only ONE unique identifier.** Don't map both `email` AND `id`. This can cause confusion and errors.
+
+### Using Custom Unique Fields
+
+If you have a custom field marked as unique (like an external ID from another system):
+
+1. Include that field in your export and import
+2. Map it during import
+3. Twenty will match on that field
+
+## Step 4: Verify the Updates
+
+After importing:
+
+1. Open a few updated records
+2. Verify the changes were applied
+3. Check that no duplicate records were created
+
+## What About Fields Not in Your File?
+
+**Fields not included in your import file remain unchanged.**
+
+| Your file includes... | Result |
+| ---------------------------- | ------------------------------------------------------ |
+| `email`, `jobTitle` | Only `jobTitle` is updated; other fields stay the same |
+| `email`, `jobTitle`, `phone` | `jobTitle` and `phone` are updated |
+
+This means you only need to include the fields you want to change (plus the unique identifier).
+
+## Combining Updates and New Records
+
+You can update existing records AND create new ones in the same import:
+
+```csv
+email,firstName,lastName,jobTitle
+john@acme.com,John,Smith,Senior Manager ← Updates existing (email matches)
+newperson@acme.com,New,Person,Analyst ← Creates new (email doesn't match)
+```
+
+## Common Mistakes to Avoid
+
+| Mistake | Problem | Result | Solution |
+| ------------------------------ | ------------------------------------------------------- | -------------------------------------- | ----------------------------------------- |
+| **Changing unique identifier** | Changed `john@acme.com` to `john.smith@acme.com` | Creates new record instead of updating | Keep unique identifiers unchanged |
+| **Multiple unique fields** | Mapping both `email` AND `id` | Potential matching conflicts | Map only ONE unique identifier |
+| **No unique identifier** | File only has `firstName`, `lastName`, `jobTitle` | All rows create new records | Always include `email`, `domain`, or `id` |
+| **Case mismatch** | File has `John@acme.com` but Twenty has `john@acme.com` | Creates new record | Export from Twenty to get exact values |
+
+## FAQ
+
+
+
+ Records with unique identifiers that don't match existing records will be created as new records. This lets you update and create in the same import.
+
+
+
+ Yes, leave the cell empty in your CSV. The import will clear that field's value on the existing record.
+
+
+
+ Fields not in your import file remain unchanged on existing records. Only fields you include are updated.
+
+
+
+ Yes! Include the relation's unique identifier (e.g., `companyDomain`) and map it to the relation field. The relation will be updated.
+
+
+
+ During the import review step, Twenty shows you how many records will be updated vs. created based on unique identifier matches.
+
+
+
+ There's no automatic undo. We recommend exporting your data as a backup before making bulk updates.
+
+
+
+## Best Practices
+
+1. **Export first** — always start from an export to ensure correct format
+2. **Backup before updating** — export your data before making bulk changes
+3. **Test with a few records** — try updating 5-10 records first before doing a large batch
+4. **Use human-readable identifiers** — `email` and `domain` are easier to verify than `id`
+5. **Only include necessary columns** — fewer columns means less chance for errors
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/ko/user-guide/data-migration/how-tos/fix-import-errors)
+* [Uniqueness Constraints](/l/ko/user-guide/data-migration/capabilities/uniqueness-constraints)
+* [Field Mapping Reference](/l/ko/user-guide/data-migration/capabilities/field-mapping)
diff --git a/packages/twenty-docs/l/ko/user-guide/data-migration/overview.mdx b/packages/twenty-docs/l/ko/user-guide/data-migration/overview.mdx
new file mode 100644
index 0000000000..6e20f9477f
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-migration/overview.mdx
@@ -0,0 +1,89 @@
+---
+title: Data Migration
+description: Import and export your CRM data via CSV files or API.
+image: /images/user-guide/import-export-data/cloud.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+
+
+## Import Methods
+
+Twenty supports two main methods for importing data:
+
+| Method | Best For | Volume Limit |
+| -------------- | ------------------------------------ | ----------------------- |
+| **CSV Import** | Standard migrations, regular updates | 10,000 records per file |
+| **API Import** | Large-scale migrations, automation | Unlimited |
+
+For very large datasets (hundreds of thousands of records), use the API. Our [implementation partners](/l/ko/user-guide/getting-started/capabilities/implementation-services) can help run these scripts if needed.
+
+## CSV Import Basics
+
+You can import data for any object using CSV, XLSX, or XLS files. Each file should contain **only one type of object** (e.g., only People records).
+
+**Fields must exist before import.** Uploading a CSV creates records but does not create fields. If you need custom fields, create them first under **Settings → Data Model**.
+
+### Steps
+
+1. Navigate to the object where you want to import data
+2. Click the **⋮** icon on the top right (this is the Command Menu) and click on **Import records**
+3. Download the template file to ensure your data is in the expected format
+4. Upload your formatted CSV file
+5. Map your columns to Twenty fields
+6. Review errors (highlighted in yellow) and fix them, directly editing in the UI
+7. Confirm the import
+
+### Importing relations between objects
+
+You can import relations between objects using the csv import function. You need to reference the related object using a unique field from this object: the `id`, the `email` for People and Workspace Members, the `domain` for companies, any other field set as unique in the data model for any other object.
+
+**Deleted records count toward uniqueness.** Soft-deleted records (visible under Command Menu → See deleted records) are included in uniqueness checks. If you import a record with the same unique value as a deleted record, the deleted record will be restored.
+
+
+ **Import Order Matters!**
+
+ When importing related objects, upload files in this order:
+
+ 1. **Companies** first (the "one" side of relationships)
+ 2. **People** second (linked to companies via companyId)
+ 3. **Opportunities** third (linked to companies/people)
+ 4. **Custom objects** with relations last
+
+ Why? The "one" side of a one-to-many relationship must exist before you can reference it. For example, the Company record must exist before you import a Person with that company's ID.
+
+
+Please refer to [this article](/l/ko/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for a step-by-step guide on how to proceed.
+
+## Export Data
+
+Export your workspace data for backups, reporting, or migration.
+
+### Steps
+
+1. Navigate to the object you want to export
+2. Configure the view with the columns you need
+3. Click **⋮** → **Export view**
+4. Save the CSV file
+
+**Only visible columns are exported.** The CSV file will only contain the columns displayed in your current view. Add or hide columns before exporting to control what data is included.
+
+**Export limits**: Up to 20,000 records per export.
+
+## Permissions
+
+Data import and export require specific permissions:
+
+* **Import**: Requires "Import CSV" permission
+* **Export**: Requires "Export CSV" permission
+
+Contact your workspace admin if you don't have these permissions.
+
+## Next Steps
+
+* [Prepare your CSV files](/l/ko/user-guide/data-migration/how-tos/prepare-your-csv-files)
+* [Import relations between objects](/l/ko/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+* [Import via API for large datasets](/l/ko/user-guide/data-migration/how-tos/import-data-via-api)
diff --git a/packages/twenty-docs/l/ko/user-guide/data-model/capabilities/fields.mdx b/packages/twenty-docs/l/ko/user-guide/data-model/capabilities/fields.mdx
new file mode 100644
index 0000000000..ef477158c2
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-model/capabilities/fields.mdx
@@ -0,0 +1,122 @@
+---
+title: Fields
+description: Understand the role of fields and how to manage them.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## About Fields
+
+Fields are like columns in a spreadsheet. They store different types of data like text, numbers, or dates. Fields can be standard (built-in) or custom (the ones you create).
+
+### Standard Fields
+
+Standard fields come built-in with Twenty to handle common business needs.
+
+For example, `First Name` and `Last Name` are standard fields in the `People` object. They store text data for individual names.
+
+You cannot delete standard fields, but you can deactivate them if you don't need them.
+
+You can also customize the options of the standard `SELECT` type fields, for example the options for the `Stage` on Opportunities.
+
+
+
+### Custom Fields
+
+Custom fields can be added to any object. You can store text, numbers, dates, dropdown selections, and more. Use custom fields to track information that's specific to your business.
+
+For instance, a custom field for SpaceX could be `Rocket Active Status`, indicating if a rocket is operational.
+
+
+
+## Field Types
+
+Twenty supports various field types:
+
+| Type | Description | Example |
+| ------------ | ----------------------------------------------------------------- | ------------------ |
+| Address | Structured address with street, city, state, country, postal code | Office Address |
+| Array | List of text values | Tags |
+| Boolean | True/false checkbox | Is Active |
+| Currency | Monetary value with currency code | Deal Amount (USD) |
+| Date | Date values | Close Date |
+| Date & Time | Date with time | Meeting Time |
+| Domain | Website domain (used for Companies) | acme.com |
+| Email | Email addresses (with primary + additional) | Contact Email |
+| JSON | Structured JSON data | Custom metadata |
+| Links | URLs with labels (primary + secondary) | Website, LinkedIn |
+| Long Text | Multi-line text | Description, Notes |
+| Multi-Select | Multiple choices from a predefined list | Tags, Categories |
+| Number | Numeric values (integers or decimals) | Quantity, Score |
+| Phone | Phone numbers with country code | Work Phone |
+| Rating | Star rating (1-5) | Priority, Score |
+| Relation | Links to records in other objects | Company → People |
+| Select | Single choice from a predefined list | Stage, Status |
+| Text | Single line of text | Name, Title |
+
+## Create a Custom Field
+
+To add a custom field to any object, follow these steps:
+
+1. Go to `Settings` in the left sidebar.
+2. Go to `Data Model`, then select the object you wish to customize.
+3. Proceed by clicking on `Add Field`.
+4. Choose a field name and type that suits your requirements. Consider adding a field description for better understanding.
+
+Your newly created field is now available within the application's fields. To display it on a specific view, click on the options menu, then select `Fields`.
+
+
+
+**Quick way:** Click the **+** button at the top right of any object table, then select `Customize fields`. This takes you directly to the Data Model settings.
+
+
+
+## Deactivate a Field
+
+You can deactivate a field to hide it from the app without losing your data. Think of it as hiding the field rather than deleting it.
+
+Here's how you can do it:
+
+1. Find the field you want to deactivate in your object settings.
+
+2. Click the three dots `⋮` next to the field to open the menu.
+
+3. Select `Deactivate` from the dropdown.
+
+
+
+What happens when you deactivate a field?
+
+1. **In the app:** The field disappears and you can't add new values to it.
+
+2. **Existing relationships:** If it's a relation field, existing connections stay but you can't create new ones.
+
+3. **API access:** You can still access the field and its data through the API.
+
+You can reactivate Standard and Custom Fields or have the option to permanently delete them.
+
+## Make Fields Unique
+
+Make a field unique to ensure distinct records cannot have the same value. For example, email addresses are unique for each person.
+
+If you get an error when setting uniqueness, check for duplicate values in your data (including deleted records).
+
+## Field Configuration Best Practices
+
+### Naming Conventions and Limitations
+
+* **Singular and plural named must be distinct**: Our GraphQL API needs distinct names for mutations
+* **Protected field names**: some names are reserved for system usage (e.g., `Type`, `Application`)
+
+### Currency and Phone Fields
+
+* **Default currency**: can be configured via the data model
+* **Default country codes**: can be configured for phone fields via the data model
+
+### Select Fields
+
+* **A default option can be selected** for each Select field
+
+### Record Text Fields
+
+* **Each object has one main display field**: This field appears in the leftmost column and represents the record when linked to other objects. It must be a text field. For example, People uses `Name` as the main field, so when you link a person to a company, you'll see their name in the company's view.
diff --git a/packages/twenty-docs/l/ko/user-guide/data-model/capabilities/objects.mdx b/packages/twenty-docs/l/ko/user-guide/data-model/capabilities/objects.mdx
new file mode 100644
index 0000000000..f2f1105277
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-model/capabilities/objects.mdx
@@ -0,0 +1,91 @@
+---
+title: Objects
+description: Learn about standard and custom objects in Twenty.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Standard Objects
+
+Standard objects are predefined entities in your workspace to help you get started. They're part of a shared data model accessible to all users of Twenty. You can use them as-is, customize them or deactivate them.
+
+
+
+### People
+
+The `People` object stores your contacts. It includes contact details and interaction history, so you can see all your customer interactions in one place.
+
+### Company
+
+The `Companies` object stores your business accounts. It includes details like industry, size and location. Companies connect to both `People` and `Opportunities` objects.
+
+### Opportunities
+
+The `Opportunities` object stores deal-related data. It tracks the progression of potential sales, from prospecting to closure, recording stages, deal sizes, associated account, and expected close date. You can view your sales pipeline in a kanban layout.
+
+### Notes
+
+The `Notes` object stores free-form notes that can be attached to People, Companies, Opportunities, and other records. Use notes to capture meeting summaries, important details, or any contextual information.
+
+### Tasks
+
+The `Tasks` object stores to-dos and action items. Tasks can be linked to People, Companies, Opportunities, and other records. Track due dates, assignees, and completion status to stay on top of your follow-ups.
+
+## Custom Objects
+
+Custom objects let you store information that's unique to your organization and that standard objects can't handle. For example, if you're SpaceX, you may want to create a custom object for Rockets and Launches.
+
+
+
+### Creating a New Custom Object
+
+To create a new custom object:
+
+1. Go to Settings in the sidebar on the left.
+2. Under Workspace, go to Data model. Here you'll be able to see an overview of all your existing Standard and Custom objects (both active and disabled).
+
+
+
+3. Click on `+ New object` at the top. Enter the name (both singular and plural), choose an icon, and add a description for your custom object and hit Save (at the top right). Using Listing as an example of custom object, the singular would be "listing" and the plural would be "listings" along with a description like "Listings that hosts created to showcase their property."
+
+4. Your custom object is now created and will appear in your sidebar. You can start adding records to it right away.
+
+## Managing Objects
+
+### Deactivating Objects
+
+If you don't need a standard or custom object:
+
+1. Go to Settings → Data Model
+2. Find the object you want to deactivate
+3. Click the toggle to deactivate it
+4. The object will be hidden from your workspace but data is preserved
+
+### Reactivating Objects
+
+To bring back a deactivated object:
+
+1. Go to Settings → Data Model
+2. Look for deactivated objects (they'll be grayed out)
+3. Click the toggle to reactivate it
+4. The object and all its data will be restored
+
+## Best Practices
+
+### When to Create Custom Objects
+
+* **Unique business entities**: Things specific to your industry or process
+* **Complex relationships**: When you need to track connections between multiple entities
+* **Scalable data**: When you might have many instances of something
+
+### When to Use Fields Instead
+
+* **Simple attributes**: Properties that describe existing objects
+* **Categories or labels**: Ways to classify existing records
+* **Single values**: Information that doesn't need its own lifecycle
+
+### Object Naming
+
+* **Use clear, descriptive names**: Make it obvious what the object represents
+* **Follow conventions**: Use singular for the object name, plural for the collection
+* **Consider your team**: Choose names everyone will understand
diff --git a/packages/twenty-docs/l/ko/user-guide/data-model/capabilities/relation-fields.mdx b/packages/twenty-docs/l/ko/user-guide/data-model/capabilities/relation-fields.mdx
new file mode 100644
index 0000000000..ddcd3c709e
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-model/capabilities/relation-fields.mdx
@@ -0,0 +1,92 @@
+---
+title: Relation Fields
+description: Connect records across different objects using relation fields.
+---
+
+## Types of Relations
+
+### One-to-Many
+
+One record in Object A can be linked to many records in Object B.
+
+**Example:** One Company can have many People (employees).
+
+### Many-to-One
+
+Many records in Object A can be linked to one record in Object B.
+
+**Example:** Many People can belong to one Company.
+
+### Relations to Multiple Object Types
+
+Some objects can link to multiple object types on one side of the relation.
+
+**Example:** A Note can be attached to one Person AND one Company AND one Opportunity simultaneously. The Note is on the "many" side, connecting to multiple "one" sides.
+
+
+
+Similarly, a Project (on the "one" side) could receive links from multiple People, multiple Companies, and multiple Notes.
+
+
+
+
+ **Import/Export limitation**: Relations pointing to multiple object types are not yet supported for CSV import/export. This is on our roadmap.
+
+
+### Many-to-Many
+
+Many records in Object A can be linked to many records in Object B.
+
+**Example:** Many People can be linked to many Projects, and vice versa.
+
+
+ **Many-to-Many is not yet supported.**
+
+ This relation type is planned for H1 2026. As a workaround, create an intermediate "junction" object (e.g., "Project Assignments") that has Many-to-One relations to both objects.
+
+
+## Creating a Relation Field
+
+1. Go to **Settings → Data Model**
+2. Select the object where you want to add the relation
+3. Click **+ Add Field**
+4. Select **Relation** as the field type
+5. Choose the target object(s) to relate to
+6. Configure the relation settings:
+ * **Field name on source object**: The name of the relation field on the object you're editing
+ * **Field name on destination object**: The name of the relation field that will appear on the target object
+ * Relation type (one-to-many, many-to-one)
+7. Click **Save**
+
+## Standard Relations
+
+Twenty comes with pre-built relations between standard objects:
+
+| From Object | To Object | Relation Type |
+| ------------- | --------- | ------------- |
+| People | Companies | Many-to-One |
+| Opportunities | Companies | Many-to-One |
+| Opportunities | People | Many-to-One |
+
+## Best Practices
+
+### Planning Relations
+
+* **Map your data model**: Plan relations before creating them
+* **Consider direction**: Think about which object "owns" the relationship
+* **Avoid circular dependencies**: Keep your data model clean
+
+### Naming Relations
+
+* **Use clear names**: Make it obvious what the relation represents
+* **Be consistent**: Use similar naming patterns across relations
+* **Consider both sides**: Name both sides of the relation appropriately
+
+### Performance
+
+* **Don't over-relate**: Too many relations can slow down your workspace
+
+## Limitations
+
+* **Deleting relations** removes the link but not the related records
+* **Circular relations** should be avoided for data integrity
diff --git a/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/create-custom-fields.mdx b/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/create-custom-fields.mdx
new file mode 100644
index 0000000000..5ba74f3273
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/create-custom-fields.mdx
@@ -0,0 +1,72 @@
+---
+title: Create Custom Fields
+description: Step-by-step guide to adding custom fields to any object.
+---
+
+Custom fields let you capture information specific to your business. Add them to any object—standard or custom.
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Select the object you want to add a field to
+3. Click **+ Add Field**
+4. Choose a **field type** (see [Fields](/l/ko/user-guide/data-model/capabilities/fields) for all types)
+5. Enter the **field name** and optional description
+6. Configure field-specific settings (see below)
+7. Click **Save**
+
+**Quick method:** Click the **+** at the end of column headers in any table view → **Customize fields**.
+
+## Show the Field in Views
+
+New fields aren't automatically visible. To display:
+
+1. Open the object's table view
+2. Click **Options → Fields**
+3. Click the **eye icon** next to your field to show it
+4. Drag to reorder
+
+## Configuration Options
+
+### For Select / Multi-Select
+
+1. Click **+ Add option** to create choices
+2. Set a **default option** if desired
+3. Drag to reorder options
+
+
+ **Use API names for imports.** Enable **Advanced mode** in Settings to see API names. See [Field Mapping](/l/ko/user-guide/data-migration/capabilities/field-mapping).
+
+
+### For Currency Fields
+
+Set the **default currency** (USD, EUR, etc.) for new records.
+
+### For Phone Fields
+
+Set the **default country code** to pre-fill for new phone numbers.
+
+### Making a Field Unique
+
+Toggle **Unique** to prevent duplicate values across records.
+
+
+ If duplicates exist (including in deleted records), you'll get an error. Clean up duplicates first.
+
+
+### Setting Default Values
+
+For Select fields, you can choose which option is pre-selected for new records. For Checkbox fields, set whether it's checked or unchecked by default.
+
+## Deactivating a Field
+
+1. Go to **Settings → Data Model**
+2. Find the field
+3. Click **⋮ → Deactivate**
+
+Data is preserved. You can reactivate or permanently delete later.
+
+## Related
+
+* [Fields](/l/ko/user-guide/data-model/capabilities/fields) — all field types explained
+* [Data Model FAQ](/l/ko/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/create-custom-objects.mdx b/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/create-custom-objects.mdx
new file mode 100644
index 0000000000..9e602f4aba
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/create-custom-objects.mdx
@@ -0,0 +1,51 @@
+---
+title: Create Custom Objects
+description: Step-by-step guide to creating custom objects in Twenty.
+---
+
+Custom objects let you store information unique to your business that standard objects don't cover. For example: Projects, Products, Tickets, or Listings.
+
+
+ **Not sure if you need an object or a field?** See [Understanding Your Data Model](/l/ko/user-guide/data-model/overview) for guidance.
+
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Click **+ New object**
+3. Fill in:
+ * **Singular name** (e.g., "Listing")
+ * **Plural name** (e.g., "Listings")
+ * **Icon**
+ * **Description** (optional)
+4. Click **Save**
+
+Your object appears in the sidebar immediately.
+
+## Next: Add Fields
+
+New objects start with basic fields. Add custom fields to capture the data you need:
+
+1. In **Settings → Data Model**, select your object
+2. Click **+ Add Field**
+3. Choose a field type, configure, and save
+
+See [How to Create Custom Fields](/l/ko/user-guide/data-model/how-tos/create-custom-fields) for details on field types and configuration.
+
+## Connecting to Other Objects
+
+To link your object to People, Companies, or other objects, create a relation field. See [How to Create Relation Fields](/l/ko/user-guide/data-model/how-tos/create-relation-fields).
+
+## Deactivating an Object
+
+If you no longer need an object:
+
+1. Go to **Settings → Data Model**
+2. Toggle the object off
+
+The object is hidden but data is preserved. You can reactivate or permanently delete later.
+
+## Related
+
+* [Objects](/l/ko/user-guide/data-model/capabilities/objects) — standard vs custom objects
+* [Data Model FAQ](/l/ko/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/create-relation-fields.mdx b/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/create-relation-fields.mdx
new file mode 100644
index 0000000000..8873c74ffd
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/create-relation-fields.mdx
@@ -0,0 +1,60 @@
+---
+title: Create Relation Fields
+description: Step-by-step guide to connecting objects with relation fields.
+---
+
+Relation fields connect records from different objects—for example, linking People to Companies.
+
+
+ **Relation names cannot be changed after creation** (they affect the API). Plan your names carefully.
+
+
+## Before You Start
+
+Decide:
+
+* Which objects are you connecting? (e.g., People → Companies)
+* Which is the "one" side? (e.g., Company)
+* Which is the "many" side? (e.g., People — many people work at one company)
+* What should the field be named on each side?
+
+See [Relation Fields](/l/ko/user-guide/data-model/capabilities/relation-fields) for relation types explained.
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Select the object where you want the relation (typically the "many" side)
+3. Click **+ Add Field**
+4. Select **Relation** as the field type
+5. Choose the **target object**
+6. Select **One-to-Many** or **Many-to-One**
+7. Enter field names for **both sides** of the relation
+8. Click **Save**
+
+## Example: People → Companies
+
+* Go to **Settings → Data Model → People**
+* Add a Relation field
+* Target: **Companies**
+* Type: **Many-to-One**
+* Field on People: **Company**
+* Field on Companies: **Employees**
+
+Now each Person can be linked to a Company, and each Company shows its People.
+
+## Deleting a Relation
+
+1. Go to **Settings → Data Model**
+2. Find the relation field
+3. Click **⋮ → Deactivate**
+
+Links are preserved but hidden. Reactivate to restore.
+
+
+ **Deleting a relation doesn't delete records.** Only the link between them is removed.
+
+
+## Related
+
+* [Relation Fields](/l/ko/user-guide/data-model/capabilities/relation-fields) — types and limitations
+* [How to Import Relations](/l/ko/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) — bulk import linked records
diff --git a/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/customize-your-data-model.mdx b/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/customize-your-data-model.mdx
new file mode 100644
index 0000000000..e158f2cec1
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/customize-your-data-model.mdx
@@ -0,0 +1,22 @@
+---
+title: Customize Your Data Model
+description: Overview of data model customization options.
+---
+
+Twenty's data model is fully customizable. Create objects, fields, and relations to match your business.
+
+## Quick Links
+
+| I want to... | Guide |
+| ------------------------ | -------------------------------------------------------------------------------------- |
+| Create a new object | [How to Create Custom Objects](/l/ko/user-guide/data-model/how-tos/create-custom-objects) |
+| Add fields to an object | [How to Create Custom Fields](/l/ko/user-guide/data-model/how-tos/create-custom-fields) |
+| Connect objects together | [How to Create Relation Fields](/l/ko/user-guide/data-model/how-tos/create-relation-fields) |
+
+## Learn More
+
+* [Understanding Your Data Model](/l/ko/user-guide/data-model/overview) — key concepts and planning tips
+* [Objects](/l/ko/user-guide/data-model/capabilities/objects) — standard vs custom objects
+* [Fields](/l/ko/user-guide/data-model/capabilities/fields) — all field types
+* [Relation Fields](/l/ko/user-guide/data-model/capabilities/relation-fields) — connecting objects
+* [Data Model FAQ](/l/ko/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/data-model-faq.mdx b/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/data-model-faq.mdx
new file mode 100644
index 0000000000..2e952eac85
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-model/how-tos/data-model-faq.mdx
@@ -0,0 +1,155 @@
+---
+title: Data Model FAQ
+description: Frequently asked questions about Twenty's data model.
+---
+
+## Object Management
+
+
+
+ Yes, custom objects can be deleted. You can also deactivate them first, which hides the object and its data from the interface while preserving the data.
+
+
+
+ No, standard objects cannot be deleted. You can only deactivate them, which hides them from the interface but preserves the data.
+
+
+
+ You can create as many custom objects and fields as you need — the price doesn't change.
+
+
+
+ You can rename the label of standard objects (People, Companies, Opportunities), but not their API names. The API names are fixed for consistency across all Twenty workspaces.
+
+
+
+ Yes, you can change the icon for both standard and custom objects in **Settings → Data Model**.
+
+
+
+ Not yet. Object ordering in the navigation is currently fixed, but this feature is planned for a future release.
+
+
+
+ All active objects appear in the navigation. You can deactivate objects you don't need under **Settings → Data Model**.
+
+
+
+## Field Capabilities
+
+
+
+ No, field types cannot be changed after creation. If you need a different type, create a new field with the correct type, migrate your data, then deactivate the old field.
+
+
+
+ Our GraphQL API uses both forms for different operations:
+
+ * `createPerson` (singular) for single record actions
+ * `createPeople` (plural) for bulk operations
+
+ This creates limitations when singular and plural forms are the same, but it improves the developer experience.
+
+
+
+ Certain field names like `Type` or `Application` are reserved for system use. Choose alternative names like `Category` or `Classification` instead.
+
+
+
+ * The field is hidden from the interface
+ * Existing data is preserved
+ * You can still access the field via API
+ * Existing relations remain but you can't create new ones
+ * You can reactivate the field later
+
+
+
+ Currently, you cannot make custom fields required. All fields accept empty values. You can use workflows to enforce required fields by sending alerts or blocking actions when fields are empty.
+
+
+
+ * **Unique**: No two records can have the same value in this field
+ * **Required**: The field must have a value (not currently supported for custom fields)
+
+
+
+ Formula fields are coming in **Q1 2026**. In the meantime, you can use workflows to calculate and update field values automatically.
+
+
+
+ Nested fields are coming in **Q1 2026**. Currently, you can use workflows to bring field values from related objects. For example, to display a company's industry on a Person record, create a custom field on People and use a workflow to synchronize the value.
+
+
+
+ Field reordering will be available with custom layouts in **Q4 2025**. Currently, fields appear in alphabetical order.
+
+
+
+## Relations
+
+
+
+ Yes! Self-referencing relations are supported and recommended for use cases like account hierarchies. For example, create a relation from Companies to Companies to track parent/child accounts.
+
+
+
+ Many-to-many relationships are coming in **H1 2026**. Currently, create an intermediate object with two one-to-many relationships as a workaround.
+
+ For example, to link People and Projects (many-to-many), create a "Project Assignments" object with:
+
+ * A relation to People (many assignments → one person)
+ * A relation to Projects (many assignments → one project)
+
+
+
+ These allow one object to relate to multiple different object types through a single field. For example, Notes can be attached to People AND Companies AND Opportunities simultaneously.
+
+ Each Note links to one Person, one Company, and one Opportunity at the same time.
+
+ Learn more in [Relation Fields](/l/ko/user-guide/data-model/capabilities/relation-fields).
+
+
+
+ Yes, you can create multiple relations between the same two objects. For example, a Company could have both a "Primary Contact" and "Billing Contact" relation to People.
+
+
+
+ When you delete a record, the relation link is removed from the related records. The related records themselves are not deleted.
+
+
+
+ While technically possible, circular relations (A → B → C → A) should be avoided as they can cause confusion and potential performance issues.
+
+
+
+## Access and Permissions
+
+
+
+ Go to **Settings → Data Model** to view and edit all your objects and fields.
+
+
+
+ Reach out to your workspace administrator. Data model access is usually restricted to administrators only.
+
+
+
+## Data Management
+
+
+
+ There's no hard limit on record counts. However, very large datasets may impact performance in some views. Use filters and views to manage large datasets effectively.
+
+
+
+ Yes, you can import CSV data into any object, including custom objects. The import process supports field mapping for custom fields. See [How to Prepare Your CSV Files](/l/ko/user-guide/data-migration/how-tos/prepare-your-csv-files).
+
+
+
+ Currently, there's no built-in export for data model configuration. Contact support if you need to migrate your data model between workspaces.
+
+
+
+## Need More Help?
+
+Check our [Implementation Services](/l/ko/user-guide/getting-started/capabilities/implementation-services) for help with complex data model design.
diff --git a/packages/twenty-docs/l/ko/user-guide/data-model/overview.mdx b/packages/twenty-docs/l/ko/user-guide/data-model/overview.mdx
new file mode 100644
index 0000000000..14b8345a46
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/data-model/overview.mdx
@@ -0,0 +1,180 @@
+---
+title: Data Model
+description: Learn what a data model is and how to design one that fits your business.
+image: /images/user-guide/fields/custom_data_model.png
+---
+
+
+
+
+
+## What is a Data Model?
+
+A data model is the structure that defines how information is organized in your CRM. Think of it as the **blueprint** of your customer data — you design it once, then fill it with your actual data.
+
+## Key Concepts
+
+### Objects
+
+**Objects** are the main categories of data in your CRM. Each object represents a type of thing you want to track.
+
+Twenty comes with standard objects:
+
+* **People** — individuals (contacts, leads, partners)
+* **Companies** — organizations
+* **Opportunities** — deals or sales
+* **Notes** — attached notes on records
+* **Tasks** — to-dos linked to records
+
+You can also create **custom objects** for anything specific to your business (e.g., Projects, Subscriptions, Events).
+
+### Fields
+
+**Fields** are the properties or attributes that describe each object. They store the actual information.
+
+For example, the **People** object has fields like:
+
+* Name
+* Email
+* Phone
+* Job Title
+* Company (a relation to the Companies object)
+
+Fields have different **types**: text, number, date, select, multi-select, relation, and more. You can add custom fields to any object.
+
+### Records
+
+**Records** are the individual entries within an object — the actual data you create and manage.
+
+For example:
+
+* "John Smith" is a **record** in the People object
+* "Acme Corp" is a **record** in the Companies object
+
+**An analogy:**
+
+| Data Model Concept | Real-World Analogy |
+| ------------------ | ------------------------------------------ |
+| **Objects** | Sections in a book (the categories) |
+| **Fields** | Columns in a spreadsheet (the properties) |
+| **Records** | Rows in a spreadsheet (the actual entries) |
+
+You design the data model (objects + fields) once, then create many records within that structure.
+
+## Why Customize Your Data Model?
+
+Every business works differently. Customizing your data model means you can shape Twenty around **your** processes instead of forcing yours into a rigid system.
+
+Twenty offers full flexibility:
+
+* Create as many custom objects as you need
+* Add unlimited custom fields
+* The price doesn't change based on customization
+
+## Tips to Design Your Data Model
+
+### 1. Start with Your Core Objects
+
+Identify the main concepts you work with. Twenty already provides:
+
+* **People** — your contacts
+* **Companies** — your accounts
+* **Opportunities** — your deals
+
+Think about what else you might need:
+
+* Stripe would need a `Subscriptions` object
+* Airbnb would need a `Trips` object
+* An accelerator would need a `Batches` object
+
+### 2. Use Fields for Variations, Not New Objects
+
+If something is just a characteristic of an existing object, make it a **field**.
+
+**Use fields for:**
+
+* Categories and labels (e.g., `Industry` for Companies)
+* Status values (e.g., `Stage` for Opportunities)
+* Attributes and properties
+
+### 3. Create an Object When It Stands on Its Own
+
+If the concept has its own lifecycle, properties, or relationships, it deserves an object.
+
+**Create an object for:**
+
+* **Projects** — have deadlines, owners, and tasks
+* **Subscriptions** — connect companies, products, and invoices
+* **Events** — involve attendees and follow-up actions
+
+These go beyond a single field because they carry their own data and relationships.
+
+### 4. Create an Object When Records Are Open-Ended
+
+If something can be linked multiple times and you don't know how many, use an object.
+
+**Bad approach:**
+Creating fields like `Product 1`, `Product 2`, `Product 3`...
+
+**Good approach:**
+Create a `Products` object and relate it to records. This supports one, two, or a hundred products without changing your model.
+
+### 5. Keep It Simple First
+
+Start with fields. Move to new objects only when you feel the limits:
+
+* Too many fields on one object
+* Repeated records that should be separate
+* Relationships that don't fit neatly
+
+## Special Note on People, Companies, and Opportunities
+
+
+ **Email and calendar sync only works with People, Companies, and Opportunities.**
+
+ These are the only objects where you can access synchronized emails and meetings from your mailbox/calendar. We recommend using them as much as possible.
+
+
+**Best practices:**
+
+* If you need categories of People, use fields (not new objects)
+* Example: Use a `Person Type` field with values "Prospect" and "Partner" instead of creating separate objects
+* Create different **views** to filter: one showing partners, another showing prospects
+
+**It's okay to have fields that don't apply to every record.** For example, a `Referral Link` field on People that only applies when `Person Type = Partner`. Hide this field from views where it's not relevant.
+
+## Questions to Guide Your Choice
+
+Ask yourself:
+
+Is this just a property of something I already have, or does it need its own properties?
+Will I ever need to track multiple of these per record, without knowing how many?
+Does this concept connect to several different objects, not just one?
+Will it have its own lifecycle (stages, start/end dates)?
+
+If the answer is "yes" to one or more, it's probably time for a new object.
+
+## Accessing Your Data Model
+
+1. Go to **Settings** in the left sidebar
+2. Click **Data Model**
+3. View all your objects (standard and custom)
+4. Click any object to see and edit its fields
+
+
+ **Don't see Data Model in Settings?**
+
+ Access to the data model is usually restricted to administrators. Contact your workspace admin if you need access.
+
+
+## Next Steps
+
+Once you've planned your data model:
+
+* [How to Create Custom Objects](/l/ko/user-guide/data-model/how-tos/create-custom-objects)
+* [How to Create Custom Fields](/l/ko/user-guide/data-model/how-tos/create-custom-fields)
+* [How to Create Relation Fields](/l/ko/user-guide/data-model/how-tos/create-relation-fields)
+
+## Need Help?
+
+Our team can help you design and create the data model you need. Discover our [Implementation Services](/l/ko/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/ko/user-guide/getting-started/capabilities/glossary.mdx b/packages/twenty-docs/l/ko/user-guide/getting-started/capabilities/glossary.mdx
new file mode 100644
index 0000000000..71ac91622f
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/getting-started/capabilities/glossary.mdx
@@ -0,0 +1,108 @@
+---
+title: Glossary
+description: Get familiar with essential terminology used in Twenty.
+---
+
+## API
+
+API (Application Programming Interface) allows you to connect Twenty with other software systems and build custom integrations.
+
+## Apps
+
+Apps are custom extensions built as code that can define data models and serverless functions. They enable developers to create reusable customizations that can be deployed across multiple workspaces.
+
+## Code Actions
+
+Code Actions are workflow steps that let you write custom JavaScript to transform data, make calculations, or perform complex logic that isn't possible with built-in actions.
+
+## Command Menu
+
+The Command Menu is a quick-access interface (opened with `Cmd + K` on Mac and `Ctrl + K` on Windows) that lets you perform actions, create records, and navigate your workspace efficiently.
+
+## Company & People
+
+The CRM has two fundamental types of records:
+
+* A `Company` represents a business or organization.
+* `People` represent your company's current and prospective customers or clients.
+
+## Custom Fields
+
+Custom Fields are data fields you create to capture information specific to your business needs and processes.
+
+## Data Model
+
+A Data Model is the structure that defines how information is organized in your CRM, including what objects exist, their properties (fields), and how they relate to each other.
+
+## Favorites
+
+Favorites are records you've marked for quick access, appearing in your sidebar for instant navigation to important data.
+
+## Field
+
+A field refers to a specific area where particular data is stored for an entity.
+
+## Integration
+
+Integrations are built-in tools that allow you to link Twenty with other software or systems.
+
+## Iterator
+
+An Iterator is a workflow action that loops through an array of items, executing subsequent actions for each item in the list.
+
+## Kanban
+
+A `Kanban` is a visual way to track your business processes using cards and columns. Each column represents a stage in your process (for example: new, ongoing, won, lost), and you move records through these stages as they progress.
+
+## Object
+
+An Object is a data structure that represents a specific type of entity in your CRM (like People, Companies, or Opportunities). Objects can be standard (built-in) or custom (created by you).
+
+## Opportunities
+
+Opportunities in Twenty CRM are potential deals or sales with accounts or contacts.
+
+## Record
+
+A Record indicates an instance of an object, like a specific account or contact.
+
+## Relation Fields
+
+Relation Fields create connections between different objects, allowing you to link records together (like connecting a Person to a Company).
+
+## Standard Fields
+
+Standard Fields are pre-built data fields that come with objects by default and provide common functionality across all workspaces.
+
+## Tasks
+
+Tasks in Twenty CRM are assigned activities relating to contacts, accounts, or opportunities.
+
+## Triggers
+
+Triggers are the starting point of a workflow — the event or condition that initiates the automation. Examples include record creation, record updates, webhooks, or scheduled times.
+
+## Views
+
+You can customize the display of your records using views, setting different filters, layouts and sorting options for each view.
+
+## Upsert
+
+Upsert is an operation that combines "update" and "insert" — it updates an existing record if a match is found, or creates a new record if no match exists.
+
+## Webhooks
+
+Webhooks are automated messages sent from Twenty to other applications when specific events occur, enabling real-time data synchronization.
+
+## Workflows
+
+Workflows are automated processes that trigger actions based on specific conditions, helping you automate repetitive tasks and business processes.
+
+## Workspace
+
+A `Workspace` typically represents a company using Twenty. It holds all the records and data that you and your team members add to Twenty.
+It has a single domain name, which is typically the domain name your company uses for employee email addresses.
+
+## Workspace Members
+
+Workspace Members are the Twenty users from your team who have access to your workspace. They can be assigned as owners or assignees for records.
diff --git a/packages/twenty-docs/l/ko/user-guide/getting-started/capabilities/implementation-services.mdx b/packages/twenty-docs/l/ko/user-guide/getting-started/capabilities/implementation-services.mdx
new file mode 100644
index 0000000000..706de4d2a0
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/getting-started/capabilities/implementation-services.mdx
@@ -0,0 +1,16 @@
+---
+title: Implementation Services
+description: Whether you need help getting started or creating advanced customizations, we have a solution.
+---
+
+## Onboarding Packs
+
+Get help from our core team to set up your Twenty workspace with our 4-hour Onboarding packs:
+
+* **Data Model Design**: Design and create your custom data model with objects, fields, and relationships
+* **Data Migration**: Migrate your existing data from your current CRM to Twenty
+* **Workflow Creation**: Create custom workflows to support your business processes
+
+## Implementation Partners
+
+Work with certified Twenty partners for more advanced customizations and integrations. Reach out to our team via [contact@twenty.com](mailto:contact@twenty.com) to be matched with our partners.
diff --git a/packages/twenty-docs/l/ko/user-guide/getting-started/capabilities/what-is-twenty.mdx b/packages/twenty-docs/l/ko/user-guide/getting-started/capabilities/what-is-twenty.mdx
new file mode 100644
index 0000000000..87709bb07f
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/getting-started/capabilities/what-is-twenty.mdx
@@ -0,0 +1,42 @@
+---
+title: What is Twenty
+description: Twenty is an open-source CRM that gives you the building blocks to create exactly what your business needs.
+---
+
+## Vision
+
+Creating a good CRM is hard because it's a balancing act.
+For each business, the requirements seem straightforward, yet everyone's needs are distinct.
+The result is a CRM that's either too basic, or one that's attempting to be a jack-of-all-trades but ending up as a master of none.
+
+At first, Twenty looks like most CRMs you already know: you can track deals, organize contacts, manage tasks and notes.
+**But what sets it apart is our approach to extensibility. We are building an open platform that provides the building blocks for you to solve your unique business problems.**
+
+We prioritize universal principles and common patterns over feature lists.
+We don't try to have all the answers and instead empower users to find what works best for them.
+Open-source is the bedrock of our approach, ensuring that Twenty evolves with its community, for its community.
+
+## Benefits
+
+**Customizable:** Designed to fit your business needs.
+
+**Community-driven:** Built and maintained by a large open-source community.
+
+**Cost-effective:** You'll never be vendor-locked, because you can always self-host.
+
+## Main Features
+
+* **Calendar & Emails:** Sync your mailbox and calendar to see all communications on your CRM records. [Learn more](/l/ko/user-guide/calendar-emails/overview).
+* **Data Model:** Create custom objects and fields to match your unique business processes. [Explore](/l/ko/user-guide/data-model/overview).
+* **Data Migration:** Import and export your data via CSV or API. [Get started](/l/ko/user-guide/data-migration/overview).
+* **Views & Pipelines:** Organize your data with table views, kanban boards, and sales pipelines. [Discover](/l/ko/user-guide/views-pipelines/overview).
+* **Workflows:** Automate your business processes and integrate with external tools. [Build automations](/l/ko/user-guide/workflows/overview).
+* **AI:** Enhance your CRM with AI-powered features and agents. [Explore AI](/l/ko/user-guide/ai/overview).
+* **Dashboards:** Track performance with custom reports and visualizations. [View dashboards](/l/ko/user-guide/dashboards/overview).
+* **Permissions & Access:** Control who can view, edit, and manage your data with role-based permissions. [Configure access](/l/ko/user-guide/permissions-access/overview).
+* **Notes & Tasks:** Create notes and tasks linked to your records for better collaboration.
+* **API & Webhooks:** Connect to other apps and build custom integrations. [Start integrating](/l/ko/developers/extend/capabilities/apis).
+
+## Join now
+
+[Register here](https://app.twenty.com) or [become a contributor on GitHub](https://github.com/twentyhq/twenty).
diff --git a/packages/twenty-docs/l/ko/user-guide/getting-started/how-tos/configure-your-workspace.mdx b/packages/twenty-docs/l/ko/user-guide/getting-started/how-tos/configure-your-workspace.mdx
new file mode 100644
index 0000000000..1fa5f00c06
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/getting-started/how-tos/configure-your-workspace.mdx
@@ -0,0 +1,77 @@
+---
+title: Configure Your Workspace
+description: Every business works differently. Start with these 3 steps to shape Twenty around your needs.
+---
+
+**Quick Win**: Start with connecting your mailbox. This gives you immediate value and helps your team see Twenty in action with real data. You can do so under Settings → Accounts.
+
+## 1. Customize your data model
+
+Twenty offers the flexibility you need to shape the data model that will best support your day-to-day.
+Create objects and fields of any type, including relations between your different objects. You can do so under Settings → Data Model.
+Here are a few tips:
+
+* **You are not limited in the number of custom fields nor custom objects**. Adding custom objects and fields will not lead to upgrading your plan.
+* **People, Companies and Opportunities are the three objects from where you can access the emails and meetings synchronized from your mailbox and calendar**. We recommend using those as much as possible, adding fields to categorize your records if need be. Here is an example:
+ * It is best to use the People object for your prospects and partners, creating a field on the People object named `Person Type`, instead of creating a Partner custom object. Because you would not be able to access the emails exchanged with this person from the Partner records.
+ * Create different views under People, one to display partners and one to display prospects.
+* Two People cannot have the same email address. Two Companies cannot have the same domain.
+* You can deactivate standard fields and objects you do not want to use.
+* You can hide fields from views: don't be afraid of creating fields, you won't have to display all of them.
+
+Read [this article](/l/ko/user-guide/data-model/overview) to learn how to design your data model.
+
+## 2. Bring your data in
+
+Bringing your existing data into Twenty gives your team context from the start.
+
+### Connect your mailbox
+
+If you have not done so when creating your workspace, connect your **Google or Microsoft account** under Settings → Accounts. This allows Twenty to:
+
+* Import your messages and meetings
+* Auto-create contacts based on interactions (optional)
+* Keep communication history visible for your team
+
+**Using another provider?**
+You can add another mailbox via SMTP or another calendar via CalDAV. You will need to activate the feature under Settings → Releases → Lab, and then go back to the Settings → Accounts tab.
+
+### Import data via csv
+
+Use the Command menu (`Cmd + K` or `Ctrl + K`) to import People, Companies, Opportunities, or any custom objects via CSV.
+
+**Key guidelines**:
+
+* Download the sample file to understand the expected format
+* Limit each file to 10k records
+* Remove duplicate emails for People or duplicate domains for Companies
+* Review and fix errors (highlighted in yellow) before importing
+
+Read [this article](/l/ko/user-guide/data-migration/overview) to learn more about data import.
+
+## 3. Create your first view
+
+Creating different views is key to make the data actionable for your team.
+Here is how to proceed:
+
+* **Add or hide columns**
+ Manage the fields visible in a given view clicking on Options → Fields (from the top right). You can show/hide fields from there.
+
+* **Reorder fields**
+ Reorder the fields from a given view clicking on Options → Fields (from the top right). Drag and drop the fields to reorder them.
+
+* **Filter your view**
+ Narrow down the records displayed using the Filters from the top right.
+
+* **Sort records**
+ Reorder records displayed using the Sort function from the top right, or by clicking directly on the column name.
+
+* **Choose the layout**
+ You can switch to a **Kanban layout** or a list **Group By** layout, as long as the object has a `Stage` or similar select-type field.
+
+* **Save your view as Favorites**
+ This can be done using the dropdown menu showing the different views.
+
+## What's next?
+
+Start creating automations using [workflows](/l/ko/user-guide/workflows/overview).
diff --git a/packages/twenty-docs/l/ko/user-guide/getting-started/how-tos/create-workspace.mdx b/packages/twenty-docs/l/ko/user-guide/getting-started/how-tos/create-workspace.mdx
new file mode 100644
index 0000000000..f93617f83f
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/getting-started/how-tos/create-workspace.mdx
@@ -0,0 +1,48 @@
+---
+title: Create a Workspace
+description: Follow a step-by-step guide on how to register on Twenty, choose a subscription plan, and set up your account.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Step 1: Registration
+
+1. Navigate to [Twenty Sign Up](https://app.twenty.com).
+2. Select your preferred sign-up method:
+ * **Continue with Google** for Google account registration.
+ * **Continue with Microsoft** for Microsoft account registration.
+ * Or, **Continue With Email** for email registration.
+
+
+
+## Step 2: Choosing a Trial Period
+
+Choose between two trial periods:
+
+### 30 days
+
+With credit card
+
+### 7 days
+
+Without credit card
+
+Both trials include:
+
+* Full access
+* Unlimited contacts
+* Email integration
+* Custom objects
+* API & Webhooks
+
+You can click on "Change plan" to choose a different plan or billing interval.
+
+
+
+## Step 3: Payment Confirmation & Account Setup
+
+Post payment approval via Stripe, you're directed to create your workspace and user profile. Remember that you can cancel your subscription anytime.
+
+## Support
+
+For queries or help, connect with the dedicated support team at [contact@twenty.com](mailto:contact@twenty.com) or send a message on [Discord](https://discord.gg/cx5n4Jzs57).
diff --git a/packages/twenty-docs/l/ko/user-guide/getting-started/how-tos/navigate-around-twenty.mdx b/packages/twenty-docs/l/ko/user-guide/getting-started/how-tos/navigate-around-twenty.mdx
new file mode 100644
index 0000000000..ef1b569098
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/getting-started/how-tos/navigate-around-twenty.mdx
@@ -0,0 +1,83 @@
+---
+title: Navigate Around Twenty
+description: Get a quick overview of how to navigate through the platform and where to take different types of actions.
+---
+
+## The Main Layout
+
+The center of the screen is **where your records live**: people, companies, opportunities, tasks, notes, dashboards, workflows and any other object you created. This is where the day-to-day work happens.
+You can **view, edit, delete records** from there as well as **creating new views**.
+
+
+
+## The Navigation Bar
+
+On the left side, from the top to the bottom, you'll be able to:
+
+* Switch between your **several workspaces** using the dropdown menu or create a new workspace
+* Use the **search bar** (press `/` to focus on it instantly)
+* Open the **Settings** section
+* Have direct access to your **Favourites views**. Favourites are unique for each user.
+* Switch between different objects
+* **Create automations** using workflows
+* Reach out to Support and open our User Guide.
+
+
+
+## The Command Menu
+
+The command menu gives you **quick access to actions** in Twenty. You can access it in two ways:
+
+* **Keyboard shortcut**: Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+* **Mouse**: Click the three dots in the top right corner
+ From there, you can:
+* Create new records
+* **Import and export data via csv**
+* Create new views
+* Access deleted records (Twenty supports soft and hard deletes)
+* See the keyboard shortcuts to quickly access objects in your workspace
+
+
+
+## The Search Bar
+
+The search bar is accesible via the Command Menu, at the top of your navigation bar, or by pressing `/` to focus on it instantly. Search works across all object.
+
+
+
+## The Side Panel
+
+When you click on a record, the side panel appears on the right. This gives you a quick overview of the record's key information, without bringing you to another page. From there, you can decide to close this overview or to get additional information about this record, clicking on the Open button.
+
+
+
+## Views
+
+Every object (like Opportunities or People) supports multiple views. You're not limited in the number of views per object.
+
+Use the dropdown menu at the top left of the main layout to switch between the different views. For example:
+
+* Use a Kanban view to track opportunities by stage
+* Use Group By view to create sections and improve efficiency
+* Use filters to focus on specific records (e.g. leads created last week)
+* Save filtered views to reuse them later
+* Favourite views for fast access
+
+
+
+If you're new to Views, read our [Views & Pipelines guide](/l/ko/user-guide/views-pipelines/overview) to learn how to create and customize them.
+
+## Settings
+
+Open your Settings from the top left to:
+
+* **Connect your mailbox and calendar** accounts for seamless email and calendar sync
+* Customize your **data model**: create custom objects, fields, and relationships
+* **Access the API playground and configure webhooks**
+* **Manage user permissions** and workspace access controls
+* Invite team members and manage user roles
+* Edit your profile and workspace preferences
+* Configure billing and monitor workflow credits usage
+* Discover the latest releases and upcoming features (under Releases → Lab tab)
+
+If you do not see all those sections under Settings, reach out to your workspace administrator - some of them have restricted access.
diff --git a/packages/twenty-docs/l/ko/user-guide/introduction.mdx b/packages/twenty-docs/l/ko/user-guide/introduction.mdx
new file mode 100644
index 0000000000..dda96e2e90
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/introduction.mdx
@@ -0,0 +1,63 @@
+---
+title: Discover Twenty
+description: Welcome to Twenty User Guide, your resources for advanced configurations and best practices.
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+
+
+ Discover Twenty
+ Learn what Twenty is and how it can help your business.
+
+
+
+ Data Model
+ Customize your data model to fit your business processes.
+
+
+
+ Data Migration
+ Import and export your data via CSV or API.
+
+
+
+ Calendar & Emails
+ Centralize your team's meetings and emails.
+
+
+
+ Workflows
+ Automate processes and integrate with external tools.
+
+
+
+ AI
+ Enhance your team with AI agents.
+
+
+
+ Views & Pipelines
+ Organize your data with actionable views and pipelines.
+
+
+
+ Dashboards
+ Real-time insights to track performance.
+
+
+
+ Permissions & Access
+ Manage roles and access to Twenty.
+
+
+
+ Billing
+ Understand how Twenty pricing and billing works.
+
+
+
+ Settings
+ Configure your workspace preferences.
+
+
diff --git a/packages/twenty-docs/l/ko/user-guide/permissions-access/capabilities/permissions.mdx b/packages/twenty-docs/l/ko/user-guide/permissions-access/capabilities/permissions.mdx
new file mode 100644
index 0000000000..2ad09471e9
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/permissions-access/capabilities/permissions.mdx
@@ -0,0 +1,198 @@
+---
+title: Permissions
+description: Control access to objects, fields, and settings with role-based permissions.
+image: /images/user-guide/permissions/permissions.png
+---
+
+Twenty's permission system allows you to control access to three main areas:
+
+* **Objects and Fields**: Control who can view, edit, or delete records and individual fields
+* **Settings**: Manage access to workspace configuration and administrative functions
+* **Actions**: Control general workspace actions like importing data or sending emails
+
+## Create a Role
+
+To create a new role:
+
+1. Go to **Settings → Roles**
+2. Under **All Roles**, click on **+ Create Role**
+3. Enter a role name
+4. In the default **Permissions** tab, [configure permissions](#customize-permissions)
+5. Click **Save** to finish
+
+## Delete a Role
+
+To delete a role:
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to remove
+3. Open the **Settings** tab, then click **Delete Role**
+4. Click **Confirm** in the modal
+
+
+ If a role is deleted, any workspace member assigned to it will be automatically reassigned to the default role. All except the **Admin** role can be deleted. There must always be at least one member assigned to the **Admin** role.
+
+
+## Assign Roles to Members
+
+### View Current Assignments
+
+* Go to **Settings → Roles**
+* See all roles and how many members are assigned to each
+* View which members have which roles
+
+### Assign a Role to a Member
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Click **+ Assign to member**
+5. Select the workspace member from the list
+6. Confirm the assignment
+
+### Set Default Role
+
+1. Go to **Settings → Roles**
+2. In the **Options** section, find **Default Role**
+3. Select which role new members should automatically receive
+4. New workspace members will be assigned this role when they join
+
+
+ You can only assign roles to existing workspace members. To invite new members, use [Member Management](/l/ko/user-guide/settings/capabilities/member-management).
+
+
+## Customize Permissions
+
+Permissions determine what each role can access or modify within your workspace, including workspace objects records, settings, and actions.
+
+### Object Permissions
+
+The **Objects** section controls what this role can do with records across your workspace.
+
+#### Set Default Permissions (All Objects)
+
+First, configure the baseline permissions that apply to **all objects** by default:
+
+| Permission | Description |
+| ---------------------------------- | -------------------------------------- |
+| **See Records on All Objects** | View records in lists and detail pages |
+| **Edit Records on All Objects** | Modify existing records |
+| **Delete Records on All Objects** | Soft-delete records (can be restored) |
+| **Destroy Records on All Objects** | Permanently delete records |
+
+Select or unselect based on what should be the default behavior for this role.
+
+
+ **Example — Intern role**: An intern should be able to see all objects but not edit them by default. Enable "See Records on All Objects" but leave "Edit Records on All Objects" unchecked.
+
+
+#### Add Object-Level Exceptions
+
+After setting defaults, use the **Object-Level** sub-section to add rules that override the defaults for specific objects.
+
+Click **+ Add rule** and select an object to create an exception.
+
+**Example rules for an Intern role:**
+
+| Rule | Effect |
+| ------------------------------------- | ------------------------------------------------------ |
+| Opportunities → disable "See Records" | Intern cannot see the Opportunities object at all |
+| People → enable "Edit Records" | Intern can edit People records (but not other objects) |
+
+### Field Permissions
+
+Within each object-level rule, you can go further and configure **field-level permissions** to control access to specific fields.
+
+| Permission | Description |
+| -------------- | -------------------------- |
+| **See Field** | View the field value |
+| **Edit Field** | Modify the field value |
+| **No Access** | Field is completely hidden |
+
+**Example — Restrict sensitive fields:**
+
+For the Intern role with People edit access, you might want to restrict certain fields:
+
+* People → Email → **See Field** only (cannot edit)
+* People → Address → **No Access** (completely hidden)
+
+This allows the intern to edit most People fields while protecting sensitive information.
+
+### How Permission Inheritance Works
+
+Permissions cascade from general to specific:
+
+1. **All Objects** → sets the baseline for all objects
+2. **Object-Level rules** → override the baseline for specific objects
+3. **Field-Level rules** → override the object setting for specific fields
+
+More specific settings always take precedence.
+
+### Managing Permission Overrides
+
+To override inherited permissions:
+
+1. Click **X** to remove the inherited rule
+2. Select the specific permissions you want
+3. Click the orange **Undo** icon (circular arrow) to revert changes
+
+When done, click **Finish**, then **Save** once redirected to the role page.
+
+### Workspace Settings Permissions
+
+Control access to workspace settings in two ways:
+
+* Toggle **Settings All Access** to grant full access
+* Or enable specific permissions (e.g., API key generation, workspace preferences, role assignment, data model configuration, security settings, and workflow management)
+
+
+ **Current limitation**: Access to workflow management is currently required to manually trigger workflows. This behavior may change in future releases.
+
+
+### Workspace Action Permissions
+
+Control access to general workspace actions:
+
+* Toggle **Application All Access** to grant full permissions
+* Or enable individual actions such as **Send Email**, **Import CSV**, and **Export CSV**
+
+## Assigning Roles to API Keys and AI Agents
+
+Beyond workspace members, roles can also be assigned to **API Keys** and **AI Agents**. This is particularly helpful for teams who want to control exactly "who" can do what in their workspace—including automated processes and integrations.
+
+### Why Assign Roles to API Keys and AI Agents?
+
+* **Security**: Limit what automated processes can access or modify
+* **Compliance**: Ensure integrations only touch the data they need
+* **Control**: Prevent accidental data changes from misconfigured automations
+* **Auditability**: Track which actions were performed by which integration or agent
+
+### Assign a Role to an API Key
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **API Keys**, click **+ Assign to API key**
+5. Select the API key from the list
+6. Confirm the assignment
+
+The API key will now inherit all permissions defined by that role. Any API calls made with this key will be restricted accordingly.
+
+
+ API keys without an assigned role use default permissions. For tighter security, always assign a specific role to production API keys.
+
+
+### Assign a Role to an AI Agent
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **AI Agents**, click **+ Assign to AI agent**
+5. Select the AI agent from the list
+6. Confirm the assignment
+
+The AI agent will only be able to access data and perform actions allowed by its assigned role.
+
+
+ For AI agents running within workflows, this ensures the agent cannot access or modify data outside its intended scope—even if the workflow has broader permissions.
+
diff --git a/packages/twenty-docs/l/ko/user-guide/permissions-access/capabilities/sso-configuration.mdx b/packages/twenty-docs/l/ko/user-guide/permissions-access/capabilities/sso-configuration.mdx
new file mode 100644
index 0000000000..310c161605
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/permissions-access/capabilities/sso-configuration.mdx
@@ -0,0 +1,125 @@
+---
+title: SSO Configuration
+description: Configure Single Sign-On for secure enterprise authentication.
+---
+
+## About SSO
+
+Single Sign-On (SSO) allows your team members to log into Twenty using your organization's identity provider. This provides:
+
+* **Centralized access control**: Manage access from one place
+* **Enhanced security**: Leverage your existing security policies
+* **Better user experience**: One set of credentials for all tools
+
+## Supported Providers
+
+Twenty supports SSO with:
+
+* **SAML 2.0**: Works with most enterprise identity providers
+* **Google Workspace**: For organizations using Google
+* **Microsoft Entra ID**: (formerly Azure AD) For Microsoft environments
+
+## Setting Up SSO
+
+### Prerequisites
+
+* Organization plan (cloud and self-hosted workspaces)
+* Admin access to your identity provider
+* Admin access to Twenty workspace
+
+
+ **For self-hosting users willing to set up SSO**, reach out to contact@twenty.com
+
+
+### Configuration Steps
+
+#### 1. Access SSO Settings
+
+1. Go to **Settings → Security**
+2. Find the **SSO Configuration** section
+3. Click **Configure SSO**
+
+#### 2) Choose Your Provider
+
+Select your identity provider from the list or choose "Custom SAML" for other providers.
+
+#### 3. Configure Your Identity Provider
+
+You'll need to configure your identity provider with:
+
+* **Entity ID**: Provided by Twenty
+* **ACS URL**: The callback URL for authentication
+* **Certificate**: For secure communication
+
+#### 4. Enter Provider Details in Twenty
+
+* **SSO URL**: Login URL from your provider
+* **Entity ID**: Your provider's identifier
+* **Certificate**: X.509 certificate from your provider
+
+#### 5. Test and Enable
+
+1. Click **Test Configuration** to verify setup
+2. Enable SSO when testing is successful
+3. Configure user provisioning preferences
+
+## User Provisioning
+
+### Just-in-Time (JIT) Provisioning
+
+* Users are created automatically on first login
+* Assigned default role automatically
+* No manual user creation needed
+
+### Manual Provisioning
+
+* Invite users before they can log in
+* Pre-assign specific roles
+* More control over who can access
+
+## Managing SSO Users
+
+### Role Assignment
+
+SSO users can be assigned roles like regular users:
+
+1. Go to **Settings → Members**
+2. Find the user
+3. Change their role as needed
+
+### Access Revocation
+
+To remove access for SSO users:
+
+* Remove them from your identity provider, or
+* Remove them from the Twenty workspace
+
+## Best Practices
+
+### Security
+
+* **Require SSO**: Disable password login for SSO users
+* **Regular audits**: Review access periodically
+* **Strong IdP policies**: Enforce MFA at the identity provider
+
+### User Management
+
+* **Clear naming**: Use consistent naming from your directory
+* **Group mapping**: Map IdP groups to Twenty roles (if available)
+* **Offboarding process**: Include Twenty in your deprovisioning workflow
+
+## Troubleshooting
+
+### Common Issues
+
+* **Certificate errors**: Ensure certificate hasn't expired
+* **URL mismatches**: Verify ACS URL matches exactly
+* **User not found**: Check JIT provisioning settings
+
+### Getting Help
+
+If you encounter issues, contact support with:
+
+* Error messages received
+* Identity provider being used
+* Configuration details (without sensitive data)
diff --git a/packages/twenty-docs/l/ko/user-guide/permissions-access/how-tos/permissions-faq.mdx b/packages/twenty-docs/l/ko/user-guide/permissions-access/how-tos/permissions-faq.mdx
new file mode 100644
index 0000000000..6700b48297
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/permissions-access/how-tos/permissions-faq.mdx
@@ -0,0 +1,126 @@
+---
+title: Permissions FAQ
+description: Frequently asked questions about roles and permissions.
+---
+
+## Roles
+
+
+
+ Twenty comes with an **Admin** and **Member** roles by default. You can create additional custom roles based on your team's needs (e.g., Sales Rep, Manager, Read-Only User).
+
+
+
+ No, the Admin role cannot be deleted. There must always be at least one member assigned to the Admin role.
+
+
+
+ Any workspace member assigned to that role will be automatically reassigned to the default role.
+
+
+
+ Go to **Settings → Roles**, find the **Default Role** option, and select which role new members should automatically receive when they join.
+
+
+
+ No, each user can only have one role at a time. Create a custom role if you need a combination of permissions.
+
+
+
+## Permissions
+
+
+
+ * **Object permissions**: Control access to entire records (e.g., can see/edit/delete People records)
+ * **Field permissions**: Control access to specific fields within an object (e.g., can see but not edit the Salary field)
+
+ Field permissions allow more granular control over sensitive data.
+
+
+
+ Permissions cascade from global to specific:
+
+ 1. **All Objects** sets the baseline for all objects
+ 2. **Object-Level Permissions** can override the global setting for specific objects
+ 3. **Field-Level Permissions** can override the object setting for specific fields
+
+ More specific settings always take precedence.
+
+
+
+ For objects:
+
+ * **See Records**: View records in lists and detail pages
+ * **Edit Records**: Modify existing records
+ * **Delete Records**: Soft-delete records (can be restored)
+ * **Destroy Records**: Permanently delete records
+
+ For fields:
+
+ * **See Field**: View the field value
+ * **Edit Field**: Modify the field value
+ * **No Access**: Field is completely hidden
+
+
+
+ Row-level permissions will be available on the **Organization** plan by Q1 2026. This allows you to restrict access to specific records based on criteria (e.g., only see your own opportunities).
+
+
+
+ 1. Go to **Settings → Roles**
+ 2. Select the role
+ 3. Navigate to the object containing the field
+ 4. Set the field permission to **See Field** (without Edit Field)
+
+
+
+## Settings & Actions
+
+
+
+ You can control access to:
+
+ * API key generation
+ * Workspace preferences
+ * Role assignment
+ * Data model configuration
+ * Security settings
+ * Workflow management
+
+ Use **Settings All Access** to grant full access, or enable specific permissions.
+
+
+
+ You can control:
+
+ * **Send Email**: Ability to send emails from Twenty
+ * **Import CSV**: Ability to import data via CSV
+ * **Export CSV**: Ability to export data to CSV
+
+ Use **Application All Access** to grant all actions, or enable specific ones.
+
+
+
+## SSO
+
+
+
+ No, SSO is a Premium feature available on the **Organization** plan only.
+
+
+
+ Twenty supports:
+
+ * **SAML 2.0** (works with most enterprise identity providers)
+ * **Google Workspace**
+ * **Microsoft Entra ID** (formerly Azure AD)
+
+
+
+ With JIT provisioning, user accounts are automatically created in Twenty when someone logs in via SSO for the first time. They're assigned the default role automatically.
+
+
+
+ Yes, once SSO is configured, you can disable password login for SSO users to enforce authentication through your identity provider.
+
+
diff --git a/packages/twenty-docs/l/ko/user-guide/permissions-access/overview.mdx b/packages/twenty-docs/l/ko/user-guide/permissions-access/overview.mdx
new file mode 100644
index 0000000000..43de8d6262
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/permissions-access/overview.mdx
@@ -0,0 +1,40 @@
+---
+title: Permissions & Access
+description: Manage roles, permissions, and access control in your workspace.
+---
+
+
+
+
+
+Twenty's permission system lets you control who can access and modify data in your workspace. Create roles, assign permissions, and configure SSO for secure access.
+
+## What's in this section
+
+
+
+ Create roles and configure object, field, and settings permissions.
+
+
+
+ Set up Single Sign-On with your identity provider.
+
+
+
+ Common questions about roles, permissions, and SSO.
+
+
+
+## Key features
+
+* **Role-based access**: Create custom roles with specific permissions
+* **Object permissions**: Control who can view, edit, or delete records
+* **Field permissions**: Restrict access to sensitive fields
+* **Settings permissions**: Control access to workspace configuration
+* **SSO integration**: Configure single sign-on for enterprise security (Organization plan)
+
+## Quick links
+
+* [Create a role](/l/ko/user-guide/permissions-access/capabilities/permissions#create-a-role)
+* [Configure SSO](/l/ko/user-guide/permissions-access/capabilities/sso-configuration)
+* [Manage team members](/l/ko/user-guide/settings/capabilities/member-management)
diff --git a/packages/twenty-docs/l/ko/user-guide/settings/capabilities/domains-settings.mdx b/packages/twenty-docs/l/ko/user-guide/settings/capabilities/domains-settings.mdx
new file mode 100644
index 0000000000..b2c49c5ae2
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/settings/capabilities/domains-settings.mdx
@@ -0,0 +1,47 @@
+---
+title: Domain Settings
+description: Configure workspace domain, approved access domains, and public domains.
+---
+
+Configure domain settings under **Settings → Domains**.
+
+## Workspace Domain
+
+Edit your subdomain name or set a custom domain for your workspace.
+
+### Customize Domain
+
+1. Click **Customize Domain**
+2. Edit your subdomain (e.g., `yourcompany.twenty.com`)
+3. Or set up a custom domain (e.g., `crm.yourcompany.com`)
+
+For custom domains, you'll need to configure DNS settings with your domain provider.
+
+## Approved Domains
+
+Anyone with an email address at these domains is allowed to sign up for this workspace automatically.
+
+### Add Approved Access Domain
+
+1. Click **Add Approved Access Domain**
+2. Enter your company domain (e.g., `yourcompany.com`)
+3. Save
+
+Once configured, anyone with an email address at that domain can join your workspace without needing a direct invitation.
+
+
+ This is useful for allowing your entire team to self-register while keeping the workspace restricted to your organization.
+
+
+## Public Domains
+
+Provision a complete and secure hosting environment on these domains.
+
+### Add Public Domain
+
+1. Click **Add Public Domain**
+2. Enter the domain you want to use
+3. Configure DNS settings as instructed
+4. Verify the domain
+
+SSL certificates are automatically provisioned for public domains.
diff --git a/packages/twenty-docs/l/ko/user-guide/settings/capabilities/experience-settings.mdx b/packages/twenty-docs/l/ko/user-guide/settings/capabilities/experience-settings.mdx
index bb83e7a164..e279f7d88b 100644
--- a/packages/twenty-docs/l/ko/user-guide/settings/capabilities/experience-settings.mdx
+++ b/packages/twenty-docs/l/ko/user-guide/settings/capabilities/experience-settings.mdx
@@ -1,38 +1,38 @@
---
-title: 경험 설정
-description: 인터페이스 테마와 지역 설정을 사용자 정의하세요.
+title: Experience Settings
+description: Customize your interface theme and regional preferences.
---
-Twenty 사용 경험을 **설정 → 경험**에서 개인화하세요.
+Personalize your Twenty experience under **Settings → Experience**.
-## 외관
+## Appearance
-화면 테마를 선택하세요:
+Choose your visual theme:
-* **라이트**: 깔끔하고 밝은 인터페이스
-* **다크**: 저조도 환경에서 눈에 더 편안합니다
-* **시스템 설정**: 기기의 테마에 자동으로 맞춥니다
+* **Light**: Clean, bright interface
+* **Dark**: Easier on the eyes in low-light conditions
+* **System settings**: Automatically matches your device's theme
-## 언어
+## Language
-드롭다운 메뉴에서 Twenty 인터페이스에 사용할 선호 언어를 선택하세요.
+Select your preferred language for the Twenty interface from the dropdown menu.
-## 형식
+## Formats
-날짜, 시간, 숫자, 시간대 및 캘린더 시작 요일을 구성하세요.
+Configure date, time, number, timezone, and calendar start day.
-| 설정 | 설명 |
-| ------------- | --------------------------- |
-| **시간대** | 정확한 타임스탬프와 일정 관리를 위한 로컬 시간대 |
-| **날짜 형식** | 날짜 표시 방식(예: 2025년 12월 12일) |
-| **시간 형식** | 12시간제(오후 7:22) 또는 24시간제 |
-| **숫자 형식** | 소수점 및 천 단위 구분자(예: 1,234.56) |
-| **캘린더 시작 요일** | 한 주의 시작 요일(일요일 또는 월요일) |
+| Setting | Description |
+| ---------------------- | ---------------------------------------------------------- |
+| **Time zone** | Your local timezone for accurate timestamps and scheduling |
+| **Date format** | How dates appear (e.g., Dec 12, 2025) |
+| **Time format** | 12-hour (7:22 PM) or 24-hour format |
+| **Number format** | Decimal and thousands separators (e.g., 1,234.56) |
+| **Calendar start day** | First day of the week (Sunday or Monday) |
-각 설정은 **시스템 설정**으로 지정해 기기 설정에 자동으로 맞추거나, 특정 형식을 선택할 수 있습니다.
+Each setting can be set to **System settings** to automatically match your device preferences, or you can choose a specific format.
-## 업데이트 방법
+## How to Update
-1. **설정 → 경험**으로 이동
-2. 각 섹션에서 기본 설정을 조정합니다.
-3. 변경 사항은 자동으로 저장됩니다.
+1. Go to **Settings → Experience**
+2. Adjust your preferences in each section
+3. Changes save automatically
diff --git a/packages/twenty-docs/l/ko/user-guide/settings/capabilities/member-management.mdx b/packages/twenty-docs/l/ko/user-guide/settings/capabilities/member-management.mdx
new file mode 100644
index 0000000000..7c97deebb9
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/settings/capabilities/member-management.mdx
@@ -0,0 +1,87 @@
+---
+title: Member Management
+description: Invite team members and manage workspace access.
+---
+
+Manage who has access to your workspace under **Settings → Members**.
+
+## Invite New Members
+
+### Using Email Invitation
+
+1. Go to **Settings → Members**
+2. Click **+ Invite**
+3. Enter the person's email address
+4. Select a role for the new member
+5. Click **Send invite**
+
+The invited person will receive an email with a link to join your workspace.
+
+### Using Invite Link
+
+1. Go to **Settings → Members**
+2. Copy the workspace invite link
+3. Share the link with new team members
+4. They'll receive access once they sign up
+
+## View and Manage Members
+
+### View All Members
+
+Go to **Settings → Members** to see:
+
+* All active members
+* Pending invitations
+
+### Edit a Member's Profile
+
+Click on a member to open their profile page. As an admin, you can:
+
+* Edit their **name**
+* Update their **profile picture**
+* **Impersonate** their account (useful for troubleshooting)
+* **Delete** their account
+
+### Change a Member's Role
+
+On the member's profile page:
+
+1. Open the **Permissions** tab
+2. View the currently assigned role
+3. Select a different role from the dropdown
+4. The change takes effect immediately
+
+→ [Learn more about roles and permissions](/l/ko/user-guide/permissions-access/capabilities/permissions)
+
+### Remove a Member
+
+1. Click on the member to open their profile
+2. Click **Delete** to remove them from the workspace
+
+
+ Removed members lose access immediately. Their data (records, notes, tasks) remains in the workspace.
+
+
+
+ **Email sync is also removed.** If the deleted user was the only one who synced certain emails, those emails will be permanently removed from the workspace.
+
+
+## Pending Invitations
+
+Manage invitations that haven't been accepted:
+
+* **Resend**: Send the invitation email again
+* **Cancel**: Revoke the invitation before it's accepted
+
+## Approved Access Domains
+
+Allow team members to join automatically based on their email domain:
+
+1. Go to **Settings → Domains**
+2. Add your company domain (e.g., `yourcompany.com`)
+3. Anyone with that email domain can join without an invitation
+
+## Related
+
+* [Permissions](/l/ko/user-guide/permissions-access/capabilities/permissions) — configure what each role can do
+* [Domains Settings](/l/ko/user-guide/settings/capabilities/domains-settings) — configure approved domains
diff --git a/packages/twenty-docs/l/ko/user-guide/settings/capabilities/profile-settings.mdx b/packages/twenty-docs/l/ko/user-guide/settings/capabilities/profile-settings.mdx
new file mode 100644
index 0000000000..febfa4a86f
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/settings/capabilities/profile-settings.mdx
@@ -0,0 +1,43 @@
+---
+title: Profile Settings
+description: Manage your personal profile and security settings.
+---
+
+## Personal Information
+
+### Name and Email
+
+* **Display Name**: Update how your name appears to other workspace members
+* **Email Address**: Change your login email (requires verification)
+* **Profile Picture**: Upload a custom avatar or use your initials
+
+## Security Settings
+
+### Two-Factor Authentication (2FA)
+
+Enable 2FA to add an extra layer of security to your account:
+
+1. Go to **Settings → Profile Settings**
+2. Click **Enable 2FA**
+3. Scan the QR code with your authenticator app
+4. Enter the verification code to confirm
+
+### Password Management
+
+* **Change Password**: Update your current password
+* **Password Requirements**: Must be at least 8 characters long
+
+## Profile Management
+
+### Delete Account
+
+
+ Deleting your account will permanently remove your access to all workspaces. This action cannot be undone, you'll lose access to all workspaces where you're a member, and you should consider leaving individual workspaces instead if you only want to exit specific teams.
+
+
+To delete your account:
+
+1. Go to **Settings → Profile Settings**
+2. Scroll to **Danger Zone**
+3. Click **Delete Account**
+4. Confirm by typing your email address
diff --git a/packages/twenty-docs/l/ko/user-guide/settings/capabilities/releases-settings.mdx b/packages/twenty-docs/l/ko/user-guide/settings/capabilities/releases-settings.mdx
new file mode 100644
index 0000000000..4180b67161
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/settings/capabilities/releases-settings.mdx
@@ -0,0 +1,31 @@
+---
+title: Releases Settings
+description: Enable experimental features in Twenty.
+---
+
+## About Releases Settings
+
+The Releases section allows you to enable experimental features before they're generally available.
+
+## Lab Features
+
+Lab features are experimental capabilities that are still being developed. They may change or be removed without notice.
+
+### How to Enable Lab Features
+
+1. Go to **Settings → Releases**
+2. Find the feature you want to enable
+3. Toggle it on
+4. The feature will be available immediately
+
+
+ Lab features are experimental and may not work as expected. Use them with caution in production environments.
+
+
+## Feature Feedback
+
+Your feedback helps improve Twenty:
+
+* Report issues with experimental features
+* Share how you're using new features
+* Suggest improvements via the community Discord
diff --git a/packages/twenty-docs/l/ko/user-guide/settings/capabilities/workspace-settings.mdx b/packages/twenty-docs/l/ko/user-guide/settings/capabilities/workspace-settings.mdx
new file mode 100644
index 0000000000..f72f71a814
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/settings/capabilities/workspace-settings.mdx
@@ -0,0 +1,30 @@
+---
+title: Workspace Settings
+description: Customize your workspace name and branding.
+---
+
+Those are accessible under **Settings → General**.
+
+## Workspace Picture
+
+* **Upload Logo**: Add a custom workspace logo
+* **Supported formats**: PNG, JPEG, and GIF files under 10MB
+* **Remove**: Delete the current workspace logo
+
+## Workspace Name
+
+* **Name**: Change your workspace display name
+* This name appears to all workspace members
+
+## Danger Zone
+
+
+ Deleting your workspace permanently removes all data and cannot be undone. All workspace data will be lost forever, all members will lose access immediately, and this action cannot be reversed.
+
+
+To delete your workspace:
+
+1. Click **Delete workspace** button
+2. Confirm the deletion when prompted
+
+**Note**: Only workspace administrators can delete workspaces.
diff --git a/packages/twenty-docs/l/ko/user-guide/settings/how-tos/settings-faq.mdx b/packages/twenty-docs/l/ko/user-guide/settings/how-tos/settings-faq.mdx
new file mode 100644
index 0000000000..19aa50e5a0
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/settings/how-tos/settings-faq.mdx
@@ -0,0 +1,171 @@
+---
+title: Settings FAQ
+description: Frequently asked questions about Twenty settings.
+image: /images/user-guide/setup/settings.png
+---
+
+## Workspace Settings
+
+
+
+ 1. Go to **Settings → General**
+ 2. Find the Workspace Name field
+ 3. Enter your new name
+ 4. Changes save automatically
+
+
+
+ 1. Go to **Settings → General**
+ 2. Click on the current logo or upload area
+ 3. Select an image file (PNG, JPEG, or GIF under 10MB)
+ 4. The logo updates immediately
+
+
+
+ Yes, you can create and be a member of multiple workspaces. Each workspace has its own data, settings, and subscription.
+
+
+
+ 1. Go to **Settings → General**
+ 2. Scroll to Danger Zone
+ 3. Click **Delete workspace**
+ 4. Confirm the deletion
+
+ Note: This permanently deletes all data and cannot be undone.
+
+
+
+ Delete the workspaces you no longer need under **Settings → General → Delete workspace**.
+
+
+ Do not delete your **account** (accessible under Settings → Profile): your account is shared among all your workspaces. Deleting your account removes access to ALL workspaces.
+
+
+
+
+ If you want to temporarily disable your workspace (not permanently delete it), go to **Settings → Billing** and click **Cancel Plan**. Your data will be preserved for a grace period.
+
+
+
+## Profile Settings
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Find the Password section
+ 3. Enter your current password
+ 4. Enter your new password
+ 5. Save changes
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Find the 2FA section
+ 3. Click **Enable 2FA**
+ 4. Scan the QR code with your authenticator app
+ 5. Enter the verification code
+
+
+
+ To change your email address, please reach out to [contact@twenty.com](mailto:contact@twenty.com).
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Scroll to Danger Zone
+ 3. Click **Delete Account**
+ 4. Confirm by typing your email
+
+ Note: This removes your access to all workspaces and deletes all emails synced from your connected accounts.
+
+
+
+## Experience Settings
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find the Theme section
+ 3. Select Light, Dark, or System
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Date Format
+ 3. Select your preferred format
+ 4. Changes apply immediately
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Time Zone
+ 3. Select your local time zone
+ 4. All timestamps will adjust
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Language
+ 3. Select from available languages
+ 4. The interface updates to your selection
+
+
+
+## Account Settings
+
+
+
+ 1. Go to **Settings → Accounts**
+ 2. Click **Add account**
+ 3. Choose Google or Microsoft
+ 4. Authorize access
+ 5. Configure sync settings
+
+
+
+ Yes, you can connect multiple email accounts. Go to **Settings → Accounts** and add additional accounts as needed.
+
+
+
+ 1. Go to **Settings → Accounts**
+ 2. Find the account to remove
+ 3. Click **Disconnect**
+ 4. Confirm the action
+
+
+
+## Domains
+
+
+
+ Yes! Go to **Settings → Domains** and click **Customize Domain**. You have two options:
+
+ * **Subdomain**: Use a Twenty subdomain like `yourcompany.twenty.com`
+ * **Custom domain**: Use your own domain like `crm.yourcompany.com` (requires DNS configuration)
+
+ A subdomain is quick to set up, while a custom domain provides a fully branded experience for your team.
+
+
+
+ You can configure approved access domains so team members with company email addresses can automatically join your workspace. Go to **Settings → Domains** and add your company domain (e.g., `yourcompany.com`).
+
+
+
+## Lab Features
+
+
+
+ Lab features are experimental capabilities being tested before general release. They may change or be removed without notice.
+
+
+
+ Lab features are functional but may have bugs or unexpected behavior. Use them cautiously in production environments.
+
+
+
+ 1. Go to **Settings → Releases → Lab**
+ 2. Find the feature you want
+ 3. Toggle it on
+ 4. The feature becomes available immediately
+
+
diff --git a/packages/twenty-docs/l/ko/user-guide/settings/overview.mdx b/packages/twenty-docs/l/ko/user-guide/settings/overview.mdx
new file mode 100644
index 0000000000..245a1d1314
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/settings/overview.mdx
@@ -0,0 +1,67 @@
+---
+title: Settings
+description: Set up your Twenty workspace with essential configurations.
+image: /images/user-guide/setup/settings.png
+---
+
+
+
+
+
+## Initial Setup
+
+When you first create your workspace, there are several key settings to configure.
+
+### Workspace Name and Logo
+
+1. Go to **Settings → General**
+2. Update your workspace name
+3. Upload your company logo
+4. Save your changes
+
+### Time Zone and Date Format
+
+1. Go to **Settings → Experience**
+2. Select your time zone
+3. Choose your preferred date format
+4. Save your changes
+
+## Essential Configurations
+
+### Connect Email and Calendar
+
+Set up email and calendar sync:
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Connect your Google or Microsoft account
+4. Configure sync settings
+
+→ [Complete email & calendar setup guide](/l/ko/user-guide/calendar-emails/overview)
+
+### Invite Your Team
+
+Add team members to your workspace:
+
+1. Go to **Settings → Members**
+2. Click **+ Invite**
+3. Enter email addresses
+4. Assign appropriate roles
+
+
+ Before inviting your team, check the default role under **Settings → Roles**. New members are automatically assigned this role when they join.
+
+
+## Workspace Settings Checklist
+
+* Workspace name and logo configured
+* Time zone and date format set
+* Email and calendar connected
+* Team members invited
+* Roles and permissions configured
+
+## Next Steps
+
+* [Workspace settings](/l/ko/user-guide/settings/capabilities/workspace-settings)
+* [Profile settings](/l/ko/user-guide/settings/capabilities/profile-settings)
+* [Experience settings](/l/ko/user-guide/settings/capabilities/experience-settings)
diff --git a/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/calendar-view.mdx b/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/calendar-view.mdx
new file mode 100644
index 0000000000..16d8d20deb
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/calendar-view.mdx
@@ -0,0 +1,46 @@
+---
+title: Calendar View
+description: Display records with date fields on a calendar.
+---
+
+## About Calendar View
+
+Calendar view displays your records on a calendar based on a date field. Each record appears as an event on the corresponding date.
+
+
+
+## Creating a Calendar View
+
+1. Navigate to an object with date fields
+2. Click the view dropdown → **+ Add view**
+3. Name your view and click **Create**
+4. Open the **Options** on the right
+5. Select **Calendar** as the layout
+6. Choose the **date field** to use for positioning records
+7. Click **Update view**
+
+## Configuring the Calendar
+
+### Choose the Date Field
+
+Under **Options**, select which date field determines where records appear on the calendar.
+
+### Display Fields
+
+Configure which fields show on each calendar event:
+
+1. Click **Options → Fields**
+2. Toggle fields on/off
+3. Drag to reorder
+
+## Use Cases
+
+* **Meetings and calls**: View upcoming appointments
+* **Deadlines**: Track due dates and close dates
+* **Events**: Plan and visualize scheduled activities
+* **Follow-ups**: See when tasks are due
+
+## Related
+
+* [Views Overview](/l/ko/user-guide/views-pipelines/overview) — creating and managing views
+* [Filters and Sorting](/l/ko/user-guide/views-pipelines/capabilities/filters-and-sorting) — filtering calendar data
diff --git a/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/fields-and-columns.mdx b/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/fields-and-columns.mdx
new file mode 100644
index 0000000000..0c277f270f
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/fields-and-columns.mdx
@@ -0,0 +1,52 @@
+---
+title: Fields & Columns
+description: Choose which fields to display and how to organize them.
+---
+
+## Selecting Fields to Display
+
+Each view can show a different set of fields. Customize what's visible to focus on the information that matters.
+
+### Show or Hide Fields
+
+1. Click **Options** in the top right
+2. Click **Fields**
+3. Click the **eye icon** next to each field to show/hide it
+
+### Reorder Fields
+
+Change the order fields appear in your view:
+
+1. Click **Options → Fields**
+2. Drag fields up or down
+3. Changes save automatically
+
+## Field Display by View Type
+
+### Table Views
+
+* Fields appear as columns
+* Resize columns by dragging borders
+
+### Kanban Views
+
+* Fields appear on cards
+* Reorder via Options → Fields
+* Use Compact view to hide all fields
+
+### Calendar Views
+
+* Selected fields show on calendar events
+* Configure via Options → Fields
+
+## Best Practices
+
+* **Show only what's needed** — too many fields clutters the view
+* **Put important fields first** — most-used columns on the left
+* **Create multiple views** — different field sets for different purposes
+* **Use field visibility per view** — same object, different focus
+
+## Related
+
+* [Table Views](/l/ko/user-guide/views-pipelines/capabilities/table-views) — list view features
+* [Kanban Views](/l/ko/user-guide/views-pipelines/capabilities/kanban-views) — card-based views
diff --git a/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx b/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx
new file mode 100644
index 0000000000..4ced3254e5
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx
@@ -0,0 +1,78 @@
+---
+title: Filters & Sorting
+description: Filter and sort records to find exactly what you need.
+---
+
+## Filtering Data
+
+Filters help you focus on specific records by showing only those that match your criteria.
+
+### Adding a Filter
+
+1. Click the **Filter** button in the toolbar
+2. Select the field to filter by
+3. Choose the operator (equals, contains, etc.)
+4. Enter the filter value
+5. Click **Apply**
+
+### Filter Operators
+
+| Field Type | Available Operators |
+| ---------- | -------------------------------------------------- |
+| Text | Equals, Contains, Starts with, Ends with, Is empty |
+| Number | Equals, Greater than, Less than, Between, Is empty |
+| Date | Equals, Before, After, Between, Is empty |
+| Select | Equals, Is any of, Is empty |
+| Checkbox | Is true, Is false |
+| Relation | Equals, Is empty |
+
+### Multiple Filters
+
+Combine multiple filters to narrow down results:
+
+* All filters are applied with AND logic
+* Each additional filter further restricts results
+
+### Removing Filters
+
+* Click the **X** on individual filter chips
+* Click **Clear all** to remove all filters
+
+## Sorting Data
+
+Sorting determines the order records appear.
+
+### Adding a Sort
+
+1. Click the **Sort** button in the toolbar
+2. Select the field to sort by
+3. Choose ascending (A-Z, 0-9) or descending (Z-A, 9-0)
+4. Click **Apply**
+
+### Multiple Sorts
+
+Add multiple sort levels:
+
+* First sort is primary
+* Subsequent sorts apply within groups of equal values
+
+### Quick Column Sorting
+
+Click any column header to sort:
+
+* First click: Ascending
+* Second click: Descending
+* Third click: Remove sort
+
+## Saving Filter and Sort Settings
+
+Filters and sorts are saved with the view:
+
+1. Configure your filters and sorts
+2. Click **Save** to update the current view
+3. Or click **Save as new view** to create a variant
+
+## Related
+
+* [Table Views](/l/ko/user-guide/views-pipelines/capabilities/table-views) — group by feature
+* [Views Overview](/l/ko/user-guide/views-pipelines/overview) — building and managing views
diff --git a/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/kanban-views.mdx b/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/kanban-views.mdx
new file mode 100644
index 0000000000..fa616d2f3d
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/kanban-views.mdx
@@ -0,0 +1,99 @@
+---
+title: Kanban Board Views
+description: Learn how to use Kanban views to visualize and manage your workflows.
+image: /images/user-guide/kanban-views/kanban.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## About Kanban Views
+
+Kanban views visually map out process flows, where each column stands for a distinct stage and each card represents a record.
+
+## Move Cards between Stages
+
+You can move each card between stages as it goes through your workflow by dragging and dropping. To proceed, hold your click on a card and move it to the next stage.
+
+
+
+## Add and Delete Stages
+
+You can tailor your workflow to suit your needs using stages, which represent a value in a Select Field:
+
+### Add Stages
+
+To add a stage, access the Select field settings by navigating to Settings > Data Model, selecting your object, and then the field your Kanban board depends on.
+
+
+
+### Remove Stages
+
+To remove a stage, hover the stage name or the `⋮` icon, click `Edit from settings` in the Select field settings, and then click **Delete** next to the relevant stage.
+
+## Display Fields
+
+You can configure your Kanban board to display some fields and hide others. To hide a field, click on **Options** on the top right, then on **Fields** to bring up the list of options. Look for the field needed in the Hidden Fields section and click on the eye button to display the field.
+
+You can also rearrange the order of fields by holding down the field name and dragging it to where you want it.
+
+
+
+## Compact View
+
+You can hide all the fields and get an overview of all records at a glance. To enable:
+
+1. Click **Options** on the top right
+2. Turn on the toggle for **Compact view**
+
+
+
+## Column Aggregations
+
+Each column in a Kanban view can display aggregated values at the top, helping you understand your data at a glance.
+
+### Available Aggregations
+
+| Aggregation | Description |
+| ----------- | --------------------------------------------- |
+| **Count** | Number of records in the column |
+| **Sum** | Total of a numeric field (e.g., deal amounts) |
+| **Average** | Average value of a numeric field |
+| **Min** | Lowest value |
+| **Max** | Highest value |
+
+### Configuring Aggregations
+
+1. Click on the number displayed next to the Stage value, at the top of a column
+2. Select the aggregation type
+3. Choose the field to aggregate
+
+**Example:** Show total deal value per stage by aggregating the Amount field with Sum.
+
+## When to Use Kanban Views
+
+Kanban views are ideal for:
+
+* **Sales pipelines**: Track deals through stages from lead to close
+* **Project management**: Monitor tasks through workflow states
+* **Recruitment**: Track candidates through hiring stages
+* **Any staged process**: Visualize any workflow with defined stages
+
+## Best Practices
+
+### Organize Your Stages
+
+* **Limit stages**: 5-7 stages is ideal for visibility
+* **Clear naming**: Use descriptive stage names
+* **Logical order**: Arrange stages in process order
+
+### Optimize Card Display
+
+* **Show key fields**: Display only the most important information
+* **Use compact view**: For high-level overviews
+* **Color coding**: Use stage colors to quickly identify status
+
+### Maintain Data Quality
+
+* **Update regularly**: Keep cards moving through stages
+* **Archive completed**: Move closed items out of active view
+* **Review stale cards**: Follow up on cards stuck in stages
diff --git a/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/table-views.mdx b/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/table-views.mdx
new file mode 100644
index 0000000000..e9f1b6d987
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/table-views.mdx
@@ -0,0 +1,64 @@
+---
+title: Table Views
+description: Display your data in a spreadsheet-like list format.
+---
+
+## About Table Views
+
+Table views display records in rows with customizable columns—like a spreadsheet. This is the default view type for most objects.
+
+
+
+## Features
+
+### Column Configuration
+
+* Show or hide columns (fields)
+* Resize column widths
+* Reorder columns by dragging
+
+### Group By a Select Field
+
+Organize records into collapsible groups based on a field of select type.
+
+
+
+1. Click **Options**
+2. Select **Group**
+3. Choose a Select field
+4. Configure group order under **Options → Group → Sort**:
+ * **Alphabetical** or **Reverse alphabetical**
+ * **Manual order**: Drag groups under "Visible groups" to reorder
+ * Click the **eye icon** next to a group to hide it
+
+**Use cases:**
+
+* Group Company by Type
+* Group Opportunities by Stage
+* Group Tasks by Status
+
+
+ **For best performance, limit to 10-15 visible groups per view.** If you need more groups, consider using a Dashboard instead.
+
+
+### Column Widths
+
+Resize columns to show more or less content:
+
+1. Hover between two column headers
+2. Click and drag the column border
+3. Release to set the new width
+
+## When to Use Table Views
+
+Table views work best for:
+
+* **Browsing large datasets** — scan many records quickly
+* **Data entry** — edit multiple records efficiently
+* **Detailed analysis** — see many fields at once
+* **Sorting and filtering** — find specific records
+
+## Related
+
+* [Fields and Columns](/l/ko/user-guide/views-pipelines/capabilities/fields-and-columns) — configuring which fields to display
+* [Filters and Sorting](/l/ko/user-guide/views-pipelines/capabilities/filters-and-sorting) — narrowing down records
diff --git a/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/view-settings.mdx b/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/view-settings.mdx
new file mode 100644
index 0000000000..552f4ef806
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/views-pipelines/capabilities/view-settings.mdx
@@ -0,0 +1,74 @@
+---
+title: View Settings
+description: Manage view visibility, naming, icons, and organization.
+---
+
+## View Visibility
+
+Control who can see your custom views.
+
+### Visibility Options
+
+| Setting | Who Can See |
+| ------------- | --------------------- |
+| **Workspace** | All workspace members |
+| **Unlisted** | Only you |
+
+### Changing Visibility
+
+1. Open the view
+2. Click **Options → Visibility**
+3. Select **Workspace** or **Unlisted**
+
+
+ The default "All [Object Name]" views cannot have their visibility changed.
+
+
+## Rename a View
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Edit**
+4. Enter the new name
+
+## Change View Icon
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Edit**
+4. Click the icon to change it
+
+## Reorder Views
+
+Change the order views appear in the dropdown:
+
+1. Open the view dropdown
+2. Drag views by their handle
+3. Drop in the desired position
+4. Order saves automatically
+
+## Favorites
+
+Pin frequently used views for quick access:
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to a view
+3. Select **Add to favorites**
+
+Favorited views appear in a dedicated section for easy access.
+
+## Delete a View
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Delete**
+4. Confirm deletion
+
+
+ Deleted views cannot be recovered.
+
+
+## Related
+
+* [Views Overview](/l/ko/user-guide/views-pipelines/overview) — creating views
+* [How to Restrict Access](/l/ko/user-guide/views-pipelines/how-tos/restrict-access-to-your-view) — step-by-step guide
diff --git a/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx b/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
new file mode 100644
index 0000000000..818b23ede2
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
@@ -0,0 +1,61 @@
+---
+title: Create a Calendar View for Tasks Due
+description: Visualize your tasks and deadlines on a calendar.
+---
+
+
+
+## Prerequisites
+
+Your Tasks object needs a **Due Date** field (Date or Date & Time type).
+
+## Steps
+
+1. Navigate to **Tasks**
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Tasks Calendar")
+4. Click **Create**
+5. Click **Options** and select **Calendar** as the layout
+6. Choose **Due Date** as the date field
+7. Click **Save**
+
+## Configure Your Calendar
+
+### Display Fields on Events
+
+1. Click **Options → Fields**
+2. Click the **eye icon** to show/hide fields
+3. Drag to reorder
+
+Recommended fields to display:
+
+* **Title** — task name
+* **Assignee** — who's responsible
+* **Status** — current progress
+
+### Filter Your Calendar
+
+Create focused views:
+
+* **My Tasks**: Filter by Assignee = Me
+* **This Week**: Filter by Due Date = This week
+* **Overdue**: Filter by Due Date < Today, Status ≠ Done
+
+## Other Calendar Use Cases
+
+| Object | Date Field | Purpose |
+| ------------- | ---------- | ------------------------- |
+| Opportunities | Close Date | Track expected closes |
+| Custom Events | Event Date | Plan activities |
+| Projects | Deadline | Monitor project timelines |
+
+## Tips
+
+* **Review weekly**: Start each week by checking your calendar view
+* **Combine with table view**: Use calendar for overview, table for details
+* **Set visibility**: Keep personal task calendars as Unlisted
+
+## Related
+
+* [Calendar View](/l/ko/user-guide/views-pipelines/capabilities/calendar-view) — all calendar features
+* [Filters and Sorting](/l/ko/user-guide/views-pipelines/capabilities/filters-and-sorting) — filter your calendar
diff --git a/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx b/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
new file mode 100644
index 0000000000..664c478dde
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
@@ -0,0 +1,80 @@
+---
+title: Create a Kanban View for Projects
+description: Track projects through stages using a visual board.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Use a Kanban view to visualize your projects (or any object with stages) as cards moving through columns.
+
+
+
+## Prerequisites
+
+Your object needs a **Select field** to use as columns (e.g., Status, Stage, Phase).
+
+If you don't have one:
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Add a Select field with your stage options
+
+## Steps
+
+1. Navigate to your object (e.g., Projects, Tasks)
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Project Board")
+4. Click **Create**
+5. Click **Options** and select **Kanban** as the layout
+6. The view uses your Select field for columns automatically
+7. Click **Save**
+
+## Configure Your Board
+
+### Show Key Fields on Cards
+
+1. Click **Options → Fields**
+2. Find fields in the "Hidden Fields" section
+3. Click the **eye icon** to display them on cards
+4. Drag to reorder
+
+
+
+### Enable Compact View
+
+For a high-level overview:
+
+1. Click **Options**
+2. Turn on **Compact view**
+
+Cards show only the record name.
+
+
+
+### Add Aggregations
+
+Show counts or totals at the top of each column:
+
+1. Click the number next to a column name
+2. Select an aggregation (Count, Sum, etc.)
+3. Choose a field if needed
+
+## Moving Cards
+
+Drag and drop cards between columns to update their status.
+
+
+
+## Example: Task Board
+
+| Column (Status) | Cards |
+| --------------- | ----------------- |
+| **To Do** | New tasks |
+| **In Progress** | Active work |
+| **Review** | Awaiting approval |
+| **Done** | Completed |
+
+## Related
+
+* [Kanban Views](/l/ko/user-guide/views-pipelines/capabilities/kanban-views) — aggregations, compact view, stages
+* [How to Set Up a Sales Pipeline](/l/ko/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline) — Kanban for Opportunities
diff --git a/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx b/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx
new file mode 100644
index 0000000000..4172dc7fea
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx
@@ -0,0 +1,51 @@
+---
+title: Create a Table View with Grouping
+description: Organize your records into collapsible groups by field value.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Group your table view by a Select field to organize records into collapsible sections.
+
+
+
+## Steps
+
+1. Navigate to the object (People, Companies, etc.)
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Companies by Type")
+4. Click **Create**
+5. Click **Options → Group**
+6. Choose a Select field to group by
+7. Click **Save**
+
+## Configure Group Order
+
+Under **Options → Group → Sort**, choose how groups are ordered:
+
+| Option | Description |
+| ------------------------ | --------------------------------------------- |
+| **Alphabetical** | A to Z |
+| **Reverse alphabetical** | Z to A |
+| **Manual order** | Drag groups to reorder under "Visible groups" |
+
+Click the **eye icon** next to a group to hide it from the view.
+
+
+ **For best performance, limit to 10-15 visible groups.** If you need more, consider using a Dashboard instead.
+
+
+## Example: Companies by Industry
+
+1. Go to **Companies**
+2. Create a new view named "By Industry"
+3. Click **Options → Group**
+4. Select the **Industry** field
+5. Save
+
+Now your companies are organized by industry, making it easy to focus on one segment at a time.
+
+## Related
+
+* [Table Views](/l/ko/user-guide/views-pipelines/capabilities/table-views) — all table view features
+* [Filters and Sorting](/l/ko/user-guide/views-pipelines/capabilities/filters-and-sorting) — combine grouping with filters
diff --git a/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx b/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
new file mode 100644
index 0000000000..1ad0930387
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
@@ -0,0 +1,32 @@
+---
+title: Restrict Access to Your View
+description: Control who can see your custom views.
+---
+
+Each view (except the default "All [Object Name]" views) has its own visibility setting.
+
+## Steps
+
+1. Open the view you want to restrict
+2. Click **Options** in the top right
+3. Click **Visibility**
+4. Select **Unlisted**
+
+Your view is now visible only to you.
+
+## Visibility Options
+
+| Setting | Who Can See |
+| ------------- | --------------------- |
+| **Workspace** | All workspace members |
+| **Unlisted** | Only you |
+
+## Notes
+
+* The default "All [Object Name]" views cannot be made unlisted
+* Unlisted views don't appear in other users' view dropdowns
+* You can change visibility back to Workspace at any time
+
+## Related
+
+* [View Settings](/l/ko/user-guide/views-pipelines/capabilities/view-settings) — all view configuration options
diff --git a/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx b/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx
new file mode 100644
index 0000000000..9b2c7072f8
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx
@@ -0,0 +1,120 @@
+---
+title: Set Up a Sales Pipeline
+description: Configure your sales pipeline to track opportunities through stages.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+A sales pipeline in Twenty is a Kanban view of your Opportunities object, where each column represents a stage in your sales process.
+
+## Step 1: Configure Your Stages
+
+Stages are defined in the Opportunities object's **Stage** field.
+
+1. Go to **Settings → Data Model**
+2. Select **Opportunities**
+3. Find and click the **Stage** field
+4. Add, remove, or rename stages to match your process
+
+
+
+### Recommended Stages
+
+| Stage | Purpose |
+| --------------- | ----------------------------------- |
+| **New** | Fresh opportunities just identified |
+| **Qualified** | Confirmed as a good fit |
+| **Meeting** | Engaged in discussions |
+| **Proposal** | Proposal sent |
+| **Negotiation** | Working on terms |
+| **Closed Won** | Deal successful |
+| **Closed Lost** | Deal unsuccessful |
+
+
+ **5-7 stages is optimal.** Too many stages makes the pipeline hard to scan; too few loses visibility into deal progress.
+
+
+## Step 2: Create a Pipeline View
+
+1. Go to **Opportunities**
+2. Click the view dropdown → **+ Add view**
+3. Name it "Sales Pipeline"
+4. Click **Create**
+5. Open **Options** and select **Kanban** as the layout
+
+The view automatically uses the Stage field for columns.
+
+## Step 3: Configure Your View
+
+### Show Key Fields
+
+1. Click **Options → Fields**
+2. Look for fields in the "Hidden Fields" section
+3. Click the **eye icon** to display: Company, Amount, Close Date, Owner
+
+### Enable Aggregations
+
+Show totals at the top of each column:
+
+1. Click the number displayed next to a Stage name at the top of a column
+2. Select the aggregation type (Count, Sum, Average, etc.)
+3. Choose the field to aggregate (e.g., Amount)
+
+**Example:** Show total deal value per stage by aggregating Amount with Sum.
+
+### Use Compact View (Optional)
+
+For a high-level overview with minimal card content:
+
+1. Click **Options**
+2. Turn on the toggle for **Compact view**
+
+## Step 4: Create Personal and Team Views
+
+### "My Pipeline"
+
+* **Filter**: Owner = Me
+* **Visibility**: Unlisted (personal view)
+
+### "Team Pipeline"
+
+* **Filter**: None (show all)
+* **Visibility**: Workspace (shared view)
+
+### "Closing This Month"
+
+* **Type**: Table
+* **Filter**: Close Date = This month, Stage ≠ Closed Won, Stage ≠ Closed Lost
+* **Sort**: Close Date ascending
+
+## Working with Opportunities
+
+### Creating Opportunities
+
+* Click **+ New** in the Opportunities view
+* Or click **+** in a specific stage column
+
+### Moving Through Stages
+
+Drag and drop opportunity cards between columns to update their stage.
+
+
+
+## Best Practices
+
+### Pipeline Hygiene
+
+* Update deals daily as they progress
+* Move or close stale deals promptly
+* Keep close dates realistic
+
+### Stage Discipline
+
+* Define clear criteria for each stage
+* Move deals promptly when criteria are met
+* Don't let deals sit in stages too long
+
+## Related
+
+* [Kanban Views](/l/ko/user-guide/views-pipelines/capabilities/kanban-views) — aggregations and compact view
+* [Filters and Sorting](/l/ko/user-guide/views-pipelines/capabilities/filters-and-sorting) — creating filtered views
diff --git a/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx b/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
new file mode 100644
index 0000000000..fdfeddb5f8
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
@@ -0,0 +1,149 @@
+---
+title: Show Expected Amount in Your Pipeline
+description: Calculate and display weighted deal values based on stage probability.
+---
+
+The Expected Amount is a calculated value: **Amount × Probability**. This helps you forecast revenue by weighting deals based on how likely they are to close.
+
+
+ This is an example of creating [Formula Fields](/l/ko/user-guide/workflows/how-tos/crm-automations/formula-fields) using workflows.
+
+
+This guide walks you through setting up the custom fields and workflows needed to calculate and display expected amounts in your pipeline.
+
+## Step 1: Create Custom Fields
+
+You need two custom fields on the Opportunities object.
+
+### Create the Probability Field
+
+1. Go to **Settings → Data Model → Opportunities**
+2. Click **+ Add Field**
+3. Configure:
+ * **Name**: Probability
+ * **Type**: Number
+ * **Description**: Stage-based probability (0-100%)
+4. Click **Save**
+
+### Create the Expected Amount Field
+
+1. Click **+ Add Field**
+2. Configure:
+ * **Name**: Expected Amount
+ * **Type**: Currency
+ * **Description**: Calculated: Amount × Probability
+3. Click **Save**
+
+### Optional: Make Fields Read-Only for Users
+
+If you don't want users manually editing these calculated fields:
+
+1. Go to **Settings → Roles**
+2. Select the role to configure
+3. Find the Opportunities object
+4. Set **Probability** and **Expected Amount** fields to read-only
+
+This ensures only the workflows can update these values.
+
+## Step 2: Create Workflow #1 — Update Probability on Stage Change
+
+This workflow automatically sets the Probability when an opportunity moves to a new stage.
+
+### Create the Workflow
+
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Update Probability on Stage Change"
+
+### Configure the Trigger
+
+1. Add a **Record Created or Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Stage** field is updated
+
+### Add Branches for Each Stage
+
+Create a branch for each stage with its probability:
+
+| Stage | Probability |
+| ----------- | ----------- |
+| New | 10% |
+| Qualified | 25% |
+| Meeting | 40% |
+| Proposal | 60% |
+| Negotiation | 80% |
+| Closed Won | 100% |
+| Closed Lost | 0% |
+
+
+ To create a new branch, right click on the workflow canvas and click **New action**. Then, link this action to the previous node by dragging the arrow from the previous node to this new action.
+
+
+For each stage:
+
+1. Add a **Filter** node: Stage = [stage name]
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Probability
+ * Value: [probability for that stage]
+
+### Calculate Expected Amount
+
+After the branches rejoin:
+
+1. Add a **Filter** node: Amount is not empty
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Expected Amount
+ * Value: Amount × Probability
+
+## Step 3: Create Workflow #2 — Recalculate on Amount Change
+
+This workflow updates the Expected Amount when the deal Amount changes.
+
+### Create the Workflow
+
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Recalculate Expected Amount on Amount Change"
+
+### Configure the Trigger
+
+1. Add a **Record Created or Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Amount** field is updated
+
+### Add the Logic
+
+1. Add a **Filter** node: Amount is not empty
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Expected Amount
+ * Value: Amount × Probability
+
+## Step 4: Display in Your Pipeline
+
+Now show the Expected Amount totals in your Kanban view:
+
+1. Open your **Sales Pipeline** Kanban view
+2. Click the **number** next to any Stage name at the top of a column
+3. Select **Sum**
+4. Choose **Expected Amount**
+
+Each column now shows the total weighted pipeline value for that stage.
+
+## Summary
+
+| Component | Purpose |
+| ------------------------- | ------------------------------------------------------------------------- |
+| **Probability field** | Stores the stage-based win probability |
+| **Expected Amount field** | Stores Amount × Probability |
+| **Workflow #1** | Updates Probability when Stage changes, then recalculates Expected Amount |
+| **Workflow #2** | Recalculates Expected Amount when Amount changes |
+| **Aggregation** | Displays Sum of Expected Amount per stage |
+
+## Related
+
+* [Formula Fields](/l/ko/user-guide/workflows/how-tos/crm-automations/formula-fields) — create calculated fields using workflows
+* [Kanban Views](/l/ko/user-guide/views-pipelines/capabilities/kanban-views) — column aggregations
+* [How to Create Custom Fields](/l/ko/user-guide/data-model/how-tos/create-custom-fields) — field configuration
diff --git a/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx b/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
new file mode 100644
index 0000000000..4e9c62dd51
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
@@ -0,0 +1,231 @@
+---
+title: Track How Long Opportunities Stay in Each Stage
+description: Monitor deal velocity by tracking when opportunities enter each stage.
+---
+
+
+ This is an example of creating [Formula Fields](/l/ko/user-guide/workflows/how-tos/crm-automations/formula-fields) using workflows — specifically date calculations.
+
+
+Tracking when opportunities enter each stage helps you identify bottlenecks and measure deal velocity.
+
+This guide walks you through setting up custom fields and a workflow to automatically record when an opportunity moves to each stage, and calculate how many days it spent in the previous stage.
+
+## Step 1: Create Custom Fields
+
+You need two types of fields for each stage:
+
+* **Date & Time fields**: Record when the opportunity entered each stage
+* **Number fields**: Store how many days the opportunity spent in each stage
+
+### Create the "Last Entered" Fields
+
+1. Go to **Settings → Data Model → Opportunities**
+2. For each stage, click **+ Add Field** and configure:
+ * **Name**: Last Entered [Stage Name] (e.g., "Last Entered New", "Last Entered Qualified")
+ * **Type**: Date & Time
+ * **Description**: Timestamp when opportunity entered this stage
+3. Click **Save**
+
+Create these fields:
+
+* Last Entered New
+* Last Entered Qualified
+* Last Entered Meeting
+* Last Entered Proposal
+* Last Entered Negotiation
+* Last Entered Closed Won
+* Last Entered Closed Lost
+
+### Create the "Days in Stage" Fields
+
+1. For each stage, click **+ Add Field** and configure:
+ * **Name**: Days in [Stage Name] (e.g., "Days in New", "Days in Qualified")
+ * **Type**: Number
+ * **Description**: Number of days spent in this stage
+2. Click **Save**
+
+Create these fields:
+
+* Days in New
+* Days in Qualified
+* Days in Meeting
+* Days in Proposal
+* Days in Negotiation
+
+
+ You don't need "Days in" fields for Closed Won and Closed Lost since those are final stages.
+
+
+### Optional: Make Fields Read-Only
+
+If you don't want users manually editing these calculated fields:
+
+1. Go to **Settings → Roles**
+2. Select the role to configure
+3. Find the Opportunities object
+4. Set the "Last Entered" and "Days in" fields to read-only
+
+## Step 2: Create the Workflow
+
+This single workflow handles both tasks:
+
+* Records the timestamp when entering a new stage
+* Calculates days spent in the previous stage
+
+### Create the Workflow
+
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Track Stage Time"
+
+### Configure the Trigger
+
+1. Add a **Record Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Stage** field is updated
+
+### Add Branches for Each Stage
+
+
+ To create a new branch, right click on the workflow canvas and click **New action**. Then, link this action to the previous node by dragging the arrow from the previous node to this new action.
+
+
+---
+
+**Branch 1: Stage = New (first stage)**
+
+Since this is the first stage, we only record the entry timestamp—no previous stage to calculate.
+
+1. Add a **Filter** node: Stage = New
+2. Add a **Code** action:
+
+```javascript
+export const main = async (): Promise => {
+ return { now: new Date().toISOString() };
+};
+```
+
+3. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Last Entered New
+ * Value: `now` from Code node
+
+---
+
+**Branch 2: Stage = Qualified**
+
+When moving to Qualified, record entry time AND calculate days spent in New.
+
+1. Add a **Filter** node: Stage = Qualified
+2. Add a **Code** action:
+
+```javascript
+export const main = async (params: {
+ lastEnteredPreviousStage: Date;
+}): Promise => {
+ const { lastEnteredPreviousStage } = params;
+
+ const now = new Date();
+ const entryDate = new Date(lastEnteredPreviousStage);
+ const diffTime = Math.abs(now.getTime() - entryDate.getTime());
+ const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return {
+ now: now.toISOString(),
+ daysInPreviousStage: daysInPreviousStage
+ };
+};
+```
+
+3. Configure the Code node input: map `lastEnteredPreviousStage` to the **Last Entered New** field
+4. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Fields to update:
+ * Last Entered Qualified = `now`
+ * Days in New = `daysInPreviousStage`
+
+---
+
+**Branch 3: Stage = Meeting**
+
+When moving to Meeting, record entry time AND calculate days spent in Qualified.
+
+1. Add a **Filter** node: Stage = Meeting
+2. Add a **Code** action:
+
+```javascript
+export const main = async (params: {
+ lastEnteredPreviousStage: Date;
+}): Promise => {
+ const { lastEnteredPreviousStage } = params;
+
+ const now = new Date();
+ const entryDate = new Date(lastEnteredPreviousStage);
+ const diffTime = Math.abs(now.getTime() - entryDate.getTime());
+ const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return {
+ now: now.toISOString(),
+ daysInPreviousStage: daysInPreviousStage
+ };
+};
+```
+
+3. Configure the Code node input: map `lastEnteredPreviousStage` to the **Last Entered Qualified** field
+4. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Fields to update:
+ * Last Entered Meeting = `now`
+ * Days in Qualified = `daysInPreviousStage`
+
+---
+
+**Continue for remaining stages:**
+
+| Stage | Records | Calculates |
+| ----------- | ------------------------ | ------------------- |
+| Proposal | Last Entered Proposal | Days in Meeting |
+| Negotiation | Last Entered Negotiation | Days in Proposal |
+| Closed Won | Last Entered Closed Won | Days in Negotiation |
+| Closed Lost | Last Entered Closed Lost | Days in Negotiation |
+
+The branches do not need to rejoin—each runs independently when its stage condition is met.
+
+## Step 3: Analyze Time in Stage
+
+With timestamps and day counts recorded, you can now analyze deal velocity.
+
+### Create a "Slow Deals" View
+
+1. Create a Table view of Opportunities
+2. Add columns: Name, Stage, Days in [previous stage], Amount
+3. Sort by "Days in" field (descending)
+4. Filter by Stage to focus on one stage at a time
+
+Deals at the top spent the most time in the previous stage.
+
+### Use Aggregations
+
+In your pipeline Kanban view:
+
+1. Click the number next to a Stage name
+2. Select **Average**
+3. Choose a "Days in" field
+
+This shows the average time deals spend in each stage.
+
+## Summary
+
+| Component | Purpose |
+| ------------------------ | ------------------------------------------------- |
+| **Last Entered fields** | Store when opportunity entered each stage |
+| **Days in fields** | Store how many days spent in each stage |
+| **Workflow** | Records timestamp AND calculates days in one pass |
+| **Views & Aggregations** | Analyze deal velocity and identify bottlenecks |
+
+## Related
+
+* [Workflows](/l/ko/user-guide/workflows/overview) — automation basics
+* [How to Create Custom Fields](/l/ko/user-guide/data-model/how-tos/create-custom-fields) — field configuration
+* [Kanban Views](/l/ko/user-guide/views-pipelines/capabilities/kanban-views) — aggregations
diff --git a/packages/twenty-docs/l/ko/user-guide/views-pipelines/overview.mdx b/packages/twenty-docs/l/ko/user-guide/views-pipelines/overview.mdx
new file mode 100644
index 0000000000..fd93eab89c
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/views-pipelines/overview.mdx
@@ -0,0 +1,137 @@
+---
+title: Views & Pipelines
+description: Learn how to create and manage views in Twenty.
+image: /images/user-guide/table-views/table.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+
+
+## Understanding Views
+
+Views are saved configurations that determine how your data is displayed. Each view can have its own:
+
+* **Layout**: Table, Kanban, or Calendar
+* **Filters**: Which records to show
+* **Sorting**: How records are ordered
+* **Fields**: Which columns are visible
+
+## View Types
+
+### Table View
+
+The default spreadsheet-like view showing records in rows with customizable columns.
+
+### Kanban View
+
+A visual board view where records appear as cards organized by stages. Ideal for:
+
+* Sales pipelines
+* Project tracking
+* Any workflow with defined stages
+
+### Calendar View
+
+Display records with date fields on a calendar. Perfect for:
+
+* Meetings and events
+* Deadlines and due dates
+* Time-based planning
+
+## Creating a View
+
+There are two ways to create a new view.
+
+### Use the View Dropdown Menu
+
+1. Navigate to any object (People, Companies, etc.)
+2. Click the view name at the top left (shows current view with a dropdown arrow)
+3. Click **+ Add view**
+4. Name your view and click **Create**
+5. Choose a layout (Table, Kanban, or Calendar) under **Options**
+6. Add filters and sorting as needed
+7. Select which fields to display and reorder them
+8. Click **Save**
+
+
+
+### Start by editting an existing view
+
+1. Navigate to any object (People, Companies, etc.)
+2. Choose a layout (Table, Kanban, or Calendar) under **Options** or Add filters and sorting as needed
+3. Click on **Save as new view**
+4. Name your view and click **Create**
+5. Keep editing your new view
+6. Click on **Update view** to save your additional configurations
+
+
+
+## Managing Views
+
+### Edit a View
+
+1. Select the view from the dropdown
+2. Make your changes (filters, sorting, columns)
+3. Click **Save** to update the view
+
+### Rename a View or Change Its Icon
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view name
+3. Select **Edit**
+4. Change the name or icon
+5. Click **Save**
+
+### Reorder Views
+
+1. Open the view dropdown
+2. Click and drag a view by its handle
+3. Drop it in the desired position
+4. The new order is saved automatically
+
+### Add to Favorites
+
+Pin frequently used views for quick access:
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to a view
+3. Select **Add to favorites**
+4. The view appears in your favorites section
+
+### Delete a View
+
+1. Select the view to delete
+2. Click the view dropdown
+3. Click the **⋮** menu next to the view
+4. Select **Delete**
+5. Confirm deletion
+
+
+ Deleted views cannot be recovered. Make sure you want to remove it before confirming.
+
+
+## View Visibility
+
+Each view (except the default "All [Object Name]" views) has its own visibility setting.
+
+To change visibility:
+
+1. Open the view
+2. Click **Options → Visibility**
+3. Choose:
+ * **Workspace**: Visible to all workspace members
+ * **Unlisted**: Visible only to you
+
+
+ The default "All [Object Name]" views cannot have their visibility changed.
+
+
+## Next Steps
+
+* [Table Views](/l/ko/user-guide/views-pipelines/capabilities/table-views)
+* [Kanban Views](/l/ko/user-guide/views-pipelines/capabilities/kanban-views)
+* [Filters and Sorting](/l/ko/user-guide/views-pipelines/capabilities/filters-and-sorting)
+* [View Settings](/l/ko/user-guide/views-pipelines/capabilities/view-settings)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/send-emails-from-workflows.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/send-emails-from-workflows.mdx
new file mode 100644
index 0000000000..a132d1d214
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/send-emails-from-workflows.mdx
@@ -0,0 +1,149 @@
+---
+title: Send Emails from Workflows
+description: Send personalized emails automatically using workflow actions.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Automatically send emails when specific events occur in your CRM—welcome new contacts, follow up on opportunities, or notify team members.
+
+## Prerequisites
+
+Before you can send emails from workflows:
+
+1. Connect an email account under **Settings → Accounts**
+2. Ensure the account has sending permissions enabled
+
+## Basic Email Workflow
+
+### Example: Welcome Email for New Contacts
+
+**Goal**: Send a welcome email when a new person is added to the CRM.
+
+**Setup**:
+
+1. **Create workflow**: Go to **Settings → Workflows** and click **+ New Workflow**
+
+2. **Add trigger**: Select **Record is Created** → **People**
+
+3. **Add Send Email action**:
+ * Click **+** to add an action
+ * Select **Send Email**
+ * Configure the email:
+
+| Field | Value |
+| ----------- | -------------------------------------- |
+| **To** | `{{trigger.object.email}}` |
+| **Subject** | `Welcome to {{Your Company Name}}` |
+| **Body** | `Hi {{trigger.object.firstName}}, ...` |
+
+4. **Test and activate**: Test with a sample record, then activate
+
+## Using Variables in Emails
+
+Reference data from previous steps using `{{variable}}` syntax:
+
+```text
+Hi {{trigger.object.firstName}},
+
+Thank you for connecting with us!
+
+Your company, {{trigger.object.company.name}}, is now in our system.
+
+Best regards,
+The Team
+```
+
+### Available Variables from Triggers
+
+| Trigger Type | Common Variables |
+| -------------------------- | -------------------------------------- |
+| **Record Created/Updated** | `{{trigger.object.fieldName}}` |
+| **Manual** | `{{trigger.selectedRecord.fieldName}}` |
+| **Webhook** | `{{trigger.body.fieldName}}` |
+
+## Advanced: Conditional Emails
+
+### Example: Different Emails Based on Lead Source
+
+**Goal**: Send different welcome emails based on where the lead came from.
+
+**Setup**:
+
+1. **Trigger**: Record is Created (People)
+
+2. **Add Filter action**:
+ * Condition: `{{trigger.object.source}}` equals `"Website"`
+ * If true → continue to website welcome email
+
+3. **Branch for other sources**:
+ * Create parallel branches for different sources
+ * Each branch has its own Send Email action
+
+## Sending Emails to Multiple Recipients
+
+### Example: Notify Team When Deal Closes
+
+**Goal**: Email the sales rep and their manager when an opportunity is won.
+
+**Setup**:
+
+1. **Trigger**: Record is Updated (Opportunities, Stage = "Closed Won")
+
+2. **Search Records**: Find the opportunity owner's manager
+
+3. **Send Email #1**: To opportunity owner
+ * To: `{{trigger.object.owner.email}}`
+ * Subject: `Congratulations on closing {{trigger.object.name}}!`
+
+4. **Send Email #2**: To manager
+ * To: `{{searchRecords.manager.email}}`
+ * Subject: `Deal Won: {{trigger.object.name}}`
+
+## Scheduled Follow-up Emails
+
+### Example: Follow Up 3 Days After Meeting
+
+**Goal**: Send a follow-up email 3 days after a meeting is logged.
+
+**Setup**:
+
+1. **Trigger**: Record is Created (Activities, Type = "Meeting")
+
+2. **Delay action**: Wait 3 days
+
+3. **Send Email**:
+ * To: Meeting attendee
+ * Subject: Following up on our conversation
+ * Body: Reference meeting details from trigger
+
+## Best Practices
+
+### Email Content
+
+* Keep subject lines concise and relevant
+* Personalize with recipient's name
+* Include a clear call to action
+* Test emails before activating
+
+### Deliverability
+
+* Don't send too many emails too quickly
+* Use professional email signatures
+* Avoid spam trigger words
+* Ensure unsubscribe options for marketing emails
+
+### Troubleshooting
+
+* Verify email account is connected and active
+* Check recipient email address is valid
+* Review workflow runs for error messages
+* Test with your own email address first
+
+
+ **Coming soon**: Email attachments will be available in Q1 2026.
+
+
+## Related
+
+* [Workflow Triggers](/l/ko/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/use-branches-in-workflows.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
new file mode 100644
index 0000000000..bb235970c0
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
@@ -0,0 +1,90 @@
+---
+title: Use Branches in Workflows
+description: Understand how branches work and how to control which path is executed.
+---
+
+## How Branches Work
+
+In the workflow editor, you can create multiple paths (branches) going out from a single node. This allows you to build complex automations with different outcomes.
+
+**Important**: When a workflow runs, **all branches execute in parallel by default**. There is no built-in "if/else" logic to choose one branch over another—every path will run simultaneously.
+
+## Controlling Which Branch Runs
+
+To execute only one branch based on specific conditions, **add a Filter node at the beginning of each branch**.
+
+### Example Setup
+
+1. Create your workflow with multiple branches from a single node
+2. Add a **Filter** node as the first step in each branch
+3. Set conditions on each Filter to determine when that branch should continue
+4. Only the branch(es) whose Filter conditions are met will proceed
+
+
+
+### How Filters Work
+
+* If the Filter condition is **met**: The branch continues executing
+* If the Filter condition is **not met**: The branch stops at the Filter node
+
+This effectively creates conditional logic where only the appropriate branch runs based on your data.
+
+## Example: Route by Deal Size
+
+**Scenario**: When a deal is closed, send different notifications based on deal size.
+
+1. **Trigger**: Opportunity updated (Stage = Closed Won)
+2. **Branch 1**: Filter for Amount > $10,000 → Send Slack message to #big-deals
+3. **Branch 2**: Filter for Amount ≤ $10,000 → Send email to sales manager
+
+Both branches start, but only the one matching the deal amount will continue past its Filter.
+
+## Creating Branches
+
+
+ To create a new branch from an existing step, click the **+** button on the step and add your action. You can add multiple branches by clicking **+** multiple times.
+
+
+1. In the workflow editor, select the step you want to branch from
+2. Click the **+** button to add an action
+3. This creates one branch
+4. Click **+** again on the same step to create additional branches
+5. Each branch can have its own sequence of actions
+
+## Merging Branches Back Together
+
+After parallel branches complete their work, you can merge them back into a single path:
+
+1. Complete your branched actions
+2. Add a new step that should run after all branches
+3. Drag a connection from the last step of each branch to this new step
+4. The merged step waits for all connected branches to complete before executing
+
+### Example: Process Then Notify
+
+```
+Trigger
+ │
+ ├── Branch A: Update Customer Record
+ │
+ └── Branch B: Create Support Ticket
+
+ ↘ ↙
+
+ Merged Step: Send Confirmation Email
+```
+
+The confirmation email sends only after both the customer update and ticket creation are done.
+
+## Best Practices
+
+* Always use **Filter nodes** at the start of branches when you want conditional execution
+* Keep branch conditions **mutually exclusive** to avoid duplicate actions
+* Test your workflows with different data to ensure the correct branches run
+* **Rename branch steps** descriptively so it's clear what each path does
+* **Merge branches** when you need a final action after parallel processing
+
+## Related
+
+* [Workflows FAQ](/l/ko/user-guide/workflows/how-tos/need-more-help/workflows-faq) — answers about parallel execution
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions) — available actions for branches
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/use-iterator.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/use-iterator.mdx
new file mode 100644
index 0000000000..bb98e9f949
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/use-iterator.mdx
@@ -0,0 +1,180 @@
+---
+title: Use Iterator
+description: Loop through arrays of records to perform actions on each item.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Iterator lets you loop through an array of records and perform actions on each one. It's essential for workflows that need to process multiple records returned by Search Records or received via webhooks.
+
+
+ Iterator is currently in beta. Activate it under **Settings → Releases → Lab**.
+
+
+## When to Use Iterator
+
+| Scenario | Example |
+| -------------------------- | ---------------------------------------------- |
+| **Process search results** | Send email to each person found |
+| **Handle webhook arrays** | Create records for each item in order |
+| **Bulk updates** | Update multiple records with calculated values |
+| **Notifications** | Alert multiple people about an event |
+
+## Understanding Iterator
+
+Iterator expects an **array** as input. It then:
+
+1. Takes the first item from the array
+2. Runs all actions inside the iterator with that item
+3. Moves to the next item
+4. Repeats until all items are processed
+
+## Basic Setup
+
+### Example: Email Everyone in Search Results
+
+**Goal**: Find all contacts in a specific company and send each one a personalized email.
+
+### Step 1: Search for Records
+
+1. Add **Search Records** action
+2. Object: **People**
+3. Filter: Company equals "Acme Inc"
+4. This returns an array of people
+
+### Step 2: Check Results Exist
+
+1. Add **Filter** action
+2. Condition: `{{searchRecords.length}}` is greater than 0
+3. This prevents Iterator errors on empty results
+
+### Step 3: Add Iterator
+
+1. Add **Iterator** action
+2. Array input: Select `{{searchRecords}}`
+3. This creates a loop
+
+### Step 4: Add Actions Inside Iterator
+
+Actions placed after Iterator run for each item:
+
+1. Add **Send Email** action (inside iterator)
+2. To: `{{iterator.currentItem.email}}`
+3. Subject: Hello `{{iterator.currentItem.firstName}}`!
+4. Body: Personalized message using current item fields
+
+### Result
+
+If Search Records returns 5 people, the Iterator:
+
+* Sends email to person 1
+* Sends email to person 2
+* ... continues for all 5
+
+## Accessing Current Item Data
+
+Inside Iterator, use `{{iterator.currentItem}}` to access the current record:
+
+| Variable | Description |
+| --------------------------------------- | ----------------------------------- |
+| `{{iterator.currentItem}}` | The entire current record object |
+| `{{iterator.currentItem.id}}` | Record ID |
+| `{{iterator.currentItem.email}}` | Email field |
+| `{{iterator.currentItem.company.name}}` | Related company name |
+| `{{iterator.index}}` | Current position in array (0-based) |
+
+## Common Patterns
+
+### Update Multiple Records
+
+**Goal**: Mark all overdue tasks as "Late"
+
+```
+1. Search Records (Tasks, Due Date < Today, Status ≠ Completed)
+2. Filter (length > 0)
+3. Iterator (searchRecords)
+ └── Update Record
+ - Object: Tasks
+ - Record: {{iterator.currentItem.id}}
+ - Status: Late
+```
+
+### Create Records from Array
+
+**Goal**: Webhook receives order with multiple items, create a record for each
+
+```
+1. Webhook Trigger (receives items array)
+2. Filter (items.length > 0)
+3. Iterator (trigger.body.items)
+ └── Create Record
+ - Object: Order Items
+ - Name: {{iterator.currentItem.name}}
+ - Quantity: {{iterator.currentItem.qty}}
+ - Related Order: {{trigger.body.orderId}}
+```
+
+### Conditional Processing Inside Loop
+
+**Goal**: Only send email to contacts with valid emails
+
+```
+1. Search Records (People)
+2. Iterator (searchRecords)
+ └── Filter (currentItem.email is not empty)
+ └── Send Email
+ - To: {{iterator.currentItem.email}}
+```
+
+## Troubleshooting
+
+### "Iterator expects an array"
+
+**Cause**: You passed a single record instead of an array.
+
+**Fix**: Make sure you're passing the result of Search Records or an array field, not a single record.
+
+```
+✅ Correct: {{searchRecords}}
+❌ Wrong: {{searchRecords[0]}}
+```
+
+### Iterator Doesn't Run
+
+**Cause**: The array is empty.
+
+**Fix**: Add a Filter before Iterator to check array length:
+
+```
+Filter: {{searchRecords.length}} > 0
+```
+
+### Actions Run Too Many Times
+
+**Cause**: Search Records returned more records than expected.
+
+**Fix**:
+
+* Add more specific filters to Search Records
+* Set a limit on Search Records (max 200)
+* Add Filter inside Iterator for additional conditions
+
+## Performance Considerations
+
+* **Credit usage**: Each iteration consumes credits for its actions
+* **Time**: Large arrays take longer to process
+* **Limits**: Consider batching very large operations
+* **Rate limits**: External API calls may hit rate limits with many iterations
+
+## Best Practices
+
+1. **Always check array length** before Iterator to avoid errors
+2. **Add filters inside loops** when not all items need processing
+3. **Rename your Iterator step** to describe what it's looping through
+4. **Test with small arrays** before processing large datasets
+5. **Monitor workflow runs** to ensure iterations complete as expected
+
+## Related
+
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions)
+* [How to Use Branches](/l/ko/user-guide/workflows/capabilities/use-branches-in-workflows)
+* [Workflows FAQ](/l/ko/user-guide/workflows/how-tos/need-more-help/workflows-faq)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-actions.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-actions.mdx
new file mode 100644
index 0000000000..9a7176b978
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-actions.mdx
@@ -0,0 +1,311 @@
+---
+title: Workflow Actions
+description: Learn about the actions available in Twenty workflows.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## About Actions
+
+Actions define what happens after a trigger fires. You can chain multiple actions together to build complex automations.
+
+
+ * Use the variable picker (click the `(x+)` icon) to browse available data from previous steps
+ * Hover over any input field to see which step a variable comes from — helpful when the same field (e.g., ID) exists in multiple previous steps
+ * Give each action a descriptive name for easier maintenance
+
+
+## Record Actions
+
+
+
+### Create a Record
+
+Adds a new record to a selected object.
+
+**Configuration**:
+
+* Select the target object
+* Fill out the required and optional fields
+* Use data from previous steps or input values manually to populate fields
+
+**Output**: The newly created record data is available for use in subsequent steps.
+
+### Update Record
+
+Modifies an existing record in a selected object.
+
+
+
+**Configuration**:
+
+* Select the target object
+* Choose the specific record to update.
+ * You can either choose a fixed record, using the drop down menu displaying all available records.
+ * Or you can have the record dynamically selected, by designating a record found in a previous step, using the `(x+)`. You cannot search for the record based on different criteria at this stage. If you've not yet identified the record, add a `Search Record` step before this `Update Record` step.
+* Select fields to modify and enter new values
+
+**Output**: The updated record data is available for use in subsequent steps.
+
+### Delete Record
+
+Removes a record from a selected object.
+
+**Configuration**:
+
+* Select the target object
+* Choose the specific record to delete
+
+**Output**: The deleted record data remains available for use in subsequent steps.
+
+### Search Records
+
+Finds records within a selected object using filter conditions.
+
+**Configuration**:
+
+* Select the object to search
+* Set filter criteria to narrow results
+* Configure sorting and limits
+
+**Output**: Returns matching records that can be used in subsequent steps.
+
+
+ **Limit**: Search Records returns a maximum of **200 records**. If you need to process more, add specific filters to reduce results or use scheduled workflows to process in batches.
+
+
+**Best Practice**: Use [branches](/l/ko/user-guide/workflows/capabilities/workflow-branches) after Search Records to handle "found" vs "not found" scenarios.
+
+### Upsert Record
+
+Creates a new record or updates an existing one based on matching criteria. This is useful when you're not sure if a record already exists.
+
+
+
+**Configuration**:
+
+* Select the target object
+* Note which fields can be used for matching: email for People, domain for Companies, ID for any object, or any field marked as Unique. You'll need to populate at least one of these below.
+* Fill out the field values. Do not forget to populate at least one of the unique identifiers.
+
+
+ **Matching usually works even better when adding only one unique identifier.** For example, the screenshot below will match companies based on their domain. The ID is not necessarily needed.
+
+
+
+
+* Use data from previous steps to populate fields
+
+**How it works**:
+
+1. Searches for a record matching your criteria
+2. If found → updates the existing record
+3. If not found → creates a new record
+
+**Output**: The created or updated record data is available for use in subsequent steps.
+
+## Flow Actions
+
+### Iterator
+
+**Loops through an array of records** returned from a previous step, allowing you to perform actions on each record individually.
+
+**Configuration**:
+
+* Select the array of records from a previous step (e.g., results from Search Records, from a Manual trigger with Bulk availability, from a code node)
+* Define the actions to perform on each record in the loop.
+
+
+ - You can add several actions within an iterator.
+ - When using branches inside an iterator, make sure the last step of each branch connects back to the iterator to close the loop.
+
+
+* Access `Current Item` Fields: to use fields from the record currently being processed, click on the **Iterator** step, then select **Current item**. The list of available fields from that record will be displayed and can be selected for use in subsequent actions.
+
+
+
+### Filter
+
+Filters records based on specified conditions, allowing only records that meet the criteria to pass through.
+
+**Configuration**:
+
+* Select the record to filter
+* Define filter conditions and criteria
+* Configure which records should pass through to subsequent steps
+
+
+ 1. **Output**: Filter nodes don't return data—they act as gates. If the conditions are met, the workflow continues. If not, the workflow stops at that branch.
+ 2. The `IS` operator can be used with numeric fields. It performs as an `EQUAL`.
+
+
+### Delay
+
+Pauses workflow execution for a specified duration or until a specific date/time.
+
+**Delay Types**:
+
+| Type | Description |
+| ------------------ | ------------------------------------------------------------------ |
+| **Duration** | Wait for a specific amount of time (days, hours, minutes, seconds) |
+| **Scheduled Date** | Wait until a specific date and time |
+
+**Configuration for Duration**:
+
+* Set days, hours, minutes, and/or seconds
+* Combine multiple units (e.g., 2 days and 4 hours)
+
+**Configuration for Scheduled Date**:
+
+* Select a date and time
+* Can reference a date field from a previous step (e.g., follow up 3 days after a meeting)
+
+**Use cases**:
+
+* Wait 24 hours before sending a follow-up email
+* Pause until an opportunity's close date
+* Schedule actions for business hours
+
+
+ The scheduled date cannot be in the past. If a date field from a previous step is used and the date has already passed, the workflow will fail.
+
+
+**Limits & Credits**:
+
+* **No maximum duration limit**—you can set delays of minutes, days, weeks, or longer
+* **1 credit consumed** when the Delay node executes, regardless of duration
+* **No credits consumed** while waiting—a 5-minute delay costs the same as a 5-day delay
+
+## Communication Actions
+
+### Send Email
+
+Sends an email from your workflow. This is great for templated group emails. Emails will look like the ones you send from your mailbox.
+Not suited for newsletters (which require richer formatting) or automated email sequences.
+
+**Prerequisites**: Add an email account in Settings → Accounts
+
+**Configuration**:
+
+* Select the sender email account
+
+
+ You can only send emails from mailboxes synced to your own Twenty account. Sending from other team members' mailboxes (e.g., the account owner's email) is on the roadmap.
+
+
+For all the following steps, you can reference variables from previous steps for personalization.
+
+* Enter recipient email address.
+
+
+ Only one recipient is possible at the moment.
+
+
+* Set subject line.
+* Compose message body. You can format links, create numbered list, bullet point lists, add attachments.
+
+
+ Adding HTML signatures is not possible at the moment.
+
+
+### Form
+
+Prompts a form during workflow execution to collect user input. The responses can then be used in subsequent steps to create records, send emails, or execute any other action based on the input.
+
+
+ **Forms are designed for manual triggers only**. For workflows with other triggers (Record Created, Updated, etc.), forms are only accessible via the workflow run interface, which is not the expected user experience. A notifications center will be released in 2026 to properly support forms in automated workflows.
+
+
+**Configuration**:
+
+* Configure the fields that users will be asked to fill. For each field, choose
+ * a type among text, number, date, a given record, a select field. Select fields from all objects are available.
+ * a label
+ * a default value under `Placeholder` (optional)
+* Edit the form title
+
+**Output**: Form responses are available for use in subsequent steps.
+
+**Example**: The "Quick Lead" workflow is available by default in all workspaces, available anywhere in the Command Menu `Cmd + K`.
+
+**How to fill the form**:
+
+* Trigger your manual workflow from the command menu `Cmd K`
+* Fill the form that is displayed in the side panel and click `Submit`.
+
+
+ The fields cannot be made mandatory.
+
+
+
+
+## Integration Actions
+
+### Code
+
+Runs custom JavaScript within your workflow.
+
+**Configuration**:
+
+* Access variables from previous steps. You can edit the variables names dynamically.
+
+
+
+* Write JavaScript code in the editor
+* Return variables for use in subsequent steps
+* Test code directly in the step
+
+
+ If you need to use external API keys in your code, you must input them directly in the function body. You cannot configure API keys elsewhere and reference them in the serverless function.
+
+
+
+ **Working with arrays?** Arrays from external systems or previous steps may come as strings. See [How to handle arrays in Code actions](/l/ko/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions) for the solution.
+
+
+
+ Click the square icon at the top right of the code editor to display it in full screen — helpful since the default editor width is limited.
+
+
+### HTTP Request
+
+Sends a request to an external API as part of your workflow.
+
+
+
+**Configuration**:
+
+* Enter the API endpoint URL. Using parameters from previous steps is possible.
+* Select HTTP method (GET, POST, PUT, PATCH, DELETE)
+* Add required headers and values
+* Provide sample response for structure preview
+
+## AI Actions
+
+### AI Agent - Coming Soon
+
+Runs an AI agent within your workflow to perform intelligent tasks.
+
+**Configuration**:
+
+* **Agent**: Select an existing AI agent or use the default agent
+* **Prompt**: Write the instruction for the AI agent
+* Reference variables from previous steps in the prompt
+
+**What AI Agents can do**:
+
+* Analyze and summarize data
+* Classify or categorize records
+* Generate text content
+* Make decisions based on data
+* Interact with your CRM data using tools
+
+**Output**: The AI agent's response is available for use in subsequent steps. If the agent has a structured output schema, the response will follow that format.
+
+
+ AI Agent actions consume workflow credits based on the AI model used. See [Workflow Credits](/l/ko/user-guide/workflows/capabilities/workflow-credits) for details.
+
+
+
+ AI agents respect role-based permissions. You can assign specific roles to agents under **Settings → Roles** to control what data they can access. See [Permissions](/l/ko/user-guide/permissions-access/capabilities/permissions) for details.
+
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-branches.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-branches.mdx
new file mode 100644
index 0000000000..102f08ec59
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-branches.mdx
@@ -0,0 +1,66 @@
+---
+title: Workflow Branches
+description: Create parallel paths and conditional logic in your workflows.
+---
+
+Branches allow you to split your workflow into multiple paths that can run simultaneously or conditionally based on your data.
+
+
+
+## How Branches Work
+
+When you create multiple connections from a single node, each path becomes a branch. By default, **all branches execute in parallel**—they don't wait for each other.
+
+## Creating Branches
+
+### Add a New Branch
+
+1. **Right-click on the main canvas** of the workflow (not on an existing node)
+2. Click **Add node**
+3. Choose the node type for your new branch
+4. Drag an arrow from the bottom of the previous step to the top of this new action
+5. Repeat to add more branches from the same node
+
+
+ Each branch is independent. Adding a branch doesn't affect other existing paths from that node.
+
+
+### Visual Layout
+
+Branches appear as parallel paths in the workflow editor. You can drag nodes to rearrange the visual layout without affecting execution.
+
+## Conditional Branches
+
+Since all branches run by default, use **Filter** nodes to control which paths actually execute:
+
+| Branch | Filter Condition | Action |
+| ------ | --------------------- | -------------------------- |
+| A | Stage = "Won" | Send congratulations email |
+| B | Stage = "Lost" | Create follow-up task |
+| C | Stage = "Negotiation" | Notify manager |
+
+1. Create branches from your trigger or action
+2. Add a **Filter** node as the first step of each branch
+3. Configure each filter with mutually exclusive conditions
+4. Add your actions after each filter
+
+Only the branch(es) where the filter condition is met will continue executing.
+
+## Merging Branches
+
+**Branches don't automatically merge.** Each branch runs independently until it ends. You have full flexibility in how you handle this:
+
+* **Option 1: Keep branches separate**
+ Each branch handles its own follow-up actions independently. This is the simplest approach when branches don't need to converge.
+
+* **Option 2: Merge branches manually**
+ When creating your workflow, you can manually connect multiple branches to the same downstream action. Simply drag arrows from the end of each branch to a common node.
+
+
+ While you can use a [Delay](/l/ko/user-guide/workflows/capabilities/workflow-actions#delay) node to pause execution, it's not currently configurable to wait "until another branch ends."
+
+
+## Related
+
+* [How to Use Branches in Workflows](/l/ko/user-guide/workflows/capabilities/use-branches-in-workflows) - Step-by-step guide
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions) - Available actions including Filter
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-credits.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-credits.mdx
new file mode 100644
index 0000000000..437aee5822
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-credits.mdx
@@ -0,0 +1,76 @@
+---
+title: Workflow Credits
+description: Understand workflow credit consumption and management.
+---
+
+Workflow credits power your automations in Twenty. Understanding how they work helps you optimize costs and manage your automation budget effectively.
+
+## Credit Allocation
+
+Workflow credits are allocated based on your billing cycle, not your plan tier:
+
+| Billing Cycle | Credits |
+| ------------------------ | --------------------------- |
+| **Monthly subscription** | 5 million credits per month |
+| **Yearly subscription** | 50 million credits per year |
+
+
+ 5 million monthly credits are generous for standard automations. Most teams won't exceed this limit with typical workflow usage. Additional credits are primarily needed for advanced Code actions and AI-powered workflows.
+
+
+## How Credit Consumption Works
+
+Credits are consumed when workflows execute, not when you create them. Each workflow action consumes credits based on its complexity:
+
+### Credit Consumption by Action Type
+
+* **Basic internal operations**: Very low credit consumption
+ * Search Records
+ * Create Record
+ * Update Record
+ * Delete Record
+ * Form actions
+
+* **Complex operations**: Higher credit consumption
+ * Code actions (JavaScript execution)
+ * HTTP Requests to external services
+
+* **AI features**: Higher credit consumption
+ * AI Agent actions consume credits based on the AI model used
+ * More complex prompts and longer outputs use more credits
+
+* **Delay actions**: Minimal credit consumption
+ * The Delay node consumes **1 credit** when it executes
+ * **No credits are consumed** during the wait period
+ * A 5-minute delay costs the same as a 5-day delay
+
+### Real-Time Deduction
+
+Credits are deducted in real-time as workflows execute. This means:
+
+* Draft workflows don't consume credits
+* Only active, running workflows use your credit allocation
+* Failed workflows still consume credits for completed steps
+
+## Managing Credits
+
+### Check Credit Usage
+
+1. Go to **Settings → Billing**
+2. View your current credit consumption and remaining balance
+3. Monitor usage patterns to optimize your workflows
+
+### Purchasing Additional Credits
+
+If you need more credits beyond your plan allocation:
+
+1. Go to **Settings → Billing**
+2. Click on the option to purchase additional credits. Packages of different sizes are available.
+3. Credits are added to your current balance
+
+## Best Practices
+
+* **Batch Processing**: Use bulk operations and Iterator actions efficiently
+* **Manual Trigger Optimization**: For manual triggers, choose `Bulk` availability to process multiple records in a single workflow run
+* Optimize Code actions for efficiency
+* Batch operations to reduce individual action calls
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-runs.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-runs.mdx
new file mode 100644
index 0000000000..87a0ecfdf8
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-runs.mdx
@@ -0,0 +1,92 @@
+---
+title: Workflow Runs
+description: Monitor and manage workflow executions.
+image: /images/user-guide/workflows/workflow.png
+---
+
+## About Runs
+
+A **Run** is a record of a workflow execution. Every time a workflow is triggered—whether by a record event, schedule, manual action, or webhook—a new run is created.
+
+## Viewing Runs
+
+### From the Workflow Editor
+
+1. Open the workflow you want to monitor
+2. Click the **Runs** panel on the right side
+3. See a list of recent runs with their status
+
+### From the Workflow Runs View
+
+1. Go to **Workflow Runs** in the sidebar
+2. View runs across all workflows
+3. Filter by status, workflow, or date
+
+## Run Statuses
+
+| Status | Description |
+| ------------- | ------------------------------------------------------------------------ |
+| **Running** | Workflow is currently executing |
+| **Completed** | Workflow finished successfully |
+| **Failed** | Workflow encountered an error and stopped |
+| **Waiting** | Workflow is paused (e.g., waiting for a Delay action or Form submission) |
+
+## Run Details
+
+Click on any run to see:
+
+* **Status**: Current state of the run
+* **Started at**: When the run began
+* **Duration**: How long the run took
+* **Trigger data**: The input that started the workflow
+* **Step outputs**: Data returned by each step
+* **Error messages**: If the run failed, what went wrong
+
+## Step-by-Step Execution
+
+Each run shows the progression through your workflow:
+
+1. See which steps completed successfully
+2. Identify where failures occurred
+3. View the data passed between steps
+4. Debug issues by examining step inputs and outputs
+
+## Error Handling
+
+When a run fails:
+
+1. Open the failed run
+2. Find the step that caused the failure
+3. Check the error message for details
+4. Common issues:
+ * Missing required fields
+ * Invalid data format
+ * External API errors
+ * Permission issues
+
+## Re-running Workflows
+
+If a run fails, you can:
+
+* Fix the underlying issue and wait for the next trigger
+* For manual workflows, trigger again with the same or updated data
+* Review the workflow logic to prevent future failures
+
+## Performance Tips
+
+### Managing Run History
+
+* Runs are retained for historical reference
+* Very old runs may be archived automatically
+* Export run data if you need to keep records
+
+### Monitoring Best Practices
+
+* Check runs regularly after activating new workflows
+* Review failed runs to identify patterns
+
+## Related
+
+* [Workflow Triggers](/l/ko/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions)
+* [Workflow Troubleshooting](/l/ko/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-triggers.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-triggers.mdx
new file mode 100644
index 0000000000..8f9e66b33c
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-triggers.mdx
@@ -0,0 +1,136 @@
+---
+title: Workflow Triggers
+description: Learn about the different triggers that start your workflows.
+---
+
+## About Triggers
+
+Workflows always start with a single trigger that defines when the automation should run.
+
+
+
+
+ **Advanced objects are supported!** Beyond standard CRM objects (People, Companies, Opportunities), you can also trigger workflows and perform actions on:
+
+ * Workspace Members
+ * Calendar Events
+ * Messages (Emails)
+ * Tasks, Notes, and many other system objects
+
+ This opens up powerful automations like notifying team members when calendar events are created, or processing incoming emails automatically.
+
+
+## Record is Created
+
+Starts the workflow when a new record is created in a selected object (People, Companies, Opportunities, or any custom object).
+
+**Configuration**: Select the object type to monitor for new records.
+
+
+ * This trigger is great for records created by csv, mailbox and calendar synchronization, API.
+ * **It is not recommended for records created manually**: with this trigger, workflows start as soon as the record is created. Since Twenty UI offers auto-save on the fly (there is not an edit mode and then a validation to save records), the workflow will be triggered before the user inputs all the fields.
+ To trigger this workflow on records created manually, it is recommended to use the trigger `Record is created or updated` instead.
+
+
+## Record is Updated
+
+Starts the workflow when changes are made to an existing record.
+
+**Configuration**:
+
+* Select the object type
+* Optionally specify which fields to monitor for changes
+
+## Record is Updated or Created
+
+Starts the workflow when a record is either created or updated in a selected object.
+
+**Why This Matters**: This trigger is particularly helpful because records created via different methods behave differently:
+
+* **API/CSV imports**: Records are created with all fields populated immediately
+* **Manual creation**: Records are created first, then fields are added in subsequent updates
+
+**Configuration**:
+
+* Select the object type to monitor
+* Optionally specify which fields to monitor for changes
+* The workflow will trigger both on initial creation and any subsequent updates
+
+## Record is Deleted
+
+Starts the workflow when a record is removed from an object.
+
+**Configuration**: Select the object type to monitor for deletions.
+
+## Manual Trigger
+
+Starts the workflow when triggered by a user action. This trigger can be accessed through the `Cmd+K` menu or via a custom button that will be displayed in the top navbar after selecting record(s).
+
+
+
+**Availability Configuration**:
+Choose how the workflow should handle record selection:
+
+* **Global**: No record is required to trigger this workflow. The workflow is triggered from the command menu `Cmd + K` anywhere (from any object) and does not use record(s) as input.
+
+* **Single**: The selected record(s) will be passed to your workflow. This is configured for a given object. Several records can be selected before triggering the workflow. The workflow will run from beginning to end as many times as there are records selected.
+
+
+ **Soft limit: 100 runs/minute**. Beyond this, workflows remain in "Not Started" status and are processed gradually—either by a background job or when another workflow enters the queue. This means you can select more than 100 records with a Single trigger; execution will just be slower.
+
+
+* **Bulk**: The selected record(s) will be passed to your workflow. This is configured for a given object. Several records can be selected before triggering the workflow. The workflow will run once, providing the entire list of records as input. This means the workflow needs to contain an [Iterator action](/l/ko/user-guide/workflows/capabilities/workflow-actions#iterator).
+
+
+ This is more advanced, and best for people who want to optimize the number of workflow runs.
+
+
+
+
+**Additional Configuration**:
+
+* Select the target object (for Single and Bulk availability)
+* Choose a command icon for the workflow trigger
+* Configure navbar placement (Pinned or Not Pinned)
+
+**Access Methods**:
+
+* `Cmd+K` menu to find and launch manual workflows
+* Custom button in the top navbar (if configured)
+
+## Time-Based Trigger: On a Schedule
+
+Starts the workflow on a recurring basis you define.
+
+**Configuration**:
+
+* Select time unit (minutes, hours, days)
+* Enter a value or use custom cron expressions for advanced scheduling
+
+
+ **Timezone**: Scheduled workflows run in **UTC**. When setting hours for daily schedules, convert your local time to UTC.
+
+
+## External Trigger: Webhook
+
+Starts the workflow when a GET or POST request is received from an external service.
+
+
+
+**Configuration**:
+
+* The workflow provides a unique webhook URL—copy this and add it to your external system as the endpoint to call.
+* For POST requests, define the expected body structure so Twenty knows what data to expect. Add here the fields you will receive that will be needed below in your workflow.
+* Configure authentication (coming soon).
+
+## Choosing the Right Trigger
+
+| Use Case | Recommended Trigger |
+| --------------------------- | ---------------------------- |
+| New leads need processing | Record is Created |
+| Data changes need sync | Record is Updated |
+| Import/manual data handling | Record is Updated or Created |
+| Cleanup after deletion | Record is Deleted |
+| User-initiated action | Launch Manually |
+| Recurring reports | On a Schedule |
+| External integration | Webhook or On a Schedule |
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-versions.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-versions.mdx
new file mode 100644
index 0000000000..f68977d9e6
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/capabilities/workflow-versions.mdx
@@ -0,0 +1,85 @@
+---
+title: Workflow Versions
+description: Manage workflow versions and drafts.
+image: /images/user-guide/workflows/workflow.png
+---
+
+## About Versions
+
+Every time you activate a workflow, a new version is created. This allows you to track changes over time and revert to previous configurations if needed.
+
+## Version Statuses
+
+| Status | Description |
+| --------------- | -------------------------------------- |
+| **Draft** | Being edited, not yet published |
+| **Active** | Live version responding to triggers |
+| **Deactivated** | Previously active but manually stopped |
+| **Archived** | Past versions kept for history |
+
+## Working with Drafts
+
+When you edit an active workflow, your changes are saved as a **draft**. The active version continues to run while you work on updates.
+
+Once you're done editing, you can:
+
+* **Activate**: Publish the draft as the new active version (the previous version is archived)
+* **Discard**: Delete the draft and keep the current active version
+
+## Version History
+
+### Viewing Past Versions
+
+1. Open the workflow
+2. Click the **Versions** tab
+3. See all previous versions with timestamps
+
+### Restoring a Version
+
+1. Find the version you want to restore
+2. Click **Use as draft**
+3. The version is copied to a new draft
+4. Make any necessary updates
+5. Activate when ready
+
+## Best Practices
+
+### Version Management
+
+* Activate only when ready for production
+* Keep meaningful changes between versions
+* Document major changes in workflow names or descriptions
+* Test in draft mode before activating
+
+### Reverting Changes
+
+* If a new version causes issues, restore the previous version
+* Use the version history to track what changed
+* Always test restored versions before activating
+
+## Common Workflows
+
+### Quick Edit
+
+1. Make minor changes to an active workflow
+2. Test in draft mode
+3. Activate the new version
+
+### Major Revision
+
+1. Use the previous version as a starting point
+2. Make significant changes in draft
+3. Thoroughly test all scenarios
+4. Activate when confident
+
+### Rollback
+
+1. Identify the issue with the current version
+2. Find the last working version in history
+3. Click **Use as draft**
+4. Activate to restore the old behavior
+
+## Related
+
+* [Getting Started with Workflows](/l/ko/user-guide/workflows/overview)
+* [Workflow Runs](/l/ko/user-guide/workflows/capabilities/workflow-runs)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx
new file mode 100644
index 0000000000..bbc096202f
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx
@@ -0,0 +1,82 @@
+---
+title: Handle Arrays in Code Actions
+description: Learn how to properly handle array inputs in workflow Code actions.
+---
+
+When working with arrays in Code actions, you may encounter two common challenges:
+
+1. **Arrays passed as strings** — data from external systems or previous steps arrives as a string instead of an actual array
+2. **Can't select individual items** — you can only select the entire array, not specific fields within it
+
+Both can be solved with a Code node.
+
+## Parsing Arrays from Strings
+
+Arrays are often passed between workflow steps as strings or JSON rather than native arrays. This happens when:
+
+* Receiving data from external APIs via HTTP Request
+* Processing webhook payloads
+* Passing data between workflow steps
+
+**Solution**: Add this pattern at the start of your Code action:
+
+```javascript
+export const main = async (params: {
+ users: any;
+}): Promise => {
+ const { users } = params;
+
+ // Handle input that may come as a string or an array
+ const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;
+
+ // Now you can safely work with usersFormatted as an array
+ return {
+ users: usersFormatted.map((user) => ({
+ ...user,
+ activityStatus: String(user.activityStatus).toUpperCase(),
+ })),
+ };
+};
+```
+
+The key line `typeof users === "string" ? JSON.parse(users) : users` checks if the input is a string, parses it if needed, or uses it directly if it's already an array.
+
+## Extracting Individual Fields from Arrays
+
+A webhook might return an array like `answers: [...]`, but in subsequent workflow steps you can only select the **entire array** — not individual items within it.
+
+**Solution**: Add a Code node to extract specific fields and return them as a structured object:
+
+```javascript
+export const main = async (params: {
+ answers: any;
+}): Promise => {
+ const { answers } = params;
+
+ // Handle input that may come as a string or an array
+ const answersFormatted = typeof answers === "string"
+ ? JSON.parse(answers)
+ : answers;
+
+ // Extract specific fields from the array
+ const firstname = answersFormatted[0]?.text || "";
+ const name = answersFormatted[1]?.text || "";
+
+ return {
+ answer: {
+ firstname,
+ name
+ }
+ };
+};
+```
+
+The Code node returns a structured object instead of an array. In subsequent steps, you can now select individual fields like `answer.firstname` and `answer.name` from the variable picker.
+
+
+ We're actively working on making array handling easier in future updates.
+
+
+
+ Click the square icon at the top right of the code editor to display it in full screen — helpful since the default editor width is limited.
+
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx
new file mode 100644
index 0000000000..0b35a3342d
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx
@@ -0,0 +1,182 @@
+---
+title: Bring Product Data into Twenty
+description: Sync product catalog data from a data warehouse into your CRM on a schedule.
+---
+
+Use this pattern to keep Twenty in sync with product data from your data warehouse (e.g., Snowflake, BigQuery, PostgreSQL).
+
+## Workflow Structure
+
+1. **Trigger**: On a Schedule
+2. **Code**: Query your data warehouse
+3. **Code** (optional): Format data as array
+4. **Iterator**: Loop through each product
+5. **Upsert Record**: Create or update in Twenty
+
+
+
+## Step 1: Schedule the Trigger
+
+Set the workflow to run at a frequency matching your data freshness needs:
+
+* Every 5 minutes for near real-time sync
+* Every hour for less critical data
+* Daily for batch updates
+
+## Step 2: Query Your Data Warehouse
+
+Add a **Code** action to fetch recent data:
+
+```javascript
+export const main = async () => {
+ const intervalMinutes = 10; // Match your schedule frequency
+ const cutoffTime = new Date(Date.now() - intervalMinutes * 60 * 1000).toISOString();
+
+ // Replace with your actual data warehouse connection
+ const response = await fetch("https://your-warehouse-api.com/query", {
+ method: "POST",
+ headers: {
+ "Authorization": "Bearer YOUR_API_KEY",
+ "Content-Type": "application/json"
+ },
+ body: JSON.stringify({
+ query: `
+ SELECT id, name, sku, price, stock_quantity, updated_at
+ FROM products
+ WHERE updated_at >= '${cutoffTime}'
+ `
+ })
+ });
+
+ const data = await response.json();
+ return { products: data.results };
+};
+```
+
+
+ Filter by `updated_at >= last X minutes` to retrieve only recently changed records. This keeps the sync efficient.
+
+
+## Step 3: Format Data (Optional)
+
+If your warehouse returns data in a format that needs transformation, add another **Code** action. Common transformations include type conversions, field renaming, and data cleanup.
+
+### Example: User Data with Boolean and Status Fields
+
+```javascript
+export const main = async (params: {
+ users: any;
+}): Promise => {
+ const { users } = params;
+ const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;
+
+ // Convert string "true"/"false" to actual booleans
+ const toBool = (v: any) => v === true || v === "true";
+
+ return {
+ users: usersFormatted.map((user) => ({
+ ...user,
+ activityStatus: String(user.activityStatus).toUpperCase(),
+ isActiveLast30d: toBool(user.isActiveLast30d),
+ isActiveLast7d: toBool(user.isActiveLast7d),
+ isActiveLast24h: toBool(user.isActiveLast24h),
+ isTwenty: toBool(user.isTwenty),
+ })),
+ };
+};
+```
+
+### Example: Product Data with Type Conversions
+
+```javascript
+export const main = async (params: { products: any }) => {
+ const products = typeof params.products === "string"
+ ? JSON.parse(params.products)
+ : params.products;
+
+ return {
+ products: products.map(product => ({
+ externalId: product.id,
+ name: product.name,
+ sku: product.sku,
+ price: parseFloat(product.price), // String → Number
+ stockQuantity: parseInt(product.stock_quantity),
+ isActive: product.status === "active" // String → Boolean
+ }))
+ };
+};
+```
+
+### Example: Date and Currency Formatting
+
+```javascript
+export const main = async (params: { deals: any }) => {
+ const deals = typeof params.deals === "string"
+ ? JSON.parse(params.deals)
+ : params.deals;
+
+ return {
+ deals: deals.map(deal => ({
+ ...deal,
+ // Convert Unix timestamp to ISO date
+ closedAt: deal.closed_timestamp
+ ? new Date(deal.closed_timestamp * 1000).toISOString()
+ : null,
+ // Ensure amount is a number (remove currency symbols)
+ amount: parseFloat(String(deal.amount).replace(/[^0-9.-]/g, "")),
+ // Normalize stage names
+ stage: deal.stage?.toLowerCase().replace(/_/g, " ")
+ }))
+ };
+};
+```
+
+### Common Transformations
+
+| Source Format | Target Format | Code |
+| -------------------- | ---------------- | ---------------------------------------- |
+| `"true"` / `"false"` | `true` / `false` | `v === true \|\| v === "true"` |
+| `"123.45"` | `123.45` | `parseFloat(value)` |
+| `"active"` | `"ACTIVE"` | `value.toUpperCase()` |
+| `1704067200` (Unix) | ISO date | `new Date(v * 1000).toISOString()` |
+| `"$1,234.56"` | `1234.56` | `parseFloat(v.replace(/[^0-9.-]/g, ""))` |
+| `null` / `undefined` | `""` | `value \|\| ""` |
+
+## Step 4: Iterate Through Products
+
+Add an **Iterator** action:
+
+* Input: `{{code.products}}`
+
+This loops through each product in the array.
+
+## Step 5: Upsert Each Record
+
+Inside the iterator, add an **Upsert Record** action:
+
+| Setting | Value |
+| ------------ | -------------------------------------- |
+| **Object** | Your custom Product object |
+| **Match by** | External ID or SKU (unique identifier) |
+| **Name** | `{{iterator.item.name}}` |
+| **SKU** | `{{iterator.item.sku}}` |
+| **Price** | `{{iterator.item.price}}` |
+
+
+ Use **Upsert** (update or create) instead of building separate branches for create vs. update. It's faster to build and easier to debug.
+
+
+## Example Use Cases
+
+| Source | Data |
+| ----------------------- | ----------------------------------- |
+| **ERP system** | Product catalog, pricing, inventory |
+| **E-commerce platform** | Orders, customers, product updates |
+| **Data warehouse** | Aggregated metrics, enriched data |
+| **Inventory system** | Stock levels, reorder alerts |
+
+## Related
+
+* [Workflow Triggers](/l/ko/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions)
+* [Handle Arrays in Code Actions](/l/ko/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx
new file mode 100644
index 0000000000..a737fbb7f3
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx
@@ -0,0 +1,130 @@
+---
+title: Bring Typeform Submissions into Twenty
+description: Handle Typeform's webhook payload to create leads from form submissions.
+---
+
+For standard webhook setup, see [Set Up a Webhook Trigger](/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger). This article covers the specific handling required for Typeform's custom payload structure.
+
+### Step 1: Create a Webhook Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Select **Webhook** as the trigger
+4. Copy the webhook URL
+
+### Step 2: Configure Typeform
+
+1. In Typeform, open your form
+2. Go to **Connect → Webhooks**
+3. Paste your Twenty webhook URL
+4. Save
+
+### Step 3: Understand the Typeform Payload
+
+Typeform sends a nested JSON structure. Here's a simplified example:
+
+```json
+{
+ "event_type": "form_response",
+ "form_response": {
+ "form_id": "abc123",
+ "submitted_at": "2025-01-15T10:30:00Z",
+ "answers": [
+ {
+ "text": "Jane",
+ "type": "text",
+ "field": { "id": "field1", "type": "short_text", "title": "First Name" }
+ },
+ {
+ "text": "Smith",
+ "type": "text",
+ "field": { "id": "field2", "type": "short_text", "title": "Last Name" }
+ },
+ {
+ "text": "Acme Corp",
+ "type": "text",
+ "field": { "id": "field3", "type": "short_text", "title": "Company" }
+ },
+ {
+ "email": "jane@acme.com",
+ "type": "email",
+ "field": { "id": "field4", "type": "email", "title": "Email" }
+ },
+ {
+ "type": "choice",
+ "field": { "id": "field5", "type": "dropdown", "title": "Team Size" },
+ "choice": { "label": "10-50" }
+ }
+ ]
+ }
+}
+```
+
+Key things to note:
+
+* Form data is nested under `form_response`
+* **Answers are returned as an array**, not as named fields
+* Each answer includes the field type and title for reference
+
+### Step 4: Extract Fields from the Answers Array
+
+Since `answers` is an array, you can only select the entire array in subsequent steps — not individual fields. Add a **Code** action to extract the fields you need:
+
+```javascript
+export const main = async (params: {
+ answers: any;
+}): Promise => {
+ const { answers } = params;
+
+ // Handle input that may come as a string or an array
+ const answersFormatted = typeof answers === "string"
+ ? JSON.parse(answers)
+ : answers;
+
+ // Extract fields by position or by finding the field type
+ const firstName = answersFormatted[0]?.text || "";
+ const lastName = answersFormatted[1]?.text || "";
+ const company = answersFormatted[2]?.text || "";
+ const email = answersFormatted.find(a => a.type === "email")?.email || "";
+ const teamSize = answersFormatted.find(a => a.type === "choice")?.choice?.label || "";
+
+ return {
+ contact: {
+ firstName,
+ lastName,
+ company,
+ email,
+ teamSize
+ }
+ };
+};
+```
+
+Now in subsequent steps, you can select `contact.firstName`, `contact.email`, etc. from the variable picker.
+
+
+ For more details on handling arrays in Code actions, see [Handle Arrays in Code Actions](/l/ko/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
+
+
+### Step 5: Create the Record
+
+Add a **Create Record** action:
+
+| Field | Value |
+| -------------- | ---------------------------------------------------- |
+| **Object** | People |
+| **First Name** | `{{code.contact.firstName}}` |
+| **Last Name** | `{{code.contact.lastName}}` |
+| **Email** | `{{code.contact.email}}` |
+| **Company** | Search or create based on `{{code.contact.company}}` |
+
+### Step 6: Test and Activate
+
+1. Submit a test response in Typeform
+2. Check the workflow run to verify data was captured
+3. Activate the workflow
+
+## Related
+
+* [Set Up a Webhook Trigger](/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger)
+* [Handle Arrays in Code Actions](/l/ko/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx
new file mode 100644
index 0000000000..bd9c2a5731
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx
@@ -0,0 +1,143 @@
+---
+title: Generate a Quote or Invoice from Twenty
+description: Automatically create invoices in external tools when deals close.
+---
+
+Automatically send deal data to your invoicing system (Stripe, QuickBooks, Xero, etc.) when an opportunity is won.
+
+## Workflow Structure
+
+1. **Trigger**: Record is Updated (Opportunity)
+2. **Filter**: Stage = Closed Won
+3. **Search Record**: Get Company details
+4. **Code** (optional): Format payload
+5. **HTTP Request**: Send to invoicing system
+
+## Step 1: Set Up the Trigger
+
+1. Create a new workflow
+2. Select **Record is Updated** trigger
+3. Choose **Opportunity** as the object
+
+## Step 2: Filter for Closed Won
+
+Add a **Filter** action to only continue when the deal is won:
+
+| Setting | Value |
+| ------------- | --------------------------------- |
+| **Field** | Stage |
+| **Condition** | Equals |
+| **Value** | `CLOSED_WON` (or your stage name) |
+
+
+ The trigger fires on any Opportunity update. The Filter ensures the workflow only continues when the stage changes to Closed Won.
+
+
+## Step 3: Get Company Details
+
+The Opportunity record may not include all Company fields you need for the invoice. Add a **Search Record** action:
+
+| Setting | Value |
+| ------------ | ---------------------------------------- |
+| **Object** | Company |
+| **Match by** | ID equals `{{trigger.object.companyId}}` |
+
+This retrieves the full Company record with billing address, tax ID, etc.
+
+## Step 4: Format the Payload (Optional)
+
+If your invoicing system expects a specific format, add a **Code** action:
+
+```javascript
+export const main = async (params: {
+ opportunity: any;
+ company: any;
+}): Promise => {
+ const { opportunity, company } = params;
+
+ return {
+ invoice: {
+ // Customer info from Company
+ customer_name: company.name,
+ customer_email: company.email || "",
+ billing_address: {
+ line1: company.address?.street || "",
+ city: company.address?.city || "",
+ postal_code: company.address?.postalCode || "",
+ country: company.address?.country || ""
+ },
+ tax_id: company.taxId || null,
+
+ // Invoice details from Opportunity
+ amount: opportunity.amount,
+ currency: opportunity.currency || "USD",
+ description: `Invoice for ${opportunity.name}`,
+ due_days: 30,
+
+ // Reference back to Twenty
+ metadata: {
+ opportunity_id: opportunity.id,
+ company_id: company.id
+ }
+ }
+ };
+};
+```
+
+## Step 5: Send to Invoicing System
+
+Add an **HTTP Request** action:
+
+| Setting | Value |
+| ----------- | ----------------------------------------- |
+| **Method** | POST |
+| **URL** | Your invoicing API endpoint |
+| **Headers** | `Authorization: Bearer YOUR_API_KEY` |
+| **Body** | `{{code.invoice}}` or map fields directly |
+
+### Example: Stripe Invoice
+
+```
+POST https://api.stripe.com/v1/invoices
+Headers:
+ Authorization: Bearer sk_live_xxx
+ Content-Type: application/x-www-form-urlencoded
+
+Body:
+ customer: {{company.stripeCustomerId}}
+ collection_method: send_invoice
+ days_until_due: 30
+```
+
+### Example: QuickBooks Invoice
+
+```
+POST https://quickbooks.api.intuit.com/v3/company/{realmId}/invoice
+Headers:
+ Authorization: Bearer YOUR_ACCESS_TOKEN
+ Content-Type: application/json
+
+Body: {{code.invoice}}
+```
+
+## Complete Workflow Summary
+
+| Step | Action | Purpose |
+| ---- | ----------------------- | ------------------------------------ |
+| 1 | Trigger: Record Updated | Fires when any Opportunity changes |
+| 2 | Filter | Only proceed if Stage = Closed Won |
+| 3 | Search Record | Get full Company details for billing |
+| 4 | Code | Format data for invoicing API |
+| 5 | HTTP Request | Create invoice in external system |
+
+## Tips
+
+* **Store external IDs**: Save the invoice ID returned by the API back to the Opportunity using an **Update Record** action
+* **Error handling**: Add a branch to send a notification if the HTTP request fails
+* **Test first**: Use your invoicing system's sandbox/test mode before going live
+
+## Related
+
+* [Workflow Triggers](/l/ko/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions)
+* [Closed Won Automations](/l/ko/user-guide/workflows/how-tos/crm-automations/closed-won-automations)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx
new file mode 100644
index 0000000000..79c0de0411
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx
@@ -0,0 +1,171 @@
+---
+title: Set Up a Webhook Trigger
+description: Receive data from external services to trigger workflows.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Webhook triggers allow external services to start your workflows by sending data to a unique URL. Use them to connect forms, third-party apps, and custom integrations.
+
+## When to Use Webhooks
+
+| Use Case | Example |
+| ----------------------- | --------------------------------------- |
+| **Web forms** | Contact form submissions create leads |
+| **Third-party apps** | Stripe payment → create customer record |
+| **Custom integrations** | Your app → Twenty automation |
+| **No-code tools** | Zapier, Make, n8n connections |
+
+## Step-by-Step Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it (e.g., "Website Form Submission")
+
+### Step 2: Configure the Webhook Trigger
+
+1. Click on the trigger block
+2. Select **Webhook**
+3. You'll receive a unique webhook URL like:
+ ```
+ https://api.twenty.com/webhooks/workflow/abc123...
+ ```
+4. Copy this URL—you'll need it for your external service
+
+### Step 3: Define Expected Data Structure
+
+For **POST** requests, define the expected body structure:
+
+1. Click **Define expected body**
+2. Enter a sample JSON that matches what your service will send:
+
+```json
+{
+ "firstName": "John",
+ "lastName": "Doe",
+ "email": "john@example.com",
+ "company": "Acme Inc",
+ "message": "Interested in your product"
+}
+```
+
+3. Click **Save**—this creates variables you can use in subsequent steps
+
+### Step 4: Add Actions
+
+Now add actions that use the webhook data:
+
+**Example: Create a Person record**
+
+1. Add **Create Record** action
+2. Select **People** object
+3. Map fields:
+
+| Field | Value |
+| ---------- | ---------------------------------------------------- |
+| First Name | `{{trigger.body.firstName}}` |
+| Last Name | `{{trigger.body.lastName}}` |
+| Email | `{{trigger.body.email}}` |
+| Company | Search or create based on `{{trigger.body.company}}` |
+
+### Step 5: Test the Webhook
+
+Before activating, test your webhook:
+
+**Using cURL**:
+
+```bash
+curl -X POST https://api.twenty.com/webhooks/workflow/abc123... \
+ -H "Content-Type: application/json" \
+ -d '{"firstName":"Test","lastName":"User","email":"test@example.com"}'
+```
+
+**Using Postman or similar**:
+
+1. Create a POST request to your webhook URL
+2. Set Content-Type header to `application/json`
+3. Add your test JSON body
+4. Send and check workflow runs
+
+### Step 6: Activate
+
+Once tested, click **Activate** to make the workflow live.
+
+## Handling Different Data Structures
+
+### Nested Data
+
+If your webhook sends nested data:
+
+```json
+{
+ "contact": {
+ "name": "John Doe",
+ "email": "john@example.com"
+ },
+ "source": "website"
+}
+```
+
+Reference with: `{{trigger.body.contact.email}}`
+
+### Arrays
+
+If data includes arrays:
+
+```json
+{
+ "items": [
+ {"name": "Product A", "qty": 2},
+ {"name": "Product B", "qty": 1}
+ ]
+}
+```
+
+How you handle arrays depends on your use case:
+
+**Unknown number of items → Use Iterator**
+
+If you need to process each item in the array (e.g., create a record for each), add a **Code** action to parse the array, then use **Iterator**:
+
+```javascript
+export const main = async (params: { items: any }) => {
+ const items = typeof params.items === "string"
+ ? JSON.parse(params.items)
+ : params.items;
+ return { items };
+};
+```
+
+Then use Iterator to loop through: `{{code.items}}`
+
+**Known/specific fields → Extract to named fields**
+
+If the array contains specific fields you want to access individually (e.g., form answers where position 0 is always "first name", position 1 is always "last name"), add a **Code** action to extract them:
+
+```javascript
+export const main = async (params: { items: any }) => {
+ const items = typeof params.items === "string"
+ ? JSON.parse(params.items)
+ : params.items;
+
+ return {
+ product: {
+ name: items[0]?.name || "",
+ qty: items[0]?.qty || 0
+ }
+ };
+};
+```
+
+Now you can select `product.name` and `product.qty` individually in subsequent steps.
+
+
+ For more details on handling arrays, see [Handle Arrays in Code Actions](/l/ko/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
+
+
+## Related
+
+* [Workflow Triggers](/l/ko/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx
new file mode 100644
index 0000000000..1c6a086580
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx
@@ -0,0 +1,179 @@
+---
+title: Closed Won Automations
+description: Automate post-win activities when opportunities close.
+---
+
+When a deal closes, multiple things need to happen: update company status, notify team members, create onboarding tasks. Automate all of this with a single workflow.
+
+## The Problem
+
+When an opportunity moves to "Closed Won":
+
+* Company type needs to change from "Prospect" to "Customer"
+* Onboarding tasks need to be created
+* Customer success team needs to be notified
+* Sales rep needs confirmation
+
+Doing this manually is time-consuming and error-prone.
+
+## The Solution
+
+Create a workflow that handles all post-win activities automatically.
+
+## Complete Workflow Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it "Deal Won - Post-Win Automation"
+
+### Step 2: Configure the Trigger
+
+1. Select **Record is Updated**
+2. Choose **Opportunities**
+3. Under "Fields to monitor", select **Stage**
+
+### Step 3: Add Stage Filter
+
+1. Add **Filter** action
+2. Condition: `{{trigger.object.stage}}` equals "Closed Won"
+
+### Step 4: Update Company Type
+
+1. Add **Update Record** action
+2. Configure:
+
+| Field | Value |
+| ------------------- | ------------------------------- |
+| **Object** | Companies |
+| **Record** | `{{trigger.object.company.id}}` |
+| **Type** | Customer |
+| **First Deal Date** | `{{trigger.object.closedAt}}` |
+| **Account Owner** | `{{trigger.object.owner.id}}` |
+
+### Step 5: Create Onboarding Task
+
+1. Add **Create Record** action
+2. Configure:
+
+| Field | Value |
+| ----------------------- | ---------------------------------------------------------------------------------------------------- |
+| **Object** | Tasks |
+| **Title** | `Onboarding: {{trigger.object.name}}` |
+| **Assignee** | Customer Success team member |
+| **Due Date** | 3 days from now |
+| **Priority** | High |
+| **Related Company** | `{{trigger.object.company.id}}` |
+| **Related Opportunity** | `{{trigger.object.id}}` |
+| **Description** | `New customer onboarding for {{trigger.object.company.name}}. Deal value: {{trigger.object.amount}}` |
+
+### Step 6: Notify Customer Success
+
+1. Add **Send Email** action
+2. Configure:
+
+| Field | Value |
+| ----------- | -------------------------------------------------- |
+| **To** | customer-success@yourcompany.com |
+| **Subject** | `🎉 New Customer: {{trigger.object.company.name}}` |
+| **Body** | See example below |
+
+**Email body example**:
+
+```
+Hi CS Team,
+
+We have a new customer!
+
+Company: {{trigger.object.company.name}}
+Deal: {{trigger.object.name}}
+Value: {{trigger.object.amount}}
+Sales Rep: {{trigger.object.owner.name}}
+Close Date: {{trigger.object.closedAt}}
+
+An onboarding task has been created automatically.
+
+Let's give them a great start!
+```
+
+### Step 7: Confirm to Sales Rep
+
+1. Add another **Send Email** action
+2. Configure:
+
+| Field | Value |
+| ----------- | -------------------------------------------------------------------------------------------------------------------- |
+| **To** | `{{trigger.object.owner.email}}` |
+| **Subject** | `✅ Deal Closed: {{trigger.object.name}}` |
+| **Body** | Congratulations! Your deal has been processed. The customer success team has been notified and onboarding has begun. |
+
+### Step 8: Test and Activate
+
+1. Test by moving a test opportunity to "Closed Won"
+2. Verify:
+ * Company type changed to "Customer"
+ * Onboarding task created
+ * CS team received email
+ * Sales rep received confirmation
+3. Activate when ready
+
+## Handling Closed Lost
+
+Create a similar workflow for lost deals:
+
+### Trigger
+
+* Record is Updated (Opportunities, Stage = "Closed Lost")
+
+### Actions
+
+1. **Create Record**: Task for "Lost Deal Analysis"
+2. **Update Record**: Add lost reason to company record
+3. **Send Email**: Notify manager of lost deal
+
+## Advanced: Multi-Step Onboarding
+
+For complex onboarding, create multiple tasks:
+
+```javascript
+export const main = async (params) => {
+ const tasks = [
+ { title: "Welcome call", daysFromNow: 1, assignee: "CS" },
+ { title: "Send onboarding materials", daysFromNow: 2, assignee: "CS" },
+ { title: "Technical setup", daysFromNow: 5, assignee: "Support" },
+ { title: "30-day check-in", daysFromNow: 30, assignee: "CS" }
+ ];
+
+ return { tasks };
+};
+```
+
+Use **Iterator** to create each task from the array.
+
+## Customization Ideas
+
+### Keep your other tools up-to-date
+
+* Create customer in billing system with an **HTTP Request**
+
+### Conditional Actions
+
+Use **Filter** actions to:
+
+* Different onboarding for enterprise vs SMB
+* Different assignees based on region
+* Skip notifications for small deals
+
+### Include Deal Details
+
+Use **Code** action to format:
+
+* Deal summary documents
+* Handoff notes for CS team
+* Custom onboarding checklists
+
+## Related
+
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/ko/user-guide/workflows/capabilities/send-emails-from-workflows)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx
new file mode 100644
index 0000000000..595c13e569
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx
@@ -0,0 +1,136 @@
+---
+title: Detect Stale Opportunities
+description: Automatically notify managers when opportunities haven't been updated.
+---
+
+Keep your pipeline healthy by alerting managers when opportunities go stale. This workflow checks for opportunities that haven't been updated in a specified number of days.
+
+## The Problem
+
+Opportunities sitting without updates lead to:
+
+* Deals going cold
+* Unreliable forecasts
+* Lost revenue
+
+## The Solution
+
+Create a scheduled workflow that finds stale opportunities and emails their managers.
+
+## Step-by-Step Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it "Stale Opportunity Alert"
+
+### Step 2: Configure the Trigger
+
+1. Select **On a Schedule**
+2. Set to run daily (e.g., every day at 8 AM)
+
+### Step 3: Search for Stale Opportunities
+
+1. Add **Search Records** action
+2. Configure:
+
+| Field | Value |
+| ---------- | ----------------------------------------------- |
+| **Object** | Opportunities |
+| **Filter** | Updated At is before (today - 7 days) |
+| **Filter** | Stage is not "Closed Won" AND not "Closed Lost" |
+| **Limit** | 100 |
+
+### Step 4: Check If Any Found
+
+1. Add **Filter** action
+2. Condition: `{{searchRecords.length}}` is greater than 0
+3. If no stale opportunities, the workflow stops here
+
+### Step 5: Format the Alert (Code Action)
+
+Add a **Code** action to format the email:
+
+```javascript
+export const main = async (params) => {
+ const opportunities = params.opportunities;
+
+ // Group opportunities by owner
+ const byOwner = {};
+ opportunities.forEach(opp => {
+ const ownerEmail = opp.owner?.email || 'unassigned';
+ if (!byOwner[ownerEmail]) {
+ byOwner[ownerEmail] = [];
+ }
+ byOwner[ownerEmail].push({
+ name: opp.name,
+ amount: opp.amount,
+ lastUpdated: opp.updatedAt,
+ stage: opp.stage
+ });
+ });
+
+ // Format summary for manager
+ let summary = "Stale Opportunities Report\n\n";
+ Object.entries(byOwner).forEach(([owner, opps]) => {
+ summary += `${owner}: ${opps.length} stale opportunities\n`;
+ opps.forEach(opp => {
+ summary += ` - ${opp.name} (${opp.stage})\n`;
+ });
+ summary += "\n";
+ });
+
+ return {
+ summary,
+ totalCount: opportunities.length
+ };
+};
+```
+
+### Step 6: Send Alert Email
+
+Add **Send Email** action:
+
+| Field | Value |
+| ----------- | ----------------------------------------------------------- |
+| **To** | sales-manager@yourcompany.com |
+| **Subject** | `🚨 {{code.totalCount}} Stale Opportunities Need Attention` |
+| **Body** | `{{code.summary}}` |
+
+### Step 7: Test and Activate
+
+1. Click **Test** to run the workflow
+2. Check that the email contains the right data
+3. Activate when ready
+
+## Customization Options
+
+### Change Staleness Threshold
+
+Modify the Search Records filter to change from 7 days to your preferred period:
+
+* 3 days for high-velocity sales
+* 14 days for enterprise deals
+* 30 days for long sales cycles
+
+### Alert Individual Reps
+
+Instead of one manager email, use **Iterator** to send personalized emails to each rep about their own stale deals.
+
+### Add Escalation
+
+Create multiple workflows with increasing severity:
+
+1. Day 7: Email to rep
+2. Day 14: Email to rep + manager
+3. Day 21: Create task for manager to intervene
+
+### Include in Slack
+
+Use **HTTP Request** to post to a Slack webhook instead of or in addition to email.
+
+## Related
+
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/ko/user-guide/workflows/capabilities/send-emails-from-workflows)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
new file mode 100644
index 0000000000..e29100fe45
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
@@ -0,0 +1,74 @@
+---
+title: Display Number of Emails Received
+description: Create a workflow to automatically count and display the number of emails received from each contact.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+## Overview
+
+This workflow triggers every time a new email is received and updates a custom field on the Person record with the total count of emails from that sender.
+
+## Prerequisites
+
+Before setting up this workflow, create a custom field on the **People** object:
+
+1. Go to **Settings → Data Model → People**
+2. Add a new **Number** field
+3. Name it something like "Number of emails received from this person"
+
+## Step-by-Step Setup
+
+
+
+### Step 1: Configure the Trigger
+
+1. Go to **Workflows** and create a new workflow
+2. Select **Record is Created** as the trigger
+3. Choose **Message Participants** (available under Advanced objects)
+
+
+ A Message Participant is a combination of a message ID and a person ID, creating one unique record per message. This is easier to track than Messages directly because we can access the `handle` field, which contains the sender's (or recipient's) email address.
+
+
+### Step 2: Filter on Role
+
+1. Add a **Filter** action
+2. Set the condition: **Role** equals **FROM**
+
+This ensures you only count messages sent by this person, not messages sent to them.
+
+### Step 3: Search All Message Participants with Same Handle
+
+1. Add a **Search Records** action
+2. Select **Message Participants** as the object
+3. Add filters: **Handle** equals the handle from the trigger (the sender's email address) and **Role** equals **FROM**
+4. Increase the **Limit** from 1 to **200** (the maximum)
+
+This finds all messages from this email address to get the total count.
+
+
+ The Search Records action is limited to returning 200 records maximum. However, since you're only using the `totalCount` value (not the individual records), this step will return the total number of emails sent by this person.
+
+
+### Step 4: Update the Person Record with a Create or Update Record action
+
+1. Add a **Create or Update Record** action
+
+
+ Use **Upsert Record** instead of **Update Record** here. This lets you identify the person by their email address (the `handle` field) rather than requiring a record ID from a previous step.
+
+
+2. Select **People** as the object
+3. Find the person by matching their email to the `handle` from the Message Participant
+4. Set your custom "Number of emails received" field to `{{searchRecords.totalCount}}`
+
+The `totalCount` value from the Search Records action represents the total number of emails received from this person.
+
+## Related
+
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions)
+* [Create Custom Fields](/l/ko/user-guide/data-model/how-tos/customize-your-data-model)
+* [Search Records Action](/l/ko/user-guide/workflows/capabilities/workflow-actions#search-records)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx
new file mode 100644
index 0000000000..797f64faf5
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx
@@ -0,0 +1,170 @@
+---
+title: Display Related Record Data
+description: Show data from related records (e.g., Company info on Opportunities) using workflows.
+---
+
+Display data from related records directly on your records — for example, show the employee count from a Company on its Opportunities. This workflow workaround is useful until nested fields are natively available.
+
+## Common Use Cases
+
+| Source | Destination | Fields to Copy |
+| ----------- | ----------- | ------------------------------- |
+| Company | Opportunity | Industry, Company Size, ARR |
+| Person | Opportunity | Email, Phone, Title |
+| Opportunity | Company | Last Deal Amount, Last Won Date |
+
+## Basic Field Copy
+
+### Example: Copy Contact Email to Opportunity
+
+**Goal**: When setting a Point of Contact on an opportunity, copy their email to the opportunity for easy access.
+
+### Prerequisite
+
+Create the destination fields in **Settings → Data Model → Opportunities** before building the workflow:
+
+* Contact Email (type: Email)
+* Contact Phone (type: Phone)
+
+### Setup
+
+1. **Trigger**: Record is Updated (Opportunities, Point of Contact field)
+
+2. **Filter**: Check that Point of Contact is not empty
+
+3. **Search Records**: Find the linked person
+ * Object: People
+ * Filter: ID equals `{{trigger.object.pointOfContact.id}}`
+
+4. **Update Record**:
+ * Object: Opportunities
+ * Record: `{{trigger.object.id}}`
+ * Contact Email: `{{searchRecords[0].email}}`
+ * Contact Phone: `{{searchRecords[0].phone}}`
+
+## Copy Multiple Fields
+
+### Example: Sync Company Info to All Related Opportunities
+
+**Goal**: When company details change, update all related opportunities.
+
+### Setup
+
+1. **Trigger**: Record is Updated (Companies)
+ * Fields: Industry, Company Size, Annual Revenue
+
+2. **Search Records**: Find all opportunities for this company
+ * Object: Opportunities
+ * Filter: Company ID equals `{{trigger.object.id}}`
+
+3. **Iterator**: Loop through each opportunity
+
+4. **Update Record** (inside iterator):
+ * Object: Opportunities
+ * Record: `{{iterator.currentItem.id}}`
+ * Company Industry: `{{trigger.object.industry}}`
+ * Company Size: `{{trigger.object.companySize}}`
+ * Company ARR: `{{trigger.object.annualRevenue}}`
+
+## Copy on Record Creation
+
+### Example: Pre-fill Opportunity with Company Data
+
+**Goal**: When creating an opportunity linked to a company, automatically copy key company info.
+
+### Prerequisite
+
+Create the destination fields in **Settings → Data Model → Opportunities**:
+
+* Company Industry (type: Text)
+* Company Size (type: Number)
+
+### Setup
+
+1. **Trigger**: Record is Created (Opportunities)
+ * Filter: Company is not empty
+
+2. **Search Records**: Get the linked company's details
+ * Object: Companies
+ * Filter: ID equals `{{trigger.object.company.id}}`
+
+3. **Update Record**:
+ * Object: Opportunities
+ * Record: `{{trigger.object.id}}`
+ * Company Industry: `{{searchRecords[0].industry}}`
+ * Company Size: `{{searchRecords[0].employees}}`
+
+
+ **Tasks and Notes limitation**: Relations on Tasks and Notes are hardcoded as many-to-many and are not yet available in workflow triggers or actions. To access these relations, use the [API](/l/ko/developers/extend/capabilities/apis) instead.
+
+
+## Bidirectional Sync
+
+### Example: Keep Primary Contact in Sync
+
+**Goal**: When a company's primary contact changes, update the contact. When a person becomes primary, update the company.
+
+### Workflow 1: Company → Person
+
+1. **Trigger**: Record is Updated (Companies, Primary Contact field)
+2. **Update Record**: Set person's "Is Primary Contact" to true
+3. **Search Records**: Find previous primary contact
+4. **Update Record**: Set previous contact's "Is Primary Contact" to false
+
+### Workflow 2: Person → Company
+
+1. **Trigger**: Record is Updated (People, Is Primary Contact = true)
+2. **Update Record**: Set company's Primary Contact to this person
+
+
+ Be careful with bidirectional syncs to avoid infinite loops. Use filters to check if the value actually changed before updating.
+
+
+## Using Code for Complex Mapping
+
+### Example: Transform Data During Copy
+
+**Goal**: Copy and format phone number from person to opportunity.
+
+```javascript
+export const main = async (params) => {
+ const { phone } = params;
+
+ if (!phone) return { formattedPhone: null };
+
+ // Remove non-numeric characters
+ const digits = phone.replace(/\D/g, '');
+
+ // Format as (XXX) XXX-XXXX
+ const formatted = digits.length === 10
+ ? `(${digits.slice(0,3)}) ${digits.slice(3,6)}-${digits.slice(6)}`
+ : phone;
+
+ return { formattedPhone: formatted };
+};
+```
+
+## Best Practices
+
+### Avoid Loops
+
+* Don't create workflows that trigger each other endlessly
+* Use specific field conditions
+* Add checks to see if value actually changed
+
+### Handle Missing Data
+
+* Always check if source record exists before copying
+* Provide default values for optional fields
+* Use filters to skip when source field is empty
+
+### Performance
+
+* Batch updates when copying to many records
+* Use scheduled workflows for bulk sync operations
+* Consider using Iterator for multiple record updates
+
+## Related
+
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions)
+* [Workflow Triggers](/l/ko/user-guide/workflows/capabilities/workflow-triggers)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx
new file mode 100644
index 0000000000..177af6832d
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx
@@ -0,0 +1,202 @@
+---
+title: Formula Fields
+description: Create formula fields using workflows until native support is available.
+---
+
+Twenty doesn't yet support native formula fields yet (coming in 2026), but you can achieve the same result using workflows. This workaround lets you automatically calculate and populate field values—from simple concatenations to complex business logic.
+
+## Common Use Cases
+
+| Use Case | Formula Example |
+| ------------------- | --------------------------------- |
+| **Full name** | First Name + " " + Last Name |
+| **Expected amount** | Amount × Probability |
+| **Days until due** | Due Date - Today |
+| **Days in stage** | Today - Stage Entry Date |
+| **Lead score** | Points based on multiple criteria |
+
+
+ For a complete example of tracking time in pipeline stages, see [Track How Long Opportunities Stay in Each Stage](/l/ko/user-guide/views-pipelines/how-tos/track-time-in-stage).
+
+
+## Basic Formula: Concatenation
+
+### Example: Auto-Fill Full Name
+
+**Goal**: Automatically combine first and last name into a full name field.
+
+### Setup
+
+1. **Trigger**: Record is Updated or Created (People)
+
+2. **Filter**: Check that first name or last name changed
+
+3. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { firstName, lastName } = params;
+
+ const fullName = [firstName, lastName]
+ .filter(Boolean)
+ .join(' ');
+
+ return { fullName };
+};
+```
+
+4. **Update Record**: Set Full Name to `{{code.fullName}}`
+
+## Numeric Formula: Expected Amount
+
+### Example: Calculate Expected Revenue
+
+**Goal**: Multiply opportunity amount by probability to get expected amount.
+
+See [How to Show Expected Amount in Pipeline](/l/ko/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline) for the complete workflow.
+
+### Quick Setup
+
+1. **Trigger**: Record is Updated (Opportunities, Amount OR Probability field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { amount, probability } = params;
+
+ const expectedAmount = (amount || 0) * (probability || 0) / 100;
+
+ return { expectedAmount };
+};
+```
+
+3. **Update Record**: Set Expected Amount to `{{code.expectedAmount}}`
+
+## Date Formula: Days Calculation
+
+### Example: Days Until Task Due
+
+**Goal**: Calculate how many days remain until a task's due date.
+
+### Setup
+
+1. **Trigger**: Record is Updated or Created (Tasks, Due Date field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { dueDate } = params;
+
+ if (!dueDate) {
+ return { daysUntilDue: null };
+ }
+
+ const due = new Date(dueDate);
+ const today = new Date();
+ const diffTime = due - today;
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return { daysUntilDue: diffDays };
+};
+```
+
+3. **Update Record**: Set Days Until Due to `{{code.daysUntilDue}}`
+
+
+ Negative values indicate overdue tasks. You can use this field to filter or sort tasks by urgency.
+
+
+## Conditional Formula: Lead Score
+
+### Example: Calculate Lead Score Based on Criteria
+
+**Goal**: Score leads based on company size, industry, and engagement.
+
+### Setup
+
+1. **Trigger**: Record is Updated (People or Companies)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { companySize, industry, hasEmail, hasPhone, source } = params;
+
+ let score = 0;
+
+ // Company size scoring
+ if (companySize === 'Enterprise') score += 30;
+ else if (companySize === 'Mid-Market') score += 20;
+ else if (companySize === 'SMB') score += 10;
+
+ // Industry scoring
+ const targetIndustries = ['Technology', 'Finance', 'Healthcare'];
+ if (targetIndustries.includes(industry)) score += 25;
+
+ // Contact info scoring
+ if (hasEmail) score += 10;
+ if (hasPhone) score += 15;
+
+ // Source scoring
+ if (source === 'Referral') score += 20;
+ else if (source === 'Website') score += 10;
+
+ return { leadScore: score };
+};
+```
+
+3. **Update Record**: Set Lead Score to `{{code.leadScore}}`
+
+## Text Formula: Domain Extraction
+
+### Example: Extract Domain from Email
+
+**Goal**: Automatically extract and store the email domain.
+
+### Setup
+
+1. **Trigger**: Record is Updated (People, Email field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { email } = params;
+
+ if (!email) return { domain: null };
+
+ const domain = email.split('@')[1]?.toLowerCase();
+
+ return { domain };
+};
+```
+
+3. **Update Record**: Set Domain field to `{{code.domain}}`
+
+## Best Practices
+
+### Performance
+
+* Only trigger on relevant field changes
+* Use filters to skip records that don't need calculation
+* Avoid complex calculations in high-volume workflows
+
+### Error Handling
+
+* Check for null/undefined values before calculations
+* Use default values when data is missing
+* Return clear error messages when calculations fail
+
+### Testing
+
+* Test with edge cases (empty fields, zero values)
+* Verify calculations manually before activating
+* Monitor workflow runs for unexpected results
+
+## Related
+
+* [How to Show Expected Amount in Pipeline](/l/ko/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline)
+* [How to Track Time in Stage](/l/ko/user-guide/views-pipelines/how-tos/track-time-in-stage)
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
new file mode 100644
index 0000000000..ff62dc2b2a
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
@@ -0,0 +1,106 @@
+---
+title: Send Email Alerts with Tasks Due
+description: Automatically notify team members about their upcoming or overdue tasks.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+Send daily email reminders to each team member about their tasks due today.
+
+## Overview
+
+This workflow runs on a schedule and:
+
+1. Fetches all workspace members
+2. Loops through each member
+3. Finds their tasks due today
+4. Formats and sends a personalized email
+
+## Step-by-Step Setup
+
+
+
+### Step 1: Configure the Trigger
+
+1. Go to **Settings → Workflows** and create a new workflow
+2. Select **On a Schedule** as the trigger
+3. Use a cron expression for daily at 8:00 AM: `0 8 * * *`
+
+### Step 2: Search for All Workspace Members
+
+1. Add a **Search Records** action
+2. Select **Workspace Members** (under advanced objects)
+3. No filters needed — this returns all members
+
+### Step 3: Add an Iterator
+
+1. Add an **Iterator** action
+2. Set the input array to the workspace members from the previous step
+3. All actions inside the iterator will run once per member
+
+### Step 4: Search for Tasks Due Today (Inside Iterator)
+
+1. Inside the iterator, add a **Search Records** action
+2. Select **Tasks** as the object
+3. Add filters:
+ * **Assignee** = current workspace member (from the iterator)
+ * **Due Date** = today
+
+### Step 5: Format Tasks into Email Body (Inside Iterator)
+
+Add a **Code** action to format the tasks into a readable list with links:
+
+```javascript
+export const main = async (params: {
+ tasksDue?: Array<{ id: string; title: string }> | null | string;
+}) => {
+ const tasksDue =
+ typeof params.tasksDue === "string"
+ ? JSON.parse(params.tasksDue)
+ : params.tasksDue;
+
+ if (!Array.isArray(tasksDue) || tasksDue.length === 0) {
+ return {
+ formattedTasks: "No tasks due today."
+ };
+ }
+
+ const formattedTasks = tasksDue
+ .map(
+ t =>
+ `${t.title}\nhttps://yourSubDomain.twenty.com/object/task/${t.id}`
+ )
+ .join("\n\n");
+
+ return { formattedTasks };
+};
+```
+
+
+ Replace `yourSubDomain` with your actual Twenty workspace subdomain.
+
+
+### Step 6: Send Email (Inside Iterator)
+
+1. Add a **Send Email** action (still inside the iterator)
+2. Configure:
+
+| Field | Value |
+| ----------- | --------------------------------------------------------------- |
+| **To** | `{{iterator.currentItem.userEmail}}` (workspace member's email) |
+| **Subject** | Your Tasks Due Today |
+| **Body** | `{{code.formattedTasks}}` |
+
+### Step 7: Test and Activate
+
+1. Click **Test** to run the workflow manually
+2. Check inboxes for the emails
+3. Activate the workflow
+
+## Related
+
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/ko/user-guide/workflows/capabilities/send-emails-from-workflows)
+* [Handle Arrays in Code Actions](/l/ko/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/need-more-help/professional-services.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
new file mode 100644
index 0000000000..674ca6229f
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
@@ -0,0 +1,29 @@
+---
+title: Professional Services
+description: Get professional help building complex workflows and automations from Twenty's team and certified partners.
+---
+
+## When Do You Need Professional Help?
+
+Consider professional services for:
+
+* Complex multi-system integrations
+* Advanced business logic and automation rules
+* Large-scale data processing workflows
+* Custom API development
+* Team training and workflow optimization
+* When you don't have internal resources
+
+## Service Options
+
+### Onboarding Packs
+
+Get help from our core team with our 4-hour [Onboarding packs](https://twenty.com/onboarding-packages):
+
+* **Workflow Creation**: Build custom workflows for your business processes
+* **Data Model Design**: Optimize your data structure for workflow automation
+* **Data Migration**: Import existing data with proper workflow integration
+
+### Implementation Partners
+
+Work with certified partners for advanced customizations. Contact us at contact@twenty.com to connect with our [implementation partners](https://twenty.com/partners).
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx
new file mode 100644
index 0000000000..b243fc4acb
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx
@@ -0,0 +1,170 @@
+---
+title: Workflow Troubleshooting
+description: Common workflow issues and how to resolve them.
+---
+
+## Common Issues and Solutions
+
+### Workflow Not Triggering
+
+**Symptoms**: Your workflow doesn't run when you expect it to.
+
+**Possible Causes**:
+
+1. **Workflow not activated**: Ensure the workflow is set to "Active" not "Draft"
+2. **Trigger conditions not met**: Verify the trigger matches your expected event
+3. **Field not monitored**: For "Record is Updated" triggers, ensure the specific field is being watched
+4. **Permissions**: Check you have permission to run workflows
+
+**Solutions**:
+
+* Verify workflow status in the workflow list
+* Test with the specific action you expect to trigger it
+* Review trigger configuration
+* Contact your admin about permissions
+
+### Workflow Triggers Too Early (Empty Fields)
+
+**Symptoms**: When manually creating a record in the UI, your workflow triggers before you've had time to fill in all the fields. The workflow runs with mostly empty field values.
+
+**Why this happens**: Twenty saves everything in real-time — there's no separate "edit" vs "read" mode. When you create a record, it's saved immediately, triggering the "Record is created" event before you can fill in additional fields.
+
+**When "Record is created" works well**:
+
+* Records created via API calls (fields are populated in a single request)
+* Records created via import
+* Automated record creation from other workflows
+
+**Solution**: For records created manually in the UI, use **"Record is created or updated"** as your trigger instead. This way:
+
+* The workflow triggers after the user has finished filling in and saving the fields
+* You get the complete data rather than empty values
+
+
+ If you only want the workflow to run once per record, add a Filter action to check a field like `createdAt equals updatedAt` (first save) or use a custom checkbox field to track if the workflow has already run.
+
+
+### Actions Failing
+
+**Symptoms**: Workflow runs but some actions fail.
+
+**Possible Causes**:
+
+1. **Missing data**: Required fields are empty
+2. **Invalid references**: Variables from previous steps don't exist
+3. **API errors**: External services returning errors
+4. **Permission issues**: Action requires permissions you don't have
+
+**Solutions**:
+
+* Check the workflow run details for error messages
+* Verify all required fields have values
+* Test API connections independently
+* Review role permissions
+
+### HTTP Request Errors
+
+**Symptoms**: HTTP Request actions fail or return unexpected results.
+
+**Common Error Codes**:
+
+* **400**: Bad request - check your request body format
+* **401**: Unauthorized - verify API key
+* **403**: Forbidden - check API permissions
+* **404**: Not found - verify endpoint URL
+* **429**: Too many requests - implement rate limiting
+* **500**: Server error - external service issue
+
+**Solutions**:
+
+* Verify API endpoint URL
+* Check authentication headers
+* Test the API call outside of Twenty first
+* Add error handling in Code actions
+
+### Code Action Errors
+
+**Symptoms**: JavaScript code fails to execute.
+
+**Common Issues**:
+
+1. **Syntax errors**: Typos or invalid JavaScript
+2. **Undefined variables**: Referencing variables that don't exist
+3. **Type errors**: Operations on wrong data types
+4. **Timeouts**: Code taking too long to execute
+
+**Solutions**:
+
+* Use the built-in code editor validation
+* Test code logic in a JavaScript console first
+* Add console.log statements for debugging
+* Simplify complex operations
+
+### Email Not Sending
+
+**Symptoms**: Send Email action doesn't deliver emails.
+
+**Possible Causes**:
+
+1. **No email account connected**: Check Settings → Accounts
+2. **Invalid email address**: Recipient email is malformed
+3. **Sending limits**: Email provider rate limits reached
+4. **Spam filters**: Emails being blocked
+
+**Solutions**:
+
+* Verify email account connection
+* Validate recipient email addresses
+* Check email provider limits
+* Review email content for spam triggers
+
+## Debugging Workflows
+
+### Using Workflow Runs
+
+1. Go to the workflow editor
+2. Open the **Runs** panel
+3. Find the failed run
+4. Click to see step-by-step details
+5. Review error messages and output data
+
+### Testing Individual Steps
+
+1. For Code actions, use the **Test** button
+2. For HTTP requests, test the endpoint separately
+3. Create test records to trigger workflows
+4. Use manual triggers for controlled testing
+
+### Common Debugging Patterns
+
+**Add logging**:
+Use Code actions to log intermediate values for debugging.
+
+**Isolate steps**:
+Test each step independently to identify failures.
+
+**Check data flow**:
+Verify that each step receives the expected input data.
+
+## Best Practices to Avoid Issues
+
+### Before Activation
+
+* Test thoroughly in draft mode
+* Validate all API connections
+* Review trigger conditions carefully
+* Document expected behavior
+
+### During Development
+
+* Use descriptive step names
+* Add comments in Code actions
+* Test with realistic data
+* Plan for edge cases
+
+### After Activation
+
+* Monitor initial runs closely
+* Set up alerts for failures
+* Review run history regularly
+* Keep workflows simple when possible
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx
new file mode 100644
index 0000000000..40c57d02c7
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx
@@ -0,0 +1,254 @@
+---
+title: Workflows FAQ
+description: Frequently asked questions about workflows in Twenty.
+---
+
+
+
+ This is likely a permissions issue. You need access to workflows to create and activate them.
+
+ **Solution**: Contact your workspace administrator to grant you workflow access under **Settings → Roles**.
+
+ If you don't see the Workflows section at all in your sidebar, this confirms it's a permissions issue.
+
+
+
+ Manual workflows only appear in the navbar if properly configured:
+
+ 1. The workflow must be **activated** (not in draft mode)
+ 2. The navbar placement must be set to **Pinned**
+ 3. For Single/Bulk triggers, you must be on the correct object page
+
+ **To check**: Open the workflow → click the trigger → verify "Navbar placement" is set to "Pinned".
+
+ You can always access manual workflows via **Cmd + K** (or **Ctrl + K**) regardless of navbar settings.
+
+
+
+ | Type | Records Required | Workflow Runs |
+ | ---- | ---------------- | ------------- |
+
+ \| **Global** | None | Once, no record input |
+ \| **Single** | One or more selected | Once per selected record |
+ \| **Bulk** | One or more selected | Once, with all records as array |
+
+ * **Global**: Use when the workflow doesn't need any record context (e.g., generate a report)
+ * **Single**: Use when you want to process each selected record independently (e.g., send individual emails)
+ * **Bulk**: Use when you need to process records together or optimize credit usage (requires Iterator action)
+
+ See [Workflow Triggers](/l/ko/user-guide/workflows/capabilities/workflow-triggers) for details.
+
+
+
+ An explicit If/Else node is not yet available but is on our roadmap.
+
+ **Current workaround**: Create multiple branches from your step, each starting with a **Filter** action:
+
+ ```
+ Step 1
+ │
+ ├── Branch A: Filter (condition = true) → Actions...
+ │
+ └── Branch B: Filter (condition = false) → Actions...
+ ```
+
+ Only the branch where the filter condition passes will execute its subsequent actions.
+
+ See [How to Use Branches](/l/ko/user-guide/workflows/capabilities/workflow-branches) for a step-by-step guide.
+
+
+
+ **Yes**, branches run in parallel by default.
+
+ If you want only one branch to execute:
+
+ * Add a **Filter** action at the start of each branch
+ * Set opposite conditions (e.g., Branch A: status = "Open", Branch B: status ≠ "Open")
+
+ Branches that fail their filter condition stop executing, while others continue.
+
+
+
+ **Yes**. After your parallel branches complete, you can add a step that both branches connect to.
+
+ In the workflow editor:
+
+ 1. Complete your branched actions
+ 2. Add a new step after the branches
+ 3. Drag connections from the end of each branch to this new step
+
+ The merged step will execute after all connected branches complete.
+
+
+
+ **Search Records returns a maximum of 200 records.**
+
+ If you need to process more:
+
+ * Add more specific filters to reduce results
+ * Use scheduled workflows to process in batches
+ * Consider using the API for bulk operations
+
+ For most workflows, 200 records is sufficient. If you regularly hit this limit, consider restructuring your automation.
+
+
+
+ **Not yet.** CC and BCC fields for the Send Email action are on our roadmap.
+
+ **Current workaround**: Add multiple Send Email actions to send to additional recipients, or use an HTTP Request to send via an external email service that supports CC.
+
+
+
+ Every action produces output data that can be used in subsequent steps.
+
+ **To reference previous step data**:
+
+ * Use the variable picker when configuring a field
+ * Or type `{{stepName.fieldName}}` directly
+
+ **Examples**:
+
+ * Trigger data: `{{trigger.object.email}}`
+ * Search results: `{{searchRecords[0].name}}`
+ * Code output: `{{code.calculatedValue}}`
+
+ Hover over any field in the action configuration to see available variables from previous steps.
+
+
+
+ **Iterator requires an array input.** Common issues:
+
+ 1. **Input is not an array**: Ensure you're passing results from Search Records or another action that returns an array
+ 2. **Array is empty**: Add a filter before Iterator to check `{{searchRecords.length}} > 0`
+ 3. **Wrong variable selected**: Make sure you select the array itself, not a single record
+
+ **Correct setup**:
+
+ 1. Search Records (returns array)
+ 2. Filter: length > 0
+ 3. Iterator: select `{{searchRecords}}`
+ 4. Actions inside iterator use `{{iterator.currentItem.fieldName}}`
+
+
+
+ Code actions (serverless functions) have a **default timeout of 5 minutes** (300 seconds).
+
+ The maximum configurable timeout is **15 minutes** (900 seconds).
+
+ If your code exceeds this limit, the action will fail with a timeout error.
+
+ **Tips to avoid timeouts**:
+
+ * Break large operations into smaller chunks using Iterator
+ * Avoid heavy computations; use external services via HTTP Request for intensive processing
+ * Optimize your code to reduce execution time
+ * If you need longer processing, consider using scheduled workflows that process data in batches
+
+
+
+ Workflow runs show the execution history and help you debug issues.
+
+ **Access runs**:
+
+ * In workflow editor → **Runs** panel on the right
+ * Or go to **Workflow Runs** in the sidebar
+
+ **Understanding a run**:
+
+ * **Status**: Running, Completed, Failed, Waiting
+ * **Steps**: See which steps executed and their output
+ * **Errors**: Click failed steps to see error messages
+ * **Data**: View input/output data at each step
+
+ See [Workflow Runs](/l/ko/user-guide/workflows/capabilities/workflow-runs) for details.
+
+
+
+ Workflow runs might be failing immediately due to rate limits.
+
+ **Hard limit: 5,000 runs per hour per workspace.**
+
+ If you exceed this limit, workflows are immediately marked as failed and won't appear in your runs list as expected.
+
+ **Common scenarios that hit this limit**:
+
+ * Selecting more than 5,000 records with a Single manual trigger
+ * Multiple workflows running simultaneously across your workspace
+ * High-frequency automated triggers (e.g., Record Updated on a busy object)
+
+ **Solutions**:
+
+ * Use **Bulk** triggers instead of Single to process many records in one run
+ * Space out large batch operations
+ * Use filters to reduce trigger frequency
+ * Schedule heavy workflows during off-peak hours
+
+
+
+ Twenty has two rate limits to ensure system stability:
+
+ | Limit | Value | Behavior |
+ | ----- | ----- | -------- |
+
+ \| **Soft limit** | 100 runs/minute | Runs queue in "Not Started" status, processed gradually |
+ \| **Hard limit** | 5,000 runs/hour | Runs immediately fail |
+
+ **Soft limit (100/min)**: Your workflows won't fail—they just wait in the queue and are processed over time. You can trigger more than 100 records; execution will be slower.
+
+ **Hard limit (5,000/hr)**: This applies to your entire workspace. If all your workflows combined exceed 5,000 runs in an hour, additional runs will fail immediately.
+
+ **Tips to stay within limits**:
+
+ * Use Bulk triggers with Iterator instead of Single triggers for large batches
+ * Combine related automations into fewer workflows
+ * Use scheduled workflows to spread load over time
+
+
+
+ **No, there is no automatic retry functionality at the moment.**
+
+ If a workflow run fails, you'll need to:
+
+ 1. Review the error in **Settings → Workflows → [Your Workflow] → Runs**
+ 2. Fix the issue (data, configuration, or external service)
+ 3. Manually trigger the workflow again on the affected record(s)
+
+ **Tips to reduce failures**:
+
+ * Add **Filter** nodes to validate data before actions
+ * Use **Search Records** to check if related records exist
+ * Test thoroughly with a few records before bulk operations
+
+ Automatic retry functionality is on our roadmap for a future release.
+
+
+
+ **Yes, if your workflows are triggered by record creation or updates.**
+
+ When you import data via CSV, each record created or updated can trigger workflows. A large import (thousands of records) could:
+
+ * Hit the 5,000 runs/hour limit
+ * Consume significant workflow credits
+ * Send unexpected emails or notifications
+ * Create duplicate tasks or records
+
+ **Before a mass import**:
+
+ 1. Go to **Settings → Workflows**
+ 2. Identify workflows triggered by the object you're importing
+ 3. **Deactivate** them temporarily
+ 4. Run your CSV import
+ 5. **Reactivate** the workflows when done
+
+ **Alternative**: If you need the workflows to run on imported data, import in smaller batches to stay within rate limits.
+
+
+
+ If your workflow canvas looks messy with nodes scattered around, you can automatically organize it:
+
+ 1. Right-click anywhere on the workflow canvas
+ 2. Click **Tidy up workflow**
+
+ This will automatically rearrange all nodes into a clean, organized layout.
+
+
diff --git a/packages/twenty-docs/l/ko/user-guide/workflows/overview.mdx b/packages/twenty-docs/l/ko/user-guide/workflows/overview.mdx
new file mode 100644
index 0000000000..541776acb7
--- /dev/null
+++ b/packages/twenty-docs/l/ko/user-guide/workflows/overview.mdx
@@ -0,0 +1,80 @@
+---
+title: Workflows
+description: Learn how to build automations in Twenty.
+image: /images/user-guide/workflows/workflow.png
+---
+
+
+
+
+
+## Why Workflows Matter
+
+Twenty was built to bring maximum flexibility to its users. Rather than forcing you to adapt your business processes to rigid, pre-built features, workflows enable you to build automations that create the CRM that best supports your unique business use cases.
+
+Workflows are Twenty's in-app feature for building these automations. They give you the building blocks to create exactly what your business needs, when it needs it.
+
+## What can I do with workflows?
+
+We recommend building automations for two main purposes:
+
+1. **Internal automations to facilitate your team's day-to-day**: Reduce the amount of manual entries and repetitive tasks that slow down your team.
+2. **Bring data in and out of Twenty**: Connect Twenty via API calls and webhooks to your database and other tools.
+
+## Building Your First Workflow
+
+### Step 1: Create a New Workflow
+
+1. Go to **Workflows** accessible below the other objects
+2. Click **+ New Record**
+3. Give your workflow a name
+
+### Step 2: Add a Trigger
+
+Every workflow starts with a trigger. Choose from:
+
+* **Record events**: When a record is created, updated, or deleted
+* **Schedule**: Run at specific times (daily, weekly, etc.)
+* **Manual**: Triggered by a user action
+* **Webhook**: Triggered by a webhook
+
+
+
+### Step 3: Add Actions
+
+After your trigger, add one or more actions:
+
+* **Create Record**: Add new records to any object
+* **Update Record**: Modify existing record data
+* **Delete Record**: Remove records from objects
+* **Search Records**: Find records matching criteria
+* **Upsert Record**: Create or update based on matching criteria
+* **Iterator**: Loop through arrays of records
+* **Filter**: Control which records proceed
+* **Delay**: Wait before continuing (duration or scheduled date)
+* **Send Email**: Send emails via your connected account
+* **Code**: Run custom JavaScript
+* **HTTP Request**: Call external APIs
+* **Form**: Get inputs from users within Twenty UI at the time of execution
+* **AI Agent** (Coming soon): Run intelligent AI tasks
+
+
+
+### Step 4: Test and Activate
+
+1. Use the **Test** button to run your workflow with sample data
+2. Review the results to ensure it works as expected
+3. Toggle the workflow **Active** when ready
+
+## Workflow Best Practices
+
+* **Edit step names**: Rename your workflow steps to clearly describe what each one does. This helps with maintenance and makes it easier to hand off to coworkers
+* **Leverage previous step data**: You can use fields from records returned by any previous step in your workflow
+* **Start simple**: Begin with basic workflows and add complexity over time as you become more comfortable with the system
+* **Plan before building**: Map out your workflow logic before you start building to avoid getting stuck halfway through
+
+## Next Steps
+
+* [Workflow Triggers](/l/ko/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/ko/user-guide/workflows/capabilities/workflow-actions)
+* [CRM Automations](/l/ko/user-guide/workflows/how-tos/crm-automations/closed-won-automations)
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/best-practices-server.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/best-practices-server.mdx
index 4d7666f9ff..d8f5c5ea7c 100644
--- a/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/best-practices-server.mdx
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/best-practices-server.mdx
@@ -1,22 +1,22 @@
---
-title: Melhores Práticas
+title: Best Practices
---
-Este documento descreve as melhores práticas que você deve seguir ao trabalhar no backend.
+This document outlines the best practices you should follow when working on the backend.
-## Siga uma abordagem modular
+## Follow a modular approach
-O backend segue uma abordagem modular, que é um princípio fundamental ao trabalhar com NestJS. Certifique-se de dividir seu código em módulos reutilizáveis para manter uma base de código limpa e organizada.
-Cada módulo deve encapsular um recurso ou funcionalidade específico e ter um escopo bem definido. Esta abordagem modular permite uma clara separação de preocupações e remove complexidades desnecessárias.
+The backend follows a modular approach, which is a fundamental principle when working with NestJS. Make sure you break down your code into reusable modules to maintain a clean and organized codebase.
+Each module should encapsulate a particular feature or functionality and have a well-defined scope. This modular approach enables clear separation of concerns and removes unnecessary complexities.
-## Expor serviços para uso em módulos
+## Expose services to use in modules
-Sempre crie serviços que tenham uma responsabilidade clara e única, o que melhora a legibilidade e a manutenção do código. Nomeie os serviços de forma descritiva e consistente.
+Always create services that have a clear and single responsibility, which enhances code readability and maintainability. Name the services descriptively and consistently.
-Você também deve expor serviços que deseja usar em outros módulos. Expor serviços para outros módulos é possível através do poderoso sistema de injeção de dependências do NestJS e promove o acoplamento frouxo entre os componentes.
+You should also expose services that you want to use in other modules. Exposing services to other modules is possible through NestJS's powerful dependency injection system, and promotes loose coupling between components.
-## Evite usar o tipo `any`
+## Avoid using `any` type
-Quando você declara uma variável como `any`, o verificador de tipos do TypeScript não realiza nenhuma verificação de tipo, tornando possível atribuir qualquer tipo de valores à variável. O TypeScript usa inferência de tipos para determinar o tipo da variável com base no valor. Ao declará-lo como `any`, o TypeScript não pode mais inferir o tipo. Isso torna difícil capturar erros relacionados a tipos durante o desenvolvimento, levando a erros em tempo de execução e tornando o código menos mantenível, menos confiável e mais difícil de entender para os outros.
+When you declare a variable as `any`, TypeScript's type checker doesn't perform any type checking, making it possible to assign any type of values to the variable. TypeScript uses type inference to determine the type of variable based on the value. By declaring it as `any`, TypeScript can no longer infer the type. This makes it hard to catch type-related errors during development, leading to runtime errors and makes the code less maintainable, less reliable, and harder to understand for others.
-Por isso, tudo deve ter um tipo. Assim, se você criar um novo objeto com um primeiro nome e um sobrenome, deve criar uma interface ou tipo que contenha um primeiro nome e um sobrenome que defina a forma do objeto que você está manipulando.
+This is why everything should have a type. So if you create a new object with a first name and last name, you should create an interface or type that contains a first name and last name that defines the shape of the object you are manipulating.
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/custom-objects.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/custom-objects.mdx
new file mode 100644
index 0000000000..7feec7a639
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/custom-objects.mdx
@@ -0,0 +1,39 @@
+---
+title: Custom Objects
+---
+
+Objects are structures that allow you to store data (records, attributes, and values) specific to an organization. Twenty provides both standard and custom objects.
+
+Standard objects are in-built objects with a set of attributes available for all users. Examples of standard objects in Twenty include Company and Person. Standard objects have standard fields that are also available for all Twenty users, like Company.displayName.
+
+Custom objects are objects that you can create to store information that is unique to your organization. They are not built-in; members of your workspace can create and customize custom objects to hold information that standard objects aren't suitable for.
+
+## High-level schema
+
+
+
+
+
+
+
+## How it works
+
+Custom objects come from metadata tables that determine the shape, name, and type of the objects. All this information is present in the metadata schema database, consisting of tables:
+
+* **DataSource**: Details where the data is present.
+* **Object**: Describes the object and links to a DataSource.
+* **Field**: Outlines an Object's fields and connects to the Object.
+
+To add a custom object, the workspaceMember will query the /metadata API. This updates the metadata accordingly and computes a GraphQL schema based on the metadata, storing it in a GQL cache for later use.
+
+
+
+
+
+
+
+To fetch data, the process involves making queries through the /graphql endpoint and passing them through the Query Resolver.
+
+
+
+
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/feature-flags.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/feature-flags.mdx
new file mode 100644
index 0000000000..a261cfec3c
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/feature-flags.mdx
@@ -0,0 +1,46 @@
+---
+title: Feature Flags
+---
+
+Feature flags are used to hide experimental features. For Twenty, they are set on workspace level and not on a user level.
+
+## Adding a new feature flag
+
+In `FeatureFlagKey.ts` add the feature flag:
+
+```ts
+type FeatureFlagKey =
+ | 'IS_FEATURENAME_ENABLED'
+ | ...;
+```
+
+Also add it to the enum in `feature-flag.entity.ts`:
+
+```ts
+enum FeatureFlagKeys {
+ IsFeatureNameEnabled = 'IS_FEATURENAME_ENABLED',
+ ...
+}
+```
+
+To apply a feature flag on a **backend** feature use:
+
+```ts
+@Gate({
+ featureFlag: 'IS_FEATURENAME_ENABLED',
+})
+```
+
+To apply a feature flag on a **frontend** feature use:
+
+```ts
+const isFeatureNameEnabled = useIsFeatureEnabled('IS_FEATURENAME_ENABLED');
+```
+
+## Configure feature flags for the deployment
+
+Change the corresponding record in the Table `core.featureFlag`:
+
+| id | key | workspaceId | value |
+| ------ | ------------------------ | ----------- | ------ |
+| Random | `IS_FEATURENAME_ENABLED` | WorkspaceID | `true` |
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx
new file mode 100644
index 0000000000..233d92ac8a
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx
@@ -0,0 +1,125 @@
+---
+title: Folder Architecture
+info: A detailed look into our server folder architecture
+---
+
+The backend directory structure is as follows:
+
+```
+server
+ └───ability
+ └───constants
+ └───core
+ └───database
+ └───decorators
+ └───filters
+ └───guards
+ └───health
+ └───integrations
+ └───metadata
+ └───workspace
+ └───utils
+```
+
+## Ability
+
+Defines permissions and includes handlers for each entity.
+
+## Decorators
+
+Defines custom decorators in NestJS for added functionality.
+
+See [custom decorators](https://docs.nestjs.com/custom-decorators) for more details.
+
+## Filters
+
+Includes exception filters to handle exceptions that might occur in GraphQL endpoints.
+
+## Guards
+
+See [guards](https://docs.nestjs.com/guards) for more details.
+
+## Health
+
+Includes a publicly available REST API (healthz) that returns a JSON to confirm whether the database is working as expected.
+
+## Metadata
+
+Defines custom objects and makes available a GraphQL API (graphql/metadata).
+
+## Workspace
+
+Generates and serves custom GraphQL schema based on the metadata.
+
+### Workspace Directory Structure
+
+```
+workspace
+
+ └───workspace-schema-builder
+ └───factories
+ └───graphql-types
+ └───database
+ └───interfaces
+ └───object-definitions
+ └───services
+ └───storage
+ └───utils
+ └───workspace-resolver-builder
+ └───factories
+ └───interfaces
+ └───workspace-query-builder
+ └───factories
+ └───interfaces
+ └───workspace-query-runner
+ └───interfaces
+ └───utils
+ └───workspace-datasource
+ └───workspace-manager
+ └───workspace-migration-runner
+ └───utils
+ └───workspace.module.ts
+ └───workspace.factory.spec.ts
+ └───workspace.factory.ts
+```
+
+The root of the workspace directory includes the `workspace.factory.ts`, a file containing the `createGraphQLSchema` function. This function generates workspace-specific schema by using the metadata to tailor a schema for individual workspaces. By separating the schema and resolver construction, we use the `makeExecutableSchema` function, which combines these discrete elements.
+
+This strategy is not just about organization, but also helps with optimization, such as caching generated type definitions to enhance performance and scalability.
+
+### Workspace Schema builder
+
+Generates the GraphQL schema, and includes:
+
+#### Factories:
+
+Specialised constructors to generate GraphQL-related constructs.
+
+* The type.factory translates field metadata into GraphQL types using `TypeMapperService`.
+* The type-definition.factory creates GraphQL input or output objects derived from `objectMetadata`.
+
+#### GraphQL Types
+
+Includes enumerations, inputs, objects, and scalars, and serves as the building blocks for the schema construction.
+
+#### Interfaces and Object Definitions
+
+Contains the blueprints for GraphQL entities, and includes both predefined and custom types like `MONEY` or `URL`.
+
+#### Services
+
+Contains the service responsible for associating FieldMetadataType with its appropriate GraphQL scalar or query modifiers.
+
+#### Storage
+
+Includes the `TypeDefinitionsStorage` class that contains reusable type definitions, preventing duplication of GraphQL types.
+
+### Workspace Resolver Builder
+
+Creates resolver functions for querying and mutating the GraphQL schema.
+
+Each factory in this directory is responsible for producing a distinct resolver type, such as the `FindManyResolverFactory`, designed for adaptable application across various tables.
+
+### Workspace Query Runner
+
+Runs the generated queries on the database and parses the result.
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/queue.mdx
index 08b6a416d3..6148c0fbf0 100644
--- a/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/queue.mdx
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/queue.mdx
@@ -1,41 +1,41 @@
---
-title: Fila de Mensagens
+title: Message Queue
---
-Filas facilitam operações assíncronas a serem realizadas. Elas podem ser usadas para realizar tarefas em segundo plano, como enviar um email de boas-vindas ao se registrar.
-Cada caso de uso terá sua própria classe de fila estendida de `MessageQueueServiceBase`.
+Queues facilitate async operations to be performed. They can be used for performing background tasks such as sending a welcome email on register.
+Each use case will have its own queue class extended from `MessageQueueServiceBase`.
-Atualmente, só damos suporte ao `bull-mq`[bull-mq](https://bullmq.io/) como o driver de fila.
+Currently, we only support `bull-mq`[bull-mq](https://bullmq.io/) as the queue driver.
-## Passos para criar e usar uma nova fila
+## Steps to create and use a new queue
-1. Adicione um nome de fila para sua nova fila no enum `MESSAGE_QUEUES`.
-2. Forneça a implementação da fábrica da fila com o nome da fila como o token de dependência.
-3. Injete a fila que você criou no módulo/serviço necessário com o nome da fila como o token de dependência.
-4. Adicione uma classe de trabalhador com injeção baseada em token, assim como o produtor.
+1. Add a queue name for your new queue under enum `MESSAGE_QUEUES`.
+2. Provide the factory implementation of the queue with the queue name as the dependency token.
+3. Inject the queue that you created in the required module/service with the queue name as the dependency token.
+4. Add worker class with token based injection just like producer.
-### Exemplo de uso
+### Example usage
```ts
-classe Resolver {
- constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
+class Resolver {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
- async onSomeAction() {
- //lógica de negócio
- await this.queue.add(someData);
- }
+ async onSomeAction() {
+ //business logic
+ await this.queue.add(someData);
+ }
}
-//trabalhador assíncrono
-classe CustomWorker {
- constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
- this.initWorker();
- }
+//async worker
+class CustomWorker {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
+ this.initWorker();
+ }
- async initWorker() {
- await this.queue.work(async ({ id, data }) => {
- //lógica do trabalhador
- });
- }
+ async initWorker() {
+ await this.queue.work(async ({ id, data }) => {
+ //worker logic
+ });
+ }
}
```
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/server-commands.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/server-commands.mdx
new file mode 100644
index 0000000000..6951909788
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/server-commands.mdx
@@ -0,0 +1,101 @@
+---
+title: Backend Commands
+---
+
+## Useful commands
+
+These commands should be executed from packages/twenty-server folder.
+From any other folder you can run `npx nx {command} twenty-server` (or `npx nx run twenty-server:{command}`).
+
+### First time setup
+
+```
+npx nx database:reset twenty-server # setup the database with dev seeds
+```
+
+### Starting the server
+
+```
+npx nx run twenty-server:start
+```
+
+### Lint
+
+```
+npx nx run twenty-server:lint # pass --fix to fix lint errors
+```
+
+### Test
+
+```
+npx nx run twenty-server:test:unit # run unit tests
+npx nx run twenty-server:test:integration # run integration tests
+```
+
+Note: you can run `npx nx run twenty-server:test:integration:with-db-reset` in case you need to reset the database before running the integration tests.
+
+### Resetting the database
+
+If you want to reset and seed the database, you can run the following command:
+
+```bash
+npx nx run twenty-server:database:reset
+```
+
+### Migrations
+
+#### For objects in Core/Metadata schemas (TypeORM)
+
+```bash
+npx nx run twenty-server:typeorm migration:generate src/database/typeorm/core/migrations/nameOfYourMigration -d src/database/typeorm/core/core.datasource.ts
+```
+
+#### For Workspace objects
+
+There are no migrations files, migration are generated automatically for each workspace,
+stored in the database, and applied with this command
+
+```bash
+npx nx run twenty-server:command workspace:sync-metadata -f
+```
+
+
+ This will drop the database and re-run the migrations and seed.
+
+ Make sure to back up any data you want to keep before running this command.
+
+
+## Tech Stack
+
+Twenty primarily uses NestJS for the backend.
+
+Prisma was the first ORM we used. But in order to allow users to create custom fields and custom objects, a lower-level made more sense as we need to have fine-grained control. The project now uses TypeORM.
+
+Here's what the tech stack now looks like.
+
+**Core**
+
+* [NestJS](https://nestjs.com/)
+* [TypeORM](https://typeorm.io/)
+* [GraphQL Yoga](https://the-guild.dev/graphql/yoga-server)
+
+**Database**
+
+* [Postgres](https://www.postgresql.org/)
+
+**Third-party integrations**
+
+* [Sentry](https://sentry.io/welcome/) for tracking bugs
+
+**Testing**
+
+* [Jest](https://jestjs.io/)
+
+**Tooling**
+
+* [Yarn](https://yarnpkg.com/)
+* [ESLint](https://eslint.org/)
+
+**Development**
+
+* [AWS EKS](https://aws.amazon.com/eks/)
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/zapier.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/zapier.mdx
index b88eae11ea..46bcd563fc 100644
--- a/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/zapier.mdx
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/zapier.mdx
@@ -1,18 +1,18 @@
---
-title: Aplicativo Zapier
+title: Zapier App
---
-Sincronize o Twenty com mais de 3000 aplicativos usando [Zapier](https://zapier.com/) sem esforço. Automatize tarefas, aumente a produtividade e potencialize seus relacionamentos com clientes!
+Effortlessly sync Twenty with 3000+ apps using [Zapier](https://zapier.com/). Automate tasks, boost productivity, and supercharge your customer relationships!
-## Sobre o Zapier
+## About Zapier
-O Zapier é uma ferramenta que permite automações de fluxos de trabalho conectando os aplicativos que sua equipe usa todos os dias. O conceito fundamental do Zapier são automações de fluxos de trabalho, chamadas Zaps, que incluem disparadores e ações.
+Zapier is a tool that allows you to automate workflows by connecting the apps that your team uses every day. The fundamental concept of Zapier is automation workflows, called Zaps, and include triggers and actions.
-Você pode aprender mais sobre como o Zapier funciona [aqui](https://zapier.com/how-it-works).
+You can learn more about how Zapier works [here](https://zapier.com/how-it-works).
-## Configuração
+## Setup
-### Etapa 1: Instalar pacotes do Zapier
+### Step 1: Install Zapier packages
```bash
cd packages/twenty-zapier
@@ -20,33 +20,33 @@ cd packages/twenty-zapier
yarn
```
-### Etapa 2: Faça login com o CLI
+### Step 2: Login with the CLI
-Use suas credenciais do Zapier para fazer login usando o CLI:
+Use your Zapier credentials to log in using the CLI:
```bash
zapier login
```
-### Etapa 3: Defina as variáveis de ambiente
+### Step 3: Set environment variables
-Na pasta `packages/twenty-zapier`, execute:
+From the `packages/twenty-zapier` folder, run:
```bash
cp .env.example .env
```
-Execute o aplicativo localmente, vá para [http://localhost:3000/settings/api-webhooks](http://localhost:3000/settings/api-webhooks) e gere uma chave API.
+Run the application locally, go to [http://localhost:3000/settings/api-webhooks](http://localhost:3000/settings/api-webhooks), and generate an API key.
-Substitua o valor **YOUR_API_KEY** no arquivo `.env` pela chave API que você acabou de gerar.
+Replace the **YOUR_API_KEY** value in the `.env` file with the API key you just generated.
-## Desenvolvimento
+## Development
- Certifique-se de executar `yarn build` antes de qualquer comando `zapier`.
+ Make sure to run `yarn build` before any `zapier` command.
-### Teste
+### Test
```bash
yarn test
@@ -58,25 +58,25 @@ yarn test
yarn format
```
-### Assista e compile enquanto edita o código
+### Watch and compile as you edit code
```bash
yarn watch
```
-### Valide seu aplicativo Zapier
+### Validate your Zapier app
```bash
yarn validate
```
-### Implante seu aplicativo Zapier
+### Deploy your Zapier app
```bash
yarn deploy
```
-### Liste todos os comandos CLI do Zapier
+### List all Zapier CLI commands
```bash
zapier
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/bug-and-requests.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/bug-and-requests.mdx
new file mode 100644
index 0000000000..4db64b703d
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/bug-and-requests.mdx
@@ -0,0 +1,78 @@
+---
+title: Bugs, Requests & Pull Requests
+info: Report issues, request features, and contribute code
+---
+
+## Reporting Bugs
+
+To report a bug, please [create an issue on GitHub](https://github.com/twentyhq/twenty/issues/new).
+
+You can also ask for help on [Discord](https://discord.gg/cx5n4Jzs57).
+
+## Feature Requests
+
+If you're not sure if it's a bug, and you feel it's closer to a feature request, then you should probably [open a discussion instead](https://github.com/twentyhq/twenty/discussions/new).
+
+## Submit a Pull Request
+
+Contributing code to Twenty starts with a pull request (PR).
+
+### Before You Start
+
+1. Check [existing issues](https://github.com/twentyhq/twenty/issues) for related work
+2. For new features, open an issue first to discuss
+3. Review our [Code of Conduct](https://github.com/twentyhq/twenty/blob/main/CODE_OF_CONDUCT.md)
+
+### Fork and Clone
+
+1. Fork the repository on GitHub
+2. Clone your fork:
+
+```bash
+git clone https://github.com/YOUR_USERNAME/twenty.git
+cd twenty
+```
+
+3. Add upstream remote:
+
+```bash
+git remote add upstream https://github.com/twentyhq/twenty.git
+```
+
+### Create a Branch
+
+```bash
+git checkout -b feature/your-feature-name
+```
+
+Use descriptive branch names:
+
+* `feature/add-export-button`
+* `fix/login-redirect-issue`
+* `docs/update-api-guide`
+
+### Make Your Changes
+
+1. Write clean, well-documented code
+2. Follow existing code style
+3. Add tests for new functionality
+4. Update documentation if needed
+
+### Submit Your PR
+
+1. Push your branch:
+
+```bash
+git push origin feature/your-feature-name
+```
+
+2. Open a PR on GitHub
+3. Fill in the PR template
+4. Link related issues
+
+### PR Checklist
+
+* [ ] Code follows project style guidelines
+* [ ] Tests pass locally
+* [ ] Documentation is updated
+* [ ] PR description explains the changes
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/best-practices-front.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
new file mode 100644
index 0000000000..187c2d848c
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
@@ -0,0 +1,325 @@
+---
+title: Best Practices
+---
+
+This document outlines the best practices you should follow when working on the frontend.
+
+## State management
+
+React and Recoil handle state management in the codebase.
+
+### Use `useRecoilState` to store state
+
+It's good practice to create as many atoms as you need to store your state.
+
+
+ It's better to use extra atoms than trying to be too concise with props drilling.
+
+
+```tsx
+export const myAtomState = atom({
+ key: 'myAtomState',
+ default: 'default value',
+});
+
+export const MyComponent = () => {
+ const [myAtom, setMyAtom] = useRecoilState(myAtomState);
+
+ return (
+
+ setMyAtom(e.target.value)}
+ />
+
+ );
+}
+```
+
+### Do not use `useRef` to store state
+
+Avoid using `useRef` to store state.
+
+If you want to store state, you should use `useState` or `useRecoilState`.
+
+See [how to manage re-renders](#managing-re-renders) if you feel like you need `useRef` to prevent some re-renders from happening.
+
+## Managing re-renders
+
+Re-renders can be hard to manage in React.
+
+Here are some rules to follow to avoid unnecessary re-renders.
+
+Keep in mind that you can **always** avoid re-renders by understanding their cause.
+
+### Work at the root level
+
+Avoiding re-renders in new features is now made easy by eliminating them at the root level.
+
+The `PageChangeEffect` sidecar component contains just one `useEffect` that holds all the logic to execute on a page change.
+
+That way you know that there's just one place that can trigger a re-render.
+
+### Always think twice before adding `useEffect` in your codebase
+
+Re-renders are often caused by unnecessary `useEffect`.
+
+You should think whether you need `useEffect`, or if you can move the logic in a event handler function.
+
+You'll find it generally easy to move the logic in a `handleClick` or `handleChange` function.
+
+You can also find them in libraries like Apollo: `onCompleted`, `onError`, etc.
+
+### Use a sibling component to extract `useEffect` or data fetching logic
+
+If you feel like you need to add a `useEffect` in your root component, you should consider extracting it in a sidecar component.
+
+You can apply the same for data fetching logic, with Apollo hooks.
+
+```tsx
+// ❌ Bad, will cause re-renders even if data is not changing,
+// because useEffect needs to be re-evaluated
+export const PageComponent = () => {
+ const [data, setData] = useRecoilState(dataState);
+ const [someDependency] = useRecoilState(someDependencyState);
+
+ useEffect(() => {
+ if(someDependency !== data) {
+ setData(someDependency);
+ }
+ }, [someDependency]);
+
+ return {data}
;
+};
+
+export const App = () => (
+
+
+
+);
+```
+
+```tsx
+// ✅ Good, will not cause re-renders if data is not changing,
+// because useEffect is re-evaluated in another sibling component
+export const PageComponent = () => {
+ const [data, setData] = useRecoilState(dataState);
+
+ return {data}
;
+};
+
+export const PageData = () => {
+ const [data, setData] = useRecoilState(dataState);
+ const [someDependency] = useRecoilState(someDependencyState);
+
+ useEffect(() => {
+ if(someDependency !== data) {
+ setData(someDependency);
+ }
+ }, [someDependency]);
+
+ return <>>;
+};
+
+export const App = () => (
+
+
+
+
+);
+```
+
+### Use recoil family states and recoil family selectors
+
+Recoil family states and selectors are a great way to avoid re-renders.
+
+They are useful when you need to store a list of items.
+
+### You shouldn't use `React.memo(MyComponent)`
+
+Avoid using `React.memo()` because it does not solve the cause of the re-render, but instead breaks the re-render chain, which can lead to unexpected behavior and make the code very hard to refactor.
+
+### Limit `useCallback` or `useMemo` usage
+
+They are often not necessary and will make the code harder to read and maintain for a gain of performance that is unnoticeable.
+
+## Console.logs
+
+`console.log` statements are valuable during development, offering real-time insights into variable values and code flow. But, leaving them in production code can lead to several issues:
+
+1. **Performance**: Excessive logging can affect the runtime performance, especially on client-side applications.
+
+2. **Security**: Logging sensitive data can expose critical information to anyone who inspects the browser's console.
+
+3. **Cleanliness**: Filling up the console with logs can obscure important warnings or errors that developers or tools need to see.
+
+4. **Professionalism**: End users or clients checking the console and seeing a myriad of log statements might question the code's quality and polish.
+
+Make sure you remove all `console.logs` before pushing the code to production.
+
+## Naming
+
+### Variable Naming
+
+Variable names ought to precisely depict the purpose or function of the variable.
+
+#### The issue with generic names
+
+Generic names in programming are not ideal because they lack specificity, leading to ambiguity and reduced code readability. Such names fail to convey the variable or function's purpose, making it challenging for developers to understand the code's intent without deeper investigation. This can result in increased debugging time, higher susceptibility to errors, and difficulties in maintenance and collaboration. Meanwhile, descriptive naming makes the code self-explanatory and easier to navigate, enhancing code quality and developer productivity.
+
+```tsx
+// ❌ Bad, uses a generic name that doesn't communicate its
+// purpose or content clearly
+const [value, setValue] = useState('');
+```
+
+```tsx
+// ✅ Good, uses a descriptive name
+const [email, setEmail] = useState('');
+```
+
+#### Some words to avoid in variable names
+
+* dummy
+
+### Event handlers
+
+Event handler names should start with `handle`, while `on` is a prefix used to name events in components props.
+
+```tsx
+// ❌ Bad
+const onEmailChange = (val: string) => {
+ // ...
+};
+```
+
+```tsx
+// ✅ Good
+const handleEmailChange = (val: string) => {
+ // ...
+};
+```
+
+## Optional Props
+
+Avoid passing the default value for an optional prop.
+
+**EXAMPLE**
+
+Take the`EmailField` component defined below:
+
+```tsx
+type EmailFieldProps = {
+ value: string;
+ disabled?: boolean;
+};
+
+const EmailField = ({ value, disabled = false }: EmailFieldProps) => (
+
+);
+```
+
+**Usage**
+
+```tsx
+// ❌ Bad, passing in the same value as the default value adds no value
+const Form = () => ;
+```
+
+```tsx
+// ✅ Good, assumes the default value
+const Form = () => ;
+```
+
+## Component as props
+
+Try as much as possible to pass uninstantiated components as props, so children can decide on their own of what props they need to pass.
+
+The most common example for that is icon components:
+
+```tsx
+const SomeParentComponent = () => ;
+
+// In MyComponent
+const MyComponent = ({ MyIcon }: { MyIcon: IconComponent }) => {
+ const theme = useTheme();
+
+ return (
+
+
+
+ )
+};
+```
+
+For React to understand that the component is a component, you need to use PascalCase, to later instantiate it with ``
+
+## Prop Drilling: Keep It Minimal
+
+Prop drilling, in the React context, refers to the practice of passing state variables and their setters through many component layers, even if intermediary components don't use them. While sometimes necessary, excessive prop drilling can lead to:
+
+1. **Decreased Readability**: Tracing where a prop originates or where it's utilized can become convoluted in a deeply nested component structure.
+
+2. **Maintenance Challenges**: Changes in one component's prop structure might require adjustments in several components, even if they don't directly use the prop.
+
+3. **Reduced Component Reusability**: A component receiving a lot of props solely for passing them down becomes less general-purpose and harder to reuse in different contexts.
+
+If you feel that you are using excessive prop drilling, see [state management best practices](#state-management).
+
+## Imports
+
+When importing, opt for the designated aliases rather than specifying complete or relative paths.
+
+**The Aliases**
+
+```js
+{
+ alias: {
+ "~": path.resolve(__dirname, "src"),
+ "@": path.resolve(__dirname, "src/modules"),
+ "@testing": path.resolve(__dirname, "src/testing"),
+ },
+}
+```
+
+**Usage**
+
+```tsx
+// ❌ Bad, specifies the entire relative path
+import {
+ CatalogDecorator
+} from '../../../../../testing/decorators/CatalogDecorator';
+import {
+ ComponentDecorator
+} from '../../../../../testing/decorators/ComponentDecorator';
+```
+
+```tsx
+// ✅ Good, utilises the designated aliases
+import { CatalogDecorator } from '~/testing/decorators/CatalogDecorator';
+import { ComponentDecorator } from 'twenty-ui/testing';
+```
+
+## Schema Validation
+
+[Zod](https://github.com/colinhacks/zod) is the schema validator for untyped objects:
+
+```js
+const validationSchema = z
+ .object({
+ exist: z.boolean(),
+ email: z
+ .string()
+ .email('Email must be a valid email'),
+ password: z
+ .string()
+ .regex(PASSWORD_REGEX, 'Password must contain at least 8 characters'),
+ })
+ .required();
+
+type Form = z.infer;
+```
+
+## Breaking Changes
+
+Always perform thorough manual testing before proceeding to guarantee that modifications haven’t caused disruptions elsewhere, given that tests have not yet been extensively integrated.
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
index 5f292abe03..064ac5c256 100644
--- a/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
@@ -1,11 +1,11 @@
---
-title: Arquitetura de Pastas
-info: Um olhar detalhado sobre nossa arquitetura de pastas
+title: Folder Architecture
+info: A detailed look into our folder architecture
---
-Neste guia, você explorará os detalhes da estrutura de diretórios do projeto e como isso contribui para a organização e manutenção do Twenty.
+In this guide, you will explore the details of the project directory structure and how it contributes to the organization and maintainability of Twenty.
-Seguindo esta convenção de arquitetura de pastas, é mais fácil encontrar os arquivos relacionados a funcionalidades específicas e garantir que a aplicação seja escalável e manutenível.
+By following this folder architecture convention, it's easier to find the files related to specific features and ensure that the application is scalable and maintainable.
```
front
@@ -22,14 +22,14 @@ front
└───...
```
-## Páginas
+## Pages
-Inclui os componentes de nível superior definidos pelas rotas da aplicação. Elas importam componentes de nível mais baixo da pasta `modules` (mais detalhes abaixo).
+Includes the top-level components defined by the application routes. They import more low-level components from the modules folder (more details below).
-## Módulos
+## Modules
-Cada módulo representa uma funcionalidade ou um grupo de funcionalidades, compreendendo seus componentes específicos, estados e lógica operacional.
-Todos devem seguir a estrutura abaixo. Você pode aninhar módulos dentro de módulos (referidos como submódulos) e as mesmas regras se aplicarão.
+Each module represents a feature or a group of feature, comprising its specific components, states, and operational logic.
+They should all follow the structure below. You can nest modules within modules (referred to as submodules) and the same rules will apply.
```
module1
@@ -50,60 +50,60 @@ module1
└───utils
```
-### Contextos
+### Contexts
-Um contexto é uma maneira de passar dados através da árvore de componentes sem ter que passar propriedades manualmente em cada nível.
+A context is a way to pass data through the component tree without having to pass props down manually at every level.
-Veja [React Context](https://react.dev/reference/react#context-hooks) para mais detalhes.
+See [React Context](https://react.dev/reference/react#context-hooks) for more details.
### GraphQL
-Inclui fragmentos, consultas e mutações.
+Includes fragments, queries, and mutations.
-Veja [GraphQL](https://graphql.org/learn/) para mais detalhes.
+See [GraphQL](https://graphql.org/learn/) for more details.
-* Fragmentos
+* Fragments
-Um fragmento é uma parte reutilizável de uma consulta, que você pode usar em diferentes lugares. Usando fragmentos, é mais fácil evitar duplicar código.
+A fragment is a reusable piece of a query, which you can use in different places. By using fragments, it's easier to avoid duplicating code.
-Veja [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) para mais detalhes.
+See [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) for more details.
-* Consultas
+* Queries
-Veja [GraphQL Queries](https://graphql.org/learn/queries/) para mais detalhes.
+See [GraphQL Queries](https://graphql.org/learn/queries/) for more details.
-* Mutações
+* Mutations
-Veja [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) para mais detalhes.
+See [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) for more details.
### Hooks
-Veja [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) para mais detalhes.
+See [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) for more details.
-### Estados
+### States
-Contém a lógica de gerenciamento de estado. [RecoilJS](https://recoiljs.org) lida com isso.
+Contains the state management logic. [RecoilJS](https://recoiljs.org) handles this.
-* Seletores: Veja [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) para mais detalhes.
+* Selectors: See [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) for more details.
-O gerenciamento de estado embutido do React ainda lida com o estado dentro de um componente.
+React's built-in state management still handles state within a component.
-### Utilitários
+### Utils
-Deve conter apenas funções puras reutilizáveis. Caso contrário, crie hooks personalizados na pasta `hooks`.
+Should just contain reusable pure functions. Otherwise, create custom hooks in the `hooks` folder.
## UI
-Contém todos os componentes reutilizáveis de UI usados na aplicação.
+Contains all the reusable UI components used in the application.
-Esta pasta pode conter subpastas, como `data`, `display`, `feedback` e `input` para tipos específicos de componentes. Cada componente deve ser autocontido e reutilizável, de modo que você possa usá-lo em diferentes partes da aplicação.
+This folder can contain sub-folders, like `data`, `display`, `feedback`, and `input` for specific types of components. Each component should be self-contained and reusable, so that you can use it in different parts of the application.
-Ao separar os componentes de UI dos outros componentes na pasta `modules`, é mais fácil manter um design consistente e fazer alterações na UI sem afetar outras partes (lógica de negócios) do código.
+By separating the UI components from the other components in the `modules` folder, it's easier to maintain a consistent design and to make changes to the UI without affecting other parts (business logic) of the codebase.
-## Interface e dependências
+## Interface and dependencies
-Você pode importar código de outros módulos, exceto da pasta `ui`. Isso manterá seu código fácil de testar.
+You can import other module code from any module except for the `ui` folder. This will keep its code easy to test.
-### Interno
+### Internal
-Cada parte (hooks, estados, ...) de um módulo pode ter uma pasta `internal`, que contém partes que são usadas apenas dentro do módulo.
+Each part (hooks, states, ...) of a module can have an `internal` folder, which contains parts that are just used within the module.
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
index 502b747104..c584aafded 100644
--- a/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -1,22 +1,22 @@
---
-title: Comandos do Frontend
+title: Frontend Commands
---
-## Comandos Úteis
+## Useful commands
-### Iniciando o aplicativo
+### Starting the app
```bash
npx nx start twenty-front
```
-### Regenerar esquema GraphQL baseado no esquema de API GraphQL
+### Regenerate graphql schema based on API graphql schema
```bash
npx nx run twenty-front:graphql:generate --configuration=metadata
```
-OU
+OR
```bash
npx nx run twenty-front:graphql:generate
@@ -25,30 +25,30 @@ npx nx run twenty-front:graphql:generate
### Lint
```bash
-npx nx run twenty-front:lint # passe --fix para corrigir erros de lint
+npx nx run twenty-front:lint # pass --fix to fix lint errors
```
-## Traduções
+## Translations
```bash
npx nx run twenty-front:lingui:extract
npx nx run twenty-front:lingui:compile
```
-### Teste
+### Test
```bash
-npx nx run twenty-front:test # execute testes com jest
-npx nx run twenty-front:storybook:serve:dev # execute storybook
-npx nx run twenty-front:storybook:test # execute testes # (precisa de yarn storybook:serve:dev em execução)
-npx nx run twenty-front:storybook:coverage # (precisa de yarn storybook:serve:dev em execução)
+npx nx run twenty-front:test # run jest tests
+npx nx run twenty-front:storybook:serve:dev # run storybook
+npx nx run twenty-front:storybook:test # run tests # (needs yarn storybook:serve:dev to be running)
+npx nx run twenty-front:storybook:coverage # (needs yarn storybook:serve:dev to be running)
```
-## Pilha de Tecnologias
+## Tech Stack
-O projeto possui uma pilha limpa e simples, com pouco código boilerplate.
+The project has a clean and simple stack, with minimal boilerplate code.
-**Aplicativo**
+**App**
* [React](https://react.dev/)
* [Apollo](https://www.apollographql.com/docs/)
@@ -56,35 +56,35 @@ O projeto possui uma pilha limpa e simples, com pouco código boilerplate.
* [Recoil](https://recoiljs.org/docs/introduction/core-concepts)
* [TypeScript](https://www.typescriptlang.org/)
-**Testes**
+**Testing**
* [Jest](https://jestjs.io/)
* [Storybook](https://storybook.js.org/)
-**Ferramentas**
+**Tooling**
* [Yarn](https://yarnpkg.com/)
* [Craco](https://craco.js.org/docs/)
* [ESLint](https://eslint.org/)
-## Arquitetura
+## Architecture
-### Roteamento
+### Routing
-[React Router](https://reactrouter.com/) gerencia o roteamento.
+[React Router](https://reactrouter.com/) handles the routing.
-Para evitar [re-renderizações](/l/pt/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) desnecessárias, toda a lógica de roteamento está em um `useEffect` no `PageChangeEffect`.
+To avoid unnecessary [re-renders](/l/pt/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) all the routing logic is in a `useEffect` in `PageChangeEffect`.
-### Gerenciamento de Estado
+### State Management
-[Recoil](https://recoiljs.org/docs/introduction/core-concepts) gerencia o estado.
+[Recoil](https://recoiljs.org/docs/introduction/core-concepts) handles state management.
-Veja [melhores práticas](/l/pt/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) para mais informações sobre gerenciamento de estado.
+See [best practices](/l/pt/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) for more information on state management.
-## Testes
+## Testing
-[Jest](https://jestjs.io/) serve como ferramenta para testes unitários enquanto [Storybook](https://storybook.js.org/) para teste de componentes.
+[Jest](https://jestjs.io/) serves as the tool for unit testing while [Storybook](https://storybook.js.org/) is for component testing.
-Jest é principalmente para testar funções utilitárias, e não os componentes em si.
+Jest is mainly for testing utility functions, and not components themselves.
-Storybook é para testar o comportamento de componentes isolados, bem como exibir o sistema de design.
+Storybook is for testing the behavior of isolated components, as well as displaying the design system.
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/hotkeys.mdx
index ee753b30db..43cde50e63 100644
--- a/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/hotkeys.mdx
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -1,42 +1,42 @@
---
-title: Teclas de atalho
+title: Hotkeys
---
-## Introdução
+## Introduction
-Quando você precisa ouvir uma tecla de atalho, normalmente usaria o listener de evento `onKeyDown`.
+When you need to listen to a hotkey, you would normally use the `onKeyDown` event listener.
-No entanto, em `twenty-front`, você pode ter conflitos entre as mesmas teclas de atalho que são usadas em diferentes componentes, montados ao mesmo tempo.
+In `twenty-front` however, you might have conflicts between same hotkeys that are used in different components, mounted at the same time.
-Por exemplo, se você tem uma página que escuta a tecla Enter, e um modal que escuta a tecla Enter, com um componente Select dentro desse modal que escuta a tecla Enter, você pode ter um conflito quando todos são montados ao mesmo tempo.
+For example, if you have a page that listens for the Enter key, and a modal that listens for the Enter key, with a Select component inside that modal that listens for the Enter key, you might have a conflict when all are mounted at the same time.
-## O hook `useScopedHotkeys`
+## The `useScopedHotkeys` hook
-Para lidar com esse problema, temos um hook personalizado que permite ouvir as teclas de atalho sem qualquer conflito.
+To handle this problem, we have a custom hook that makes it possible to listen to hotkeys without any conflict.
-Você o coloca em um componente, e ele ouvirá as teclas de atalho somente quando o componente estiver montado E quando o **escopo da tecla de atalho** especificado estiver ativo.
+You place it in a component, and it will listen to the hotkeys only when the component is mounted AND when the specified **hotkey scope** is active.
-## Como ouvir teclas de atalho na prática?
+## How to listen for hotkeys in practice?
-Há dois passos envolvidos na configuração da escuta de teclas de atalho :
+There are two steps involved in setting up hotkey listening :
-1. Defina o [escopo da tecla de atalho](#what-is-a-hotkey-scope-) que ouvirá as teclas de atalho
-2. Use o hook `useScopedHotkeys` para ouvir as teclas de atalho
+1. Set the [hotkey scope](#what-is-a-hotkey-scope-) that will listen to hotkeys
+2. Use the `useScopedHotkeys` hook to listen to hotkeys
-Configurar escopos de teclas de atalho é necessário mesmo em páginas simples, porque outros elementos de UI como o menu à esquerda ou o menu de comando também podem ouvir teclas de atalho.
+Setting up hotkey scopes is required even in simple pages, because other UI elements like left menu or command menu might also listen to hotkeys.
-## Casos de uso para teclas de atalho
+## Use cases for hotkeys
-Em geral, você terá dois casos de uso que requerem teclas de atalho :
+In general, you'll have two use cases that require hotkeys :
-1. Em uma página ou um componente montado em uma página
-2. Em um componente do tipo modal que assume o foco devido a uma ação do usuário
+1. In a page or a component mounted in a page
+2. In a modal-type component that takes the focus due to a user action
-O segundo caso de uso pode ocorrer de forma recursiva : um dropdown em um modal, por exemplo.
+The second use case can happen recursively : a dropdown in a modal for example.
-### Ouvindo teclas de atalho em uma página
+### Listening to hotkeys in a page
-Exemplo :
+Example :
```tsx
const PageListeningEnter = () => {
@@ -45,37 +45,37 @@ const PageListeningEnter = () => {
goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope();
- // 1. Defina o escopo da tecla de atalho em um useEffect
+ // 1. Set the hotkey scope in a useEffect
useEffect(() => {
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleEnterPage,
);
- // Volte para o escopo de atalho anterior quando o componente for desmontado
+ // Revert to the previous hotkey scope when the component is unmounted
return () => {
goBackToPreviousHotkeyScope();
};
}, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
- // 2. Use o hook useScopedHotkeys
+ // 2. Use the useScopedHotkeys hook
useScopedHotkeys(
Key.Enter,
() => {
- // Alguma lógica executada nesta página quando o usuário pressiona Enter
+ // Some logic executed on this page when the user presses Enter
// ...
},
ExampleHotkeyScopes.ExampleEnterPage,
);
- return Minha página que escuta Enter
+ return My page that listens for Enter
;
};
```
-### Ouvindo teclas de atalho em um componente do tipo modal
+### Listening to hotkeys in a modal-type component
-Neste exemplo, usaremos um componente modal que ouve a tecla Escape para informar ao pai que feche.
+For this example we'll use a modal component that listens for the Escape key to tell its parent to close it.
-Aqui, a interação do usuário está mudando o escopo.
+Here the user interaction is changing the scope.
```tsx
const ExamplePageWithModal = () => {
@@ -87,7 +87,7 @@ const ExamplePageWithModal = () => {
} = usePreviousHotkeyScope();
const handleOpenModalClick = () => {
- // 1. Defina o escopo da tecla de atalho quando o usuário abrir o modal
+ // 1. Set the hotkey scope when user opens the modal
setShowModal(true);
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleModal,
@@ -95,26 +95,26 @@ const ExamplePageWithModal = () => {
};
const handleModalClose = () => {
- // 1. Volte para o escopo de atalho anterior quando o modal for fechado
+ // 1. Revert to the previous hotkey scope when the modal is closed
setShowModal(false);
goBackToPreviousHotkeyScope();
};
return
-
Minha página com um modal
- Abrir modal
+ My page with a modal
+ Open modal
{showModal && }
;
};
```
-Então no componente modal :
+Then in the modal component :
```tsx
const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
- // 2. Use o hook useScopedHotkeys para ouvir o Escape.
- // Note que Escape é uma tecla de atalho comum que pode ser usada por muitos outros componentes
- // Portanto, é importante usar um escopo de tecla para evitar conflitos
+ // 2. Use the useScopedHotkeys hook to listen for Escape.
+ // Note that escape is a common hotkey that could be used by many other components
+ // So it's important to use a hotkey scope to avoid conflicts
useScopedHotkeys(
Key.Escape,
() => {
@@ -123,23 +123,23 @@ const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
ExampleHotkeyScopes.ExampleModal,
);
- return Meu componente modal
;
+ return My modal component
;
};
```
-É importante usar esse padrão quando você não está seguro de que apenas usar um useEffect com mount/unmount será suficiente para evitar conflitos.
+It's important to use this pattern when you're not sure that just using a useEffect with mount/unmount will be enough to avoid conflicts.
-Esses conflitos podem ser difíceis de depurar, e pode acontecer com mais frequência do que o esperado com useEffects.
+Those conflicts can be hard to debug, and it might happen more often than not with useEffects.
-## O que é um escopo de tecla de atalho?
+## What is a hotkey scope?
-Um escopo de tecla de atalho é uma string que representa um contexto no qual as teclas de atalho estão ativas. Geralmente é codificado como um enum.
+A hotkey scope is a string that represents a context in which the hotkeys are active. It is generally encoded as an enum.
-Quando você altera o escopo da tecla de atalho, as teclas associadas a esse escopo serão ativadas e as teclas associadas a outros escopos serão desativadas.
+When you change the hotkey scope, the hotkeys that are listening to this scope will be enabled and the hotkeys that are listening to other scopes will be disabled.
-Você pode definir apenas um escopo por vez.
+You can set only one scope at a time.
-Como exemplo, os escopos de tecla de atalho para cada página são definidos no enum `PageHotkeyScope`:
+As an example, the hotkey scopes for each page are defined in the `PageHotkeyScope` enum:
```tsx
export enum PageHotkeyScope {
@@ -160,7 +160,7 @@ export enum PageHotkeyScope {
}
```
-Internamente, o escopo atualmente selecionado é armazenado em um estado Recoil que é compartilhado por toda a aplicação :
+Internally, the currently selected scope is stored in a Recoil state that is shared across the application :
```tsx
export const currentHotkeyScopeState = createState({
@@ -169,10 +169,10 @@ export const currentHotkeyScopeState = createState({
});
```
-Mas esse estado Recoil nunca deve ser manipulado manualmente! Veremos como usá-lo na próxima seção.
+But this Recoil state should never be handled manually ! We'll see how to use it in the next section.
-## Como funciona internamente?
+## How is it working internally?
-Criamos um wrapper leve em cima de [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) que o torna mais eficiente e evita renderizações desnecessárias.
+We made a thin wrapper on top of [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) that makes it more performant and avoids unnecessary re-renders.
-Também criamos um estado Recoil para gerenciar o estado do escopo da tecla de atalho e torná-lo disponível em toda a aplicação.
+We also create a Recoil state to handle the hotkey scope state and make it available everywhere in the application.
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/storybook.mdx
index 62e7a9ebf2..5c7f5fa52a 100644
--- a/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/storybook.mdx
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -1,8 +1,8 @@
---
title: Storybook
-description: Navegue pela biblioteca de componentes UI do Twenty
+description: Browse Twenty's UI component library
---
-Veja toda a nossa biblioteca de componentes e documentação no Storybook.
+View our complete component library and documentation in Storybook.
-[Abra o Storybook →](https://storybook.twenty.com)
+[Open Storybook →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/style-guide.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/style-guide.mdx
new file mode 100644
index 0000000000..e3ba4a44f0
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/style-guide.mdx
@@ -0,0 +1,290 @@
+---
+title: Style Guide
+---
+
+This document includes the rules to follow when writing code.
+
+The goal here is to have a consistent codebase, which is easy to read and easy to maintain.
+
+For this, it's better to be a bit more verbose than to be too concise.
+
+Always keep in mind that people read code more often than they write it, specially on an open source project, where anyone can contribute.
+
+There are a lot of rules that are not defined here, but that are automatically checked by linters.
+
+## React
+
+### Use functional components
+
+Always use TSX functional components.
+
+Do not use default `import` with `const`, because it's harder to read and harder to import with code completion.
+
+```tsx
+// ❌ Bad, harder to read, harder to import with code completion
+const MyComponent = () => {
+ return Hello World
;
+};
+
+export default MyComponent;
+
+// ✅ Good, easy to read, easy to import with code completion
+export function MyComponent() {
+ return Hello World
;
+};
+```
+
+### Props
+
+Create the type of the props and call it `(ComponentName)Props` if there's no need to export it.
+
+Use props destructuring.
+
+```tsx
+// ❌ Bad, no type
+export const MyComponent = (props) => Hello {props.name}
;
+
+// ✅ Good, type
+type MyComponentProps = {
+ name: string;
+};
+
+export const MyComponent = ({ name }: MyComponentProps) => Hello {name}
;
+```
+
+#### Refrain from using `React.FC` or `React.FunctionComponent` to define prop types
+
+```tsx
+/* ❌ - Bad, defines the component type annotations with `FC`
+ * - With `React.FC`, the component implicitly accepts a `children` prop
+ * even if it's not defined in the prop type. This might not always be
+ * desirable, especially if the component doesn't intend to render
+ * children.
+ */
+const EmailField: React.FC<{
+ value: string;
+}> = ({ value }) => ;
+```
+
+```tsx
+/* ✅ - Good, a separate type (OwnProps) is explicitly defined for the
+ * component's props
+ * - This method doesn't automatically include the children prop. If
+ * you want to include it, you have to specify it in OwnProps.
+ */
+type EmailFieldProps = {
+ value: string;
+};
+
+const EmailField = ({ value }: EmailFieldProps) => (
+
+);
+```
+
+#### No Single Variable Prop Spreading in JSX Elements
+
+Avoid using single variable prop spreading in JSX elements, like `{...props}`. This practice often results in code that is less readable and harder to maintain because it's unclear which props the component is receiving.
+
+```tsx
+/* ❌ - Bad, spreads a single variable prop into the underlying component
+ */
+const MyComponent = (props: OwnProps) => {
+ return ;
+}
+```
+
+```tsx
+/* ✅ - Good, Explicitly lists all props
+ * - Enhances readability and maintainability
+ */
+const MyComponent = ({ prop1, prop2, prop3 }: MyComponentProps) => {
+ return ;
+};
+```
+
+Rationale:
+
+* At a glance, it's clearer which props the code passes down, making it easier to understand and maintain.
+* It helps to prevent tight coupling between components via their props.
+* Linting tools make it easier to identify misspelled or unused props when you list props explicitly.
+
+## JavaScript
+
+### Use nullish-coalescing operator `??`
+
+```tsx
+// ❌ Bad, can return 'default' even if value is 0 or ''
+const value = process.env.MY_VALUE || 'default';
+
+// ✅ Good, will return 'default' only if value is null or undefined
+const value = process.env.MY_VALUE ?? 'default';
+```
+
+### Use optional chaining `?.`
+
+```tsx
+// ❌ Bad
+onClick && onClick();
+
+// ✅ Good
+onClick?.();
+```
+
+## TypeScript
+
+### Use `type` instead of `interface`
+
+Always use `type` instead of `interface`, because they almost always overlap, and `type` is more flexible.
+
+```tsx
+// ❌ Bad
+interface MyInterface {
+ name: string;
+}
+
+// ✅ Good
+type MyType = {
+ name: string;
+};
+```
+
+### Use string literals instead of enums
+
+[String literals](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types) are the go-to way to handle enum-like values in TypeScript. They are easier to extend with Pick and Omit, and offer a better developer experience, specially with code completion.
+
+You can see why TypeScript recommends avoiding enums [here](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
+
+```tsx
+// ❌ Bad, utilizes an enum
+enum Color {
+ Red = "red",
+ Green = "green",
+ Blue = "blue",
+}
+
+let color = Color.Red;
+```
+
+```tsx
+// ✅ Good, utilizes a string literal
+
+let color: "red" | "green" | "blue" = "red";
+```
+
+#### GraphQL and internal libraries
+
+You should use enums that GraphQL codegen generates.
+
+It's also better to use an enum when using an internal library, so the internal library doesn't have to expose a string literal type that is not related to the internal API.
+
+Example:
+
+```TSX
+const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+} = usePreviousHotkeyScope();
+
+setHotkeyScopeAndMemorizePreviousScope(
+ RelationPickerHotkeyScope.RelationPicker,
+);
+```
+
+## Styling
+
+### Use StyledComponents
+
+Style the components with [styled-components](https://emotion.sh/docs/styled).
+
+```tsx
+// ❌ Bad
+Hello World
+```
+
+```tsx
+// ✅ Good
+const StyledTitle = styled.div`
+ color: red;
+`;
+```
+
+Prefix styled components with "Styled" to differentiate them from "real" components.
+
+```tsx
+// ❌ Bad
+const Title = styled.div`
+ color: red;
+`;
+```
+
+```tsx
+// ✅ Good
+const StyledTitle = styled.div`
+ color: red;
+`;
+```
+
+### Theming
+
+Utilizing the theme for the majority of component styling is the preferred approach.
+
+#### Units of measurement
+
+Avoid using `px` or `rem` values directly within the styled components. The necessary values are generally already defined in the theme, so it’s recommended to make use of the theme for these purposes.
+
+#### Colors
+
+Refrain from introducing new colors; instead, use the existing palette from the theme. Should there be a situation where the palette does not align, please leave a comment so that the team can rectify it.
+
+```tsx
+// ❌ Bad, directly specifies style values without utilizing the theme
+const StyledButton = styled.button`
+ color: #333333;
+ font-size: 1rem;
+ font-weight: 400;
+ margin-left: 4px;
+ border-radius: 50px;
+`;
+```
+
+```tsx
+// ✅ Good, utilizes the theme
+const StyledButton = styled.button`
+ color: ${({ theme }) => theme.font.color.primary};
+ font-size: ${({ theme }) => theme.font.size.md};
+ font-weight: ${({ theme }) => theme.font.weight.regular};
+ margin-left: ${({ theme }) => theme.spacing(1)};
+ border-radius: ${({ theme }) => theme.border.rounded};
+`;
+```
+
+## Enforcing No-Type Imports
+
+Avoid type imports. To enforce this standard, an ESLint rule checks for and reports any type imports. This helps maintain consistency and readability in the TypeScript code.
+
+```tsx
+// ❌ Bad
+import { type Meta, type StoryObj } from '@storybook/react';
+
+// ❌ Bad
+import type { Meta, StoryObj } from '@storybook/react';
+
+// ✅ Good
+import { Meta, StoryObj } from '@storybook/react';
+```
+
+### Why No-Type Imports
+
+* **Consistency**: By avoiding type imports and using a single approach for both type and value imports, the codebase remains consistent in its module import style.
+
+* **Readability**: No-type imports improve code readability by making it clear when you're importing values or types. This reduces ambiguity and makes it easier to understand the purpose of imported symbols.
+
+* **Maintainability**: It enhances codebase maintainability because developers can identify and locate type-only imports when reviewing or modifying code.
+
+### ESLint Rule
+
+An ESLint rule, `@typescript-eslint/consistent-type-imports`, enforces the no-type import standard. This rule will generate errors or warnings for any type import violations.
+
+Please note that this rule specifically addresses rare edge cases where unintentional type imports occur. TypeScript itself discourages this practice, as mentioned in the [TypeScript 3.8 release notes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). In most situations, you should not need to use type-only imports.
+
+To ensure your code complies with this rule, make sure to run ESLint as part of your development workflow.
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/work-with-figma.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
new file mode 100644
index 0000000000..6cffcc405e
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
@@ -0,0 +1,59 @@
+---
+title: Work with Figma
+info: Learn how you can collaborate with Twenty's Figma
+---
+
+Figma is a collaborative interface design tool that aids in bridging the communication barrier between designers and developers.
+This guide explains how you can collaborate with Figma.
+
+## Access
+
+1. **Access the shared link:** You can access the project's Figma file [here](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty).
+2. **Sign in:** If you're not already signed in, Figma will prompt you to do so.
+ Key features are only available to logged-in users, such as the developer mode and the ability to select a dedicated frame.
+
+
+ You will not be able to collaborate effectively without an account.
+
+
+## Figma structure
+
+On the left sidebar, you can access the different pages of Twenty's Figma. This is how they're organized:
+
+* **Components page:** This is the first page. The designer uses it to create and organize the reusable design elements used throughout the design file. For example, buttons, icons, symbols, or any other reusable components. It serves to maintain consistency across the design.
+* **Main page:** The second page is the main page, which shows the complete user interface of the project. You can press ***Play*** to use the full app prototype.
+* **Features pages:** The other pages are typically dedicated to features in progress. They contain the design of specific features or modules of the application or website. They are typically still in progress.
+
+## Useful Tips
+
+With read-only access, you can't edit the design, but you can access all features that will be useful to convert the designs into code.
+
+### Use the Dev mode
+
+Figma's Dev Mode enhances developers' productivity by providing easy design navigation, effective asset management, efficient communication tools, toolbox integrations, quick code snippets, and key layer information, bridging the gap between design and development. You can learn more about Dev Mode [here](https://www.figma.com/dev-mode/).
+
+Switch to the "Developer" mode in the right part of the toolbar to see design specs, copy CSS, and access assets.
+
+### Use the Prototype
+
+Click on any element on the canvas and press the “Play” button at the top right edge of the interface to access the prototype view. Prototype mode allows you to interact with the design as if it were the final product. It demonstrates the flow between screens and how interface elements like buttons, links, or menus behave when interacted with.
+
+1. **Understanding transitions and animations:** In the Prototype mode, you can view any transitions or animations added by a designer between screens or UI elements, providing clear visual instructions to developers on the intended behavior and style.
+2. **Implementation clarification:** A prototype can also help reduce ambiguities. Developers can interact with it to gain a better understanding of the functionality or appearance of particular elements.
+
+For more comprehensive details and guidance on learning the Figma platform, you can visit the official [Figma Documentation](https://help.figma.com/hc/en-us).
+
+### Measure distances
+
+Select an element, hold `Option` key (Mac) or `Alt` key (Windows), then hover over another element to see the distance between them.
+
+### Figma extension for VSCode (Recommended)
+
+[Figma for VS Code](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension)
+lets you navigate and inspect design files, collaborate with designers, track changes, and speed up implementation - all without leaving your text editor.
+It's part of our recommended extensions.
+
+## Collaboration
+
+1. **Using Comments:** You are welcome to use the comment feature by clicking on the bubble icon in the left part of the toolbar.
+2. **Cursor chat:** A nice feature of Figma is the Cursor chat. Just press `;` on Mac and `/` on Windows to send a message if you see someone else using Figma as the same time as you.
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/local-setup.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/local-setup.mdx
new file mode 100644
index 0000000000..37d368d35e
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/local-setup.mdx
@@ -0,0 +1,333 @@
+---
+title: Local Setup
+description: The guide for contributors (or curious developers) who want to run Twenty locally.
+---
+
+## Prerequisites
+
+
+
+ Before you can install and use Twenty, make sure you install the following on your computer:
+
+ * [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+ * [Node v24.5.0](https://nodejs.org/en/download)
+ * [yarn v4](https://yarnpkg.com/getting-started/install)
+ * [nvm](https://github.com/nvm-sh/nvm/blob/master/README.md)
+
+
+ `npm` won't work, you should use `yarn` instead. Yarn is now shipped with Node.js, so you don't need to install it separately.
+ You only have to run `corepack enable` to enable Yarn if you haven't done it yet.
+
+
+
+
+ 1. Install WSL
+ Open PowerShell as Administrator and run:
+
+ ```powershell
+ wsl --install
+ ```
+
+ You should now see a prompt to restart your computer. If not, restart it manually.
+
+ Upon restart, a powershell window will open and install Ubuntu. This may take up some time.
+ You'll see a prompt to create a username and password for your Ubuntu installation.
+
+ 2. Install and configure git
+
+ ```bash
+ sudo apt-get install git
+
+ git config --global user.name "Your Name"
+
+ git config --global user.email "youremail@domain.com"
+ ```
+
+ 3. Install nvm, node.js and yarn
+
+
+ Use `nvm` to install the correct `node` version. The `.nvmrc` ensures all contributors use the same version.
+
+
+ ```bash
+ sudo apt-get install curl
+
+ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
+ ```
+
+ Close and reopen your terminal to use nvm. Then run the following commands.
+
+ ```bash
+
+ nvm install # installs recommended node version
+
+ nvm use # use recommended node version
+
+ corepack enable
+ ```
+
+
+
+---
+
+## Step 1: Git Clone
+
+In your terminal, run the following command.
+
+
+
+ If you haven't already set up SSH keys, you can learn how to do so [here](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/about-ssh).
+
+ ```bash
+ git clone git@github.com:twentyhq/twenty.git
+ ```
+
+
+
+ ```bash
+ git clone https://github.com/twentyhq/twenty.git
+ ```
+
+
+
+## Step 2: Position yourself at the root
+
+```bash
+cd twenty
+```
+
+You should run all commands in the following steps from the root of the project.
+
+## Step 3: Set up a PostgreSQL Database
+
+
+
+ **Option 1 (preferred):** To provision your database locally:
+ Use the following link to install Postgresql on your Linux machine: [Postgresql Installation](https://www.postgresql.org/download/linux/)
+
+ ```bash
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ Note: You might need to add `sudo -u postgres` to the command before `psql` to avoid permission errors.
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+ **Option 1 (preferred):** To provision your database locally with `brew`:
+
+ ```bash
+ brew install postgresql@16
+ export PATH="/opt/homebrew/opt/postgresql@16/bin:$PATH"
+ brew services start postgresql@16
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ You can verify if the PostgreSQL server is running by executing:
+
+ ```bash
+ brew services list
+ ```
+
+ The installer might not create the `postgres` user by default when installing
+ via Homebrew on MacOS. Instead, it creates a PostgreSQL role that matches your macOS
+ username (e.g., "john").
+ To check and create the `postgres` user if necessary, follow these steps:
+
+ ```bash
+ # Connect to PostgreSQL
+ psql postgres
+ or
+ psql -U $(whoami) -d postgres
+ ```
+
+ Once at the psql prompt (postgres=#), run:
+
+ ```bash
+ # List existing PostgreSQL roles
+ \du
+ ```
+
+ You'll see output similar to:
+
+ ```bash
+ Role name | Attributes | Member of
+ -----------+-------------+-----------
+ john | Superuser | {}
+ ```
+
+ If you do not see a `postgres` role listed, proceed to the next step.
+ Create the `postgres` role manually:
+
+ ```bash
+ CREATE ROLE postgres WITH SUPERUSER LOGIN;
+ ```
+
+ This creates a superuser role named `postgres` with login access.
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+ All the following steps are to be run in the WSL terminal (within your virtual machine)
+
+ **Option 1:** To provision your Postgresql locally:
+ Use the following link to install Postgresql on your Linux virtual machine: [Postgresql Installation](https://www.postgresql.org/download/linux/)
+
+ ```bash
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ Note: You might need to add `sudo -u postgres` to the command before `psql` to avoid permission errors.
+
+ **Option 2:** If you have docker installed:
+ Running Docker on WSL adds an extra layer of complexity.
+ Only use this option if you are comfortable with the extra steps involved, including turning on [Docker Desktop WSL2](https://docs.docker.com/desktop/wsl).
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+You can now access the database at [localhost:5432](localhost:5432), with user `postgres` and password `postgres` .
+
+## Step 4: Set up a Redis Database (cache)
+
+Twenty requires a redis cache to provide the best performance
+
+
+
+ **Option 1:** To provision your Redis locally:
+ Use the following link to install Redis on your Linux machine: [Redis Installation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+ **Option 1 (preferred):** To provision your Redis locally with `brew`:
+
+ ```bash
+ brew install redis
+ ```
+
+ Start your redis server:
+ `brew services start redis`
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+ **Option 1:** To provision your Redis locally:
+ Use the following link to install Redis on your Linux virtual machine: [Redis Installation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+If you need a Client GUI, we recommend [redis insight](https://redis.io/insight/) (free version available)
+
+## Step 5: Setup environment variables
+
+Use environment variables or `.env` files to configure your project. More info [here](/l/pt/developers/self-host/capabilities/setup)
+
+Copy the `.env.example` files in `/front` and `/server`:
+
+```bash
+cp ./packages/twenty-front/.env.example ./packages/twenty-front/.env
+cp ./packages/twenty-server/.env.example ./packages/twenty-server/.env
+```
+
+
+ **Multi-Workspace Mode:** By default, Twenty runs in single-workspace mode where only one workspace can be created. To enable multi-workspace support (useful for testing subdomain-based features), set `IS_MULTIWORKSPACE_ENABLED=true` in your server `.env` file. See [Multi-Workspace Mode](/l/pt/developers/self-host/capabilities/setup#multi-workspace-mode) for details.
+
+
+## Step 6: Installing dependencies
+
+To build Twenty server and seed some data into your database, run the following command:
+
+```bash
+yarn
+```
+
+Note that `npm` or `pnpm` won't work
+
+## Step 7: Running the project
+
+
+
+ Depending on your Linux distribution, Redis server might be started automatically.
+ If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro.
+
+
+
+ Redis should already be running. If not, run:
+
+ ```bash
+ brew services start redis
+ ```
+
+
+
+ Depending on your Linux distribution, Redis server might be started automatically.
+ If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro.
+
+
+
+Set up your database with the following command:
+
+```bash
+npx nx database:reset twenty-server
+```
+
+Start the server, the worker and the frontend services:
+
+```bash
+npx nx start twenty-server
+npx nx worker twenty-server
+npx nx start twenty-front
+```
+
+Alternatively, you can start all services at once:
+
+```bash
+npx nx start
+```
+
+## Step 8: Use Twenty
+
+**Frontend**
+
+Twenty's frontend will be running at [http://localhost:3001](http://localhost:3001).
+You can log in using the default demo account: `tim@apple.dev` (password: `tim@apple.dev`)
+
+**Backend**
+
+* Twenty's server will be up and running at [http://localhost:3000](http://localhost:3000)
+* The GraphQL API can be accessed at [http://localhost:3000/graphql](http://localhost:3000/graphql)
+* The REST API can be reached at [http://localhost:3000/rest](http://localhost:3000/rest)
+
+## Troubleshooting
+
+If you encounter any problem, check [Troubleshooting](/l/pt/developers/self-host/capabilities/troubleshooting) for solutions.
diff --git a/packages/twenty-docs/l/pt/developers/contribute/contribute.mdx b/packages/twenty-docs/l/pt/developers/contribute/contribute.mdx
new file mode 100644
index 0000000000..7dfe7a4325
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/contribute.mdx
@@ -0,0 +1,32 @@
+---
+title: Contribute
+description: Contribute to Twenty's open-source development.
+---
+
+
+
+
+
+## Overview
+
+Twenty is open-source and welcomes contributions from the community. Whether you're fixing bugs, adding features, or improving documentation, your contributions help make Twenty better for everyone.
+
+## Ways to Contribute
+
+* **Report bugs**: Help identify and document issues
+* **Submit features**: Propose and implement new functionality
+* **Improve documentation**: Make our docs clearer and more helpful
+* **Frontend development**: Work on the React-based UI
+* **Backend development**: Contribute to the NestJS server
+
+## Getting Started
+
+
+
+ Report issues or request features
+
+
+
+ Contribute to the UI
+
+
diff --git a/packages/twenty-docs/l/pt/developers/extend/capabilities/apis.mdx b/packages/twenty-docs/l/pt/developers/extend/capabilities/apis.mdx
new file mode 100644
index 0000000000..4358033f9d
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/extend/capabilities/apis.mdx
@@ -0,0 +1,147 @@
+---
+title: APIs
+description: Query and modify your CRM data programmatically using REST or GraphQL.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Twenty was built to be developer-friendly, offering powerful APIs that adapt to your custom data model. We provide four distinct API types to meet different integration needs.
+
+## Developer-First Approach
+
+Twenty generates APIs specifically for your data model:
+
+* **No long IDs required**: Use your object and field names directly in endpoints
+* **Standard and custom objects treated equally**: Your custom objects get the same API treatment as built-in ones
+* **Dedicated endpoints**: Each object and field gets its own API endpoint
+* **Custom documentation**: Generated specifically for your workspace's data model
+
+
+ Your personalized API documentation is available under **Settings → API & Webhooks** after creating an API key. Since Twenty generates APIs that match your custom data model, the documentation is unique to your workspace.
+
+
+## The Two API Types
+
+### Core API
+
+Accessed on `/rest/` or `/graphql/`
+
+Work with your actual **records** (the data):
+
+* Create, read, update, delete People, Companies, Opportunities, etc.
+* Query and filter data
+* Manage record relationships
+
+### Metadata API
+
+Accessed on `/rest/metadata/` or `/metadata/`
+
+Manage your **workspace and data model**:
+
+* Create, modify, or delete objects and fields
+* Configure workspace settings
+* Define relationships between objects
+
+## REST vs GraphQL
+
+Both Core and Metadata APIs are available in REST and GraphQL formats:
+
+| Format | Available Operations |
+| ----------- | ---------------------------------------------------------- |
+| **REST** | CRUD, batch operations, upserts |
+| **GraphQL** | Same + **batch upserts**, relationship queries in one call |
+
+Choose based on your needs — both formats access the same data.
+
+## API Endpoints
+
+| Environment | Base URL |
+| --------------- | ------------------------- |
+| **Cloud** | `https://api.twenty.com/` |
+| **Self-Hosted** | `https://{your-domain}/` |
+
+## Authentication
+
+Every API request requires an API key in the header:
+
+```
+Authorization: Bearer YOUR_API_KEY
+```
+
+### Create an API Key
+
+1. Go to **Settings → APIs & Webhooks**
+2. Click **+ Create key**
+3. Configure:
+ * **Name**: Descriptive name for the key
+ * **Expiration Date**: When the key expires
+4. Click **Save**
+5. **Copy immediately** — the key is only shown once
+
+
+
+
+ Your API key grants access to sensitive data. Don't share it with untrusted services. If compromised, disable it immediately and generate a new one.
+
+
+### Assign a Role to an API Key
+
+For better security, assign a specific role to limit access:
+
+1. Go to **Settings → Roles**
+2. Click on the role to assign
+3. Open the **Assignment** tab
+4. Under **API Keys**, click **+ Assign to API key**
+5. Select the API key
+
+The key will inherit that role's permissions. See [Permissions](/l/pt/user-guide/permissions-access/capabilities/permissions) for details.
+
+### Manage API Keys
+
+**Regenerate**: Settings → APIs & Webhooks → Click key → **Regenerate**
+
+**Delete**: Settings → APIs & Webhooks → Click key → **Delete**
+
+## API Playground
+
+Test your APIs directly in the browser with our built-in playground — available for both **REST** and **GraphQL**.
+
+### Access the Playground
+
+1. Go to **Settings → APIs & Webhooks**
+2. Create an API key (required)
+3. Click on **REST API** or **GraphQL API** to open the playground
+
+### What You Get
+
+* **Interactive documentation**: Generated for your specific data model
+* **Live testing**: Execute real API calls against your workspace
+* **Schema explorer**: Browse available objects, fields, and relationships
+* **Request builder**: Construct queries with autocomplete
+
+The playground reflects your custom objects and fields, so documentation is always accurate for your workspace.
+
+## Batch Operations
+
+Both REST and GraphQL support batch operations:
+
+* **Batch size**: Up to 60 records per request
+* **Operations**: Create, update, delete multiple records
+
+**GraphQL-only features:**
+
+* **Batch Upsert**: Create or update in one call
+* Use plural object names (e.g., `CreateCompanies` instead of `CreateCompany`)
+
+## Rate Limits
+
+API requests are throttled to ensure platform stability:
+
+| Limit | Value |
+| -------------- | -------------------- |
+| **Requests** | 100 calls per minute |
+| **Batch size** | 60 records per call |
+
+
+ Use batch operations to maximize throughput — process up to 60 records in a single API call instead of making individual requests.
+
diff --git a/packages/twenty-docs/l/pt/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/pt/developers/extend/capabilities/apps.mdx
new file mode 100644
index 0000000000..dc528fa780
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/extend/capabilities/apps.mdx
@@ -0,0 +1,522 @@
+---
+title: Twenty Apps
+description: Build and manage Twenty customizations as code.
+---
+
+
+ Apps are currently in alpha testing. The feature is functional but still evolving.
+
+
+## What Are Apps?
+
+Apps let you build and manage Twenty customizations **as code**. Instead of configuring everything through the UI, you define your data model and serverless functions in code — making it faster to build, maintain, and roll out to multiple workspaces.
+
+**What you can do today:**
+
+* Define custom objects and fields as code (managed data model)
+* Build serverless functions with custom triggers
+* Deploy the same app across multiple workspaces
+
+**Coming soon:**
+
+* Custom UI layouts and components
+
+## Prerequisites
+
+* Node.js 24+ and Yarn 4
+* A Twenty workspace and an API key (create one at https://app.twenty.com/settings/api-webhooks)
+
+## Getting Started
+
+Create a new app using the official scaffolder, then authenticate and start developing:
+
+```bash filename="Terminal"
+# Scaffold a new app
+npx create-twenty-app@latest my-twenty-app
+cd my-twenty-app
+
+# Authenticate using your API key (you'll be prompted)
+yarn auth
+
+# Start dev mode: automatically syncs local changes to your workspace
+yarn dev
+```
+
+From here you can:
+
+```bash filename="Terminal"
+# Add a new entity to your application (guided)
+yarn create-entity
+
+# Generate a typed Twenty client and workspace entity types
+yarn generate
+
+# Run a one‑time sync (instead of watch mode)
+yarn sync
+
+# Watch your application's functions logs
+yarn logs
+
+# Uninstall the application from the current workspace
+yarn uninstall
+
+# Display commands' help
+yarn help
+```
+
+See also: the CLI reference pages for [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) and [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk).
+
+## Project structure (scaffolded)
+
+When you run `npx create-twenty-app@latest my-twenty-app`, the scaffolder:
+
+* Copies a minimal base application into `my-twenty-app/`
+* Adds a local `twenty-sdk` dependency and Yarn 4 configuration
+* Creates config files and scripts wired to the `twenty` CLI
+* Generates a default application config and a default function role
+
+A freshly scaffolded app looks like this:
+
+```text filename="my-twenty-app/"
+my-twenty-app/
+ package.json
+ yarn.lock
+ .gitignore
+ .nvmrc
+ .yarnrc.yml
+ .yarn/
+ releases/
+ yarn-4.9.2.cjs
+ install-state.gz
+ eslint.config.mjs
+ tsconfig.json
+ README.md
+ src/
+ application.config.ts
+ role.config.ts
+ // your entities, actions, and other app files
+```
+
+At a high level:
+
+* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall`, and `auth` that delegate to the local `twenty` CLI.
+* **.gitignore**: Ignores common artifacts such as `node_modules`, `.yarn`, `generated/` (typed client), `dist/`, `build/`, coverage folders, log files, and `.env*` files.
+* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Lock and configure the Yarn 4 toolchain used by the project.
+* **.nvmrc**: Pins the Node.js version expected by the project.
+* **eslint.config.mjs** and **tsconfig.json**: Provide linting and TypeScript configuration for your app’s TypeScript sources.
+* **README.md**: A short README in the app root with basic instructions.
+* **src/**: The main place where you define your application-as-code:
+ * `application.config.ts`: Global configuration for your app (metadata and runtime wiring). See “Application config” below.
+ * `role.config.ts`: Default function role used by your serverless functions. See “Default function role” below.
+ * Future entities, actions/functions, and any supporting code you add.
+
+Later commands will add more files and folders:
+
+* `yarn generate` will create a `generated/` folder (typed Twenty client + workspace types).
+* `yarn create-entity` will add entity definition files under `src/` for your custom objects.
+
+## Authentication
+
+The first time you run `yarn auth`, you'll be prompted for:
+
+* API URL (defaults to http://localhost:3000 or your current workspace profile)
+* API key
+
+Your credentials are stored per-user in `~/.twenty/config.json`. You can maintain multiple profiles and switch using `--workspace `.
+
+Examples:
+
+```bash filename="Terminal"
+# Login interactively (recommended)
+yarn auth
+
+# Use a specific workspace profile
+yarn auth --workspace my-custom-workspace
+```
+
+## Use the SDK resources (types & config)
+
+The twenty-sdk provides typed building blocks you use inside your app. Below are the key pieces you'll touch most often.
+
+### Defining objects
+
+Custom objects are regular TypeScript classes annotated with decorators from `twenty-sdk`. They live under `src/objects/` in your app and describe both schema and behavior for records in your workspace.
+
+Here is an example `postCard` object from the Hello World app:
+
+```typescript
+import { type Note } from '../../generated';
+
+import {
+ type AddressField,
+ Field,
+ FieldType,
+ type FullNameField,
+ Object,
+ OnDeleteAction,
+ Relation,
+ RelationType,
+ STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS,
+} from 'twenty-sdk';
+
+enum PostCardStatus {
+ DRAFT = 'DRAFT',
+ SENT = 'SENT',
+ DELIVERED = 'DELIVERED',
+ RETURNED = 'RETURNED',
+}
+
+@Object({
+ universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05',
+ nameSingular: 'postCard',
+ namePlural: 'postCards',
+ labelSingular: 'Post card',
+ labelPlural: 'Post cards',
+ description: ' A post card object',
+ icon: 'IconMail',
+})
+export class PostCard {
+ @Field({
+ universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b',
+ type: FieldType.TEXT,
+ label: 'Content',
+ description: "Postcard's content",
+ icon: 'IconAbc',
+ })
+ content: string;
+
+ @Field({
+ universalIdentifier: 'c6aa31f3-da76-4ac6-889f-475e226009ac',
+ type: FieldType.FULL_NAME,
+ label: 'Recipient name',
+ icon: 'IconUser',
+ })
+ recipientName: FullNameField;
+
+ @Field({
+ universalIdentifier: '95045777-a0ad-49ec-98f9-22f9fc0c8266',
+ type: FieldType.ADDRESS,
+ label: 'Recipient address',
+ icon: 'IconHome',
+ })
+ recipientAddress: AddressField;
+
+ @Field({
+ universalIdentifier: '87b675b8-dd8c-4448-b4ca-20e5a2234a1e',
+ type: FieldType.SELECT,
+ label: 'Status',
+ icon: 'IconSend',
+ defaultValue: `'${PostCardStatus.DRAFT}'`,
+ options: [
+ { value: PostCardStatus.DRAFT, label: 'Draft', position: 0, color: 'gray' },
+ { value: PostCardStatus.SENT, label: 'Sent', position: 1, color: 'orange' },
+ { value: PostCardStatus.DELIVERED, label: 'Delivered', position: 2, color: 'green' },
+ { value: PostCardStatus.RETURNED, label: 'Returned', position: 3, color: 'orange' },
+ ],
+ })
+ status: PostCardStatus;
+
+ @Relation({
+ universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe',
+ type: RelationType.ONE_TO_MANY,
+ label: 'Notes',
+ icon: 'IconComment',
+ inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note,
+ onDelete: OnDeleteAction.CASCADE,
+ })
+ notes: Note[];
+
+ @Field({
+ universalIdentifier: 'e06abe72-5b44-4e7f-93be-afc185a3c433',
+ type: FieldType.DATE_TIME,
+ label: 'Delivered at',
+ icon: 'IconCheck',
+ isNullable: true,
+ defaultValue: null,
+ })
+ deliveredAt?: Date;
+}
+```
+
+Key points:
+
+* The `@Object` decorator defines the object identity and labels used across the workspace; its `universalIdentifier` must be unique and stable across deployments.
+* Each `@Field` decorator defines a field on the object with a type, label, and its own stable `universalIdentifier`.
+* `@Relation` wires this object to other objects (standard or custom) and controls cascade behavior with `onDelete`.
+* You can scaffold new objects using `yarn create-entity`, which guides you through naming, fields, and relationships, then generates object files similar to the `postCard` example.
+
+### Application config (application.config.ts)
+
+Every app has a single `application.config.ts` file that describes:
+
+* **Who the app is**: identifiers, display name, and description.
+* **How its functions run**: which role they use for permissions.
+* **(Optional) variables**: key–value pairs exposed to your functions as environment variables.
+
+When you scaffold a new app, you start with a minimal config:
+
+```typescript
+import { type ApplicationConfig } from 'twenty-sdk';
+
+const config: ApplicationConfig = {
+ universalIdentifier: '',
+ displayName: 'My Twenty App',
+ description: 'My first Twenty app',
+ functionRoleUniversalIdentifier: '',
+};
+
+export default config;
+```
+
+You can gradually extend this file as your app grows. For example, you can add an icon and application-scoped variables:
+
+```typescript
+import { type ApplicationConfig } from 'twenty-sdk';
+
+const config: ApplicationConfig = {
+ universalIdentifier: '',
+ displayName: 'My App',
+ description: 'What your app does',
+ icon: 'IconWorld', // Choose an icon by name
+ applicationVariables: {
+ DEFAULT_RECIPIENT_NAME: {
+ universalIdentifier: '',
+ description: 'Default recipient used by functions',
+ value: 'Jane Doe',
+ isSecret: false,
+ },
+ },
+ functionRoleUniversalIdentifier: '',
+};
+
+export default config;
+```
+
+Notes:
+
+* `universalIdentifier` fields are deterministic IDs you own; generate them once and keep them stable across syncs.
+* `applicationVariables` become environment variables for your functions (for example, `DEFAULT_RECIPIENT_NAME` is available as `process.env.DEFAULT_RECIPIENT_NAME`).
+* `functionRoleUniversalIdentifier` must match the role you define in `role.config.ts` (see below).
+
+#### Roles and permissions
+
+Applications can define roles that encapsulate permissions on your workspace’s objects and actions. The field `functionRoleUniversalIdentifier` in `application.config.ts` designates the default role used by your app’s serverless functions.
+
+* The runtime API key injected as `TWENTY_API_KEY` is derived from this default function role.
+* The typed client will be restricted to the permissions granted to that role.
+* Follow least‑privilege: create a dedicated role with only the permissions your functions need, then reference its universal identifier.
+
+##### Default function role (role.config.ts)
+
+When you scaffold a new app, the CLI also creates `src/role.config.ts`. This file exports the default role your serverless functions will use at runtime:
+
+```typescript
+import { PermissionFlag, type RoleConfig } from 'twenty-sdk';
+
+export const functionRole: RoleConfig = {
+ universalIdentifier: '',
+ label: 'My Twenty App default function role',
+ description: 'My Twenty App default function role',
+ canReadAllObjectRecords: true,
+ canUpdateAllObjectRecords: true,
+ canSoftDeleteAllObjectRecords: true,
+ canDestroyAllObjectRecords: false,
+};
+```
+
+The `universalIdentifier` of this role is automatically wired into `application.config.ts` as `functionRoleUniversalIdentifier`. In other words:
+
+* **role.config.ts** defines what the default function role can do.
+* **application.config.ts** points to that role so your functions inherit its permissions.
+
+As you move beyond the initial scaffold, you should tighten this role and make it explicit about what it can access. A more production-ready role might look closer to:
+
+```typescript
+import { PermissionFlag, type RoleConfig } from 'twenty-sdk';
+
+export const functionRole: RoleConfig = {
+ universalIdentifier: '',
+ label: 'Default function role',
+ description: 'Default role for function Twenty client',
+ canReadAllObjectRecords: false,
+ canUpdateAllObjectRecords: false,
+ canSoftDeleteAllObjectRecords: false,
+ canDestroyAllObjectRecords: false,
+ canUpdateAllSettings: false,
+ canBeAssignedToAgents: false,
+ canBeAssignedToUsers: false,
+ canBeAssignedToApiKeys: false,
+ objectPermissions: [
+ {
+ objectNameSingular: 'postCard',
+ canReadObjectRecords: true,
+ canUpdateObjectRecords: true,
+ canSoftDeleteObjectRecords: false,
+ canDestroyObjectRecords: false,
+ },
+ ],
+ fieldPermissions: [
+ {
+ objectNameSingular: 'postCard',
+ fieldName: 'content',
+ canReadFieldValue: false,
+ canUpdateFieldValue: false,
+ },
+ ],
+ permissionFlags: ['APPLICATIONS'],
+};
+```
+
+Notes:
+
+* Start from the scaffolded role, then progressively restrict it following least‑privilege.
+* Replace the `objectPermissions` and `fieldPermissions` with the objects/fields your functions need.
+* `permissionFlags` control access to platform-level capabilities. Keep them minimal; add only what you need.
+* See a working example in the Hello World app: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
+
+### Serverless function config and entrypoint
+
+Each function exports a main handler and a config describing its triggers. You can mix multiple trigger types.
+
+```typescript
+// src/actions/create-new-post-card.ts
+import type {
+ FunctionConfig,
+ DatabaseEventPayload,
+ ObjectRecordCreateEvent,
+ CronPayload,
+} from 'twenty-sdk';
+import Twenty, { type Person } from '../generated';
+
+// main handler can accept parameters from route, cron, or database events
+export const main = async (
+ params:
+ | { name?: string }
+ | DatabaseEventPayload>
+ | CronPayload,
+) => {
+ const client = new Twenty(); // generated typed client
+ const name = 'name' in params
+ ? params.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world'
+ : 'Hello world';
+
+ const result = await client.mutation({
+ createPostCard: {
+ __args: { data: { name } },
+ id: true,
+ name: true,
+ },
+ });
+ return result;
+};
+
+export const config: FunctionConfig = {
+ universalIdentifier: '',
+ name: 'create-new-post-card',
+ timeoutSeconds: 2,
+ triggers: [
+ // Public HTTP route trigger '/s/post-card/create'
+ {
+ universalIdentifier: '',
+ type: 'route',
+ path: '/post-card/create',
+ httpMethod: 'GET',
+ isAuthRequired: false,
+ },
+ // Cron trigger (CRON pattern)
+ {
+ universalIdentifier: '',
+ type: 'cron',
+ pattern: '0 0 1 1 *',
+ },
+ // Database event trigger
+ {
+ universalIdentifier: '',
+ type: 'databaseEvent',
+ eventName: 'person.created',
+ },
+ ],
+};
+```
+
+Common trigger types:
+
+* route: Exposes your function on an HTTP path and method **under the `/s/` endpoint**:
+
+> e.g. `path: '/post-card/create',` -> call on `/s/post-card/create`
+
+* cron: Runs your function on a schedule using a CRON expression.
+* databaseEvent: Runs on workspace object lifecycle events
+
+> e.g. `person.created`
+
+You can create new functions in two ways:
+
+* **Scaffolded**: Run `yarn create-entity --path ` and choose the option to add a new function. This generates a starter file under `` with a `main` handler and a `config` block similar to the example above.
+* **Manual**: Create a new file and export `main` and `config` yourself, following the same pattern.
+
+### Generated typed client
+
+Run yarn generate to create a local typed client in generated/ based on your workspace schema. Use it in your functions:
+
+```typescript
+import Twenty from './generated';
+
+const client = new Twenty();
+const { me } = await client.query({ me: { id: true, displayName: true } });
+```
+
+The client is re-generated by `yarn generate`. Re-run after changing your objects and `yarn sync` or when onboarding to a new workspace.
+
+#### Runtime credentials in serverless functions
+
+When your function runs on Twenty, the platform injects credentials as environment variables before your code executes:
+
+* `TWENTY_API_URL`: Base URL of the Twenty API your app targets.
+* `TWENTY_API_KEY`: Short‑lived key scoped to your application’s default function role.
+
+Notes:
+
+* You do not need to pass URL or API key to the generated client. It reads `TWENTY_API_URL` and `TWENTY_API_KEY` from process.env at runtime.
+* The API key’s permissions are determined by the role referenced in your `application.config.ts` via `functionRoleUniversalIdentifier`. This is the default role used by serverless functions of your application.
+* Applications can define roles to follow least‑privilege. Grant only the permissions your functions need, then point `functionRoleUniversalIdentifier` to that role’s universal identifier.
+
+### Hello World example
+
+Explore a minimal, end-to-end example that demonstrates objects, functions, and multiple triggers [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps/hello-world):
+
+## Manual setup (without the scaffolder)
+
+While we recommend using `create-twenty-app` for the best getting-started experience, you can also set up a project manually. Do not install the CLI globally. Instead, add `twenty-sdk` as a local dependency and wire scripts in your package.json:
+
+```bash filename="Terminal"
+yarn add -D twenty-sdk
+```
+
+Then add scripts like these:
+
+```json filename="package.json"
+{
+ "scripts": {
+ "auth": "twenty auth login",
+ "generate": "twenty app generate",
+ "dev": "twenty app dev",
+ "sync": "twenty app sync",
+ "uninstall": "twenty app uninstall",
+ "logs": "twenty app logs",
+ "create-entity": "twenty app add",
+ "help": "twenty --help"
+ }
+}
+```
+
+Now you can run the same commands via Yarn, e.g. `yarn dev`, `yarn sync`, etc.
+
+## Troubleshooting
+
+* Authentication errors: run `yarn auth` and ensure your API key has the required permissions.
+* Cannot connect to server: verify the API URL and that the Twenty server is reachable.
+* Types or client missing/outdated: run `yarn generate` and then `yarn dev`.
+* Dev mode not syncing: ensure `yarn dev` is running and that changes are not ignored by your environment.
+
+Discord Help Channel: https://discord.com/channels/1130383047699738754/1130386664812982322
diff --git a/packages/twenty-docs/l/pt/developers/extend/capabilities/webhooks.mdx b/packages/twenty-docs/l/pt/developers/extend/capabilities/webhooks.mdx
new file mode 100644
index 0000000000..34625d0080
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/extend/capabilities/webhooks.mdx
@@ -0,0 +1,112 @@
+---
+title: Webhooks
+description: Receive real-time notifications when events occur in your CRM.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Webhooks push data to your systems in real-time when events occur in Twenty — no polling required. Use them to keep external systems in sync, trigger automations, or send alerts.
+
+## Create a Webhook
+
+1. Go to **Settings → APIs & Webhooks → Webhooks**
+2. Click **+ Create webhook**
+3. Enter your webhook URL (must be publicly accessible)
+4. Click **Save**
+
+The webhook activates immediately and starts sending notifications.
+
+
+
+### Manage Webhooks
+
+**Edit**: Click the webhook → Update URL → **Save**
+
+**Delete**: Click the webhook → **Delete** → Confirm
+
+## Events
+
+Twenty sends webhooks for these event types:
+
+| Event | Example |
+| ------------------ | ---------------------------------------------------------- |
+| **Record Created** | `person.created`, `company.created`, `note.created` |
+| **Record Updated** | `person.updated`, `company.updated`, `opportunity.updated` |
+| **Record Deleted** | `person.deleted`, `company.deleted` |
+
+All event types are sent to your webhook URL. Event filtering may be added in future releases.
+
+## Payload Format
+
+Each webhook sends an HTTP POST with a JSON body:
+
+```json
+{
+ "event": "person.created",
+ "data": {
+ "id": "abc12345",
+ "firstName": "Alice",
+ "lastName": "Doe",
+ "email": "alice@example.com",
+ "createdAt": "2025-02-10T15:30:45Z",
+ "createdBy": "user_123"
+ },
+ "timestamp": "2025-02-10T15:30:50Z"
+}
+```
+
+| Field | Description |
+| ----------- | ------------------------------------------------ |
+| `event` | What happened (e.g., `person.created`) |
+| `data` | The full record that was created/updated/deleted |
+| `timestamp` | When the event occurred (UTC) |
+
+
+ Respond with a **2xx HTTP status** (200-299) to acknowledge receipt. Non-2xx responses are logged as delivery failures.
+
+
+## Webhook Validation
+
+Twenty signs each webhook request for security. Validate signatures to ensure requests are authentic.
+
+### Headers
+
+| Header | Description |
+| ---------------------------- | --------------------- |
+| `X-Twenty-Webhook-Signature` | HMAC SHA256 signature |
+| `X-Twenty-Webhook-Timestamp` | Request timestamp |
+
+### Validation Steps
+
+1. Get the timestamp from `X-Twenty-Webhook-Timestamp`
+2. Create the string: `{timestamp}:{JSON payload}`
+3. Compute HMAC SHA256 using your webhook secret
+4. Compare with `X-Twenty-Webhook-Signature`
+
+### Example (Node.js)
+
+```javascript
+const crypto = require("crypto");
+
+const timestamp = req.headers["x-twenty-webhook-timestamp"];
+const payload = JSON.stringify(req.body);
+const secret = "your-webhook-secret";
+
+const stringToSign = `${timestamp}:${payload}`;
+const expectedSignature = crypto
+ .createHmac("sha256", secret)
+ .update(stringToSign)
+ .digest("hex");
+
+const isValid = expectedSignature === req.headers["x-twenty-webhook-signature"];
+```
+
+## Webhooks vs Workflows
+
+| Method | Direction | Use Case |
+| ---------------------------- | --------- | ---------------------------------------------------------- |
+| **Webhooks** | OUT | Automatically notify external systems of any record change |
+| **Workflow + HTTP Request** | OUT | Send data out with custom logic (filters, transformations) |
+| **Workflow Webhook Trigger** | IN | Receive data into Twenty from external systems |
+
+For receiving external data, see [Set Up a Webhook Trigger](/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger).
diff --git a/packages/twenty-docs/l/pt/developers/extend/extend.mdx b/packages/twenty-docs/l/pt/developers/extend/extend.mdx
new file mode 100644
index 0000000000..2957b66534
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/extend/extend.mdx
@@ -0,0 +1,34 @@
+---
+title: Extend
+description: Extend Twenty's functionality with APIs, webhooks, and custom apps.
+---
+
+
+
+
+
+## Overview
+
+Twenty is designed to be extensible. Use our APIs, webhooks, and app framework to integrate with your existing tools and build custom functionality.
+
+## What You Can Do
+
+* **APIs**: Query and modify your CRM data programmatically using REST or GraphQL
+* **Webhooks**: Receive real-time notifications when events occur in Twenty
+* **Apps**: Build custom applications that extend Twenty's capabilities - Coming soon!
+
+## Getting Started
+
+
+
+ Connect to Twenty programmatically
+
+
+
+ Get notified of events in real-time
+
+
+
+ Build customizations as code (Alpha)
+
+
diff --git a/packages/twenty-docs/l/pt/developers/introduction.mdx b/packages/twenty-docs/l/pt/developers/introduction.mdx
new file mode 100644
index 0000000000..ed4c61c373
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/introduction.mdx
@@ -0,0 +1,23 @@
+---
+title: Getting Started
+description: Welcome to Twenty Developer Documentation, your resources for extending, self-hosting, and contributing to Twenty.
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+
+
+ Extend
+ Build integrations with APIs, webhooks, and custom apps.
+
+
+
+ Self-Host
+ Deploy and manage Twenty on your own infrastructure.
+
+
+
+ Contribute
+ Join our open-source community and contribute to Twenty.
+
+
diff --git a/packages/twenty-docs/l/pt/developers/self-host/capabilities/cloud-providers.mdx b/packages/twenty-docs/l/pt/developers/self-host/capabilities/cloud-providers.mdx
index 8476254c26..809388612a 100644
--- a/packages/twenty-docs/l/pt/developers/self-host/capabilities/cloud-providers.mdx
+++ b/packages/twenty-docs/l/pt/developers/self-host/capabilities/cloud-providers.mdx
@@ -1,45 +1,45 @@
---
-title: Outros métodos
+title: Other methods
---
- Este documento é mantido pela comunidade. Pode conter problemas.
+ This document is maintained by the community. It might contain issues.
-## Kubernetes via Terraform e Manifests
+## Kubernetes via Terraform and Manifests
-A documentação liderada pela comunidade para a implantação do Kubernetes está disponível [aqui](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s)
+Community-led documentation for Kubernetes deployment is available [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s)
### Coolify
-Implante o Twenty em servidores usando o Coolify. (imagem oficial no Coolify estará disponível em breve)
+Deploy Twenty on servers using Coolify. (official image on Coolify will be available soon)
-[Documentação Coolify](https://coolify.io/docs/get-started/introduction)
+[Coolify documentation](https://coolify.io/docs/get-started/introduction)
### EasyPanel
-Implante o Twenty no EasyPanel com o modelo mantido pela comunidade abaixo.
+Deploy Twenty on EasyPanel with the community maintained template below.
-[Implante no EasyPanel](https://easypanel.io/docs/templates/twenty)
+[Deploy on EasyPanel](https://easypanel.io/docs/templates/twenty)
### Elest.io
-Implante o Twenty em servidores com Elest.io usando o link abaixo.
+Deploy Twenty on servers with Elest.io using link below.
-[Implante no Elest.io](https://elest.io/open-source/twenty)
+[Deploy on Elest.io](https://elest.io/open-source/twenty)
-### Twenty no Railway
+### Twenty on Railway
-Implante o Twenty no Railway com o modelo mantido pela comunidade abaixo.
+Deploy Twenty on Railway with the community maintained template below.
-[](https://railway.com/deploy/nAL3hA)
+[](https://railway.com/deploy/nAL3hA)
-### Twenty no Sealos
+### Twenty on Sealos
-Implante o Twenty no Sealos com o modelo mantido pela comunidade abaixo.
+Deploy Twenty on Sealos with the community maintained template below.
-[](https://sealos.io/products/app-store/twenty)
+[](https://sealos.io/products/app-store/twenty)
-## Outros
+## Others
-Sinta-se à vontade para abrir um PR para adicionar mais opções de Provedor de Nuvem.
+Please feel free to Open a PR to add more Cloud Provider options.
diff --git a/packages/twenty-docs/l/pt/developers/self-host/capabilities/docker-compose.mdx b/packages/twenty-docs/l/pt/developers/self-host/capabilities/docker-compose.mdx
new file mode 100644
index 0000000000..0159c1c4e0
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/self-host/capabilities/docker-compose.mdx
@@ -0,0 +1,253 @@
+---
+title: 1-Click w/ Docker Compose
+---
+
+
+ Docker containers are for production hosting or self-hosting, for the contribution please check the [Local Setup](/l/pt/developers/contribute/capabilities/local-setup).
+
+
+## Overview
+
+This guide provides step-by-step instructions to install and configure the Twenty application using Docker Compose. The aim is to make the process straightforward and prevent common pitfalls that could break your setup.
+
+**Important:** Only modify settings explicitly mentioned in this guide. Altering other configurations may lead to issues.
+
+See docs [Setup Environment Variables](/l/pt/developers/self-host/capabilities/setup) for advanced configuration. All environment variables must be declared in the docker-compose.yml file at the server and / or worker level depending on the variable.
+
+## System Requirements
+
+* RAM: Ensure your environment has at least 2GB of RAM. Insufficient memory can cause processes to crash.
+* Docker & Docker Compose: Make sure both are installed and up-to-date.
+
+## Option 1: One-line script
+
+Install the latest stable version of Twenty with a single command:
+
+```bash
+bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
+```
+
+To install a specific version or branch:
+
+```bash
+VERSION=vx.y.z BRANCH=branch-name bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
+```
+
+* Replace x.y.z with the desired version number.
+* Replace branch-name with the name of the branch you want to install.
+
+## Option 2: Manual steps
+
+Follow these steps for a manual setup.
+
+### Step 1: Set Up the Environment File
+
+1. **Create the .env File**
+
+ Copy the example environment file to a new .env file in your working directory:
+
+ ```bash
+ curl -o .env https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/.env.example
+ ```
+
+2. **Generate Secret Tokens**
+
+ Run the following command to generate a unique random string:
+
+ ```bash
+ openssl rand -base64 32
+ ```
+
+ **Important:** Keep this value secret / do not share it.
+
+3. **Update the `.env`**
+
+ Replace the placeholder value in your .env file with the generated token:
+
+ ```ini
+ APP_SECRET=first_random_string
+ ```
+
+4. **Set the Postgres Password**
+
+ Update the `PG_DATABASE_PASSWORD` value in the .env file with a strong password without special characters.
+
+ ```ini
+ PG_DATABASE_PASSWORD=my_strong_password
+ ```
+
+### Step 2: Obtain the Docker Compose File
+
+Download the `docker-compose.yml` file to your working directory:
+
+```bash
+curl -o docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/docker-compose.yml
+```
+
+### Step 3: Launch the Application
+
+Start the Docker containers:
+
+```bash
+docker compose up -d
+```
+
+### Step 4: Access the Application
+
+If you host twentyCRM on your own computer, open your browser and navigate to [http://localhost:3000](http://localhost:3000).
+
+If you host it on a server, check that the server is running and that everything is ok with
+
+```bash
+curl http://localhost:3000
+```
+
+## Configuration
+
+### Expose Twenty to External Access
+
+By default, Twenty runs on `localhost` at port `3000`. To access it via an external domain or IP address, you need to configure the `SERVER_URL` in your `.env` file.
+
+#### Understanding `SERVER_URL`
+
+* **Protocol:** Use `http` or `https` depending on your setup.
+ * Use `http` if you haven't set up SSL.
+ * Use `https` if you have SSL configured.
+* **Domain/IP:** This is the domain name or IP address where your application is accessible.
+* **Port:** Include the port number if you're not using the default ports (`80` for `http`, `443` for `https`).
+
+### SSL Requirements
+
+SSL (HTTPS) is required for certain browser features to work properly. While these features might work during local development (as browsers treat localhost differently), a proper SSL setup is needed when hosting Twenty on a regular domain.
+
+For example, the clipboard API might require a secure context - some features like copy buttons throughout the application might not work without HTTPS enabled.
+
+We strongly recommend setting up Twenty behind a reverse proxy with SSL termination for optimal security and functionality.
+
+#### Configuring `SERVER_URL`
+
+1. **Determine Your Access URL**
+ * **Without Reverse Proxy (Direct Access):**
+
+ If you're accessing the application directly without a reverse proxy:
+
+ ```ini
+ SERVER_URL=http://your-domain-or-ip:3000
+ ```
+
+ * **With Reverse Proxy (Standard Ports):**
+
+ If you're using a reverse proxy like Nginx or Traefik and have SSL configured:
+
+ ```ini
+ SERVER_URL=https://your-domain-or-ip
+ ```
+
+ * **With Reverse Proxy (Custom Ports):**
+
+ If you're using non-standard ports:
+
+ ```ini
+ SERVER_URL=https://your-domain-or-ip:custom-port
+ ```
+
+2. **Update the `.env` File**
+
+ Open your `.env` file and update the `SERVER_URL`:
+
+ ```ini
+ SERVER_URL=http(s)://your-domain-or-ip:your-port
+ ```
+
+ **Examples:**
+
+ * Direct access without SSL:
+ ```ini
+ SERVER_URL=http://123.45.67.89:3000
+ ```
+ * Access via domain with SSL:
+ ```ini
+ SERVER_URL=https://mytwentyapp.com
+ ```
+
+3. **Restart the Application**
+
+ For changes to take effect, restart the Docker containers:
+
+ ```bash
+ docker compose down
+ docker compose up -d
+ ```
+
+#### Considerations
+
+* **Reverse Proxy Configuration:**
+
+ Ensure your reverse proxy forwards requests to the correct internal port (`3000` by default). Configure SSL termination and any necessary headers.
+
+* **Firewall Settings:**
+
+ Open necessary ports in your firewall to allow external access.
+
+* **Consistency:**
+
+ The `SERVER_URL` must match how users access your application in their browsers.
+
+#### Persistence
+
+* **Data Volumes:**
+
+ The Docker Compose configuration uses volumes to persist data for the database and server storage.
+
+* **Stateless Environments:**
+
+ If deploying to a stateless environment (e.g., certain cloud services), configure external storage to persist data.
+
+## Backup and Restore
+
+Regular backups protect your CRM data from loss.
+
+### Create a Database Backup
+
+```bash
+docker exec twenty-postgres pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql
+```
+
+### Automate Daily Backups
+
+Add to your crontab (`crontab -e`):
+
+```bash
+0 2 * * * docker exec twenty-postgres pg_dump -U postgres twenty > /backups/twenty_$(date +\%Y\%m\%d).sql
+```
+
+### Restore from Backup
+
+1. Stop the application:
+
+```bash
+docker compose stop twenty-server twenty-front
+```
+
+2. Restore the database:
+
+```bash
+docker exec -i twenty-postgres psql -U postgres twenty < backup_20240115.sql
+```
+
+3. Restart services:
+
+```bash
+docker compose up -d
+```
+
+### Backup Best Practices
+
+* **Test restores regularly** — verify backups actually work
+* **Store backups off-site** — use cloud storage (S3, GCS, etc.)
+* **Encrypt sensitive data** — protect backups with encryption
+* **Retain multiple copies** — keep daily, weekly, and monthly backups
+
+## Troubleshooting
+
+If you encounter any problem, check [Troubleshooting](/l/pt/developers/self-host/capabilities/troubleshooting) for solutions.
diff --git a/packages/twenty-docs/l/pt/developers/self-host/capabilities/setup.mdx b/packages/twenty-docs/l/pt/developers/self-host/capabilities/setup.mdx
new file mode 100644
index 0000000000..d6dcc3c122
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/self-host/capabilities/setup.mdx
@@ -0,0 +1,293 @@
+---
+title: Setup
+---
+
+# Configuration Management
+
+
+ **First time installing?** Follow the [Docker Compose installation guide](/l/pt/developers/self-host/capabilities/docker-compose) to get Twenty running, then return here for configuration.
+
+
+Twenty offers **two configuration modes** to suit different deployment needs:
+
+**Admin panel access:** Only users with admin privileges (`canAccessFullAdminPanel: true`) can access the configuration interface.
+
+## 1. Admin Panel Configuration (Default)
+
+```bash
+IS_CONFIG_VARIABLES_IN_DB_ENABLED=true # default
+```
+
+**Most configuration happens through the UI** after installation:
+
+1. Access your Twenty instance (usually `http://localhost:3000`)
+2. Go to **Settings / Admin Panel / Configuration Variables**
+3. Configure integrations, email, storage, and more
+4. Changes take effect immediately (within 15 seconds for multi-container deployments)
+
+
+ **Multi-Container Deployments:** When using database configuration (`IS_CONFIG_VARIABLES_IN_DB_ENABLED=true`), both server and worker containers read from the same database. Admin panel changes affect both automatically, eliminating the need to duplicate environment variables between containers (except for infrastructure variables).
+
+
+**What you can configure through the admin panel:**
+
+* **Authentication** - Google/Microsoft OAuth, password settings
+* **Email** - SMTP settings, templates, verification
+* **Storage** - S3 configuration, local storage paths
+* **Integrations** - Gmail, Google Calendar, Microsoft services
+* **Workflow & Rate Limiting** - Execution limits, API throttling
+* **And much more...**
+
+
+
+
+ Each variable is documented with descriptions in your admin panel at **Settings → Admin Panel → Configuration Variables**.
+ Some infrastructure settings like database connections (`PG_DATABASE_URL`), server URLs (`SERVER_URL`), and app secrets (`APP_SECRET`) can only be configured via `.env` file.
+
+ [Complete technical reference →](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts)
+
+
+## 2. Environment-Only Configuration
+
+```bash
+IS_CONFIG_VARIABLES_IN_DB_ENABLED=false
+```
+
+**All configuration managed through `.env` files:**
+
+1. Set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` in your `.env` file
+2. Add all configuration variables to your `.env` file
+3. Restart containers for changes to take effect
+4. Admin panel will show current values but cannot modify them
+
+## Multi-Workspace Mode
+
+By default, Twenty runs in **single-workspace mode** — ideal for most self-hosted deployments where you need one CRM instance for your organization.
+
+### Single-Workspace Mode (Default)
+
+```bash
+IS_MULTIWORKSPACE_ENABLED=false # default
+```
+
+* One workspace per Twenty instance
+* First user automatically becomes admin with full privileges (`canImpersonate` and `canAccessFullAdminPanel`)
+* New signups are disabled after the first workspace is created
+* Simple URL structure: `https://your-domain.com`
+
+### Enabling Multi-Workspace Mode
+
+```bash
+IS_MULTIWORKSPACE_ENABLED=true
+DEFAULT_SUBDOMAIN=app # default value
+```
+
+Enable multi-workspace mode for SaaS-like deployments where multiple independent teams need their own workspaces on the same Twenty instance.
+
+**Key differences from single-workspace mode:**
+
+* Multiple workspaces can be created on the same instance
+* Each workspace gets its own subdomain (e.g., `sales.your-domain.com`, `marketing.your-domain.com`)
+* Users sign up and log in at `{DEFAULT_SUBDOMAIN}.your-domain.com` (e.g., `app.your-domain.com`)
+* No automatic admin privileges — first user in each workspace is a regular user
+* Workspace-specific settings like subdomain and custom domain become available in workspace settings
+
+
+ **Environment-only setting:** `IS_MULTIWORKSPACE_ENABLED` can only be configured via `.env` file and requires a restart. It cannot be changed through the admin panel.
+
+
+### DNS Configuration for Multi-Workspace
+
+When using multi-workspace mode, configure your DNS with a wildcard record to allow dynamic subdomain creation:
+
+```
+*.your-domain.com -> your-server-ip
+```
+
+This enables automatic subdomain routing for new workspaces without manual DNS configuration.
+
+### Restricting Workspace Creation
+
+In multi-workspace mode, you may want to limit who can create new workspaces:
+
+```bash
+IS_WORKSPACE_CREATION_LIMITED_TO_SERVER_ADMINS=true
+```
+
+When enabled, only users with `canAccessFullAdminPanel` can create additional workspaces. Users can still create their first workspace during initial signup.
+
+## Gmail & Google Calendar Integration
+
+### Create Google Cloud Project
+
+1. Go to [Google Cloud Console](https://console.cloud.google.com/)
+2. Create a new project or select existing one
+3. Enable these APIs:
+
+* [Gmail API](https://console.cloud.google.com/apis/library/gmail.googleapis.com)
+* [Google Calendar API](https://console.cloud.google.com/apis/library/calendar-json.googleapis.com)
+* [People API](https://console.cloud.google.com/apis/library/people.googleapis.com)
+
+### Configure OAuth
+
+1. Go to [Credentials](https://console.cloud.google.com/apis/credentials)
+2. Create OAuth 2.0 Client ID
+3. Add these redirect URIs:
+ * `https://{your-domain}/auth/google/redirect` (for SSO)
+ * `https://{your-domain}/auth/google-apis/get-access-token` (for integrations)
+
+### Configure in Twenty
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Google Auth** section
+3. Set these variables:
+ * `MESSAGING_PROVIDER_GMAIL_ENABLED=true`
+ * `CALENDAR_PROVIDER_GOOGLE_ENABLED=true`
+ * `AUTH_GOOGLE_CLIENT_ID={client-id}`
+ * `AUTH_GOOGLE_CLIENT_SECRET={client-secret}`
+ * `AUTH_GOOGLE_CALLBACK_URL=https://{your-domain}/auth/google/redirect`
+ * `AUTH_GOOGLE_APIS_CALLBACK_URL=https://{your-domain}/auth/google-apis/get-access-token`
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
+
+**Required scopes** (automatically configured):
+[See relevant source code](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes.ts#L4-L10)
+
+* `https://www.googleapis.com/auth/calendar.events`
+* `https://www.googleapis.com/auth/gmail.readonly`
+* `https://www.googleapis.com/auth/profile.emails.read`
+
+### If your app is in test mode
+
+If your app is in test mode, you will need to add test users to your project.
+
+Under [OAuth consent screen](https://console.cloud.google.com/apis/credentials/consent), add your test users to the "Test users" section.
+
+## Microsoft 365 Integration
+
+
+ Users must have a [Microsoft 365 Licence](https://admin.microsoft.com/Adminportal/Home) to be able to use the Calendar and Messaging API. They will not be able to sync their account on Twenty without one.
+
+
+### Create a project in Microsoft Azure
+
+You will need to create a project in [Microsoft Azure](https://portal.azure.com/#view/Microsoft_AAD_IAM/AppGalleryBladeV2) and get the credentials.
+
+### Enable APIs
+
+On Microsoft Azure Console enable the following APIs in "Permissions":
+
+* Microsoft Graph: Mail.ReadWrite
+* Microsoft Graph: Mail.Send
+* Microsoft Graph: Calendars.Read
+* Microsoft Graph: User.Read
+* Microsoft Graph: openid
+* Microsoft Graph: email
+* Microsoft Graph: profile
+* Microsoft Graph: offline_access
+
+Note: "Mail.ReadWrite" and "Mail.Send" are only mandatory if you want to send emails using our workflow actions. You can use "Mail.Read" instead if you only want to receive emails.
+
+### Authorized redirect URIs
+
+You need to add the following redirect URIs to your project:
+
+* `https://{your-domain}/auth/microsoft/redirect` if you want to use Microsoft SSO
+* `https://{your-domain}/auth/microsoft-apis/get-access-token`
+
+### Configure in Twenty
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Microsoft Auth** section
+3. Set these variables:
+ * `MESSAGING_PROVIDER_MICROSOFT_ENABLED=true`
+ * `CALENDAR_PROVIDER_MICROSOFT_ENABLED=true`
+ * `AUTH_MICROSOFT_ENABLED=true`
+ * `AUTH_MICROSOFT_CLIENT_ID={client-id}`
+ * `AUTH_MICROSOFT_CLIENT_SECRET={client-secret}`
+ * `AUTH_MICROSOFT_CALLBACK_URL=https://{your-domain}/auth/microsoft/redirect`
+ * `AUTH_MICROSOFT_APIS_CALLBACK_URL=https://{your-domain}/auth/microsoft-apis/get-access-token`
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
+
+### Configure scopes
+
+[See relevant source code](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes.ts#L2-L9)
+
+* 'openid'
+* 'email'
+* 'profile'
+* 'offline_access'
+* 'Mail.ReadWrite'
+* 'Mail.Send'
+* 'Calendars.Read'
+
+### If your app is in test mode
+
+If your app is in test mode, you will need to add test users to your project.
+
+Add your test users to the "Users and groups" section.
+
+## Background Jobs for Calendar & Messaging
+
+After configuring Gmail, Google Calendar, or Microsoft 365 integrations, you need to start the background jobs that sync data.
+
+Register the following recurring jobs in your worker container:
+
+```bash
+# from your worker container
+yarn command:prod cron:messaging:messages-import
+yarn command:prod cron:messaging:message-list-fetch
+yarn command:prod cron:calendar:calendar-event-list-fetch
+yarn command:prod cron:calendar:calendar-events-import
+yarn command:prod cron:messaging:ongoing-stale
+yarn command:prod cron:calendar:ongoing-stale
+yarn command:prod cron:workflow:automated-cron-trigger
+```
+
+## Email Configuration
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Email** section
+3. Configure your SMTP settings:
+
+
+
+ You will need to provision an [App Password](https://support.google.com/accounts/answer/185833).
+
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=smtp.gmail.com
+ * EMAIL_SMTP_PORT=465
+ * EMAIL_SMTP_USER=gmail_email_address
+ * EMAIL_SMTP_PASSWORD='gmail_app_password'
+
+
+
+ Keep in mind that if you have 2FA enabled, you will need to provision an [App Password](https://support.microsoft.com/en-us/account-billing/manage-app-passwords-for-two-step-verification-d6dc8c6d-4bf7-4851-ad95-6d07799387e9).
+
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=smtp.office365.com
+ * EMAIL_SMTP_PORT=587
+ * EMAIL_SMTP_USER=office365_email_address
+ * EMAIL_SMTP_PASSWORD='office365_password'
+
+
+
+ **smtp4dev** is a fake SMTP email server for development and testing.
+
+ * Run the smtp4dev image: `docker run --rm -it -p 8090:80 -p 2525:25 rnwood/smtp4dev`
+ * Access the smtp4dev ui here: [http://localhost:8090](http://localhost:8090)
+ * Set the following variables:
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=localhost
+ * EMAIL_SMTP_PORT=2525
+
+
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
diff --git a/packages/twenty-docs/l/pt/developers/self-host/capabilities/troubleshooting.mdx b/packages/twenty-docs/l/pt/developers/self-host/capabilities/troubleshooting.mdx
new file mode 100644
index 0000000000..d2187aedac
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/self-host/capabilities/troubleshooting.mdx
@@ -0,0 +1,227 @@
+---
+title: Troubleshooting
+---
+
+## Troubleshooting
+
+If you encounter any problem while setting up environment for development, upgrading your instance or self-hosting,
+here are some solutions for common problems.
+
+### Self-hosting
+
+#### First install results in `password authentication failed for user "postgres"`
+
+🚨 **IMPORTANT: This solution is ONLY for fresh installations** 🚨
+If you have an existing Twenty instance with production data, **DO NOT** follow these steps as they will permanently delete your database!
+
+While installing Twenty for the first time, you might want to change the default database password.
+The password you set during the first installation becomes permanently stored in the database volume. If you later try to change this password in your configuration without removing the old volume, you'll get authentication errors because the database is still using the original password.
+
+⚠️ WARNING: Following steps will PERMANENTLY DELETE all database data! ⚠️
+Only proceed if this is a fresh installation with no important data.
+
+In order to update the `PG_DATABASE_PASSWORD` you need to:
+
+```sh
+# Update the PG_DATABASE_PASSWORD in .env
+docker compose down --volumes
+docker compose up -d
+```
+
+#### CR line breaks found [Windows]
+
+This is due to the line break characters of Windows and the git configuration. Try running:
+
+```
+git config --global core.autocrlf false
+```
+
+Then delete the repository and clone it again.
+
+#### Missing metadata schema
+
+During Twenty installation, you need to provision your postgres database with the right schemas, extensions, and users.
+If you're successful in running this provisioning, you should have `default` and `metadata` schemas in your database.
+If you don't, make sure you don't have more than one postgres instance running on your computer.
+
+#### Cannot find module 'twenty-emails' or its corresponding type declarations.
+
+You have to build the package `twenty-emails` before running the initialization of the database with `npx nx run twenty-emails:build`
+
+#### Missing twenty-x package
+
+Make sure to run yarn in the root directory and then run `npx nx server:dev twenty-server`. If this still doesn't work try building the missing package manually.
+
+#### Lint on Save not working
+
+This should work out of the box with the eslint extension installed. If this doesn't work try adding this to your vscode setting (on the dev container scope):
+
+```
+"editor.codeActionsOnSave": {
+
+ "source.fixAll.eslint": "explicit"
+
+}
+```
+
+#### While running `npx nx start` or `npx nx start twenty-front`, Out of memory error is thrown
+
+In `packages/twenty-front/.env` uncomment `VITE_DISABLE_TYPESCRIPT_CHECKER=true` to disable background checks thus reducing amount of needed RAM.
+
+**If it does not work:**
+Run only the services you need, instead of `npx nx start`. For instance, if you work on the server, run only `npx nx worker twenty-server`
+
+**If it does not work:**
+If you tried to run only `npx nx run twenty-server:start` on WSL and it's failing with the below memory error:
+
+`FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory`
+
+Workaround is to execute below command in terminal or add it in .bashrc profile to get setup automatically:
+
+`export NODE_OPTIONS="--max-old-space-size=8192"`
+
+The --max-old-space-size=8192 flag sets an upper limit of 8GB for the Node.js heap; usage scales with application demand.
+Reference: https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048
+
+**If it does not work:**
+Investigate which processes are taking you most of your machine RAM. At Twenty, we noticed that some VScode extensions were taking a lot of RAM so we temporarily disable them.
+
+**If it does not work:**
+Restart your machine helps to clean up ghost processes.
+
+#### While running `npx nx start` there are weird [0] and [1] in logs
+
+That's expected as command `npx nx start` is running more commands under the hood
+
+#### No emails are sent
+
+Most of the time, it's because the `worker` is not running in the background. Try to run
+
+```
+npx nx worker twenty-server
+```
+
+#### Cannot connect my Microsoft 365 account
+
+Most of the time, it's because your admin has not enabled the Microsoft 365 Licence for your account. Check [https://admin.microsoft.com/](https://admin.microsoft.com/Adminportal/Home).
+
+If you have an error code `AADSTS50020`, it probably means that you are using a personal Microsoft account. This is not supported yet. More info [here](https://learn.microsoft.com/fr-fr/troubleshoot/entra/entra-id/app-integration/error-code-aadsts50020-user-account-identity-provider-does-not-exist)
+
+#### While running `yarn` warnings appear in console
+
+Warnings are informing about pulling additional dependencies which aren't explicitly stated in `package.json`, so as long as no breaking error appears, everything should work as expected.
+
+#### When user accesses login page, error about unauthorized user trying to access workspace appears in logs
+
+That's expected as user is unauthorized when logged out since its identity is not verified.
+
+#### How to check if your worker is running?
+
+* Go to [webhook-test.com](https://webhook-test.com/) and copy **Your Unique Webhook URL**.
+
+
+
+
+
+* Open your Twenty app, navigate to `/settings`, and enable the **Advanced** toggle at the bottom left of the screen.
+* Create a new webhook.
+* Paste **Your Unique Webhook URL** in the **Endpoint Url** field in Twenty. Set the **Filters** to `Companies` and `Created`.
+
+
+
+
+
+* Go to `/objects/companies` and create a new company record.
+* Return to [webhook-test.com](https://webhook-test.com/) and check if a new **POST request** has been received.
+
+
+
+
+
+* If a **POST request** is received, your worker is running successfully. Otherwise, you need to troubleshoot your worker.
+
+#### Front-end fails to start and returns error TS5042: Option 'project' cannot be mixed with source files on a command line
+
+Comment out checker plugin in `packages/twenty-ui/vite-config.ts` like in example below
+
+```
+plugins: [
+ react({ jsxImportSource: '@emotion/react' }),
+ tsconfigPaths(),
+ svgr(),
+ dts(dtsConfig),
+ // checker(checkersConfig),
+ wyw({
+ include: [
+ '**/OverflowingTextWithTooltip.tsx',
+ '**/Chip.tsx',
+ '**/Tag.tsx',
+ '**/Avatar.tsx',
+ '**/AvatarChip.tsx',
+ ],
+ babelOptions: {
+ presets: ['@babel/preset-typescript', '@babel/preset-react'],
+ },
+ }),
+ ],
+```
+
+#### Admin panel not accessible
+
+Run `UPDATE core."user" SET "canAccessFullAdminPanel" = TRUE WHERE email = 'you@yourdomain.com';` in database container to get access to admin panel.
+
+### 1-click Docker compose
+
+#### Unable to Log In
+
+If you can't log in after setup:
+
+1. Run the following commands:
+ ```bash
+ docker exec -it twenty-server-1 yarn
+ docker exec -it twenty-server-1 npx nx database:reset --configuration=no-seed
+ ```
+2. Restart the Docker containers:
+ ```bash
+ docker compose down
+ docker compose up -d
+ ```
+
+Note the database:reset command will completely erase your database and recreate it from scratch.
+
+#### Connection Issues Behind a Reverse Proxy
+
+If you're running Twenty behind a reverse proxy and experiencing connection issues:
+
+1. **Verify SERVER_URL:**
+
+ Ensure `SERVER_URL` in your `.env` file matches your external access URL, including `https` if SSL is enabled.
+
+2. **Check Reverse Proxy Settings:**
+
+ * Confirm that your reverse proxy is correctly forwarding requests to the Twenty server.
+ * Ensure headers like `X-Forwarded-For` and `X-Forwarded-Proto` are properly set.
+
+3. **Restart Services:**
+
+ After making changes, restart both the reverse proxy and Twenty containers.
+
+#### Error when uploading an image - permission denied
+
+Switching the data folder ownership on the host from root to another user and group resolves this problem.
+
+## Getting Help
+
+If you encounter issues not covered in this guide:
+
+* Check Logs:
+
+ View container logs for error messages:
+
+ ```bash
+ docker compose logs
+ ```
+
+* Community Support:
+
+ Reach out to the [Twenty community](https://github.com/twentyhq/twenty/issues) or [support channels](https://discord.gg/cx5n4Jzs57) for assistance.
diff --git a/packages/twenty-docs/l/pt/developers/self-host/capabilities/upgrade-guide.mdx b/packages/twenty-docs/l/pt/developers/self-host/capabilities/upgrade-guide.mdx
new file mode 100644
index 0000000000..03a53f5685
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/self-host/capabilities/upgrade-guide.mdx
@@ -0,0 +1,381 @@
+---
+title: Upgrade guide
+---
+
+## General guidelines
+
+**Always make sure to back up your database before starting the upgrade process** by running `docker exec -it {db_container_name_or_id} pg_dumpall -U {postgres_user} > databases_backup.sql`.
+
+To restore backup, run `cat databases_backup.sql | docker exec -i {db_container_name_or_id} psql -U {postgres_user}`.
+
+If you used Docker Compose, follow these steps:
+
+1. In a terminal, on the host where Twenty is running, turn off Twenty: `docker compose down`
+
+2. Upgrade the version by changing the `TAG` value in the .env file near your docker-compose. ( We recommend consuming `major.minor` version such as `v0.53` )
+
+3. Bring Twenty back online with `docker compose up -d`
+
+If you want to upgrade your instance by few versions, e.g. from v0.33.0 to v0.35.0, you have to upgrade your instance sequentially, in this example from v0.33.0 to v0.34.0, then from v0.34.0 to v0.35.0.
+
+**Make sure that after each upgraded version you have non-corrupted backup.**
+
+## Version-specific upgrade steps
+
+## v1.0
+
+Hello Twenty v1.0! 🎉
+
+## v0.60
+
+### Performance Enhancements
+
+All interactions with the metadata API have been optimized for better performance, particularly for object metadata manipulation and workspace creation operations.
+
+We've refactored our caching strategy to prioritize cache hits over database queries when possible, significantly improving the performance of metadata API operations.
+
+If you encounter any runtime issues after upgrading, you may need to flush your cache to ensure it's synchronized with the latest changes. Run this command in your twenty-server container:
+
+```bash
+yarn command:prod cache:flush
+```
+
+### v0.55
+
+Upgrade your Twenty instance to use v0.55 image
+
+You don't need to run any command anymore, the new image will automatically care about running all required migrations.
+
+### `User does not have permission` error
+
+If you encounter authorization errors on most requests after upgrading, you may need to flush your cache to recompute the latest permissions.
+
+In your `twenty-server` container, run:
+
+```bash
+yarn command:prod cache:flush
+```
+
+This issue is specific to this Twenty version and should not be required for future upgrades.
+
+### v0.54
+
+Since version `0.53`, no manual actions needed.
+
+#### Metadata schema deprecation
+
+We've merged the `metadata` schema into the `core` one to simplify data retrieval from `TypeORM`.
+We have merged the `migrate` command step within the `upgrade` command. We do not recommend running `migrate` manually within any of your server/worker containers.
+
+### Since v0.53
+
+Starting from `0.53`, upgrade is programmatically done within the `DockerFile`, this means from now on, you shouldn't have to run any command manually anymore.
+
+Make sure to keep upgrading your instance sequentially, without skipping any major version (e.g. `0.43.3` to `0.44.0` is allowed, but `0.43.1` to `0.45.0` isn't), else could lead to workspace version desynchronization that could result in runtime error and missing functionality.
+
+To check if a workspace has been correctly migrated you can review its version in database in `core.workspace` table.
+
+It should always be in the range of your current Twenty's instance `major.minor` version, you can view your instance version in the admin panel (at `/settings/admin-panel`, accessible if your user has `canAccessFullAdminPanel` property set to true in the database) or by running `echo $APP_VERSION` in your `twenty-server` container.
+
+To fix a desynchronized workspace version, you will have to upgrade from the corresponding twenty's version following related upgrade guide sequentially and so on until it reaches desired version.
+
+#### `auditLog` removal
+
+We've removed the auditLog standard object, which means your backup size might be significantly reduced after this migration.
+
+### v0.51 to v0.52
+
+Upgrade your Twenty instance to use v0.52 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+#### I have a workspace blocked in version between `0.52.0` and `0.52.6`
+
+Unfortunately `0.52.0` and `0.52.6` have been completely removed from dockerHub.
+You will have to manually update your workspace version to `0.51.0` in database and upgrade using twenty version `0.52.11` following its just above upgrade guide.
+
+### v0.50 to v0.51
+
+Upgrade your Twenty instance to use v0.51 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+### v0.44.0 to v0.50.0
+
+Upgrade your Twenty instance to use v0.50.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+#### Docker-compose.yml mutation
+
+This version includes a `docker-compose.yml` mutation to give `worker` service access to the `server-local-data` volume.
+Please update your local `docker-compose.yml` with [v0.50.0 docker-compose.yml](https://github.com/twentyhq/twenty/blob/v0.50.0/packages/twenty-docker/docker-compose.yml)
+
+### v0.43.0 to v0.44.0
+
+Upgrade your Twenty instance to use v0.44.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+### v0.42.0 to v0.43.0
+
+Upgrade your Twenty instance to use v0.43.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+In this version, we have also switched to postgres:16 image in docker-compose.yml.
+
+#### (Option 1) Database migration
+
+Keeping the existing postgres-spilo image is fine, but you will have to freeze the version in your docker-compose.yml to be 0.43.0.
+
+#### (Option 2) Database migration
+
+If you want to migrate your database to the new postgres:16 image, please follow these steps:
+
+1. Dump your database from the old postgres-spilo container
+
+```
+docker exec -it twenty-db-1 sh
+pg_dump -U {YOUR_POSTGRES_USER} -d {YOUR_POSTGRES_DB} > databases_backup.sql
+exit
+docker cp twenty-db-1:/home/postgres/databases_backup.sql .
+```
+
+Make sure your dump file is not empty.
+
+2. Upgrade your docker-compose.yml to use postgres:16 image as in the [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) file.
+
+3. Restore the database to the new postgres:16 container
+
+```
+docker cp databases_backup.sql twenty-db-1:/databases_backup.sql
+docker exec -it twenty-db-1 sh
+psql -U {YOUR_POSTGRES_USER} -d {YOUR_POSTGRES_DB} -f databases_backup.sql
+exit
+```
+
+### v0.41.0 to v0.42.0
+
+Upgrade your Twenty instance to use v0.42.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.42
+```
+
+**Environment Variables**
+
+* Removed: `FRONT_PORT`, `FRONT_PROTOCOL`, `FRONT_DOMAIN`, `PORT`
+* Added: `FRONTEND_URL`, `NODE_PORT`, `MAX_NUMBER_OF_WORKSPACES_DELETED_PER_EXECUTION`, `MESSAGING_PROVIDER_MICROSOFT_ENABLED`, `CALENDAR_PROVIDER_MICROSOFT_ENABLED`, `IS_MICROSOFT_SYNC_ENABLED`
+
+### v0.40.0 to v0.41.0
+
+Upgrade your Twenty instance to use v0.41.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.41
+```
+
+**Environment Variables**
+
+* Removed: `AUTH_MICROSOFT_TENANT_ID`
+
+### v0.35.0 to v0.40.0
+
+Upgrade your Twenty instance to use v0.40.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.40
+```
+
+**Environment Variables**
+
+* Added: `IS_EMAIL_VERIFICATION_REQUIRED`, `EMAIL_VERIFICATION_TOKEN_EXPIRES_IN`, `WORKFLOW_EXEC_THROTTLE_LIMIT`, `WORKFLOW_EXEC_THROTTLE_TTL`
+
+### v0.34.0 to v0.35.0
+
+Upgrade your Twenty instance to use v0.35.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.35
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.35` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+* We replaced `ENABLE_DB_MIGRATIONS` with `DISABLE_DB_MIGRATIONS` (default value is now `false`, you probably don't have to set anything)
+
+### v0.33.0 to v0.34.0
+
+Upgrade your Twenty instance to use v0.34.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.34
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.34` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+* Removed: `FRONT_BASE_URL`
+* Added: `FRONT_DOMAIN`, `FRONT_PROTOCOL`, `FRONT_PORT`
+
+We have updated the way we handle the frontend URL.
+You can now set the frontend URL using the `FRONT_DOMAIN`, `FRONT_PROTOCOL` and `FRONT_PORT` variables.
+If FRONT_DOMAIN is not set, the frontend URL will fall back to `SERVER_URL`.
+
+### v0.32.0 to v0.33.0
+
+Upgrade your Twenty instance to use v0.33.0 image
+
+```
+yarn command:prod cache:flush
+yarn database:migrate:prod
+yarn command:prod upgrade-0.33
+```
+
+The `yarn command:prod cache:flush` command will flush the Redis cache.
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.33` takes care of the data migration of all workspaces.
+
+Starting from this version, twenty-postgres image for DB became deprecated and twenty-postgres-spilo is used instead.
+If you want to keep using twenty-postgres image, simply replace `twentycrm/twenty-postgres:${TAG}` with `twentycrm/twenty-postgres` in docker-compose.yml.
+
+### v0.31.0 to v0.32.0
+
+Upgrade your Twenty instance to use v0.32.0 image
+
+**Schema and data migration**
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.32
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.32` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+We have updated the way we handle the Redis connection.
+
+* Removed: `REDIS_HOST`, `REDIS_PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD`
+* Added: `REDIS_URL`
+
+Update your `.env` file to use the new `REDIS_URL` variable instead of the individual Redis connection parameters.
+
+We have also simplified the way we handle the JWT tokens.
+
+* Removed: `ACCESS_TOKEN_SECRET`, `LOGIN_TOKEN_SECRET`, `REFRESH_TOKEN_SECRET`, `FILE_TOKEN_SECRET`
+* Added: `APP_SECRET`
+
+Update your `.env` file to use the new `APP_SECRET` variable instead of the individual tokens secrets (you can use the same secret as before or generate a new random string)
+
+**Connected Account**
+
+If you are using connected account to synchronize your Google emails and calendars, you will need to activate the [People API](https://developers.google.com/people) on your Google Admin console.
+
+### v0.30.0 to v0.31.0
+
+Upgrade your Twenty instance to use v0.31.0 image
+
+**Schema and data migration**:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.31
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.31` takes care of the data migration of all workspaces.
+
+### v0.24.0 to v0.30.0
+
+Upgrade your Twenty instance to use v0.30.0 image
+
+**Breaking change**:
+To enhance performances, Twenty now requires redis cache to be configured. We have updated our [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) to reflect this.
+Make sure to update your configuration and to update your environment variables accordingly:
+
+```
+REDIS_HOST={your-redis-host}
+REDIS_PORT={your-redis-port}
+CACHE_STORAGE_TYPE=redis
+```
+
+**Schema and data migration**:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.30
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.30` takes care of the data migration of all workspaces.
+
+### v0.23.0 to v0.24.0
+
+Upgrade your Twenty instance to use v0.24.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.24
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.24` takes care of the data migration of all workspaces.
+
+### v0.22.0 to v0.23.0
+
+Upgrade your Twenty instance to use v0.23.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.23
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the Database.
+The `yarn command:prod upgrade-0.23` takes care of the data migration, including transferring activities to tasks/notes.
+
+### v0.21.0 to v0.22.0
+
+Upgrade your Twenty instance to use v0.22.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod workspace:sync-metadata -f
+yarn command:prod upgrade-0.22
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the Database.
+The `yarn command:prod workspace:sync-metadata -f` command will sync the definition of standard objects to the metadata tables and apply to required migrations to existing workspaces.
+The `yarn command:prod upgrade-0.22` command will apply specific data transformations to adapt to the new object defaultRequestInstrumentationOptions.
diff --git a/packages/twenty-docs/l/pt/developers/self-host/self-host.mdx b/packages/twenty-docs/l/pt/developers/self-host/self-host.mdx
new file mode 100644
index 0000000000..c54e695c6f
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/self-host/self-host.mdx
@@ -0,0 +1,30 @@
+---
+title: Self-Host
+description: Deploy and manage Twenty on your own infrastructure.
+---
+
+
+
+
+
+## Overview
+
+Twenty can be self-hosted on your own infrastructure, giving you full control over your data and deployment.
+
+## Why Self-Host?
+
+* **Data ownership**: Keep all CRM data on your own servers
+* **Compliance**: Meet regulatory requirements for data residency
+* **Customization**: Full access to modify and extend the platform
+
+## Getting Started
+
+
+
+ Quick setup with Docker
+
+
+
+ Deploy on AWS, GCP, or Azure
+
+
diff --git a/packages/twenty-docs/l/pt/navigation.json b/packages/twenty-docs/l/pt/navigation.json
index a07c691002..8096fbf4ac 100644
--- a/packages/twenty-docs/l/pt/navigation.json
+++ b/packages/twenty-docs/l/pt/navigation.json
@@ -1,91 +1,203 @@
{
"tabs": {
"userGuide": {
- "label": "Manual do Usuário",
+ "label": "User Guide",
"groups": {
- "gettingStarted": {
- "label": "Começando"
+ "discoverTwenty": {
+ "label": "Discover Twenty",
+ "groups": {
+ "gettingStartedCapabilities": {
+ "label": "Capabilities"
+ },
+ "gettingStartedHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"dataModel": {
- "label": "Modelo de Dados"
+ "label": "Data Model",
+ "groups": {
+ "dataModelCapabilities": {
+ "label": "Capabilities"
+ },
+ "dataModelHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "crmEssentials": {
- "label": "Essenciais do CRM"
+ "dataMigration": {
+ "label": "Data Migration",
+ "groups": {
+ "dataMigrationCapabilities": {
+ "label": "Capabilities"
+ },
+ "dataMigrationHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "views": {
- "label": "Visualizações"
+ "calendarEmails": {
+ "label": "Calendar & Emails",
+ "groups": {
+ "calendarEmailsCapabilities": {
+ "label": "Capabilities"
+ },
+ "calendarEmailsHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"workflows": {
- "label": "Workflows"
+ "label": "Workflows",
+ "groups": {
+ "workflowsCapabilities": {
+ "label": "Capabilities"
+ },
+ "workflowsHowTos": {
+ "label": "How-Tos",
+ "groups": {
+ "crmAutomations": {
+ "label": "CRM Automations"
+ },
+ "connectToOtherTools": {
+ "label": "Connect to Other Tools"
+ },
+ "advancedConfigurations": {
+ "label": "Advanced Configurations"
+ },
+ "needMoreHelp": {
+ "label": "Need More Help"
+ }
+ }
+ }
+ }
},
- "collaboration": {
- "label": "Colaboração"
+ "ai": {
+ "label": "AI",
+ "groups": {
+ "aiCapabilities": {
+ "label": "Capabilities"
+ },
+ "aiHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "integrationsApi": {
- "label": "Integrações e API"
+ "viewsPipelines": {
+ "label": "Views & Pipelines",
+ "groups": {
+ "viewsPipelinesCapabilities": {
+ "label": "Capabilities"
+ },
+ "viewsPipelinesHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "reporting": {
- "label": "Relatórios"
+ "dashboards": {
+ "label": "Dashboards",
+ "groups": {
+ "dashboardsCapabilities": {
+ "label": "Capabilities"
+ },
+ "dashboardsHowTos": {
+ "label": "How-Tos"
+ }
+ }
+ },
+ "permissionsAccess": {
+ "label": "Permissions & Access",
+ "groups": {
+ "permissionsAccessCapabilities": {
+ "label": "Capabilities"
+ },
+ "permissionsAccessHowTos": {
+ "label": "How-Tos"
+ }
+ }
+ },
+ "billing": {
+ "label": "Billing",
+ "groups": {
+ "billingCapabilities": {
+ "label": "Capabilities"
+ },
+ "billingHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"settings": {
- "label": "Configurações"
- },
- "pricing": {
- "label": "Preços"
- },
- "resources": {
- "label": "Recursos"
+ "label": "Settings",
+ "groups": {
+ "settingsCapabilities": {
+ "label": "Capabilities"
+ },
+ "settingsHowTos": {
+ "label": "How-Tos"
+ }
+ }
}
}
},
"developers": {
- "label": "Desenvolvedores",
+ "label": "Developers",
"groups": {
"developersGroup": {
- "label": "Desenvolvedores"
+ "label": "Developers"
},
- "devGettingStarted": {
- "label": "Começando",
+ "extend": {
+ "label": "Extend",
"groups": {
- "selfHosting": {
- "label": "Auto-Hospedagem"
- },
- "apiAndWebhooks": {
- "label": "API e Webhooks"
+ "extendCapabilities": {
+ "label": "Capabilities"
}
}
},
- "contributing": {
- "label": "Contribuindo",
+ "selfHost": {
+ "label": "Self-Host",
"groups": {
- "frontendDevelopment": {
- "label": "Desenvolvimento Frontend",
+ "selfHostCapabilities": {
+ "label": "Capabilities"
+ }
+ }
+ },
+ "contribute": {
+ "label": "Contribute",
+ "groups": {
+ "contributeCapabilities": {
+ "label": "Capabilities",
"groups": {
- "twentyUi": {
- "label": "Twenty UI",
+ "frontendDevelopment": {
+ "label": "Frontend Development",
"groups": {
- "display": {
- "label": "Exibição"
- },
- "feedback": {
- "label": "Feedback"
- },
- "input": {
- "label": "Input"
- },
- "navigation": {
- "label": "Navigation"
+ "twentyUi": {
+ "label": "Twenty UI",
+ "groups": {
+ "display": {
+ "label": "Display"
+ },
+ "feedback": {
+ "label": "Feedback"
+ },
+ "input": {
+ "label": "Input"
+ },
+ "navigation": {
+ "label": "Navigation"
+ }
+ }
}
}
+ },
+ "backendDevelopment": {
+ "label": "Backend Development"
}
}
- },
- "backendDevelopment": {
- "label": "Desenvolvimento de backend"
}
}
}
}
}
}
-}
\ No newline at end of file
+}
diff --git a/packages/twenty-docs/l/pt/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/pt/twenty-ui/display/app-tooltip.mdx
index 257426ad45..4e620eedc7 100644
--- a/packages/twenty-docs/l/pt/twenty-ui/display/app-tooltip.mdx
+++ b/packages/twenty-docs/l/pt/twenty-ui/display/app-tooltip.mdx
@@ -1,78 +1,78 @@
---
-title: Dica do Aplicativo
+title: App Tooltip
image: /images/user-guide/tips/light-bulb.png
---
-
+
-Uma mensagem breve que exibe informações adicionais quando um usuário interage com um elemento.
+A brief message that displays additional information when a user interacts with an element.
-
+
```jsx
import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
export const MyComponent = () => {
- return (
- <>
-
- Customer Insights
-
-
- >
- );
+ return (
+ <>
+
+ Customer Insights
+
+
+ >
+ );
};
```
-
- | Propriedades | Tipo | Descrição |
- | ---------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
- | className | string | Classe CSS opcional para estilização adicional. |
- | anchorSelect | Seleção CSS | Seletor para o âncora da dica (o elemento que aciona a dica) |
- | conteúdo | string | O conteúdo que deseja exibir na dica |
- | delayHide | número | O atraso em segundos antes de ocultar a dica após o cursor deixar a âncora. |
- | offset | número | O deslocamento em pixels para posicionar a dica. |
- | noArrow | booleano | Se `true`, oculta a seta na dica. |
- | isOpen | booleano | Se `true`, a dica está aberta por padrão. |
- | local | string `PlacesType` de `react-tooltip` | Especifica o posicionamento da dica. Os valores incluem `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, e `left-end`. |
- | positionStrategy | string `PositionStrategy` de `react-tooltip` | Estratégia de posição para a dica. Possui dois valores: `absolute` e `fixed`. |
+
+ | Props | Type | Description |
+ | ---------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional CSS class for additional styling |
+ | anchorSelect | CSS selector | Selector for the tooltip anchor (the element that triggers the tooltip) |
+ | content | string | The content you want to display within the tooltip |
+ | delayHide | number | The delay in seconds before hiding the tooltip after the cursor leaves the anchor |
+ | offset | number | The offset in pixels for positioning the tooltip |
+ | noArrow | boolean | If `true`, hides the arrow on the tooltip |
+ | isOpen | boolean | If `true`, the tooltip is open by default |
+ | place | `PlacesType` string from `react-tooltip` | Specifies the placement of the tooltip. Values include `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, and `left-end` |
+ | positionStrategy | `PositionStrategy` string from `react-tooltip` | Position strategy for the tooltip. Has two values: `absolute` and `fixed` |
-## Texto Overflow com Dica
+## Overflowing Text with Tooltip
-Lida com texto em excesso e exibe uma dica quando o texto transborda.
+Handles overflowing text and displays a tooltip when the text overflows.
-
+
```jsx
import { OverflowingTextWithTooltip } from 'twenty-ui/display';
export const MyComponent = () => {
- const crmTaskDescription =
- 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
+ const crmTaskDescription =
+ 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
- return ;
+ return ;
};
```
-
- | Propriedades | Tipo | Descrição |
- | ------------ | ------ | ------------------------------------------------------------- |
- | texto | string | O conteúdo que você deseja exibir na área de texto excessivo. |
+
+ | Props | Type | Description |
+ | ----- | ------ | ------------------------------------------------------------ |
+ | text | string | The content you want to display in the overflowing text area |
diff --git a/packages/twenty-docs/l/pt/twenty-ui/display/checkmark.mdx b/packages/twenty-docs/l/pt/twenty-ui/display/checkmark.mdx
new file mode 100644
index 0000000000..ef84d5c2d5
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/display/checkmark.mdx
@@ -0,0 +1,58 @@
+---
+title: Checkmark
+image: /images/user-guide/tasks/tasks_header.png
+---
+
+
+
+
+
+Represents a successful or completed action.
+
+
+
+ ```jsx
+ import { Checkmark } from 'twenty-ui/display';
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ Extends `React.ComponentPropsWithoutRef<'div'>` and accepts all the props of a regular `div` element.
+
+
+
+## Animated Checkmark
+
+Represents a checkmark icon with the added feature of animation.
+
+
+
+ ```jsx
+ import { AnimatedCheckmark } from 'twenty-ui/display';
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ----------- | ------- | ------------------------------------------- | ----------- |
+ | isAnimating | boolean | Controls whether the checkmark is animating | false |
+ | color | string | Color of the checkmark | |
+ | duration | number | The duration of the animation in seconds | 0.5 seconds |
+ | size | number | The size of the checkmark | 28 pixels |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/display/chip.mdx b/packages/twenty-docs/l/pt/twenty-ui/display/chip.mdx
new file mode 100644
index 0000000000..ded2fd1c77
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/display/chip.mdx
@@ -0,0 +1,138 @@
+---
+title: Chip
+image: /images/user-guide/github/github-header.png
+---
+
+
+
+
+
+A visual element that you can use as a clickable or non-clickable container with a label, optional left and right components, and various styling options to display labels and tags.
+
+
+
+ ```jsx
+ import { Chip } from 'twenty-ui/components';
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------ | ------------------------ | -------------------------------------------------------------------------------------------- |
+ | linkToEntity | string | The link to the entity |
+ | entityId | string | The unique identifier for the entity |
+ | name | string | The name of the entity |
+ | pictureUrl | string | s picture", |
+ | avatarType | Avatar Type | The type of avatar you want to display. Has two options: `rounded` and `squared` |
+ | variant | `EntityChipVariant` enum | Variant of the entity chip you want to display. Has two options: `regular` and `transparent` |
+ | LeftIcon | IconComponent | A React component representing an icon. Displayed on the left side of the chip |
+
+
+
+## Examples
+
+### Transparent Disabled Chip
+
+```jsx
+import { Chip } from 'twenty-ui/components';
+
+export const MyComponent = () => {
+ return (
+
+ );
+};
+
+```
+
+
+
+### Disabled Chip with Tooltip
+
+```jsx
+import { Chip } from "twenty-ui/components";
+
+export const MyComponent = () => {
+ return (
+
+ );
+};
+```
+
+## Entity Chip
+
+A Chip-like element to display information about an entity.
+
+
+
+ ```jsx
+ import { BrowserRouter as Router } from 'react-router-dom';
+ import { IconTwentyStar } from 'twenty-ui/display';
+ import { Chip } from 'twenty-ui/components';
+
+ export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------ | ------------------------ | -------------------------------------------------------------------------------------------- |
+ | linkToEntity | string | The link to the entity |
+ | entityId | string | The unique identifier for the entity |
+ | name | string | The name of the entity |
+ | pictureUrl | string | s picture", |
+ | avatarType | Avatar Type | The type of avatar you want to display. Has two options: `rounded` and `squared` |
+ | variant | `EntityChipVariant` enum | Variant of the entity chip you want to display. Has two options: `regular` and `transparent` |
+ | LeftIcon | IconComponent | A React component representing an icon. Displayed on the left side of the chip |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/display/icons.mdx b/packages/twenty-docs/l/pt/twenty-ui/display/icons.mdx
new file mode 100644
index 0000000000..2d73154c8d
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/display/icons.mdx
@@ -0,0 +1,73 @@
+---
+title: Icons
+image: /images/user-guide/objects/objects.png
+---
+
+
+
+
+
+A list of icons used throughout our app.
+
+## Tabler Icons
+
+We use Tabler icons for React throughout the app.
+
+
+
+
+
+ ```
+ yarn add @tabler/icons-react
+ ```
+
+
+
+ You can import each icon as a component. Here's an example:
+
+
+
+ ```jsx
+ import { IconArrowLeft } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ------ | ------ | ------------------------------------------ | ------------ |
+ | size | number | The height and width of the icon in pixels | 24 |
+ | color | string | The color of the icons | currentColor |
+ | stroke | number | The stroke width of the icon in pixels | 2 |
+
+
+
+## Custom Icons
+
+In addition to Tabler icons, the app also uses some custom icons.
+
+### Icon Address Book
+
+Displays an address book icon.
+
+
+
+ ```jsx
+ import { IconAddressBook } from 'twenty-ui/display';
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ------ | ------ | ------------------------------------------ | ------- |
+ | size | number | The height and width of the icon in pixels | 24 |
+ | stroke | number | The stroke width of the icon in pixels | 2 |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/display/soon-pill.mdx b/packages/twenty-docs/l/pt/twenty-ui/display/soon-pill.mdx
new file mode 100644
index 0000000000..56ace0bae7
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/display/soon-pill.mdx
@@ -0,0 +1,18 @@
+---
+title: Soon Pill
+image: /images/user-guide/kanban-views/kanban.png
+---
+
+
+
+
+
+A small badge or "pill" to indicate something is coming soon.
+
+```jsx
+import { SoonPill } from "@/ui/display/pill/components/SoonPill";
+
+export const MyComponent = () => {
+ return ;
+};
+```
diff --git a/packages/twenty-docs/l/pt/twenty-ui/display/tag.mdx b/packages/twenty-docs/l/pt/twenty-ui/display/tag.mdx
new file mode 100644
index 0000000000..a2226c88d4
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/display/tag.mdx
@@ -0,0 +1,38 @@
+---
+title: Tag
+image: /images/user-guide/table-views/table.png
+---
+
+
+
+
+
+Component to visually categorize or label content.
+
+
+
+ ```jsx
+ import { Tag } from "@/ui/display/tag/components/Tag";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | color | string | Color of the tag. Options include: `green`, `turquoise`, `sky`, `blue`, `purple`, `pink`, `red`, `orange`, `yellow`, `gray` |
+ | text | string | The content of the tag |
+ | onClick | function | Optional function called when a user clicks on the tag |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/input.mdx b/packages/twenty-docs/l/pt/twenty-ui/input.mdx
index 70eff960cc..2da701caf5 100644
--- a/packages/twenty-docs/l/pt/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/pt/twenty-ui/input.mdx
@@ -1,8 +1,8 @@
---
-title: Entrada
+title: Input
image: /images/user-guide/tips/light-bulb.png
---
-
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/input/block-editor.mdx b/packages/twenty-docs/l/pt/twenty-ui/input/block-editor.mdx
index a8260f22ef..9943fa5f5d 100644
--- a/packages/twenty-docs/l/pt/twenty-ui/input/block-editor.mdx
+++ b/packages/twenty-docs/l/pt/twenty-ui/input/block-editor.mdx
@@ -1,5 +1,5 @@
---
-title: Editor de Blocos
+title: Block Editor
image: /images/user-guide/api/api.png
---
@@ -7,28 +7,25 @@ image: /images/user-guide/api/api.png
-Usa um editor de texto rico baseado em blocos do [BlockNote](https://www.blocknotejs.org/) para permitir que os usuários editem e vejam blocos de conteúdo.
+Uses a block-based rich text editor from [BlockNote](https://www.blocknotejs.org/) to allow users to edit and view blocks of content.
-
+
+ ```jsx
+ import { useBlockNote } from "@blocknote/react";
+ import { BlockEditor } from "@/ui/input/editor/components/BlockEditor";
-```jsx
-import { useBlockNote } from "@blocknote/react";
-import { BlockEditor } from "@/ui/input/editor/components/BlockEditor";
+ export const MyComponent = () => {
+ const BlockNoteEditor = useBlockNote();
-export const MyComponent = () => {
- const BlockNoteEditor = useBlockNote();
+ return ;
+ };
+ ```
+
- return ;
-};
-```
-
-
-
-
-| Propriedades | Tipo | Descrição |
-| ------------ | ----------------- | ----------------------------------------------- |
-| editor | `BlockNoteEditor` | A instância ou configuração do editor de blocos |
-
-
+
+ | Props | Type | Description |
+ | ------ | ----------------- | ------------------------------------------ |
+ | editor | `BlockNoteEditor` | The block editor instance or configuration |
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/input/buttons.mdx b/packages/twenty-docs/l/pt/twenty-ui/input/buttons.mdx
new file mode 100644
index 0000000000..1c53eb1816
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/input/buttons.mdx
@@ -0,0 +1,439 @@
+---
+title: Buttons
+image: /images/user-guide/views/filter.png
+---
+
+
+
+
+
+A list of buttons and button groups used throughout the app.
+
+## Button
+
+
+
+ ```jsx
+ import { Button } from "@/ui/input/button/components/Button";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional class name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | fullWidth | boolean | Defines whether the button should span the whole width of its container |
+ | variant | string | The visual style variant of the button. Options include `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` |
+ | accent | string | The accent color of the button. Options include: `default`, `blue`, and `danger` |
+ | soon | boolean | Indicates if the button is marked as "soon" (such as for upcoming features) |
+ | disabled | boolean | Specifies whether the button is disabled or not |
+ | focus | boolean | Determines if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Button Group
+
+
+
+ ```jsx
+ import { Button } from "@/ui/input/button/components/Button";
+ import { ButtonGroup } from "@/ui/input/button/components/ButtonGroup";
+
+ export const MyComponent = () => {
+ return (
+
+ console.log("click")}
+ />
+ console.log("click")}
+ />
+ console.log("click")}
+ />
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------- | ---------------------------------------------------------------------------------------------------------------- |
+ | variant | string | The visual style variant of the buttons within the group. Options include `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the buttons within the group. Has two options: `medium` and `small` |
+ | accent | string | The accent color of the buttons within the group. Options include `default`, `blue` and `danger` |
+ | className | string | Optional class name for additional styling |
+ | children | ReactNode | An array of React elements representing the individual buttons within the group |
+
+
+
+## Floating Button
+
+
+
+ ```jsx
+ import { FloatingButton } from "@/ui/input/button/components/FloatingButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | --------------------- | ---------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `middle`, `right` |
+ | applyShadow | boolean | Determines whether to apply shadow to a button |
+ | applyBlur | boolean | Determines whether to apply a blur effect to the button |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+
+
+
+## Floating Button Group
+
+
+
+ ```jsx
+ import { FloatingButton } from "@/ui/input/button/components/FloatingButton";
+ import { FloatingButtonGroup } from "@/ui/input/button/components/FloatingButtonGroup";
+ import { IconClipboardText, IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+
+
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | -------- | --------- | ------------------------------------------------------------------------------- | ------- |
+ | size | string | The size of the button. Has two options: `small` and `medium` | small |
+ | children | ReactNode | An array of React elements representing the individual buttons within the group | |
+
+
+
+## Floating Icon Button
+
+
+
+ ```jsx
+ import { FloatingIconButton } from "@/ui/input/button/components/FloatingIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ isActive={true}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` |
+ | applyShadow | boolean | Determines whether to apply shadow to a button |
+ | applyBlur | boolean | Determines whether to apply a blur effect to the button |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+ | isActive | boolean | Determines if the button is in an active state |
+
+
+
+## Floating Icon Button Group
+
+
+
+ ```jsx
+ import { FloatingIconButtonGroup } from "@/ui/input/button/components/FloatingIconButtonGroup";
+ import { IconClipboardText, IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ const iconButtons = [
+ {
+ Icon: IconClipboardText,
+ onClick: () => console.log("Button 1 clicked"),
+ isActive: true,
+ },
+ {
+ Icon: IconCheckbox,
+ onClick: () => console.log("Button 2 clicked"),
+ isActive: true,
+ },
+ ];
+
+ return (
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | iconButtons | array | An array of objects, each representing an icon button in the group. Each object should include the icon component you want to display in the button, the function you want to call when a user clicks on the button, and whether the button should be active or not. |
+
+
+
+## Light Button
+
+
+
+ ```jsx
+ import { LightButton } from "@/ui/input/button/components/LightButton";
+
+ export const MyComponent = () => {
+ return console.log('click')}
+ />;
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ----------------- | --------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | icon | `React.ReactNode` | The icon you want to display in the button |
+ | title | string | The text content of the button |
+ | accent | string | The accent color of the button. Options include: `secondary` and `tertiary` |
+ | active | boolean | Determines if the button is in an active state |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Light Icon Button
+
+
+
+ ```jsx
+ import { LightIconButton } from "@/ui/input/button/components/LightIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------------------- | --------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | testId | string | Test identifier for the button |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | accent | string | The accent color of the button. Options include: `secondary` and `tertiary` |
+ | active | boolean | Determines if the button is in an active state |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Main Button
+
+
+
+ ```jsx
+ import { MainButton } from "@/ui/input/button/components/MainButton";
+ import { IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------------- | -------------------------------- | --------------------------------------------------------------------------------- |
+ | title | string | The text content of the button |
+ | fullWidth | boolean | Defines whether the button should span the whole width of its container |
+ | variant | string | The visual style variant of the button. Options include `primary` and `secondary` |
+ | soon | boolean | Indicates if the button is marked as "soon" (such as for upcoming features) |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | React `button` props | `React.ComponentProps<'button'>` | All standard HTML button props are supported |
+
+
+
+## Rounded Icon Button
+
+
+
+ ```jsx
+ import { RoundedIconButton } from "@/ui/input/button/components/RoundedIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------------- | ----------------------------------------------- | ----------- |
+ | Icon | `React.ComponentType` | |
+ | React `button` props | `React.ButtonHTMLAttributes` | |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/input/checkbox.mdx b/packages/twenty-docs/l/pt/twenty-ui/input/checkbox.mdx
new file mode 100644
index 0000000000..b25eeba052
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/input/checkbox.mdx
@@ -0,0 +1,44 @@
+---
+title: Checkbox
+image: /images/user-guide/tasks/tasks_header.png
+---
+
+
+
+
+
+Used when a user needs to select multiple values from several options.
+
+
+
+ ```jsx
+ import { Checkbox } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ return (
+ console.log("onChange function fired")}
+ onCheckedChange={() => console.log("onCheckedChange function fired")}
+ variant="primary"
+ size="small"
+ shape="squared"
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------------- | -------- | -------------------------------------------------------------------------------------------- |
+ | checked | boolean | Indicates whether the checkbox is checked |
+ | indeterminate | boolean | Indicates whether the checkbox is in an indeterminate state (neither checked nor unchecked) |
+ | onChange | function | The callback function you want to trigger when the checkbox state changes |
+ | onCheckedChange | function | The callback function you want to trigger when the `checked` state changes |
+ | variant | string | The visual style variant of the box. Options include: `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the checkbox. Has two options: `small` and `large` |
+ | shape | string | The shape of the checkbox. Has two options: `squared` and `rounded` |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/input/color-scheme.mdx b/packages/twenty-docs/l/pt/twenty-ui/input/color-scheme.mdx
new file mode 100644
index 0000000000..1b1505d481
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/input/color-scheme.mdx
@@ -0,0 +1,63 @@
+---
+title: Color Scheme
+image: /images/user-guide/fields/field.png
+---
+
+
+
+
+
+## Color Scheme Card
+
+Represents different color schemes and is specially tailored for light and dark themes.
+
+
+
+ ```jsx
+ import { ColorSchemeCard } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ---------------- | --------------------------------------- | ----------------------------------------------------------------------- | ------- |
+ | variant | string | The color scheme variant. Options include `Dark`, `Light`, and `System` | light |
+ | selected | boolean | If `true`, displays a checkmark to indicate the selected color scheme | |
+ | additional props | `React.ComponentPropsWithoutRef<'div'>` | Standard HTML `div` element props | |
+
+
+
+## Color Scheme Picker
+
+Allows users to choose between different color schemes.
+
+
+
+ ```jsx
+ import { ColorSchemePicker } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------- | -------------- | ---------------------------------------------------------------------------- |
+ | value | `Color Scheme` | The currently selected color scheme |
+ | onChange | function | The callback function you want to trigger when a user selects a color scheme |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/pt/twenty-ui/input/icon-picker.mdx
new file mode 100644
index 0000000000..59d269242e
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/input/icon-picker.mdx
@@ -0,0 +1,52 @@
+---
+title: Icon Picker
+image: /images/user-guide/github/github-header.png
+---
+
+
+
+
+
+A dropdown-based icon picker that allows users to select an icon from a list.
+
+
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import React, { useState } from "react";
+ import { IconPicker } from "@/ui/input/components/IconPicker";
+
+ export const MyComponent = () => {
+
+ const [selectedIcon, setSelectedIcon] = useState("");
+ const handleIconChange = ({ iconKey, Icon }) => {
+ console.log("Selected Icon:", iconKey);
+ setSelectedIcon(iconKey);
+ };
+
+ return (
+
+
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------- |
+ | disabled | boolean | Disables the icon picker if set to `true` |
+ | onChange | function | The callback function triggered when the user selects an icon. It receives an object with `iconKey` and `Icon` properties |
+ | selectedIconKey | string | The key of the initially selected icon |
+ | onClickOutside | function | Callback function triggered when the user clicks outside the dropdown |
+ | onClose | function | Callback function triggered when the dropdown is closed |
+ | onOpen | function | Callback function triggered when the dropdown is opened |
+ | variant | string | The visual style variant of the clickable icon. Options include: `primary`, `secondary`, and `tertiary` |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/input/image-input.mdx b/packages/twenty-docs/l/pt/twenty-ui/input/image-input.mdx
new file mode 100644
index 0000000000..0d563d7c37
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/input/image-input.mdx
@@ -0,0 +1,34 @@
+---
+title: Image Input
+image: /images/user-guide/objects/objects.png
+---
+
+
+
+
+
+Allows users to upload and remove an image.
+
+
+
+ ```jsx
+ import { ImageInput } from "@/ui/input/components/ImageInput";
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------ | -------- | ------------------------------------------------------------------------------------------------- |
+ | picture | string | The image source URL |
+ | onUpload | function | The function called when a user uploads a new image. It receives the `File` object as a parameter |
+ | onRemove | function | The function called when the user clicks on the remove button |
+ | onAbort | function | The function called when a user clicks on the abort button during image upload |
+ | isUploading | boolean | Indicates whether an image is currently being uploaded |
+ | errorMessage | string | An optional error message to display below the image input |
+ | disabled | boolean | If `true`, the entire input is disabled, and the buttons are not clickable |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/input/radio.mdx b/packages/twenty-docs/l/pt/twenty-ui/input/radio.mdx
new file mode 100644
index 0000000000..e6246e631f
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/input/radio.mdx
@@ -0,0 +1,97 @@
+---
+title: Radio
+image: /images/user-guide/create-workspace/workspace-cover.png
+---
+
+
+
+
+
+Used when users may only choose one option from a series of options.
+
+
+
+ ```jsx
+ import { Radio } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+
+ const handleRadioChange = (event) => {
+ console.log("Radio button changed:", event.target.checked);
+ };
+
+ const handleCheckedChange = (checked) => {
+ console.log("Checked state changed:", checked);
+ };
+
+
+ return (
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------------- | ---------------------- | ------------------------------------------------------------------------------------------------ |
+ | style | `React.CSS` properties | Additional inline styles for the component |
+ | className | string | Optional CSS class for additional styling |
+ | checked | boolean | Indicates whether the radio button is checked |
+ | value | string | The label or text associated with the radio button |
+ | onChange | function | The function called when the selected radio button is changed |
+ | onCheckedChange | function | The function called when the `checked` state of the radio button changes |
+ | size | string | The size of the radio button. Options include: `large` and `small` |
+ | disabled | boolean | If `true`, the radio button is disabled and not clickable |
+ | labelPosition | string | The position of the label text relative to the radio button. Has two options: `left` and `right` |
+
+
+
+## Radio Group
+
+Groups together related radio buttons.
+
+
+
+ ```jsx
+ import React, { useState } from "react";
+ import { Radio, RadioGroup } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+
+ const [selectedValue, setSelectedValue] = useState("Option 1");
+
+ const handleChange = (event) => {
+ setSelectedValue(event.target.value);
+ };
+
+ return (
+
+
+
+
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------- | ----------------- | ---------------------------------------------------------------------------------- |
+ | value | string | The value of the currently selected radio button |
+ | onChange | function | The callback function triggered when the radio button is changed |
+ | onValueChange | function | The callback function triggered when the selected value in the group changes. |
+ | children | `React.ReactNode` | Allows you to pass React components (such as Radio) as children to the Radio Group |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/input/select.mdx b/packages/twenty-docs/l/pt/twenty-ui/input/select.mdx
new file mode 100644
index 0000000000..d685bf4012
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/input/select.mdx
@@ -0,0 +1,51 @@
+---
+title: Select
+image: /images/user-guide/what-is-twenty/20.png
+---
+
+
+
+
+
+Allows users to pick a value from a list of predefined options.
+
+
+
+ ```jsx
+ import { RecoilRoot } from 'recoil';
+ import { IconTwentyStar } from 'twenty-ui/display';
+
+ import { Select } from '@/ui/input/components/Select';
+
+ export const MyComponent = () => {
+
+ return (
+
+
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional CSS class for additional styling |
+ | disabled | boolean | When set to `true`, disables user interaction with the component |
+ | label | string | The label to describe the purpose of the `Select` component |
+ | onChange | function | The function called when the selected values change |
+ | options | array | Represents the options available for the `Selected` component. It's an array of objects where each object has a `value` (the unique identifier), `label` (the unique identifier), and an optional `Icon` |
+ | value | string | Represents the currently selected value. It should match one of the `value` properties in the `options` array |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/input/text.mdx b/packages/twenty-docs/l/pt/twenty-ui/input/text.mdx
new file mode 100644
index 0000000000..8cad1352ae
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/input/text.mdx
@@ -0,0 +1,137 @@
+---
+title: Text
+image: /images/user-guide/notes/notes_header.png
+---
+
+
+
+
+
+## Text Input
+
+Allows users to enter and edit text.
+
+
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import { TextInput } from "@/ui/input/components/TextInput";
+
+ export const MyComponent = () => {
+ const handleChange = (text) => {
+ console.log("Input changed:", text);
+ };
+
+ const handleKeyDown = (event) => {
+ console.log("Key pressed:", event.key);
+ };
+
+ return (
+
+
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | label | string | Represents the label for the input |
+ | onChange | function | The function called when the input value changes |
+ | fullWidth | boolean | Indicates whether the input should take up 100% of the width |
+ | disableHotkeys | boolean | Indicates whether hotkeys are enabled for the input |
+ | error | string | Represents the error message to be displayed. When provided, it also adds an icon error on the right side of the input |
+ | onKeyDown | function | Called when a key is pressed down while the input field is focused. Receives a `React.KeyboardEvent` as an argument |
+ | RightIcon | IconComponent | An optional icon component displayed on the right side of the input |
+
+ The component also accepts other HTML input element props.
+
+
+
+## Autosize Text Input
+
+Text input component that automatically adjusts its height based on the content.
+
+
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import { AutosizeTextInput } from "@/ui/input/components/AutosizeTextInput";
+
+ export const MyComponent = () => {
+ return (
+
+ console.log("onValidate function fired")}
+ minRows={1}
+ placeholder="Write a comment"
+ onFocus={() => console.log("onFocus function fired")}
+ variant="icon"
+ buttonTitle
+ value="Task: "
+ />
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | -------- | --------------------------------------------------------------------------- |
+ | onValidate | function | The callback function you want to trigger when the user validates the input |
+ | minRows | number | The minimum number of rows for the text area |
+ | placeholder | string | The placeholder text you want to display when the text area is empty |
+ | onFocus | function | The callback function you want to trigger when the text area gains focus |
+ | variant | string | The variant of the input. Options include: `default`, `icon`, and `button` |
+ | buttonTitle | string | The title for the button (only applicable for the button variant) |
+ | value | string | The initial value for the text area |
+
+
+
+## Text Area
+
+Allows you to create multi-line text inputs.
+
+
+
+ ```jsx
+ import { TextArea } from "@/ui/input/components/TextArea";
+
+ export const MyComponent = () => {
+ return (
+
+
+
+ | Props | Type | Description |
+ | ----------- | -------- | -------------------------------------------------------------- |
+ | disabled | boolean | Indicates whether the text area is disabled |
+ | minRows | number | Minimum number of visible rows for the text area. |
+ | onChange | function | Callback function triggered when the text area content changes |
+ | placeholder | string | Placeholder text displayed when the text area is empty |
+ | value | string | The current value of the text area |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/input/toggle.mdx b/packages/twenty-docs/l/pt/twenty-ui/input/toggle.mdx
new file mode 100644
index 0000000000..39f1645abd
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/input/toggle.mdx
@@ -0,0 +1,36 @@
+---
+title: Toggle
+image: /images/user-guide/table-views/table.png
+---
+
+
+
+
+
+
+
+ ```jsx
+ import { Toggle } from "twenty-ui/input";
+
+ export const MyComponent = () => {
+ return (
+ console.log('On Change event')}
+ color="green"
+ toggleSize = "medium"
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ---------- | -------- | ------------------------------------------------------------------------------------------- | ------------ |
+ | value | boolean | The current state of the toggle | `false` |
+ | onChange | function | Callback function triggered when the toggle state changes | |
+ | color | string | Color of the toggle when it\ | s blue color |
+ | toggleSize | string | Size of the toggle, affecting both height and weight. Has two options: `small` and `medium` | medium |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/introduction.mdx b/packages/twenty-docs/l/pt/twenty-ui/introduction.mdx
new file mode 100644
index 0000000000..e6510a7458
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/introduction.mdx
@@ -0,0 +1,30 @@
+---
+title: Overview
+description: Component library for Twenty CRM
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+## Components
+
+
+
+ Display
+ Display components for showing information visually
+
+
+
+ Feedback
+ Feedback components for user notifications
+
+
+
+ Input
+ Input components for user interaction
+
+
+
+ Navigation
+ Navigation components for user interface
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/navigation.mdx b/packages/twenty-docs/l/pt/twenty-ui/navigation.mdx
index 5c3636d8cc..b17dad4220 100644
--- a/packages/twenty-docs/l/pt/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/pt/twenty-ui/navigation.mdx
@@ -1,8 +1,8 @@
---
-title: Navegação
+title: Navigation
image: /images/user-guide/tasks/tasks_header.png
---
-
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/pt/twenty-ui/navigation/breadcrumb.mdx
new file mode 100644
index 0000000000..aadbee8ee4
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/navigation/breadcrumb.mdx
@@ -0,0 +1,41 @@
+---
+title: Breadcrumb
+image: /images/user-guide/fields/field.png
+---
+
+
+
+
+
+Renders a breadcrumb navigation bar.
+
+
+
+ ```jsx
+ import { BrowserRouter } from "react-router-dom";
+ import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
+
+ export const MyComponent = () => {
+ const breadcrumbLinks = [
+ { children: "Home", href: "/" },
+ { children: "Category", href: "/category" },
+ { children: "Subcategory", href: "/category/subcategory" },
+ { children: "Current Page" },
+ ];
+
+ return (
+
+
+
+ )
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional class name for additional styling |
+ | links | array | An array of objects, each representing a breadcrumb link. Each object has a `children` property (the text content of the link) and an optional `href` property (the URL to navigate to when the link is clicked) |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/pt/twenty-ui/navigation/links.mdx
index 8384668f35..e9f7e3d80f 100644
--- a/packages/twenty-docs/l/pt/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/pt/twenty-ui/navigation/links.mdx
@@ -4,15 +4,15 @@ image: /images/user-guide/what-is-twenty/20.png
---
-
+
-## Link de Contato
+## Contact Link
-Um componente de link estilizado para exibir informações de contato.
+A stylized link component for displaying contact information.
-
+
```jsx
import { BrowserRouter as Router } from 'react-router-dom';
@@ -20,7 +20,7 @@ Um componente de link estilizado para exibir informações de contato.
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log('Link de contato clicado!', event);
+ console.log('Contact link clicked!', event);
};
return (
@@ -38,35 +38,35 @@ Um componente de link estilizado para exibir informações de contato.
```
-
- | Propriedades | Tipo | Descrição |
- | ------------ | ----------------- | ----------------------------------------------------------------------- |
- | className | string | Nome opcional para estilização adicional |
- | href | string | A URL ou caminho de destino para o link |
- | onClick | função | Função de retorno de chamada para ser disparada quando o link é clicado |
- | filhos | `React.ReactNode` | O conteúdo a ser exibido dentro do link |
+
+ | Props | Type | Description |
+ | --------- | ----------------- | ---------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | href | string | The target URL or path for the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
-## Link Puro
+## Raw Link
-Um componente de link estilizado para exibir links.
+A stylized link component for displaying links.
-
+
```jsx
import { RawLink } from "/navigation";
import { BrowserRouter as Router } from "react-router-dom";
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log("Link de contato clicado!", event);
+ console.log("Contact link clicked!", event);
};
return (
- Fale Conosco
+ Contact Us
);
@@ -75,35 +75,35 @@ Um componente de link estilizado para exibir links.
```
-
- | Propriedades | Tipo | Descrição |
- | ------------ | ----------------- | ----------------------------------------------------------------------- |
- | className | string | Nome opcional para estilização adicional. |
- | href | string | A URL ou caminho de destino para o link |
- | onClick | função | Função de retorno de chamada para ser disparada quando o link é clicado |
- | filhos | `React.ReactNode` | O conteúdo a ser exibido dentro do link |
+
+ | Props | Type | Description |
+ | --------- | ----------------- | ---------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | href | string | The target URL or path for the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
-## Link Arredondado
+## Rounded Link
-Um link estilizado de forma arredondada com um componente Chip para links.
+A rounded-styled link with a Chip component for links.
-
+
```jsx
import { RoundedLink } from "/navigation";
import { BrowserRouter as Router } from "react-router-dom";
export const MyComponent = () => {
const handleLinkClick = (event) => {
- console.log("Link de contato clicado!", event);
+ console.log("Contact link clicked!", event);
};
return (
- Fale Conosco
+ Contact Us
);
@@ -111,21 +111,21 @@ Um link estilizado de forma arredondada com um componente Chip para links.
```
-
- | Propriedades | Tipo | Descrição |
- | ------------ | ----------------- | ----------------------------------------------------------------------- |
- | href | string | A URL ou caminho de destino para o link |
- | filhos | `React.ReactNode` | O conteúdo a ser exibido dentro do link |
- | onClick | função | Função de retorno de chamada para ser disparada quando o link é clicado |
+
+ | Props | Type | Description |
+ | -------- | ----------------- | ---------------------------------------------------------- |
+ | href | string | The target URL or path for the link |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
-## Link Social
+## Social Link
-Links sociais estilizados, com suporte para vários tipos de links sociais, como URLs, LinkedIn e X (ou Twitter).
+Stylized social links, with support for various social link types, such as URLs, LinkedIn, and X (or Twitter).
-
+
```jsx
import { SocialLink } from "twenty-ui/navigation";
import { BrowserRouter as Router } from "react-router-dom";
@@ -143,12 +143,12 @@ Links sociais estilizados, com suporte para vários tipos de links sociais, como
```
-
- | Propriedades | Tipo | Descrição |
- | ------------ | ----------------- | ----------------------------------------------------------------------- |
- | href | string | A URL ou caminho de destino para o link |
- | filhos | `React.ReactNode` | O conteúdo a ser exibido dentro do link |
- | tipo | string | O tipo de links sociais. Opções incluem: `url`, `LinkedIn` e `Twitter` |
- | onClick | função | Função de retorno de chamada para ser disparada quando o link é clicado |
+
+ | Props | Type | Description |
+ | -------- | ----------------- | --------------------------------------------------------------------------- |
+ | href | string | The target URL or path for the link |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
+ | type | string | The type of social links. Options include: `url`, `LinkedIn`, and `Twitter` |
+ | onClick | function | Callback function to be triggered when the link is clicked |
diff --git a/packages/twenty-docs/l/pt/twenty-ui/navigation/menu-item.mdx b/packages/twenty-docs/l/pt/twenty-ui/navigation/menu-item.mdx
new file mode 100644
index 0000000000..209c6270ea
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/navigation/menu-item.mdx
@@ -0,0 +1,428 @@
+---
+title: Menu Item
+image: /images/user-guide/kanban-views/kanban.png
+---
+
+
+
+
+
+A versatile menu item designed to be used in a menu or navigation list.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { IconAlertCircle } from "@tabler/icons-react";
+ import { MenuItem } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleMenuItemClick = (event) => {
+ console.log("Menu item clicked!", event);
+ };
+
+ const handleButtonClick = (event) => {
+ console.log("Icon button clicked!", event);
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------- | ------------- | ---------------------------------------------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | accent | string | Specifies the accent color of the menu item. Options include: `default`, `danger`, and `placeholder` |
+ | text | string | The text content of the menu item |
+ | iconButtons | array | An array of objects representing additional icon buttons associated with the menu item |
+ | isTooltipOpen | boolean | Controls the visibility of the tooltip associated with the menu item |
+ | testId | string | The data-testid attribute for testing purposes |
+ | onClick | function | Callback function triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+## Variants
+
+The different variants of the menu item component include the following:
+
+### Command
+
+A command-style menu item within a menu to indicate keyboard shortcuts.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemCommand } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleCommandClick = () => {
+ console.log("Command clicked!");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------ | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | firstHotKey | string | The first keyboard shortcut associated with the command |
+ | secondHotKey | string | The second keyboard shortcut associated with the command |
+ | isSelected | boolean | Indicates whether the menu item is selected or highlighted |
+ | onClick | function | Callback function triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Draggable
+
+A draggable menu item component designed to be used in a menu or list where items can be dragged, and additional actions can be performed through icon buttons.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { IconAlertCircle } from "@tabler/icons-react";
+ import { MenuItemDraggable } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleMenuItemClick = (event) => {
+ console.log("Menu item clicked!", event);
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ------------------------------------------------------------------------------------------ |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | accent | string | The accent color of the menu item. It can either be `default`, `placeholder`, and `danger` |
+ | iconButtons | array | An array of objects representing additional icon buttons associated with the menu item |
+ | isTooltipOpen | boolean | Controls the visibility of the tooltip associated with the menu item |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | text | string | The text content of the menu item |
+ | isDragDisabled | boolean | Indicates whether dragging is disabled |
+ | className | string | Optional name for additional styling |
+
+
+
+### Multi Select
+
+Provides a way to implement multi-select functionality with an associated checkbox.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemMultiSelect } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | onSelectChange | function | Callback function triggered when the checkbox state changes |
+ | className | string | Optional name for additional styling |
+
+
+
+### Multi Select Avatar
+
+A multi-select menu item with an avatar, a checkbox for selection, and textual content.
+
+
+
+ ```jsx
+ import { MenuItemMultiSelectAvatar } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const imageUrl =
+ "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
+
+ return (
+ }
+ text="First Option"
+ selected={false}
+ className
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ----------- | -------------------------------------------------------------------- |
+ | avatar | `ReactNode` | The avatar or icon to be displayed on the left side of the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | onSelectChange | function | Callback function triggered when the checkbox state changes |
+ | className | string | Optional name for additional styling |
+
+
+
+### Navigate
+
+A menu item featuring an optional left icon, textual content, and a right-chevron icon.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemNavigate } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleNavigation = () => {
+ console.log("Navigate to another page");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Select
+
+A selectable menu item, featuring optional left content (icon and text) and an indicator (check icon) for the selected state.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemSelect } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Select Avatar
+
+A selectable menu item with an avatar, featuring optional left content (avatar and text) and an indicator (check icon) for the selected state.
+
+
+
+ ```jsx
+ import { MenuItemSelectAvatar } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const imageUrl =
+ "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
+
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
+
+ return (
+ }
+ text="First Option"
+ selected={true}
+ disabled={false}
+ hovered={false}
+ testId="menu-item-test"
+ onClick={handleSelection}
+ className
+ />
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ----------- | -------------------------------------------------------------------- |
+ | avatar | `ReactNode` | The avatar or icon to be displayed on the left side of the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | testId | string | The data-testid attribute for testing purposes |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Select Color
+
+A selectable menu item with a color sample for scenarios where you want users to choose a color from a menu.
+
+
+
+ ```jsx
+ import { MenuItemSelectColor } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | color | string | The theme color to be displayed as a sample in the menu item. Options include: `green`, `turquoise`, `sky`, `blue`, `purple`, `pink`, `red`, `orange`, `yellow`, and `gray` |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | variant | string | The variant of the color sample. It can either be `default` or `pipeline` |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Toggle
+
+A menu item with an associated toggle switch to allow users to enable or disable a specific feature
+
+
+
+ ```jsx
+ import { IconBell } from '@tabler/icons-react';
+
+ import { MenuItemToggle } from 'twenty-ui/display';
+
+ export const MyComponent = () => {
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ----------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | toggled | boolean | Indicates whether the toggle switch is in the "on" or "off" state |
+ | onToggleChange | function | Callback function triggered when the toggle switch state changes |
+ | toggleSize | string | The size of the toggle switch. It can be either \ |
+ | className | string | Optional name for additional styling |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/pt/twenty-ui/navigation/navigation-bar.mdx
new file mode 100644
index 0000000000..a77e9f34e6
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/navigation/navigation-bar.mdx
@@ -0,0 +1,49 @@
+---
+title: Navigation Bar
+image: /images/user-guide/table-views/table.png
+---
+
+
+
+
+
+Renders a navigation bar that contains multiple `NavigationBarItem` components.
+
+
+
+ ```jsx
+ import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
+ import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
+
+ export const MyComponent = () => {
+
+ const navigationItems = [
+ {
+ name: "Home",
+ Icon: IconHome,
+ onClick: () => console.log("Home clicked"),
+ },
+ {
+ name: "Profile",
+ Icon: IconUser,
+ onClick: () => console.log("Profile clicked"),
+ },
+ {
+ name: "Settings",
+ Icon: IconSettings,
+ onClick: () => console.log("Settings clicked"),
+ },
+ ];
+
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | activeItemName | string | The name of the currently active navigation item |
+ | items | array | An array of objects representing each navigation item. Each object contains the `name` of the item, the `Icon` component to display, and an `onClick` function to be called when the item is clicked |
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/pt/twenty-ui/navigation/step-bar.mdx
index dd1bf266bd..66c420f561 100644
--- a/packages/twenty-docs/l/pt/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/pt/twenty-ui/navigation/step-bar.mdx
@@ -1,34 +1,34 @@
---
-title: Barra de Passos
+title: Step Bar
image: /images/user-guide/api/api.png
---
-
+
-Exibe o progresso por meio de uma sequência de passos numerados destacando o passo ativo. Ele renderiza um contêiner com passos, cada um representado pelo componente `Step`.
+Displays progress through a sequence of numbered steps by highlighting the active step. It renders a container with steps, each represented by the `Step` component.
-
+
```jsx
import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
export const MyComponent = () => {
return (
- Passo 1
- Passo 2
- Passo 3
+ Step 1
+ Step 2
+ Step 3
);
};
```
-
- | Propriedades | Tipo | Descrição |
- | ------------ | ------ | -------------------------------------------------------------------------------------------- |
- | passoAtivo | número | O índice do passo atualmente ativo. Isso determina qual passo deve ser visualmente destacado |
+
+ | Props | Type | Description |
+ | ---------- | ------ | ------------------------------------------------------------------------------------------------- |
+ | activeStep | number | The index of the currently active step. This determines which step should be visually highlighted |
diff --git a/packages/twenty-docs/l/pt/twenty-ui/progress-bar.mdx b/packages/twenty-docs/l/pt/twenty-ui/progress-bar.mdx
new file mode 100644
index 0000000000..2e4735ab30
--- /dev/null
+++ b/packages/twenty-docs/l/pt/twenty-ui/progress-bar.mdx
@@ -0,0 +1,66 @@
+---
+title: Feedback
+image: /images/user-guide/emails/emails_header.png
+---
+
+
+
+
+
+Indicates progress or countdown and moves from right to left.
+
+
+
+ ```jsx
+ import { ProgressBar } from "twenty-ui/feedback";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | --------- | ------- | ------------------------------------------------------------------------------------ | --------- |
+ | duration | number | The total duration of the progress bar animation in milliseconds | 3 |
+ | delay | number | The delay in starting the progress bar animation in milliseconds | 0 |
+ | easing | string | Easing function for the progress bar animation | easeInOut |
+ | barHeight | number | The height of the bar in pixels | 24 |
+ | barColor | string | The color of the bar | gray80 |
+ | autoStart | boolean | If `true`, the progress bar animation starts automatically when the component mounts | `true` |
+
+
+
+## Circular Progress Bar
+
+Indicates the progress of a task, often used in loading screens or areas where you want to communicate ongoing processes to the user.
+
+
+
+ ```jsx
+ import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | -------- | ------ | ------------------------------------- | ------------ |
+ | size | number | The size of the circular progress bar | 50 |
+ | barWidth | number | The width of the progress bar line | 5 |
+ | barColor | string | The color of the progress bar | currentColor |
+
+
diff --git a/packages/twenty-docs/l/pt/user-guide/ai/capabilities/ai-agents.mdx b/packages/twenty-docs/l/pt/user-guide/ai/capabilities/ai-agents.mdx
new file mode 100644
index 0000000000..8d301b00d9
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/ai/capabilities/ai-agents.mdx
@@ -0,0 +1,34 @@
+---
+title: AI Agents
+description: Integrate AI capabilities directly into your automation workflows.
+---
+
+
+ This feature is in development and will be available in beta soon.
+
+
+## Overview
+
+Integrate AI capabilities directly into your automation workflows for intelligent data processing and decision-making.
+
+## Capabilities
+
+| Feature | Description |
+| ------------------- | ------------------------------------------------ |
+| **AI actions** | Add AI-powered steps to any workflow |
+| **Data enrichment** | Automatically enhance records with external data |
+| **Classification** | Categorize records based on content analysis |
+| **Summarization** | Generate summaries from text fields |
+| **Custom prompts** | Define exactly how AI processes your data |
+
+## Use Cases
+
+* **Lead scoring**: Automatically score and prioritize inbound leads
+* **Data cleanup**: Standardize company names and contact information
+* **Email drafts**: Generate follow-up emails based on meeting notes
+* **Record routing**: Assign records to the right team member based on content
+
+## Related
+
+* [Workflows Overview](/l/pt/user-guide/workflows/overview) — automation basics
+* [AI Permissions](/l/pt/user-guide/ai/capabilities/permissions-access-control) — access control for AI agents
diff --git a/packages/twenty-docs/l/pt/user-guide/ai/capabilities/ai-chatbot.mdx b/packages/twenty-docs/l/pt/user-guide/ai/capabilities/ai-chatbot.mdx
new file mode 100644
index 0000000000..d7cbbc04fc
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/ai/capabilities/ai-chatbot.mdx
@@ -0,0 +1,41 @@
+---
+title: AI Chatbot
+description: An intelligent assistant that helps you interact with your CRM data using natural language.
+---
+
+
+ This feature is in development and will be available in beta soon.
+
+
+## Overview
+
+An intelligent assistant that helps you interact with your CRM data using natural language.
+
+## Capabilities
+
+| Feature | Description |
+| ---------------------------- | ------------------------------------------------------------------------- |
+| **Natural language queries** | Ask questions in plain English instead of building filters |
+| **Full data access** | Query records, relationships, and metrics across your workspace |
+| **Page context** | Reference "this company" or "this opportunity" based on your current view |
+| **Conversational** | Follow-up questions maintain context from previous queries |
+
+## Example Interactions
+
+### Finding Records
+
+* "Show me all opportunities over $50,000"
+* "Find contacts I haven't emailed in 2 weeks"
+* "List companies in the healthcare industry"
+
+### Getting Insights
+
+* "What's my total pipeline value?"
+* "How many deals closed last month?"
+* "Which stage has the most stuck opportunities?"
+
+### Using Page Context
+
+* "Summarize my interactions with this person" (on a contact page)
+* "What opportunities are linked to this company?" (on a company page)
+* "When was this deal last updated?" (on an opportunity page)
diff --git a/packages/twenty-docs/l/pt/user-guide/ai/capabilities/permissions-access-control.mdx b/packages/twenty-docs/l/pt/user-guide/ai/capabilities/permissions-access-control.mdx
new file mode 100644
index 0000000000..4a53c9a7ac
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/ai/capabilities/permissions-access-control.mdx
@@ -0,0 +1,35 @@
+---
+title: Permissions & Access Control
+description: Control what AI agents can access and modify in your workspace.
+---
+
+## Overview
+
+AI agents respect your existing permission structure. This is particularly important for teams who want to control exactly what automated AI processes can access or modify in their workspace.
+
+## Assign a Role to an AI Agent
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **AI Agents**, click **+ Assign to AI agent**
+5. Select the AI agent from the list
+6. Confirm the assignment
+
+## Why Assign Roles to AI Agents?
+
+| Benefit | Description |
+| ---------------- | ------------------------------------------------- |
+| **Security** | Limit what data AI agents can access or modify |
+| **Compliance** | Ensure AI only processes the data it needs |
+| **Control** | Prevent unintended actions from AI automations |
+| **Auditability** | Track which actions were performed by which agent |
+
+
+ For AI agents running within workflows, role assignment ensures the agent cannot access or modify data outside its intended scope—even if the workflow has broader permissions.
+
+
+## Related
+
+* [Permissions](/l/pt/user-guide/permissions-access/capabilities/permissions) — detailed information on creating and managing roles
+* [AI Agents](/l/pt/user-guide/ai/capabilities/ai-agents) — AI capabilities in workflows
diff --git a/packages/twenty-docs/l/pt/user-guide/ai/how-tos/ai-faq.mdx b/packages/twenty-docs/l/pt/user-guide/ai/how-tos/ai-faq.mdx
new file mode 100644
index 0000000000..774eae15c4
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/ai/how-tos/ai-faq.mdx
@@ -0,0 +1,29 @@
+---
+title: AI FAQ
+description: Frequently asked questions about AI features in Twenty.
+---
+
+
+
+ AI features are currently in development and will be released in beta soon. Stay tuned for updates!
+
+
+
+ We're building two main AI capabilities:
+
+ 1. **AI Chatbot**: A context-aware assistant that can access your Twenty data and help you with queries
+ 2. **AI Agents in Workflows**: Intelligent automation that can process data, make decisions, and execute tasks within your workflows
+
+
+
+ AI agents will operate under the permission system. You can assign specific roles to AI agents under **Settings → Roles**, giving you full control over what data they can access and what actions they can perform.
+
+
+
+ AI actions will consume workflow credits based on the complexity of the task and the AI model used. More details will be available when the features launch.
+
+
+
+ Initially, Twenty will use built-in AI models. Support for custom or external AI models may be added in future releases based on user feedback.
+
+
diff --git a/packages/twenty-docs/l/pt/user-guide/ai/overview.mdx b/packages/twenty-docs/l/pt/user-guide/ai/overview.mdx
new file mode 100644
index 0000000000..bd4ee68a79
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/ai/overview.mdx
@@ -0,0 +1,62 @@
+---
+title: AI
+description: AI-powered features coming soon to Twenty.
+---
+
+
+
+
+
+## What's Coming
+
+Twenty is building AI capabilities to help your team work smarter. We're focusing on two major areas:
+
+### 1. AI Chatbot
+
+A conversational assistant that understands your context and has access to all your Twenty data.
+
+**Key capabilities:**
+
+* **Full data access**: Query any record, relationship, or metric in your workspace
+* **Page context awareness**: Reference "this company" or "this opportunity" based on where you are in Twenty
+* **Natural language**: Ask questions and get answers without navigating menus
+
+**Example prompts:**
+
+* "What opportunities are closing this month?"
+* "Which deals have been in Negotiation for more than 30 days?"
+* "Summarize my interactions with this person"
+
+### 2. AI Agents in Workflows
+
+Extend your workflows with AI-powered actions and autonomous agents.
+
+**Key capabilities:**
+
+* **AI actions**: Use AI to enrich data, classify records, generate summaries, and more
+* **Autonomous agents**: Let agents execute multi-step tasks within a workflow
+* **Custom prompts**: Define exactly how AI should process your data
+
+**Use cases:**
+
+* Automatically categorize inbound leads
+* Enrich company data from public sources
+* Generate follow-up email drafts based on meeting notes
+* Score opportunities based on engagement patterns
+
+## Permissions and Access Control
+
+AI agents will be managed through the existing permissions system:
+
+1. Go to **Settings → Roles**
+2. Configure which data each AI agent can access
+3. Set read/write permissions per object
+
+This ensures AI agents respect your data governance policies and only access what they need.
+
+## Stay Updated
+
+We'll update this section as AI features become available. In the meantime:
+
+* Follow our [GitHub](https://github.com/twentyhq/twenty) for development updates
+* Join our [Discord](https://discord.gg/twenty) to share feedback and feature requests
diff --git a/packages/twenty-docs/l/pt/user-guide/billing/capabilities/pricing-plans.mdx b/packages/twenty-docs/l/pt/user-guide/billing/capabilities/pricing-plans.mdx
new file mode 100644
index 0000000000..90bf7e7cbb
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/billing/capabilities/pricing-plans.mdx
@@ -0,0 +1,79 @@
+---
+title: Pricing Plans
+description: Learn about Twenty's pricing plans and how to switch between them.
+---
+
+## Overview
+
+Twenty offers flexible pricing to fit teams of all sizes, whether you prefer cloud hosting or self-hosting.
+
+## Cloud Plans
+
+### Pro (Cloud)
+
+For teams ready to scale:
+
+* All core CRM features
+* Email and calendar sync
+* Workflows and automations
+* Standard support
+
+
+ Premium features (SSO and row-level permissions) are not included in the Pro plan.
+
+
+### Organization (Cloud)
+
+For larger teams with advanced needs:
+
+* Everything in Pro
+* **Premium features**: SSO integration and row-level permissions
+* Priority support
+
+## Self-Hosted Plans
+
+### Free (Self-Hosted)
+
+Host Twenty on your own infrastructure at no cost:
+
+* All Pro features included
+* Community support via Discord
+* Full control over your data
+
+### Organization (Self-Hosted)
+
+For teams who need premium features while self-hosting:
+
+* All Pro features
+* **Premium features**: SSO integration and row-level permissions
+* Twenty team support
+* No requirement to publish custom code as open-source before distributing
+
+## Premium Features
+
+Premium features are only available on the Organization plans (Cloud or Self-Hosted):
+
+* **SSO integration**: Single Sign-On with your identity provider
+* **Row-level permissions**: Fine-grained access control at the record level
+
+## Switching Plans
+
+### Upgrade to Organization
+
+1. Go to **Settings → Billing**
+2. Click **Switch to Organization**
+3. Confirm your upgrade
+
+### Downgrade to Pro
+
+Contact support to downgrade your plan.
+
+### Switch to Yearly Billing
+
+1. Go to **Settings → Billing**
+2. Click **Switch to Yearly**
+3. Save with annual billing
+
+### Switch to Monthly Billing
+
+Contact support to switch back to monthly billing.
diff --git a/packages/twenty-docs/l/pt/user-guide/billing/capabilities/workflow-credits.mdx b/packages/twenty-docs/l/pt/user-guide/billing/capabilities/workflow-credits.mdx
new file mode 100644
index 0000000000..0ce8e3be72
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/billing/capabilities/workflow-credits.mdx
@@ -0,0 +1,49 @@
+---
+title: Workflow Credits
+description: Understanding workflow credits, consumption, and how to purchase more.
+---
+
+## Overview
+
+Credits power your workflow automations in Twenty. Every workflow action consumes credits based on its complexity.
+
+## Credit Allocation
+
+Credits are based on your billing cycle, not your plan:
+
+| Billing Cycle | Credits |
+| ------------- | --------------- |
+| Monthly | 5 million/month |
+| Yearly | 50 million/year |
+
+
+ The 5 million monthly credits are designed to empower you to run automations without worrying about costs. For most workflows using standard actions, this is more than enough. You'll only need additional credits when running advanced code nodes or AI-powered features.
+
+
+## Credit Consumption
+
+Different actions consume different amounts of credits:
+
+| Action Type | Credit Usage |
+| ------------------------------------------------------- | ----------------------- |
+| **Basic operations** (search, update, create records) | Minimal |
+| **Complex operations** (code nodes, external API calls) | More credits |
+| **AI prompts** (coming soon) | Variable based on usage |
+
+Credits are deducted in real-time when workflows execute.
+
+## Monitoring Usage
+
+Track your credit consumption:
+
+1. Go to **Settings → Billing**
+2. View your current usage and remaining credits
+3. Monitor trends to plan for additional credits if needed
+
+## Purchasing Additional Credits
+
+Need more credits?
+
+1. Go to **Settings → Billing**
+2. Click on the option to purchase additional credit packs
+3. Select the amount you need
diff --git a/packages/twenty-docs/l/pt/user-guide/billing/how-tos/billing-faq.mdx b/packages/twenty-docs/l/pt/user-guide/billing/how-tos/billing-faq.mdx
new file mode 100644
index 0000000000..ee1d560cb1
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/billing/how-tos/billing-faq.mdx
@@ -0,0 +1,86 @@
+---
+title: Billing FAQ
+description: Frequently asked questions about Twenty pricing and billing.
+---
+
+## Pricing
+
+
+
+ Yes, you can use Twenty for free while self-hosting. You will get access to everything included in the Pro (Cloud) plan, except the support from our core-team. Support is accessible via our Discord community.
+
+ If you want to self-host and need the Premium features (SSO and row-level permissions), you can choose the paid Organization (Self-Hosted) license. This also includes support from the Twenty team and removes the requirement to publish custom code as open-source before distributing.
+
+
+
+ Premium features are only available on the Organization plans (Cloud or Self-Hosted):
+
+ * **SSO integration**: Single Sign-On with your identity provider
+ * **Row-level permissions**: Fine-grained access control at the record level
+
+
+
+ We do not offer free seats. Pricing is per user and each user needs a licence to access Twenty.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `Switch to Organization`.
+
+
+
+ Please reach out to our team directly via the Support, there is no easy way to do this using the UI at the moment.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `Switch to Yearly`.
+
+
+
+ Please reach out to our team directly via the Support, there is no easy way to do this using the UI at the moment.
+
+
+
+ You will find this under `Settings → Billing`.
+
+
+
+ The number of credits depends on your billing cycle, not your plan:
+
+ * **Monthly subscriptions**: 5 million credits per month
+ * **Yearly subscriptions**: 50 million credits per year
+
+
+
+ Each workflow action consumes credits based on its complexity:
+
+ * **Basic internal operations** (such as search, update, create records) consume very few credits
+ * **More complex operations** like code nodes and requests to external services consume more credits
+ * **AI prompts** (coming soon!) will also consume more credits based on usage
+
+ Credits are deducted in real-time when workflows execute. You can monitor your usage in **Settings → Billing** to track consumption and remaining credits.
+
+
+
+ You can buy additional credits under `Settings → Billing`.
+
+
+
+## Billing
+
+
+
+ You can do so under `Settings → Billing`.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll be able to add a new payment method there.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll be able to edit the billing information there.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll see all your invoices at the bottom of the screen.
+
+
diff --git a/packages/twenty-docs/l/pt/user-guide/billing/overview.mdx b/packages/twenty-docs/l/pt/user-guide/billing/overview.mdx
new file mode 100644
index 0000000000..c58918e0a3
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/billing/overview.mdx
@@ -0,0 +1,45 @@
+---
+title: Billing
+description: Understand Twenty pricing and manage your subscription.
+image: /images/user-guide/setup/pricing.png
+---
+
+
+
+
+
+Twenty offers flexible pricing plans to fit your team's needs. Manage your subscription, track workflow credits, and access invoices all from **Settings → Billing**.
+
+## What's in this section
+
+
+
+ Learn about Twenty's pricing plans and what's included.
+
+
+
+ Frequently asked questions about pricing and billing.
+
+
+
+## At a glance
+
+| Plan | Key Features |
+| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| **Free (Self-Hosted)** | All Pro features, community support |
+| **Pro (Cloud)** | Everything apart from the Premium features (SSO and row-level permissions), standard support |
+| **Organization (Cloud)** | All from Pro + the Premium features (SSO and row-level permissions), priority support |
+| **Organization (Self-Hosted)** | All from Pro + the Premium features (SSO, row-level permissions), Twenty team support, not required to publish your custom code as open-source before distributing |
+
+## Quick answers
+
+**Where do I manage billing?**
+Go to **Settings → Billing** to view your plan, update payment methods, and access invoices.
+
+**Can I use Twenty for free?**
+Yes! Self-host Twenty and get all Pro features at no cost.
+
+**How do I upgrade?**
+Go to **Settings → Billing** and click **Switch to Organization** or **Switch to Yearly**.
+
+For more questions, see the [Billing FAQ](/l/pt/user-guide/billing/how-tos/billing-faq).
diff --git a/packages/twenty-docs/l/pt/user-guide/calendar-emails/capabilities/calendar.mdx b/packages/twenty-docs/l/pt/user-guide/calendar-emails/capabilities/calendar.mdx
new file mode 100644
index 0000000000..897b360565
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/calendar-emails/capabilities/calendar.mdx
@@ -0,0 +1,43 @@
+---
+title: Calendar
+description: Understanding calendar integration features in Twenty.
+---
+
+**Note**: To connect your calendar and configure sync settings, visit [Email & Calendar Setup](/l/pt/user-guide/calendar-emails/overview).
+
+## How Calendar Integration Works
+
+Twenty automatically syncs your calendar events and links them to the relevant CRM records, giving you a complete view of your meeting history with contacts and companies.
+
+## Calendar Tab
+
+Next to the Emails tab on records, you'll find a `Calendar` tab that contains the history of meetings scheduled with the record.
+
+### Available For
+
+* **People**: View all meetings scheduled with a specific contact
+* **Companies**: See all meetings related to a company and its employees
+* **Opportunities**: Access meeting history related to the company linked to this opportunity
+
+### Viewing Meeting History
+
+1. **Navigate to a Record**: Go to any Person, Company, or Opportunity record
+2. **Select the Calendar Tab**: Click on the `Calendar` tab next to the Emails tab
+3. **Browse Meeting History**: View all scheduled meetings and their details
+4. **Access Meeting Context**: See meeting participants, times, and related information
+
+## Visibility Settings
+
+Calendar data follows the same visibility settings as emails, ensuring consistent privacy controls across both communication channels.
+
+## What Gets Synced
+
+* **External Meetings**: All meetings with contacts outside your organization
+* **Automatic Linking**: Meetings connect to existing People and Company records based on attendee email addresses
+* **Meeting Details**: Subject, time, duration, and participants
+* **Updates**: New calendar events sync automatically
+
+## What Doesn't Get Synced
+
+* **Internal Meetings**: Meetings with only colleagues (same domain) remain private
+* **Private Events**: Events marked as private in your calendar
diff --git a/packages/twenty-docs/l/pt/user-guide/calendar-emails/capabilities/mailbox.mdx b/packages/twenty-docs/l/pt/user-guide/calendar-emails/capabilities/mailbox.mdx
new file mode 100644
index 0000000000..815391d03a
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/calendar-emails/capabilities/mailbox.mdx
@@ -0,0 +1,85 @@
+---
+title: Mailbox
+description: Understanding email integration features in Twenty.
+---
+
+**Note**: To connect your email accounts and configure sync settings, visit [Email & Calendar Setup](/l/pt/user-guide/calendar-emails/overview).
+
+## How Email Integration Works
+
+Twenty automatically links emails from your connected mailboxes to the relevant CRM records, keeping all communication history in one place.
+
+### Objects Where Emails Can Be Found
+
+Email conversations appear in three main objects:
+
+* **People**: View all emails exchanged with a specific contact
+* **Companies**: See all emails related to a company and its employees
+* **Opportunities**: Access email threads related to the company linked to this opportunity. Email threads from individual people on the opportunity are not shown yet.
+
+### Viewing Email Threads
+
+1. **Navigate to a Record**: Go to any Person, Company, or Opportunity record
+2. **Select the Emails Tab**: Click on the `Emails` tab to view synced emails
+3. **Open an Email Thread**: Click on any email to open and read the full conversation
+4. **Browse History**: Scroll through the complete email history with that contact
+
+
+
+## What You'll See
+
+### Email Thread View
+
+When you open an email thread, you can:
+
+* **Read Full Conversations**: See the complete email exchange
+* **View Participants**: See all people involved in the email thread
+* **Check Timestamps**: Know exactly when each email was sent
+* **Access Context**: Understand the full communication history
+
+### Email Visibility
+
+Depending on your mailbox settings, you might see:
+
+* **Full Content**: Complete email text and details
+* **Subject + Metadata**: Subject line, sender, recipient, and timestamp
+* **Metadata Only**: Basic information without email content
+
+## Email Sync Behavior
+
+### What Gets Synced
+
+* **External Emails**: All emails with contacts outside your organization
+* **Automatic Linking**: Emails connect to existing People and Company records
+* **Multiple Addresses**: Emails from any address link to the same contact record
+* **Updates**: New emails appear within 5 minutes
+
+### What Doesn't Get Synced
+
+* **Internal Emails**: Emails between colleagues (same domain) remain private
+* **Group Emails**: Distribution lists and group emails are excluded
+* **Excluded Folders**: Folders you've chosen not to sync (configured under Settings → Accounts → Email)
+
+### Selective Folder Sync (Lab Feature)
+
+Control which email folders sync with Twenty:
+
+1. Enable `Message Folder` in Settings → Releases → Lab
+2. Configure folders under Settings → Accounts → Email
+3. Choose specific folders to include or exclude (Inbox, Sent, Archive, custom folders)
+
+## Troubleshooting Email Sync
+
+### Common Sync Issues
+
+* **Sync Delays**: Emails appear within 5 minutes, but initial imports take longer
+* **Missing Emails**: Check if:
+ * Folders are excluded in Message Folder settings
+ * Contact auto-creation is disabled (emails need existing Twenty records)
+ * Email is from colleagues (same domain) or group lists
+ * Mailbox is still completing initial sync
+
+### Email Limitations
+
+* **System Folders**: Some email folders may not be available for sync
+* **Aliases**: Only true mailboxes can be connected (not email aliases)
diff --git a/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx b/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx
new file mode 100644
index 0000000000..edee83875d
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx
@@ -0,0 +1,28 @@
+---
+title: Can I Book Meetings from Twenty?
+description: Information about booking meetings directly from Twenty.
+---
+
+## Current Status
+
+**No, Twenty does not currently support booking meetings directly from the platform.**
+
+Twenty's calendar integration is designed to **sync and display** your existing calendar events, not to create new ones. All meeting scheduling should be done through your native calendar application (Google Calendar, Microsoft Outlook, etc.).
+
+## What You Can Do
+
+* **View meeting history** on People, Companies, and Opportunities records
+* **See upcoming meetings** with contacts in your CRM
+* **Track meeting context** alongside email communications
+* **Auto-create contacts** from meeting participants
+
+## How to Schedule Meetings
+
+1. Use your native calendar app (Google Calendar, Outlook, etc.)
+2. Create the meeting as you normally would
+3. The meeting will automatically sync to Twenty within 5 minutes
+4. View the meeting on the relevant CRM records
+
+## Future Plans
+
+Meeting creation from within Twenty is on our roadmap. Join our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to share your use case and help prioritize this feature.
diff --git a/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx b/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx
new file mode 100644
index 0000000000..28a0855ff7
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx
@@ -0,0 +1,44 @@
+---
+title: Can I Send Emails from Twenty?
+description: Information about sending emails directly from Twenty.
+---
+
+## Current Status
+
+Twenty's email integration is designed to **sync and display** your email history. Emails cannot be composed or sent directly from Twenty's interface.
+
+When you view an email thread on a record page and click **Reply**, you'll be redirected to the original thread in your mailbox (Gmail, Outlook, etc.). This is where you compose and send your reply.
+
+## What You Can Do Today
+
+* **View email history** on People, Companies, and Opportunities records
+* **Read full email threads** with contacts in your CRM
+* **Track communication context** alongside calendar events
+* **Auto-create contacts** from email interactions
+* **Reply via redirect** — click Reply to jump to your mailbox
+
+## Sending Emails via Workflows
+
+While you can't send emails manually from Twenty, you **can send emails automatically using Workflows**. This is useful for:
+
+* Automated follow-ups
+* Notifications to contacts
+* Triggered communications based on record changes
+
+Emails sent via workflows go through your connected mailbox account.
+
+→ Learn about the [Send Email action](/l/pt/user-guide/workflows/capabilities/workflow-actions#send-email)
+
+## Email Sequences and Newsletters
+
+For email sequences and newsletters, we recommend using workflows to connect Twenty to a dedicated email marketing tool.
+
+
+ Mass emails should not be sent directly from your mailbox to protect your domain reputation. Use a dedicated tool for bulk communications.
+
+
+→ See [How to send emails from workflows](/l/pt/user-guide/workflows/capabilities/send-emails-from-workflows) for setup instructions
+
+## Future Plans
+
+Native email composition from within Twenty is on our roadmap. Join our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to share your use case and help prioritize this feature.
diff --git a/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx b/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx
new file mode 100644
index 0000000000..de258baef3
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx
@@ -0,0 +1,35 @@
+---
+title: Can I Track Email Activity on All Objects?
+description: Understanding email activity tracking across different objects.
+---
+
+## Supported Objects
+
+Email activity is currently available on **three standard objects**:
+
+| Object | What You See |
+| ----------------- | ---------------------------------------------------------------- |
+| **People** | All emails exchanged with that specific contact |
+| **Companies** | All emails with anyone from that company (based on email domain) |
+| **Opportunities** | Emails related to the company linked to the opportunity |
+
+## Why Only These Objects?
+
+People, Companies, and Opportunities are the core relationship objects where email context adds the most value. Email threads are automatically linked based on:
+
+* **Email address** → matched to People records
+* **Email domain** → matched to Company records
+* **Company relation** → linked to Opportunities
+
+## Custom Objects
+
+**Email tracking is not available on custom objects** at this time.
+
+If you need email context on a custom object, consider:
+
+* Using a relation field to link your custom object to People or Companies
+* Viewing email history on the linked People/Company record
+
+## Future Plans
+
+Extending email visibility to custom objects is being considered. Share your use case on our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to help prioritize this feature.
diff --git a/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx b/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx
new file mode 100644
index 0000000000..83da30bd83
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx
@@ -0,0 +1,42 @@
+---
+title: Connect Several Mailboxes per User
+description: Connect multiple email accounts for a single user.
+---
+
+## Overview
+
+Twenty supports **unlimited email accounts per user**. This is useful if you manage multiple inboxes, such as:
+
+* Personal work email + shared team inbox
+* Multiple client-facing email addresses
+* Different email accounts for different roles
+
+## How to Add Multiple Mailboxes
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Connect your additional Google or Microsoft account
+4. Configure sync settings for this mailbox
+5. Repeat for each mailbox you want to connect
+
+## Managing Multiple Accounts
+
+Each connected mailbox has its own settings:
+
+* **Email visibility**: Choose what teammates can see
+* **Contact auto-creation**: Enable/disable per mailbox
+* **Folder selection**: Choose which folders to sync (Lab feature)
+
+## How Emails Appear
+
+Emails from all your connected mailboxes are synced to Twenty and appear on:
+
+* **People records**: Based on the contact's email address
+* **Company records**: Based on the email domain
+* **Opportunities**: Based on the linked company
+
+Each email shows which mailbox it was sent from/received to, so you can track which account was used for each communication.
+
+## Important Notes
+
+Only true mailboxes can be connected. Email aliases that forward to another mailbox cannot be connected separately—they'll sync through the main mailbox.
diff --git a/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx b/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx
new file mode 100644
index 0000000000..c5db7745a0
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx
@@ -0,0 +1,53 @@
+---
+title: I Don't See Emails on Records
+description: Troubleshooting missing emails on records.
+---
+
+## Common Reasons
+
+### 1. Initial Sync Still in Progress
+
+Email sync takes time, especially for large mailboxes.
+
+* **Calendar sync**: Completes in minutes
+* **Email sync**: Can take several hours for large mailboxes
+
+**Solution**: Wait up to a few hours for the initial import to complete.
+
+### 2. Contact Doesn't Exist in Twenty
+
+Emails only appear on existing People records. If the contact wasn't created yet:
+
+* Enable **Contact Auto-Creation** in your mailbox settings
+* Or manually create the Person record first
+
+**Solution**: Go to **Settings → Accounts**, select your mailbox, and enable contact auto-creation.
+
+### 3. Internal Emails Are Excluded
+
+Emails between colleagues (same email domain) are never synced to maintain privacy.
+
+**Solution**: This is expected behavior. Only external emails are synced.
+
+### 4. Email Is from a Group or Distribution List
+
+Group emails and distribution lists are excluded from sync.
+
+**Solution**: This is expected behavior.
+
+### 5. Folder Not Selected for Sync
+
+If you're using the Message Folder feature, some folders might be excluded.
+
+**Solution**: Go to **Settings → Accounts**, select your mailbox, and check folder sync settings.
+
+### 6. Wrong Email Address on Record
+
+The Person record might have a different email address than the one used in the email.
+
+**Solution**: Add the correct email address to the Person record.
+
+## Still Not Working?
+
+1. Try disconnecting and reconnecting your mailbox
+2. Contact support if issues persist
diff --git a/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx b/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
new file mode 100644
index 0000000000..9569d2651a
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
@@ -0,0 +1,52 @@
+---
+title: Limit Emails Imported
+description: Control which emails are imported into Twenty.
+---
+
+## Overview
+
+By default, Twenty syncs all external emails from your connected mailbox. You can limit what gets imported using **folder selection** and **visibility settings**.
+
+## Method 1: Folder Selection (Recommended)
+
+Control which email folders sync with Twenty:
+
+1. Go to **Settings → Releases → Lab**
+2. Enable **Message Folder**
+3. Return to **Settings → Accounts**
+4. Select your connected email account
+5. Choose which folders to sync:
+
+| Folder | Description |
+| ------------------ | ----------------------------- |
+| **Inbox** | Primary incoming emails |
+| **Sent** | Outgoing emails you've sent |
+| **Archive** | Archived messages |
+| **Custom Folders** | Any specific folders you want |
+
+6. Exclude folders you don't want synced (Spam, Trash, personal folders)
+
+This gives you precise control over which emails appear in your CRM without syncing everything.
+
+## Method 2: Contact Auto-Creation Settings
+
+Control when contacts are created from emails:
+
+1. Go to **Settings → Accounts**
+2. Select your connected mailbox
+3. Choose an option:
+ * **Deactivated**: No contacts created, but emails still sync to existing contacts
+ * **Sent & Received**: Create contacts from all external emails
+ * **Sent Only**: Only create contacts from emails you send
+
+## What's Always Excluded
+
+These emails are never synced, regardless of settings:
+
+* **Internal emails**: Messages between colleagues (same domain)
+* **Group emails**: Distribution lists and group messages
+* **Spam/Trash**: System folders are typically excluded
+
+## Important Note
+
+We don't provide a CC email address for selective syncing. Use the folder selection feature above to achieve the same level of control.
diff --git a/packages/twenty-docs/l/pt/user-guide/calendar-emails/overview.mdx b/packages/twenty-docs/l/pt/user-guide/calendar-emails/overview.mdx
new file mode 100644
index 0000000000..21530530b7
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/calendar-emails/overview.mdx
@@ -0,0 +1,132 @@
+---
+title: Calendar & Emails
+description: Connect your email and calendar accounts to Twenty.
+image: /images/user-guide/emails/emails_header.png
+---
+
+
+
+
+
+## Connection Options
+
+### Google Account (Gmail & Google Calendar)
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Select **Continue with Google**
+4. Authorize Twenty to access your Gmail and Google Calendar
+5. Configure email sync settings (visibility, auto-creation) → click **Next**
+6. Configure calendar sync settings (visibility, auto-creation) → click **Add Account**
+7. Your emails and calendar events will start syncing automatically
+
+### Microsoft Account (Outlook & Microsoft Calendar)
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Select **Continue with Microsoft**
+4. Authorize Twenty to access your Outlook and Microsoft Calendar
+5. Configure email sync settings (visibility, auto-creation) → click **Next**
+6. Configure calendar sync settings (visibility, auto-creation) → click **Add Account**
+7. Your emails and calendar events will start syncing automatically
+
+### SMTP/CalDAV Setup (Other Providers)
+
+For other email and calendar providers:
+
+1. Go to **Settings → Releases → Lab** to enable the feature
+2. Return to **Settings → Accounts**
+3. Configure SMTP settings for email
+4. Configure CalDAV settings for calendar
+5. Test the connection
+
+### Multiple Mailboxes
+
+* **Unlimited Accounts**: Connect multiple email accounts per user
+* **Account Management**: Switch between different mailboxes
+* **Sync Settings**: Configure different settings per mailbox
+
+
+ Only true mailboxes can be connected (e.g., support@domain.com with its own inbox). Email aliases that forward to another mailbox cannot be connected to Twenty.
+
+
+## Email Configuration
+
+### Message Visibility
+
+Choose different levels of visibility for your emails:
+
+* **Metadata Only**: Share only basic information (sender, recipient, date, time)
+* **Subject and Metadata**: Share subject line along with metadata
+* **All Email Content**: Share entire email content including attachments
+
+### Contact Auto-Creation
+
+* **Deactivated**: No automatic contact creation
+* **For messages sent & received**: Create contacts for all external email interactions
+* **For messages sent only**: Create contacts only for emails you send
+* **Note**: Internal emails (same domain) are never synced to maintain privacy
+
+When enabled, contacts are automatically linked to their Company records based on their email domain. If the company doesn't exist yet, Twenty creates it for you.
+
+### Control which emails get sync with Message Folder Selection (Lab Feature)
+
+Control which email folders sync with Twenty:
+
+1. Go to **Settings → Releases → Lab** and enable **Message Folder**
+2. Return to **Settings → Accounts** and select your connected email account
+3. Choose which folders to sync:
+ * **Inbox**: Primary incoming emails
+ * **Sent**: Outgoing emails you've sent
+ * **Custom Folders**: Any specific folders you want to include
+ * **Exclude Folders**: Skip folders like Spam, Trash, or personal folders
+
+This gives you precise control over which emails appear in your CRM without syncing everything.
+
+**What Gets Synced:**
+
+* **External Emails**: All emails with external contacts from selected folders
+* **Internal Emails**: Not synced (same domain emails remain private)
+* **Attachments**: Coming in H1 2026
+
+**Note**: We don't provide a CC email address for selective syncing. Instead, use the Message Folder feature above to achieve the same level of control over which emails sync with Twenty.
+
+## Calendar Configuration
+
+### Event Visibility
+
+Choose what will be visible to other users in your workspace:
+
+* **Everything**: The whole event details will be shared with your team
+* **Metadata**: Only date & participants will be shared with your team
+
+### Contact Auto-Creation for Meetings
+
+* **Yes**: Automatically create contacts for meeting participants not in your CRM
+* **No**: Only link meetings to existing contacts
+
+When enabled, contacts are automatically linked to their Company records based on their email domain. If the company doesn't exist yet, Twenty creates it for you.
+
+### Control which events get sync
+
+* **Meeting Import**: Automatically import calendar events
+* **Contact Linking**: Link meetings to People and Company records
+
+**What Gets Synced:**
+
+* **Meetings**: Calendar events with external participants
+* **Contact Linking**: Events automatically linked to CRM records
+* **Team Events**: Shared calendar visibility
+
+## Sync Frequency
+
+**Updates every 5 minutes**: Both email and calendar data sync automatically every 5 minutes after the initial import.
+
+
+ **Initial sync timing**: Calendar sync completes quickly (usually within minutes), while email sync takes longer for large mailboxes—up to a few hours depending on volume. Don't worry if you see contacts from calendar events appearing before your email contacts; this is normal behavior.
+
+
+## Next Steps
+
+* [Mailbox capabilities](/l/pt/user-guide/calendar-emails/capabilities/mailbox)
+* [Troubleshoot missing emails](/l/pt/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records)
diff --git a/packages/twenty-docs/l/pt/user-guide/dashboards/capabilities/dashboards.mdx b/packages/twenty-docs/l/pt/user-guide/dashboards/capabilities/dashboards.mdx
new file mode 100644
index 0000000000..b3d731e668
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/dashboards/capabilities/dashboards.mdx
@@ -0,0 +1,74 @@
+---
+title: Dashboards
+description: Create and organize dashboards with tabs to visualize your CRM data.
+---
+
+## Overview
+
+Dashboards in Twenty are organized in a hierarchy: **Dashboards → Tabs → Widgets**. Each dashboard can contain multiple tabs, and each tab contains widgets (charts, numbers, iFrames).
+
+## Creating a Dashboard
+
+1. Go to **Dashboards** in the navigation
+2. Click **+ New Dashboard**
+3. Give your dashboard a name
+4. Start adding tabs and widgets
+
+## Working with Tabs
+
+Tabs help you organize your dashboard into logical sections.
+
+### Creating Tabs
+
+1. In edit mode, click **+ Add Tab**
+2. Name your tab (e.g., "Pipeline Overview", "Team Performance")
+3. Add widgets to the tab
+
+### Duplicating Tabs
+
+1. Click on the tab you want to duplicate
+2. Click the **Duplicate** button in the side panel
+
+## Dashboard Layout
+
+### Arranging Widgets
+
+* Drag and drop to position
+* Resize for emphasis
+* Group related charts together
+
+### Duplicating a Dashboard
+
+1. Exit edit mode (view mode only)
+2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
+3. Select **Duplicate dashboard**
+
+### Best Practices
+
+* **Logical flow**: Arrange from overview to detail
+* **Visual hierarchy**: Larger charts for key metrics
+* **Consistent styling**: Use matching colors and fonts
+
+## Visibility & Access
+
+### Dashboard Visibility
+
+Dashboards are visible to everyone who has access to your Twenty workspace. There is no private dashboard option at the moment.
+
+### Favorites
+
+You can add dashboards to your favorites for quick access. This is a personal setting—your favorites are not visible to other users.
+
+To add a dashboard to favorites, open the dashboard and click the star icon.
+
+### Timezone Behavior
+
+Dashboards currently display data based on the timezone of the user viewing them. This means the same dashboard may show different metrics for team members in different regions (e.g., APAC vs. US).
+
+
+ **Coming soon**: We will add the ability to set a specific timezone for a dashboard, so all users see consistent data regardless of their location.
+
+
+
+ **Coming soon**: Dashboard-level filters will allow you to apply filters across all widgets at once, making it faster to explore your data.
+
diff --git a/packages/twenty-docs/l/pt/user-guide/dashboards/capabilities/widgets.mdx b/packages/twenty-docs/l/pt/user-guide/dashboards/capabilities/widgets.mdx
new file mode 100644
index 0000000000..fc12e61339
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/dashboards/capabilities/widgets.mdx
@@ -0,0 +1,131 @@
+---
+title: Widgets
+description: Explore the widget types and visualization options in Twenty.
+---
+
+## Available Widgets
+
+Twenty provides various widget types to visualize your CRM data.
+
+### Bar Charts
+
+Display data as horizontal or vertical bars.
+
+**Best for:**
+
+* Comparing values across categories
+* Showing rankings
+* Tracking metrics by time period
+
+**Example uses:**
+
+* Deals by stage
+* Revenue by sales rep
+* Contacts added per month
+
+
+ **Display limits**: Bar charts can show a maximum of 100 bars (horizontal) or 50 bars (vertical). If you see the warning "Undisplayed data: max X bars per chart", add filters to narrow down your data or change the grouping (e.g., group by week instead of days).
+
+
+### Pie Charts
+
+Show proportions of a whole.
+
+**Best for:**
+
+* Showing composition or distribution
+* Comparing parts to whole
+* Highlighting major segments
+
+**Example uses:**
+
+* Deal distribution by source
+* Contact breakdown by industry
+* Pipeline composition by owner
+
+### Line Charts
+
+Display trends over time.
+
+**Best for:**
+
+* Tracking changes over time
+* Identifying trends
+* Comparing multiple metrics
+
+**Example uses:**
+
+* Monthly deal count trend
+* Revenue growth over quarters
+* Activity levels over time
+
+### Number Metrics
+
+Display single key values prominently.
+
+**Best for:**
+
+* Highlighting KPIs
+* Showing totals or averages
+* Quick status checks
+
+**Example uses:**
+
+* Total pipeline value
+* Number of open opportunities
+* Conversion rate
+
+**Advanced options:**
+
+* **Ratio**: For Select fields, calculate ratios between values. Go to **Data on display** → select your field → enable the **Ratio** option.
+* **Prefix & Suffix**: Add custom text before or after the number (e.g., "$" prefix or "%" suffix) for better readability.
+
+### iFrames
+
+Embed external tools and content directly in your dashboard.
+
+**Best for:**
+
+* Displaying external reports or dashboards
+* Integrating third-party sales tools
+* Showing live content from other systems
+
+**Example uses:**
+
+* Metrics from your Support tool
+* Metrics from your dialer
+* Live content from your Sales sequence tool
+
+
+ **Coming soon**: Gauge charts and tables are not yet available but are on our roadmap.
+
+
+## Configuring Widgets
+
+### Data Source
+
+1. Select the object to visualize (Opportunities, People, etc.)
+2. Choose the metric to display (count, sum, average)
+3. Apply filters to focus on specific data
+
+### Grouping
+
+Group data by:
+
+* Fields (stage, owner, industry)
+* Time periods (day, week, month, quarter)
+* Custom segments
+
+### Styling
+
+Customize your charts with:
+
+* Colors and themes
+* Labels and legends
+* Size and positioning
+
+### Duplicating Widgets
+
+1. Click on the widget
+2. Open **Options**
+3. Click **Duplicate widget**
diff --git a/packages/twenty-docs/l/pt/user-guide/dashboards/how-tos/dashboards-faq.mdx b/packages/twenty-docs/l/pt/user-guide/dashboards/how-tos/dashboards-faq.mdx
new file mode 100644
index 0000000000..7af41b4efa
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/dashboards/how-tos/dashboards-faq.mdx
@@ -0,0 +1,59 @@
+---
+title: Dashboards FAQ
+description: Frequently asked questions about dashboards in Twenty.
+---
+
+
+
+ No, dashboards are currently visible to everyone with access to your Twenty workspace. Private dashboards are not yet available.
+
+
+
+ Dashboards currently display data based on the viewer's timezone. If you're in different regions (e.g., APAC vs. US), you may see slightly different numbers for the same dashboard. We're working on adding a timezone setting per dashboard to ensure consistent data across teams.
+
+
+
+ Exporting dashboards is not available at the moment. This feature is on our roadmap.
+
+
+
+ No, sharing dashboards with users outside your Twenty workspace (non-Twenty users) is not currently supported.
+
+
+
+ Open the dashboard you want to favorite, then click the star icon. Favorites are personal—they won't affect other users.
+
+
+
+ * **Tabs** organize your dashboard into sections (like pages within the dashboard)
+ * **Widgets** are the individual visualizations (charts, numbers, iFrames) within each tab
+
+ Structure: Dashboard → Tabs → Widgets
+
+
+
+ Bar charts have display limits: 100 bars for horizontal charts, 50 for vertical. If your data exceeds this, add filters to narrow down the results or change the grouping (e.g., group by week instead of day).
+
+
+
+ Dashboard-level filters are not available yet, but this feature is on our roadmap. Currently, you need to apply filters to each widget individually.
+
+
+
+ Not yet. Gauge charts and tables are on our roadmap and will be added in a future release.
+
+
+
+ 1. Make sure you're in view mode (not editing)
+ 2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
+ 3. Select **Duplicate dashboard**
+
+
+
+ Widgets update automatically as your CRM data changes:
+
+ * Real-time updates for most metrics
+ * Use the refresh button for a manual update if needed
+ * Historical data is preserved for trend analysis
+
+
diff --git a/packages/twenty-docs/l/pt/user-guide/dashboards/overview.mdx b/packages/twenty-docs/l/pt/user-guide/dashboards/overview.mdx
new file mode 100644
index 0000000000..59e2f44a5a
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/dashboards/overview.mdx
@@ -0,0 +1,79 @@
+---
+title: Dashboards
+description: Learn the basics of reporting and dashboards in Twenty.
+image: /images/user-guide/reporting/pie-chart.png
+---
+
+
+
+
+
+## Understanding Dashboards
+
+Dashboards in Twenty provide a visual way to track your key performance metrics and gain insights from your CRM data.
+
+
+
+## Key Concepts
+
+### Dashboards
+
+A dashboard is a collection of tabs that display your CRM data at a glance. You can create multiple dashboards for different purposes:
+
+* Sales performance
+* Team activity
+* Pipeline health
+* Custom metrics
+
+### Tabs
+
+Tabs allow you to organize your dashboard into sections. Each tab contains one or more widgets.
+
+### Widgets
+
+Widgets are individual visualizations that display specific data. Types include:
+
+* Bar charts
+* Pie charts
+* Line charts
+* Number metrics
+* iFrames
+
+
+ **Current limitations**:
+
+ * Exporting dashboards and sharing with external users (non-Twenty users) are not available at the moment.
+ * Gauge charts and tables are not yet available.
+
+
+## Getting Started
+
+### Creating Your First Dashboard
+
+1. Navigate to the **Dashboards** section
+2. Click **+ New Dashboard**
+3. Give your dashboard a name
+4. Add tabs to organize your content
+5. Add widgets to display your data
+6. Save
+
+### Adding Widgets
+
+1. Open a tab on your dashboard
+2. Click **+ Add Widget**
+3. Select the widget type
+4. Choose the data source (object)
+5. Configure the widget settings
+6. Save and view your widget
+
+## Best Practices
+
+* **Start simple**: Begin with a few key metrics and add more over time
+* **Focus on actionable data**: Display metrics that drive decisions
+* **Regular review**: Check your dashboards regularly to spot trends
+* **Share with team**: Make dashboards visible to relevant team members
+
+## Next Steps
+
+* [Widgets and visualizations](/l/pt/user-guide/dashboards/capabilities/widgets)
+* [Dashboards FAQ](/l/pt/user-guide/dashboards/how-tos/dashboards-faq)
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/error-handling.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/error-handling.mdx
new file mode 100644
index 0000000000..d0bd8e3b0f
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/error-handling.mdx
@@ -0,0 +1,76 @@
+---
+title: Error Handling & Validation
+description: Review and fix import errors directly in the UI before confirming.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Pre-Import Validation
+
+After uploading your file and mapping fields, Twenty validates your data **before** importing. This allows you to catch and fix errors without affecting your existing data.
+
+## How It Works
+
+1. **Upload** your CSV file
+2. **Map** your columns to Twenty fields
+3. **Review** the potential errors highlighted in yellow
+4. **Fix errors** directly in the UI
+5. **Confirm** the import
+
+
+
+## Error Display
+
+Rows with issues are highlighted in **yellow**. You can:
+
+* **Edit the cell directly** to fix the error
+* **Remove the row** to skip it entirely
+
+This inline editing saves time—no need to go back to your spreadsheet, fix errors, and re-upload.
+
+## Common Error Types
+
+### Duplicate Values
+
+**Cause**: A unique field (email, domain) already exists in Twenty or appears twice in your file.
+
+**Fix**:
+
+* Edit the duplicate value in the import UI
+* Remove one of the duplicate rows
+
+See [Uniqueness Constraints](/l/pt/user-guide/data-migration/capabilities/uniqueness-constraints) for more details on how uniqueness is enforced.
+
+### Invalid Format
+
+**Cause**: Data doesn't match the expected format (e.g., invalid email, wrong date format).
+
+**Fix**: Edit the cell to use the correct format.
+
+See [Field Mapping](/l/pt/user-guide/data-migration/capabilities/field-mapping) for the expected format of each field type.
+
+### Missing Required Fields
+
+**Cause**: A required field is empty.
+
+**Fix**: Enter a value in the required field or remove the row.
+
+### Relation Not Found
+
+**Cause**: The referenced record doesn't exist (e.g., a Company domain that wasn't imported).
+
+**Fix**:
+
+* Import the parent records first
+* Or correct the reference value
+
+See [Import Relations](/l/pt/user-guide/data-migration/capabilities/import-relations) for the correct import order and how to link records.
+
+## Tips for Fewer Errors
+
+1. **Download the template** to see expected format prior to importing your file
+2. **Clean your data** in the spreadsheet first
+3. **Import files in correct order** to import relations (Companies → People → Opportunities)
+4. **Test with small batches** before full import
+5. **Check for duplicates** before uploading
+6. **Limit the size of your file to 10,000 records** per file
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/field-mapping.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/field-mapping.mdx
new file mode 100644
index 0000000000..9eab01bc23
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/field-mapping.mdx
@@ -0,0 +1,198 @@
+---
+title: Field Mapping
+description: How field mapping works during data import.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## How Field Mapping Works
+
+When you upload a file, Twenty analyzes your columns and attempts to match them to existing fields.
+
+### Automatic Mapping
+
+Twenty tries to match columns based on:
+
+* Column header names (exact or similar matches)
+* Data type detection (dates, numbers, emails)
+* Common field patterns
+
+**Quick tip:** Export a few rows from the object you want to import. The exported file will have the exact column names Twenty expects, making automatic mapping seamless during import.
+
+### Manual Mapping Options
+
+For each column, you can:
+
+* **Map to a field**: Select the matching Twenty field from a dropdown
+* **Do not map**: Skip the column entirely (data won't be imported)
+
+**Fields must exist before import.** The import creates records, not fields. Create custom fields under **Settings → Data Model** before importing.
+
+## Field Type Compatibility
+
+All field types available in the Data Model are supported for import.
+
+You can also import `id` values to either assign a specific ID to new records or update existing ones.
+
+
+
+## Data Format Requirements
+
+**Some fields have special syntax.** We recommend downloading the sample file before preparing your import to see the expected syntax for each field type.
+
+### Address Fields
+
+Address is a nested field with multiple columns. Some can be left empty.
+
+* **Address / Address 1**: Street address line 1
+* **Address / Address 2**: Street address line 2
+* **Address / City**: City name
+* **Address / State**: State or province
+* **Address / Country**: Country name
+* **Address / Post Code**: Postal/ZIP code
+
+### Array Fields
+
+Use the following format:
+
+```
+["value1","value2"]
+```
+
+### Boolean Fields
+
+Use `TRUE` or `FALSE` (uppercase) - not `true` or `false`
+
+### Currency Fields
+
+Currency is a nested field with two columns that **both must be filled**:
+
+* **Amount / Amount**: The numeric value (e.g., `1234.56`)
+* **Amount / Currency**: The currency code (e.g., `USD`, `EUR`)
+
+### Date Fields
+
+Supported formats:
+
+* `YYYY-MM-DD` (recommended)
+* `MM/DD/YYYY`
+* `DD/MM/YYYY`
+* ISO 8601 format
+
+### Domain Fields
+
+* It is recommended to use the format `https://domain.com` to avoid creating duplicates, as this is the format used for Companies created by the mailbox and calendar synchronizations
+* A `Domain Label` and `Domain URL` can be filled: best practice is to fill `domain.com` in the label and `https://domain.com` in the url
+* Domains must be unique within the Companies object
+* **Domains must be unique within the file to import**
+
+### Email Fields
+
+* Must be valid email format
+* Emails must be unique within the People object
+* **Emails must be unique within the file to import**
+* For additional emails: use **Emails / Primary Email** for the main email, and **Emails / Additional Emails** with this format:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Id Fields
+
+Specifying an `id` during import is optional. Twenty auto-generates one if not provided.
+
+Use cases for mapping an `id` column:
+
+* **Set a specific ID**: Choose the UUID for newly created records
+* **Update existing records**: Match against existing records to update them instead of creating duplicates. In that case, it is recommended to not map the other unique fields: mapping only one unique field ensures a smoother import.
+
+If you provide an `id`, it must be in UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
+
+### JSON Fields
+
+Use valid JSON format:
+
+```
+{"key":"value","key2":"value2"}
+```
+
+### Links Fields
+
+Similar to Domain fields:
+
+* Fill both the label and URL columns: **Links / Link URL** and **Links / Link Label**
+* Use full URL format: `https://example.com`
+* For secondary links, use **Links / Secondary Links** column with this format:
+
+```
+[{"url":"https://twenty.com","label":"Twenty"}]
+```
+
+### Multi-Select Fields
+
+Use the **API names** (not the display labels) in the following format:
+
+```
+["VALUE1","VALUE2"]
+```
+
+See [here](#finding-api-names-for-select-fields) where to find the API names.
+
+New select options will not be created automatically by the import. They must be added under **Settings → Data Model** before importing.
+
+
+ **Import overwrites, it does not add.**
+
+ If a record already has `VALUE2` and `VALUE3` selected, and you import `["VALUE1"]`, the record will only have `VALUE1` after import. The previous selections are replaced, not merged.
+
+
+### Number Fields
+
+* Numbers only
+* Decimals use period: `1234.56`
+* No thousands separators
+
+### Phone Fields
+
+Phone is a nested field with multiple columns that **must be filled**
+
+* **Phones / Primary Phone Number**: The phone number (e.g., `4159095555`)
+* **Phones / Primary Phone Country Code**: Country code (e.g., `US`)
+* **Phones / Primary Phone Calling Code**: Dialing code (e.g., `+1`)
+
+### Rating Fields
+
+Use the API name format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, `RATING_5`
+
+### Relation Fields
+
+Please see our dedicated article: [Import Relations Between Objects](/l/pt/user-guide/data-migration/capabilities/import-relations)
+
+### Select Fields
+
+Use the **API name** of the option (not the display label):
+
+```
+VALUE1
+```
+
+See [here](#finding-api-names-for-select-fields) where to find the API names.
+New select options will not be created automatically by the import. They must be added under **Settings → Data Model** before importing.
+
+### Text Fields
+
+* No special formatting required
+* Leading/trailing spaces are trimmed
+
+## Finding API Names
+
+For Select, Multi-Select, and Array fields with predefined options, you must use the **API names**, not the display labels.
+
+### How to Find API Names
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at the bottom right of the settings page)
+4. View the API name for each option
+
+
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/file-formats.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/file-formats.mdx
new file mode 100644
index 0000000000..0dca437155
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/file-formats.mdx
@@ -0,0 +1,48 @@
+---
+title: Supported File Formats
+description: File formats supported for data import in Twenty.
+---
+
+## Supported Formats
+
+Twenty supports three file formats for import:
+
+| Format | Extension | Notes |
+| ------------------ | --------- | ---------------------------- |
+| **CSV** | .csv | Recommended, most compatible |
+| **Excel** | .xlsx | Modern Excel format |
+| **Excel (Legacy)** | .xls | Older Excel format |
+
+## File Requirements
+
+| Requirement | Value |
+| ---------------- | ------------------------------------- |
+| **Encoding** | UTF-8 recommended |
+| **Record limit** | 10,000 records per file |
+| **Structure** | First row must contain column headers |
+| **Content** | One object type per file |
+
+## CSV Best Practices
+
+* **Delimiter**: Use comma (`,`) or semicolon (`;`)
+* **Text qualifier**: Use double quotes (`"`) for text containing commas
+* **Line endings**: Windows (CRLF) or Unix (LF) both supported
+* **Empty values**: Leave cells empty, don't use "NULL" or "N/A"
+
+## Excel Best Practices
+
+When exporting from Excel:
+
+* Remove formulas (export values only)
+* Delete empty rows at the end
+* Ensure no merged cells
+* Use the first sheet only
+
+## Large Datasets
+
+For datasets larger than 10,000 records:
+
+* Split into multiple files
+* Or use the [API import](/l/pt/user-guide/data-migration/how-tos/import-data-via-api) for unlimited records
+
+For very large migrations (100,000+ records), the API is significantly faster and more reliable than CSV imports.
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/import-relations.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/import-relations.mdx
new file mode 100644
index 0000000000..e0364191de
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/import-relations.mdx
@@ -0,0 +1,148 @@
+---
+title: Import Relations Between Objects
+description: Import relationships between records via CSV.
+---
+
+## Overview
+
+Twenty supports importing relationships between objects during CSV import. This allows you to link records (e.g., attach People to Companies) as part of your data migration.
+
+**Currently supported for import**: One-to-many relations pointing to a single object type on each side (e.g., People → Companies). Relations pointing to multiple object types are not yet supported in import/export.
+
+## How Relations Work in Twenty
+
+### One to Many / Many to One
+
+Twenty supports standard relations where one record links to many others:
+
+* **One Company → Many People**: A company can have multiple employees, but each person belongs to one company
+* **One Company → Many Opportunities**: A company can have multiple deals, but each opportunity belongs to one company
+
+### Relations That Can Point to Multiple Object Types
+
+Some relations can connect to different types of objects. This works in two ways:
+
+**Pattern 1: Many records linking to one record each from different object types**
+
+Several Notes, Tasks, or Activities can each be attached to multiple object types at once:
+
+* **Notes** can be linked to one Person, one Company, and one Opportunity simultaneously
+* **Tasks** can be linked to one Person, one Company, and one Opportunity simultaneously
+
+Here, the Notes/Tasks are on the "many" side. Each links to one record per object type.
+
+
+
+**Pattern 2: One record receiving links from many records of different object types**
+
+A Project can receive links from multiple records across different object types:
+
+* **A Project** can have many People linked to it, many Companies linked to it, and many Notes attached to it
+
+Here, the Project is on the "one" side. Multiple records from different objects can all link to the same Project.
+
+
+
+
+ **Import/Export limitation**: Relations that point to multiple object types (like Notes → People/Companies/Opportunities) are **not yet supported** in CSV import or export.
+
+ * **Import**: Only one-to-many relations pointing to a single object type on each side can be imported
+ * **Export**: Columns for relations pointing to multiple object types are currently left empty
+
+ This is on our roadmap.
+
+
+### What's Not Supported Today
+
+**Many to Many relations** are not yet available. For example, you cannot currently create a relation where:
+
+* Many People are linked to many Projects
+
+Many to Many relations are planned for H1 2026.
+
+## Linking Records During Import
+
+**Reminder**: Only one-to-many relations pointing to a single object type can be imported (e.g., People → Companies). Relations pointing to multiple object types (e.g., Notes → People/Companies/Opportunities) are not yet supported.
+
+### Step 1: Identify the "One" and "Many" Sides
+
+First, determine which object is on the "one" side and which is on the "many" side of the relationship.
+
+**Example**:
+
+* **Company** is the "one" side (one company has many employees)
+* **People** is the "many" side (each person belongs to one company)
+
+### Step 2: Ensure the "One" Side Records Exist
+
+Before importing the "many" side, the "one" side records must already exist in Twenty.
+
+* Import or create the "one" side records first (e.g., Companies)
+* Validate their unique identifier. This can be:
+ * The `id` (Twenty's UUID)
+ * A field set as unique (e.g., `domain` for Companies, or an external ID from your previous system)
+
+The import will fail if a reference is made to a record that does not exist.
+
+### Step 3: Prepare Your CSV File
+
+Add a column in your "many" side CSV file that references the "one" side record.
+
+**Example**: For a People CSV file linking to Companies:
+
+```
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+**Important**:
+
+* The value must **exactly match** the unique field on the Company record
+* For domains, use the **Domain URL** (e.g., `https://acme.com`), not the Domain Label
+* Map only **one** unique identifier per relation: this leads to a smoother import
+
+### Step 4: Ensure the Relation Field Exists
+
+Before uploading your file, make sure the relation field exists between your objects.
+
+If it doesn't exist:
+
+1. Go to **Settings → Data Model**
+2. Select your object (e.g., People)
+3. Create a relation field pointing to the target object (e.g., Company)
+
+### Step 5: Upload and Map the Relation
+
+1. Upload your CSV file via the import UI
+2. In the field mapping step, find your relation column (e.g., `companyDomain`)
+3. Map it to the relation field (e.g., Company)
+4. Twenty will automatically link each record to the matching parent
+
+### Available Unique Fields for Relations
+
+| Object | Unique Fields Available |
+| ------------------------------------- | --------------------------------------- |
+| **Companies** | `id`, `domain`, any custom unique field |
+| **People** | `id`, `email`, any custom unique field |
+| **Workspace Members** | `id`, `email` (not name) |
+| **Other standard and custom objects** | `id`, any field marked as unique |
+
+**Linking to Workspace Members**: When the relation points to Workspace Members (your team logging into Twenty), reference them by their **email address**, not their name.
+
+We recommend using `domain` for Companies and `email` for People, as these are human-readable and easy to maintain in spreadsheets.
+
+**Reminder**: Soft-deleted records (visible under Command Menu → See deleted records) count toward uniqueness criteria. If you import a record with the same unique value as a deleted record, the deleted record will be restored. See [Uniqueness Constraints](/l/pt/user-guide/data-migration/capabilities/uniqueness-constraints) for more details.
+
+## Import Order Rule
+
+
+ **Always import the "one" side first!**
+
+ 1. **Companies** first (no dependencies)
+ 2. **People** second (linked to Companies)
+ 3. **Opportunities** third (linked to Companies/People)
+ 4. **Custom objects** following their dependencies
+
+ The parent record must exist before you can reference it.
+
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/uniqueness-constraints.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/uniqueness-constraints.mdx
new file mode 100644
index 0000000000..5f6d05701b
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/capabilities/uniqueness-constraints.mdx
@@ -0,0 +1,72 @@
+---
+title: Uniqueness Constraints
+description: How Twenty enforces data uniqueness during import.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Overview
+
+Twenty enforces uniqueness on certain fields to prevent duplicate records and ensure data integrity. Understanding these constraints is essential for successful imports.
+
+## Default Unique Fields
+
+| Object | Unique Fields |
+| ------------------ | ---------------------- |
+| **People** | `id`, `email` |
+| **Companies** | `id`, `domain` |
+| **Custom objects** | `id` only (by default) |
+
+The `id` field is Twenty's internal identifier, auto-generated for each record. It uses UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
+
+## Custom Unique Fields
+
+You can define additional unique fields under **Settings → Data Model**:
+
+1. Go to **Settings → Data Model**
+2. Select the object
+3. Click on a field
+4. Enable **Unique** in field settings
+
+### Use Cases for Custom Unique Fields
+
+* **External IDs**: Store IDs from other systems (Salesforce ID, HubSpot ID)
+* **Business identifiers**: Employee numbers, customer codes
+* **Alternative contact info**: LinkedIn profile, phone number
+
+The field name `id` is reserved for Twenty's internal ID. Use a different name like `externalId` or `legacyId` for external identifiers.
+
+## Import Behavior
+
+### Creating New Records
+
+If a unique field value doesn't exist, a new record is created.
+
+### Updating Existing Records
+
+If a unique field value matches an existing record, that record is **updated** with the new data.
+To **update existing records**, it is recommended to **only match one unique field**.
+
+### Soft-Deleted Records
+
+
+ **Deleted records count toward uniqueness.**
+
+ Soft-deleted records (visible under Command Menu → See deleted records) are included in uniqueness checks. If you import a record with the same unique value as a deleted record, the deleted record will be **restored** with the new data.
+
+
+## Duplicate Detection During Import
+
+During the validation phase:
+
+* Duplicates within your file are highlighted in yellow
+* You can edit or remove duplicate rows from the UI before starting the import
+
+
+
+## Best Practices
+
+1. **Remove duplicates** from your file before importing
+2. **Check for existing records** in Twenty before importing
+3. **Use external IDs** when migrating from other systems
+4. **Include unique fields** if you want to update existing records
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/export-your-data.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/export-your-data.mdx
new file mode 100644
index 0000000000..ac49738a29
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/export-your-data.mdx
@@ -0,0 +1,209 @@
+---
+title: Export Your Data
+description: Complete step-by-step guide to exporting data from Twenty.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Overview
+
+Export your workspace data to CSV for backups, reporting, or migration.
+
+**Use cases:**
+
+* **Regular backups** — keep copies of your data
+* **External reporting** — analyze data in Excel, Google Sheets, or BI tools
+* **Migration** — move data to another system
+* **Bulk updates** — export, edit, and re-import to update records
+
+## What You Need to Know
+
+### Export Limits
+
+* **Maximum 20,000 records** per export
+* Only **visible columns** are exported
+* Only **filtered records** are exported (based on your current view)
+
+For larger exports (20,000+ records), use filters to export in batches or use the [API](/l/pt/developers/extend/capabilities/apis).
+
+### Permissions
+
+You need the **"Export CSV"** permission to export data. Contact your workspace admin if you don't have this option.
+
+## Step 1: Navigate to the Object
+
+Go to the object you want to export:
+
+* **People** — for contacts
+* **Companies** — for organizations
+* **Opportunities** — for deals
+* **Custom objects** — any object you've created
+
+## Step 2: Configure Your View
+
+**Important:** The export includes only what's visible in your current view.
+
+### Add/Remove Columns
+
+1. Click **Options → Fields** (or the **+** at the end of columns)
+2. Check the fields you want to export
+3. Uncheck fields you don't need
+
+### Filter Records (Optional)
+
+If you only need a subset of data:
+
+1. Click **Filter**
+2. Add filter conditions (e.g., "Created date > January 1, 2024")
+3. Only matching records will be exported
+
+### Sort Records (Optional)
+
+1. Click a column header to sort
+2. The export will follow your sort order
+
+**Create a dedicated export view.** Save a view specifically configured for exports so you don't need to reconfigure each time.
+
+## Step 3: Export the Data
+
+1. Click the **⋮** icon on the top right of the table
+2. Select **Export view**
+3. Choose where to save the CSV file
+4. Wait for the download to complete
+
+## What Gets Exported
+
+| Included | Not Included |
+| -------------------------------- | ---------------------- |
+| All visible columns | Hidden columns |
+| Records matching current filters | Filtered-out records |
+| Custom field values | Fields not in the view |
+| Record IDs | File attachments |
+| Relation IDs | Images |
+
+### Relation Fields
+
+Relation IDs are only exported on the **"many" side** of a relationship:
+
+* **People export** includes a `companyId` column (People → Company relation)
+* **Companies export** does NOT include `peopleIds` (Companies is the "one" side)
+
+This means you can use the People export to re-import and maintain the Company link, but you'll need to re-import People after Companies to recreate the relationships.
+
+## Exporting for Specific Purposes
+
+### For Backups
+
+1. Create a view with **all fields** visible
+2. Remove all filters to include all records
+3. Export each object type separately
+4. Store exports in a secure location
+5. Set a recurring reminder (weekly/monthly)
+
+### For External Reporting
+
+1. Include only the fields you need for analysis
+2. Apply filters to focus on relevant data
+3. Consider sorting by the field you'll analyze
+
+### For Bulk Updates
+
+1. Export the records you want to update
+2. Include the unique identifier (`email`, `domain`, or `id`)
+3. Edit the exported file
+4. Re-import to update records
+ See: [How to Update Existing Records](/l/pt/user-guide/data-migration/how-tos/update-existing-records-via-import)
+
+### For Migration
+
+If you're exporting to migrate to another system:
+
+1. **Export each object separately** — People, Companies, Opportunities, etc.
+2. **Include ID fields** — these help maintain relationships
+3. **Document field mappings** — note how Twenty fields map to your target system
+
+## Handling Large Datasets (20,000+ Records)
+
+The export limit is 20,000 records. For larger datasets:
+
+### Option 1: Export in Batches
+
+1. Add a filter (e.g., "Created date" ranges)
+2. Export the first batch
+3. Change the filter
+4. Export the next batch
+5. Combine files in your spreadsheet
+
+**Example filters for batching:**
+
+* By date range (January, February, March...)
+* By owner (Team member A, Team member B...)
+* By status (Active, Inactive...)
+
+### Option 2: Use the API
+
+The API has no record limit:
+
+1. Get your API key from **Settings → Developers**
+2. Use the GraphQL API to query records
+3. Process results in your application
+
+See: [API Documentation](/l/pt/developers/extend/capabilities/apis)
+
+## Tips and Best Practices
+
+### Create Export Views
+
+Save views configured specifically for exports:
+
+1. Configure columns and filters
+2. Click **View options** → **Save as new view**
+3. Name it "Export - [Purpose]"
+
+### Secure Your Exports
+
+Exported files may contain sensitive data:
+
+* Store in secure locations
+* Delete old exports when no longer needed
+* Be careful sharing export files
+
+### Check Before Exporting
+
+Correct columns are visible
+Filters are set correctly (or removed for full export)
+You have Export permission
+
+## FAQ
+
+
+
+ Only visible columns are exported. Add the columns you need via **Options → Fields** before exporting.
+
+
+
+ Check your filters. The export only includes records matching your current view filters. Remove filters to export all records.
+
+
+
+ Not in a single export. Use filters to export in batches, or use the API for larger datasets.
+
+
+
+ CSV (Comma Separated Values). Opens in Excel, Google Sheets, or any spreadsheet application.
+
+
+
+ Yes, but only on the "many" side of relationships. For example, a People export includes `companyId`, but a Companies export does not include people IDs.
+
+
+
+ Not directly through the UI. Use the API to build automated export workflows.
+
+
+
+## Next Steps
+
+* [How to Update Existing Records](/l/pt/user-guide/data-migration/how-tos/update-existing-records-via-import) — edit and re-import your export
+* [How to Import Data via API](/l/pt/user-guide/data-migration/how-tos/import-data-via-api) — for large datasets
+* [API Documentation](/l/pt/developers/extend/capabilities/apis) — build custom export workflows
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/fix-import-errors.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/fix-import-errors.mdx
new file mode 100644
index 0000000000..578878d12a
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/fix-import-errors.mdx
@@ -0,0 +1,430 @@
+---
+title: Fix Import Errors
+description: Complete troubleshooting guide for resolving CSV import errors.
+---
+
+## Overview
+
+Import not working? This guide helps you identify and fix common import errors step by step.
+
+## How Import Validation Works
+
+After uploading your file and mapping columns, Twenty validates your data:
+
+1. **Validation runs** — Twenty checks each row for errors
+2. **Errors are highlighted** — problematic rows appear in **yellow**
+3. **You can fix in-place** — edit cells directly in the import UI
+4. **Or remove rows** — skip problematic records entirely
+
+**Fix errors in the UI.** You don't need to go back to your spreadsheet. Edit cells directly during import to save time.
+
+## Step-by-Step Troubleshooting
+
+### Step 1: Identify the Error Type
+
+Click on a highlighted row to see the specific error message. Common error types:
+
+| Error Message | What It Means |
+| --------------------------------------------------------------------- | ------------------------------------------------------------ |
+| Duplicate values highlighted in yellow | Value already exists in Twenty or appears twice in your file |
+| `{field} is not a valid {type}` (hover on yellow cell) | Data doesn't match expected format |
+| Required field highlighted | A required field is empty |
+| `Can't connect to {object}. No unique record found...` (import fails) | Referenced record doesn't exist |
+| `Too many records. Up to 10000 allowed` (upload blocked) | File has more than 10,000 records |
+
+### Step 2: Fix the Error
+
+Follow the specific instructions below for each error type.
+
+---
+
+## Error: Duplicate Value
+
+### What You'll See
+
+Rows with duplicate values are **highlighted in yellow** in the import UI before the import starts.
+
+### What It Means
+
+A unique field (email, domain) either:
+
+* Already exists in Twenty
+* Appears twice in your file
+
+### How to Fix
+
+**Option 1: Edit the duplicate value**
+
+1. Click the cell with the error
+2. Change to a unique value
+3. Continue with import
+
+**Option 2: Remove the duplicate row**
+
+1. Click the X next to the row
+2. The row will be skipped during import
+
+**Option 3: Let Twenty update the existing record**
+
+1. Ensure your file includes a unique identifier (`email`, `domain`, or `id`)
+2. Map the unique identifier field
+3. Twenty will update the existing record instead of creating a duplicate
+
+
+ **You can update unique fields too.**
+
+ * If you keep the `id` but change the `email` → the email will be updated
+ * If you keep the `email` but change the `id` → the id will be updated
+
+ As long as one unique identifier matches, Twenty updates the record.
+
+
+### How to Prevent This Error
+
+Before importing:
+
+1. Sort your spreadsheet by the unique field
+2. Remove duplicate rows
+3. Check if records already exist in Twenty
+
+
+ **Soft-deleted records count toward uniqueness.**
+
+ Check Command Menu → See deleted records. Records there still enforce uniqueness. Permanently delete them or restore and update.
+
+
+For more details: [Uniqueness Constraints](/l/pt/user-guide/data-migration/capabilities/uniqueness-constraints)
+
+---
+
+## Error: Invalid Format
+
+### What You'll See
+
+The cell value is highlighted in yellow. Hover over it to see the error message:
+
+```
+{field name} is not a valid {field type}
+```
+
+### What It Means
+
+The data doesn't match the expected format for that field type.
+
+### How to Fix — By Field Type
+
+#### Email
+
+**Problem:** Invalid email format
+**Solution:** Use format `name@domain.com`
+
+```
+❌ john.smith@
+❌ john smith@acme.com
+✓ john.smith@acme.com
+```
+
+#### Domain
+
+**Problem:** Inconsistent format may cause duplicates
+**Solution:** Use `https://domain.com` format (recommended)
+
+```
+⚠️ acme.com (valid, but not recommended)
+⚠️ www.acme.com (valid, but not recommended)
+✅ https://acme.com (recommended)
+```
+
+All formats are valid, but `https://domain.com` is recommended because it matches the format used by email/calendar sync. Using other formats may create duplicate companies.
+
+#### Date
+
+**Problem:** Unrecognized date format
+**Solution:** Use consistent format throughout file
+
+```
+✓ 2024-03-15 (YYYY-MM-DD - recommended)
+✓ 03/15/2024 (MM/DD/YYYY)
+✓ 15/03/2024 (DD/MM/YYYY)
+```
+
+#### Phone
+
+**Problem:** Missing required columns
+**Solution:** Include all phone columns
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+#### Boolean
+
+**Problem:** Wrong boolean value
+**Solution:** Use uppercase `TRUE` or `FALSE`
+
+```
+❌ true
+❌ yes
+❌ 1
+✓ TRUE
+✓ FALSE
+```
+
+#### Select / Multi-Select
+
+**Problem:** Value doesn't match existing options
+**Solution:** Use **API names**, not display labels
+
+How to find API names:
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at bottom right)
+4. Use the API name (e.g., `OPTION_1`, not "Option 1")
+
+```
+❌ High Priority
+✓ HIGH_PRIORITY
+```
+
+#### Currency
+
+**Problem:** Missing amount or currency code
+**Solution:** Fill both columns
+
+| Column | Example |
+| --------------------- | --------- |
+| **Amount / Amount** | `1234.56` |
+| **Amount / Currency** | `USD` |
+
+#### Number
+
+**Problem:** Non-numeric characters
+**Solution:** Numbers only, period for decimals
+
+```
+❌ $1,234.56
+❌ 1,234.56
+✓ 1234.56
+```
+
+For complete format reference: [Field Mapping](/l/pt/user-guide/data-migration/capabilities/field-mapping)
+
+---
+
+## Error: Required Field Missing
+
+### What You'll See
+
+The row is highlighted in yellow with the required field cell marked.
+
+### What It Means
+
+A required field is empty for this row.
+
+### How to Fix
+
+**Option 1: Enter a value**
+
+1. Click the empty cell
+2. Enter a value
+3. Continue with import
+
+**Option 2: Remove the row**
+
+1. If you don't have the data, click X to skip the row
+
+### How to Prevent This Error
+
+Before importing, identify required fields:
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Check which fields are marked as required
+
+---
+
+## Error: Relation Not Found
+
+### What You'll See
+
+This error appears **after the import starts** — the import fails with a message like:
+
+```
+Can't connect to company. No unique record found with condition: id = 7776ee49-f608-4a77-8cc8-6fe96ae1e43f
+```
+
+This means there is no Company in Twenty with that specific identifier.
+
+Unlike other errors, this one is not caught during the data review step. The import will start and then fail when it encounters the missing relation.
+
+### What It Means
+
+You're trying to link to a record that doesn't exist in Twenty.
+
+### How to Fix
+
+**Option 1: Import parent records first**
+
+1. Cancel the current import
+2. Import the parent records (e.g., Companies)
+3. Then import the child records (e.g., People)
+
+**Option 2: Fix the reference value**
+
+1. Check the reference value in your file
+2. Ensure it exactly matches an existing record
+3. Verify format: domains should be `https://domain.com`
+
+**Option 3: Remove the relation**
+
+1. Clear the cell to import without the relation
+2. Add the relation manually later
+
+### How to Prevent This Error
+
+1. **Import in the correct order:**
+ * Companies first
+ * People second (with company references)
+ * Opportunities third
+
+2. **Verify reference values:**
+ * Export parent records to get exact identifiers
+ * Use domain format `https://domain.com`
+ * Check for typos and case sensitivity
+
+
+ **Import will fail if a reference is made to a non-existent record.**
+
+ Always import parent objects before child objects.
+
+
+For more details: [Import Relations](/l/pt/user-guide/data-migration/capabilities/import-relations)
+
+---
+
+## Error: File Too Large
+
+### What You'll See
+
+This error appears **when uploading your file** — the upload is blocked entirely:
+
+```
+Too many records. Up to 10000 allowed
+```
+
+You won't be able to proceed to the data review step until you reduce the file size.
+
+### What It Means
+
+Your file has more than 10,000 records.
+
+### How to Fix
+
+**Option 1: Split into multiple files**
+
+1. Divide your data into files of 10,000 records or fewer
+2. Import each file separately
+3. Maintain import order (Companies before People)
+
+**Option 2: Use API import**
+For very large datasets, use the API which has no record limit.
+See: [How to Import Data via API](/l/pt/user-guide/data-migration/how-tos/import-data-via-api)
+
+---
+
+## Error: Field Not Recognized
+
+### What It Means
+
+A column in your file can't be mapped because the field doesn't exist in Twenty.
+
+### How to Fix
+
+1. Go to **Settings → Data Model**
+2. Select the object you're importing
+3. Click **+ Add field**
+4. Create the custom field with the appropriate type
+5. Re-upload your file
+
+The CSV import creates records, not fields. All fields must exist before importing.
+
+---
+
+## Error: User Relation Empty
+
+### What It Means
+
+You're trying to assign a record to a user (Owner, Assignee) but the relation isn't being mapped.
+
+### Common Causes
+
+1. **User hasn't accepted their invitation** — the user doesn't exist in Twenty yet
+2. **Using user ID from old system** — Twenty can't match IDs from another system
+3. **Wrong email format** — the email doesn't match the user's Twenty account
+
+### How to Fix
+
+1. Ensure all users have **accepted their invitation** to your Twenty workspace
+2. Use the user's **email address** (not their name or old system ID)
+3. Use the same email they used to join Twenty
+
+
+ **Users must accept invitations before importing.**
+
+ If a user hasn't accepted their invitation, records referencing them will have empty user relations.
+
+
+---
+
+## Pre-Import Checklist
+
+Avoid errors by checking these before importing:
+
+### File Requirements
+
+File is CSV, XLSX, or XLS format
+File has fewer than 10,000 records
+File uses UTF-8 encoding
+
+### Data Quality
+
+No duplicate emails (for People)
+No duplicate domains (for Companies)
+All dates use consistent format
+All domains use `https://domain.com` format
+
+### Field Formats
+
+Boolean fields use `TRUE` or `FALSE` (uppercase)
+Select fields use API names, not display labels
+Phone fields have all required columns
+Currency fields have both Amount and Currency Code
+
+### Relations
+
+Parent records imported before child records
+Relation columns reference existing records
+Domain format matches Twenty's format exactly
+
+### Data Model
+
+All custom fields exist in Settings → Data Model
+Select options exist before importing
+
+---
+
+## Still Having Issues?
+
+If you've tried the above solutions:
+
+1. **Download the sample file** — see the exact format Twenty expects
+2. **Export existing records** — compare your file to working data
+3. **Test with a small batch** — try 5-10 rows first
+4. **Check the reference articles:**
+ * [Field Mapping](/l/pt/user-guide/data-migration/capabilities/field-mapping)
+ * [Uniqueness Constraints](/l/pt/user-guide/data-migration/capabilities/uniqueness-constraints)
+ * [Import Relations](/l/pt/user-guide/data-migration/capabilities/import-relations)
+ * [Error Handling](/l/pt/user-guide/data-migration/capabilities/error-handling)
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/import-companies-via-csv.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
new file mode 100644
index 0000000000..905525599f
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
@@ -0,0 +1,201 @@
+---
+title: Import Companies via CSV
+description: Complete step-by-step guide to importing companies into Twenty.
+---
+
+## Overview
+
+This guide walks you through importing your companies into Twenty. **Companies should be imported first** because People and Opportunities link to Companies.
+
+## Before You Start
+
+### Prerequisites Checklist
+
+
+ Your file is CSV, XLSX, or XLS format
+
+
+
+ File has fewer than 10,000 records
+
+
+
+ No duplicate domains in your file
+
+
+
+ All custom fields exist in **Settings → Data Model**
+
+
+
+ Need to import more than 10,000 companies? Split into multiple files or use the [API import](/l/pt/user-guide/data-migration/how-tos/import-data-via-api).
+
+
+## Step 1: Prepare Your Company Data
+
+### Required and Recommended Fields
+
+| Field | Required? | Format | Notes |
+| ----------------- | ----------- | -------------------- | ------------------------ |
+| **Name** | Recommended | Text | Company display name |
+| **Domain** | Recommended | `https://domain.com` | Unique identifier |
+| **Address** | Optional | Multiple columns | See below |
+| **Employees** | Optional | Number | Employee count |
+| **Custom fields** | Optional | Varies | Must exist in Data Model |
+
+### Domain Format
+
+
+ **Use the format `https://domain.com` for domains.**
+
+ This matches the format used when Companies are auto-created from email/calendar sync, preventing duplicates later.
+
+
+**Domain columns:**
+
+* **Domain / Domain Label**: `acme.com`
+* **Domain / Domain URL**: `https://acme.com`
+
+### Address Format
+
+Address is a nested field with multiple columns:
+
+```
+Address / Address 1,Address / City,Address / State,Address / Country,Address / Post Code
+123 Main Street,San Francisco,CA,USA,94105
+```
+
+### Sample CSV Structure
+
+```csv
+name,Domain / Domain URL,Domain / Domain Label,Address / City,Address / Country,employees
+Acme Corp,https://acme.com,acme.com,San Francisco,USA,250
+Widget Co,https://widgets.co,widgets.co,New York,USA,50
+```
+
+
+ **Pro tip:** Click **Download sample file** during import to see the exact column names Twenty expects.
+
+
+## Step 2: Access the Import Feature
+
+**Option 1: From the Companies View**
+
+1. Navigate to **Companies** in the left sidebar
+2. Click the **⋮** icon on the top right
+3. Select **Import records**
+
+**Option 2: Using Command Menu**
+
+1. Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+2. Type "import"
+3. Select **Import records**
+4. Choose **Companies**
+
+## Step 3: Upload Your File
+
+1. Click **Select file**
+2. Choose your CSV, XLSX, or XLS file
+3. Wait for Twenty to analyze your file
+
+## Step 4: Map Your Columns
+
+Twenty automatically tries to match your columns to fields. Review and adjust:
+
+1. **Check automatic mappings** — verify they're correct
+2. **Fix incorrect mappings** — click the dropdown to select the right field
+3. **Skip columns** — select **Do not map** for columns you don't want to import
+
+### Important Mapping Rules
+
+* **Domain**: Map to **Domain / Domain URL** (not Domain Label)
+* **Address**: Map each part to its specific column (City, State, etc.)
+* **Select fields**: Values must match existing options (or you'll map them in the next step)
+
+
+
+## Step 5: Map Select Field Values
+
+If you have Select or Multi-Select fields:
+
+1. Twenty shows your values alongside existing options
+2. Match each value in your file to a Twenty option
+3. Or create new options if needed
+
+
+ Select options use **API names**, not display labels. Check **Settings → Data Model** → Enable **Advanced mode** to see API names.
+
+
+## Step 6: Review and Fix Errors
+
+Before completing the import, Twenty validates your data:
+
+1. Click **Next Steps**
+2. Rows with errors are highlighted in **yellow**
+3. **Fix errors directly** — click a cell and edit the value
+4. **Remove problematic rows** — click the X to skip that row
+
+### Common Company Import Errors
+
+| Error | Cause | Solution |
+| -------------------------- | ------------------------------- | ------------------------------------------ |
+| **Duplicate domain** | Domain already exists in Twenty | Remove from file or update existing record |
+| **Invalid domain format** | Wrong format | Use `https://domain.com` |
+| **Missing required field** | Required field is empty | Fill in the value or remove the row |
+
+## Step 7: Complete the Import
+
+1. Review the import summary
+2. Click **Confirm** to import
+3. Wait for the import to complete
+4. Verify by checking a few records
+
+## After Importing Companies
+
+Now you can import records that link to Companies:
+
+1. **[Import People](/l/pt/user-guide/data-migration/how-tos/import-contacts-via-csv)** — link them to Companies using the domain
+2. **Import Opportunities** — link them to Companies
+3. **Verify the import** — spot-check a few records to ensure data is correct
+
+## Updating Existing Companies
+
+To update companies instead of creating new ones:
+
+1. Include the `domain` or `id` column in your file
+2. Twenty matches records by this unique identifier
+3. Existing companies are updated; new ones are created
+
+See [How to Update Existing Records](/l/pt/user-guide/data-migration/how-tos/update-existing-records-via-import) for details.
+
+## FAQ
+
+
+
+ Domain is a unique identifier in Twenty. This prevents duplicate companies and ensures email sync correctly links emails to the right company.
+
+
+
+ You can leave the domain empty. However, we recommend adding domains when possible for better data quality and automatic email linking.
+
+
+
+ Yes! You can import companies first, then import People later and link them using the company domain.
+
+
+
+ If you include a unique identifier (domain or id) that matches an existing company, Twenty updates that company instead of creating a duplicate.
+
+
+
+ Either remove the duplicate from your file, or include the company's `id` to update the existing record instead.
+
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/pt/user-guide/data-migration/how-tos/fix-import-errors)
+* [Field Mapping Reference](/l/pt/user-guide/data-migration/capabilities/field-mapping)
+* [Uniqueness Constraints](/l/pt/user-guide/data-migration/capabilities/uniqueness-constraints)
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
new file mode 100644
index 0000000000..6d71e24786
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
@@ -0,0 +1,242 @@
+---
+title: Import Contacts via CSV
+description: Complete step-by-step guide to importing people/contacts into Twenty.
+---
+
+## Overview
+
+This guide walks you through importing your contacts (People) into Twenty. **Import Companies first** if you want to link People to Companies.
+
+## Before You Start
+
+### Prerequisites Checklist
+
+
+ Your file is CSV, XLSX, or XLS format
+
+
+
+ File has fewer than 10,000 records
+
+
+
+ No duplicate email addresses in your file
+
+
+
+ **Companies imported first** (if linking People to Companies)
+
+
+
+ All custom fields exist in **Settings → Data Model**
+
+
+
+ **Import Companies Before People**
+
+ If you want to link People to Companies, import Companies first. The Company must exist before you can reference it.
+
+
+## Step 1: Prepare Your Contact Data
+
+### Required and Recommended Fields
+
+| Field | Required? | Format | Notes |
+| ----------------- | ----------- | ----------------- | ------------------------- |
+| **Email** | Recommended | `name@domain.com` | Must be unique |
+| **First Name** | Recommended | Text | |
+| **Last Name** | Recommended | Text | |
+| **Company** | Optional | Domain or ID | Links to existing Company |
+| **Phone** | Optional | Multiple columns | See below |
+| **Job Title** | Optional | Text | |
+| **Custom fields** | Optional | Varies | Must exist in Data Model |
+
+### Email Format
+
+* Must be valid email format: `name@domain.com`
+* **Must be unique** — no duplicates in your file or in Twenty
+* For additional emails, use the **Emails / Additional Emails** column:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Phone Format
+
+Phone is a **nested field** requiring multiple columns:
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+### Linking to Companies
+
+Add a column with the Company's unique identifier:
+
+| Column Name | Format | Example |
+| --------------- | ---------- | -------------------------------------- |
+| `companyDomain` | URL format | `https://acme.com` |
+| `companyId` | UUID | `c776ee49-f608-4a77-8cc8-6fe96ae1e43f` |
+
+
+ **Use Domain URL format** (`https://acme.com`), not the label. This matches how Companies are stored in Twenty.
+
+
+### Sample CSV Structure
+
+```csv
+firstName,lastName,email,jobTitle,companyDomain,Phones / Primary Phone Number,Phones / Primary Phone Country Code
+John,Smith,john@acme.com,CEO,https://acme.com,4159095555,US
+Jane,Doe,jane@widgets.co,CTO,https://widgets.co,2125551234,US
+```
+
+
+ **Pro tip:** Click **Download sample file** during import or export a few existing People to see the exact column names Twenty expects.
+
+
+## Step 2: Access the Import Feature
+
+**Option 1: From the People View**
+
+1. Navigate to **People** in the left sidebar
+2. Click the **⋮** icon on the top right
+3. Select **Import records**
+
+**Option 2: Using Command Menu**
+
+1. Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+2. Type "import"
+3. Select **Import records**
+4. Choose **People**
+
+## Step 3: Upload Your File
+
+1. Click **Select file**
+2. Choose your CSV, XLSX, or XLS file
+3. Wait for Twenty to analyze your file
+
+## Step 4: Map Your Columns
+
+Twenty automatically tries to match your columns to fields. Review and adjust:
+
+1. **Check automatic mappings** — verify they're correct
+2. **Fix incorrect mappings** — click the dropdown to select the right field
+3. **Skip columns** — select **Do not map** for columns you don't want to import
+
+### Important Mapping Rules
+
+| Column Type | Map To | Notes |
+| ----------------- | ------------------------------ | ---------------------------------- |
+| Company reference | **Company** relation field | Use domain OR id, not both |
+| Email | **Email** | Primary email address |
+| Additional emails | **Emails / Additional Emails** | Array format |
+| Phone | Separate columns | Number, Country Code, Calling Code |
+
+
+
+### Mapping the Company Relation
+
+When mapping the company column:
+
+1. Find your company reference column (e.g., `companyDomain`)
+2. Map it to the **Company** relation field
+3. Twenty will link each Person to the matching Company
+
+
+ **Map only ONE unique identifier for relations.**
+
+ Don't map both `companyId` AND `companyDomain`. Choose one—preferably domain since it's human-readable.
+
+
+## Step 5: Map Select Field Values
+
+If you have Select or Multi-Select fields (like Lead Source):
+
+1. Twenty shows your values alongside existing options
+2. Match each value in your file to a Twenty option
+3. Or create new options if needed
+
+
+ Select options use **API names**, not display labels. Check **Settings → Data Model** → Enable **Advanced mode** to see API names.
+
+
+## Step 6: Review and Fix Errors
+
+Before completing the import, Twenty validates your data:
+
+1. Click **Next Steps**
+2. Rows with errors are highlighted in **yellow**
+3. **Fix errors directly** — click a cell and edit the value
+4. **Remove problematic rows** — click the X to skip that row
+
+### Common Contact Import Errors
+
+| Error | Cause | Solution |
+| -------------------------- | -------------------------------------- | ------------------------------------------- |
+| **Duplicate email** | Email already exists in Twenty or file | Remove duplicate or update existing record |
+| **Invalid email format** | Email format incorrect | Fix to `name@domain.com` |
+| **Relation not found** | Company doesn't exist | Import Companies first or fix the reference |
+| **Missing required field** | Required field is empty | Fill in the value or remove the row |
+
+## Step 7: Complete the Import
+
+1. Review the import summary
+2. Click **Confirm** to import
+3. Wait for the import to complete
+4. Verify by checking a few records and their Company links
+
+## After Importing Contacts
+
+Your contacts are now in Twenty! Next steps:
+
+1. **Verify Company links** — open a few People records to confirm they're linked to the right Company
+2. **Import Opportunities** — if needed, link them to People and Companies
+3. **Set up email sync** — connect your mailbox to see email history on contact records
+
+## Updating Existing Contacts
+
+To update contacts instead of creating new ones:
+
+1. Include the `email` or `id` column in your file
+2. Twenty matches records by this unique identifier
+3. Existing contacts are updated; new ones are created
+
+See [How to Update Existing Records](/l/pt/user-guide/data-migration/how-tos/update-existing-records-via-import) for details.
+
+## FAQ
+
+
+
+ Email is a unique identifier in Twenty. This prevents duplicate contacts and ensures email sync correctly links emails to the right person.
+
+
+
+ You can leave the email empty. However, we recommend adding emails when possible for better data quality and email sync functionality.
+
+
+
+ Add a column with the Company's domain (e.g., `https://acme.com`) or ID. During mapping, connect this column to the Company relation field.
+
+
+
+ Import Companies first, then import People. The Company must exist before you can reference it.
+
+
+
+ Yes! Create a custom field marked as "unique" in your data model to store the external ID. Note: the field name `id` is reserved for Twenty's internal ID.
+
+
+
+ The Company you're referencing doesn't exist. Either import the Company first, or check that the domain/ID exactly matches an existing Company.
+
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/pt/user-guide/data-migration/how-tos/fix-import-errors)
+* [How to Import Relations](/l/pt/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+* [Field Mapping Reference](/l/pt/user-guide/data-migration/capabilities/field-mapping)
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/import-data-via-api.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/import-data-via-api.mdx
new file mode 100644
index 0000000000..fa4080ee0a
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/import-data-via-api.mdx
@@ -0,0 +1,176 @@
+---
+title: Import Data via API
+description: When and how to use Twenty's APIs for large-scale data imports.
+---
+
+## Overview
+
+Twenty provides both **GraphQL** and **REST APIs** for programmatic data import. Use the API when CSV import isn't practical for your data volume or when you need automated, recurring imports.
+
+## When to Use API Import
+
+| Scenario | Recommended Method |
+| ---------------------------------- | ----------------------------- |
+| Under 10,000 records | CSV Import |
+| 10,000 - 50,000 records | CSV Import (split into files) |
+| **50,000+ records** | **API Import** |
+| One-time migration | Either (based on volume) |
+| **Recurring imports** | **API Import** |
+| **Real-time sync** | **API Import** |
+| **Integration with other systems** | **API Import** |
+
+For datasets in the hundreds of thousands, the API is significantly faster and more reliable than multiple CSV imports.
+
+## API Rate Limits
+
+Twenty enforces rate limits to ensure system stability:
+
+| Limit | Value |
+| -------------------------- | --------------------- |
+| **Requests per minute** | 100 |
+| **Records per batch call** | 60 |
+| **Maximum throughput** | ~6,000 records/minute |
+
+
+ **Plan your import around these limits.**
+
+ For 100,000 records at maximum throughput, expect approximately 17 minutes of import time. Add buffer time for error handling and retries.
+
+
+## Getting Started
+
+### Step 1: Get Your API Key
+
+1. Go to **Settings → Developers**
+2. Click **+ Create API key**
+3. Give your key a descriptive name
+4. Copy the API key immediately (it won't be shown again)
+5. Store it securely
+
+
+ **Keep your API key secret.**
+
+ Anyone with your API key can access and modify your workspace data. Never commit it to code repositories or share it publicly.
+
+
+### Step 2: Choose Your API
+
+Twenty supports two API types:
+
+| API | Best For | Documentation |
+| ----------- | ----------------------------------------------------------- | ------------------------------------------------ |
+| **GraphQL** | Flexible queries, fetching related data, complex operations | [API Docs](/l/pt/developers/extend/capabilities/apis) |
+| **REST** | Simple CRUD operations, familiar REST patterns | [API Docs](/l/pt/developers/extend/capabilities/apis) |
+
+Both APIs support:
+
+* Creating, reading, updating, and deleting records
+* **Batch operations** — create or update up to 60 records per call
+
+**For imports, use batch operations** to maximize throughput within rate limits.
+
+### Step 3: Plan Your Import Order
+
+Just like CSV imports, **order matters** for relations:
+
+1. **Companies** first (no dependencies)
+2. **People** second (can link to Companies)
+3. **Opportunities** third (can link to Companies and People)
+4. **Tasks/Notes** (can link to any of the above)
+5. **Custom objects** (following their dependencies)
+
+## Best Practices
+
+### Batch Your Requests
+
+* Don't send records one at a time
+* Group up to **60 records per API call**
+* This maximizes throughput within rate limits
+
+### Handle Rate Limits
+
+* Implement delays between requests (600ms minimum for sustained imports)
+* Use exponential backoff when you hit limits
+* Monitor for 429 (Too Many Requests) responses
+
+### Validate Data First
+
+* Clean and validate your data before importing
+* Check required fields are populated
+* Verify formats match Twenty's requirements (see [Field Mapping](/l/pt/user-guide/data-migration/capabilities/field-mapping))
+
+### Log Everything
+
+* Log every record imported (including IDs)
+* Log errors with full context
+* This helps debug issues and verify completion
+
+### Test First
+
+* Test with a small batch (10-20 records)
+* Verify data appears correctly in Twenty
+* Then run the full import
+
+### Upsert to Avoid Duplicates
+
+The GraphQL API supports **batch upsert** — update if the record exists, create if not. This prevents duplicates when re-running imports.
+
+## Finding Object and Field Names
+
+To see available objects and fields:
+
+1. Go to **Settings → API and Webhooks**
+2. Browse the **Metadata API**
+3. View all standard and custom objects with their fields
+
+The documentation shows all standard and custom objects, their fields, and the expected data types.
+
+## Professional Services
+
+For complex API migrations, our partners can help:
+
+| Service | What's Included |
+| ----------------------- | ---------------------------------- |
+| **Data Model Design** | design your optimal data structure |
+| **Migration Scripts** | write and run the import scripts |
+| **Data Transformation** | handle complex mapping and cleanup |
+| **Validation & QA** | verify the migration is complete |
+
+**Best for:**
+
+* Migrations of 100,000+ records
+* Complex data transformations
+* Tight timelines
+* Teams without developer resources
+
+Contact us at [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/pt/user-guide/getting-started/capabilities/implementation-services).
+
+## FAQ
+
+
+
+ GraphQL lets you request exactly the data you need in a single query and is better for complex operations. REST uses standard HTTP methods (GET, POST, PUT, DELETE) and may be more familiar if you've worked with traditional APIs.
+
+
+
+ Yes! Use update mutations (GraphQL) or PUT/PATCH requests (REST) with the record's `id`.
+
+
+
+ Query for existing records first using unique identifiers (email, domain). Update if exists, create if not.
+
+
+
+ Yes, use delete mutations (GraphQL) or DELETE requests (REST).
+
+
+
+ Not currently, but both APIs work with any HTTP client in any language.
+
+
+
+## API Documentation
+
+For full implementation details, code examples, and schema reference:
+
+* [API Documentation](/l/pt/developers/extend/capabilities/apis)
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx
new file mode 100644
index 0000000000..c7528e6690
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx
@@ -0,0 +1,228 @@
+---
+title: Import Relations Between Objects via CSV
+description: Complete step-by-step guide to linking records during CSV import.
+---
+
+## Overview
+
+This guide walks you through importing relations between objects—for example, linking People to Companies, or Opportunities to People.
+
+**What can be imported:** Only one-to-many relations pointing to a single object type. Relations pointing to multiple object types (like Notes linking to People AND Companies) are not yet supported for import.
+
+## Understanding Relations
+
+### What is a "One-to-Many" Relation?
+
+In a one-to-many relation:
+
+* **One** Company has **many** People (employees)
+* **One** Company has **many** Opportunities
+* **One** Person has **many** Tasks
+
+The "one" side is the **parent**. The "many" side is the **child**.
+
+### Common Relations in Twenty
+
+| Relation | "One" Side (Parent) | "Many" Side (Child) |
+| ------------------------- | ------------------- | ------------------- |
+| Companies → People | Company | People |
+| Companies → Opportunities | Company | Opportunities |
+| People → Tasks | Person | Tasks |
+| People → Notes | Person | Notes |
+
+## Step 1: Identify the "One" and "Many" Sides
+
+Before importing, determine which object is the parent and which is the child.
+
+**Ask yourself:** "Does ONE [Object A] have MANY [Object B]?"
+
+* One Company → Many People ✓ (Company is parent)
+* One Person → Many Companies ✗ (This is wrong—a person belongs to one company)
+
+## Step 2: Import the Parent Records First
+
+The parent ("one" side) must exist in Twenty before you can reference it.
+
+**Import order:**
+
+1. **Companies** first (no dependencies)
+2. **People** second (link to Companies)
+3. **Opportunities** third (link to Companies and/or People)
+4. **Tasks/Notes** (link to any of the above)
+
+
+ **If the parent record doesn't exist, the import will fail.**
+
+ Always verify that Companies are imported before importing People with company references.
+
+
+## Step 3: Note the Parent's Unique Identifier
+
+You need to reference the parent record using a **unique identifier**. Available options:
+
+| Parent Object | Available Unique Identifiers |
+| --------------------- | --------------------------------------------------------------- |
+| **Companies** | `id` (UUID), `domain` (recommended), or any custom unique field |
+| **People** | `id` (UUID), `email`, or any custom unique field |
+| **Workspace Members** | `id` (UUID), `email` (not name) |
+| **Custom Objects** | `id` (UUID), or any field marked as unique |
+
+**Recommended:** Use `domain` for Companies and `email` for People. These are human-readable and easy to verify in your spreadsheet.
+
+### Finding the Identifier
+
+If you need the `id`:
+
+1. Export the parent records from Twenty
+2. The export includes the `id` column
+3. Use these IDs in your child records file
+
+## Step 4: Verify the Relation Field Exists
+
+Before importing, ensure the relation field exists between your objects.
+
+**To check or create:**
+
+1. Go to **Settings → Data Model**
+2. Select your child object (e.g., People)
+3. Look for a relation field pointing to the parent (e.g., Company)
+4. If it doesn't exist, create it:
+ * Click **+ Add field**
+ * Select **Relation** type
+ * Choose the parent object
+
+## Step 5: Prepare Your CSV File
+
+Add a column to your child CSV that references the parent using its unique identifier.
+
+### Example: People Linking to Companies
+
+**Your People CSV:**
+
+```csv
+firstName,lastName,email,jobTitle,companyDomain
+John,Smith,john@acme.com,CEO,https://acme.com
+Jane,Doe,jane@widgets.co,CTO,https://widgets.co
+Bob,Johnson,bob@techstart.io,Developer,https://techstart.io
+```
+
+The `companyDomain` column references the Company's domain.
+
+### Format Requirements
+
+| Identifier | Format | Example |
+| ---------- | -------------- | -------------------------------------- |
+| Domain | URL format | `https://acme.com` |
+| Email | Standard email | `john@acme.com` |
+| ID | UUID | `c776ee49-f608-4a77-8cc8-6fe96ae1e43f` |
+
+
+ **Domain format matters!**
+
+ Use `https://domain.com` (not just `domain.com`). This matches how Twenty stores Company domains and prevents matching errors.
+
+
+### Important Rules
+
+1. **Exact match required** — the value must exactly match the parent record
+2. **Map only ONE unique identifier** — don't include both `companyId` AND `companyDomain`
+3. **Case sensitive** — `Acme.com` ≠ `acme.com`
+
+## Step 6: Upload and Map the Relation
+
+1. Navigate to the child object (e.g., People)
+2. Click **⋮** → **Import records**
+3. Upload your CSV file
+4. In the field mapping step:
+ * Find your relation column (e.g., `companyDomain`)
+ * Map it to the **Company** relation field
+5. Complete the remaining mapping
+6. Review errors and confirm
+
+Twenty will automatically link each child record to the matching parent.
+
+## Step 7: Verify the Import
+
+After importing:
+
+1. Open a few child records (e.g., People)
+2. Verify the relation field shows the correct parent (e.g., Company)
+3. Open a parent record and check the related records section
+
+## Common Mistakes to Avoid
+
+| Mistake | Problem | Solution |
+| -------------------------- | -------------------------------------------------- | ------------------------------------------------------- |
+| **Wrong import order** | Importing People before Companies | Always import parents first, then children |
+| **Wrong domain format** | Using `acme.com` instead of `https://acme.com` | Use full URL format with `https://` |
+| **Multiple unique fields** | Mapping both `companyId` AND `companyDomain` | Map only ONE unique identifier |
+| **Missing relation field** | The relation field doesn't exist in the data model | Create it in **Settings → Data Model** before importing |
+| **Non-existent records** | The parent record doesn't exist in Twenty | Import parent records first, or check for typos |
+| **Case mismatch** | `Acme.com` in file but `acme.com` in Twenty | Ensure exact case matching |
+
+## Linking to Workspace Members
+
+When linking to Workspace Members (your team):
+
+* Use their **email address**, not their name
+* Example: `owner@yourcompany.com`, not "John Smith"
+
+```csv
+taskName,assignedTo
+Follow up with client,john@yourcompany.com
+Review proposal,jane@yourcompany.com
+```
+
+## FAQ
+
+
+
+ You have two options:
+
+ 1. Use the Twenty `id` (export parent records to get their IDs)
+ 2. Create a custom unique field in your data model to store an external ID from your previous system
+
+
+
+ Yes! Include the child record's unique identifier (e.g., `email` for People) and the new relation value. The import will update the relation.
+
+
+
+ Many-to-Many relations are not yet supported for import. This is planned for H1 2026.
+
+
+
+ Relations pointing to multiple object types are not yet supported for import/export. This is on our roadmap.
+
+
+
+ The import will show an error for that row. You can either:
+
+ * Import the parent record first, then re-import
+ * Fix the reference value
+ * Remove the row from import
+
+
+
+ Common causes:
+
+ * Wrong format (use `https://domain.com` for domains)
+ * Case mismatch (check exact spelling)
+ * Parent doesn't exist (import parents first)
+ * Mapping multiple identifiers (use only one)
+
+
+
+
+ **Remember: Soft-deleted records count toward uniqueness.**
+
+ If you're getting "not found" errors but the record seems to exist, check Command Menu → See deleted records. The parent may have been soft-deleted.
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/pt/user-guide/data-migration/how-tos/fix-import-errors)
+* [Import Relations Capabilities](/l/pt/user-guide/data-migration/capabilities/import-relations)
+* [Uniqueness Constraints](/l/pt/user-guide/data-migration/capabilities/uniqueness-constraints)
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
new file mode 100644
index 0000000000..6fd05e872b
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
@@ -0,0 +1,293 @@
+---
+title: Migrating from Other CRMs
+description: Step-by-step guide to migrate your data from any CRM to Twenty.
+---
+
+## Overview
+
+This guide walks you through migrating your data from any CRM to Twenty. The process involves auditing your data, preparing your Twenty workspace, exporting from your current system, and importing into Twenty.
+
+Views, workflows, and permissions must be recreated manually after migration. Plan time for this configuration work.
+
+## Step 1: Audit Your Current Data
+
+Migration is an opportunity for a fresh start. Don't bring over clutter.
+
+**What to keep:**
+
+* Active contacts and companies
+* Open opportunities and deals
+* Important notes and activities
+* Custom fields you actually use
+
+**What to leave behind:**
+
+* Outdated contacts (no activity in 2+ years)
+* Duplicate records
+* Test data
+* Unused custom fields
+
+## Step 2: Map Your Data Model
+
+Create a mapping document between your current CRM and Twenty:
+
+| Your CRM | Twenty |
+| ---------------------- | -------------------- |
+| Account / Organization | **Company** |
+| Contact / Person | **People** |
+| Deal / Opportunity | **Opportunity** |
+| Activity | **Task** or **Note** |
+| Custom Object | **Custom Object** |
+
+**For each field, document:**
+
+* The source field name
+* The target Twenty field
+* Any format transformations needed (dates, phone numbers, etc.)
+
+Keep this mapping document handy during import—you'll reference it when mapping columns.
+
+## Step 3: Set Up Your Twenty Workspace
+
+Before importing data, prepare your Twenty workspace:
+
+### Create Custom Objects and Fields
+
+1. Go to **Settings → Data Model**
+2. Create any custom objects you need
+3. Add custom fields to standard and custom objects
+4. Configure field settings (unique, required, select options, etc.)
+
+
+ **Fields must exist before import.**
+
+ The CSV import creates records, not fields. Create all custom fields in Settings → Data Model before importing.
+
+
+### Invite Your Team
+
+
+ **Invite users BEFORE importing data.**
+
+ If your data includes user references (Account Owner, Assignee, etc.), those users must exist in Twenty before import. Otherwise, those relations cannot be mapped.
+
+
+1. Go to **Settings → Members**
+2. Invite all team members
+3. **Wait for everyone to accept** their invitation
+4. Verify all users appear in your Members list
+
+## Step 4: Export from Your Current CRM
+
+Export your data from your current CRM:
+
+1. Look for an **Export** function (usually under Settings, Data Management, or Admin)
+2. Export to **CSV format** when possible
+3. Export each object type separately (Companies, Contacts, Deals, etc.)
+4. Include all fields you want to migrate
+
+**Export these objects (in this order for reference):**
+
+1. Companies / Accounts / Organizations
+2. Contacts / People
+3. Deals / Opportunities
+4. Notes and Activities
+5. Custom objects
+
+## Step 5: Clean and Format Your Data
+
+Open each exported CSV in a spreadsheet application and prepare it for Twenty.
+
+### Remove Duplicates
+
+1. Sort by the unique field (email for People, domain for Companies)
+2. Remove or merge duplicate rows
+3. Verify no duplicates exist in Twenty already
+
+### Format Fields Correctly
+
+| Field Type | Required Format |
+| ----------------- | ------------------------------------------------- |
+| **Domain** | `https://domain.com` |
+| **Email** | `name@domain.com` (must be unique) |
+| **Date** | `YYYY-MM-DD` |
+| **Phone** | Three columns: Number, Country Code, Calling Code |
+| **Boolean** | `TRUE` or `FALSE` (uppercase) |
+| **Select fields** | Use API names, not display labels |
+
+
+ **Domain format is critical.**
+
+ Use `https://domain.com` (not `domain.com` or `www.domain.com`). This matches Twenty's format and prevents duplicates when you connect email/calendar sync.
+
+
+See [How to Prepare Your CSV Files](/l/pt/user-guide/data-migration/how-tos/prepare-your-csv-files) for complete formatting requirements for all field types.
+
+### Add Relation Columns
+
+To link records (e.g., People to Companies), add a column with the parent's unique identifier.
+
+**Example: People CSV with Company link**
+
+```csv
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+See [How to Import Relations](/l/pt/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for detailed instructions on linking records.
+
+### Update User References
+
+If your data includes user assignments (Owner, Assignee):
+
+1. Add a column with the **user's email** (not just their ID from the old system)
+2. Use the same email addresses that users used to join your Twenty workspace
+
+See [How to Prepare Your CSV Files](/l/pt/user-guide/data-migration/how-tos/prepare-your-csv-files) for complete formatting guide.
+
+## Step 6: Import to Twenty
+
+
+ **Import Order Matters!**
+
+ Always import in this order:
+
+ 1. **Companies** first (no dependencies)
+ 2. **People** second (link to Companies)
+ 3. **Opportunities** third (link to Companies/People)
+ 4. **Notes and Tasks** (link to records)
+ 5. **Custom objects** following their dependencies
+
+ The parent record must exist before you can reference it.
+
+
+### Import Each Object
+
+For each CSV file, in order:
+
+1. Navigate to the object in Twenty
+2. Click **⋮ → Import records**
+3. Upload the CSV file
+4. Map columns to fields:
+ * Map user email columns to the appropriate relation fields
+ * Map relation columns (like `companyDomain`) to relation fields
+5. Review and fix any errors in the UI
+6. Confirm the import
+7. Verify a few records before proceeding to the next file
+
+**Detailed guides:**
+
+* [How to Import Companies](/l/pt/user-guide/data-migration/how-tos/import-companies-via-csv)
+* [How to Import Contacts](/l/pt/user-guide/data-migration/how-tos/import-contacts-via-csv)
+* [How to Import Relations](/l/pt/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+
+## Step 7: Large Migrations (50,000+ Records)
+
+For large migrations:
+
+| Volume | Recommended Approach |
+| ----------------------- | ----------------------------- |
+| Under 10,000 records | Single CSV import |
+| 10,000 - 50,000 records | Split into multiple CSV files |
+| 50,000+ records | Use the API |
+
+**For API imports:**
+
+* Faster and more reliable for large datasets
+* Supports batch operations (up to 60 records per call)
+* See [How to Import Data via API](/l/pt/user-guide/data-migration/how-tos/import-data-via-api)
+
+## Step 8: Post-Migration Setup
+
+After importing data, complete your workspace configuration:
+
+### Recreate Views
+
+* Set up saved views with filters, sorts, and column configurations
+* Create any kanban or calendar views you need
+
+### Recreate Workflows
+
+* Rebuild your automations in **Settings → Workflows**
+* Start with the most critical workflows
+* Test each one before relying on it
+
+### Configure Roles and Permissions
+
+* Set up roles in **Settings → Roles**
+* Assign users to appropriate roles
+
+### Connect Email and Calendar
+
+* Each user connects their own account in **Settings → Accounts**
+* Twenty will start syncing emails to contact records
+* See [Email & Calendar](/l/pt/user-guide/calendar-emails/overview)
+
+### Train Your Team
+
+* Walk through the new interface together
+* Document any team-specific processes
+
+## Common Issues and Solutions
+
+| Issue | Cause | Solution |
+| ----------------------- | --------------------------- | ------------------------------------------------------------------------------------ |
+| **Duplicate errors** | Email/domain already exists | Remove duplicates from file, or include unique identifier to update existing records |
+| **Relation not found** | Parent record doesn't exist | Import parent objects first (Companies before People) |
+| **Missing fields** | Custom field doesn't exist | Create field in Settings → Data Model before importing |
+| **Select field errors** | Using display labels | Use API names (enable Advanced mode in Settings to find them) |
+| **User relation empty** | User hasn't accepted invite | Ensure all users accept invitations before importing |
+
+See [How to Fix Import Errors](/l/pt/user-guide/data-migration/how-tos/fix-import-errors) for detailed troubleshooting steps.
+
+## Post-Migration Checklist
+
+### Data Integrity
+
+All records imported (compare counts with source system)
+Relations working correctly (People linked to Companies)
+User assignments mapped correctly (Owner, Assignee)
+Custom fields populated
+No unexpected duplicates
+
+### Configuration
+
+Views recreated
+Workflows recreated and tested
+Roles and permissions configured
+Email/calendar sync connected
+
+### Team Readiness
+
+Team trained on new system
+Old CRM access plan decided (keep for reference? When to disable?)
+
+## FAQ
+
+
+
+ Not currently. Workflows must be recreated manually in Twenty.
+
+
+
+ File attachments are not included in CSV exports. You'll need to re-upload them manually, migrate via API, or contact our team for assistance.
+
+
+
+ Yes, we recommend keeping your old CRM running until you've verified the migration is complete. Just be careful not to create new data in both places.
+
+
+
+ Depends on data volume and complexity. Small migrations (under 10,000 records) can be done in a few hours. Large migrations may take several days including data cleanup and testing.
+
+
+
+## Need Help?
+
+For complex migrations or large datasets:
+
+* **Guided setup:** Book a 4-hour onboarding pack
+* **Full migration service:** Our partners can handle the entire migration
+
+Contact [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/pt/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx
new file mode 100644
index 0000000000..8fa4f6a543
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx
@@ -0,0 +1,171 @@
+---
+title: Migrating from Self-Hosted to Cloud
+description: Step-by-step guide to migrate your Twenty self-hosted instance to Twenty Cloud.
+---
+
+## Overview
+
+This guide walks you through migrating your data from a Twenty self-hosted instance to Twenty Cloud. The process involves setting up your cloud workspace, exporting your data, and re-importing it.
+
+Views, workflows, and roles must be recreated manually after migration. Plan time for this configuration work.
+
+## Step 1: Create Your Cloud Workspace
+
+1. Go to [app.twenty.com](https://app.twenty.com) and create a new workspace
+2. Complete the initial setup wizard
+3. Note your new workspace URL
+
+## Step 2: Recreate Your Data Model
+
+Before importing data, recreate your custom objects and fields:
+
+1. Go to **Settings → Data Model** in your cloud instance
+2. Create custom objects that match your self-hosted setup
+3. Add custom fields to standard and custom objects
+4. Configure field settings (unique, required, etc.)
+
+Take screenshots of your self-hosted data model for reference, or keep both instances open side by side.
+
+## Step 3: Invite All Users
+
+
+ **Critical: Invite users BEFORE importing data.**
+
+ Users must accept their invitations before you import any records that reference them (like Account Owner fields). If users don't exist yet, those relations cannot be mapped.
+
+
+1. Go to **Settings → Members** in your cloud instance
+2. Invite all team members who had accounts on self-hosted
+3. **Wait for everyone to accept** their invitation
+4. Verify all users appear in your Members list
+
+## Step 4: Export Data from Self-Hosted
+
+Export each object from your self-hosted instance:
+
+1. Navigate to each object (Companies, People, Opportunities, etc.)
+2. Configure the view to show **all columns** you want to migrate
+3. Click **⋮ → Export view**
+4. Save each CSV file with a clear name (e.g., `companies-export.csv`)
+
+**Export in this order** (for reference when importing):
+
+1. Companies
+2. People
+3. Opportunities
+4. Custom objects (following their dependencies)
+5. Tasks, Notes
+
+## Step 5: Update Workspace Member References
+
+The exported CSVs contain user IDs from your self-hosted instance. These IDs won't match your cloud instance, so you need to replace them with emails.
+
+**For each CSV file with user references (Owner, Assignee, etc.):**
+
+1. Open the CSV in a spreadsheet application
+2. Add a new column next to each user ID column (e.g., `accountOwnerEmail` next to `accountOwnerId`)
+3. Fill in the **email address** of each user
+4. You can delete the old ID column or leave it (it will be skipped during import)
+
+**Example:**
+
+Before:
+
+```csv
+name,domain,accountOwnerId
+Acme Corp,https://acme.com,old-uuid-123
+```
+
+After:
+
+```csv
+name,domain,accountOwnerEmail
+Acme Corp,https://acme.com,john@yourcompany.com
+```
+
+Use the same email addresses that users used to accept their cloud workspace invitation.
+
+## Step 6: Plan Your Import Order
+
+Import files in the correct order to maintain relationships:
+
+1. **Companies** first (no dependencies)
+2. **People** second (link to Companies)
+3. **Opportunities** third (link to Companies and People)
+4. **Custom objects** (following their dependencies)
+5. **Tasks and Notes** last (link to other records)
+
+See [How to Import Relations](/l/pt/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for details on maintaining relationships.
+
+## Step 7: Import to Cloud
+
+For each CSV file, in order:
+
+1. Navigate to the object in your cloud instance
+2. Click **⋮ → Import records**
+3. Upload the CSV file
+4. Map columns to fields:
+ * Map user email columns to the appropriate relation fields
+ * Map other columns as usual
+5. Review and fix any errors
+6. Confirm the import
+7. Verify a few records before proceeding to the next file
+
+## Step 8: Recreate Configuration
+
+After importing data, manually recreate:
+
+### Views
+
+* Recreate saved views with filters, sorts, and column configurations
+* Set up any kanban or calendar views
+
+### Workflows
+
+* Recreate automations in **Settings → Workflows**
+* Test each workflow before relying on it
+
+### Roles and Permissions
+
+* Configure roles in **Settings → Roles**
+* Assign users to appropriate roles
+
+### Integrations
+
+* Reconnect email and calendar sync for each user
+* Reconfigure any API integrations with new API keys
+
+## Post-Migration Checklist
+
+All data imported successfully
+Relations between objects working correctly
+User assignments (Owner, Assignee) mapped correctly
+Views recreated
+Workflows recreated and tested
+Roles and permissions configured
+Email/calendar sync reconnected
+API integrations updated with new keys
+
+## FAQ
+
+
+
+ Not currently. Workflows must be recreated manually in your cloud instance.
+
+
+
+ File attachments are not included in CSV exports. You'll need to re-upload any attachments manually, migrate them via API or contact our team for assistance with large migrations.
+
+
+
+ Yes, we recommend keeping your self-hosted instance running until you've verified the cloud migration is complete. Just be careful not to create new data in both places.
+
+
+
+ Records referencing that user will fail to import or the relation will be empty. Ensure all users accept invitations before importing data.
+
+
+
+## Need Help?
+
+For complex migrations or large datasets, contact us at [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/pt/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
new file mode 100644
index 0000000000..f78e214d99
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
@@ -0,0 +1,270 @@
+---
+title: Prepare Your CSV Files
+description: Complete step-by-step guide to format your data for import into Twenty.
+---
+
+## Overview
+
+This guide walks you through preparing your CSV file for a successful import. Follow these steps in order to avoid errors.
+
+## Step 1: Check File Requirements
+
+Before you start, ensure your file meets these requirements:
+
+| Requirement | Details |
+| -------------- | ------------------------ |
+| **Format** | CSV, XLSX, or XLS |
+| **Size limit** | 10,000 records per file |
+| **Encoding** | UTF-8 recommended |
+| **Structure** | One object type per file |
+
+For datasets larger than 10,000 records, split into multiple files or use the [API import](/l/pt/user-guide/data-migration/how-tos/import-data-via-api).
+
+## Step 2: Download the Sample File
+
+**This is the most important step.** The sample file shows you the exact column names and format Twenty expects.
+
+1. Go to the object view (People, Companies, etc.)
+2. Click **⋮** → **Import records**
+3. Click **Download sample file**
+4. Use this file as your template
+
+**Pro tip:** Export a few existing records instead. This gives you real examples of how data should be formatted, and the column names will map automatically during import.
+
+## Step 3: Remove Duplicate Values
+
+Twenty enforces uniqueness on certain fields. Duplicates will cause import errors.
+
+| Object | Unique Fields |
+| ------------------ | ----------------------------------------- |
+| **People** | `id`, `email` |
+| **Companies** | `id`, `domain` |
+| **Custom objects** | `id`, plus any field you marked as unique |
+
+**Before importing:**
+
+1. Sort your spreadsheet by the unique field (email or domain)
+2. Remove or merge duplicate rows
+3. Check for duplicates that already exist in Twenty
+
+**Soft-deleted records count toward uniqueness.** Records in Command Menu → See deleted records will cause duplicate errors. Delete them permanently or restore and update them.
+
+## Step 4: Format Each Field Type Correctly
+
+Different field types require specific formats. Here's the complete reference:
+
+### Text Fields
+
+* No special formatting required
+* Leading/trailing spaces are automatically trimmed
+
+### Email Fields
+
+* Must be valid email format: `name@domain.com`
+* Must be unique (no duplicates in file or in Twenty)
+* For additional emails, use this format in the **Emails / Additional Emails** column:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Domain Fields
+
+* **Recommended format**: `https://domain.com`
+* This matches the format used by mailbox/calendar sync (prevents duplicates)
+* Fill both columns:
+ * **Domain / Domain Label**: `domain.com`
+ * **Domain / Domain URL**: `https://domain.com`
+* Must be unique within your file and in Twenty
+
+### Phone Fields
+
+Phone is a **nested field** requiring multiple columns:
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+### Address Fields
+
+Address is a **nested field** with multiple columns (some can be left empty):
+
+* **Address / Address 1**: Street address line 1
+* **Address / Address 2**: Street address line 2 (optional)
+* **Address / City**: City name
+* **Address / State**: State or province
+* **Address / Country**: Country name
+* **Address / Post Code**: Postal/ZIP code
+
+### Date Fields
+
+Use consistent formatting throughout your file:
+
+* `YYYY-MM-DD` (recommended): `2024-03-15`
+* `MM/DD/YYYY`: `03/15/2024`
+* `DD/MM/YYYY`: `15/03/2024`
+* ISO 8601: `2024-03-15T10:30:00Z`
+
+### Number Fields
+
+* Numbers only (no text)
+* Use period for decimals: `1234.56`
+* No thousands separators (not `1,234.56`)
+
+### Currency Fields
+
+Currency is a **nested field** requiring two columns that **both must be filled**:
+
+| Column | Example |
+| --------------------- | --------- |
+| **Amount / Amount** | `1234.56` |
+| **Amount / Currency** | `USD` |
+
+### Boolean Fields
+
+Use uppercase: `TRUE` or `FALSE`
+
+Lowercase `true` or `false` will not work.
+
+### Select Fields
+
+Use the **API name** of the option, not the display label.
+
+**How to find API names:**
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at bottom right)
+4. Copy the API name (e.g., `OPTION_1`, not "Option 1")
+
+New select options are not created automatically. Add them in **Settings → Data Model** before importing.
+
+### Multi-Select Fields
+
+Use API names in array format:
+
+```
+["VALUE1","VALUE2"]
+```
+
+### Array Fields
+
+Use JSON array format:
+
+```
+["value1","value2"]
+```
+
+### Rating Fields
+
+Use the format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, or `RATING_5`
+
+### Links/URL Fields
+
+Fill both columns:
+
+* **Links / Link Label**: `Twenty`
+* **Links / Link URL**: `https://twenty.com`
+
+For secondary links, use the **Links / Secondary Links** column:
+
+```
+[{"url":"https://twenty.com","label":"Twenty"}]
+```
+
+### JSON Fields
+
+Use valid JSON format:
+
+```
+{"key":"value","key2":"value2"}
+```
+
+### ID Fields
+
+* **Optional**: Twenty auto-generates IDs if not provided
+* **Format**: UUID (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`)
+* **Use case**: Include ID to update existing records instead of creating new ones
+
+## Step 5: Add Relation Columns (If Linking Records)
+
+To link records to other objects (e.g., People to Companies), add a column with the unique identifier of the related record.
+
+**Example**: Linking People to Companies
+
+Add a column to your People CSV:
+
+```
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+**Important rules for relations:**
+
+* The parent record must already exist in Twenty
+* Use the **Domain URL** format (`https://domain.com`), not the label
+* Map only ONE unique identifier (don't include both `companyId` AND `companyDomain`)
+* For Workspace Members, use their **email** (not name)
+
+
+ **Import Order Matters!**
+
+ Import the "one" side before the "many" side:
+
+ 1. **Companies** first
+ 2. **People** second (with company reference)
+ 3. **Opportunities** third
+
+ The parent record must exist before you can reference it.
+
+
+See [How to Import Relations](/l/pt/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for detailed instructions.
+
+## Step 6: Ensure Fields Exist in Twenty
+
+The import creates **records**, not **fields**. All fields you want to import must already exist in your data model.
+
+**Before importing:**
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Create any custom fields you need
+4. Note the exact field names (they must match your column headers)
+
+## Step 7: Final Checklist
+
+Before uploading your file, verify:
+
+File is CSV, XLSX, or XLS format
+File has fewer than 10,000 records
+Encoding is UTF-8
+No duplicate emails (for People) or domains (for Companies)
+Dates use consistent format throughout
+Domains use `https://domain.com` format
+Boolean fields use `TRUE` or `FALSE` (uppercase)
+Select fields use API names, not display labels
+All custom fields exist in Settings → Data Model
+Parent records imported before child records
+Relation columns reference existing records
+
+## Common Mistakes to Avoid
+
+| Mistake | Solution |
+| -------------------------------------------- | ------------------------------------- |
+| Using `true` instead of `TRUE` | Boolean values must be uppercase |
+| Using display labels for Select fields | Find and use API names in Settings |
+| Importing People before Companies | Always import parent objects first |
+| Missing currency code for Currency fields | Fill both Amount and Currency columns |
+| Wrong domain format | Use `https://domain.com` consistently |
+| Mapping multiple unique fields for relations | Map only ONE (domain OR id, not both) |
+
+## Next Steps
+
+Your file is ready! Now:
+
+* [Import Companies](/l/pt/user-guide/data-migration/how-tos/import-companies-via-csv) (import these first)
+* [Import Contacts](/l/pt/user-guide/data-migration/how-tos/import-contacts-via-csv)
+* [Fix any import errors](/l/pt/user-guide/data-migration/how-tos/fix-import-errors)
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx
new file mode 100644
index 0000000000..7551649886
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx
@@ -0,0 +1,198 @@
+---
+title: Update Existing Records via Import
+description: Complete step-by-step guide to bulk updating records using CSV import.
+---
+
+## Overview
+
+Need to update many records at once? Instead of editing them one by one, use the CSV import to bulk update existing records.
+
+**Use cases:**
+
+* Update job titles for multiple people
+* Change company information in bulk
+* Add data to new custom fields
+* Correct data errors across many records
+
+## How It Works
+
+When you import a file containing a **unique identifier** that matches an existing record, Twenty updates that record instead of creating a duplicate.
+
+| If unique identifier... | Twenty will... |
+| -------------------------- | ------------------------------------------------ |
+| Matches an existing record | **Update** the existing record |
+| Doesn't match any record | **Create** a new record |
+| Is missing from your file | **Create** a new record (with auto-generated ID) |
+
+
+ **Multi-Select fields are overwritten, not merged.**
+
+ If a record has `Option A` and `Option B` selected, and you import `["Option C"]`, the record will only have `Option C` after import. The import replaces all previous selections—it does not add to them.
+
+ To keep existing values, include them all in your import: `["Option A","Option B","Option C"]`
+
+
+## Step 1: Export Your Current Data
+
+First, export the records you want to update:
+
+1. Navigate to the object (People, Companies, etc.)
+2. **Add the columns you need** — click **Options → Fields** to show the fields you want to update
+3. **Filter if needed** — narrow down to only the records you want to update
+4. Click **⋮** → **Export view**
+5. Save the CSV file
+
+**Why export first?** The exported file has the correct format, includes unique identifiers, and maps automatically during import.
+
+### What Gets Exported
+
+* All visible columns in your current view
+* The record's unique identifiers (`id`, `email`, `domain`)
+* Current field values you can modify
+
+## Step 2: Edit the CSV File
+
+Open the exported file in your spreadsheet application (Excel, Google Sheets, etc.):
+
+1. **Keep the unique identifier column** — don't delete `id`, `email`, or `domain`
+2. **Update the values** in the columns you want to change
+3. **Remove columns you don't need to update** (optional, but cleaner)
+4. **Don't change unique identifier values** — or Twenty will create new records
+
+### Example: Updating Job Titles
+
+**Exported file:**
+
+```csv
+id,email,firstName,lastName,jobTitle
+550e8400-e29b-41d4-a716-446655440001,john@acme.com,John,Smith,Sales Rep
+550e8400-e29b-41d4-a716-446655440002,jane@acme.com,Jane,Doe,Sales Rep
+550e8400-e29b-41d4-a716-446655440003,bob@acme.com,Bob,Johnson,Sales Rep
+```
+
+**After your edits:**
+
+```csv
+id,email,firstName,lastName,jobTitle
+550e8400-e29b-41d4-a716-446655440001,john@acme.com,John,Smith,Account Executive
+550e8400-e29b-41d4-a716-446655440002,jane@acme.com,Jane,Doe,Senior Account Executive
+550e8400-e29b-41d4-a716-446655440003,bob@acme.com,Bob,Johnson,Account Executive
+```
+
+
+ **Don't change the unique identifier values.**
+
+ If you change `john@acme.com` to `john.smith@acme.com`, Twenty will create a new record instead of updating the existing one.
+
+
+## Step 3: Import the Updated File
+
+1. Navigate to the object
+2. Click **⋮** → **Import records**
+3. Upload your edited CSV file
+4. **Ensure the unique identifier is mapped** — verify `email`, `domain`, or `id` is mapped correctly
+5. Review the field mappings
+6. Check for errors
+7. Click **Confirm**
+
+Twenty matches records by the unique identifier and updates them with new values.
+
+## Choosing the Right Unique Identifier
+
+| Object | Recommended | Alternative | Notes |
+| ------------------ | ---------------- | ----------- | ---------------------------- |
+| **People** | `email` | `id` | Email is human-readable |
+| **Companies** | `domain` | `id` | Domain is human-readable |
+| **Custom objects** | Any unique field | `id` | Use your custom unique field |
+
+**Use only ONE unique identifier.** Don't map both `email` AND `id`. This can cause confusion and errors.
+
+### Using Custom Unique Fields
+
+If you have a custom field marked as unique (like an external ID from another system):
+
+1. Include that field in your export and import
+2. Map it during import
+3. Twenty will match on that field
+
+## Step 4: Verify the Updates
+
+After importing:
+
+1. Open a few updated records
+2. Verify the changes were applied
+3. Check that no duplicate records were created
+
+## What About Fields Not in Your File?
+
+**Fields not included in your import file remain unchanged.**
+
+| Your file includes... | Result |
+| ---------------------------- | ------------------------------------------------------ |
+| `email`, `jobTitle` | Only `jobTitle` is updated; other fields stay the same |
+| `email`, `jobTitle`, `phone` | `jobTitle` and `phone` are updated |
+
+This means you only need to include the fields you want to change (plus the unique identifier).
+
+## Combining Updates and New Records
+
+You can update existing records AND create new ones in the same import:
+
+```csv
+email,firstName,lastName,jobTitle
+john@acme.com,John,Smith,Senior Manager ← Updates existing (email matches)
+newperson@acme.com,New,Person,Analyst ← Creates new (email doesn't match)
+```
+
+## Common Mistakes to Avoid
+
+| Mistake | Problem | Result | Solution |
+| ------------------------------ | ------------------------------------------------------- | -------------------------------------- | ----------------------------------------- |
+| **Changing unique identifier** | Changed `john@acme.com` to `john.smith@acme.com` | Creates new record instead of updating | Keep unique identifiers unchanged |
+| **Multiple unique fields** | Mapping both `email` AND `id` | Potential matching conflicts | Map only ONE unique identifier |
+| **No unique identifier** | File only has `firstName`, `lastName`, `jobTitle` | All rows create new records | Always include `email`, `domain`, or `id` |
+| **Case mismatch** | File has `John@acme.com` but Twenty has `john@acme.com` | Creates new record | Export from Twenty to get exact values |
+
+## FAQ
+
+
+
+ Records with unique identifiers that don't match existing records will be created as new records. This lets you update and create in the same import.
+
+
+
+ Yes, leave the cell empty in your CSV. The import will clear that field's value on the existing record.
+
+
+
+ Fields not in your import file remain unchanged on existing records. Only fields you include are updated.
+
+
+
+ Yes! Include the relation's unique identifier (e.g., `companyDomain`) and map it to the relation field. The relation will be updated.
+
+
+
+ During the import review step, Twenty shows you how many records will be updated vs. created based on unique identifier matches.
+
+
+
+ There's no automatic undo. We recommend exporting your data as a backup before making bulk updates.
+
+
+
+## Best Practices
+
+1. **Export first** — always start from an export to ensure correct format
+2. **Backup before updating** — export your data before making bulk changes
+3. **Test with a few records** — try updating 5-10 records first before doing a large batch
+4. **Use human-readable identifiers** — `email` and `domain` are easier to verify than `id`
+5. **Only include necessary columns** — fewer columns means less chance for errors
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/pt/user-guide/data-migration/how-tos/fix-import-errors)
+* [Uniqueness Constraints](/l/pt/user-guide/data-migration/capabilities/uniqueness-constraints)
+* [Field Mapping Reference](/l/pt/user-guide/data-migration/capabilities/field-mapping)
diff --git a/packages/twenty-docs/l/pt/user-guide/data-migration/overview.mdx b/packages/twenty-docs/l/pt/user-guide/data-migration/overview.mdx
new file mode 100644
index 0000000000..18c2899f98
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-migration/overview.mdx
@@ -0,0 +1,89 @@
+---
+title: Data Migration
+description: Import and export your CRM data via CSV files or API.
+image: /images/user-guide/import-export-data/cloud.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+
+
+## Import Methods
+
+Twenty supports two main methods for importing data:
+
+| Method | Best For | Volume Limit |
+| -------------- | ------------------------------------ | ----------------------- |
+| **CSV Import** | Standard migrations, regular updates | 10,000 records per file |
+| **API Import** | Large-scale migrations, automation | Unlimited |
+
+For very large datasets (hundreds of thousands of records), use the API. Our [implementation partners](/l/pt/user-guide/getting-started/capabilities/implementation-services) can help run these scripts if needed.
+
+## CSV Import Basics
+
+You can import data for any object using CSV, XLSX, or XLS files. Each file should contain **only one type of object** (e.g., only People records).
+
+**Fields must exist before import.** Uploading a CSV creates records but does not create fields. If you need custom fields, create them first under **Settings → Data Model**.
+
+### Steps
+
+1. Navigate to the object where you want to import data
+2. Click the **⋮** icon on the top right (this is the Command Menu) and click on **Import records**
+3. Download the template file to ensure your data is in the expected format
+4. Upload your formatted CSV file
+5. Map your columns to Twenty fields
+6. Review errors (highlighted in yellow) and fix them, directly editing in the UI
+7. Confirm the import
+
+### Importing relations between objects
+
+You can import relations between objects using the csv import function. You need to reference the related object using a unique field from this object: the `id`, the `email` for People and Workspace Members, the `domain` for companies, any other field set as unique in the data model for any other object.
+
+**Deleted records count toward uniqueness.** Soft-deleted records (visible under Command Menu → See deleted records) are included in uniqueness checks. If you import a record with the same unique value as a deleted record, the deleted record will be restored.
+
+
+ **Import Order Matters!**
+
+ When importing related objects, upload files in this order:
+
+ 1. **Companies** first (the "one" side of relationships)
+ 2. **People** second (linked to companies via companyId)
+ 3. **Opportunities** third (linked to companies/people)
+ 4. **Custom objects** with relations last
+
+ Why? The "one" side of a one-to-many relationship must exist before you can reference it. For example, the Company record must exist before you import a Person with that company's ID.
+
+
+Please refer to [this article](/l/pt/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for a step-by-step guide on how to proceed.
+
+## Export Data
+
+Export your workspace data for backups, reporting, or migration.
+
+### Steps
+
+1. Navigate to the object you want to export
+2. Configure the view with the columns you need
+3. Click **⋮** → **Export view**
+4. Save the CSV file
+
+**Only visible columns are exported.** The CSV file will only contain the columns displayed in your current view. Add or hide columns before exporting to control what data is included.
+
+**Export limits**: Up to 20,000 records per export.
+
+## Permissions
+
+Data import and export require specific permissions:
+
+* **Import**: Requires "Import CSV" permission
+* **Export**: Requires "Export CSV" permission
+
+Contact your workspace admin if you don't have these permissions.
+
+## Next Steps
+
+* [Prepare your CSV files](/l/pt/user-guide/data-migration/how-tos/prepare-your-csv-files)
+* [Import relations between objects](/l/pt/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+* [Import via API for large datasets](/l/pt/user-guide/data-migration/how-tos/import-data-via-api)
diff --git a/packages/twenty-docs/l/pt/user-guide/data-model/capabilities/fields.mdx b/packages/twenty-docs/l/pt/user-guide/data-model/capabilities/fields.mdx
new file mode 100644
index 0000000000..ef477158c2
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-model/capabilities/fields.mdx
@@ -0,0 +1,122 @@
+---
+title: Fields
+description: Understand the role of fields and how to manage them.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## About Fields
+
+Fields are like columns in a spreadsheet. They store different types of data like text, numbers, or dates. Fields can be standard (built-in) or custom (the ones you create).
+
+### Standard Fields
+
+Standard fields come built-in with Twenty to handle common business needs.
+
+For example, `First Name` and `Last Name` are standard fields in the `People` object. They store text data for individual names.
+
+You cannot delete standard fields, but you can deactivate them if you don't need them.
+
+You can also customize the options of the standard `SELECT` type fields, for example the options for the `Stage` on Opportunities.
+
+
+
+### Custom Fields
+
+Custom fields can be added to any object. You can store text, numbers, dates, dropdown selections, and more. Use custom fields to track information that's specific to your business.
+
+For instance, a custom field for SpaceX could be `Rocket Active Status`, indicating if a rocket is operational.
+
+
+
+## Field Types
+
+Twenty supports various field types:
+
+| Type | Description | Example |
+| ------------ | ----------------------------------------------------------------- | ------------------ |
+| Address | Structured address with street, city, state, country, postal code | Office Address |
+| Array | List of text values | Tags |
+| Boolean | True/false checkbox | Is Active |
+| Currency | Monetary value with currency code | Deal Amount (USD) |
+| Date | Date values | Close Date |
+| Date & Time | Date with time | Meeting Time |
+| Domain | Website domain (used for Companies) | acme.com |
+| Email | Email addresses (with primary + additional) | Contact Email |
+| JSON | Structured JSON data | Custom metadata |
+| Links | URLs with labels (primary + secondary) | Website, LinkedIn |
+| Long Text | Multi-line text | Description, Notes |
+| Multi-Select | Multiple choices from a predefined list | Tags, Categories |
+| Number | Numeric values (integers or decimals) | Quantity, Score |
+| Phone | Phone numbers with country code | Work Phone |
+| Rating | Star rating (1-5) | Priority, Score |
+| Relation | Links to records in other objects | Company → People |
+| Select | Single choice from a predefined list | Stage, Status |
+| Text | Single line of text | Name, Title |
+
+## Create a Custom Field
+
+To add a custom field to any object, follow these steps:
+
+1. Go to `Settings` in the left sidebar.
+2. Go to `Data Model`, then select the object you wish to customize.
+3. Proceed by clicking on `Add Field`.
+4. Choose a field name and type that suits your requirements. Consider adding a field description for better understanding.
+
+Your newly created field is now available within the application's fields. To display it on a specific view, click on the options menu, then select `Fields`.
+
+
+
+**Quick way:** Click the **+** button at the top right of any object table, then select `Customize fields`. This takes you directly to the Data Model settings.
+
+
+
+## Deactivate a Field
+
+You can deactivate a field to hide it from the app without losing your data. Think of it as hiding the field rather than deleting it.
+
+Here's how you can do it:
+
+1. Find the field you want to deactivate in your object settings.
+
+2. Click the three dots `⋮` next to the field to open the menu.
+
+3. Select `Deactivate` from the dropdown.
+
+
+
+What happens when you deactivate a field?
+
+1. **In the app:** The field disappears and you can't add new values to it.
+
+2. **Existing relationships:** If it's a relation field, existing connections stay but you can't create new ones.
+
+3. **API access:** You can still access the field and its data through the API.
+
+You can reactivate Standard and Custom Fields or have the option to permanently delete them.
+
+## Make Fields Unique
+
+Make a field unique to ensure distinct records cannot have the same value. For example, email addresses are unique for each person.
+
+If you get an error when setting uniqueness, check for duplicate values in your data (including deleted records).
+
+## Field Configuration Best Practices
+
+### Naming Conventions and Limitations
+
+* **Singular and plural named must be distinct**: Our GraphQL API needs distinct names for mutations
+* **Protected field names**: some names are reserved for system usage (e.g., `Type`, `Application`)
+
+### Currency and Phone Fields
+
+* **Default currency**: can be configured via the data model
+* **Default country codes**: can be configured for phone fields via the data model
+
+### Select Fields
+
+* **A default option can be selected** for each Select field
+
+### Record Text Fields
+
+* **Each object has one main display field**: This field appears in the leftmost column and represents the record when linked to other objects. It must be a text field. For example, People uses `Name` as the main field, so when you link a person to a company, you'll see their name in the company's view.
diff --git a/packages/twenty-docs/l/pt/user-guide/data-model/capabilities/objects.mdx b/packages/twenty-docs/l/pt/user-guide/data-model/capabilities/objects.mdx
new file mode 100644
index 0000000000..f2f1105277
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-model/capabilities/objects.mdx
@@ -0,0 +1,91 @@
+---
+title: Objects
+description: Learn about standard and custom objects in Twenty.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Standard Objects
+
+Standard objects are predefined entities in your workspace to help you get started. They're part of a shared data model accessible to all users of Twenty. You can use them as-is, customize them or deactivate them.
+
+
+
+### People
+
+The `People` object stores your contacts. It includes contact details and interaction history, so you can see all your customer interactions in one place.
+
+### Company
+
+The `Companies` object stores your business accounts. It includes details like industry, size and location. Companies connect to both `People` and `Opportunities` objects.
+
+### Opportunities
+
+The `Opportunities` object stores deal-related data. It tracks the progression of potential sales, from prospecting to closure, recording stages, deal sizes, associated account, and expected close date. You can view your sales pipeline in a kanban layout.
+
+### Notes
+
+The `Notes` object stores free-form notes that can be attached to People, Companies, Opportunities, and other records. Use notes to capture meeting summaries, important details, or any contextual information.
+
+### Tasks
+
+The `Tasks` object stores to-dos and action items. Tasks can be linked to People, Companies, Opportunities, and other records. Track due dates, assignees, and completion status to stay on top of your follow-ups.
+
+## Custom Objects
+
+Custom objects let you store information that's unique to your organization and that standard objects can't handle. For example, if you're SpaceX, you may want to create a custom object for Rockets and Launches.
+
+
+
+### Creating a New Custom Object
+
+To create a new custom object:
+
+1. Go to Settings in the sidebar on the left.
+2. Under Workspace, go to Data model. Here you'll be able to see an overview of all your existing Standard and Custom objects (both active and disabled).
+
+
+
+3. Click on `+ New object` at the top. Enter the name (both singular and plural), choose an icon, and add a description for your custom object and hit Save (at the top right). Using Listing as an example of custom object, the singular would be "listing" and the plural would be "listings" along with a description like "Listings that hosts created to showcase their property."
+
+4. Your custom object is now created and will appear in your sidebar. You can start adding records to it right away.
+
+## Managing Objects
+
+### Deactivating Objects
+
+If you don't need a standard or custom object:
+
+1. Go to Settings → Data Model
+2. Find the object you want to deactivate
+3. Click the toggle to deactivate it
+4. The object will be hidden from your workspace but data is preserved
+
+### Reactivating Objects
+
+To bring back a deactivated object:
+
+1. Go to Settings → Data Model
+2. Look for deactivated objects (they'll be grayed out)
+3. Click the toggle to reactivate it
+4. The object and all its data will be restored
+
+## Best Practices
+
+### When to Create Custom Objects
+
+* **Unique business entities**: Things specific to your industry or process
+* **Complex relationships**: When you need to track connections between multiple entities
+* **Scalable data**: When you might have many instances of something
+
+### When to Use Fields Instead
+
+* **Simple attributes**: Properties that describe existing objects
+* **Categories or labels**: Ways to classify existing records
+* **Single values**: Information that doesn't need its own lifecycle
+
+### Object Naming
+
+* **Use clear, descriptive names**: Make it obvious what the object represents
+* **Follow conventions**: Use singular for the object name, plural for the collection
+* **Consider your team**: Choose names everyone will understand
diff --git a/packages/twenty-docs/l/pt/user-guide/data-model/capabilities/relation-fields.mdx b/packages/twenty-docs/l/pt/user-guide/data-model/capabilities/relation-fields.mdx
new file mode 100644
index 0000000000..ddcd3c709e
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-model/capabilities/relation-fields.mdx
@@ -0,0 +1,92 @@
+---
+title: Relation Fields
+description: Connect records across different objects using relation fields.
+---
+
+## Types of Relations
+
+### One-to-Many
+
+One record in Object A can be linked to many records in Object B.
+
+**Example:** One Company can have many People (employees).
+
+### Many-to-One
+
+Many records in Object A can be linked to one record in Object B.
+
+**Example:** Many People can belong to one Company.
+
+### Relations to Multiple Object Types
+
+Some objects can link to multiple object types on one side of the relation.
+
+**Example:** A Note can be attached to one Person AND one Company AND one Opportunity simultaneously. The Note is on the "many" side, connecting to multiple "one" sides.
+
+
+
+Similarly, a Project (on the "one" side) could receive links from multiple People, multiple Companies, and multiple Notes.
+
+
+
+
+ **Import/Export limitation**: Relations pointing to multiple object types are not yet supported for CSV import/export. This is on our roadmap.
+
+
+### Many-to-Many
+
+Many records in Object A can be linked to many records in Object B.
+
+**Example:** Many People can be linked to many Projects, and vice versa.
+
+
+ **Many-to-Many is not yet supported.**
+
+ This relation type is planned for H1 2026. As a workaround, create an intermediate "junction" object (e.g., "Project Assignments") that has Many-to-One relations to both objects.
+
+
+## Creating a Relation Field
+
+1. Go to **Settings → Data Model**
+2. Select the object where you want to add the relation
+3. Click **+ Add Field**
+4. Select **Relation** as the field type
+5. Choose the target object(s) to relate to
+6. Configure the relation settings:
+ * **Field name on source object**: The name of the relation field on the object you're editing
+ * **Field name on destination object**: The name of the relation field that will appear on the target object
+ * Relation type (one-to-many, many-to-one)
+7. Click **Save**
+
+## Standard Relations
+
+Twenty comes with pre-built relations between standard objects:
+
+| From Object | To Object | Relation Type |
+| ------------- | --------- | ------------- |
+| People | Companies | Many-to-One |
+| Opportunities | Companies | Many-to-One |
+| Opportunities | People | Many-to-One |
+
+## Best Practices
+
+### Planning Relations
+
+* **Map your data model**: Plan relations before creating them
+* **Consider direction**: Think about which object "owns" the relationship
+* **Avoid circular dependencies**: Keep your data model clean
+
+### Naming Relations
+
+* **Use clear names**: Make it obvious what the relation represents
+* **Be consistent**: Use similar naming patterns across relations
+* **Consider both sides**: Name both sides of the relation appropriately
+
+### Performance
+
+* **Don't over-relate**: Too many relations can slow down your workspace
+
+## Limitations
+
+* **Deleting relations** removes the link but not the related records
+* **Circular relations** should be avoided for data integrity
diff --git a/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/create-custom-fields.mdx b/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/create-custom-fields.mdx
new file mode 100644
index 0000000000..6c21eab51a
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/create-custom-fields.mdx
@@ -0,0 +1,72 @@
+---
+title: Create Custom Fields
+description: Step-by-step guide to adding custom fields to any object.
+---
+
+Custom fields let you capture information specific to your business. Add them to any object—standard or custom.
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Select the object you want to add a field to
+3. Click **+ Add Field**
+4. Choose a **field type** (see [Fields](/l/pt/user-guide/data-model/capabilities/fields) for all types)
+5. Enter the **field name** and optional description
+6. Configure field-specific settings (see below)
+7. Click **Save**
+
+**Quick method:** Click the **+** at the end of column headers in any table view → **Customize fields**.
+
+## Show the Field in Views
+
+New fields aren't automatically visible. To display:
+
+1. Open the object's table view
+2. Click **Options → Fields**
+3. Click the **eye icon** next to your field to show it
+4. Drag to reorder
+
+## Configuration Options
+
+### For Select / Multi-Select
+
+1. Click **+ Add option** to create choices
+2. Set a **default option** if desired
+3. Drag to reorder options
+
+
+ **Use API names for imports.** Enable **Advanced mode** in Settings to see API names. See [Field Mapping](/l/pt/user-guide/data-migration/capabilities/field-mapping).
+
+
+### For Currency Fields
+
+Set the **default currency** (USD, EUR, etc.) for new records.
+
+### For Phone Fields
+
+Set the **default country code** to pre-fill for new phone numbers.
+
+### Making a Field Unique
+
+Toggle **Unique** to prevent duplicate values across records.
+
+
+ If duplicates exist (including in deleted records), you'll get an error. Clean up duplicates first.
+
+
+### Setting Default Values
+
+For Select fields, you can choose which option is pre-selected for new records. For Checkbox fields, set whether it's checked or unchecked by default.
+
+## Deactivating a Field
+
+1. Go to **Settings → Data Model**
+2. Find the field
+3. Click **⋮ → Deactivate**
+
+Data is preserved. You can reactivate or permanently delete later.
+
+## Related
+
+* [Fields](/l/pt/user-guide/data-model/capabilities/fields) — all field types explained
+* [Data Model FAQ](/l/pt/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/create-custom-objects.mdx b/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/create-custom-objects.mdx
new file mode 100644
index 0000000000..58c9fb46f2
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/create-custom-objects.mdx
@@ -0,0 +1,51 @@
+---
+title: Create Custom Objects
+description: Step-by-step guide to creating custom objects in Twenty.
+---
+
+Custom objects let you store information unique to your business that standard objects don't cover. For example: Projects, Products, Tickets, or Listings.
+
+
+ **Not sure if you need an object or a field?** See [Understanding Your Data Model](/l/pt/user-guide/data-model/overview) for guidance.
+
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Click **+ New object**
+3. Fill in:
+ * **Singular name** (e.g., "Listing")
+ * **Plural name** (e.g., "Listings")
+ * **Icon**
+ * **Description** (optional)
+4. Click **Save**
+
+Your object appears in the sidebar immediately.
+
+## Next: Add Fields
+
+New objects start with basic fields. Add custom fields to capture the data you need:
+
+1. In **Settings → Data Model**, select your object
+2. Click **+ Add Field**
+3. Choose a field type, configure, and save
+
+See [How to Create Custom Fields](/l/pt/user-guide/data-model/how-tos/create-custom-fields) for details on field types and configuration.
+
+## Connecting to Other Objects
+
+To link your object to People, Companies, or other objects, create a relation field. See [How to Create Relation Fields](/l/pt/user-guide/data-model/how-tos/create-relation-fields).
+
+## Deactivating an Object
+
+If you no longer need an object:
+
+1. Go to **Settings → Data Model**
+2. Toggle the object off
+
+The object is hidden but data is preserved. You can reactivate or permanently delete later.
+
+## Related
+
+* [Objects](/l/pt/user-guide/data-model/capabilities/objects) — standard vs custom objects
+* [Data Model FAQ](/l/pt/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/create-relation-fields.mdx b/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/create-relation-fields.mdx
new file mode 100644
index 0000000000..db3d83f1ba
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/create-relation-fields.mdx
@@ -0,0 +1,60 @@
+---
+title: Create Relation Fields
+description: Step-by-step guide to connecting objects with relation fields.
+---
+
+Relation fields connect records from different objects—for example, linking People to Companies.
+
+
+ **Relation names cannot be changed after creation** (they affect the API). Plan your names carefully.
+
+
+## Before You Start
+
+Decide:
+
+* Which objects are you connecting? (e.g., People → Companies)
+* Which is the "one" side? (e.g., Company)
+* Which is the "many" side? (e.g., People — many people work at one company)
+* What should the field be named on each side?
+
+See [Relation Fields](/l/pt/user-guide/data-model/capabilities/relation-fields) for relation types explained.
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Select the object where you want the relation (typically the "many" side)
+3. Click **+ Add Field**
+4. Select **Relation** as the field type
+5. Choose the **target object**
+6. Select **One-to-Many** or **Many-to-One**
+7. Enter field names for **both sides** of the relation
+8. Click **Save**
+
+## Example: People → Companies
+
+* Go to **Settings → Data Model → People**
+* Add a Relation field
+* Target: **Companies**
+* Type: **Many-to-One**
+* Field on People: **Company**
+* Field on Companies: **Employees**
+
+Now each Person can be linked to a Company, and each Company shows its People.
+
+## Deleting a Relation
+
+1. Go to **Settings → Data Model**
+2. Find the relation field
+3. Click **⋮ → Deactivate**
+
+Links are preserved but hidden. Reactivate to restore.
+
+
+ **Deleting a relation doesn't delete records.** Only the link between them is removed.
+
+
+## Related
+
+* [Relation Fields](/l/pt/user-guide/data-model/capabilities/relation-fields) — types and limitations
+* [How to Import Relations](/l/pt/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) — bulk import linked records
diff --git a/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/customize-your-data-model.mdx b/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/customize-your-data-model.mdx
index 84ca273d50..1bd6678381 100644
--- a/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/customize-your-data-model.mdx
+++ b/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/customize-your-data-model.mdx
@@ -1,22 +1,22 @@
---
-title: Personalize seu modelo de dados
-description: Visão geral das opções de personalização do modelo de dados.
+title: Customize Your Data Model
+description: Overview of data model customization options.
---
-O modelo de dados da Twenty é totalmente personalizável. Crie objetos, campos e relações para se adequar à sua empresa.
+Twenty's data model is fully customizable. Create objects, fields, and relations to match your business.
-## Links rápidos
+## Quick Links
-| Eu quero... | Guia |
-| ---------------------------- | ----------------------------------------------------------------------------------------- |
-| Criar um novo objeto | [Como criar objetos personalizados](/l/pt/user-guide/data-model/how-tos/create-custom-objects) |
-| Adicionar campos a um objeto | [Como criar campos personalizados](/l/pt/user-guide/data-model/how-tos/create-custom-fields) |
-| Conectar objetos entre si | [Como criar campos de relação](/l/pt/user-guide/data-model/how-tos/create-relation-fields) |
+| I want to... | Guide |
+| ------------------------ | -------------------------------------------------------------------------------------- |
+| Create a new object | [How to Create Custom Objects](/l/pt/user-guide/data-model/how-tos/create-custom-objects) |
+| Add fields to an object | [How to Create Custom Fields](/l/pt/user-guide/data-model/how-tos/create-custom-fields) |
+| Connect objects together | [How to Create Relation Fields](/l/pt/user-guide/data-model/how-tos/create-relation-fields) |
-## Saiba mais
+## Learn More
-* [Compreendendo seu modelo de dados](/l/pt/user-guide/data-model/overview) — conceitos-chave e dicas de planejamento
-* [Objetos](/l/pt/user-guide/data-model/capabilities/objects) — objetos padrão vs. personalizados
-* [Campos](/l/pt/user-guide/data-model/capabilities/fields) — todos os tipos de campo
-* [Campos de relação](/l/pt/user-guide/data-model/capabilities/relation-fields) — conectando objetos
-* [Perguntas frequentes sobre o modelo de dados](/l/pt/user-guide/data-model/how-tos/data-model-faq) — perguntas comuns
+* [Understanding Your Data Model](/l/pt/user-guide/data-model/overview) — key concepts and planning tips
+* [Objects](/l/pt/user-guide/data-model/capabilities/objects) — standard vs custom objects
+* [Fields](/l/pt/user-guide/data-model/capabilities/fields) — all field types
+* [Relation Fields](/l/pt/user-guide/data-model/capabilities/relation-fields) — connecting objects
+* [Data Model FAQ](/l/pt/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/data-model-faq.mdx b/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/data-model-faq.mdx
new file mode 100644
index 0000000000..21fca4d989
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-model/how-tos/data-model-faq.mdx
@@ -0,0 +1,155 @@
+---
+title: Data Model FAQ
+description: Frequently asked questions about Twenty's data model.
+---
+
+## Object Management
+
+
+
+ Yes, custom objects can be deleted. You can also deactivate them first, which hides the object and its data from the interface while preserving the data.
+
+
+
+ No, standard objects cannot be deleted. You can only deactivate them, which hides them from the interface but preserves the data.
+
+
+
+ You can create as many custom objects and fields as you need — the price doesn't change.
+
+
+
+ You can rename the label of standard objects (People, Companies, Opportunities), but not their API names. The API names are fixed for consistency across all Twenty workspaces.
+
+
+
+ Yes, you can change the icon for both standard and custom objects in **Settings → Data Model**.
+
+
+
+ Not yet. Object ordering in the navigation is currently fixed, but this feature is planned for a future release.
+
+
+
+ All active objects appear in the navigation. You can deactivate objects you don't need under **Settings → Data Model**.
+
+
+
+## Field Capabilities
+
+
+
+ No, field types cannot be changed after creation. If you need a different type, create a new field with the correct type, migrate your data, then deactivate the old field.
+
+
+
+ Our GraphQL API uses both forms for different operations:
+
+ * `createPerson` (singular) for single record actions
+ * `createPeople` (plural) for bulk operations
+
+ This creates limitations when singular and plural forms are the same, but it improves the developer experience.
+
+
+
+ Certain field names like `Type` or `Application` are reserved for system use. Choose alternative names like `Category` or `Classification` instead.
+
+
+
+ * The field is hidden from the interface
+ * Existing data is preserved
+ * You can still access the field via API
+ * Existing relations remain but you can't create new ones
+ * You can reactivate the field later
+
+
+
+ Currently, you cannot make custom fields required. All fields accept empty values. You can use workflows to enforce required fields by sending alerts or blocking actions when fields are empty.
+
+
+
+ * **Unique**: No two records can have the same value in this field
+ * **Required**: The field must have a value (not currently supported for custom fields)
+
+
+
+ Formula fields are coming in **Q1 2026**. In the meantime, you can use workflows to calculate and update field values automatically.
+
+
+
+ Nested fields are coming in **Q1 2026**. Currently, you can use workflows to bring field values from related objects. For example, to display a company's industry on a Person record, create a custom field on People and use a workflow to synchronize the value.
+
+
+
+ Field reordering will be available with custom layouts in **Q4 2025**. Currently, fields appear in alphabetical order.
+
+
+
+## Relations
+
+
+
+ Yes! Self-referencing relations are supported and recommended for use cases like account hierarchies. For example, create a relation from Companies to Companies to track parent/child accounts.
+
+
+
+ Many-to-many relationships are coming in **H1 2026**. Currently, create an intermediate object with two one-to-many relationships as a workaround.
+
+ For example, to link People and Projects (many-to-many), create a "Project Assignments" object with:
+
+ * A relation to People (many assignments → one person)
+ * A relation to Projects (many assignments → one project)
+
+
+
+ These allow one object to relate to multiple different object types through a single field. For example, Notes can be attached to People AND Companies AND Opportunities simultaneously.
+
+ Each Note links to one Person, one Company, and one Opportunity at the same time.
+
+ Learn more in [Relation Fields](/l/pt/user-guide/data-model/capabilities/relation-fields).
+
+
+
+ Yes, you can create multiple relations between the same two objects. For example, a Company could have both a "Primary Contact" and "Billing Contact" relation to People.
+
+
+
+ When you delete a record, the relation link is removed from the related records. The related records themselves are not deleted.
+
+
+
+ While technically possible, circular relations (A → B → C → A) should be avoided as they can cause confusion and potential performance issues.
+
+
+
+## Access and Permissions
+
+
+
+ Go to **Settings → Data Model** to view and edit all your objects and fields.
+
+
+
+ Reach out to your workspace administrator. Data model access is usually restricted to administrators only.
+
+
+
+## Data Management
+
+
+
+ There's no hard limit on record counts. However, very large datasets may impact performance in some views. Use filters and views to manage large datasets effectively.
+
+
+
+ Yes, you can import CSV data into any object, including custom objects. The import process supports field mapping for custom fields. See [How to Prepare Your CSV Files](/l/pt/user-guide/data-migration/how-tos/prepare-your-csv-files).
+
+
+
+ Currently, there's no built-in export for data model configuration. Contact support if you need to migrate your data model between workspaces.
+
+
+
+## Need More Help?
+
+Check our [Implementation Services](/l/pt/user-guide/getting-started/capabilities/implementation-services) for help with complex data model design.
diff --git a/packages/twenty-docs/l/pt/user-guide/data-model/overview.mdx b/packages/twenty-docs/l/pt/user-guide/data-model/overview.mdx
new file mode 100644
index 0000000000..28daff8ea2
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/data-model/overview.mdx
@@ -0,0 +1,180 @@
+---
+title: Data Model
+description: Learn what a data model is and how to design one that fits your business.
+image: /images/user-guide/fields/custom_data_model.png
+---
+
+
+
+
+
+## What is a Data Model?
+
+A data model is the structure that defines how information is organized in your CRM. Think of it as the **blueprint** of your customer data — you design it once, then fill it with your actual data.
+
+## Key Concepts
+
+### Objects
+
+**Objects** are the main categories of data in your CRM. Each object represents a type of thing you want to track.
+
+Twenty comes with standard objects:
+
+* **People** — individuals (contacts, leads, partners)
+* **Companies** — organizations
+* **Opportunities** — deals or sales
+* **Notes** — attached notes on records
+* **Tasks** — to-dos linked to records
+
+You can also create **custom objects** for anything specific to your business (e.g., Projects, Subscriptions, Events).
+
+### Fields
+
+**Fields** are the properties or attributes that describe each object. They store the actual information.
+
+For example, the **People** object has fields like:
+
+* Name
+* Email
+* Phone
+* Job Title
+* Company (a relation to the Companies object)
+
+Fields have different **types**: text, number, date, select, multi-select, relation, and more. You can add custom fields to any object.
+
+### Records
+
+**Records** are the individual entries within an object — the actual data you create and manage.
+
+For example:
+
+* "John Smith" is a **record** in the People object
+* "Acme Corp" is a **record** in the Companies object
+
+**An analogy:**
+
+| Data Model Concept | Real-World Analogy |
+| ------------------ | ------------------------------------------ |
+| **Objects** | Sections in a book (the categories) |
+| **Fields** | Columns in a spreadsheet (the properties) |
+| **Records** | Rows in a spreadsheet (the actual entries) |
+
+You design the data model (objects + fields) once, then create many records within that structure.
+
+## Why Customize Your Data Model?
+
+Every business works differently. Customizing your data model means you can shape Twenty around **your** processes instead of forcing yours into a rigid system.
+
+Twenty offers full flexibility:
+
+* Create as many custom objects as you need
+* Add unlimited custom fields
+* The price doesn't change based on customization
+
+## Tips to Design Your Data Model
+
+### 1. Start with Your Core Objects
+
+Identify the main concepts you work with. Twenty already provides:
+
+* **People** — your contacts
+* **Companies** — your accounts
+* **Opportunities** — your deals
+
+Think about what else you might need:
+
+* Stripe would need a `Subscriptions` object
+* Airbnb would need a `Trips` object
+* An accelerator would need a `Batches` object
+
+### 2. Use Fields for Variations, Not New Objects
+
+If something is just a characteristic of an existing object, make it a **field**.
+
+**Use fields for:**
+
+* Categories and labels (e.g., `Industry` for Companies)
+* Status values (e.g., `Stage` for Opportunities)
+* Attributes and properties
+
+### 3. Create an Object When It Stands on Its Own
+
+If the concept has its own lifecycle, properties, or relationships, it deserves an object.
+
+**Create an object for:**
+
+* **Projects** — have deadlines, owners, and tasks
+* **Subscriptions** — connect companies, products, and invoices
+* **Events** — involve attendees and follow-up actions
+
+These go beyond a single field because they carry their own data and relationships.
+
+### 4. Create an Object When Records Are Open-Ended
+
+If something can be linked multiple times and you don't know how many, use an object.
+
+**Bad approach:**
+Creating fields like `Product 1`, `Product 2`, `Product 3`...
+
+**Good approach:**
+Create a `Products` object and relate it to records. This supports one, two, or a hundred products without changing your model.
+
+### 5. Keep It Simple First
+
+Start with fields. Move to new objects only when you feel the limits:
+
+* Too many fields on one object
+* Repeated records that should be separate
+* Relationships that don't fit neatly
+
+## Special Note on People, Companies, and Opportunities
+
+
+ **Email and calendar sync only works with People, Companies, and Opportunities.**
+
+ These are the only objects where you can access synchronized emails and meetings from your mailbox/calendar. We recommend using them as much as possible.
+
+
+**Best practices:**
+
+* If you need categories of People, use fields (not new objects)
+* Example: Use a `Person Type` field with values "Prospect" and "Partner" instead of creating separate objects
+* Create different **views** to filter: one showing partners, another showing prospects
+
+**It's okay to have fields that don't apply to every record.** For example, a `Referral Link` field on People that only applies when `Person Type = Partner`. Hide this field from views where it's not relevant.
+
+## Questions to Guide Your Choice
+
+Ask yourself:
+
+Is this just a property of something I already have, or does it need its own properties?
+Will I ever need to track multiple of these per record, without knowing how many?
+Does this concept connect to several different objects, not just one?
+Will it have its own lifecycle (stages, start/end dates)?
+
+If the answer is "yes" to one or more, it's probably time for a new object.
+
+## Accessing Your Data Model
+
+1. Go to **Settings** in the left sidebar
+2. Click **Data Model**
+3. View all your objects (standard and custom)
+4. Click any object to see and edit its fields
+
+
+ **Don't see Data Model in Settings?**
+
+ Access to the data model is usually restricted to administrators. Contact your workspace admin if you need access.
+
+
+## Next Steps
+
+Once you've planned your data model:
+
+* [How to Create Custom Objects](/l/pt/user-guide/data-model/how-tos/create-custom-objects)
+* [How to Create Custom Fields](/l/pt/user-guide/data-model/how-tos/create-custom-fields)
+* [How to Create Relation Fields](/l/pt/user-guide/data-model/how-tos/create-relation-fields)
+
+## Need Help?
+
+Our team can help you design and create the data model you need. Discover our [Implementation Services](/l/pt/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/pt/user-guide/getting-started/capabilities/glossary.mdx b/packages/twenty-docs/l/pt/user-guide/getting-started/capabilities/glossary.mdx
new file mode 100644
index 0000000000..71ac91622f
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/getting-started/capabilities/glossary.mdx
@@ -0,0 +1,108 @@
+---
+title: Glossary
+description: Get familiar with essential terminology used in Twenty.
+---
+
+## API
+
+API (Application Programming Interface) allows you to connect Twenty with other software systems and build custom integrations.
+
+## Apps
+
+Apps are custom extensions built as code that can define data models and serverless functions. They enable developers to create reusable customizations that can be deployed across multiple workspaces.
+
+## Code Actions
+
+Code Actions are workflow steps that let you write custom JavaScript to transform data, make calculations, or perform complex logic that isn't possible with built-in actions.
+
+## Command Menu
+
+The Command Menu is a quick-access interface (opened with `Cmd + K` on Mac and `Ctrl + K` on Windows) that lets you perform actions, create records, and navigate your workspace efficiently.
+
+## Company & People
+
+The CRM has two fundamental types of records:
+
+* A `Company` represents a business or organization.
+* `People` represent your company's current and prospective customers or clients.
+
+## Custom Fields
+
+Custom Fields are data fields you create to capture information specific to your business needs and processes.
+
+## Data Model
+
+A Data Model is the structure that defines how information is organized in your CRM, including what objects exist, their properties (fields), and how they relate to each other.
+
+## Favorites
+
+Favorites are records you've marked for quick access, appearing in your sidebar for instant navigation to important data.
+
+## Field
+
+A field refers to a specific area where particular data is stored for an entity.
+
+## Integration
+
+Integrations are built-in tools that allow you to link Twenty with other software or systems.
+
+## Iterator
+
+An Iterator is a workflow action that loops through an array of items, executing subsequent actions for each item in the list.
+
+## Kanban
+
+A `Kanban` is a visual way to track your business processes using cards and columns. Each column represents a stage in your process (for example: new, ongoing, won, lost), and you move records through these stages as they progress.
+
+## Object
+
+An Object is a data structure that represents a specific type of entity in your CRM (like People, Companies, or Opportunities). Objects can be standard (built-in) or custom (created by you).
+
+## Opportunities
+
+Opportunities in Twenty CRM are potential deals or sales with accounts or contacts.
+
+## Record
+
+A Record indicates an instance of an object, like a specific account or contact.
+
+## Relation Fields
+
+Relation Fields create connections between different objects, allowing you to link records together (like connecting a Person to a Company).
+
+## Standard Fields
+
+Standard Fields are pre-built data fields that come with objects by default and provide common functionality across all workspaces.
+
+## Tasks
+
+Tasks in Twenty CRM are assigned activities relating to contacts, accounts, or opportunities.
+
+## Triggers
+
+Triggers are the starting point of a workflow — the event or condition that initiates the automation. Examples include record creation, record updates, webhooks, or scheduled times.
+
+## Views
+
+You can customize the display of your records using views, setting different filters, layouts and sorting options for each view.
+
+## Upsert
+
+Upsert is an operation that combines "update" and "insert" — it updates an existing record if a match is found, or creates a new record if no match exists.
+
+## Webhooks
+
+Webhooks are automated messages sent from Twenty to other applications when specific events occur, enabling real-time data synchronization.
+
+## Workflows
+
+Workflows are automated processes that trigger actions based on specific conditions, helping you automate repetitive tasks and business processes.
+
+## Workspace
+
+A `Workspace` typically represents a company using Twenty. It holds all the records and data that you and your team members add to Twenty.
+It has a single domain name, which is typically the domain name your company uses for employee email addresses.
+
+## Workspace Members
+
+Workspace Members are the Twenty users from your team who have access to your workspace. They can be assigned as owners or assignees for records.
diff --git a/packages/twenty-docs/l/pt/user-guide/getting-started/capabilities/implementation-services.mdx b/packages/twenty-docs/l/pt/user-guide/getting-started/capabilities/implementation-services.mdx
new file mode 100644
index 0000000000..706de4d2a0
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/getting-started/capabilities/implementation-services.mdx
@@ -0,0 +1,16 @@
+---
+title: Implementation Services
+description: Whether you need help getting started or creating advanced customizations, we have a solution.
+---
+
+## Onboarding Packs
+
+Get help from our core team to set up your Twenty workspace with our 4-hour Onboarding packs:
+
+* **Data Model Design**: Design and create your custom data model with objects, fields, and relationships
+* **Data Migration**: Migrate your existing data from your current CRM to Twenty
+* **Workflow Creation**: Create custom workflows to support your business processes
+
+## Implementation Partners
+
+Work with certified Twenty partners for more advanced customizations and integrations. Reach out to our team via [contact@twenty.com](mailto:contact@twenty.com) to be matched with our partners.
diff --git a/packages/twenty-docs/l/pt/user-guide/getting-started/capabilities/what-is-twenty.mdx b/packages/twenty-docs/l/pt/user-guide/getting-started/capabilities/what-is-twenty.mdx
new file mode 100644
index 0000000000..519e5a624e
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/getting-started/capabilities/what-is-twenty.mdx
@@ -0,0 +1,42 @@
+---
+title: What is Twenty
+description: Twenty is an open-source CRM that gives you the building blocks to create exactly what your business needs.
+---
+
+## Vision
+
+Creating a good CRM is hard because it's a balancing act.
+For each business, the requirements seem straightforward, yet everyone's needs are distinct.
+The result is a CRM that's either too basic, or one that's attempting to be a jack-of-all-trades but ending up as a master of none.
+
+At first, Twenty looks like most CRMs you already know: you can track deals, organize contacts, manage tasks and notes.
+**But what sets it apart is our approach to extensibility. We are building an open platform that provides the building blocks for you to solve your unique business problems.**
+
+We prioritize universal principles and common patterns over feature lists.
+We don't try to have all the answers and instead empower users to find what works best for them.
+Open-source is the bedrock of our approach, ensuring that Twenty evolves with its community, for its community.
+
+## Benefits
+
+**Customizable:** Designed to fit your business needs.
+
+**Community-driven:** Built and maintained by a large open-source community.
+
+**Cost-effective:** You'll never be vendor-locked, because you can always self-host.
+
+## Main Features
+
+* **Calendar & Emails:** Sync your mailbox and calendar to see all communications on your CRM records. [Learn more](/l/pt/user-guide/calendar-emails/overview).
+* **Data Model:** Create custom objects and fields to match your unique business processes. [Explore](/l/pt/user-guide/data-model/overview).
+* **Data Migration:** Import and export your data via CSV or API. [Get started](/l/pt/user-guide/data-migration/overview).
+* **Views & Pipelines:** Organize your data with table views, kanban boards, and sales pipelines. [Discover](/l/pt/user-guide/views-pipelines/overview).
+* **Workflows:** Automate your business processes and integrate with external tools. [Build automations](/l/pt/user-guide/workflows/overview).
+* **AI:** Enhance your CRM with AI-powered features and agents. [Explore AI](/l/pt/user-guide/ai/overview).
+* **Dashboards:** Track performance with custom reports and visualizations. [View dashboards](/l/pt/user-guide/dashboards/overview).
+* **Permissions & Access:** Control who can view, edit, and manage your data with role-based permissions. [Configure access](/l/pt/user-guide/permissions-access/overview).
+* **Notes & Tasks:** Create notes and tasks linked to your records for better collaboration.
+* **API & Webhooks:** Connect to other apps and build custom integrations. [Start integrating](/l/pt/developers/extend/capabilities/apis).
+
+## Join now
+
+[Register here](https://app.twenty.com) or [become a contributor on GitHub](https://github.com/twentyhq/twenty).
diff --git a/packages/twenty-docs/l/pt/user-guide/getting-started/how-tos/configure-your-workspace.mdx b/packages/twenty-docs/l/pt/user-guide/getting-started/how-tos/configure-your-workspace.mdx
new file mode 100644
index 0000000000..2ba871c337
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/getting-started/how-tos/configure-your-workspace.mdx
@@ -0,0 +1,77 @@
+---
+title: Configure Your Workspace
+description: Every business works differently. Start with these 3 steps to shape Twenty around your needs.
+---
+
+**Quick Win**: Start with connecting your mailbox. This gives you immediate value and helps your team see Twenty in action with real data. You can do so under Settings → Accounts.
+
+## 1. Customize your data model
+
+Twenty offers the flexibility you need to shape the data model that will best support your day-to-day.
+Create objects and fields of any type, including relations between your different objects. You can do so under Settings → Data Model.
+Here are a few tips:
+
+* **You are not limited in the number of custom fields nor custom objects**. Adding custom objects and fields will not lead to upgrading your plan.
+* **People, Companies and Opportunities are the three objects from where you can access the emails and meetings synchronized from your mailbox and calendar**. We recommend using those as much as possible, adding fields to categorize your records if need be. Here is an example:
+ * It is best to use the People object for your prospects and partners, creating a field on the People object named `Person Type`, instead of creating a Partner custom object. Because you would not be able to access the emails exchanged with this person from the Partner records.
+ * Create different views under People, one to display partners and one to display prospects.
+* Two People cannot have the same email address. Two Companies cannot have the same domain.
+* You can deactivate standard fields and objects you do not want to use.
+* You can hide fields from views: don't be afraid of creating fields, you won't have to display all of them.
+
+Read [this article](/l/pt/user-guide/data-model/overview) to learn how to design your data model.
+
+## 2. Bring your data in
+
+Bringing your existing data into Twenty gives your team context from the start.
+
+### Connect your mailbox
+
+If you have not done so when creating your workspace, connect your **Google or Microsoft account** under Settings → Accounts. This allows Twenty to:
+
+* Import your messages and meetings
+* Auto-create contacts based on interactions (optional)
+* Keep communication history visible for your team
+
+**Using another provider?**
+You can add another mailbox via SMTP or another calendar via CalDAV. You will need to activate the feature under Settings → Releases → Lab, and then go back to the Settings → Accounts tab.
+
+### Import data via csv
+
+Use the Command menu (`Cmd + K` or `Ctrl + K`) to import People, Companies, Opportunities, or any custom objects via CSV.
+
+**Key guidelines**:
+
+* Download the sample file to understand the expected format
+* Limit each file to 10k records
+* Remove duplicate emails for People or duplicate domains for Companies
+* Review and fix errors (highlighted in yellow) before importing
+
+Read [this article](/l/pt/user-guide/data-migration/overview) to learn more about data import.
+
+## 3. Create your first view
+
+Creating different views is key to make the data actionable for your team.
+Here is how to proceed:
+
+* **Add or hide columns**
+ Manage the fields visible in a given view clicking on Options → Fields (from the top right). You can show/hide fields from there.
+
+* **Reorder fields**
+ Reorder the fields from a given view clicking on Options → Fields (from the top right). Drag and drop the fields to reorder them.
+
+* **Filter your view**
+ Narrow down the records displayed using the Filters from the top right.
+
+* **Sort records**
+ Reorder records displayed using the Sort function from the top right, or by clicking directly on the column name.
+
+* **Choose the layout**
+ You can switch to a **Kanban layout** or a list **Group By** layout, as long as the object has a `Stage` or similar select-type field.
+
+* **Save your view as Favorites**
+ This can be done using the dropdown menu showing the different views.
+
+## What's next?
+
+Start creating automations using [workflows](/l/pt/user-guide/workflows/overview).
diff --git a/packages/twenty-docs/l/pt/user-guide/getting-started/how-tos/create-workspace.mdx b/packages/twenty-docs/l/pt/user-guide/getting-started/how-tos/create-workspace.mdx
new file mode 100644
index 0000000000..f93617f83f
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/getting-started/how-tos/create-workspace.mdx
@@ -0,0 +1,48 @@
+---
+title: Create a Workspace
+description: Follow a step-by-step guide on how to register on Twenty, choose a subscription plan, and set up your account.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Step 1: Registration
+
+1. Navigate to [Twenty Sign Up](https://app.twenty.com).
+2. Select your preferred sign-up method:
+ * **Continue with Google** for Google account registration.
+ * **Continue with Microsoft** for Microsoft account registration.
+ * Or, **Continue With Email** for email registration.
+
+
+
+## Step 2: Choosing a Trial Period
+
+Choose between two trial periods:
+
+### 30 days
+
+With credit card
+
+### 7 days
+
+Without credit card
+
+Both trials include:
+
+* Full access
+* Unlimited contacts
+* Email integration
+* Custom objects
+* API & Webhooks
+
+You can click on "Change plan" to choose a different plan or billing interval.
+
+
+
+## Step 3: Payment Confirmation & Account Setup
+
+Post payment approval via Stripe, you're directed to create your workspace and user profile. Remember that you can cancel your subscription anytime.
+
+## Support
+
+For queries or help, connect with the dedicated support team at [contact@twenty.com](mailto:contact@twenty.com) or send a message on [Discord](https://discord.gg/cx5n4Jzs57).
diff --git a/packages/twenty-docs/l/pt/user-guide/getting-started/how-tos/navigate-around-twenty.mdx b/packages/twenty-docs/l/pt/user-guide/getting-started/how-tos/navigate-around-twenty.mdx
new file mode 100644
index 0000000000..8e03ed1a41
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/getting-started/how-tos/navigate-around-twenty.mdx
@@ -0,0 +1,83 @@
+---
+title: Navigate Around Twenty
+description: Get a quick overview of how to navigate through the platform and where to take different types of actions.
+---
+
+## The Main Layout
+
+The center of the screen is **where your records live**: people, companies, opportunities, tasks, notes, dashboards, workflows and any other object you created. This is where the day-to-day work happens.
+You can **view, edit, delete records** from there as well as **creating new views**.
+
+
+
+## The Navigation Bar
+
+On the left side, from the top to the bottom, you'll be able to:
+
+* Switch between your **several workspaces** using the dropdown menu or create a new workspace
+* Use the **search bar** (press `/` to focus on it instantly)
+* Open the **Settings** section
+* Have direct access to your **Favourites views**. Favourites are unique for each user.
+* Switch between different objects
+* **Create automations** using workflows
+* Reach out to Support and open our User Guide.
+
+
+
+## The Command Menu
+
+The command menu gives you **quick access to actions** in Twenty. You can access it in two ways:
+
+* **Keyboard shortcut**: Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+* **Mouse**: Click the three dots in the top right corner
+ From there, you can:
+* Create new records
+* **Import and export data via csv**
+* Create new views
+* Access deleted records (Twenty supports soft and hard deletes)
+* See the keyboard shortcuts to quickly access objects in your workspace
+
+
+
+## The Search Bar
+
+The search bar is accesible via the Command Menu, at the top of your navigation bar, or by pressing `/` to focus on it instantly. Search works across all object.
+
+
+
+## The Side Panel
+
+When you click on a record, the side panel appears on the right. This gives you a quick overview of the record's key information, without bringing you to another page. From there, you can decide to close this overview or to get additional information about this record, clicking on the Open button.
+
+
+
+## Views
+
+Every object (like Opportunities or People) supports multiple views. You're not limited in the number of views per object.
+
+Use the dropdown menu at the top left of the main layout to switch between the different views. For example:
+
+* Use a Kanban view to track opportunities by stage
+* Use Group By view to create sections and improve efficiency
+* Use filters to focus on specific records (e.g. leads created last week)
+* Save filtered views to reuse them later
+* Favourite views for fast access
+
+
+
+If you're new to Views, read our [Views & Pipelines guide](/l/pt/user-guide/views-pipelines/overview) to learn how to create and customize them.
+
+## Settings
+
+Open your Settings from the top left to:
+
+* **Connect your mailbox and calendar** accounts for seamless email and calendar sync
+* Customize your **data model**: create custom objects, fields, and relationships
+* **Access the API playground and configure webhooks**
+* **Manage user permissions** and workspace access controls
+* Invite team members and manage user roles
+* Edit your profile and workspace preferences
+* Configure billing and monitor workflow credits usage
+* Discover the latest releases and upcoming features (under Releases → Lab tab)
+
+If you do not see all those sections under Settings, reach out to your workspace administrator - some of them have restricted access.
diff --git a/packages/twenty-docs/l/pt/user-guide/introduction.mdx b/packages/twenty-docs/l/pt/user-guide/introduction.mdx
new file mode 100644
index 0000000000..5696d932a9
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/introduction.mdx
@@ -0,0 +1,63 @@
+---
+title: Discover Twenty
+description: Welcome to Twenty User Guide, your resources for advanced configurations and best practices.
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+
+
+ Discover Twenty
+ Learn what Twenty is and how it can help your business.
+
+
+
+ Data Model
+ Customize your data model to fit your business processes.
+
+
+
+ Data Migration
+ Import and export your data via CSV or API.
+
+
+
+ Calendar & Emails
+ Centralize your team's meetings and emails.
+
+
+
+ Workflows
+ Automate processes and integrate with external tools.
+
+
+
+ AI
+ Enhance your team with AI agents.
+
+
+
+ Views & Pipelines
+ Organize your data with actionable views and pipelines.
+
+
+
+ Dashboards
+ Real-time insights to track performance.
+
+
+
+ Permissions & Access
+ Manage roles and access to Twenty.
+
+
+
+ Billing
+ Understand how Twenty pricing and billing works.
+
+
+
+ Settings
+ Configure your workspace preferences.
+
+
diff --git a/packages/twenty-docs/l/pt/user-guide/permissions-access/capabilities/permissions.mdx b/packages/twenty-docs/l/pt/user-guide/permissions-access/capabilities/permissions.mdx
new file mode 100644
index 0000000000..ddb2d78a99
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/permissions-access/capabilities/permissions.mdx
@@ -0,0 +1,198 @@
+---
+title: Permissions
+description: Control access to objects, fields, and settings with role-based permissions.
+image: /images/user-guide/permissions/permissions.png
+---
+
+Twenty's permission system allows you to control access to three main areas:
+
+* **Objects and Fields**: Control who can view, edit, or delete records and individual fields
+* **Settings**: Manage access to workspace configuration and administrative functions
+* **Actions**: Control general workspace actions like importing data or sending emails
+
+## Create a Role
+
+To create a new role:
+
+1. Go to **Settings → Roles**
+2. Under **All Roles**, click on **+ Create Role**
+3. Enter a role name
+4. In the default **Permissions** tab, [configure permissions](#customize-permissions)
+5. Click **Save** to finish
+
+## Delete a Role
+
+To delete a role:
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to remove
+3. Open the **Settings** tab, then click **Delete Role**
+4. Click **Confirm** in the modal
+
+
+ If a role is deleted, any workspace member assigned to it will be automatically reassigned to the default role. All except the **Admin** role can be deleted. There must always be at least one member assigned to the **Admin** role.
+
+
+## Assign Roles to Members
+
+### View Current Assignments
+
+* Go to **Settings → Roles**
+* See all roles and how many members are assigned to each
+* View which members have which roles
+
+### Assign a Role to a Member
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Click **+ Assign to member**
+5. Select the workspace member from the list
+6. Confirm the assignment
+
+### Set Default Role
+
+1. Go to **Settings → Roles**
+2. In the **Options** section, find **Default Role**
+3. Select which role new members should automatically receive
+4. New workspace members will be assigned this role when they join
+
+
+ You can only assign roles to existing workspace members. To invite new members, use [Member Management](/l/pt/user-guide/settings/capabilities/member-management).
+
+
+## Customize Permissions
+
+Permissions determine what each role can access or modify within your workspace, including workspace objects records, settings, and actions.
+
+### Object Permissions
+
+The **Objects** section controls what this role can do with records across your workspace.
+
+#### Set Default Permissions (All Objects)
+
+First, configure the baseline permissions that apply to **all objects** by default:
+
+| Permission | Description |
+| ---------------------------------- | -------------------------------------- |
+| **See Records on All Objects** | View records in lists and detail pages |
+| **Edit Records on All Objects** | Modify existing records |
+| **Delete Records on All Objects** | Soft-delete records (can be restored) |
+| **Destroy Records on All Objects** | Permanently delete records |
+
+Select or unselect based on what should be the default behavior for this role.
+
+
+ **Example — Intern role**: An intern should be able to see all objects but not edit them by default. Enable "See Records on All Objects" but leave "Edit Records on All Objects" unchecked.
+
+
+#### Add Object-Level Exceptions
+
+After setting defaults, use the **Object-Level** sub-section to add rules that override the defaults for specific objects.
+
+Click **+ Add rule** and select an object to create an exception.
+
+**Example rules for an Intern role:**
+
+| Rule | Effect |
+| ------------------------------------- | ------------------------------------------------------ |
+| Opportunities → disable "See Records" | Intern cannot see the Opportunities object at all |
+| People → enable "Edit Records" | Intern can edit People records (but not other objects) |
+
+### Field Permissions
+
+Within each object-level rule, you can go further and configure **field-level permissions** to control access to specific fields.
+
+| Permission | Description |
+| -------------- | -------------------------- |
+| **See Field** | View the field value |
+| **Edit Field** | Modify the field value |
+| **No Access** | Field is completely hidden |
+
+**Example — Restrict sensitive fields:**
+
+For the Intern role with People edit access, you might want to restrict certain fields:
+
+* People → Email → **See Field** only (cannot edit)
+* People → Address → **No Access** (completely hidden)
+
+This allows the intern to edit most People fields while protecting sensitive information.
+
+### How Permission Inheritance Works
+
+Permissions cascade from general to specific:
+
+1. **All Objects** → sets the baseline for all objects
+2. **Object-Level rules** → override the baseline for specific objects
+3. **Field-Level rules** → override the object setting for specific fields
+
+More specific settings always take precedence.
+
+### Managing Permission Overrides
+
+To override inherited permissions:
+
+1. Click **X** to remove the inherited rule
+2. Select the specific permissions you want
+3. Click the orange **Undo** icon (circular arrow) to revert changes
+
+When done, click **Finish**, then **Save** once redirected to the role page.
+
+### Workspace Settings Permissions
+
+Control access to workspace settings in two ways:
+
+* Toggle **Settings All Access** to grant full access
+* Or enable specific permissions (e.g., API key generation, workspace preferences, role assignment, data model configuration, security settings, and workflow management)
+
+
+ **Current limitation**: Access to workflow management is currently required to manually trigger workflows. This behavior may change in future releases.
+
+
+### Workspace Action Permissions
+
+Control access to general workspace actions:
+
+* Toggle **Application All Access** to grant full permissions
+* Or enable individual actions such as **Send Email**, **Import CSV**, and **Export CSV**
+
+## Assigning Roles to API Keys and AI Agents
+
+Beyond workspace members, roles can also be assigned to **API Keys** and **AI Agents**. This is particularly helpful for teams who want to control exactly "who" can do what in their workspace—including automated processes and integrations.
+
+### Why Assign Roles to API Keys and AI Agents?
+
+* **Security**: Limit what automated processes can access or modify
+* **Compliance**: Ensure integrations only touch the data they need
+* **Control**: Prevent accidental data changes from misconfigured automations
+* **Auditability**: Track which actions were performed by which integration or agent
+
+### Assign a Role to an API Key
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **API Keys**, click **+ Assign to API key**
+5. Select the API key from the list
+6. Confirm the assignment
+
+The API key will now inherit all permissions defined by that role. Any API calls made with this key will be restricted accordingly.
+
+
+ API keys without an assigned role use default permissions. For tighter security, always assign a specific role to production API keys.
+
+
+### Assign a Role to an AI Agent
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **AI Agents**, click **+ Assign to AI agent**
+5. Select the AI agent from the list
+6. Confirm the assignment
+
+The AI agent will only be able to access data and perform actions allowed by its assigned role.
+
+
+ For AI agents running within workflows, this ensures the agent cannot access or modify data outside its intended scope—even if the workflow has broader permissions.
+
diff --git a/packages/twenty-docs/l/pt/user-guide/permissions-access/capabilities/sso-configuration.mdx b/packages/twenty-docs/l/pt/user-guide/permissions-access/capabilities/sso-configuration.mdx
new file mode 100644
index 0000000000..310c161605
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/permissions-access/capabilities/sso-configuration.mdx
@@ -0,0 +1,125 @@
+---
+title: SSO Configuration
+description: Configure Single Sign-On for secure enterprise authentication.
+---
+
+## About SSO
+
+Single Sign-On (SSO) allows your team members to log into Twenty using your organization's identity provider. This provides:
+
+* **Centralized access control**: Manage access from one place
+* **Enhanced security**: Leverage your existing security policies
+* **Better user experience**: One set of credentials for all tools
+
+## Supported Providers
+
+Twenty supports SSO with:
+
+* **SAML 2.0**: Works with most enterprise identity providers
+* **Google Workspace**: For organizations using Google
+* **Microsoft Entra ID**: (formerly Azure AD) For Microsoft environments
+
+## Setting Up SSO
+
+### Prerequisites
+
+* Organization plan (cloud and self-hosted workspaces)
+* Admin access to your identity provider
+* Admin access to Twenty workspace
+
+
+ **For self-hosting users willing to set up SSO**, reach out to contact@twenty.com
+
+
+### Configuration Steps
+
+#### 1. Access SSO Settings
+
+1. Go to **Settings → Security**
+2. Find the **SSO Configuration** section
+3. Click **Configure SSO**
+
+#### 2) Choose Your Provider
+
+Select your identity provider from the list or choose "Custom SAML" for other providers.
+
+#### 3. Configure Your Identity Provider
+
+You'll need to configure your identity provider with:
+
+* **Entity ID**: Provided by Twenty
+* **ACS URL**: The callback URL for authentication
+* **Certificate**: For secure communication
+
+#### 4. Enter Provider Details in Twenty
+
+* **SSO URL**: Login URL from your provider
+* **Entity ID**: Your provider's identifier
+* **Certificate**: X.509 certificate from your provider
+
+#### 5. Test and Enable
+
+1. Click **Test Configuration** to verify setup
+2. Enable SSO when testing is successful
+3. Configure user provisioning preferences
+
+## User Provisioning
+
+### Just-in-Time (JIT) Provisioning
+
+* Users are created automatically on first login
+* Assigned default role automatically
+* No manual user creation needed
+
+### Manual Provisioning
+
+* Invite users before they can log in
+* Pre-assign specific roles
+* More control over who can access
+
+## Managing SSO Users
+
+### Role Assignment
+
+SSO users can be assigned roles like regular users:
+
+1. Go to **Settings → Members**
+2. Find the user
+3. Change their role as needed
+
+### Access Revocation
+
+To remove access for SSO users:
+
+* Remove them from your identity provider, or
+* Remove them from the Twenty workspace
+
+## Best Practices
+
+### Security
+
+* **Require SSO**: Disable password login for SSO users
+* **Regular audits**: Review access periodically
+* **Strong IdP policies**: Enforce MFA at the identity provider
+
+### User Management
+
+* **Clear naming**: Use consistent naming from your directory
+* **Group mapping**: Map IdP groups to Twenty roles (if available)
+* **Offboarding process**: Include Twenty in your deprovisioning workflow
+
+## Troubleshooting
+
+### Common Issues
+
+* **Certificate errors**: Ensure certificate hasn't expired
+* **URL mismatches**: Verify ACS URL matches exactly
+* **User not found**: Check JIT provisioning settings
+
+### Getting Help
+
+If you encounter issues, contact support with:
+
+* Error messages received
+* Identity provider being used
+* Configuration details (without sensitive data)
diff --git a/packages/twenty-docs/l/pt/user-guide/permissions-access/how-tos/permissions-faq.mdx b/packages/twenty-docs/l/pt/user-guide/permissions-access/how-tos/permissions-faq.mdx
new file mode 100644
index 0000000000..6700b48297
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/permissions-access/how-tos/permissions-faq.mdx
@@ -0,0 +1,126 @@
+---
+title: Permissions FAQ
+description: Frequently asked questions about roles and permissions.
+---
+
+## Roles
+
+
+
+ Twenty comes with an **Admin** and **Member** roles by default. You can create additional custom roles based on your team's needs (e.g., Sales Rep, Manager, Read-Only User).
+
+
+
+ No, the Admin role cannot be deleted. There must always be at least one member assigned to the Admin role.
+
+
+
+ Any workspace member assigned to that role will be automatically reassigned to the default role.
+
+
+
+ Go to **Settings → Roles**, find the **Default Role** option, and select which role new members should automatically receive when they join.
+
+
+
+ No, each user can only have one role at a time. Create a custom role if you need a combination of permissions.
+
+
+
+## Permissions
+
+
+
+ * **Object permissions**: Control access to entire records (e.g., can see/edit/delete People records)
+ * **Field permissions**: Control access to specific fields within an object (e.g., can see but not edit the Salary field)
+
+ Field permissions allow more granular control over sensitive data.
+
+
+
+ Permissions cascade from global to specific:
+
+ 1. **All Objects** sets the baseline for all objects
+ 2. **Object-Level Permissions** can override the global setting for specific objects
+ 3. **Field-Level Permissions** can override the object setting for specific fields
+
+ More specific settings always take precedence.
+
+
+
+ For objects:
+
+ * **See Records**: View records in lists and detail pages
+ * **Edit Records**: Modify existing records
+ * **Delete Records**: Soft-delete records (can be restored)
+ * **Destroy Records**: Permanently delete records
+
+ For fields:
+
+ * **See Field**: View the field value
+ * **Edit Field**: Modify the field value
+ * **No Access**: Field is completely hidden
+
+
+
+ Row-level permissions will be available on the **Organization** plan by Q1 2026. This allows you to restrict access to specific records based on criteria (e.g., only see your own opportunities).
+
+
+
+ 1. Go to **Settings → Roles**
+ 2. Select the role
+ 3. Navigate to the object containing the field
+ 4. Set the field permission to **See Field** (without Edit Field)
+
+
+
+## Settings & Actions
+
+
+
+ You can control access to:
+
+ * API key generation
+ * Workspace preferences
+ * Role assignment
+ * Data model configuration
+ * Security settings
+ * Workflow management
+
+ Use **Settings All Access** to grant full access, or enable specific permissions.
+
+
+
+ You can control:
+
+ * **Send Email**: Ability to send emails from Twenty
+ * **Import CSV**: Ability to import data via CSV
+ * **Export CSV**: Ability to export data to CSV
+
+ Use **Application All Access** to grant all actions, or enable specific ones.
+
+
+
+## SSO
+
+
+
+ No, SSO is a Premium feature available on the **Organization** plan only.
+
+
+
+ Twenty supports:
+
+ * **SAML 2.0** (works with most enterprise identity providers)
+ * **Google Workspace**
+ * **Microsoft Entra ID** (formerly Azure AD)
+
+
+
+ With JIT provisioning, user accounts are automatically created in Twenty when someone logs in via SSO for the first time. They're assigned the default role automatically.
+
+
+
+ Yes, once SSO is configured, you can disable password login for SSO users to enforce authentication through your identity provider.
+
+
diff --git a/packages/twenty-docs/l/pt/user-guide/permissions-access/overview.mdx b/packages/twenty-docs/l/pt/user-guide/permissions-access/overview.mdx
new file mode 100644
index 0000000000..8c3888056e
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/permissions-access/overview.mdx
@@ -0,0 +1,40 @@
+---
+title: Permissions & Access
+description: Manage roles, permissions, and access control in your workspace.
+---
+
+
+
+
+
+Twenty's permission system lets you control who can access and modify data in your workspace. Create roles, assign permissions, and configure SSO for secure access.
+
+## What's in this section
+
+
+
+ Create roles and configure object, field, and settings permissions.
+
+
+
+ Set up Single Sign-On with your identity provider.
+
+
+
+ Common questions about roles, permissions, and SSO.
+
+
+
+## Key features
+
+* **Role-based access**: Create custom roles with specific permissions
+* **Object permissions**: Control who can view, edit, or delete records
+* **Field permissions**: Restrict access to sensitive fields
+* **Settings permissions**: Control access to workspace configuration
+* **SSO integration**: Configure single sign-on for enterprise security (Organization plan)
+
+## Quick links
+
+* [Create a role](/l/pt/user-guide/permissions-access/capabilities/permissions#create-a-role)
+* [Configure SSO](/l/pt/user-guide/permissions-access/capabilities/sso-configuration)
+* [Manage team members](/l/pt/user-guide/settings/capabilities/member-management)
diff --git a/packages/twenty-docs/l/pt/user-guide/settings/capabilities/domains-settings.mdx b/packages/twenty-docs/l/pt/user-guide/settings/capabilities/domains-settings.mdx
new file mode 100644
index 0000000000..b2c49c5ae2
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/settings/capabilities/domains-settings.mdx
@@ -0,0 +1,47 @@
+---
+title: Domain Settings
+description: Configure workspace domain, approved access domains, and public domains.
+---
+
+Configure domain settings under **Settings → Domains**.
+
+## Workspace Domain
+
+Edit your subdomain name or set a custom domain for your workspace.
+
+### Customize Domain
+
+1. Click **Customize Domain**
+2. Edit your subdomain (e.g., `yourcompany.twenty.com`)
+3. Or set up a custom domain (e.g., `crm.yourcompany.com`)
+
+For custom domains, you'll need to configure DNS settings with your domain provider.
+
+## Approved Domains
+
+Anyone with an email address at these domains is allowed to sign up for this workspace automatically.
+
+### Add Approved Access Domain
+
+1. Click **Add Approved Access Domain**
+2. Enter your company domain (e.g., `yourcompany.com`)
+3. Save
+
+Once configured, anyone with an email address at that domain can join your workspace without needing a direct invitation.
+
+
+ This is useful for allowing your entire team to self-register while keeping the workspace restricted to your organization.
+
+
+## Public Domains
+
+Provision a complete and secure hosting environment on these domains.
+
+### Add Public Domain
+
+1. Click **Add Public Domain**
+2. Enter the domain you want to use
+3. Configure DNS settings as instructed
+4. Verify the domain
+
+SSL certificates are automatically provisioned for public domains.
diff --git a/packages/twenty-docs/l/pt/user-guide/settings/capabilities/experience-settings.mdx b/packages/twenty-docs/l/pt/user-guide/settings/capabilities/experience-settings.mdx
index 02eccd923c..e279f7d88b 100644
--- a/packages/twenty-docs/l/pt/user-guide/settings/capabilities/experience-settings.mdx
+++ b/packages/twenty-docs/l/pt/user-guide/settings/capabilities/experience-settings.mdx
@@ -1,38 +1,38 @@
---
-title: Configurações da Experiência
-description: Personalize o tema da sua interface e as preferências regionais.
+title: Experience Settings
+description: Customize your interface theme and regional preferences.
---
-Personalize a sua experiência no Twenty em **Configurações → Experiência**.
+Personalize your Twenty experience under **Settings → Experience**.
-## Aparência
+## Appearance
-Escolha o seu tema visual:
+Choose your visual theme:
-* **Claro**: Interface limpa e clara
-* **Escuro**: Mais fácil para os olhos em condições de pouca luz
-* **Configurações do sistema**: Combina automaticamente com o tema do seu dispositivo
+* **Light**: Clean, bright interface
+* **Dark**: Easier on the eyes in low-light conditions
+* **System settings**: Automatically matches your device's theme
-## Idioma
+## Language
-Selecione o idioma de sua preferência para a interface do Twenty no menu suspenso.
+Select your preferred language for the Twenty interface from the dropdown menu.
-## Formatos
+## Formats
-Configure a data, hora, número, fuso horário e dia de início do calendário.
+Configure date, time, number, timezone, and calendar start day.
-| Configuração | Descrição |
-| ------------------------------- | --------------------------------------------------------------------------- |
-| **Fuso horário** | Seu fuso horário local para carimbos de data e hora e agendamentos precisos |
-| **Formato de data** | Como as datas aparecem (por exemplo, 12 de dez. de 2025) |
-| **Formato de hora** | Formato de 12 horas (7:22 PM) ou de 24 horas |
-| **Formato de número** | Separadores decimais e de milhares (por exemplo, 1.234,56) |
-| **Dia de início do calendário** | Primeiro dia da semana (domingo ou segunda-feira) |
+| Setting | Description |
+| ---------------------- | ---------------------------------------------------------- |
+| **Time zone** | Your local timezone for accurate timestamps and scheduling |
+| **Date format** | How dates appear (e.g., Dec 12, 2025) |
+| **Time format** | 12-hour (7:22 PM) or 24-hour format |
+| **Number format** | Decimal and thousands separators (e.g., 1,234.56) |
+| **Calendar start day** | First day of the week (Sunday or Monday) |
-Cada configuração pode ser definida como **Configurações do sistema** para corresponder automaticamente às preferências do seu dispositivo, ou você pode escolher um formato específico.
+Each setting can be set to **System settings** to automatically match your device preferences, or you can choose a specific format.
-## Como atualizar
+## How to Update
-1. Vá para **Configurações → Experiência**
-2. Ajuste suas preferências em cada seção
-3. As alterações são salvas automaticamente
+1. Go to **Settings → Experience**
+2. Adjust your preferences in each section
+3. Changes save automatically
diff --git a/packages/twenty-docs/l/pt/user-guide/settings/capabilities/member-management.mdx b/packages/twenty-docs/l/pt/user-guide/settings/capabilities/member-management.mdx
new file mode 100644
index 0000000000..16a302404e
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/settings/capabilities/member-management.mdx
@@ -0,0 +1,87 @@
+---
+title: Member Management
+description: Invite team members and manage workspace access.
+---
+
+Manage who has access to your workspace under **Settings → Members**.
+
+## Invite New Members
+
+### Using Email Invitation
+
+1. Go to **Settings → Members**
+2. Click **+ Invite**
+3. Enter the person's email address
+4. Select a role for the new member
+5. Click **Send invite**
+
+The invited person will receive an email with a link to join your workspace.
+
+### Using Invite Link
+
+1. Go to **Settings → Members**
+2. Copy the workspace invite link
+3. Share the link with new team members
+4. They'll receive access once they sign up
+
+## View and Manage Members
+
+### View All Members
+
+Go to **Settings → Members** to see:
+
+* All active members
+* Pending invitations
+
+### Edit a Member's Profile
+
+Click on a member to open their profile page. As an admin, you can:
+
+* Edit their **name**
+* Update their **profile picture**
+* **Impersonate** their account (useful for troubleshooting)
+* **Delete** their account
+
+### Change a Member's Role
+
+On the member's profile page:
+
+1. Open the **Permissions** tab
+2. View the currently assigned role
+3. Select a different role from the dropdown
+4. The change takes effect immediately
+
+→ [Learn more about roles and permissions](/l/pt/user-guide/permissions-access/capabilities/permissions)
+
+### Remove a Member
+
+1. Click on the member to open their profile
+2. Click **Delete** to remove them from the workspace
+
+
+ Removed members lose access immediately. Their data (records, notes, tasks) remains in the workspace.
+
+
+
+ **Email sync is also removed.** If the deleted user was the only one who synced certain emails, those emails will be permanently removed from the workspace.
+
+
+## Pending Invitations
+
+Manage invitations that haven't been accepted:
+
+* **Resend**: Send the invitation email again
+* **Cancel**: Revoke the invitation before it's accepted
+
+## Approved Access Domains
+
+Allow team members to join automatically based on their email domain:
+
+1. Go to **Settings → Domains**
+2. Add your company domain (e.g., `yourcompany.com`)
+3. Anyone with that email domain can join without an invitation
+
+## Related
+
+* [Permissions](/l/pt/user-guide/permissions-access/capabilities/permissions) — configure what each role can do
+* [Domains Settings](/l/pt/user-guide/settings/capabilities/domains-settings) — configure approved domains
diff --git a/packages/twenty-docs/l/pt/user-guide/settings/capabilities/profile-settings.mdx b/packages/twenty-docs/l/pt/user-guide/settings/capabilities/profile-settings.mdx
index c0fe258ec6..febfa4a86f 100644
--- a/packages/twenty-docs/l/pt/user-guide/settings/capabilities/profile-settings.mdx
+++ b/packages/twenty-docs/l/pt/user-guide/settings/capabilities/profile-settings.mdx
@@ -1,43 +1,43 @@
---
-title: Configurações de Perfil
-description: Gerencie seu perfil pessoal e as configurações de segurança.
+title: Profile Settings
+description: Manage your personal profile and security settings.
---
-## Informações Pessoais
+## Personal Information
-### Nome e E-mail
+### Name and Email
-* **Nome de Exibição**: Atualize como seu nome aparece para outros membros do workspace
-* **Endereço de E-mail**: Altere seu e-mail de login (requer verificação)
-* **Foto do Perfil**: Carregue um avatar personalizado ou use suas iniciais
+* **Display Name**: Update how your name appears to other workspace members
+* **Email Address**: Change your login email (requires verification)
+* **Profile Picture**: Upload a custom avatar or use your initials
-## Configurações de Segurança
+## Security Settings
-### Autenticação de Dois Fatores (2FA)
+### Two-Factor Authentication (2FA)
-Ative o 2FA para adicionar uma camada extra de segurança à sua conta:
+Enable 2FA to add an extra layer of security to your account:
-1. Vá para **Configurações → Configurações de Perfil**
-2. Clique em **Ativar 2FA**
-3. Escaneie o código QR com seu aplicativo autenticador
-4. Digite o código de verificação para confirmar
+1. Go to **Settings → Profile Settings**
+2. Click **Enable 2FA**
+3. Scan the QR code with your authenticator app
+4. Enter the verification code to confirm
-### Gerenciamento de Senhas
+### Password Management
-* **Alterar Senha**: Atualize sua senha atual
-* **Requisitos de Senha**: Deve ter pelo menos 8 caracteres
+* **Change Password**: Update your current password
+* **Password Requirements**: Must be at least 8 characters long
-## Gerenciamento de Perfil
+## Profile Management
-### Excluir Conta
+### Delete Account
- Excluir sua conta removerá permanentemente seu acesso a todos os workspaces. Essa ação não pode ser desfeita; você perderá o acesso a todos os workspaces onde é membro e deve considerar sair de workspaces individuais se apenas quiser sair de equipes específicas.
+ Deleting your account will permanently remove your access to all workspaces. This action cannot be undone, you'll lose access to all workspaces where you're a member, and you should consider leaving individual workspaces instead if you only want to exit specific teams.
-Para excluir sua conta:
+To delete your account:
-1. Vá para **Configurações → Configurações de Perfil**
-2. Role até **Zona de Perigo**
-3. Clique em **Excluir Conta**
-4. Confirme digitando seu endereço de e-mail
+1. Go to **Settings → Profile Settings**
+2. Scroll to **Danger Zone**
+3. Click **Delete Account**
+4. Confirm by typing your email address
diff --git a/packages/twenty-docs/l/pt/user-guide/settings/capabilities/releases-settings.mdx b/packages/twenty-docs/l/pt/user-guide/settings/capabilities/releases-settings.mdx
new file mode 100644
index 0000000000..4180b67161
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/settings/capabilities/releases-settings.mdx
@@ -0,0 +1,31 @@
+---
+title: Releases Settings
+description: Enable experimental features in Twenty.
+---
+
+## About Releases Settings
+
+The Releases section allows you to enable experimental features before they're generally available.
+
+## Lab Features
+
+Lab features are experimental capabilities that are still being developed. They may change or be removed without notice.
+
+### How to Enable Lab Features
+
+1. Go to **Settings → Releases**
+2. Find the feature you want to enable
+3. Toggle it on
+4. The feature will be available immediately
+
+
+ Lab features are experimental and may not work as expected. Use them with caution in production environments.
+
+
+## Feature Feedback
+
+Your feedback helps improve Twenty:
+
+* Report issues with experimental features
+* Share how you're using new features
+* Suggest improvements via the community Discord
diff --git a/packages/twenty-docs/l/pt/user-guide/settings/capabilities/workspace-settings.mdx b/packages/twenty-docs/l/pt/user-guide/settings/capabilities/workspace-settings.mdx
new file mode 100644
index 0000000000..f72f71a814
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/settings/capabilities/workspace-settings.mdx
@@ -0,0 +1,30 @@
+---
+title: Workspace Settings
+description: Customize your workspace name and branding.
+---
+
+Those are accessible under **Settings → General**.
+
+## Workspace Picture
+
+* **Upload Logo**: Add a custom workspace logo
+* **Supported formats**: PNG, JPEG, and GIF files under 10MB
+* **Remove**: Delete the current workspace logo
+
+## Workspace Name
+
+* **Name**: Change your workspace display name
+* This name appears to all workspace members
+
+## Danger Zone
+
+
+ Deleting your workspace permanently removes all data and cannot be undone. All workspace data will be lost forever, all members will lose access immediately, and this action cannot be reversed.
+
+
+To delete your workspace:
+
+1. Click **Delete workspace** button
+2. Confirm the deletion when prompted
+
+**Note**: Only workspace administrators can delete workspaces.
diff --git a/packages/twenty-docs/l/pt/user-guide/settings/how-tos/settings-faq.mdx b/packages/twenty-docs/l/pt/user-guide/settings/how-tos/settings-faq.mdx
new file mode 100644
index 0000000000..19aa50e5a0
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/settings/how-tos/settings-faq.mdx
@@ -0,0 +1,171 @@
+---
+title: Settings FAQ
+description: Frequently asked questions about Twenty settings.
+image: /images/user-guide/setup/settings.png
+---
+
+## Workspace Settings
+
+
+
+ 1. Go to **Settings → General**
+ 2. Find the Workspace Name field
+ 3. Enter your new name
+ 4. Changes save automatically
+
+
+
+ 1. Go to **Settings → General**
+ 2. Click on the current logo or upload area
+ 3. Select an image file (PNG, JPEG, or GIF under 10MB)
+ 4. The logo updates immediately
+
+
+
+ Yes, you can create and be a member of multiple workspaces. Each workspace has its own data, settings, and subscription.
+
+
+
+ 1. Go to **Settings → General**
+ 2. Scroll to Danger Zone
+ 3. Click **Delete workspace**
+ 4. Confirm the deletion
+
+ Note: This permanently deletes all data and cannot be undone.
+
+
+
+ Delete the workspaces you no longer need under **Settings → General → Delete workspace**.
+
+
+ Do not delete your **account** (accessible under Settings → Profile): your account is shared among all your workspaces. Deleting your account removes access to ALL workspaces.
+
+
+
+
+ If you want to temporarily disable your workspace (not permanently delete it), go to **Settings → Billing** and click **Cancel Plan**. Your data will be preserved for a grace period.
+
+
+
+## Profile Settings
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Find the Password section
+ 3. Enter your current password
+ 4. Enter your new password
+ 5. Save changes
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Find the 2FA section
+ 3. Click **Enable 2FA**
+ 4. Scan the QR code with your authenticator app
+ 5. Enter the verification code
+
+
+
+ To change your email address, please reach out to [contact@twenty.com](mailto:contact@twenty.com).
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Scroll to Danger Zone
+ 3. Click **Delete Account**
+ 4. Confirm by typing your email
+
+ Note: This removes your access to all workspaces and deletes all emails synced from your connected accounts.
+
+
+
+## Experience Settings
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find the Theme section
+ 3. Select Light, Dark, or System
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Date Format
+ 3. Select your preferred format
+ 4. Changes apply immediately
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Time Zone
+ 3. Select your local time zone
+ 4. All timestamps will adjust
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Language
+ 3. Select from available languages
+ 4. The interface updates to your selection
+
+
+
+## Account Settings
+
+
+
+ 1. Go to **Settings → Accounts**
+ 2. Click **Add account**
+ 3. Choose Google or Microsoft
+ 4. Authorize access
+ 5. Configure sync settings
+
+
+
+ Yes, you can connect multiple email accounts. Go to **Settings → Accounts** and add additional accounts as needed.
+
+
+
+ 1. Go to **Settings → Accounts**
+ 2. Find the account to remove
+ 3. Click **Disconnect**
+ 4. Confirm the action
+
+
+
+## Domains
+
+
+
+ Yes! Go to **Settings → Domains** and click **Customize Domain**. You have two options:
+
+ * **Subdomain**: Use a Twenty subdomain like `yourcompany.twenty.com`
+ * **Custom domain**: Use your own domain like `crm.yourcompany.com` (requires DNS configuration)
+
+ A subdomain is quick to set up, while a custom domain provides a fully branded experience for your team.
+
+
+
+ You can configure approved access domains so team members with company email addresses can automatically join your workspace. Go to **Settings → Domains** and add your company domain (e.g., `yourcompany.com`).
+
+
+
+## Lab Features
+
+
+
+ Lab features are experimental capabilities being tested before general release. They may change or be removed without notice.
+
+
+
+ Lab features are functional but may have bugs or unexpected behavior. Use them cautiously in production environments.
+
+
+
+ 1. Go to **Settings → Releases → Lab**
+ 2. Find the feature you want
+ 3. Toggle it on
+ 4. The feature becomes available immediately
+
+
diff --git a/packages/twenty-docs/l/pt/user-guide/settings/overview.mdx b/packages/twenty-docs/l/pt/user-guide/settings/overview.mdx
new file mode 100644
index 0000000000..f659288c4e
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/settings/overview.mdx
@@ -0,0 +1,67 @@
+---
+title: Settings
+description: Set up your Twenty workspace with essential configurations.
+image: /images/user-guide/setup/settings.png
+---
+
+
+
+
+
+## Initial Setup
+
+When you first create your workspace, there are several key settings to configure.
+
+### Workspace Name and Logo
+
+1. Go to **Settings → General**
+2. Update your workspace name
+3. Upload your company logo
+4. Save your changes
+
+### Time Zone and Date Format
+
+1. Go to **Settings → Experience**
+2. Select your time zone
+3. Choose your preferred date format
+4. Save your changes
+
+## Essential Configurations
+
+### Connect Email and Calendar
+
+Set up email and calendar sync:
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Connect your Google or Microsoft account
+4. Configure sync settings
+
+→ [Complete email & calendar setup guide](/l/pt/user-guide/calendar-emails/overview)
+
+### Invite Your Team
+
+Add team members to your workspace:
+
+1. Go to **Settings → Members**
+2. Click **+ Invite**
+3. Enter email addresses
+4. Assign appropriate roles
+
+
+ Before inviting your team, check the default role under **Settings → Roles**. New members are automatically assigned this role when they join.
+
+
+## Workspace Settings Checklist
+
+* Workspace name and logo configured
+* Time zone and date format set
+* Email and calendar connected
+* Team members invited
+* Roles and permissions configured
+
+## Next Steps
+
+* [Workspace settings](/l/pt/user-guide/settings/capabilities/workspace-settings)
+* [Profile settings](/l/pt/user-guide/settings/capabilities/profile-settings)
+* [Experience settings](/l/pt/user-guide/settings/capabilities/experience-settings)
diff --git a/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/calendar-view.mdx b/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/calendar-view.mdx
new file mode 100644
index 0000000000..28d97c712f
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/calendar-view.mdx
@@ -0,0 +1,46 @@
+---
+title: Calendar View
+description: Display records with date fields on a calendar.
+---
+
+## About Calendar View
+
+Calendar view displays your records on a calendar based on a date field. Each record appears as an event on the corresponding date.
+
+
+
+## Creating a Calendar View
+
+1. Navigate to an object with date fields
+2. Click the view dropdown → **+ Add view**
+3. Name your view and click **Create**
+4. Open the **Options** on the right
+5. Select **Calendar** as the layout
+6. Choose the **date field** to use for positioning records
+7. Click **Update view**
+
+## Configuring the Calendar
+
+### Choose the Date Field
+
+Under **Options**, select which date field determines where records appear on the calendar.
+
+### Display Fields
+
+Configure which fields show on each calendar event:
+
+1. Click **Options → Fields**
+2. Toggle fields on/off
+3. Drag to reorder
+
+## Use Cases
+
+* **Meetings and calls**: View upcoming appointments
+* **Deadlines**: Track due dates and close dates
+* **Events**: Plan and visualize scheduled activities
+* **Follow-ups**: See when tasks are due
+
+## Related
+
+* [Views Overview](/l/pt/user-guide/views-pipelines/overview) — creating and managing views
+* [Filters and Sorting](/l/pt/user-guide/views-pipelines/capabilities/filters-and-sorting) — filtering calendar data
diff --git a/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/fields-and-columns.mdx b/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/fields-and-columns.mdx
new file mode 100644
index 0000000000..4915392a71
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/fields-and-columns.mdx
@@ -0,0 +1,52 @@
+---
+title: Fields & Columns
+description: Choose which fields to display and how to organize them.
+---
+
+## Selecting Fields to Display
+
+Each view can show a different set of fields. Customize what's visible to focus on the information that matters.
+
+### Show or Hide Fields
+
+1. Click **Options** in the top right
+2. Click **Fields**
+3. Click the **eye icon** next to each field to show/hide it
+
+### Reorder Fields
+
+Change the order fields appear in your view:
+
+1. Click **Options → Fields**
+2. Drag fields up or down
+3. Changes save automatically
+
+## Field Display by View Type
+
+### Table Views
+
+* Fields appear as columns
+* Resize columns by dragging borders
+
+### Kanban Views
+
+* Fields appear on cards
+* Reorder via Options → Fields
+* Use Compact view to hide all fields
+
+### Calendar Views
+
+* Selected fields show on calendar events
+* Configure via Options → Fields
+
+## Best Practices
+
+* **Show only what's needed** — too many fields clutters the view
+* **Put important fields first** — most-used columns on the left
+* **Create multiple views** — different field sets for different purposes
+* **Use field visibility per view** — same object, different focus
+
+## Related
+
+* [Table Views](/l/pt/user-guide/views-pipelines/capabilities/table-views) — list view features
+* [Kanban Views](/l/pt/user-guide/views-pipelines/capabilities/kanban-views) — card-based views
diff --git a/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx b/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx
new file mode 100644
index 0000000000..facf2657a5
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx
@@ -0,0 +1,78 @@
+---
+title: Filters & Sorting
+description: Filter and sort records to find exactly what you need.
+---
+
+## Filtering Data
+
+Filters help you focus on specific records by showing only those that match your criteria.
+
+### Adding a Filter
+
+1. Click the **Filter** button in the toolbar
+2. Select the field to filter by
+3. Choose the operator (equals, contains, etc.)
+4. Enter the filter value
+5. Click **Apply**
+
+### Filter Operators
+
+| Field Type | Available Operators |
+| ---------- | -------------------------------------------------- |
+| Text | Equals, Contains, Starts with, Ends with, Is empty |
+| Number | Equals, Greater than, Less than, Between, Is empty |
+| Date | Equals, Before, After, Between, Is empty |
+| Select | Equals, Is any of, Is empty |
+| Checkbox | Is true, Is false |
+| Relation | Equals, Is empty |
+
+### Multiple Filters
+
+Combine multiple filters to narrow down results:
+
+* All filters are applied with AND logic
+* Each additional filter further restricts results
+
+### Removing Filters
+
+* Click the **X** on individual filter chips
+* Click **Clear all** to remove all filters
+
+## Sorting Data
+
+Sorting determines the order records appear.
+
+### Adding a Sort
+
+1. Click the **Sort** button in the toolbar
+2. Select the field to sort by
+3. Choose ascending (A-Z, 0-9) or descending (Z-A, 9-0)
+4. Click **Apply**
+
+### Multiple Sorts
+
+Add multiple sort levels:
+
+* First sort is primary
+* Subsequent sorts apply within groups of equal values
+
+### Quick Column Sorting
+
+Click any column header to sort:
+
+* First click: Ascending
+* Second click: Descending
+* Third click: Remove sort
+
+## Saving Filter and Sort Settings
+
+Filters and sorts are saved with the view:
+
+1. Configure your filters and sorts
+2. Click **Save** to update the current view
+3. Or click **Save as new view** to create a variant
+
+## Related
+
+* [Table Views](/l/pt/user-guide/views-pipelines/capabilities/table-views) — group by feature
+* [Views Overview](/l/pt/user-guide/views-pipelines/overview) — building and managing views
diff --git a/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/kanban-views.mdx b/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/kanban-views.mdx
new file mode 100644
index 0000000000..fa616d2f3d
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/kanban-views.mdx
@@ -0,0 +1,99 @@
+---
+title: Kanban Board Views
+description: Learn how to use Kanban views to visualize and manage your workflows.
+image: /images/user-guide/kanban-views/kanban.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## About Kanban Views
+
+Kanban views visually map out process flows, where each column stands for a distinct stage and each card represents a record.
+
+## Move Cards between Stages
+
+You can move each card between stages as it goes through your workflow by dragging and dropping. To proceed, hold your click on a card and move it to the next stage.
+
+
+
+## Add and Delete Stages
+
+You can tailor your workflow to suit your needs using stages, which represent a value in a Select Field:
+
+### Add Stages
+
+To add a stage, access the Select field settings by navigating to Settings > Data Model, selecting your object, and then the field your Kanban board depends on.
+
+
+
+### Remove Stages
+
+To remove a stage, hover the stage name or the `⋮` icon, click `Edit from settings` in the Select field settings, and then click **Delete** next to the relevant stage.
+
+## Display Fields
+
+You can configure your Kanban board to display some fields and hide others. To hide a field, click on **Options** on the top right, then on **Fields** to bring up the list of options. Look for the field needed in the Hidden Fields section and click on the eye button to display the field.
+
+You can also rearrange the order of fields by holding down the field name and dragging it to where you want it.
+
+
+
+## Compact View
+
+You can hide all the fields and get an overview of all records at a glance. To enable:
+
+1. Click **Options** on the top right
+2. Turn on the toggle for **Compact view**
+
+
+
+## Column Aggregations
+
+Each column in a Kanban view can display aggregated values at the top, helping you understand your data at a glance.
+
+### Available Aggregations
+
+| Aggregation | Description |
+| ----------- | --------------------------------------------- |
+| **Count** | Number of records in the column |
+| **Sum** | Total of a numeric field (e.g., deal amounts) |
+| **Average** | Average value of a numeric field |
+| **Min** | Lowest value |
+| **Max** | Highest value |
+
+### Configuring Aggregations
+
+1. Click on the number displayed next to the Stage value, at the top of a column
+2. Select the aggregation type
+3. Choose the field to aggregate
+
+**Example:** Show total deal value per stage by aggregating the Amount field with Sum.
+
+## When to Use Kanban Views
+
+Kanban views are ideal for:
+
+* **Sales pipelines**: Track deals through stages from lead to close
+* **Project management**: Monitor tasks through workflow states
+* **Recruitment**: Track candidates through hiring stages
+* **Any staged process**: Visualize any workflow with defined stages
+
+## Best Practices
+
+### Organize Your Stages
+
+* **Limit stages**: 5-7 stages is ideal for visibility
+* **Clear naming**: Use descriptive stage names
+* **Logical order**: Arrange stages in process order
+
+### Optimize Card Display
+
+* **Show key fields**: Display only the most important information
+* **Use compact view**: For high-level overviews
+* **Color coding**: Use stage colors to quickly identify status
+
+### Maintain Data Quality
+
+* **Update regularly**: Keep cards moving through stages
+* **Archive completed**: Move closed items out of active view
+* **Review stale cards**: Follow up on cards stuck in stages
diff --git a/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/table-views.mdx b/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/table-views.mdx
new file mode 100644
index 0000000000..ac72f40ea1
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/table-views.mdx
@@ -0,0 +1,64 @@
+---
+title: Table Views
+description: Display your data in a spreadsheet-like list format.
+---
+
+## About Table Views
+
+Table views display records in rows with customizable columns—like a spreadsheet. This is the default view type for most objects.
+
+
+
+## Features
+
+### Column Configuration
+
+* Show or hide columns (fields)
+* Resize column widths
+* Reorder columns by dragging
+
+### Group By a Select Field
+
+Organize records into collapsible groups based on a field of select type.
+
+
+
+1. Click **Options**
+2. Select **Group**
+3. Choose a Select field
+4. Configure group order under **Options → Group → Sort**:
+ * **Alphabetical** or **Reverse alphabetical**
+ * **Manual order**: Drag groups under "Visible groups" to reorder
+ * Click the **eye icon** next to a group to hide it
+
+**Use cases:**
+
+* Group Company by Type
+* Group Opportunities by Stage
+* Group Tasks by Status
+
+
+ **For best performance, limit to 10-15 visible groups per view.** If you need more groups, consider using a Dashboard instead.
+
+
+### Column Widths
+
+Resize columns to show more or less content:
+
+1. Hover between two column headers
+2. Click and drag the column border
+3. Release to set the new width
+
+## When to Use Table Views
+
+Table views work best for:
+
+* **Browsing large datasets** — scan many records quickly
+* **Data entry** — edit multiple records efficiently
+* **Detailed analysis** — see many fields at once
+* **Sorting and filtering** — find specific records
+
+## Related
+
+* [Fields and Columns](/l/pt/user-guide/views-pipelines/capabilities/fields-and-columns) — configuring which fields to display
+* [Filters and Sorting](/l/pt/user-guide/views-pipelines/capabilities/filters-and-sorting) — narrowing down records
diff --git a/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/view-settings.mdx b/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/view-settings.mdx
new file mode 100644
index 0000000000..b02a3aa368
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/views-pipelines/capabilities/view-settings.mdx
@@ -0,0 +1,74 @@
+---
+title: View Settings
+description: Manage view visibility, naming, icons, and organization.
+---
+
+## View Visibility
+
+Control who can see your custom views.
+
+### Visibility Options
+
+| Setting | Who Can See |
+| ------------- | --------------------- |
+| **Workspace** | All workspace members |
+| **Unlisted** | Only you |
+
+### Changing Visibility
+
+1. Open the view
+2. Click **Options → Visibility**
+3. Select **Workspace** or **Unlisted**
+
+
+ The default "All [Object Name]" views cannot have their visibility changed.
+
+
+## Rename a View
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Edit**
+4. Enter the new name
+
+## Change View Icon
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Edit**
+4. Click the icon to change it
+
+## Reorder Views
+
+Change the order views appear in the dropdown:
+
+1. Open the view dropdown
+2. Drag views by their handle
+3. Drop in the desired position
+4. Order saves automatically
+
+## Favorites
+
+Pin frequently used views for quick access:
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to a view
+3. Select **Add to favorites**
+
+Favorited views appear in a dedicated section for easy access.
+
+## Delete a View
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Delete**
+4. Confirm deletion
+
+
+ Deleted views cannot be recovered.
+
+
+## Related
+
+* [Views Overview](/l/pt/user-guide/views-pipelines/overview) — creating views
+* [How to Restrict Access](/l/pt/user-guide/views-pipelines/how-tos/restrict-access-to-your-view) — step-by-step guide
diff --git a/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx b/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
new file mode 100644
index 0000000000..ed95016ec5
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
@@ -0,0 +1,61 @@
+---
+title: Create a Calendar View for Tasks Due
+description: Visualize your tasks and deadlines on a calendar.
+---
+
+
+
+## Prerequisites
+
+Your Tasks object needs a **Due Date** field (Date or Date & Time type).
+
+## Steps
+
+1. Navigate to **Tasks**
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Tasks Calendar")
+4. Click **Create**
+5. Click **Options** and select **Calendar** as the layout
+6. Choose **Due Date** as the date field
+7. Click **Save**
+
+## Configure Your Calendar
+
+### Display Fields on Events
+
+1. Click **Options → Fields**
+2. Click the **eye icon** to show/hide fields
+3. Drag to reorder
+
+Recommended fields to display:
+
+* **Title** — task name
+* **Assignee** — who's responsible
+* **Status** — current progress
+
+### Filter Your Calendar
+
+Create focused views:
+
+* **My Tasks**: Filter by Assignee = Me
+* **This Week**: Filter by Due Date = This week
+* **Overdue**: Filter by Due Date < Today, Status ≠ Done
+
+## Other Calendar Use Cases
+
+| Object | Date Field | Purpose |
+| ------------- | ---------- | ------------------------- |
+| Opportunities | Close Date | Track expected closes |
+| Custom Events | Event Date | Plan activities |
+| Projects | Deadline | Monitor project timelines |
+
+## Tips
+
+* **Review weekly**: Start each week by checking your calendar view
+* **Combine with table view**: Use calendar for overview, table for details
+* **Set visibility**: Keep personal task calendars as Unlisted
+
+## Related
+
+* [Calendar View](/l/pt/user-guide/views-pipelines/capabilities/calendar-view) — all calendar features
+* [Filters and Sorting](/l/pt/user-guide/views-pipelines/capabilities/filters-and-sorting) — filter your calendar
diff --git a/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx b/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
new file mode 100644
index 0000000000..4626ff154d
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
@@ -0,0 +1,80 @@
+---
+title: Create a Kanban View for Projects
+description: Track projects through stages using a visual board.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Use a Kanban view to visualize your projects (or any object with stages) as cards moving through columns.
+
+
+
+## Prerequisites
+
+Your object needs a **Select field** to use as columns (e.g., Status, Stage, Phase).
+
+If you don't have one:
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Add a Select field with your stage options
+
+## Steps
+
+1. Navigate to your object (e.g., Projects, Tasks)
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Project Board")
+4. Click **Create**
+5. Click **Options** and select **Kanban** as the layout
+6. The view uses your Select field for columns automatically
+7. Click **Save**
+
+## Configure Your Board
+
+### Show Key Fields on Cards
+
+1. Click **Options → Fields**
+2. Find fields in the "Hidden Fields" section
+3. Click the **eye icon** to display them on cards
+4. Drag to reorder
+
+
+
+### Enable Compact View
+
+For a high-level overview:
+
+1. Click **Options**
+2. Turn on **Compact view**
+
+Cards show only the record name.
+
+
+
+### Add Aggregations
+
+Show counts or totals at the top of each column:
+
+1. Click the number next to a column name
+2. Select an aggregation (Count, Sum, etc.)
+3. Choose a field if needed
+
+## Moving Cards
+
+Drag and drop cards between columns to update their status.
+
+
+
+## Example: Task Board
+
+| Column (Status) | Cards |
+| --------------- | ----------------- |
+| **To Do** | New tasks |
+| **In Progress** | Active work |
+| **Review** | Awaiting approval |
+| **Done** | Completed |
+
+## Related
+
+* [Kanban Views](/l/pt/user-guide/views-pipelines/capabilities/kanban-views) — aggregations, compact view, stages
+* [How to Set Up a Sales Pipeline](/l/pt/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline) — Kanban for Opportunities
diff --git a/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx b/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx
new file mode 100644
index 0000000000..a36931fa45
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx
@@ -0,0 +1,51 @@
+---
+title: Create a Table View with Grouping
+description: Organize your records into collapsible groups by field value.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Group your table view by a Select field to organize records into collapsible sections.
+
+
+
+## Steps
+
+1. Navigate to the object (People, Companies, etc.)
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Companies by Type")
+4. Click **Create**
+5. Click **Options → Group**
+6. Choose a Select field to group by
+7. Click **Save**
+
+## Configure Group Order
+
+Under **Options → Group → Sort**, choose how groups are ordered:
+
+| Option | Description |
+| ------------------------ | --------------------------------------------- |
+| **Alphabetical** | A to Z |
+| **Reverse alphabetical** | Z to A |
+| **Manual order** | Drag groups to reorder under "Visible groups" |
+
+Click the **eye icon** next to a group to hide it from the view.
+
+
+ **For best performance, limit to 10-15 visible groups.** If you need more, consider using a Dashboard instead.
+
+
+## Example: Companies by Industry
+
+1. Go to **Companies**
+2. Create a new view named "By Industry"
+3. Click **Options → Group**
+4. Select the **Industry** field
+5. Save
+
+Now your companies are organized by industry, making it easy to focus on one segment at a time.
+
+## Related
+
+* [Table Views](/l/pt/user-guide/views-pipelines/capabilities/table-views) — all table view features
+* [Filters and Sorting](/l/pt/user-guide/views-pipelines/capabilities/filters-and-sorting) — combine grouping with filters
diff --git a/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx b/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
new file mode 100644
index 0000000000..ddccd324fe
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
@@ -0,0 +1,32 @@
+---
+title: Restrict Access to Your View
+description: Control who can see your custom views.
+---
+
+Each view (except the default "All [Object Name]" views) has its own visibility setting.
+
+## Steps
+
+1. Open the view you want to restrict
+2. Click **Options** in the top right
+3. Click **Visibility**
+4. Select **Unlisted**
+
+Your view is now visible only to you.
+
+## Visibility Options
+
+| Setting | Who Can See |
+| ------------- | --------------------- |
+| **Workspace** | All workspace members |
+| **Unlisted** | Only you |
+
+## Notes
+
+* The default "All [Object Name]" views cannot be made unlisted
+* Unlisted views don't appear in other users' view dropdowns
+* You can change visibility back to Workspace at any time
+
+## Related
+
+* [View Settings](/l/pt/user-guide/views-pipelines/capabilities/view-settings) — all view configuration options
diff --git a/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx b/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx
new file mode 100644
index 0000000000..fe4f2cfd6a
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx
@@ -0,0 +1,120 @@
+---
+title: Set Up a Sales Pipeline
+description: Configure your sales pipeline to track opportunities through stages.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+A sales pipeline in Twenty is a Kanban view of your Opportunities object, where each column represents a stage in your sales process.
+
+## Step 1: Configure Your Stages
+
+Stages are defined in the Opportunities object's **Stage** field.
+
+1. Go to **Settings → Data Model**
+2. Select **Opportunities**
+3. Find and click the **Stage** field
+4. Add, remove, or rename stages to match your process
+
+
+
+### Recommended Stages
+
+| Stage | Purpose |
+| --------------- | ----------------------------------- |
+| **New** | Fresh opportunities just identified |
+| **Qualified** | Confirmed as a good fit |
+| **Meeting** | Engaged in discussions |
+| **Proposal** | Proposal sent |
+| **Negotiation** | Working on terms |
+| **Closed Won** | Deal successful |
+| **Closed Lost** | Deal unsuccessful |
+
+
+ **5-7 stages is optimal.** Too many stages makes the pipeline hard to scan; too few loses visibility into deal progress.
+
+
+## Step 2: Create a Pipeline View
+
+1. Go to **Opportunities**
+2. Click the view dropdown → **+ Add view**
+3. Name it "Sales Pipeline"
+4. Click **Create**
+5. Open **Options** and select **Kanban** as the layout
+
+The view automatically uses the Stage field for columns.
+
+## Step 3: Configure Your View
+
+### Show Key Fields
+
+1. Click **Options → Fields**
+2. Look for fields in the "Hidden Fields" section
+3. Click the **eye icon** to display: Company, Amount, Close Date, Owner
+
+### Enable Aggregations
+
+Show totals at the top of each column:
+
+1. Click the number displayed next to a Stage name at the top of a column
+2. Select the aggregation type (Count, Sum, Average, etc.)
+3. Choose the field to aggregate (e.g., Amount)
+
+**Example:** Show total deal value per stage by aggregating Amount with Sum.
+
+### Use Compact View (Optional)
+
+For a high-level overview with minimal card content:
+
+1. Click **Options**
+2. Turn on the toggle for **Compact view**
+
+## Step 4: Create Personal and Team Views
+
+### "My Pipeline"
+
+* **Filter**: Owner = Me
+* **Visibility**: Unlisted (personal view)
+
+### "Team Pipeline"
+
+* **Filter**: None (show all)
+* **Visibility**: Workspace (shared view)
+
+### "Closing This Month"
+
+* **Type**: Table
+* **Filter**: Close Date = This month, Stage ≠ Closed Won, Stage ≠ Closed Lost
+* **Sort**: Close Date ascending
+
+## Working with Opportunities
+
+### Creating Opportunities
+
+* Click **+ New** in the Opportunities view
+* Or click **+** in a specific stage column
+
+### Moving Through Stages
+
+Drag and drop opportunity cards between columns to update their stage.
+
+
+
+## Best Practices
+
+### Pipeline Hygiene
+
+* Update deals daily as they progress
+* Move or close stale deals promptly
+* Keep close dates realistic
+
+### Stage Discipline
+
+* Define clear criteria for each stage
+* Move deals promptly when criteria are met
+* Don't let deals sit in stages too long
+
+## Related
+
+* [Kanban Views](/l/pt/user-guide/views-pipelines/capabilities/kanban-views) — aggregations and compact view
+* [Filters and Sorting](/l/pt/user-guide/views-pipelines/capabilities/filters-and-sorting) — creating filtered views
diff --git a/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx b/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
new file mode 100644
index 0000000000..e321029156
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
@@ -0,0 +1,149 @@
+---
+title: Show Expected Amount in Your Pipeline
+description: Calculate and display weighted deal values based on stage probability.
+---
+
+The Expected Amount is a calculated value: **Amount × Probability**. This helps you forecast revenue by weighting deals based on how likely they are to close.
+
+
+ This is an example of creating [Formula Fields](/l/pt/user-guide/workflows/how-tos/crm-automations/formula-fields) using workflows.
+
+
+This guide walks you through setting up the custom fields and workflows needed to calculate and display expected amounts in your pipeline.
+
+## Step 1: Create Custom Fields
+
+You need two custom fields on the Opportunities object.
+
+### Create the Probability Field
+
+1. Go to **Settings → Data Model → Opportunities**
+2. Click **+ Add Field**
+3. Configure:
+ * **Name**: Probability
+ * **Type**: Number
+ * **Description**: Stage-based probability (0-100%)
+4. Click **Save**
+
+### Create the Expected Amount Field
+
+1. Click **+ Add Field**
+2. Configure:
+ * **Name**: Expected Amount
+ * **Type**: Currency
+ * **Description**: Calculated: Amount × Probability
+3. Click **Save**
+
+### Optional: Make Fields Read-Only for Users
+
+If you don't want users manually editing these calculated fields:
+
+1. Go to **Settings → Roles**
+2. Select the role to configure
+3. Find the Opportunities object
+4. Set **Probability** and **Expected Amount** fields to read-only
+
+This ensures only the workflows can update these values.
+
+## Step 2: Create Workflow #1 — Update Probability on Stage Change
+
+This workflow automatically sets the Probability when an opportunity moves to a new stage.
+
+### Create the Workflow
+
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Update Probability on Stage Change"
+
+### Configure the Trigger
+
+1. Add a **Record Created or Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Stage** field is updated
+
+### Add Branches for Each Stage
+
+Create a branch for each stage with its probability:
+
+| Stage | Probability |
+| ----------- | ----------- |
+| New | 10% |
+| Qualified | 25% |
+| Meeting | 40% |
+| Proposal | 60% |
+| Negotiation | 80% |
+| Closed Won | 100% |
+| Closed Lost | 0% |
+
+
+ To create a new branch, right click on the workflow canvas and click **New action**. Then, link this action to the previous node by dragging the arrow from the previous node to this new action.
+
+
+For each stage:
+
+1. Add a **Filter** node: Stage = [stage name]
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Probability
+ * Value: [probability for that stage]
+
+### Calculate Expected Amount
+
+After the branches rejoin:
+
+1. Add a **Filter** node: Amount is not empty
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Expected Amount
+ * Value: Amount × Probability
+
+## Step 3: Create Workflow #2 — Recalculate on Amount Change
+
+This workflow updates the Expected Amount when the deal Amount changes.
+
+### Create the Workflow
+
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Recalculate Expected Amount on Amount Change"
+
+### Configure the Trigger
+
+1. Add a **Record Created or Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Amount** field is updated
+
+### Add the Logic
+
+1. Add a **Filter** node: Amount is not empty
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Expected Amount
+ * Value: Amount × Probability
+
+## Step 4: Display in Your Pipeline
+
+Now show the Expected Amount totals in your Kanban view:
+
+1. Open your **Sales Pipeline** Kanban view
+2. Click the **number** next to any Stage name at the top of a column
+3. Select **Sum**
+4. Choose **Expected Amount**
+
+Each column now shows the total weighted pipeline value for that stage.
+
+## Summary
+
+| Component | Purpose |
+| ------------------------- | ------------------------------------------------------------------------- |
+| **Probability field** | Stores the stage-based win probability |
+| **Expected Amount field** | Stores Amount × Probability |
+| **Workflow #1** | Updates Probability when Stage changes, then recalculates Expected Amount |
+| **Workflow #2** | Recalculates Expected Amount when Amount changes |
+| **Aggregation** | Displays Sum of Expected Amount per stage |
+
+## Related
+
+* [Formula Fields](/l/pt/user-guide/workflows/how-tos/crm-automations/formula-fields) — create calculated fields using workflows
+* [Kanban Views](/l/pt/user-guide/views-pipelines/capabilities/kanban-views) — column aggregations
+* [How to Create Custom Fields](/l/pt/user-guide/data-model/how-tos/create-custom-fields) — field configuration
diff --git a/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx b/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
new file mode 100644
index 0000000000..4278b75d15
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
@@ -0,0 +1,231 @@
+---
+title: Track How Long Opportunities Stay in Each Stage
+description: Monitor deal velocity by tracking when opportunities enter each stage.
+---
+
+
+ This is an example of creating [Formula Fields](/l/pt/user-guide/workflows/how-tos/crm-automations/formula-fields) using workflows — specifically date calculations.
+
+
+Tracking when opportunities enter each stage helps you identify bottlenecks and measure deal velocity.
+
+This guide walks you through setting up custom fields and a workflow to automatically record when an opportunity moves to each stage, and calculate how many days it spent in the previous stage.
+
+## Step 1: Create Custom Fields
+
+You need two types of fields for each stage:
+
+* **Date & Time fields**: Record when the opportunity entered each stage
+* **Number fields**: Store how many days the opportunity spent in each stage
+
+### Create the "Last Entered" Fields
+
+1. Go to **Settings → Data Model → Opportunities**
+2. For each stage, click **+ Add Field** and configure:
+ * **Name**: Last Entered [Stage Name] (e.g., "Last Entered New", "Last Entered Qualified")
+ * **Type**: Date & Time
+ * **Description**: Timestamp when opportunity entered this stage
+3. Click **Save**
+
+Create these fields:
+
+* Last Entered New
+* Last Entered Qualified
+* Last Entered Meeting
+* Last Entered Proposal
+* Last Entered Negotiation
+* Last Entered Closed Won
+* Last Entered Closed Lost
+
+### Create the "Days in Stage" Fields
+
+1. For each stage, click **+ Add Field** and configure:
+ * **Name**: Days in [Stage Name] (e.g., "Days in New", "Days in Qualified")
+ * **Type**: Number
+ * **Description**: Number of days spent in this stage
+2. Click **Save**
+
+Create these fields:
+
+* Days in New
+* Days in Qualified
+* Days in Meeting
+* Days in Proposal
+* Days in Negotiation
+
+
+ You don't need "Days in" fields for Closed Won and Closed Lost since those are final stages.
+
+
+### Optional: Make Fields Read-Only
+
+If you don't want users manually editing these calculated fields:
+
+1. Go to **Settings → Roles**
+2. Select the role to configure
+3. Find the Opportunities object
+4. Set the "Last Entered" and "Days in" fields to read-only
+
+## Step 2: Create the Workflow
+
+This single workflow handles both tasks:
+
+* Records the timestamp when entering a new stage
+* Calculates days spent in the previous stage
+
+### Create the Workflow
+
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Track Stage Time"
+
+### Configure the Trigger
+
+1. Add a **Record Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Stage** field is updated
+
+### Add Branches for Each Stage
+
+
+ To create a new branch, right click on the workflow canvas and click **New action**. Then, link this action to the previous node by dragging the arrow from the previous node to this new action.
+
+
+---
+
+**Branch 1: Stage = New (first stage)**
+
+Since this is the first stage, we only record the entry timestamp—no previous stage to calculate.
+
+1. Add a **Filter** node: Stage = New
+2. Add a **Code** action:
+
+```javascript
+export const main = async (): Promise => {
+ return { now: new Date().toISOString() };
+};
+```
+
+3. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Last Entered New
+ * Value: `now` from Code node
+
+---
+
+**Branch 2: Stage = Qualified**
+
+When moving to Qualified, record entry time AND calculate days spent in New.
+
+1. Add a **Filter** node: Stage = Qualified
+2. Add a **Code** action:
+
+```javascript
+export const main = async (params: {
+ lastEnteredPreviousStage: Date;
+}): Promise => {
+ const { lastEnteredPreviousStage } = params;
+
+ const now = new Date();
+ const entryDate = new Date(lastEnteredPreviousStage);
+ const diffTime = Math.abs(now.getTime() - entryDate.getTime());
+ const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return {
+ now: now.toISOString(),
+ daysInPreviousStage: daysInPreviousStage
+ };
+};
+```
+
+3. Configure the Code node input: map `lastEnteredPreviousStage` to the **Last Entered New** field
+4. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Fields to update:
+ * Last Entered Qualified = `now`
+ * Days in New = `daysInPreviousStage`
+
+---
+
+**Branch 3: Stage = Meeting**
+
+When moving to Meeting, record entry time AND calculate days spent in Qualified.
+
+1. Add a **Filter** node: Stage = Meeting
+2. Add a **Code** action:
+
+```javascript
+export const main = async (params: {
+ lastEnteredPreviousStage: Date;
+}): Promise => {
+ const { lastEnteredPreviousStage } = params;
+
+ const now = new Date();
+ const entryDate = new Date(lastEnteredPreviousStage);
+ const diffTime = Math.abs(now.getTime() - entryDate.getTime());
+ const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return {
+ now: now.toISOString(),
+ daysInPreviousStage: daysInPreviousStage
+ };
+};
+```
+
+3. Configure the Code node input: map `lastEnteredPreviousStage` to the **Last Entered Qualified** field
+4. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Fields to update:
+ * Last Entered Meeting = `now`
+ * Days in Qualified = `daysInPreviousStage`
+
+---
+
+**Continue for remaining stages:**
+
+| Stage | Records | Calculates |
+| ----------- | ------------------------ | ------------------- |
+| Proposal | Last Entered Proposal | Days in Meeting |
+| Negotiation | Last Entered Negotiation | Days in Proposal |
+| Closed Won | Last Entered Closed Won | Days in Negotiation |
+| Closed Lost | Last Entered Closed Lost | Days in Negotiation |
+
+The branches do not need to rejoin—each runs independently when its stage condition is met.
+
+## Step 3: Analyze Time in Stage
+
+With timestamps and day counts recorded, you can now analyze deal velocity.
+
+### Create a "Slow Deals" View
+
+1. Create a Table view of Opportunities
+2. Add columns: Name, Stage, Days in [previous stage], Amount
+3. Sort by "Days in" field (descending)
+4. Filter by Stage to focus on one stage at a time
+
+Deals at the top spent the most time in the previous stage.
+
+### Use Aggregations
+
+In your pipeline Kanban view:
+
+1. Click the number next to a Stage name
+2. Select **Average**
+3. Choose a "Days in" field
+
+This shows the average time deals spend in each stage.
+
+## Summary
+
+| Component | Purpose |
+| ------------------------ | ------------------------------------------------- |
+| **Last Entered fields** | Store when opportunity entered each stage |
+| **Days in fields** | Store how many days spent in each stage |
+| **Workflow** | Records timestamp AND calculates days in one pass |
+| **Views & Aggregations** | Analyze deal velocity and identify bottlenecks |
+
+## Related
+
+* [Workflows](/l/pt/user-guide/workflows/overview) — automation basics
+* [How to Create Custom Fields](/l/pt/user-guide/data-model/how-tos/create-custom-fields) — field configuration
+* [Kanban Views](/l/pt/user-guide/views-pipelines/capabilities/kanban-views) — aggregations
diff --git a/packages/twenty-docs/l/pt/user-guide/views-pipelines/overview.mdx b/packages/twenty-docs/l/pt/user-guide/views-pipelines/overview.mdx
index c14acc4093..891b45859f 100644
--- a/packages/twenty-docs/l/pt/user-guide/views-pipelines/overview.mdx
+++ b/packages/twenty-docs/l/pt/user-guide/views-pipelines/overview.mdx
@@ -1,137 +1,137 @@
---
-title: Visualizações e pipelines
-description: Aprenda a criar e gerenciar visualizações no Twenty.
+title: Views & Pipelines
+description: Learn how to create and manage views in Twenty.
image: /images/user-guide/table-views/table.png
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-
+
-## Compreendendo as visualizações
+## Understanding Views
-As visualizações são configurações salvas que determinam como seus dados são exibidos. Cada visualização pode ter:
+Views are saved configurations that determine how your data is displayed. Each view can have its own:
-* **Layout**: Tabela, Kanban ou Calendário
-* **Filtros**: quais registros mostrar
-* **Ordenação**: como os registros são ordenados
-* **Campos**: quais colunas ficam visíveis
+* **Layout**: Table, Kanban, or Calendar
+* **Filters**: Which records to show
+* **Sorting**: How records are ordered
+* **Fields**: Which columns are visible
-## Tipos de visualização
+## View Types
-### Visualização de tabela
+### Table View
-A visualização padrão, semelhante a uma planilha, que mostra registros em linhas com colunas personalizáveis.
+The default spreadsheet-like view showing records in rows with customizable columns.
-### Visualização de Kanban
+### Kanban View
-Uma visualização em quadro onde os registros aparecem como cartões organizados por etapas. Ideal para:
+A visual board view where records appear as cards organized by stages. Ideal for:
-* Pipelines de vendas
-* Acompanhamento de projetos
-* Qualquer fluxo de trabalho com etapas definidas
+* Sales pipelines
+* Project tracking
+* Any workflow with defined stages
-### Visualização de calendário
+### Calendar View
-Exiba registros com campos de data em um calendário. Perfeito para:
+Display records with date fields on a calendar. Perfect for:
-* Reuniões e eventos
-* Prazos e datas de vencimento
-* Planejamento baseado em tempo
+* Meetings and events
+* Deadlines and due dates
+* Time-based planning
-## Criando uma Visualização
+## Creating a View
-Existem duas maneiras de criar uma nova visualização.
+There are two ways to create a new view.
-### Use o menu suspenso de visualizações
+### Use the View Dropdown Menu
-1. Navegue até qualquer objeto (Pessoas, Empresas, etc.)
-2. Clique no nome da visualização no canto superior esquerdo (mostra a visualização atual com uma seta de menu suspenso)
-3. Clique em **+ Adicionar visualização**
-4. Nomeie sua visualização e clique em **Criar**
-5. Escolha um layout (Tabela, Kanban ou Calendário) em **Opções**
-6. Adicione filtros e ordenação conforme necessário
-7. Selecione quais campos exibir e reordene-os
-8. Clique em **Salvar**
+1. Navigate to any object (People, Companies, etc.)
+2. Click the view name at the top left (shows current view with a dropdown arrow)
+3. Click **+ Add view**
+4. Name your view and click **Create**
+5. Choose a layout (Table, Kanban, or Calendar) under **Options**
+6. Add filters and sorting as needed
+7. Select which fields to display and reorder them
+8. Click **Save**
-
+
-### Comece editando uma visualização existente
+### Start by editting an existing view
-1. Navegue até qualquer objeto (Pessoas, Empresas, etc.)
-2. Escolha um layout (Tabela, Kanban ou Calendário) em **Opções** ou adicione filtros e ordenação conforme necessário
-3. Clique em **Salvar como nova visualização**
-4. Nomeie sua visualização e clique em **Criar**
-5. Continue editando sua nova visualização
-6. Clique em **Atualizar visualização** para salvar suas configurações adicionais
+1. Navigate to any object (People, Companies, etc.)
+2. Choose a layout (Table, Kanban, or Calendar) under **Options** or Add filters and sorting as needed
+3. Click on **Save as new view**
+4. Name your view and click **Create**
+5. Keep editing your new view
+6. Click on **Update view** to save your additional configurations
-
+
-## Gerenciar visualizações
+## Managing Views
-### Editar uma visualização
+### Edit a View
-1. Selecione a visualização no menu suspenso
-2. Faça suas alterações (filtros, ordenação, colunas)
-3. Clique em **Salvar** para atualizar a visualização
+1. Select the view from the dropdown
+2. Make your changes (filters, sorting, columns)
+3. Click **Save** to update the view
-### Renomear uma visualização ou alterar seu ícone
+### Rename a View or Change Its Icon
-1. Abra o menu suspenso de visualizações
-2. Clique no menu **⋮** ao lado do nome da visualização
-3. Selecione **Editar**
-4. Altere o nome ou o ícone
-5. Clique em **Salvar**
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view name
+3. Select **Edit**
+4. Change the name or icon
+5. Click **Save**
-### Reordenar visualizações
+### Reorder Views
-1. Abra o menu suspenso de visualizações
-2. Clique e arraste uma visualização pela sua alça
-3. Solte na posição desejada
-4. A nova ordem é salva automaticamente
+1. Open the view dropdown
+2. Click and drag a view by its handle
+3. Drop it in the desired position
+4. The new order is saved automatically
-### Adicionar aos favoritos
+### Add to Favorites
-Fixe visualizações usadas com frequência para acesso rápido:
+Pin frequently used views for quick access:
-1. Abra o menu suspenso de visualizações
-2. Clique no menu **⋮** ao lado de uma visualização
-3. Selecione **Adicionar aos favoritos**
-4. A visualização aparece na sua seção de favoritos
+1. Open the view dropdown
+2. Click the **⋮** menu next to a view
+3. Select **Add to favorites**
+4. The view appears in your favorites section
-### Excluir uma visualização
+### Delete a View
-1. Selecione a visualização a ser excluída
-2. Clique no menu suspenso de visualizações
-3. Clique no menu **⋮** ao lado da visualização
-4. Selecione **Excluir**
-5. Confirme a exclusão
+1. Select the view to delete
+2. Click the view dropdown
+3. Click the **⋮** menu next to the view
+4. Select **Delete**
+5. Confirm deletion
- Visualizações excluídas não podem ser recuperadas. Certifique-se de que deseja removê-la antes de confirmar.
+ Deleted views cannot be recovered. Make sure you want to remove it before confirming.
-## Visibilidade da visualização
+## View Visibility
-Cada visualização (exceto as visualizações padrão "Todos(as) [Nome do objeto]") tem sua própria configuração de visibilidade.
+Each view (except the default "All [Object Name]" views) has its own visibility setting.
-Para alterar a visibilidade:
+To change visibility:
-1. Abra a visualização
-2. Clique em **Opções → Visibilidade**
-3. Escolha:
- * **Espaço de trabalho**: visível para todos os membros do espaço de trabalho
- * **Não listada**: visível apenas para você
+1. Open the view
+2. Click **Options → Visibility**
+3. Choose:
+ * **Workspace**: Visible to all workspace members
+ * **Unlisted**: Visible only to you
- As visualizações padrão "Todos(as) [Nome do objeto]" não podem ter sua visibilidade alterada.
+ The default "All [Object Name]" views cannot have their visibility changed.
-## Próximos Passos
+## Next Steps
-* [Visualizações de Tabela](/l/pt/user-guide/views-pipelines/capabilities/table-views)
-* [Visualizações de Kanban](/l/pt/user-guide/views-pipelines/capabilities/kanban-views)
-* [Filtros e ordenação](/l/pt/user-guide/views-pipelines/capabilities/filters-and-sorting)
-* [Configurações de visualização](/l/pt/user-guide/views-pipelines/capabilities/view-settings)
+* [Table Views](/l/pt/user-guide/views-pipelines/capabilities/table-views)
+* [Kanban Views](/l/pt/user-guide/views-pipelines/capabilities/kanban-views)
+* [Filters and Sorting](/l/pt/user-guide/views-pipelines/capabilities/filters-and-sorting)
+* [View Settings](/l/pt/user-guide/views-pipelines/capabilities/view-settings)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/send-emails-from-workflows.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/send-emails-from-workflows.mdx
new file mode 100644
index 0000000000..fd9d341609
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/send-emails-from-workflows.mdx
@@ -0,0 +1,149 @@
+---
+title: Send Emails from Workflows
+description: Send personalized emails automatically using workflow actions.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Automatically send emails when specific events occur in your CRM—welcome new contacts, follow up on opportunities, or notify team members.
+
+## Prerequisites
+
+Before you can send emails from workflows:
+
+1. Connect an email account under **Settings → Accounts**
+2. Ensure the account has sending permissions enabled
+
+## Basic Email Workflow
+
+### Example: Welcome Email for New Contacts
+
+**Goal**: Send a welcome email when a new person is added to the CRM.
+
+**Setup**:
+
+1. **Create workflow**: Go to **Settings → Workflows** and click **+ New Workflow**
+
+2. **Add trigger**: Select **Record is Created** → **People**
+
+3. **Add Send Email action**:
+ * Click **+** to add an action
+ * Select **Send Email**
+ * Configure the email:
+
+| Field | Value |
+| ----------- | -------------------------------------- |
+| **To** | `{{trigger.object.email}}` |
+| **Subject** | `Welcome to {{Your Company Name}}` |
+| **Body** | `Hi {{trigger.object.firstName}}, ...` |
+
+4. **Test and activate**: Test with a sample record, then activate
+
+## Using Variables in Emails
+
+Reference data from previous steps using `{{variable}}` syntax:
+
+```text
+Hi {{trigger.object.firstName}},
+
+Thank you for connecting with us!
+
+Your company, {{trigger.object.company.name}}, is now in our system.
+
+Best regards,
+The Team
+```
+
+### Available Variables from Triggers
+
+| Trigger Type | Common Variables |
+| -------------------------- | -------------------------------------- |
+| **Record Created/Updated** | `{{trigger.object.fieldName}}` |
+| **Manual** | `{{trigger.selectedRecord.fieldName}}` |
+| **Webhook** | `{{trigger.body.fieldName}}` |
+
+## Advanced: Conditional Emails
+
+### Example: Different Emails Based on Lead Source
+
+**Goal**: Send different welcome emails based on where the lead came from.
+
+**Setup**:
+
+1. **Trigger**: Record is Created (People)
+
+2. **Add Filter action**:
+ * Condition: `{{trigger.object.source}}` equals `"Website"`
+ * If true → continue to website welcome email
+
+3. **Branch for other sources**:
+ * Create parallel branches for different sources
+ * Each branch has its own Send Email action
+
+## Sending Emails to Multiple Recipients
+
+### Example: Notify Team When Deal Closes
+
+**Goal**: Email the sales rep and their manager when an opportunity is won.
+
+**Setup**:
+
+1. **Trigger**: Record is Updated (Opportunities, Stage = "Closed Won")
+
+2. **Search Records**: Find the opportunity owner's manager
+
+3. **Send Email #1**: To opportunity owner
+ * To: `{{trigger.object.owner.email}}`
+ * Subject: `Congratulations on closing {{trigger.object.name}}!`
+
+4. **Send Email #2**: To manager
+ * To: `{{searchRecords.manager.email}}`
+ * Subject: `Deal Won: {{trigger.object.name}}`
+
+## Scheduled Follow-up Emails
+
+### Example: Follow Up 3 Days After Meeting
+
+**Goal**: Send a follow-up email 3 days after a meeting is logged.
+
+**Setup**:
+
+1. **Trigger**: Record is Created (Activities, Type = "Meeting")
+
+2. **Delay action**: Wait 3 days
+
+3. **Send Email**:
+ * To: Meeting attendee
+ * Subject: Following up on our conversation
+ * Body: Reference meeting details from trigger
+
+## Best Practices
+
+### Email Content
+
+* Keep subject lines concise and relevant
+* Personalize with recipient's name
+* Include a clear call to action
+* Test emails before activating
+
+### Deliverability
+
+* Don't send too many emails too quickly
+* Use professional email signatures
+* Avoid spam trigger words
+* Ensure unsubscribe options for marketing emails
+
+### Troubleshooting
+
+* Verify email account is connected and active
+* Check recipient email address is valid
+* Review workflow runs for error messages
+* Test with your own email address first
+
+
+ **Coming soon**: Email attachments will be available in Q1 2026.
+
+
+## Related
+
+* [Workflow Triggers](/l/pt/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/use-branches-in-workflows.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
new file mode 100644
index 0000000000..a19d8a85f9
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
@@ -0,0 +1,90 @@
+---
+title: Use Branches in Workflows
+description: Understand how branches work and how to control which path is executed.
+---
+
+## How Branches Work
+
+In the workflow editor, you can create multiple paths (branches) going out from a single node. This allows you to build complex automations with different outcomes.
+
+**Important**: When a workflow runs, **all branches execute in parallel by default**. There is no built-in "if/else" logic to choose one branch over another—every path will run simultaneously.
+
+## Controlling Which Branch Runs
+
+To execute only one branch based on specific conditions, **add a Filter node at the beginning of each branch**.
+
+### Example Setup
+
+1. Create your workflow with multiple branches from a single node
+2. Add a **Filter** node as the first step in each branch
+3. Set conditions on each Filter to determine when that branch should continue
+4. Only the branch(es) whose Filter conditions are met will proceed
+
+
+
+### How Filters Work
+
+* If the Filter condition is **met**: The branch continues executing
+* If the Filter condition is **not met**: The branch stops at the Filter node
+
+This effectively creates conditional logic where only the appropriate branch runs based on your data.
+
+## Example: Route by Deal Size
+
+**Scenario**: When a deal is closed, send different notifications based on deal size.
+
+1. **Trigger**: Opportunity updated (Stage = Closed Won)
+2. **Branch 1**: Filter for Amount > $10,000 → Send Slack message to #big-deals
+3. **Branch 2**: Filter for Amount ≤ $10,000 → Send email to sales manager
+
+Both branches start, but only the one matching the deal amount will continue past its Filter.
+
+## Creating Branches
+
+
+ To create a new branch from an existing step, click the **+** button on the step and add your action. You can add multiple branches by clicking **+** multiple times.
+
+
+1. In the workflow editor, select the step you want to branch from
+2. Click the **+** button to add an action
+3. This creates one branch
+4. Click **+** again on the same step to create additional branches
+5. Each branch can have its own sequence of actions
+
+## Merging Branches Back Together
+
+After parallel branches complete their work, you can merge them back into a single path:
+
+1. Complete your branched actions
+2. Add a new step that should run after all branches
+3. Drag a connection from the last step of each branch to this new step
+4. The merged step waits for all connected branches to complete before executing
+
+### Example: Process Then Notify
+
+```
+Trigger
+ │
+ ├── Branch A: Update Customer Record
+ │
+ └── Branch B: Create Support Ticket
+
+ ↘ ↙
+
+ Merged Step: Send Confirmation Email
+```
+
+The confirmation email sends only after both the customer update and ticket creation are done.
+
+## Best Practices
+
+* Always use **Filter nodes** at the start of branches when you want conditional execution
+* Keep branch conditions **mutually exclusive** to avoid duplicate actions
+* Test your workflows with different data to ensure the correct branches run
+* **Rename branch steps** descriptively so it's clear what each path does
+* **Merge branches** when you need a final action after parallel processing
+
+## Related
+
+* [Workflows FAQ](/l/pt/user-guide/workflows/how-tos/need-more-help/workflows-faq) — answers about parallel execution
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions) — available actions for branches
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/use-iterator.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/use-iterator.mdx
new file mode 100644
index 0000000000..5a1da9485d
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/use-iterator.mdx
@@ -0,0 +1,180 @@
+---
+title: Use Iterator
+description: Loop through arrays of records to perform actions on each item.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Iterator lets you loop through an array of records and perform actions on each one. It's essential for workflows that need to process multiple records returned by Search Records or received via webhooks.
+
+
+ Iterator is currently in beta. Activate it under **Settings → Releases → Lab**.
+
+
+## When to Use Iterator
+
+| Scenario | Example |
+| -------------------------- | ---------------------------------------------- |
+| **Process search results** | Send email to each person found |
+| **Handle webhook arrays** | Create records for each item in order |
+| **Bulk updates** | Update multiple records with calculated values |
+| **Notifications** | Alert multiple people about an event |
+
+## Understanding Iterator
+
+Iterator expects an **array** as input. It then:
+
+1. Takes the first item from the array
+2. Runs all actions inside the iterator with that item
+3. Moves to the next item
+4. Repeats until all items are processed
+
+## Basic Setup
+
+### Example: Email Everyone in Search Results
+
+**Goal**: Find all contacts in a specific company and send each one a personalized email.
+
+### Step 1: Search for Records
+
+1. Add **Search Records** action
+2. Object: **People**
+3. Filter: Company equals "Acme Inc"
+4. This returns an array of people
+
+### Step 2: Check Results Exist
+
+1. Add **Filter** action
+2. Condition: `{{searchRecords.length}}` is greater than 0
+3. This prevents Iterator errors on empty results
+
+### Step 3: Add Iterator
+
+1. Add **Iterator** action
+2. Array input: Select `{{searchRecords}}`
+3. This creates a loop
+
+### Step 4: Add Actions Inside Iterator
+
+Actions placed after Iterator run for each item:
+
+1. Add **Send Email** action (inside iterator)
+2. To: `{{iterator.currentItem.email}}`
+3. Subject: Hello `{{iterator.currentItem.firstName}}`!
+4. Body: Personalized message using current item fields
+
+### Result
+
+If Search Records returns 5 people, the Iterator:
+
+* Sends email to person 1
+* Sends email to person 2
+* ... continues for all 5
+
+## Accessing Current Item Data
+
+Inside Iterator, use `{{iterator.currentItem}}` to access the current record:
+
+| Variable | Description |
+| --------------------------------------- | ----------------------------------- |
+| `{{iterator.currentItem}}` | The entire current record object |
+| `{{iterator.currentItem.id}}` | Record ID |
+| `{{iterator.currentItem.email}}` | Email field |
+| `{{iterator.currentItem.company.name}}` | Related company name |
+| `{{iterator.index}}` | Current position in array (0-based) |
+
+## Common Patterns
+
+### Update Multiple Records
+
+**Goal**: Mark all overdue tasks as "Late"
+
+```
+1. Search Records (Tasks, Due Date < Today, Status ≠ Completed)
+2. Filter (length > 0)
+3. Iterator (searchRecords)
+ └── Update Record
+ - Object: Tasks
+ - Record: {{iterator.currentItem.id}}
+ - Status: Late
+```
+
+### Create Records from Array
+
+**Goal**: Webhook receives order with multiple items, create a record for each
+
+```
+1. Webhook Trigger (receives items array)
+2. Filter (items.length > 0)
+3. Iterator (trigger.body.items)
+ └── Create Record
+ - Object: Order Items
+ - Name: {{iterator.currentItem.name}}
+ - Quantity: {{iterator.currentItem.qty}}
+ - Related Order: {{trigger.body.orderId}}
+```
+
+### Conditional Processing Inside Loop
+
+**Goal**: Only send email to contacts with valid emails
+
+```
+1. Search Records (People)
+2. Iterator (searchRecords)
+ └── Filter (currentItem.email is not empty)
+ └── Send Email
+ - To: {{iterator.currentItem.email}}
+```
+
+## Troubleshooting
+
+### "Iterator expects an array"
+
+**Cause**: You passed a single record instead of an array.
+
+**Fix**: Make sure you're passing the result of Search Records or an array field, not a single record.
+
+```
+✅ Correct: {{searchRecords}}
+❌ Wrong: {{searchRecords[0]}}
+```
+
+### Iterator Doesn't Run
+
+**Cause**: The array is empty.
+
+**Fix**: Add a Filter before Iterator to check array length:
+
+```
+Filter: {{searchRecords.length}} > 0
+```
+
+### Actions Run Too Many Times
+
+**Cause**: Search Records returned more records than expected.
+
+**Fix**:
+
+* Add more specific filters to Search Records
+* Set a limit on Search Records (max 200)
+* Add Filter inside Iterator for additional conditions
+
+## Performance Considerations
+
+* **Credit usage**: Each iteration consumes credits for its actions
+* **Time**: Large arrays take longer to process
+* **Limits**: Consider batching very large operations
+* **Rate limits**: External API calls may hit rate limits with many iterations
+
+## Best Practices
+
+1. **Always check array length** before Iterator to avoid errors
+2. **Add filters inside loops** when not all items need processing
+3. **Rename your Iterator step** to describe what it's looping through
+4. **Test with small arrays** before processing large datasets
+5. **Monitor workflow runs** to ensure iterations complete as expected
+
+## Related
+
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions)
+* [How to Use Branches](/l/pt/user-guide/workflows/capabilities/use-branches-in-workflows)
+* [Workflows FAQ](/l/pt/user-guide/workflows/how-tos/need-more-help/workflows-faq)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-actions.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-actions.mdx
new file mode 100644
index 0000000000..11afe518c2
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-actions.mdx
@@ -0,0 +1,311 @@
+---
+title: Workflow Actions
+description: Learn about the actions available in Twenty workflows.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## About Actions
+
+Actions define what happens after a trigger fires. You can chain multiple actions together to build complex automations.
+
+
+ * Use the variable picker (click the `(x+)` icon) to browse available data from previous steps
+ * Hover over any input field to see which step a variable comes from — helpful when the same field (e.g., ID) exists in multiple previous steps
+ * Give each action a descriptive name for easier maintenance
+
+
+## Record Actions
+
+
+
+### Create a Record
+
+Adds a new record to a selected object.
+
+**Configuration**:
+
+* Select the target object
+* Fill out the required and optional fields
+* Use data from previous steps or input values manually to populate fields
+
+**Output**: The newly created record data is available for use in subsequent steps.
+
+### Update Record
+
+Modifies an existing record in a selected object.
+
+
+
+**Configuration**:
+
+* Select the target object
+* Choose the specific record to update.
+ * You can either choose a fixed record, using the drop down menu displaying all available records.
+ * Or you can have the record dynamically selected, by designating a record found in a previous step, using the `(x+)`. You cannot search for the record based on different criteria at this stage. If you've not yet identified the record, add a `Search Record` step before this `Update Record` step.
+* Select fields to modify and enter new values
+
+**Output**: The updated record data is available for use in subsequent steps.
+
+### Delete Record
+
+Removes a record from a selected object.
+
+**Configuration**:
+
+* Select the target object
+* Choose the specific record to delete
+
+**Output**: The deleted record data remains available for use in subsequent steps.
+
+### Search Records
+
+Finds records within a selected object using filter conditions.
+
+**Configuration**:
+
+* Select the object to search
+* Set filter criteria to narrow results
+* Configure sorting and limits
+
+**Output**: Returns matching records that can be used in subsequent steps.
+
+
+ **Limit**: Search Records returns a maximum of **200 records**. If you need to process more, add specific filters to reduce results or use scheduled workflows to process in batches.
+
+
+**Best Practice**: Use [branches](/l/pt/user-guide/workflows/capabilities/workflow-branches) after Search Records to handle "found" vs "not found" scenarios.
+
+### Upsert Record
+
+Creates a new record or updates an existing one based on matching criteria. This is useful when you're not sure if a record already exists.
+
+
+
+**Configuration**:
+
+* Select the target object
+* Note which fields can be used for matching: email for People, domain for Companies, ID for any object, or any field marked as Unique. You'll need to populate at least one of these below.
+* Fill out the field values. Do not forget to populate at least one of the unique identifiers.
+
+
+ **Matching usually works even better when adding only one unique identifier.** For example, the screenshot below will match companies based on their domain. The ID is not necessarily needed.
+
+
+
+
+* Use data from previous steps to populate fields
+
+**How it works**:
+
+1. Searches for a record matching your criteria
+2. If found → updates the existing record
+3. If not found → creates a new record
+
+**Output**: The created or updated record data is available for use in subsequent steps.
+
+## Flow Actions
+
+### Iterator
+
+**Loops through an array of records** returned from a previous step, allowing you to perform actions on each record individually.
+
+**Configuration**:
+
+* Select the array of records from a previous step (e.g., results from Search Records, from a Manual trigger with Bulk availability, from a code node)
+* Define the actions to perform on each record in the loop.
+
+
+ - You can add several actions within an iterator.
+ - When using branches inside an iterator, make sure the last step of each branch connects back to the iterator to close the loop.
+
+
+* Access `Current Item` Fields: to use fields from the record currently being processed, click on the **Iterator** step, then select **Current item**. The list of available fields from that record will be displayed and can be selected for use in subsequent actions.
+
+
+
+### Filter
+
+Filters records based on specified conditions, allowing only records that meet the criteria to pass through.
+
+**Configuration**:
+
+* Select the record to filter
+* Define filter conditions and criteria
+* Configure which records should pass through to subsequent steps
+
+
+ 1. **Output**: Filter nodes don't return data—they act as gates. If the conditions are met, the workflow continues. If not, the workflow stops at that branch.
+ 2. The `IS` operator can be used with numeric fields. It performs as an `EQUAL`.
+
+
+### Delay
+
+Pauses workflow execution for a specified duration or until a specific date/time.
+
+**Delay Types**:
+
+| Type | Description |
+| ------------------ | ------------------------------------------------------------------ |
+| **Duration** | Wait for a specific amount of time (days, hours, minutes, seconds) |
+| **Scheduled Date** | Wait until a specific date and time |
+
+**Configuration for Duration**:
+
+* Set days, hours, minutes, and/or seconds
+* Combine multiple units (e.g., 2 days and 4 hours)
+
+**Configuration for Scheduled Date**:
+
+* Select a date and time
+* Can reference a date field from a previous step (e.g., follow up 3 days after a meeting)
+
+**Use cases**:
+
+* Wait 24 hours before sending a follow-up email
+* Pause until an opportunity's close date
+* Schedule actions for business hours
+
+
+ The scheduled date cannot be in the past. If a date field from a previous step is used and the date has already passed, the workflow will fail.
+
+
+**Limits & Credits**:
+
+* **No maximum duration limit**—you can set delays of minutes, days, weeks, or longer
+* **1 credit consumed** when the Delay node executes, regardless of duration
+* **No credits consumed** while waiting—a 5-minute delay costs the same as a 5-day delay
+
+## Communication Actions
+
+### Send Email
+
+Sends an email from your workflow. This is great for templated group emails. Emails will look like the ones you send from your mailbox.
+Not suited for newsletters (which require richer formatting) or automated email sequences.
+
+**Prerequisites**: Add an email account in Settings → Accounts
+
+**Configuration**:
+
+* Select the sender email account
+
+
+ You can only send emails from mailboxes synced to your own Twenty account. Sending from other team members' mailboxes (e.g., the account owner's email) is on the roadmap.
+
+
+For all the following steps, you can reference variables from previous steps for personalization.
+
+* Enter recipient email address.
+
+
+ Only one recipient is possible at the moment.
+
+
+* Set subject line.
+* Compose message body. You can format links, create numbered list, bullet point lists, add attachments.
+
+
+ Adding HTML signatures is not possible at the moment.
+
+
+### Form
+
+Prompts a form during workflow execution to collect user input. The responses can then be used in subsequent steps to create records, send emails, or execute any other action based on the input.
+
+
+ **Forms are designed for manual triggers only**. For workflows with other triggers (Record Created, Updated, etc.), forms are only accessible via the workflow run interface, which is not the expected user experience. A notifications center will be released in 2026 to properly support forms in automated workflows.
+
+
+**Configuration**:
+
+* Configure the fields that users will be asked to fill. For each field, choose
+ * a type among text, number, date, a given record, a select field. Select fields from all objects are available.
+ * a label
+ * a default value under `Placeholder` (optional)
+* Edit the form title
+
+**Output**: Form responses are available for use in subsequent steps.
+
+**Example**: The "Quick Lead" workflow is available by default in all workspaces, available anywhere in the Command Menu `Cmd + K`.
+
+**How to fill the form**:
+
+* Trigger your manual workflow from the command menu `Cmd K`
+* Fill the form that is displayed in the side panel and click `Submit`.
+
+
+ The fields cannot be made mandatory.
+
+
+
+
+## Integration Actions
+
+### Code
+
+Runs custom JavaScript within your workflow.
+
+**Configuration**:
+
+* Access variables from previous steps. You can edit the variables names dynamically.
+
+
+
+* Write JavaScript code in the editor
+* Return variables for use in subsequent steps
+* Test code directly in the step
+
+
+ If you need to use external API keys in your code, you must input them directly in the function body. You cannot configure API keys elsewhere and reference them in the serverless function.
+
+
+
+ **Working with arrays?** Arrays from external systems or previous steps may come as strings. See [How to handle arrays in Code actions](/l/pt/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions) for the solution.
+
+
+
+ Click the square icon at the top right of the code editor to display it in full screen — helpful since the default editor width is limited.
+
+
+### HTTP Request
+
+Sends a request to an external API as part of your workflow.
+
+
+
+**Configuration**:
+
+* Enter the API endpoint URL. Using parameters from previous steps is possible.
+* Select HTTP method (GET, POST, PUT, PATCH, DELETE)
+* Add required headers and values
+* Provide sample response for structure preview
+
+## AI Actions
+
+### AI Agent - Coming Soon
+
+Runs an AI agent within your workflow to perform intelligent tasks.
+
+**Configuration**:
+
+* **Agent**: Select an existing AI agent or use the default agent
+* **Prompt**: Write the instruction for the AI agent
+* Reference variables from previous steps in the prompt
+
+**What AI Agents can do**:
+
+* Analyze and summarize data
+* Classify or categorize records
+* Generate text content
+* Make decisions based on data
+* Interact with your CRM data using tools
+
+**Output**: The AI agent's response is available for use in subsequent steps. If the agent has a structured output schema, the response will follow that format.
+
+
+ AI Agent actions consume workflow credits based on the AI model used. See [Workflow Credits](/l/pt/user-guide/workflows/capabilities/workflow-credits) for details.
+
+
+
+ AI agents respect role-based permissions. You can assign specific roles to agents under **Settings → Roles** to control what data they can access. See [Permissions](/l/pt/user-guide/permissions-access/capabilities/permissions) for details.
+
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-branches.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-branches.mdx
new file mode 100644
index 0000000000..7ec31dd374
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-branches.mdx
@@ -0,0 +1,66 @@
+---
+title: Workflow Branches
+description: Create parallel paths and conditional logic in your workflows.
+---
+
+Branches allow you to split your workflow into multiple paths that can run simultaneously or conditionally based on your data.
+
+
+
+## How Branches Work
+
+When you create multiple connections from a single node, each path becomes a branch. By default, **all branches execute in parallel**—they don't wait for each other.
+
+## Creating Branches
+
+### Add a New Branch
+
+1. **Right-click on the main canvas** of the workflow (not on an existing node)
+2. Click **Add node**
+3. Choose the node type for your new branch
+4. Drag an arrow from the bottom of the previous step to the top of this new action
+5. Repeat to add more branches from the same node
+
+
+ Each branch is independent. Adding a branch doesn't affect other existing paths from that node.
+
+
+### Visual Layout
+
+Branches appear as parallel paths in the workflow editor. You can drag nodes to rearrange the visual layout without affecting execution.
+
+## Conditional Branches
+
+Since all branches run by default, use **Filter** nodes to control which paths actually execute:
+
+| Branch | Filter Condition | Action |
+| ------ | --------------------- | -------------------------- |
+| A | Stage = "Won" | Send congratulations email |
+| B | Stage = "Lost" | Create follow-up task |
+| C | Stage = "Negotiation" | Notify manager |
+
+1. Create branches from your trigger or action
+2. Add a **Filter** node as the first step of each branch
+3. Configure each filter with mutually exclusive conditions
+4. Add your actions after each filter
+
+Only the branch(es) where the filter condition is met will continue executing.
+
+## Merging Branches
+
+**Branches don't automatically merge.** Each branch runs independently until it ends. You have full flexibility in how you handle this:
+
+* **Option 1: Keep branches separate**
+ Each branch handles its own follow-up actions independently. This is the simplest approach when branches don't need to converge.
+
+* **Option 2: Merge branches manually**
+ When creating your workflow, you can manually connect multiple branches to the same downstream action. Simply drag arrows from the end of each branch to a common node.
+
+
+ While you can use a [Delay](/l/pt/user-guide/workflows/capabilities/workflow-actions#delay) node to pause execution, it's not currently configurable to wait "until another branch ends."
+
+
+## Related
+
+* [How to Use Branches in Workflows](/l/pt/user-guide/workflows/capabilities/use-branches-in-workflows) - Step-by-step guide
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions) - Available actions including Filter
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-credits.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-credits.mdx
new file mode 100644
index 0000000000..437aee5822
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-credits.mdx
@@ -0,0 +1,76 @@
+---
+title: Workflow Credits
+description: Understand workflow credit consumption and management.
+---
+
+Workflow credits power your automations in Twenty. Understanding how they work helps you optimize costs and manage your automation budget effectively.
+
+## Credit Allocation
+
+Workflow credits are allocated based on your billing cycle, not your plan tier:
+
+| Billing Cycle | Credits |
+| ------------------------ | --------------------------- |
+| **Monthly subscription** | 5 million credits per month |
+| **Yearly subscription** | 50 million credits per year |
+
+
+ 5 million monthly credits are generous for standard automations. Most teams won't exceed this limit with typical workflow usage. Additional credits are primarily needed for advanced Code actions and AI-powered workflows.
+
+
+## How Credit Consumption Works
+
+Credits are consumed when workflows execute, not when you create them. Each workflow action consumes credits based on its complexity:
+
+### Credit Consumption by Action Type
+
+* **Basic internal operations**: Very low credit consumption
+ * Search Records
+ * Create Record
+ * Update Record
+ * Delete Record
+ * Form actions
+
+* **Complex operations**: Higher credit consumption
+ * Code actions (JavaScript execution)
+ * HTTP Requests to external services
+
+* **AI features**: Higher credit consumption
+ * AI Agent actions consume credits based on the AI model used
+ * More complex prompts and longer outputs use more credits
+
+* **Delay actions**: Minimal credit consumption
+ * The Delay node consumes **1 credit** when it executes
+ * **No credits are consumed** during the wait period
+ * A 5-minute delay costs the same as a 5-day delay
+
+### Real-Time Deduction
+
+Credits are deducted in real-time as workflows execute. This means:
+
+* Draft workflows don't consume credits
+* Only active, running workflows use your credit allocation
+* Failed workflows still consume credits for completed steps
+
+## Managing Credits
+
+### Check Credit Usage
+
+1. Go to **Settings → Billing**
+2. View your current credit consumption and remaining balance
+3. Monitor usage patterns to optimize your workflows
+
+### Purchasing Additional Credits
+
+If you need more credits beyond your plan allocation:
+
+1. Go to **Settings → Billing**
+2. Click on the option to purchase additional credits. Packages of different sizes are available.
+3. Credits are added to your current balance
+
+## Best Practices
+
+* **Batch Processing**: Use bulk operations and Iterator actions efficiently
+* **Manual Trigger Optimization**: For manual triggers, choose `Bulk` availability to process multiple records in a single workflow run
+* Optimize Code actions for efficiency
+* Batch operations to reduce individual action calls
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-runs.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-runs.mdx
new file mode 100644
index 0000000000..686cec5369
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-runs.mdx
@@ -0,0 +1,92 @@
+---
+title: Workflow Runs
+description: Monitor and manage workflow executions.
+image: /images/user-guide/workflows/workflow.png
+---
+
+## About Runs
+
+A **Run** is a record of a workflow execution. Every time a workflow is triggered—whether by a record event, schedule, manual action, or webhook—a new run is created.
+
+## Viewing Runs
+
+### From the Workflow Editor
+
+1. Open the workflow you want to monitor
+2. Click the **Runs** panel on the right side
+3. See a list of recent runs with their status
+
+### From the Workflow Runs View
+
+1. Go to **Workflow Runs** in the sidebar
+2. View runs across all workflows
+3. Filter by status, workflow, or date
+
+## Run Statuses
+
+| Status | Description |
+| ------------- | ------------------------------------------------------------------------ |
+| **Running** | Workflow is currently executing |
+| **Completed** | Workflow finished successfully |
+| **Failed** | Workflow encountered an error and stopped |
+| **Waiting** | Workflow is paused (e.g., waiting for a Delay action or Form submission) |
+
+## Run Details
+
+Click on any run to see:
+
+* **Status**: Current state of the run
+* **Started at**: When the run began
+* **Duration**: How long the run took
+* **Trigger data**: The input that started the workflow
+* **Step outputs**: Data returned by each step
+* **Error messages**: If the run failed, what went wrong
+
+## Step-by-Step Execution
+
+Each run shows the progression through your workflow:
+
+1. See which steps completed successfully
+2. Identify where failures occurred
+3. View the data passed between steps
+4. Debug issues by examining step inputs and outputs
+
+## Error Handling
+
+When a run fails:
+
+1. Open the failed run
+2. Find the step that caused the failure
+3. Check the error message for details
+4. Common issues:
+ * Missing required fields
+ * Invalid data format
+ * External API errors
+ * Permission issues
+
+## Re-running Workflows
+
+If a run fails, you can:
+
+* Fix the underlying issue and wait for the next trigger
+* For manual workflows, trigger again with the same or updated data
+* Review the workflow logic to prevent future failures
+
+## Performance Tips
+
+### Managing Run History
+
+* Runs are retained for historical reference
+* Very old runs may be archived automatically
+* Export run data if you need to keep records
+
+### Monitoring Best Practices
+
+* Check runs regularly after activating new workflows
+* Review failed runs to identify patterns
+
+## Related
+
+* [Workflow Triggers](/l/pt/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions)
+* [Workflow Troubleshooting](/l/pt/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-triggers.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-triggers.mdx
new file mode 100644
index 0000000000..cddde2a3b2
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-triggers.mdx
@@ -0,0 +1,136 @@
+---
+title: Workflow Triggers
+description: Learn about the different triggers that start your workflows.
+---
+
+## About Triggers
+
+Workflows always start with a single trigger that defines when the automation should run.
+
+
+
+
+ **Advanced objects are supported!** Beyond standard CRM objects (People, Companies, Opportunities), you can also trigger workflows and perform actions on:
+
+ * Workspace Members
+ * Calendar Events
+ * Messages (Emails)
+ * Tasks, Notes, and many other system objects
+
+ This opens up powerful automations like notifying team members when calendar events are created, or processing incoming emails automatically.
+
+
+## Record is Created
+
+Starts the workflow when a new record is created in a selected object (People, Companies, Opportunities, or any custom object).
+
+**Configuration**: Select the object type to monitor for new records.
+
+
+ * This trigger is great for records created by csv, mailbox and calendar synchronization, API.
+ * **It is not recommended for records created manually**: with this trigger, workflows start as soon as the record is created. Since Twenty UI offers auto-save on the fly (there is not an edit mode and then a validation to save records), the workflow will be triggered before the user inputs all the fields.
+ To trigger this workflow on records created manually, it is recommended to use the trigger `Record is created or updated` instead.
+
+
+## Record is Updated
+
+Starts the workflow when changes are made to an existing record.
+
+**Configuration**:
+
+* Select the object type
+* Optionally specify which fields to monitor for changes
+
+## Record is Updated or Created
+
+Starts the workflow when a record is either created or updated in a selected object.
+
+**Why This Matters**: This trigger is particularly helpful because records created via different methods behave differently:
+
+* **API/CSV imports**: Records are created with all fields populated immediately
+* **Manual creation**: Records are created first, then fields are added in subsequent updates
+
+**Configuration**:
+
+* Select the object type to monitor
+* Optionally specify which fields to monitor for changes
+* The workflow will trigger both on initial creation and any subsequent updates
+
+## Record is Deleted
+
+Starts the workflow when a record is removed from an object.
+
+**Configuration**: Select the object type to monitor for deletions.
+
+## Manual Trigger
+
+Starts the workflow when triggered by a user action. This trigger can be accessed through the `Cmd+K` menu or via a custom button that will be displayed in the top navbar after selecting record(s).
+
+
+
+**Availability Configuration**:
+Choose how the workflow should handle record selection:
+
+* **Global**: No record is required to trigger this workflow. The workflow is triggered from the command menu `Cmd + K` anywhere (from any object) and does not use record(s) as input.
+
+* **Single**: The selected record(s) will be passed to your workflow. This is configured for a given object. Several records can be selected before triggering the workflow. The workflow will run from beginning to end as many times as there are records selected.
+
+
+ **Soft limit: 100 runs/minute**. Beyond this, workflows remain in "Not Started" status and are processed gradually—either by a background job or when another workflow enters the queue. This means you can select more than 100 records with a Single trigger; execution will just be slower.
+
+
+* **Bulk**: The selected record(s) will be passed to your workflow. This is configured for a given object. Several records can be selected before triggering the workflow. The workflow will run once, providing the entire list of records as input. This means the workflow needs to contain an [Iterator action](/l/pt/user-guide/workflows/capabilities/workflow-actions#iterator).
+
+
+ This is more advanced, and best for people who want to optimize the number of workflow runs.
+
+
+
+
+**Additional Configuration**:
+
+* Select the target object (for Single and Bulk availability)
+* Choose a command icon for the workflow trigger
+* Configure navbar placement (Pinned or Not Pinned)
+
+**Access Methods**:
+
+* `Cmd+K` menu to find and launch manual workflows
+* Custom button in the top navbar (if configured)
+
+## Time-Based Trigger: On a Schedule
+
+Starts the workflow on a recurring basis you define.
+
+**Configuration**:
+
+* Select time unit (minutes, hours, days)
+* Enter a value or use custom cron expressions for advanced scheduling
+
+
+ **Timezone**: Scheduled workflows run in **UTC**. When setting hours for daily schedules, convert your local time to UTC.
+
+
+## External Trigger: Webhook
+
+Starts the workflow when a GET or POST request is received from an external service.
+
+
+
+**Configuration**:
+
+* The workflow provides a unique webhook URL—copy this and add it to your external system as the endpoint to call.
+* For POST requests, define the expected body structure so Twenty knows what data to expect. Add here the fields you will receive that will be needed below in your workflow.
+* Configure authentication (coming soon).
+
+## Choosing the Right Trigger
+
+| Use Case | Recommended Trigger |
+| --------------------------- | ---------------------------- |
+| New leads need processing | Record is Created |
+| Data changes need sync | Record is Updated |
+| Import/manual data handling | Record is Updated or Created |
+| Cleanup after deletion | Record is Deleted |
+| User-initiated action | Launch Manually |
+| Recurring reports | On a Schedule |
+| External integration | Webhook or On a Schedule |
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-versions.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-versions.mdx
new file mode 100644
index 0000000000..90dd74c73e
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/capabilities/workflow-versions.mdx
@@ -0,0 +1,85 @@
+---
+title: Workflow Versions
+description: Manage workflow versions and drafts.
+image: /images/user-guide/workflows/workflow.png
+---
+
+## About Versions
+
+Every time you activate a workflow, a new version is created. This allows you to track changes over time and revert to previous configurations if needed.
+
+## Version Statuses
+
+| Status | Description |
+| --------------- | -------------------------------------- |
+| **Draft** | Being edited, not yet published |
+| **Active** | Live version responding to triggers |
+| **Deactivated** | Previously active but manually stopped |
+| **Archived** | Past versions kept for history |
+
+## Working with Drafts
+
+When you edit an active workflow, your changes are saved as a **draft**. The active version continues to run while you work on updates.
+
+Once you're done editing, you can:
+
+* **Activate**: Publish the draft as the new active version (the previous version is archived)
+* **Discard**: Delete the draft and keep the current active version
+
+## Version History
+
+### Viewing Past Versions
+
+1. Open the workflow
+2. Click the **Versions** tab
+3. See all previous versions with timestamps
+
+### Restoring a Version
+
+1. Find the version you want to restore
+2. Click **Use as draft**
+3. The version is copied to a new draft
+4. Make any necessary updates
+5. Activate when ready
+
+## Best Practices
+
+### Version Management
+
+* Activate only when ready for production
+* Keep meaningful changes between versions
+* Document major changes in workflow names or descriptions
+* Test in draft mode before activating
+
+### Reverting Changes
+
+* If a new version causes issues, restore the previous version
+* Use the version history to track what changed
+* Always test restored versions before activating
+
+## Common Workflows
+
+### Quick Edit
+
+1. Make minor changes to an active workflow
+2. Test in draft mode
+3. Activate the new version
+
+### Major Revision
+
+1. Use the previous version as a starting point
+2. Make significant changes in draft
+3. Thoroughly test all scenarios
+4. Activate when confident
+
+### Rollback
+
+1. Identify the issue with the current version
+2. Find the last working version in history
+3. Click **Use as draft**
+4. Activate to restore the old behavior
+
+## Related
+
+* [Getting Started with Workflows](/l/pt/user-guide/workflows/overview)
+* [Workflow Runs](/l/pt/user-guide/workflows/capabilities/workflow-runs)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx
new file mode 100644
index 0000000000..bbc096202f
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx
@@ -0,0 +1,82 @@
+---
+title: Handle Arrays in Code Actions
+description: Learn how to properly handle array inputs in workflow Code actions.
+---
+
+When working with arrays in Code actions, you may encounter two common challenges:
+
+1. **Arrays passed as strings** — data from external systems or previous steps arrives as a string instead of an actual array
+2. **Can't select individual items** — you can only select the entire array, not specific fields within it
+
+Both can be solved with a Code node.
+
+## Parsing Arrays from Strings
+
+Arrays are often passed between workflow steps as strings or JSON rather than native arrays. This happens when:
+
+* Receiving data from external APIs via HTTP Request
+* Processing webhook payloads
+* Passing data between workflow steps
+
+**Solution**: Add this pattern at the start of your Code action:
+
+```javascript
+export const main = async (params: {
+ users: any;
+}): Promise => {
+ const { users } = params;
+
+ // Handle input that may come as a string or an array
+ const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;
+
+ // Now you can safely work with usersFormatted as an array
+ return {
+ users: usersFormatted.map((user) => ({
+ ...user,
+ activityStatus: String(user.activityStatus).toUpperCase(),
+ })),
+ };
+};
+```
+
+The key line `typeof users === "string" ? JSON.parse(users) : users` checks if the input is a string, parses it if needed, or uses it directly if it's already an array.
+
+## Extracting Individual Fields from Arrays
+
+A webhook might return an array like `answers: [...]`, but in subsequent workflow steps you can only select the **entire array** — not individual items within it.
+
+**Solution**: Add a Code node to extract specific fields and return them as a structured object:
+
+```javascript
+export const main = async (params: {
+ answers: any;
+}): Promise => {
+ const { answers } = params;
+
+ // Handle input that may come as a string or an array
+ const answersFormatted = typeof answers === "string"
+ ? JSON.parse(answers)
+ : answers;
+
+ // Extract specific fields from the array
+ const firstname = answersFormatted[0]?.text || "";
+ const name = answersFormatted[1]?.text || "";
+
+ return {
+ answer: {
+ firstname,
+ name
+ }
+ };
+};
+```
+
+The Code node returns a structured object instead of an array. In subsequent steps, you can now select individual fields like `answer.firstname` and `answer.name` from the variable picker.
+
+
+ We're actively working on making array handling easier in future updates.
+
+
+
+ Click the square icon at the top right of the code editor to display it in full screen — helpful since the default editor width is limited.
+
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx
new file mode 100644
index 0000000000..73edcdfc03
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx
@@ -0,0 +1,182 @@
+---
+title: Bring Product Data into Twenty
+description: Sync product catalog data from a data warehouse into your CRM on a schedule.
+---
+
+Use this pattern to keep Twenty in sync with product data from your data warehouse (e.g., Snowflake, BigQuery, PostgreSQL).
+
+## Workflow Structure
+
+1. **Trigger**: On a Schedule
+2. **Code**: Query your data warehouse
+3. **Code** (optional): Format data as array
+4. **Iterator**: Loop through each product
+5. **Upsert Record**: Create or update in Twenty
+
+
+
+## Step 1: Schedule the Trigger
+
+Set the workflow to run at a frequency matching your data freshness needs:
+
+* Every 5 minutes for near real-time sync
+* Every hour for less critical data
+* Daily for batch updates
+
+## Step 2: Query Your Data Warehouse
+
+Add a **Code** action to fetch recent data:
+
+```javascript
+export const main = async () => {
+ const intervalMinutes = 10; // Match your schedule frequency
+ const cutoffTime = new Date(Date.now() - intervalMinutes * 60 * 1000).toISOString();
+
+ // Replace with your actual data warehouse connection
+ const response = await fetch("https://your-warehouse-api.com/query", {
+ method: "POST",
+ headers: {
+ "Authorization": "Bearer YOUR_API_KEY",
+ "Content-Type": "application/json"
+ },
+ body: JSON.stringify({
+ query: `
+ SELECT id, name, sku, price, stock_quantity, updated_at
+ FROM products
+ WHERE updated_at >= '${cutoffTime}'
+ `
+ })
+ });
+
+ const data = await response.json();
+ return { products: data.results };
+};
+```
+
+
+ Filter by `updated_at >= last X minutes` to retrieve only recently changed records. This keeps the sync efficient.
+
+
+## Step 3: Format Data (Optional)
+
+If your warehouse returns data in a format that needs transformation, add another **Code** action. Common transformations include type conversions, field renaming, and data cleanup.
+
+### Example: User Data with Boolean and Status Fields
+
+```javascript
+export const main = async (params: {
+ users: any;
+}): Promise => {
+ const { users } = params;
+ const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;
+
+ // Convert string "true"/"false" to actual booleans
+ const toBool = (v: any) => v === true || v === "true";
+
+ return {
+ users: usersFormatted.map((user) => ({
+ ...user,
+ activityStatus: String(user.activityStatus).toUpperCase(),
+ isActiveLast30d: toBool(user.isActiveLast30d),
+ isActiveLast7d: toBool(user.isActiveLast7d),
+ isActiveLast24h: toBool(user.isActiveLast24h),
+ isTwenty: toBool(user.isTwenty),
+ })),
+ };
+};
+```
+
+### Example: Product Data with Type Conversions
+
+```javascript
+export const main = async (params: { products: any }) => {
+ const products = typeof params.products === "string"
+ ? JSON.parse(params.products)
+ : params.products;
+
+ return {
+ products: products.map(product => ({
+ externalId: product.id,
+ name: product.name,
+ sku: product.sku,
+ price: parseFloat(product.price), // String → Number
+ stockQuantity: parseInt(product.stock_quantity),
+ isActive: product.status === "active" // String → Boolean
+ }))
+ };
+};
+```
+
+### Example: Date and Currency Formatting
+
+```javascript
+export const main = async (params: { deals: any }) => {
+ const deals = typeof params.deals === "string"
+ ? JSON.parse(params.deals)
+ : params.deals;
+
+ return {
+ deals: deals.map(deal => ({
+ ...deal,
+ // Convert Unix timestamp to ISO date
+ closedAt: deal.closed_timestamp
+ ? new Date(deal.closed_timestamp * 1000).toISOString()
+ : null,
+ // Ensure amount is a number (remove currency symbols)
+ amount: parseFloat(String(deal.amount).replace(/[^0-9.-]/g, "")),
+ // Normalize stage names
+ stage: deal.stage?.toLowerCase().replace(/_/g, " ")
+ }))
+ };
+};
+```
+
+### Common Transformations
+
+| Source Format | Target Format | Code |
+| -------------------- | ---------------- | ---------------------------------------- |
+| `"true"` / `"false"` | `true` / `false` | `v === true \|\| v === "true"` |
+| `"123.45"` | `123.45` | `parseFloat(value)` |
+| `"active"` | `"ACTIVE"` | `value.toUpperCase()` |
+| `1704067200` (Unix) | ISO date | `new Date(v * 1000).toISOString()` |
+| `"$1,234.56"` | `1234.56` | `parseFloat(v.replace(/[^0-9.-]/g, ""))` |
+| `null` / `undefined` | `""` | `value \|\| ""` |
+
+## Step 4: Iterate Through Products
+
+Add an **Iterator** action:
+
+* Input: `{{code.products}}`
+
+This loops through each product in the array.
+
+## Step 5: Upsert Each Record
+
+Inside the iterator, add an **Upsert Record** action:
+
+| Setting | Value |
+| ------------ | -------------------------------------- |
+| **Object** | Your custom Product object |
+| **Match by** | External ID or SKU (unique identifier) |
+| **Name** | `{{iterator.item.name}}` |
+| **SKU** | `{{iterator.item.sku}}` |
+| **Price** | `{{iterator.item.price}}` |
+
+
+ Use **Upsert** (update or create) instead of building separate branches for create vs. update. It's faster to build and easier to debug.
+
+
+## Example Use Cases
+
+| Source | Data |
+| ----------------------- | ----------------------------------- |
+| **ERP system** | Product catalog, pricing, inventory |
+| **E-commerce platform** | Orders, customers, product updates |
+| **Data warehouse** | Aggregated metrics, enriched data |
+| **Inventory system** | Stock levels, reorder alerts |
+
+## Related
+
+* [Workflow Triggers](/l/pt/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions)
+* [Handle Arrays in Code Actions](/l/pt/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx
new file mode 100644
index 0000000000..7258e81dea
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx
@@ -0,0 +1,130 @@
+---
+title: Bring Typeform Submissions into Twenty
+description: Handle Typeform's webhook payload to create leads from form submissions.
+---
+
+For standard webhook setup, see [Set Up a Webhook Trigger](/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger). This article covers the specific handling required for Typeform's custom payload structure.
+
+### Step 1: Create a Webhook Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Select **Webhook** as the trigger
+4. Copy the webhook URL
+
+### Step 2: Configure Typeform
+
+1. In Typeform, open your form
+2. Go to **Connect → Webhooks**
+3. Paste your Twenty webhook URL
+4. Save
+
+### Step 3: Understand the Typeform Payload
+
+Typeform sends a nested JSON structure. Here's a simplified example:
+
+```json
+{
+ "event_type": "form_response",
+ "form_response": {
+ "form_id": "abc123",
+ "submitted_at": "2025-01-15T10:30:00Z",
+ "answers": [
+ {
+ "text": "Jane",
+ "type": "text",
+ "field": { "id": "field1", "type": "short_text", "title": "First Name" }
+ },
+ {
+ "text": "Smith",
+ "type": "text",
+ "field": { "id": "field2", "type": "short_text", "title": "Last Name" }
+ },
+ {
+ "text": "Acme Corp",
+ "type": "text",
+ "field": { "id": "field3", "type": "short_text", "title": "Company" }
+ },
+ {
+ "email": "jane@acme.com",
+ "type": "email",
+ "field": { "id": "field4", "type": "email", "title": "Email" }
+ },
+ {
+ "type": "choice",
+ "field": { "id": "field5", "type": "dropdown", "title": "Team Size" },
+ "choice": { "label": "10-50" }
+ }
+ ]
+ }
+}
+```
+
+Key things to note:
+
+* Form data is nested under `form_response`
+* **Answers are returned as an array**, not as named fields
+* Each answer includes the field type and title for reference
+
+### Step 4: Extract Fields from the Answers Array
+
+Since `answers` is an array, you can only select the entire array in subsequent steps — not individual fields. Add a **Code** action to extract the fields you need:
+
+```javascript
+export const main = async (params: {
+ answers: any;
+}): Promise => {
+ const { answers } = params;
+
+ // Handle input that may come as a string or an array
+ const answersFormatted = typeof answers === "string"
+ ? JSON.parse(answers)
+ : answers;
+
+ // Extract fields by position or by finding the field type
+ const firstName = answersFormatted[0]?.text || "";
+ const lastName = answersFormatted[1]?.text || "";
+ const company = answersFormatted[2]?.text || "";
+ const email = answersFormatted.find(a => a.type === "email")?.email || "";
+ const teamSize = answersFormatted.find(a => a.type === "choice")?.choice?.label || "";
+
+ return {
+ contact: {
+ firstName,
+ lastName,
+ company,
+ email,
+ teamSize
+ }
+ };
+};
+```
+
+Now in subsequent steps, you can select `contact.firstName`, `contact.email`, etc. from the variable picker.
+
+
+ For more details on handling arrays in Code actions, see [Handle Arrays in Code Actions](/l/pt/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
+
+
+### Step 5: Create the Record
+
+Add a **Create Record** action:
+
+| Field | Value |
+| -------------- | ---------------------------------------------------- |
+| **Object** | People |
+| **First Name** | `{{code.contact.firstName}}` |
+| **Last Name** | `{{code.contact.lastName}}` |
+| **Email** | `{{code.contact.email}}` |
+| **Company** | Search or create based on `{{code.contact.company}}` |
+
+### Step 6: Test and Activate
+
+1. Submit a test response in Typeform
+2. Check the workflow run to verify data was captured
+3. Activate the workflow
+
+## Related
+
+* [Set Up a Webhook Trigger](/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger)
+* [Handle Arrays in Code Actions](/l/pt/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx
new file mode 100644
index 0000000000..696ebfcecc
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx
@@ -0,0 +1,143 @@
+---
+title: Generate a Quote or Invoice from Twenty
+description: Automatically create invoices in external tools when deals close.
+---
+
+Automatically send deal data to your invoicing system (Stripe, QuickBooks, Xero, etc.) when an opportunity is won.
+
+## Workflow Structure
+
+1. **Trigger**: Record is Updated (Opportunity)
+2. **Filter**: Stage = Closed Won
+3. **Search Record**: Get Company details
+4. **Code** (optional): Format payload
+5. **HTTP Request**: Send to invoicing system
+
+## Step 1: Set Up the Trigger
+
+1. Create a new workflow
+2. Select **Record is Updated** trigger
+3. Choose **Opportunity** as the object
+
+## Step 2: Filter for Closed Won
+
+Add a **Filter** action to only continue when the deal is won:
+
+| Setting | Value |
+| ------------- | --------------------------------- |
+| **Field** | Stage |
+| **Condition** | Equals |
+| **Value** | `CLOSED_WON` (or your stage name) |
+
+
+ The trigger fires on any Opportunity update. The Filter ensures the workflow only continues when the stage changes to Closed Won.
+
+
+## Step 3: Get Company Details
+
+The Opportunity record may not include all Company fields you need for the invoice. Add a **Search Record** action:
+
+| Setting | Value |
+| ------------ | ---------------------------------------- |
+| **Object** | Company |
+| **Match by** | ID equals `{{trigger.object.companyId}}` |
+
+This retrieves the full Company record with billing address, tax ID, etc.
+
+## Step 4: Format the Payload (Optional)
+
+If your invoicing system expects a specific format, add a **Code** action:
+
+```javascript
+export const main = async (params: {
+ opportunity: any;
+ company: any;
+}): Promise => {
+ const { opportunity, company } = params;
+
+ return {
+ invoice: {
+ // Customer info from Company
+ customer_name: company.name,
+ customer_email: company.email || "",
+ billing_address: {
+ line1: company.address?.street || "",
+ city: company.address?.city || "",
+ postal_code: company.address?.postalCode || "",
+ country: company.address?.country || ""
+ },
+ tax_id: company.taxId || null,
+
+ // Invoice details from Opportunity
+ amount: opportunity.amount,
+ currency: opportunity.currency || "USD",
+ description: `Invoice for ${opportunity.name}`,
+ due_days: 30,
+
+ // Reference back to Twenty
+ metadata: {
+ opportunity_id: opportunity.id,
+ company_id: company.id
+ }
+ }
+ };
+};
+```
+
+## Step 5: Send to Invoicing System
+
+Add an **HTTP Request** action:
+
+| Setting | Value |
+| ----------- | ----------------------------------------- |
+| **Method** | POST |
+| **URL** | Your invoicing API endpoint |
+| **Headers** | `Authorization: Bearer YOUR_API_KEY` |
+| **Body** | `{{code.invoice}}` or map fields directly |
+
+### Example: Stripe Invoice
+
+```
+POST https://api.stripe.com/v1/invoices
+Headers:
+ Authorization: Bearer sk_live_xxx
+ Content-Type: application/x-www-form-urlencoded
+
+Body:
+ customer: {{company.stripeCustomerId}}
+ collection_method: send_invoice
+ days_until_due: 30
+```
+
+### Example: QuickBooks Invoice
+
+```
+POST https://quickbooks.api.intuit.com/v3/company/{realmId}/invoice
+Headers:
+ Authorization: Bearer YOUR_ACCESS_TOKEN
+ Content-Type: application/json
+
+Body: {{code.invoice}}
+```
+
+## Complete Workflow Summary
+
+| Step | Action | Purpose |
+| ---- | ----------------------- | ------------------------------------ |
+| 1 | Trigger: Record Updated | Fires when any Opportunity changes |
+| 2 | Filter | Only proceed if Stage = Closed Won |
+| 3 | Search Record | Get full Company details for billing |
+| 4 | Code | Format data for invoicing API |
+| 5 | HTTP Request | Create invoice in external system |
+
+## Tips
+
+* **Store external IDs**: Save the invoice ID returned by the API back to the Opportunity using an **Update Record** action
+* **Error handling**: Add a branch to send a notification if the HTTP request fails
+* **Test first**: Use your invoicing system's sandbox/test mode before going live
+
+## Related
+
+* [Workflow Triggers](/l/pt/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions)
+* [Closed Won Automations](/l/pt/user-guide/workflows/how-tos/crm-automations/closed-won-automations)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx
new file mode 100644
index 0000000000..547a48e4f4
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx
@@ -0,0 +1,171 @@
+---
+title: Set Up a Webhook Trigger
+description: Receive data from external services to trigger workflows.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Webhook triggers allow external services to start your workflows by sending data to a unique URL. Use them to connect forms, third-party apps, and custom integrations.
+
+## When to Use Webhooks
+
+| Use Case | Example |
+| ----------------------- | --------------------------------------- |
+| **Web forms** | Contact form submissions create leads |
+| **Third-party apps** | Stripe payment → create customer record |
+| **Custom integrations** | Your app → Twenty automation |
+| **No-code tools** | Zapier, Make, n8n connections |
+
+## Step-by-Step Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it (e.g., "Website Form Submission")
+
+### Step 2: Configure the Webhook Trigger
+
+1. Click on the trigger block
+2. Select **Webhook**
+3. You'll receive a unique webhook URL like:
+ ```
+ https://api.twenty.com/webhooks/workflow/abc123...
+ ```
+4. Copy this URL—you'll need it for your external service
+
+### Step 3: Define Expected Data Structure
+
+For **POST** requests, define the expected body structure:
+
+1. Click **Define expected body**
+2. Enter a sample JSON that matches what your service will send:
+
+```json
+{
+ "firstName": "John",
+ "lastName": "Doe",
+ "email": "john@example.com",
+ "company": "Acme Inc",
+ "message": "Interested in your product"
+}
+```
+
+3. Click **Save**—this creates variables you can use in subsequent steps
+
+### Step 4: Add Actions
+
+Now add actions that use the webhook data:
+
+**Example: Create a Person record**
+
+1. Add **Create Record** action
+2. Select **People** object
+3. Map fields:
+
+| Field | Value |
+| ---------- | ---------------------------------------------------- |
+| First Name | `{{trigger.body.firstName}}` |
+| Last Name | `{{trigger.body.lastName}}` |
+| Email | `{{trigger.body.email}}` |
+| Company | Search or create based on `{{trigger.body.company}}` |
+
+### Step 5: Test the Webhook
+
+Before activating, test your webhook:
+
+**Using cURL**:
+
+```bash
+curl -X POST https://api.twenty.com/webhooks/workflow/abc123... \
+ -H "Content-Type: application/json" \
+ -d '{"firstName":"Test","lastName":"User","email":"test@example.com"}'
+```
+
+**Using Postman or similar**:
+
+1. Create a POST request to your webhook URL
+2. Set Content-Type header to `application/json`
+3. Add your test JSON body
+4. Send and check workflow runs
+
+### Step 6: Activate
+
+Once tested, click **Activate** to make the workflow live.
+
+## Handling Different Data Structures
+
+### Nested Data
+
+If your webhook sends nested data:
+
+```json
+{
+ "contact": {
+ "name": "John Doe",
+ "email": "john@example.com"
+ },
+ "source": "website"
+}
+```
+
+Reference with: `{{trigger.body.contact.email}}`
+
+### Arrays
+
+If data includes arrays:
+
+```json
+{
+ "items": [
+ {"name": "Product A", "qty": 2},
+ {"name": "Product B", "qty": 1}
+ ]
+}
+```
+
+How you handle arrays depends on your use case:
+
+**Unknown number of items → Use Iterator**
+
+If you need to process each item in the array (e.g., create a record for each), add a **Code** action to parse the array, then use **Iterator**:
+
+```javascript
+export const main = async (params: { items: any }) => {
+ const items = typeof params.items === "string"
+ ? JSON.parse(params.items)
+ : params.items;
+ return { items };
+};
+```
+
+Then use Iterator to loop through: `{{code.items}}`
+
+**Known/specific fields → Extract to named fields**
+
+If the array contains specific fields you want to access individually (e.g., form answers where position 0 is always "first name", position 1 is always "last name"), add a **Code** action to extract them:
+
+```javascript
+export const main = async (params: { items: any }) => {
+ const items = typeof params.items === "string"
+ ? JSON.parse(params.items)
+ : params.items;
+
+ return {
+ product: {
+ name: items[0]?.name || "",
+ qty: items[0]?.qty || 0
+ }
+ };
+};
+```
+
+Now you can select `product.name` and `product.qty` individually in subsequent steps.
+
+
+ For more details on handling arrays, see [Handle Arrays in Code Actions](/l/pt/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
+
+
+## Related
+
+* [Workflow Triggers](/l/pt/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx
new file mode 100644
index 0000000000..8f36dc82c5
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx
@@ -0,0 +1,179 @@
+---
+title: Closed Won Automations
+description: Automate post-win activities when opportunities close.
+---
+
+When a deal closes, multiple things need to happen: update company status, notify team members, create onboarding tasks. Automate all of this with a single workflow.
+
+## The Problem
+
+When an opportunity moves to "Closed Won":
+
+* Company type needs to change from "Prospect" to "Customer"
+* Onboarding tasks need to be created
+* Customer success team needs to be notified
+* Sales rep needs confirmation
+
+Doing this manually is time-consuming and error-prone.
+
+## The Solution
+
+Create a workflow that handles all post-win activities automatically.
+
+## Complete Workflow Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it "Deal Won - Post-Win Automation"
+
+### Step 2: Configure the Trigger
+
+1. Select **Record is Updated**
+2. Choose **Opportunities**
+3. Under "Fields to monitor", select **Stage**
+
+### Step 3: Add Stage Filter
+
+1. Add **Filter** action
+2. Condition: `{{trigger.object.stage}}` equals "Closed Won"
+
+### Step 4: Update Company Type
+
+1. Add **Update Record** action
+2. Configure:
+
+| Field | Value |
+| ------------------- | ------------------------------- |
+| **Object** | Companies |
+| **Record** | `{{trigger.object.company.id}}` |
+| **Type** | Customer |
+| **First Deal Date** | `{{trigger.object.closedAt}}` |
+| **Account Owner** | `{{trigger.object.owner.id}}` |
+
+### Step 5: Create Onboarding Task
+
+1. Add **Create Record** action
+2. Configure:
+
+| Field | Value |
+| ----------------------- | ---------------------------------------------------------------------------------------------------- |
+| **Object** | Tasks |
+| **Title** | `Onboarding: {{trigger.object.name}}` |
+| **Assignee** | Customer Success team member |
+| **Due Date** | 3 days from now |
+| **Priority** | High |
+| **Related Company** | `{{trigger.object.company.id}}` |
+| **Related Opportunity** | `{{trigger.object.id}}` |
+| **Description** | `New customer onboarding for {{trigger.object.company.name}}. Deal value: {{trigger.object.amount}}` |
+
+### Step 6: Notify Customer Success
+
+1. Add **Send Email** action
+2. Configure:
+
+| Field | Value |
+| ----------- | -------------------------------------------------- |
+| **To** | customer-success@yourcompany.com |
+| **Subject** | `🎉 New Customer: {{trigger.object.company.name}}` |
+| **Body** | See example below |
+
+**Email body example**:
+
+```
+Hi CS Team,
+
+We have a new customer!
+
+Company: {{trigger.object.company.name}}
+Deal: {{trigger.object.name}}
+Value: {{trigger.object.amount}}
+Sales Rep: {{trigger.object.owner.name}}
+Close Date: {{trigger.object.closedAt}}
+
+An onboarding task has been created automatically.
+
+Let's give them a great start!
+```
+
+### Step 7: Confirm to Sales Rep
+
+1. Add another **Send Email** action
+2. Configure:
+
+| Field | Value |
+| ----------- | -------------------------------------------------------------------------------------------------------------------- |
+| **To** | `{{trigger.object.owner.email}}` |
+| **Subject** | `✅ Deal Closed: {{trigger.object.name}}` |
+| **Body** | Congratulations! Your deal has been processed. The customer success team has been notified and onboarding has begun. |
+
+### Step 8: Test and Activate
+
+1. Test by moving a test opportunity to "Closed Won"
+2. Verify:
+ * Company type changed to "Customer"
+ * Onboarding task created
+ * CS team received email
+ * Sales rep received confirmation
+3. Activate when ready
+
+## Handling Closed Lost
+
+Create a similar workflow for lost deals:
+
+### Trigger
+
+* Record is Updated (Opportunities, Stage = "Closed Lost")
+
+### Actions
+
+1. **Create Record**: Task for "Lost Deal Analysis"
+2. **Update Record**: Add lost reason to company record
+3. **Send Email**: Notify manager of lost deal
+
+## Advanced: Multi-Step Onboarding
+
+For complex onboarding, create multiple tasks:
+
+```javascript
+export const main = async (params) => {
+ const tasks = [
+ { title: "Welcome call", daysFromNow: 1, assignee: "CS" },
+ { title: "Send onboarding materials", daysFromNow: 2, assignee: "CS" },
+ { title: "Technical setup", daysFromNow: 5, assignee: "Support" },
+ { title: "30-day check-in", daysFromNow: 30, assignee: "CS" }
+ ];
+
+ return { tasks };
+};
+```
+
+Use **Iterator** to create each task from the array.
+
+## Customization Ideas
+
+### Keep your other tools up-to-date
+
+* Create customer in billing system with an **HTTP Request**
+
+### Conditional Actions
+
+Use **Filter** actions to:
+
+* Different onboarding for enterprise vs SMB
+* Different assignees based on region
+* Skip notifications for small deals
+
+### Include Deal Details
+
+Use **Code** action to format:
+
+* Deal summary documents
+* Handoff notes for CS team
+* Custom onboarding checklists
+
+## Related
+
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/pt/user-guide/workflows/capabilities/send-emails-from-workflows)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx
new file mode 100644
index 0000000000..e8369fc9ff
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx
@@ -0,0 +1,136 @@
+---
+title: Detect Stale Opportunities
+description: Automatically notify managers when opportunities haven't been updated.
+---
+
+Keep your pipeline healthy by alerting managers when opportunities go stale. This workflow checks for opportunities that haven't been updated in a specified number of days.
+
+## The Problem
+
+Opportunities sitting without updates lead to:
+
+* Deals going cold
+* Unreliable forecasts
+* Lost revenue
+
+## The Solution
+
+Create a scheduled workflow that finds stale opportunities and emails their managers.
+
+## Step-by-Step Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it "Stale Opportunity Alert"
+
+### Step 2: Configure the Trigger
+
+1. Select **On a Schedule**
+2. Set to run daily (e.g., every day at 8 AM)
+
+### Step 3: Search for Stale Opportunities
+
+1. Add **Search Records** action
+2. Configure:
+
+| Field | Value |
+| ---------- | ----------------------------------------------- |
+| **Object** | Opportunities |
+| **Filter** | Updated At is before (today - 7 days) |
+| **Filter** | Stage is not "Closed Won" AND not "Closed Lost" |
+| **Limit** | 100 |
+
+### Step 4: Check If Any Found
+
+1. Add **Filter** action
+2. Condition: `{{searchRecords.length}}` is greater than 0
+3. If no stale opportunities, the workflow stops here
+
+### Step 5: Format the Alert (Code Action)
+
+Add a **Code** action to format the email:
+
+```javascript
+export const main = async (params) => {
+ const opportunities = params.opportunities;
+
+ // Group opportunities by owner
+ const byOwner = {};
+ opportunities.forEach(opp => {
+ const ownerEmail = opp.owner?.email || 'unassigned';
+ if (!byOwner[ownerEmail]) {
+ byOwner[ownerEmail] = [];
+ }
+ byOwner[ownerEmail].push({
+ name: opp.name,
+ amount: opp.amount,
+ lastUpdated: opp.updatedAt,
+ stage: opp.stage
+ });
+ });
+
+ // Format summary for manager
+ let summary = "Stale Opportunities Report\n\n";
+ Object.entries(byOwner).forEach(([owner, opps]) => {
+ summary += `${owner}: ${opps.length} stale opportunities\n`;
+ opps.forEach(opp => {
+ summary += ` - ${opp.name} (${opp.stage})\n`;
+ });
+ summary += "\n";
+ });
+
+ return {
+ summary,
+ totalCount: opportunities.length
+ };
+};
+```
+
+### Step 6: Send Alert Email
+
+Add **Send Email** action:
+
+| Field | Value |
+| ----------- | ----------------------------------------------------------- |
+| **To** | sales-manager@yourcompany.com |
+| **Subject** | `🚨 {{code.totalCount}} Stale Opportunities Need Attention` |
+| **Body** | `{{code.summary}}` |
+
+### Step 7: Test and Activate
+
+1. Click **Test** to run the workflow
+2. Check that the email contains the right data
+3. Activate when ready
+
+## Customization Options
+
+### Change Staleness Threshold
+
+Modify the Search Records filter to change from 7 days to your preferred period:
+
+* 3 days for high-velocity sales
+* 14 days for enterprise deals
+* 30 days for long sales cycles
+
+### Alert Individual Reps
+
+Instead of one manager email, use **Iterator** to send personalized emails to each rep about their own stale deals.
+
+### Add Escalation
+
+Create multiple workflows with increasing severity:
+
+1. Day 7: Email to rep
+2. Day 14: Email to rep + manager
+3. Day 21: Create task for manager to intervene
+
+### Include in Slack
+
+Use **HTTP Request** to post to a Slack webhook instead of or in addition to email.
+
+## Related
+
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/pt/user-guide/workflows/capabilities/send-emails-from-workflows)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
new file mode 100644
index 0000000000..b7ff6ea725
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
@@ -0,0 +1,74 @@
+---
+title: Display Number of Emails Received
+description: Create a workflow to automatically count and display the number of emails received from each contact.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+## Overview
+
+This workflow triggers every time a new email is received and updates a custom field on the Person record with the total count of emails from that sender.
+
+## Prerequisites
+
+Before setting up this workflow, create a custom field on the **People** object:
+
+1. Go to **Settings → Data Model → People**
+2. Add a new **Number** field
+3. Name it something like "Number of emails received from this person"
+
+## Step-by-Step Setup
+
+
+
+### Step 1: Configure the Trigger
+
+1. Go to **Workflows** and create a new workflow
+2. Select **Record is Created** as the trigger
+3. Choose **Message Participants** (available under Advanced objects)
+
+
+ A Message Participant is a combination of a message ID and a person ID, creating one unique record per message. This is easier to track than Messages directly because we can access the `handle` field, which contains the sender's (or recipient's) email address.
+
+
+### Step 2: Filter on Role
+
+1. Add a **Filter** action
+2. Set the condition: **Role** equals **FROM**
+
+This ensures you only count messages sent by this person, not messages sent to them.
+
+### Step 3: Search All Message Participants with Same Handle
+
+1. Add a **Search Records** action
+2. Select **Message Participants** as the object
+3. Add filters: **Handle** equals the handle from the trigger (the sender's email address) and **Role** equals **FROM**
+4. Increase the **Limit** from 1 to **200** (the maximum)
+
+This finds all messages from this email address to get the total count.
+
+
+ The Search Records action is limited to returning 200 records maximum. However, since you're only using the `totalCount` value (not the individual records), this step will return the total number of emails sent by this person.
+
+
+### Step 4: Update the Person Record with a Create or Update Record action
+
+1. Add a **Create or Update Record** action
+
+
+ Use **Upsert Record** instead of **Update Record** here. This lets you identify the person by their email address (the `handle` field) rather than requiring a record ID from a previous step.
+
+
+2. Select **People** as the object
+3. Find the person by matching their email to the `handle` from the Message Participant
+4. Set your custom "Number of emails received" field to `{{searchRecords.totalCount}}`
+
+The `totalCount` value from the Search Records action represents the total number of emails received from this person.
+
+## Related
+
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions)
+* [Create Custom Fields](/l/pt/user-guide/data-model/how-tos/customize-your-data-model)
+* [Search Records Action](/l/pt/user-guide/workflows/capabilities/workflow-actions#search-records)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx
new file mode 100644
index 0000000000..e6a5d9af9b
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx
@@ -0,0 +1,170 @@
+---
+title: Display Related Record Data
+description: Show data from related records (e.g., Company info on Opportunities) using workflows.
+---
+
+Display data from related records directly on your records — for example, show the employee count from a Company on its Opportunities. This workflow workaround is useful until nested fields are natively available.
+
+## Common Use Cases
+
+| Source | Destination | Fields to Copy |
+| ----------- | ----------- | ------------------------------- |
+| Company | Opportunity | Industry, Company Size, ARR |
+| Person | Opportunity | Email, Phone, Title |
+| Opportunity | Company | Last Deal Amount, Last Won Date |
+
+## Basic Field Copy
+
+### Example: Copy Contact Email to Opportunity
+
+**Goal**: When setting a Point of Contact on an opportunity, copy their email to the opportunity for easy access.
+
+### Prerequisite
+
+Create the destination fields in **Settings → Data Model → Opportunities** before building the workflow:
+
+* Contact Email (type: Email)
+* Contact Phone (type: Phone)
+
+### Setup
+
+1. **Trigger**: Record is Updated (Opportunities, Point of Contact field)
+
+2. **Filter**: Check that Point of Contact is not empty
+
+3. **Search Records**: Find the linked person
+ * Object: People
+ * Filter: ID equals `{{trigger.object.pointOfContact.id}}`
+
+4. **Update Record**:
+ * Object: Opportunities
+ * Record: `{{trigger.object.id}}`
+ * Contact Email: `{{searchRecords[0].email}}`
+ * Contact Phone: `{{searchRecords[0].phone}}`
+
+## Copy Multiple Fields
+
+### Example: Sync Company Info to All Related Opportunities
+
+**Goal**: When company details change, update all related opportunities.
+
+### Setup
+
+1. **Trigger**: Record is Updated (Companies)
+ * Fields: Industry, Company Size, Annual Revenue
+
+2. **Search Records**: Find all opportunities for this company
+ * Object: Opportunities
+ * Filter: Company ID equals `{{trigger.object.id}}`
+
+3. **Iterator**: Loop through each opportunity
+
+4. **Update Record** (inside iterator):
+ * Object: Opportunities
+ * Record: `{{iterator.currentItem.id}}`
+ * Company Industry: `{{trigger.object.industry}}`
+ * Company Size: `{{trigger.object.companySize}}`
+ * Company ARR: `{{trigger.object.annualRevenue}}`
+
+## Copy on Record Creation
+
+### Example: Pre-fill Opportunity with Company Data
+
+**Goal**: When creating an opportunity linked to a company, automatically copy key company info.
+
+### Prerequisite
+
+Create the destination fields in **Settings → Data Model → Opportunities**:
+
+* Company Industry (type: Text)
+* Company Size (type: Number)
+
+### Setup
+
+1. **Trigger**: Record is Created (Opportunities)
+ * Filter: Company is not empty
+
+2. **Search Records**: Get the linked company's details
+ * Object: Companies
+ * Filter: ID equals `{{trigger.object.company.id}}`
+
+3. **Update Record**:
+ * Object: Opportunities
+ * Record: `{{trigger.object.id}}`
+ * Company Industry: `{{searchRecords[0].industry}}`
+ * Company Size: `{{searchRecords[0].employees}}`
+
+
+ **Tasks and Notes limitation**: Relations on Tasks and Notes are hardcoded as many-to-many and are not yet available in workflow triggers or actions. To access these relations, use the [API](/l/pt/developers/extend/capabilities/apis) instead.
+
+
+## Bidirectional Sync
+
+### Example: Keep Primary Contact in Sync
+
+**Goal**: When a company's primary contact changes, update the contact. When a person becomes primary, update the company.
+
+### Workflow 1: Company → Person
+
+1. **Trigger**: Record is Updated (Companies, Primary Contact field)
+2. **Update Record**: Set person's "Is Primary Contact" to true
+3. **Search Records**: Find previous primary contact
+4. **Update Record**: Set previous contact's "Is Primary Contact" to false
+
+### Workflow 2: Person → Company
+
+1. **Trigger**: Record is Updated (People, Is Primary Contact = true)
+2. **Update Record**: Set company's Primary Contact to this person
+
+
+ Be careful with bidirectional syncs to avoid infinite loops. Use filters to check if the value actually changed before updating.
+
+
+## Using Code for Complex Mapping
+
+### Example: Transform Data During Copy
+
+**Goal**: Copy and format phone number from person to opportunity.
+
+```javascript
+export const main = async (params) => {
+ const { phone } = params;
+
+ if (!phone) return { formattedPhone: null };
+
+ // Remove non-numeric characters
+ const digits = phone.replace(/\D/g, '');
+
+ // Format as (XXX) XXX-XXXX
+ const formatted = digits.length === 10
+ ? `(${digits.slice(0,3)}) ${digits.slice(3,6)}-${digits.slice(6)}`
+ : phone;
+
+ return { formattedPhone: formatted };
+};
+```
+
+## Best Practices
+
+### Avoid Loops
+
+* Don't create workflows that trigger each other endlessly
+* Use specific field conditions
+* Add checks to see if value actually changed
+
+### Handle Missing Data
+
+* Always check if source record exists before copying
+* Provide default values for optional fields
+* Use filters to skip when source field is empty
+
+### Performance
+
+* Batch updates when copying to many records
+* Use scheduled workflows for bulk sync operations
+* Consider using Iterator for multiple record updates
+
+## Related
+
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions)
+* [Workflow Triggers](/l/pt/user-guide/workflows/capabilities/workflow-triggers)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx
new file mode 100644
index 0000000000..248c9faf55
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx
@@ -0,0 +1,202 @@
+---
+title: Formula Fields
+description: Create formula fields using workflows until native support is available.
+---
+
+Twenty doesn't yet support native formula fields yet (coming in 2026), but you can achieve the same result using workflows. This workaround lets you automatically calculate and populate field values—from simple concatenations to complex business logic.
+
+## Common Use Cases
+
+| Use Case | Formula Example |
+| ------------------- | --------------------------------- |
+| **Full name** | First Name + " " + Last Name |
+| **Expected amount** | Amount × Probability |
+| **Days until due** | Due Date - Today |
+| **Days in stage** | Today - Stage Entry Date |
+| **Lead score** | Points based on multiple criteria |
+
+
+ For a complete example of tracking time in pipeline stages, see [Track How Long Opportunities Stay in Each Stage](/l/pt/user-guide/views-pipelines/how-tos/track-time-in-stage).
+
+
+## Basic Formula: Concatenation
+
+### Example: Auto-Fill Full Name
+
+**Goal**: Automatically combine first and last name into a full name field.
+
+### Setup
+
+1. **Trigger**: Record is Updated or Created (People)
+
+2. **Filter**: Check that first name or last name changed
+
+3. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { firstName, lastName } = params;
+
+ const fullName = [firstName, lastName]
+ .filter(Boolean)
+ .join(' ');
+
+ return { fullName };
+};
+```
+
+4. **Update Record**: Set Full Name to `{{code.fullName}}`
+
+## Numeric Formula: Expected Amount
+
+### Example: Calculate Expected Revenue
+
+**Goal**: Multiply opportunity amount by probability to get expected amount.
+
+See [How to Show Expected Amount in Pipeline](/l/pt/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline) for the complete workflow.
+
+### Quick Setup
+
+1. **Trigger**: Record is Updated (Opportunities, Amount OR Probability field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { amount, probability } = params;
+
+ const expectedAmount = (amount || 0) * (probability || 0) / 100;
+
+ return { expectedAmount };
+};
+```
+
+3. **Update Record**: Set Expected Amount to `{{code.expectedAmount}}`
+
+## Date Formula: Days Calculation
+
+### Example: Days Until Task Due
+
+**Goal**: Calculate how many days remain until a task's due date.
+
+### Setup
+
+1. **Trigger**: Record is Updated or Created (Tasks, Due Date field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { dueDate } = params;
+
+ if (!dueDate) {
+ return { daysUntilDue: null };
+ }
+
+ const due = new Date(dueDate);
+ const today = new Date();
+ const diffTime = due - today;
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return { daysUntilDue: diffDays };
+};
+```
+
+3. **Update Record**: Set Days Until Due to `{{code.daysUntilDue}}`
+
+
+ Negative values indicate overdue tasks. You can use this field to filter or sort tasks by urgency.
+
+
+## Conditional Formula: Lead Score
+
+### Example: Calculate Lead Score Based on Criteria
+
+**Goal**: Score leads based on company size, industry, and engagement.
+
+### Setup
+
+1. **Trigger**: Record is Updated (People or Companies)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { companySize, industry, hasEmail, hasPhone, source } = params;
+
+ let score = 0;
+
+ // Company size scoring
+ if (companySize === 'Enterprise') score += 30;
+ else if (companySize === 'Mid-Market') score += 20;
+ else if (companySize === 'SMB') score += 10;
+
+ // Industry scoring
+ const targetIndustries = ['Technology', 'Finance', 'Healthcare'];
+ if (targetIndustries.includes(industry)) score += 25;
+
+ // Contact info scoring
+ if (hasEmail) score += 10;
+ if (hasPhone) score += 15;
+
+ // Source scoring
+ if (source === 'Referral') score += 20;
+ else if (source === 'Website') score += 10;
+
+ return { leadScore: score };
+};
+```
+
+3. **Update Record**: Set Lead Score to `{{code.leadScore}}`
+
+## Text Formula: Domain Extraction
+
+### Example: Extract Domain from Email
+
+**Goal**: Automatically extract and store the email domain.
+
+### Setup
+
+1. **Trigger**: Record is Updated (People, Email field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { email } = params;
+
+ if (!email) return { domain: null };
+
+ const domain = email.split('@')[1]?.toLowerCase();
+
+ return { domain };
+};
+```
+
+3. **Update Record**: Set Domain field to `{{code.domain}}`
+
+## Best Practices
+
+### Performance
+
+* Only trigger on relevant field changes
+* Use filters to skip records that don't need calculation
+* Avoid complex calculations in high-volume workflows
+
+### Error Handling
+
+* Check for null/undefined values before calculations
+* Use default values when data is missing
+* Return clear error messages when calculations fail
+
+### Testing
+
+* Test with edge cases (empty fields, zero values)
+* Verify calculations manually before activating
+* Monitor workflow runs for unexpected results
+
+## Related
+
+* [How to Show Expected Amount in Pipeline](/l/pt/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline)
+* [How to Track Time in Stage](/l/pt/user-guide/views-pipelines/how-tos/track-time-in-stage)
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
new file mode 100644
index 0000000000..b9b0b6d2fb
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
@@ -0,0 +1,106 @@
+---
+title: Send Email Alerts with Tasks Due
+description: Automatically notify team members about their upcoming or overdue tasks.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+Send daily email reminders to each team member about their tasks due today.
+
+## Overview
+
+This workflow runs on a schedule and:
+
+1. Fetches all workspace members
+2. Loops through each member
+3. Finds their tasks due today
+4. Formats and sends a personalized email
+
+## Step-by-Step Setup
+
+
+
+### Step 1: Configure the Trigger
+
+1. Go to **Settings → Workflows** and create a new workflow
+2. Select **On a Schedule** as the trigger
+3. Use a cron expression for daily at 8:00 AM: `0 8 * * *`
+
+### Step 2: Search for All Workspace Members
+
+1. Add a **Search Records** action
+2. Select **Workspace Members** (under advanced objects)
+3. No filters needed — this returns all members
+
+### Step 3: Add an Iterator
+
+1. Add an **Iterator** action
+2. Set the input array to the workspace members from the previous step
+3. All actions inside the iterator will run once per member
+
+### Step 4: Search for Tasks Due Today (Inside Iterator)
+
+1. Inside the iterator, add a **Search Records** action
+2. Select **Tasks** as the object
+3. Add filters:
+ * **Assignee** = current workspace member (from the iterator)
+ * **Due Date** = today
+
+### Step 5: Format Tasks into Email Body (Inside Iterator)
+
+Add a **Code** action to format the tasks into a readable list with links:
+
+```javascript
+export const main = async (params: {
+ tasksDue?: Array<{ id: string; title: string }> | null | string;
+}) => {
+ const tasksDue =
+ typeof params.tasksDue === "string"
+ ? JSON.parse(params.tasksDue)
+ : params.tasksDue;
+
+ if (!Array.isArray(tasksDue) || tasksDue.length === 0) {
+ return {
+ formattedTasks: "No tasks due today."
+ };
+ }
+
+ const formattedTasks = tasksDue
+ .map(
+ t =>
+ `${t.title}\nhttps://yourSubDomain.twenty.com/object/task/${t.id}`
+ )
+ .join("\n\n");
+
+ return { formattedTasks };
+};
+```
+
+
+ Replace `yourSubDomain` with your actual Twenty workspace subdomain.
+
+
+### Step 6: Send Email (Inside Iterator)
+
+1. Add a **Send Email** action (still inside the iterator)
+2. Configure:
+
+| Field | Value |
+| ----------- | --------------------------------------------------------------- |
+| **To** | `{{iterator.currentItem.userEmail}}` (workspace member's email) |
+| **Subject** | Your Tasks Due Today |
+| **Body** | `{{code.formattedTasks}}` |
+
+### Step 7: Test and Activate
+
+1. Click **Test** to run the workflow manually
+2. Check inboxes for the emails
+3. Activate the workflow
+
+## Related
+
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/pt/user-guide/workflows/capabilities/send-emails-from-workflows)
+* [Handle Arrays in Code Actions](/l/pt/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/need-more-help/professional-services.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
new file mode 100644
index 0000000000..674ca6229f
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
@@ -0,0 +1,29 @@
+---
+title: Professional Services
+description: Get professional help building complex workflows and automations from Twenty's team and certified partners.
+---
+
+## When Do You Need Professional Help?
+
+Consider professional services for:
+
+* Complex multi-system integrations
+* Advanced business logic and automation rules
+* Large-scale data processing workflows
+* Custom API development
+* Team training and workflow optimization
+* When you don't have internal resources
+
+## Service Options
+
+### Onboarding Packs
+
+Get help from our core team with our 4-hour [Onboarding packs](https://twenty.com/onboarding-packages):
+
+* **Workflow Creation**: Build custom workflows for your business processes
+* **Data Model Design**: Optimize your data structure for workflow automation
+* **Data Migration**: Import existing data with proper workflow integration
+
+### Implementation Partners
+
+Work with certified partners for advanced customizations. Contact us at contact@twenty.com to connect with our [implementation partners](https://twenty.com/partners).
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx
new file mode 100644
index 0000000000..b243fc4acb
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx
@@ -0,0 +1,170 @@
+---
+title: Workflow Troubleshooting
+description: Common workflow issues and how to resolve them.
+---
+
+## Common Issues and Solutions
+
+### Workflow Not Triggering
+
+**Symptoms**: Your workflow doesn't run when you expect it to.
+
+**Possible Causes**:
+
+1. **Workflow not activated**: Ensure the workflow is set to "Active" not "Draft"
+2. **Trigger conditions not met**: Verify the trigger matches your expected event
+3. **Field not monitored**: For "Record is Updated" triggers, ensure the specific field is being watched
+4. **Permissions**: Check you have permission to run workflows
+
+**Solutions**:
+
+* Verify workflow status in the workflow list
+* Test with the specific action you expect to trigger it
+* Review trigger configuration
+* Contact your admin about permissions
+
+### Workflow Triggers Too Early (Empty Fields)
+
+**Symptoms**: When manually creating a record in the UI, your workflow triggers before you've had time to fill in all the fields. The workflow runs with mostly empty field values.
+
+**Why this happens**: Twenty saves everything in real-time — there's no separate "edit" vs "read" mode. When you create a record, it's saved immediately, triggering the "Record is created" event before you can fill in additional fields.
+
+**When "Record is created" works well**:
+
+* Records created via API calls (fields are populated in a single request)
+* Records created via import
+* Automated record creation from other workflows
+
+**Solution**: For records created manually in the UI, use **"Record is created or updated"** as your trigger instead. This way:
+
+* The workflow triggers after the user has finished filling in and saving the fields
+* You get the complete data rather than empty values
+
+
+ If you only want the workflow to run once per record, add a Filter action to check a field like `createdAt equals updatedAt` (first save) or use a custom checkbox field to track if the workflow has already run.
+
+
+### Actions Failing
+
+**Symptoms**: Workflow runs but some actions fail.
+
+**Possible Causes**:
+
+1. **Missing data**: Required fields are empty
+2. **Invalid references**: Variables from previous steps don't exist
+3. **API errors**: External services returning errors
+4. **Permission issues**: Action requires permissions you don't have
+
+**Solutions**:
+
+* Check the workflow run details for error messages
+* Verify all required fields have values
+* Test API connections independently
+* Review role permissions
+
+### HTTP Request Errors
+
+**Symptoms**: HTTP Request actions fail or return unexpected results.
+
+**Common Error Codes**:
+
+* **400**: Bad request - check your request body format
+* **401**: Unauthorized - verify API key
+* **403**: Forbidden - check API permissions
+* **404**: Not found - verify endpoint URL
+* **429**: Too many requests - implement rate limiting
+* **500**: Server error - external service issue
+
+**Solutions**:
+
+* Verify API endpoint URL
+* Check authentication headers
+* Test the API call outside of Twenty first
+* Add error handling in Code actions
+
+### Code Action Errors
+
+**Symptoms**: JavaScript code fails to execute.
+
+**Common Issues**:
+
+1. **Syntax errors**: Typos or invalid JavaScript
+2. **Undefined variables**: Referencing variables that don't exist
+3. **Type errors**: Operations on wrong data types
+4. **Timeouts**: Code taking too long to execute
+
+**Solutions**:
+
+* Use the built-in code editor validation
+* Test code logic in a JavaScript console first
+* Add console.log statements for debugging
+* Simplify complex operations
+
+### Email Not Sending
+
+**Symptoms**: Send Email action doesn't deliver emails.
+
+**Possible Causes**:
+
+1. **No email account connected**: Check Settings → Accounts
+2. **Invalid email address**: Recipient email is malformed
+3. **Sending limits**: Email provider rate limits reached
+4. **Spam filters**: Emails being blocked
+
+**Solutions**:
+
+* Verify email account connection
+* Validate recipient email addresses
+* Check email provider limits
+* Review email content for spam triggers
+
+## Debugging Workflows
+
+### Using Workflow Runs
+
+1. Go to the workflow editor
+2. Open the **Runs** panel
+3. Find the failed run
+4. Click to see step-by-step details
+5. Review error messages and output data
+
+### Testing Individual Steps
+
+1. For Code actions, use the **Test** button
+2. For HTTP requests, test the endpoint separately
+3. Create test records to trigger workflows
+4. Use manual triggers for controlled testing
+
+### Common Debugging Patterns
+
+**Add logging**:
+Use Code actions to log intermediate values for debugging.
+
+**Isolate steps**:
+Test each step independently to identify failures.
+
+**Check data flow**:
+Verify that each step receives the expected input data.
+
+## Best Practices to Avoid Issues
+
+### Before Activation
+
+* Test thoroughly in draft mode
+* Validate all API connections
+* Review trigger conditions carefully
+* Document expected behavior
+
+### During Development
+
+* Use descriptive step names
+* Add comments in Code actions
+* Test with realistic data
+* Plan for edge cases
+
+### After Activation
+
+* Monitor initial runs closely
+* Set up alerts for failures
+* Review run history regularly
+* Keep workflows simple when possible
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx
new file mode 100644
index 0000000000..cdc2cf3918
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx
@@ -0,0 +1,254 @@
+---
+title: Workflows FAQ
+description: Frequently asked questions about workflows in Twenty.
+---
+
+
+
+ This is likely a permissions issue. You need access to workflows to create and activate them.
+
+ **Solution**: Contact your workspace administrator to grant you workflow access under **Settings → Roles**.
+
+ If you don't see the Workflows section at all in your sidebar, this confirms it's a permissions issue.
+
+
+
+ Manual workflows only appear in the navbar if properly configured:
+
+ 1. The workflow must be **activated** (not in draft mode)
+ 2. The navbar placement must be set to **Pinned**
+ 3. For Single/Bulk triggers, you must be on the correct object page
+
+ **To check**: Open the workflow → click the trigger → verify "Navbar placement" is set to "Pinned".
+
+ You can always access manual workflows via **Cmd + K** (or **Ctrl + K**) regardless of navbar settings.
+
+
+
+ | Type | Records Required | Workflow Runs |
+ | ---- | ---------------- | ------------- |
+
+ \| **Global** | None | Once, no record input |
+ \| **Single** | One or more selected | Once per selected record |
+ \| **Bulk** | One or more selected | Once, with all records as array |
+
+ * **Global**: Use when the workflow doesn't need any record context (e.g., generate a report)
+ * **Single**: Use when you want to process each selected record independently (e.g., send individual emails)
+ * **Bulk**: Use when you need to process records together or optimize credit usage (requires Iterator action)
+
+ See [Workflow Triggers](/l/pt/user-guide/workflows/capabilities/workflow-triggers) for details.
+
+
+
+ An explicit If/Else node is not yet available but is on our roadmap.
+
+ **Current workaround**: Create multiple branches from your step, each starting with a **Filter** action:
+
+ ```
+ Step 1
+ │
+ ├── Branch A: Filter (condition = true) → Actions...
+ │
+ └── Branch B: Filter (condition = false) → Actions...
+ ```
+
+ Only the branch where the filter condition passes will execute its subsequent actions.
+
+ See [How to Use Branches](/l/pt/user-guide/workflows/capabilities/workflow-branches) for a step-by-step guide.
+
+
+
+ **Yes**, branches run in parallel by default.
+
+ If you want only one branch to execute:
+
+ * Add a **Filter** action at the start of each branch
+ * Set opposite conditions (e.g., Branch A: status = "Open", Branch B: status ≠ "Open")
+
+ Branches that fail their filter condition stop executing, while others continue.
+
+
+
+ **Yes**. After your parallel branches complete, you can add a step that both branches connect to.
+
+ In the workflow editor:
+
+ 1. Complete your branched actions
+ 2. Add a new step after the branches
+ 3. Drag connections from the end of each branch to this new step
+
+ The merged step will execute after all connected branches complete.
+
+
+
+ **Search Records returns a maximum of 200 records.**
+
+ If you need to process more:
+
+ * Add more specific filters to reduce results
+ * Use scheduled workflows to process in batches
+ * Consider using the API for bulk operations
+
+ For most workflows, 200 records is sufficient. If you regularly hit this limit, consider restructuring your automation.
+
+
+
+ **Not yet.** CC and BCC fields for the Send Email action are on our roadmap.
+
+ **Current workaround**: Add multiple Send Email actions to send to additional recipients, or use an HTTP Request to send via an external email service that supports CC.
+
+
+
+ Every action produces output data that can be used in subsequent steps.
+
+ **To reference previous step data**:
+
+ * Use the variable picker when configuring a field
+ * Or type `{{stepName.fieldName}}` directly
+
+ **Examples**:
+
+ * Trigger data: `{{trigger.object.email}}`
+ * Search results: `{{searchRecords[0].name}}`
+ * Code output: `{{code.calculatedValue}}`
+
+ Hover over any field in the action configuration to see available variables from previous steps.
+
+
+
+ **Iterator requires an array input.** Common issues:
+
+ 1. **Input is not an array**: Ensure you're passing results from Search Records or another action that returns an array
+ 2. **Array is empty**: Add a filter before Iterator to check `{{searchRecords.length}} > 0`
+ 3. **Wrong variable selected**: Make sure you select the array itself, not a single record
+
+ **Correct setup**:
+
+ 1. Search Records (returns array)
+ 2. Filter: length > 0
+ 3. Iterator: select `{{searchRecords}}`
+ 4. Actions inside iterator use `{{iterator.currentItem.fieldName}}`
+
+
+
+ Code actions (serverless functions) have a **default timeout of 5 minutes** (300 seconds).
+
+ The maximum configurable timeout is **15 minutes** (900 seconds).
+
+ If your code exceeds this limit, the action will fail with a timeout error.
+
+ **Tips to avoid timeouts**:
+
+ * Break large operations into smaller chunks using Iterator
+ * Avoid heavy computations; use external services via HTTP Request for intensive processing
+ * Optimize your code to reduce execution time
+ * If you need longer processing, consider using scheduled workflows that process data in batches
+
+
+
+ Workflow runs show the execution history and help you debug issues.
+
+ **Access runs**:
+
+ * In workflow editor → **Runs** panel on the right
+ * Or go to **Workflow Runs** in the sidebar
+
+ **Understanding a run**:
+
+ * **Status**: Running, Completed, Failed, Waiting
+ * **Steps**: See which steps executed and their output
+ * **Errors**: Click failed steps to see error messages
+ * **Data**: View input/output data at each step
+
+ See [Workflow Runs](/l/pt/user-guide/workflows/capabilities/workflow-runs) for details.
+
+
+
+ Workflow runs might be failing immediately due to rate limits.
+
+ **Hard limit: 5,000 runs per hour per workspace.**
+
+ If you exceed this limit, workflows are immediately marked as failed and won't appear in your runs list as expected.
+
+ **Common scenarios that hit this limit**:
+
+ * Selecting more than 5,000 records with a Single manual trigger
+ * Multiple workflows running simultaneously across your workspace
+ * High-frequency automated triggers (e.g., Record Updated on a busy object)
+
+ **Solutions**:
+
+ * Use **Bulk** triggers instead of Single to process many records in one run
+ * Space out large batch operations
+ * Use filters to reduce trigger frequency
+ * Schedule heavy workflows during off-peak hours
+
+
+
+ Twenty has two rate limits to ensure system stability:
+
+ | Limit | Value | Behavior |
+ | ----- | ----- | -------- |
+
+ \| **Soft limit** | 100 runs/minute | Runs queue in "Not Started" status, processed gradually |
+ \| **Hard limit** | 5,000 runs/hour | Runs immediately fail |
+
+ **Soft limit (100/min)**: Your workflows won't fail—they just wait in the queue and are processed over time. You can trigger more than 100 records; execution will be slower.
+
+ **Hard limit (5,000/hr)**: This applies to your entire workspace. If all your workflows combined exceed 5,000 runs in an hour, additional runs will fail immediately.
+
+ **Tips to stay within limits**:
+
+ * Use Bulk triggers with Iterator instead of Single triggers for large batches
+ * Combine related automations into fewer workflows
+ * Use scheduled workflows to spread load over time
+
+
+
+ **No, there is no automatic retry functionality at the moment.**
+
+ If a workflow run fails, you'll need to:
+
+ 1. Review the error in **Settings → Workflows → [Your Workflow] → Runs**
+ 2. Fix the issue (data, configuration, or external service)
+ 3. Manually trigger the workflow again on the affected record(s)
+
+ **Tips to reduce failures**:
+
+ * Add **Filter** nodes to validate data before actions
+ * Use **Search Records** to check if related records exist
+ * Test thoroughly with a few records before bulk operations
+
+ Automatic retry functionality is on our roadmap for a future release.
+
+
+
+ **Yes, if your workflows are triggered by record creation or updates.**
+
+ When you import data via CSV, each record created or updated can trigger workflows. A large import (thousands of records) could:
+
+ * Hit the 5,000 runs/hour limit
+ * Consume significant workflow credits
+ * Send unexpected emails or notifications
+ * Create duplicate tasks or records
+
+ **Before a mass import**:
+
+ 1. Go to **Settings → Workflows**
+ 2. Identify workflows triggered by the object you're importing
+ 3. **Deactivate** them temporarily
+ 4. Run your CSV import
+ 5. **Reactivate** the workflows when done
+
+ **Alternative**: If you need the workflows to run on imported data, import in smaller batches to stay within rate limits.
+
+
+
+ If your workflow canvas looks messy with nodes scattered around, you can automatically organize it:
+
+ 1. Right-click anywhere on the workflow canvas
+ 2. Click **Tidy up workflow**
+
+ This will automatically rearrange all nodes into a clean, organized layout.
+
+
diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/overview.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/overview.mdx
new file mode 100644
index 0000000000..201dba3ee6
--- /dev/null
+++ b/packages/twenty-docs/l/pt/user-guide/workflows/overview.mdx
@@ -0,0 +1,80 @@
+---
+title: Workflows
+description: Learn how to build automations in Twenty.
+image: /images/user-guide/workflows/workflow.png
+---
+
+
+
+
+
+## Why Workflows Matter
+
+Twenty was built to bring maximum flexibility to its users. Rather than forcing you to adapt your business processes to rigid, pre-built features, workflows enable you to build automations that create the CRM that best supports your unique business use cases.
+
+Workflows are Twenty's in-app feature for building these automations. They give you the building blocks to create exactly what your business needs, when it needs it.
+
+## What can I do with workflows?
+
+We recommend building automations for two main purposes:
+
+1. **Internal automations to facilitate your team's day-to-day**: Reduce the amount of manual entries and repetitive tasks that slow down your team.
+2. **Bring data in and out of Twenty**: Connect Twenty via API calls and webhooks to your database and other tools.
+
+## Building Your First Workflow
+
+### Step 1: Create a New Workflow
+
+1. Go to **Workflows** accessible below the other objects
+2. Click **+ New Record**
+3. Give your workflow a name
+
+### Step 2: Add a Trigger
+
+Every workflow starts with a trigger. Choose from:
+
+* **Record events**: When a record is created, updated, or deleted
+* **Schedule**: Run at specific times (daily, weekly, etc.)
+* **Manual**: Triggered by a user action
+* **Webhook**: Triggered by a webhook
+
+
+
+### Step 3: Add Actions
+
+After your trigger, add one or more actions:
+
+* **Create Record**: Add new records to any object
+* **Update Record**: Modify existing record data
+* **Delete Record**: Remove records from objects
+* **Search Records**: Find records matching criteria
+* **Upsert Record**: Create or update based on matching criteria
+* **Iterator**: Loop through arrays of records
+* **Filter**: Control which records proceed
+* **Delay**: Wait before continuing (duration or scheduled date)
+* **Send Email**: Send emails via your connected account
+* **Code**: Run custom JavaScript
+* **HTTP Request**: Call external APIs
+* **Form**: Get inputs from users within Twenty UI at the time of execution
+* **AI Agent** (Coming soon): Run intelligent AI tasks
+
+
+
+### Step 4: Test and Activate
+
+1. Use the **Test** button to run your workflow with sample data
+2. Review the results to ensure it works as expected
+3. Toggle the workflow **Active** when ready
+
+## Workflow Best Practices
+
+* **Edit step names**: Rename your workflow steps to clearly describe what each one does. This helps with maintenance and makes it easier to hand off to coworkers
+* **Leverage previous step data**: You can use fields from records returned by any previous step in your workflow
+* **Start simple**: Begin with basic workflows and add complexity over time as you become more comfortable with the system
+* **Plan before building**: Map out your workflow logic before you start building to avoid getting stuck halfway through
+
+## Next Steps
+
+* [Workflow Triggers](/l/pt/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/pt/user-guide/workflows/capabilities/workflow-actions)
+* [CRM Automations](/l/pt/user-guide/workflows/how-tos/crm-automations/closed-won-automations)
diff --git a/packages/twenty-docs/l/ro/developers/contribute/capabilities/frontend-development/style-guide.mdx b/packages/twenty-docs/l/ro/developers/contribute/capabilities/frontend-development/style-guide.mdx
index 5b2c0e535b..ffdb3e6a32 100644
--- a/packages/twenty-docs/l/ro/developers/contribute/capabilities/frontend-development/style-guide.mdx
+++ b/packages/twenty-docs/l/ro/developers/contribute/capabilities/frontend-development/style-guide.mdx
@@ -21,14 +21,14 @@ Utilizează întotdeauna componente funcționale TSX.
Nu folosi `import` implicit cu `const`, deoarece este mai greu de citit și mai greu de importat cu completarea de cod.
```tsx
-// ❌ Rău, mai greu de citit, mai greu de importat cu completarea codului
+// ❌ Bad, harder to read, harder to import with code completion
const MyComponent = () => {
return Hello World
;
};
export default MyComponent;
-// ✅ Bun, ușor de citit, ușor de importat cu completarea codului
+// ✅ Good, easy to read, easy to import with code completion
export function MyComponent() {
return Hello World
;
};
@@ -41,10 +41,10 @@ Creează tipul proprietăților și numește-l `(NumeComponentă)Props` dacă nu
Folosește destructurarea props.
```tsx
-// ❌ Rău, fără tip
+// ❌ Bad, no type
export const MyComponent = (props) => Hello {props.name}
;
-// ✅ Bun, cu tip
+// ✅ Good, type
type MyComponentProps = {
name: string;
};
@@ -55,11 +55,11 @@ export const MyComponent = ({ name }: MyComponentProps) => Hello {name} (
Evită utilizarea împrăștierii de proprietăți cu o singură variabilă în elemente JSX, cum ar fi `{...props}`. Această practică adesea duce la cod mai puțin lizibil și mai greu de întreținut deoarece nu este clar ce proprietăți primește componenta.
```tsx
-/* ❌ - Rău, împrăștie o singură variabilă prop în componenta subadiacentă
+/* ❌ - Bad, spreads a single variable prop into the underlying component
*/
const MyComponent = (props: OwnProps) => {
return
;
@@ -155,14 +155,14 @@ type MyType = {
Poți vedea de ce TypeScript recomandă evitarea enumurilor [aici](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
```tsx
-// ❌ Rău, utilizează un enum
+// ❌ Bad, utilizes an enum
enum Color {
- Roșu = "red",
- Verde = "green",
- Albastru = "blue",
+ Red = "red",
+ Green = "green",
+ Blue = "blue",
}
-let color = Color.Roșu;
+let color = Color.Red;
```
```tsx
diff --git a/packages/twenty-docs/l/ro/twenty-ui/input/checkbox.mdx b/packages/twenty-docs/l/ro/twenty-ui/input/checkbox.mdx
index ca11cd3310..b2c7434d11 100644
--- a/packages/twenty-docs/l/ro/twenty-ui/input/checkbox.mdx
+++ b/packages/twenty-docs/l/ro/twenty-ui/input/checkbox.mdx
@@ -12,7 +12,7 @@ Utilizat atunci când un utilizator trebuie să selecteze mai multe valori din m
```jsx
- import { Checkbox } din "twenty-ui/display";
+ import { Checkbox } from "twenty-ui/display";
export const MyComponent = () => {
return (
diff --git a/packages/twenty-docs/l/ro/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/ro/twenty-ui/navigation/links.mdx
index a8ee466db6..86f31ffc10 100644
--- a/packages/twenty-docs/l/ro/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/ro/twenty-ui/navigation/links.mdx
@@ -66,11 +66,12 @@ Un component de link stilizat pentru afișarea linkurilor.
return (
- Contactați-ne
+ Contact Us
);
};
+
```
@@ -102,7 +103,7 @@ Un link stilizat cu margini rotunjite cu un component Chip pentru linkuri.
return (
- Contactați-ne
+ Contact Us
);
diff --git a/packages/twenty-docs/l/ro/twenty-ui/navigation/menu-item.mdx b/packages/twenty-docs/l/ro/twenty-ui/navigation/menu-item.mdx
index 956d3b7224..eb8e27dd04 100644
--- a/packages/twenty-docs/l/ro/twenty-ui/navigation/menu-item.mdx
+++ b/packages/twenty-docs/l/ro/twenty-ui/navigation/menu-item.mdx
@@ -163,7 +163,7 @@ Oferă o modalitate de a implementa funcționalitatea multi-select cu un checkbo
return (
@@ -194,12 +194,12 @@ Un element de meniu multi-select cu un avatar, un checkbox pentru selecție și
export const MyComponent = () => {
const imageUrl =
- "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhgaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
+ "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
return (
}
- text="Prima opțiune"
+ text="First Option"
selected={false}
className
/>
@@ -231,13 +231,13 @@ Un element de meniu care include o pictogramă opțională în stânga, conținu
export const MyComponent = () => {
const handleNavigation = () => {
- console.log("Navigați la o altă pagină");
+ console.log("Navigate to another page");
};
return (
@@ -268,13 +268,13 @@ Un element de meniu selectabil, care include opțional părți la stânga (picto
export const MyComponent = () => {
const handleSelection = () => {
- console.log("Elementul de meniu selectat");
+ console.log("Menu item selected");
};
return (
{
- console.log("Elementul de meniu selectat");
+ console.log("Menu item selected");
};
return (
}
- text="Prima opțiune"
+ text="First Option"
selected={true}
disabled={false}
hovered={false}
@@ -358,12 +358,12 @@ Un element de meniu selectabil cu un eșantion de culoare pentru situațiile în
export const MyComponent = () => {
const handleSelection = () => {
- console.log("Elementul de meniu selectat");
+ console.log("Menu item selected");
};
return (
console.log("Acasă clicat"),
+ onClick: () => console.log("Home clicked"),
},
{
- name: "Profil",
+ name: "Profile",
Icon: IconUser,
- onClick: () => console.log("Profil clicat"),
+ onClick: () => console.log("Profile clicked"),
},
{
- name: "Setări",
+ name: "Settings",
Icon: IconSettings,
- onClick: () => console.log("Setări clicat"),
+ onClick: () => console.log("Settings clicked"),
},
];
diff --git a/packages/twenty-docs/l/ro/user-guide/workflows/capabilities/workflow-branches.mdx b/packages/twenty-docs/l/ro/user-guide/workflows/capabilities/workflow-branches.mdx
index 1591ddf8ce..b47424a49b 100644
--- a/packages/twenty-docs/l/ro/user-guide/workflows/capabilities/workflow-branches.mdx
+++ b/packages/twenty-docs/l/ro/user-guide/workflows/capabilities/workflow-branches.mdx
@@ -1,5 +1,5 @@
---
-title: Ramificații ale fluxului de lucru},{
+title: Workflow Branches
description: Creați căi paralele și logică condițională în fluxurile dvs. de lucru.
---
diff --git a/packages/twenty-docs/l/ru/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/ru/developers/contribute/capabilities/backend-development/queue.mdx
index 28efd40865..7eb3882c79 100644
--- a/packages/twenty-docs/l/ru/developers/contribute/capabilities/backend-development/queue.mdx
+++ b/packages/twenty-docs/l/ru/developers/contribute/capabilities/backend-development/queue.mdx
@@ -17,24 +17,24 @@ title: Очередь сообщений
### Пример использования
```ts
-класс Resolver {
+class Resolver {
constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
async onSomeAction() {
- //бизнес логика
+ //business logic
await this.queue.add(someData);
}
}
-//асинхронный работник
-класс CustomWorker {
+//async worker
+class CustomWorker {
constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
this.initWorker();
}
async initWorker() {
await this.queue.work(async ({ id, data }) => {
- //логика работника
+ //worker logic
});
}
}
diff --git a/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/best-practices-front.mdx b/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
index c0e17dd2b0..e1129d2787 100644
--- a/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
+++ b/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
@@ -186,7 +186,7 @@ const [email, setEmail] = useState('');
Названия обработчиков событий должны начинаться с `handle`, в то время как `on` используется как префикс для наименования событий в пропсах компонентов.
```tsx
-// ❌ Плохо
+// ❌ Bad
const onEmailChange = (val: string) => {
// ...
};
@@ -239,7 +239,7 @@ const Form = () => ;
```tsx
const SomeParentComponent = () => ;
-// В MyComponent
+// In MyComponent
const MyComponent = ({ MyIcon }: { MyIcon: IconComponent }) => {
const theme = useTheme();
@@ -284,7 +284,7 @@ const MyComponent = ({ MyIcon }: { MyIcon: IconComponent }) => {
**Использование**
```tsx
-// ❌ Плохо, указывает полный относительный путь
+// ❌ Bad, specifies the entire relative path
import {
CatalogDecorator
} from '../../../../../testing/decorators/CatalogDecorator';
diff --git a/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/hotkeys.mdx
index 61406938ec..eb167efeab 100644
--- a/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/hotkeys.mdx
+++ b/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -45,29 +45,29 @@ const PageListeningEnter = () => {
goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope();
- // 1. Установить область горячих клавиш в useEffect
+ // 1. Set the hotkey scope in a useEffect
useEffect(() => {
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleEnterPage,
);
- // Вернуться к предыдущей области горячих клавиш, когда компонент размонтирован
+ // Revert to the previous hotkey scope when the component is unmounted
return () => {
goBackToPreviousHotkeyScope();
};
}, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
- // 2. Используйте хук useScopedHotkeys
+ // 2. Use the useScopedHotkeys hook
useScopedHotkeys(
Key.Enter,
() => {
- // Логика, выполняемая на этой странице при нажатии пользователем клавиши Enter
+ // Some logic executed on this page when the user presses Enter
// ...
},
ExampleHotkeyScopes.ExampleEnterPage,
);
- return Моя страница, прослушивающая Enter
;
+ return My page that listens for Enter
;
};
```
@@ -87,7 +87,7 @@ const ExamplePageWithModal = () => {
} = usePreviousHotkeyScope();
const handleOpenModalClick = () => {
- // 1. Установите область горячих клавиш, когда пользователь открывает модальное окно
+ // 1. Set the hotkey scope when user opens the modal
setShowModal(true);
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleModal,
@@ -95,14 +95,14 @@ const ExamplePageWithModal = () => {
};
const handleModalClose = () => {
- // 1. Вернуться к предыдущей области горячих клавиш при закрытии модального окна
+ // 1. Revert to the previous hotkey scope when the modal is closed
setShowModal(false);
goBackToPreviousHotkeyScope();
};
return
-
Моя страница с модальным окном
- Открыть модальное окно
+ My page with a modal
+ Open modal
{showModal && }
;
};
@@ -112,9 +112,9 @@ const ExamplePageWithModal = () => {
```tsx
const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
- // 2. Используйте хук useScopedHotkeys для прослушивания Escape.
- // Учтите, что Escape — это общая горячая клавиша, которая может использоваться многими другими компонентами
- // Поэтому крайне важно использовать области горячих клавиш, чтобы избежать конфликтов
+ // 2. Use the useScopedHotkeys hook to listen for Escape.
+ // Note that escape is a common hotkey that could be used by many other components
+ // So it's important to use a hotkey scope to avoid conflicts
useScopedHotkeys(
Key.Escape,
() => {
@@ -123,7 +123,7 @@ const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
ExampleHotkeyScopes.ExampleModal,
);
- return Мой компонент модального окна
;
+ return My modal component
;
};
```
diff --git a/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/style-guide.mdx b/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/style-guide.mdx
index 7402f21bdd..bcae568c0a 100644
--- a/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/style-guide.mdx
+++ b/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/style-guide.mdx
@@ -21,14 +21,14 @@ There are a lot of rules that are not defined here, but that are automatically c
Не используйте стандартный `import` с `const`, так как это сложнее для чтения и импорта с автозаполнением кода.
```tsx
-// ❌ Плохо, сложнее читать, сложнее импортировать с автозаполнением кода
+// ❌ Bad, harder to read, harder to import with code completion
const MyComponent = () => {
return Hello World
;
};
export default MyComponent;
-// ✅ Хорошо, легко читать, легко импортировать с автозаполнением кода
+// ✅ Good, easy to read, easy to import with code completion
export function MyComponent() {
return Hello World
;
};
@@ -41,10 +41,10 @@ export function MyComponent() {
Используйте деструктуризацию пропсов.
```tsx
-// ❌ Плохо, отсутствует тип
+// ❌ Bad, no type
export const MyComponent = (props) => Hello {props.name}
;
-// ✅ Хорошо, тип определен
+// ✅ Good, type
type MyComponentProps = {
name: string;
};
@@ -55,11 +55,11 @@ export const MyComponent = ({ name }: MyComponentProps) => Hello {name} (
Avoid using single variable prop spreading in JSX elements, like `{...props}`. Подобная практика часто приводит к менее читаемому и сложному в поддержке коду, так как непонятно, какие пропсы принимает компонент.
```tsx
-/* ❌ - Плохо, распространяет одиночный пропс в базовый компонент
+/* ❌ - Bad, spreads a single variable prop into the underlying component
*/
const MyComponent = (props: OwnProps) => {
return
;
@@ -137,12 +137,12 @@ onClick?.();
Всегда используйте `type` вместо `interface`, так как они почти всегда пересекаются, а `type` более гибок.
```tsx
-// ❌ Плохо
+// ❌ Bad
interface MyInterface {
name: string;
}
-// ✅ Хорошо
+// ✅ Good
type MyType = {
name: string;
};
@@ -155,7 +155,7 @@ type MyType = {
Вы можете увидеть, почему TypeScript рекомендует избегать перечислений [здесь](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
```tsx
-// ❌ Плохо, использует перечисление
+// ❌ Bad, utilizes an enum
enum Color {
Red = "red",
Green = "green",
diff --git a/packages/twenty-docs/l/ru/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/ru/twenty-ui/display/app-tooltip.mdx
index 33fccc5651..c54f30f6ac 100644
--- a/packages/twenty-docs/l/ru/twenty-ui/display/app-tooltip.mdx
+++ b/packages/twenty-docs/l/ru/twenty-ui/display/app-tooltip.mdx
@@ -18,12 +18,12 @@ image: /images/user-guide/tips/light-bulb.png
return (
<>
- Информация о клиенте
+ Customer Insights
{
const crmTaskDescription =
- 'Свяжитесь с клиентом по поводу его недавнего запроса по продукту. Обсудите варианты цен, ответьте на любые вопросы и предоставьте дополнительную информацию о продукте. Запишите детали разговора в CRM для дальнейшего использования.';
+ 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
return ;
};
diff --git a/packages/twenty-docs/l/ru/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/ru/twenty-ui/input/icon-picker.mdx
index c248e1f57b..41d6db5f6a 100644
--- a/packages/twenty-docs/l/ru/twenty-ui/input/icon-picker.mdx
+++ b/packages/twenty-docs/l/ru/twenty-ui/input/icon-picker.mdx
@@ -20,7 +20,7 @@ image: /images/user-guide/github/github-header.png
const [selectedIcon, setSelectedIcon] = useState("");
const handleIconChange = ({ iconKey, Icon }) => {
- console.log("Выбранная иконка:", iconKey);
+ console.log("Selected Icon:", iconKey);
setSelectedIcon(iconKey);
};
diff --git a/packages/twenty-docs/l/ru/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/ru/twenty-ui/navigation/breadcrumb.mdx
index 633f369b07..7a4f04c79f 100644
--- a/packages/twenty-docs/l/ru/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/ru/twenty-ui/navigation/breadcrumb.mdx
@@ -16,18 +16,18 @@ image: /images/user-guide/fields/field.png
import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
export const MyComponent = () => {
- const breadcrumbLinks = [
- { children: "Домой", href: "/" },
- { children: "Категория", href: "/category" },
- { children: "Подкатегория", href: "/category/subcategory" },
- { children: "Текущая страница" },
- ];
+ const breadcrumbLinks = [
+ { children: "Home", href: "/" },
+ { children: "Category", href: "/category" },
+ { children: "Subcategory", href: "/category/subcategory" },
+ { children: "Current Page" },
+ ];
- return (
-
-
-
- )
+ return (
+
+
+
+ )
};
```
diff --git a/packages/twenty-docs/l/ru/twenty-ui/navigation/menu-item.mdx b/packages/twenty-docs/l/ru/twenty-ui/navigation/menu-item.mdx
index 8c2beca464..d6fc6b5953 100644
--- a/packages/twenty-docs/l/ru/twenty-ui/navigation/menu-item.mdx
+++ b/packages/twenty-docs/l/ru/twenty-ui/navigation/menu-item.mdx
@@ -18,18 +18,18 @@ image: /images/user-guide/kanban-views/kanban.png
export const MyComponent = () => {
const handleMenuItemClick = (event) => {
- console.log("Пункт меню нажат!", event);
+ console.log("Menu item clicked!", event);
};
const handleButtonClick = (event) => {
- console.log("Кнопка значка нажата!", event);
+ console.log("Icon button clicked!", event);
};
return (
{
const handleCommandClick = () => {
- console.log("Команда нажата!");
+ console.log("Command clicked!");
};
return (
{
const handleMenuItemClick = (event) => {
- console.log("Пункт меню нажат!", event);
+ console.log("Menu item clicked!", event);
};
return (
@@ -125,7 +125,7 @@ image: /images/user-guide/kanban-views/kanban.png
iconButtons={[{ Icon: IconAlertCircle, onClick: handleButtonClick }]}
isTooltipOpen={false}
onClick={handleMenuItemClick}
- text="Перетаскиваемый пункт меню"
+ text="Menu item draggable"
isDragDisabled={false}
className
/>
@@ -163,7 +163,7 @@ image: /images/user-guide/kanban-views/kanban.png
return (
@@ -198,8 +198,8 @@ image: /images/user-guide/kanban-views/kanban.png
return (
}
- text="Первый вариант"
+ avatar={ }
+ text="First Option"
selected={false}
className
/>
@@ -231,13 +231,13 @@ image: /images/user-guide/kanban-views/kanban.png
export const MyComponent = () => {
const handleNavigation = () => {
- console.log("Перейти на другую страницу");
+ console.log("Navigate to another page");
};
return (
@@ -268,13 +268,13 @@ image: /images/user-guide/kanban-views/kanban.png
export const MyComponent = () => {
const handleSelection = () => {
- console.log("Пункт меню выбран");
+ console.log("Menu item selected");
};
return (
{
- console.log("Пункт меню выбран");
+ console.log("Menu item selected");
};
return (
}
- text="Первый вариант"
+ avatar={ }
+ text="First Option"
selected={true}
disabled={false}
hovered={false}
@@ -357,21 +357,21 @@ image: /images/user-guide/kanban-views/kanban.png
import { MenuItemSelectColor } from "twenty-ui/display";
export const MyComponent = () => {
- const handleSelection = () => {
- console.log("Пункт меню выбран");
- };
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
- return (
-
- );
+ return (
+
+ );
};
```
@@ -402,15 +402,15 @@ image: /images/user-guide/kanban-views/kanban.png
export const MyComponent = () => {
- return (
-
- );
+ return (
+
+ );
};
```
diff --git a/packages/twenty-docs/l/ru/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/ru/twenty-ui/navigation/step-bar.mdx
index 498ff5b2af..72e8a981b9 100644
--- a/packages/twenty-docs/l/ru/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/ru/twenty-ui/navigation/step-bar.mdx
@@ -17,9 +17,9 @@ image: /images/user-guide/api/api.png
export const MyComponent = () => {
return (
- Шаг 1
- Шаг 2
- Шаг 3
+ Step 1
+ Step 2
+ Step 3
);
};
diff --git a/packages/twenty-docs/l/ru/user-guide/billing/capabilities/pricing-plans.mdx b/packages/twenty-docs/l/ru/user-guide/billing/capabilities/pricing-plans.mdx
index d08a6fafc9..451467b4f0 100644
--- a/packages/twenty-docs/l/ru/user-guide/billing/capabilities/pricing-plans.mdx
+++ b/packages/twenty-docs/l/ru/user-guide/billing/capabilities/pricing-plans.mdx
@@ -1,5 +1,5 @@
---
-title: Тарифные планы},{
+title: Pricing Plans
description: Узнайте о тарифных планах Twenty и о том, как переключаться между ними.
---
diff --git a/packages/twenty-docs/l/ru/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx b/packages/twenty-docs/l/ru/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
index fcf073d0f3..b5ac08da08 100644
--- a/packages/twenty-docs/l/ru/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
+++ b/packages/twenty-docs/l/ru/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
@@ -1,5 +1,5 @@
---
-title: Ограничение импорта писем},{
+title: Limit Emails Imported
description: Управляйте тем, какие письма импортируются в Twenty.
---
diff --git a/packages/twenty-docs/l/ru/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx b/packages/twenty-docs/l/ru/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
index 60d3f0a1bb..fb4b02d0e9 100644
--- a/packages/twenty-docs/l/ru/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
+++ b/packages/twenty-docs/l/ru/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
@@ -1,5 +1,5 @@
---
-title: Подготовьте файлы CSV},{
+title: Prepare Your CSV Files
description: Полное пошаговое руководство по форматированию ваших данных для импорта в Twenty.
---
diff --git a/packages/twenty-docs/l/ru/user-guide/data-migration/overview.mdx b/packages/twenty-docs/l/ru/user-guide/data-migration/overview.mdx
index 5f225afcfd..6cee2b8142 100644
--- a/packages/twenty-docs/l/ru/user-guide/data-migration/overview.mdx
+++ b/packages/twenty-docs/l/ru/user-guide/data-migration/overview.mdx
@@ -1,5 +1,5 @@
---
-title: Миграция данных},{
+title: Data Migration
description: Импортируйте и экспортируйте данные вашей CRM через файлы CSV или API.
image: /images/user-guide/import-export-data/cloud.png
---
diff --git a/packages/twenty-docs/l/ru/user-guide/permissions-access/overview.mdx b/packages/twenty-docs/l/ru/user-guide/permissions-access/overview.mdx
index 1ba38b07e9..0d02e7abb7 100644
--- a/packages/twenty-docs/l/ru/user-guide/permissions-access/overview.mdx
+++ b/packages/twenty-docs/l/ru/user-guide/permissions-access/overview.mdx
@@ -1,5 +1,5 @@
---
-title: Разрешения и доступ},{
+title: Permissions & Access
description: Управляйте ролями, разрешениями и контролем доступа в вашем рабочем пространстве.
---
diff --git a/packages/twenty-docs/l/ru/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx b/packages/twenty-docs/l/ru/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
index d285f9b6d2..a38af1c3a4 100644
--- a/packages/twenty-docs/l/ru/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
+++ b/packages/twenty-docs/l/ru/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
@@ -1,5 +1,5 @@
---
-title: Покажите ожидаемую сумму в вашей воронке продаж},{
+title: Show Expected Amount in Your Pipeline
description: Рассчитывайте и отображайте взвешенные значения сделок на основе вероятности по этапам.
---
diff --git a/packages/twenty-docs/l/ru/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx b/packages/twenty-docs/l/ru/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
index d067408425..e76d88d11f 100644
--- a/packages/twenty-docs/l/ru/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
+++ b/packages/twenty-docs/l/ru/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
@@ -1,5 +1,5 @@
---
-title: Отслеживайте, сколько времени сделки находятся на каждом этапе},{
+title: Track How Long Opportunities Stay in Each Stage
description: Отслеживайте скорость сделок, фиксируя момент входа сделок на каждый этап.
---
diff --git a/packages/twenty-docs/l/ru/user-guide/views-pipelines/overview.mdx b/packages/twenty-docs/l/ru/user-guide/views-pipelines/overview.mdx
index c04c3e5785..e2b5eafe9c 100644
--- a/packages/twenty-docs/l/ru/user-guide/views-pipelines/overview.mdx
+++ b/packages/twenty-docs/l/ru/user-guide/views-pipelines/overview.mdx
@@ -1,5 +1,5 @@
---
-title: Представления и воронки},{
+title: Views & Pipelines
description: Узнайте, как создавать и управлять представлениями в Twenty.
image: /images/user-guide/table-views/table.png
---
diff --git a/packages/twenty-docs/l/ru/user-guide/workflows/capabilities/workflow-branches.mdx b/packages/twenty-docs/l/ru/user-guide/workflows/capabilities/workflow-branches.mdx
index da1c61c5f4..790a5778e3 100644
--- a/packages/twenty-docs/l/ru/user-guide/workflows/capabilities/workflow-branches.mdx
+++ b/packages/twenty-docs/l/ru/user-guide/workflows/capabilities/workflow-branches.mdx
@@ -1,5 +1,5 @@
---
-title: Ветви рабочего процесса},{
+title: Workflow Branches
description: Создавайте параллельные пути и условную логику в ваших рабочих процессах.
---
diff --git a/packages/twenty-docs/l/tr/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/tr/developers/contribute/capabilities/backend-development/queue.mdx
index fe39619338..55bd0b9760 100644
--- a/packages/twenty-docs/l/tr/developers/contribute/capabilities/backend-development/queue.mdx
+++ b/packages/twenty-docs/l/tr/developers/contribute/capabilities/backend-development/queue.mdx
@@ -21,7 +21,7 @@ class Resolver {
constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
async onSomeAction() {
- //iş mantığı
+ //business logic
await this.queue.add(someData);
}
}
diff --git a/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/best-practices-front.mdx b/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
index aea7a4e0c9..0f55dad434 100644
--- a/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
+++ b/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
@@ -19,7 +19,7 @@ Durumunuzu depolamak için ihtiyaç duyduğunuz kadar atom oluşturmak iyi bir u
```tsx
export const myAtomState = atom({
key: 'myAtomState',
- default: 'default değer',
+ default: 'default value',
});
export const MyComponent = () => {
@@ -186,14 +186,14 @@ const [email, setEmail] = useState('');
Olay işleyici adları `handle` ile başlamalı, bileşen props'larında olayları adlandırmak için `on` bir ön ek olarak kullanılmaktadır.
```tsx
-// ❌ Kötü
+// ❌ Bad
const onEmailChange = (val: string) => {
// ...
};
```
```tsx
-// ✅ İyi
+// ✅ Good
const handleEmailChange = (val: string) => {
// ...
};
@@ -239,7 +239,7 @@ Bunun en yaygın örneği simge bileşenleridir:
```tsx
const SomeParentComponent = () => ;
-// MyComponent'te
+// In MyComponent
const MyComponent = ({ MyIcon }: { MyIcon: IconComponent }) => {
const theme = useTheme();
@@ -284,7 +284,7 @@ Aşırı prop taşıma kullanıyorsanız, [durum yönetimi en iyi uygulamaların
**Kullanım**
```tsx
-// ❌ Kötü, tüm göreli yolu belirtir
+// ❌ Bad, specifies the entire relative path
import {
CatalogDecorator
} from '../../../../../testing/decorators/CatalogDecorator';
@@ -309,10 +309,10 @@ const validationSchema = z
exist: z.boolean(),
email: z
.string()
- .email('Email geçerli bir e-posta olmalıdır'),
+ .email('Email must be a valid email'),
password: z
.string()
- .regex(PASSWORD_REGEX, 'Şifre en az 8 karakter içermelidir'),
+ .regex(PASSWORD_REGEX, 'Password must contain at least 8 characters'),
})
.required();
diff --git a/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/hotkeys.mdx
index 1597cdcc08..fdd93f06cb 100644
--- a/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/hotkeys.mdx
+++ b/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -67,7 +67,7 @@ const PageListeningEnter = () => {
ExampleHotkeyScopes.ExampleEnterPage,
);
- return Enter Dinleyen Sayfam
;
+ return My page that listens for Enter
;
};
```
@@ -101,8 +101,8 @@ const ExamplePageWithModal = () => {
};
return
-
Modal İçeren Sayfam
- Modali Aç
+ My page with a modal
+ Open modal
{showModal && }
;
};
@@ -123,7 +123,7 @@ const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
ExampleHotkeyScopes.ExampleModal,
);
- return Modal bileşenim
;
+ return My modal component
;
};
```
diff --git a/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/style-guide.mdx b/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/style-guide.mdx
index df065b8b88..a4fa4fe513 100644
--- a/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/style-guide.mdx
+++ b/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/style-guide.mdx
@@ -21,16 +21,16 @@ Her zaman TSX fonksiyonel bileşenlerini kullanın.
Do not use default `import` with `const`, because it's harder to read and harder to import with code completion.
```tsx
-// ❌ Kötü, okumak zor, kod tamamlama ile ithal etmek zor
+// ❌ Bad, harder to read, harder to import with code completion
const MyComponent = () => {
- return Merhaba Dünya
;
+ return Hello World
;
};
export default MyComponent;
-// ✅ İyi, okumak kolay, kod tamamlama ile ithal etmek kolay
+// ✅ Good, easy to read, easy to import with code completion
export function MyComponent() {
- return Merhaba Dünya
;
+ return Hello World
;
};
```
@@ -41,23 +41,25 @@ Create the type of the props and call it `(ComponentName)Props` if there's no ne
Use props destructuring.
```tsx
-// ❌ Kötü, tür yok
-export const MyComponent = (props) => Merhaba {props.name}
;
+// ❌ Bad, no type
+export const MyComponent = (props) => Hello {props.name}
;
-// ✅ İyi, tür
+// ✅ Good, type
type MyComponentProps = {
name: string;
};
-export const MyComponent = ({ name }: MyComponentProps) => Merhaba {name}
;
+export const MyComponent = ({ name }: MyComponentProps) => Hello {name}
;
```
#### Refrain from using `React.FC` or `React.FunctionComponent` to define prop types
```tsx
-/* ❌ - Kötü, bileşen tür notlarını `FC` ile tanımlıyor
- * - `React.FC` ile, bileşen prop türünde tanımlanmamış olsa bile bir `children` prop kabul eder
- * Bu her zaman istenmeyen sonuçlara neden olabilir, özellikle bileşen çocukları render etmeyi düşünmüyorsa.
+/* ❌ - Bad, defines the component type annotations with `FC`
+ * - With `React.FC`, the component implicitly accepts a `children` prop
+ * even if it's not defined in the prop type. This might not always be
+ * desirable, especially if the component doesn't intend to render
+ * children.
*/
const EmailField: React.FC<{
value: string;
@@ -84,7 +86,7 @@ const EmailField = ({ value }: EmailFieldProps) => (
JSX elemanlarında tek değişkenli prop yayılımını, örneğin `{...props}` kullanmaktan kaçının. Bu uygulama, bileşenin hangi prop'ları aldığını belirsizleştirdiği için okunması zor ve bakımı güç kodlara yol açar.
```tsx
-/* ❌ - Kötü, tek değişkenli bir prop'un alttaki bileşene yayılmasını sağlar
+/* ❌ - Bad, spreads a single variable prop into the underlying component
*/
const MyComponent = (props: OwnProps) => {
return ;
@@ -135,12 +137,12 @@ onClick?.();
Always use `type` instead of `interface`, because they almost always overlap, and `type` is more flexible.
```tsx
-// ❌ Kötü
+// ❌ Bad
interface MyInterface {
name: string;
}
-// ✅ İyi
+// ✅ Good
type MyType = {
name: string;
};
@@ -153,7 +155,7 @@ type MyType = {
TypeScript, enum'ların neden kaçınılması gereken bir seçenek olduğunu [burada](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums) açıklamaktadır.
```tsx
-// ❌ Kötü, bir enum kullanıyor
+// ❌ Bad, utilizes an enum
enum Color {
Red = "red",
Green = "green",
diff --git a/packages/twenty-docs/l/tr/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/tr/twenty-ui/display/app-tooltip.mdx
index 75831a633f..b6c5551ad7 100644
--- a/packages/twenty-docs/l/tr/twenty-ui/display/app-tooltip.mdx
+++ b/packages/twenty-docs/l/tr/twenty-ui/display/app-tooltip.mdx
@@ -18,12 +18,12 @@ Kullanıcı bir öğeyle etkileşimde bulunduğunda ek bilgi gösteren kısa bir
return (
<>
- Müşteri Bilgileri
+ Customer Insights
{
const crmTaskDescription =
- 'Müşterinin son ürün sorgusuyla ilgili takip edin. Fiyatlandırma seçeneklerini tartışın, herhangi bir endişeyi giderin ve ek ürün bilgisi sağlayın. Gelecekteki referanslar için görüşmenin detaylarını CRM'ye kaydedin.';
+ 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
return ;
};
diff --git a/packages/twenty-docs/l/tr/twenty-ui/input/checkbox.mdx b/packages/twenty-docs/l/tr/twenty-ui/input/checkbox.mdx
index 6dd94195ae..1adc9e62eb 100644
--- a/packages/twenty-docs/l/tr/twenty-ui/input/checkbox.mdx
+++ b/packages/twenty-docs/l/tr/twenty-ui/input/checkbox.mdx
@@ -19,8 +19,8 @@ Bir kullanıcı birden fazla seçeneği seçmek istediğinde kullanılır.
console.log("onChange işlevi çalıştırıldı")}
- onCheckedChange={() => console.log("onCheckedChange işlevi çalıştırıldı")}
+ onChange={() => console.log("onChange function fired")}
+ onCheckedChange={() => console.log("onCheckedChange function fired")}
variant="primary"
size="small"
shape="squared"
diff --git a/packages/twenty-docs/l/tr/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/tr/twenty-ui/input/icon-picker.mdx
index 2a64b2eaa7..825f8d04f2 100644
--- a/packages/twenty-docs/l/tr/twenty-ui/input/icon-picker.mdx
+++ b/packages/twenty-docs/l/tr/twenty-ui/input/icon-picker.mdx
@@ -20,7 +20,7 @@ Kullanıcıların bir listeden simge seçmesine olanak tanıyan bir açılır me
const [selectedIcon, setSelectedIcon] = useState("");
const handleIconChange = ({ iconKey, Icon }) => {
- console.log("Seçilen Simge:", iconKey);
+ console.log("Selected Icon:", iconKey);
setSelectedIcon(iconKey);
};
diff --git a/packages/twenty-docs/l/tr/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/tr/twenty-ui/navigation/breadcrumb.mdx
index c8ddf6501b..9ab7296c55 100644
--- a/packages/twenty-docs/l/tr/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/tr/twenty-ui/navigation/breadcrumb.mdx
@@ -17,10 +17,10 @@ Renders a breadcrumb navigation bar.
export const MyComponent = () => {
const breadcrumbLinks = [
- { children: "Ana Sayfa", href: "/" },
- { children: "Kategori", href: "/category" },
- { children: "Alt Kategori", href: "/category/subcategory" },
- { children: "Geçerli Sayfa" },
+ { children: "Home", href: "/" },
+ { children: "Category", href: "/category" },
+ { children: "Subcategory", href: "/category/subcategory" },
+ { children: "Current Page" },
];
return (
diff --git a/packages/twenty-docs/l/tr/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/tr/twenty-ui/navigation/links.mdx
index b2df26f90f..ed5884d592 100644
--- a/packages/twenty-docs/l/tr/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/tr/twenty-ui/navigation/links.mdx
@@ -66,7 +66,7 @@ Bağlantılar için stilize edilmiş bir bağlantı bileşeni.
return (
- Bizimle İletişime Geçin
+ Contact Us
);
@@ -103,7 +103,7 @@ Yuvarlak stil ile Chip bileşeni olan bir bağlantı.
return (
- Bizimle İletişime Geçin
+ Contact Us
);
diff --git a/packages/twenty-docs/l/tr/twenty-ui/navigation/menu-item.mdx b/packages/twenty-docs/l/tr/twenty-ui/navigation/menu-item.mdx
index dbc377b74c..35143362ea 100644
--- a/packages/twenty-docs/l/tr/twenty-ui/navigation/menu-item.mdx
+++ b/packages/twenty-docs/l/tr/twenty-ui/navigation/menu-item.mdx
@@ -71,13 +71,13 @@ Klavye kısayollarını belirtmek için bir menü içinde komut tarzı bir menü
export const MyComponent = () => {
const handleCommandClick = () => {
- console.log("Komut tıklandı!");
+ console.log("Command clicked!");
};
return (
{
const handleMenuItemClick = (event) => {
- console.log("Menü öğesi tıklandı!", event);
+ console.log("Menu item clicked!", event);
};
return (
@@ -125,7 +125,7 @@ A draggable menu item component designed to be used in a menu or list where item
iconButtons={[{ Icon: IconAlertCircle, onClick: handleButtonClick }]}
isTooltipOpen={false}
onClick={handleMenuItemClick}
- text="Menü öğesi sürüklenebilir"
+ text="Menu item draggable"
isDragDisabled={false}
className
/>
@@ -163,7 +163,7 @@ Bir onay kutusu ile birlikte çoklu seçim işlevselliği sağlanır.
return (
@@ -199,7 +199,7 @@ Bir avatar, bir seçim için onay kutusu ve metin içeriği ile bir çoklu seçi
return (
}
- text="İlk Seçenek"
+ text="First Option"
selected={false}
className
/>
@@ -231,13 +231,13 @@ Bir avatar, bir seçim için onay kutusu ve metin içeriği ile bir çoklu seçi
export const MyComponent = () => {
const handleNavigation = () => {
- console.log("Başka bir sayfaya yönlendirin");
+ console.log("Navigate to another page");
};
return (
@@ -268,13 +268,13 @@ Seçilebilir bir menü öğesi, isteğe bağlı sol içerik (simgeler ve metin)
export const MyComponent = () => {
const handleSelection = () => {
- console.log("Menü öğesi seçildi");
+ console.log("Menu item selected");
};
return (
{
- console.log("Menü öğesi seçildi");
+ console.log("Menu item selected");
};
return (
}
- text="İlk Seçenek"
+ text="First Option"
selected={true}
disabled={false}
hovered={false}
@@ -329,6 +329,7 @@ Bir avatar ve seçilmiş durum için gösterge (kontrol simgesi) ile beraber ist
/>
);
};
+
```
@@ -357,16 +358,16 @@ Kullanıcıların bir menüden renk seçmelerini istediğiniz senaryolar için r
export const MyComponent = () => {
const handleSelection = () => {
- console.log("Menü öğesi seçildi");
+ console.log("Menu item selected");
};
return (
@@ -404,9 +405,9 @@ A menu item with an associated toggle switch to allow users to enable or disable
return (
);
diff --git a/packages/twenty-docs/l/tr/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/tr/twenty-ui/navigation/navigation-bar.mdx
index 6ef18d7d18..e5887fca28 100644
--- a/packages/twenty-docs/l/tr/twenty-ui/navigation/navigation-bar.mdx
+++ b/packages/twenty-docs/l/tr/twenty-ui/navigation/navigation-bar.mdx
@@ -19,23 +19,23 @@ Birden fazla `NavigationBarItem` bileşeni içeren bir gezinti çubuğu oluştur
const navigationItems = [
{
- name: "Ana Sayfa",
+ name: "Home",
Icon: IconHome,
- onClick: () => console.log("Ana Sayfa tıklandı"),
+ onClick: () => console.log("Home clicked"),
},
{
- name: "Profil",
+ name: "Profile",
Icon: IconUser,
- onClick: () => console.log("Profil tıklandı"),
+ onClick: () => console.log("Profile clicked"),
},
{
- name: "Ayarlar",
+ name: "Settings",
Icon: IconSettings,
- onClick: () => console.log("Ayarlar tıklandı"),
+ onClick: () => console.log("Settings clicked"),
},
];
- return ;
+ return ;
};
```
diff --git a/packages/twenty-docs/l/tr/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/tr/twenty-ui/navigation/step-bar.mdx
index a0e8b5b1af..cd428dff4a 100644
--- a/packages/twenty-docs/l/tr/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/tr/twenty-ui/navigation/step-bar.mdx
@@ -17,9 +17,9 @@ Numaralandırılmış adımlar dizisi boyunca ilerlemeyi gösterir, aktif adım
export const MyComponent = () => {
return (
- Adım 1
- Adım 2
- Adım 3
+ Step 1
+ Step 2
+ Step 3
);
};
diff --git a/packages/twenty-docs/l/tr/user-guide/calendar-emails/capabilities/mailbox.mdx b/packages/twenty-docs/l/tr/user-guide/calendar-emails/capabilities/mailbox.mdx
index 79131a7e14..78c8eda75f 100644
--- a/packages/twenty-docs/l/tr/user-guide/calendar-emails/capabilities/mailbox.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/calendar-emails/capabilities/mailbox.mdx
@@ -24,7 +24,7 @@ E-posta görüşmeleri üç ana objede görünür:
3. **Bir E-posta Dizisi Açın**: Herhangi bir e-postaya tıklayarak tam görüşmeyi açın ve okuyun
4. **Geçmişte Gezin**: O kişiyle yaptığınız tüm e-posta geçmişini kaydırarak inceleyin
-
+
## Görecekleriniz
diff --git a/packages/twenty-docs/l/tr/user-guide/data-migration/how-tos/import-companies-via-csv.mdx b/packages/twenty-docs/l/tr/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
index 089deb9664..db006af2df 100644
--- a/packages/twenty-docs/l/tr/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
@@ -112,7 +112,7 @@ Twenty automatically tries to match your columns to fields. Review and adjust:
* **Address**: Map each part to its specific column (City, State, etc.)
* **Select fields**: Values must match existing options (or you'll map them in the next step)
-
+
## Step 5: Map Select Field Values
diff --git a/packages/twenty-docs/l/tr/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx b/packages/twenty-docs/l/tr/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
index 9bf5707e52..70a786da2f 100644
--- a/packages/twenty-docs/l/tr/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
@@ -134,7 +134,7 @@ Twenty automatically tries to match your columns to fields. Review and adjust:
| Additional emails | **Emails / Additional Emails** | Array format |
| Telefon | Separate columns | Number, Country Code, Calling Code |
-
+
### Mapping the Company Relation
diff --git a/packages/twenty-docs/l/tr/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx b/packages/twenty-docs/l/tr/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
index c700bd2864..9fe47a217a 100644
--- a/packages/twenty-docs/l/tr/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
@@ -1,5 +1,5 @@
---
-title: CSV Dosyalarınızı Hazırlayın},{
+title: Prepare Your CSV Files
description: Verilerinizi Twenty'ye içe aktarmak için biçimlendirmeye yönelik eksiksiz adım adım kılavuz.
---
diff --git a/packages/twenty-docs/l/tr/user-guide/data-model/capabilities/fields.mdx b/packages/twenty-docs/l/tr/user-guide/data-model/capabilities/fields.mdx
index d9b083b5e2..4455676297 100644
--- a/packages/twenty-docs/l/tr/user-guide/data-model/capabilities/fields.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/data-model/capabilities/fields.mdx
@@ -19,7 +19,7 @@ Standart alanları silemezsiniz, ancak ihtiyacınız yoksa devre dışı bıraka
Ayrıca standart `SELECT` türü alanların seçeneklerini özelleştirebilirsiniz; örneğin Fırsatlar'daki `Stage` alanının seçeneklerini.
-
+
### Özel Alanlar
diff --git a/packages/twenty-docs/l/tr/user-guide/data-model/how-tos/customize-your-data-model.mdx b/packages/twenty-docs/l/tr/user-guide/data-model/how-tos/customize-your-data-model.mdx
index b3658bb666..cd3f916bd5 100644
--- a/packages/twenty-docs/l/tr/user-guide/data-model/how-tos/customize-your-data-model.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/data-model/how-tos/customize-your-data-model.mdx
@@ -1,5 +1,5 @@
---
-title: Veri modelinizi özelleştirin},{
+title: Customize Your Data Model
description: Veri modeli özelleştirme seçeneklerine genel bakış.
---
diff --git a/packages/twenty-docs/l/tr/user-guide/views-pipelines/capabilities/kanban-views.mdx b/packages/twenty-docs/l/tr/user-guide/views-pipelines/capabilities/kanban-views.mdx
index a3ee36f0ba..0ff1e2bbe7 100644
--- a/packages/twenty-docs/l/tr/user-guide/views-pipelines/capabilities/kanban-views.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/views-pipelines/capabilities/kanban-views.mdx
@@ -45,7 +45,7 @@ You can hide all the fields and get an overview of all records at a glance. To e
1. Click **Options** on the top right
2. Turn on the toggle for **Compact view**
-
+
## Column Aggregations
diff --git a/packages/twenty-docs/l/tr/user-guide/views-pipelines/capabilities/table-views.mdx b/packages/twenty-docs/l/tr/user-guide/views-pipelines/capabilities/table-views.mdx
index 66c32444e9..5a5501687c 100644
--- a/packages/twenty-docs/l/tr/user-guide/views-pipelines/capabilities/table-views.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/views-pipelines/capabilities/table-views.mdx
@@ -21,7 +21,7 @@ Table views display records in rows with customizable columns—like a spreadshe
Organize records into collapsible groups based on a field of select type.
-
+
1. Click **Options**
2. Select **Group**
diff --git a/packages/twenty-docs/l/tr/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx b/packages/twenty-docs/l/tr/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
index d7df7b8a3d..f55902cf65 100644
--- a/packages/twenty-docs/l/tr/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
@@ -3,7 +3,7 @@ title: Create a Calendar View for Tasks Due
description: Visualize your tasks and deadlines on a calendar.
---
-
+
## Ön Gereksinimler
diff --git a/packages/twenty-docs/l/tr/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx b/packages/twenty-docs/l/tr/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
index de2a41b1ee..1183f96692 100644
--- a/packages/twenty-docs/l/tr/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
@@ -49,7 +49,7 @@ For a high-level overview:
Cards show only the record name.
-
+
### Add Aggregations
diff --git a/packages/twenty-docs/l/tr/user-guide/workflows/capabilities/use-branches-in-workflows.mdx b/packages/twenty-docs/l/tr/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
index 4b5b50d334..993c3e3d54 100644
--- a/packages/twenty-docs/l/tr/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
@@ -20,7 +20,7 @@ To execute only one branch based on specific conditions, **add a Filter node at
3. Set conditions on each Filter to determine when that branch should continue
4. Only the branch(es) whose Filter conditions are met will proceed
-
+
### How Filters Work
diff --git a/packages/twenty-docs/l/tr/user-guide/workflows/capabilities/workflow-actions.mdx b/packages/twenty-docs/l/tr/user-guide/workflows/capabilities/workflow-actions.mdx
index 33e0fe9f6d..6173cc7b9d 100644
--- a/packages/twenty-docs/l/tr/user-guide/workflows/capabilities/workflow-actions.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/workflows/capabilities/workflow-actions.mdx
@@ -17,7 +17,7 @@ Aksiyonlar, bir tetikleyici devreye girdiğinde neler olacağını tanımlar. Yo
## Record Actions
-
+
### Kayıt Oluştur
@@ -80,7 +80,7 @@ Seçilen bir nesnede filtreleme koşulları kullanarak kayıt bulur.
Creates a new record or updates an existing one based on matching criteria. This is useful when you're not sure if a record already exists.
-
+
**Yapılandırma**:
@@ -92,7 +92,7 @@ Creates a new record or updates an existing one based on matching criteria. This
**Matching usually works even better when adding only one unique identifier.** For example, the screenshot below will match companies based on their domain. The ID is not necessarily needed.
-
+
* Alanları doldurmak için önceki adımlardan gelen verileri kullanın
@@ -271,7 +271,7 @@ For all the following steps, you can reference variables from previous steps for
İş akışınızın bir parçası olarak harici bir API'ye istek gönderir.
-
+
**Yapılandırma**:
diff --git a/packages/twenty-docs/l/tr/user-guide/workflows/capabilities/workflow-branches.mdx b/packages/twenty-docs/l/tr/user-guide/workflows/capabilities/workflow-branches.mdx
index b18249314f..0da738af3a 100644
--- a/packages/twenty-docs/l/tr/user-guide/workflows/capabilities/workflow-branches.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/workflows/capabilities/workflow-branches.mdx
@@ -5,7 +5,7 @@ description: İş akışlarınızda paralel yollar ve koşullu mantık oluşturu
Dallar, iş akışınızı verilerinize bağlı olarak eşzamanlı veya koşullu olarak çalışabilen birden çok yola ayırmanıza olanak tanır.
-
+
## Dallar Nasıl Çalışır
diff --git a/packages/twenty-docs/l/tr/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx b/packages/twenty-docs/l/tr/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
index 6a6fe660d9..194b69f2a0 100644
--- a/packages/twenty-docs/l/tr/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
@@ -5,7 +5,7 @@ description: Create a workflow to automatically count and display the number of
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-
+
## Genel Bakış
diff --git a/packages/twenty-docs/l/tr/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx b/packages/twenty-docs/l/tr/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
index d107aac3fb..5bd7b2dc59 100644
--- a/packages/twenty-docs/l/tr/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
@@ -5,7 +5,7 @@ description: Automatically notify team members about their upcoming or overdue t
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
-
+
Send daily email reminders to each team member about their tasks due today.
diff --git a/packages/twenty-docs/l/tr/user-guide/workflows/overview.mdx b/packages/twenty-docs/l/tr/user-guide/workflows/overview.mdx
index 886a20c53d..4db40ed42d 100644
--- a/packages/twenty-docs/l/tr/user-guide/workflows/overview.mdx
+++ b/packages/twenty-docs/l/tr/user-guide/workflows/overview.mdx
@@ -58,7 +58,7 @@ After your trigger, add one or more actions:
* **Form**: Get inputs from users within Twenty UI at the time of execution
* **AI Agent** (Coming soon): Run intelligent AI tasks
-
+
### Step 4: Test and Activate
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/best-practices-server.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/best-practices-server.mdx
new file mode 100644
index 0000000000..d8f5c5ea7c
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/best-practices-server.mdx
@@ -0,0 +1,22 @@
+---
+title: Best Practices
+---
+
+This document outlines the best practices you should follow when working on the backend.
+
+## Follow a modular approach
+
+The backend follows a modular approach, which is a fundamental principle when working with NestJS. Make sure you break down your code into reusable modules to maintain a clean and organized codebase.
+Each module should encapsulate a particular feature or functionality and have a well-defined scope. This modular approach enables clear separation of concerns and removes unnecessary complexities.
+
+## Expose services to use in modules
+
+Always create services that have a clear and single responsibility, which enhances code readability and maintainability. Name the services descriptively and consistently.
+
+You should also expose services that you want to use in other modules. Exposing services to other modules is possible through NestJS's powerful dependency injection system, and promotes loose coupling between components.
+
+## Avoid using `any` type
+
+When you declare a variable as `any`, TypeScript's type checker doesn't perform any type checking, making it possible to assign any type of values to the variable. TypeScript uses type inference to determine the type of variable based on the value. By declaring it as `any`, TypeScript can no longer infer the type. This makes it hard to catch type-related errors during development, leading to runtime errors and makes the code less maintainable, less reliable, and harder to understand for others.
+
+This is why everything should have a type. So if you create a new object with a first name and last name, you should create an interface or type that contains a first name and last name that defines the shape of the object you are manipulating.
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/custom-objects.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/custom-objects.mdx
new file mode 100644
index 0000000000..7feec7a639
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/custom-objects.mdx
@@ -0,0 +1,39 @@
+---
+title: Custom Objects
+---
+
+Objects are structures that allow you to store data (records, attributes, and values) specific to an organization. Twenty provides both standard and custom objects.
+
+Standard objects are in-built objects with a set of attributes available for all users. Examples of standard objects in Twenty include Company and Person. Standard objects have standard fields that are also available for all Twenty users, like Company.displayName.
+
+Custom objects are objects that you can create to store information that is unique to your organization. They are not built-in; members of your workspace can create and customize custom objects to hold information that standard objects aren't suitable for.
+
+## High-level schema
+
+
+
+
+
+
+
+## How it works
+
+Custom objects come from metadata tables that determine the shape, name, and type of the objects. All this information is present in the metadata schema database, consisting of tables:
+
+* **DataSource**: Details where the data is present.
+* **Object**: Describes the object and links to a DataSource.
+* **Field**: Outlines an Object's fields and connects to the Object.
+
+To add a custom object, the workspaceMember will query the /metadata API. This updates the metadata accordingly and computes a GraphQL schema based on the metadata, storing it in a GQL cache for later use.
+
+
+
+
+
+
+
+To fetch data, the process involves making queries through the /graphql endpoint and passing them through the Query Resolver.
+
+
+
+
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/feature-flags.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/feature-flags.mdx
new file mode 100644
index 0000000000..a261cfec3c
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/feature-flags.mdx
@@ -0,0 +1,46 @@
+---
+title: Feature Flags
+---
+
+Feature flags are used to hide experimental features. For Twenty, they are set on workspace level and not on a user level.
+
+## Adding a new feature flag
+
+In `FeatureFlagKey.ts` add the feature flag:
+
+```ts
+type FeatureFlagKey =
+ | 'IS_FEATURENAME_ENABLED'
+ | ...;
+```
+
+Also add it to the enum in `feature-flag.entity.ts`:
+
+```ts
+enum FeatureFlagKeys {
+ IsFeatureNameEnabled = 'IS_FEATURENAME_ENABLED',
+ ...
+}
+```
+
+To apply a feature flag on a **backend** feature use:
+
+```ts
+@Gate({
+ featureFlag: 'IS_FEATURENAME_ENABLED',
+})
+```
+
+To apply a feature flag on a **frontend** feature use:
+
+```ts
+const isFeatureNameEnabled = useIsFeatureEnabled('IS_FEATURENAME_ENABLED');
+```
+
+## Configure feature flags for the deployment
+
+Change the corresponding record in the Table `core.featureFlag`:
+
+| id | key | workspaceId | value |
+| ------ | ------------------------ | ----------- | ------ |
+| Random | `IS_FEATURENAME_ENABLED` | WorkspaceID | `true` |
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx
new file mode 100644
index 0000000000..233d92ac8a
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx
@@ -0,0 +1,125 @@
+---
+title: Folder Architecture
+info: A detailed look into our server folder architecture
+---
+
+The backend directory structure is as follows:
+
+```
+server
+ └───ability
+ └───constants
+ └───core
+ └───database
+ └───decorators
+ └───filters
+ └───guards
+ └───health
+ └───integrations
+ └───metadata
+ └───workspace
+ └───utils
+```
+
+## Ability
+
+Defines permissions and includes handlers for each entity.
+
+## Decorators
+
+Defines custom decorators in NestJS for added functionality.
+
+See [custom decorators](https://docs.nestjs.com/custom-decorators) for more details.
+
+## Filters
+
+Includes exception filters to handle exceptions that might occur in GraphQL endpoints.
+
+## Guards
+
+See [guards](https://docs.nestjs.com/guards) for more details.
+
+## Health
+
+Includes a publicly available REST API (healthz) that returns a JSON to confirm whether the database is working as expected.
+
+## Metadata
+
+Defines custom objects and makes available a GraphQL API (graphql/metadata).
+
+## Workspace
+
+Generates and serves custom GraphQL schema based on the metadata.
+
+### Workspace Directory Structure
+
+```
+workspace
+
+ └───workspace-schema-builder
+ └───factories
+ └───graphql-types
+ └───database
+ └───interfaces
+ └───object-definitions
+ └───services
+ └───storage
+ └───utils
+ └───workspace-resolver-builder
+ └───factories
+ └───interfaces
+ └───workspace-query-builder
+ └───factories
+ └───interfaces
+ └───workspace-query-runner
+ └───interfaces
+ └───utils
+ └───workspace-datasource
+ └───workspace-manager
+ └───workspace-migration-runner
+ └───utils
+ └───workspace.module.ts
+ └───workspace.factory.spec.ts
+ └───workspace.factory.ts
+```
+
+The root of the workspace directory includes the `workspace.factory.ts`, a file containing the `createGraphQLSchema` function. This function generates workspace-specific schema by using the metadata to tailor a schema for individual workspaces. By separating the schema and resolver construction, we use the `makeExecutableSchema` function, which combines these discrete elements.
+
+This strategy is not just about organization, but also helps with optimization, such as caching generated type definitions to enhance performance and scalability.
+
+### Workspace Schema builder
+
+Generates the GraphQL schema, and includes:
+
+#### Factories:
+
+Specialised constructors to generate GraphQL-related constructs.
+
+* The type.factory translates field metadata into GraphQL types using `TypeMapperService`.
+* The type-definition.factory creates GraphQL input or output objects derived from `objectMetadata`.
+
+#### GraphQL Types
+
+Includes enumerations, inputs, objects, and scalars, and serves as the building blocks for the schema construction.
+
+#### Interfaces and Object Definitions
+
+Contains the blueprints for GraphQL entities, and includes both predefined and custom types like `MONEY` or `URL`.
+
+#### Services
+
+Contains the service responsible for associating FieldMetadataType with its appropriate GraphQL scalar or query modifiers.
+
+#### Storage
+
+Includes the `TypeDefinitionsStorage` class that contains reusable type definitions, preventing duplication of GraphQL types.
+
+### Workspace Resolver Builder
+
+Creates resolver functions for querying and mutating the GraphQL schema.
+
+Each factory in this directory is responsible for producing a distinct resolver type, such as the `FindManyResolverFactory`, designed for adaptable application across various tables.
+
+### Workspace Query Runner
+
+Runs the generated queries on the database and parses the result.
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/queue.mdx
index 28af3137da..6148c0fbf0 100644
--- a/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/queue.mdx
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/queue.mdx
@@ -1,42 +1,41 @@
---
-title: 消息队列
+title: Message Queue
---
-队列支持异步操作的执行。 它们可用于执行后台任务,例如在注册时发送欢迎邮件。
-每个用例都将拥有一个继承自 `MessageQueueServiceBase` 的队列类。
+Queues facilitate async operations to be performed. They can be used for performing background tasks such as sending a welcome email on register.
+Each use case will have its own queue class extended from `MessageQueueServiceBase`.
-当前,我们仅支持使用 `bull-mq`[bull-mq](https://bullmq.io/) 作为队列驱动。
+Currently, we only support `bull-mq`[bull-mq](https://bullmq.io/) as the queue driver.
-## 创建和使用新队列的步骤
+## Steps to create and use a new queue
-1. 在枚举 `MESSAGE_QUEUES` 下为您的新队列添加队列名称。
-2. 提供以队列名称为依赖令牌的队列工厂实现。
-3. 在所需模块/服务中以队列名称作为依赖令牌注入您创建的队列。
-4. 添加与生产者相同令牌注入的工作类。
+1. Add a queue name for your new queue under enum `MESSAGE_QUEUES`.
+2. Provide the factory implementation of the queue with the queue name as the dependency token.
+3. Inject the queue that you created in the required module/service with the queue name as the dependency token.
+4. Add worker class with token based injection just like producer.
-### 示例用法
+### Example usage
```ts
-类 Resolver {
- 构造函数(@Inject(MESSAGE_QUEUES.custom) 私有队列: MessageQueueService) {}
+class Resolver {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
- 异步某行为事件() {
- //业务逻辑
+ async onSomeAction() {
+ //business logic
await this.queue.add(someData);
}
}
-//异步工作者
-类 CustomWorker {
- 构造函数(@Inject(MESSAGE_QUEUES.custom) 私有队列: MessageQueueService) {
+//async worker
+class CustomWorker {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
this.initWorker();
}
- 异步 initWorker() {
+ async initWorker() {
await this.queue.work(async ({ id, data }) => {
- //工作者逻辑
+ //worker logic
});
}
}
-
```
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/server-commands.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/server-commands.mdx
new file mode 100644
index 0000000000..6951909788
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/server-commands.mdx
@@ -0,0 +1,101 @@
+---
+title: Backend Commands
+---
+
+## Useful commands
+
+These commands should be executed from packages/twenty-server folder.
+From any other folder you can run `npx nx {command} twenty-server` (or `npx nx run twenty-server:{command}`).
+
+### First time setup
+
+```
+npx nx database:reset twenty-server # setup the database with dev seeds
+```
+
+### Starting the server
+
+```
+npx nx run twenty-server:start
+```
+
+### Lint
+
+```
+npx nx run twenty-server:lint # pass --fix to fix lint errors
+```
+
+### Test
+
+```
+npx nx run twenty-server:test:unit # run unit tests
+npx nx run twenty-server:test:integration # run integration tests
+```
+
+Note: you can run `npx nx run twenty-server:test:integration:with-db-reset` in case you need to reset the database before running the integration tests.
+
+### Resetting the database
+
+If you want to reset and seed the database, you can run the following command:
+
+```bash
+npx nx run twenty-server:database:reset
+```
+
+### Migrations
+
+#### For objects in Core/Metadata schemas (TypeORM)
+
+```bash
+npx nx run twenty-server:typeorm migration:generate src/database/typeorm/core/migrations/nameOfYourMigration -d src/database/typeorm/core/core.datasource.ts
+```
+
+#### For Workspace objects
+
+There are no migrations files, migration are generated automatically for each workspace,
+stored in the database, and applied with this command
+
+```bash
+npx nx run twenty-server:command workspace:sync-metadata -f
+```
+
+
+ This will drop the database and re-run the migrations and seed.
+
+ Make sure to back up any data you want to keep before running this command.
+
+
+## Tech Stack
+
+Twenty primarily uses NestJS for the backend.
+
+Prisma was the first ORM we used. But in order to allow users to create custom fields and custom objects, a lower-level made more sense as we need to have fine-grained control. The project now uses TypeORM.
+
+Here's what the tech stack now looks like.
+
+**Core**
+
+* [NestJS](https://nestjs.com/)
+* [TypeORM](https://typeorm.io/)
+* [GraphQL Yoga](https://the-guild.dev/graphql/yoga-server)
+
+**Database**
+
+* [Postgres](https://www.postgresql.org/)
+
+**Third-party integrations**
+
+* [Sentry](https://sentry.io/welcome/) for tracking bugs
+
+**Testing**
+
+* [Jest](https://jestjs.io/)
+
+**Tooling**
+
+* [Yarn](https://yarnpkg.com/)
+* [ESLint](https://eslint.org/)
+
+**Development**
+
+* [AWS EKS](https://aws.amazon.com/eks/)
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/zapier.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/zapier.mdx
new file mode 100644
index 0000000000..46bcd563fc
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/zapier.mdx
@@ -0,0 +1,83 @@
+---
+title: Zapier App
+---
+
+Effortlessly sync Twenty with 3000+ apps using [Zapier](https://zapier.com/). Automate tasks, boost productivity, and supercharge your customer relationships!
+
+## About Zapier
+
+Zapier is a tool that allows you to automate workflows by connecting the apps that your team uses every day. The fundamental concept of Zapier is automation workflows, called Zaps, and include triggers and actions.
+
+You can learn more about how Zapier works [here](https://zapier.com/how-it-works).
+
+## Setup
+
+### Step 1: Install Zapier packages
+
+```bash
+cd packages/twenty-zapier
+
+yarn
+```
+
+### Step 2: Login with the CLI
+
+Use your Zapier credentials to log in using the CLI:
+
+```bash
+zapier login
+```
+
+### Step 3: Set environment variables
+
+From the `packages/twenty-zapier` folder, run:
+
+```bash
+cp .env.example .env
+```
+
+Run the application locally, go to [http://localhost:3000/settings/api-webhooks](http://localhost:3000/settings/api-webhooks), and generate an API key.
+
+Replace the **YOUR_API_KEY** value in the `.env` file with the API key you just generated.
+
+## Development
+
+
+ Make sure to run `yarn build` before any `zapier` command.
+
+
+### Test
+
+```bash
+yarn test
+```
+
+### Lint
+
+```bash
+yarn format
+```
+
+### Watch and compile as you edit code
+
+```bash
+yarn watch
+```
+
+### Validate your Zapier app
+
+```bash
+yarn validate
+```
+
+### Deploy your Zapier app
+
+```bash
+yarn deploy
+```
+
+### List all Zapier CLI commands
+
+```bash
+zapier
+```
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/bug-and-requests.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/bug-and-requests.mdx
new file mode 100644
index 0000000000..4db64b703d
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/bug-and-requests.mdx
@@ -0,0 +1,78 @@
+---
+title: Bugs, Requests & Pull Requests
+info: Report issues, request features, and contribute code
+---
+
+## Reporting Bugs
+
+To report a bug, please [create an issue on GitHub](https://github.com/twentyhq/twenty/issues/new).
+
+You can also ask for help on [Discord](https://discord.gg/cx5n4Jzs57).
+
+## Feature Requests
+
+If you're not sure if it's a bug, and you feel it's closer to a feature request, then you should probably [open a discussion instead](https://github.com/twentyhq/twenty/discussions/new).
+
+## Submit a Pull Request
+
+Contributing code to Twenty starts with a pull request (PR).
+
+### Before You Start
+
+1. Check [existing issues](https://github.com/twentyhq/twenty/issues) for related work
+2. For new features, open an issue first to discuss
+3. Review our [Code of Conduct](https://github.com/twentyhq/twenty/blob/main/CODE_OF_CONDUCT.md)
+
+### Fork and Clone
+
+1. Fork the repository on GitHub
+2. Clone your fork:
+
+```bash
+git clone https://github.com/YOUR_USERNAME/twenty.git
+cd twenty
+```
+
+3. Add upstream remote:
+
+```bash
+git remote add upstream https://github.com/twentyhq/twenty.git
+```
+
+### Create a Branch
+
+```bash
+git checkout -b feature/your-feature-name
+```
+
+Use descriptive branch names:
+
+* `feature/add-export-button`
+* `fix/login-redirect-issue`
+* `docs/update-api-guide`
+
+### Make Your Changes
+
+1. Write clean, well-documented code
+2. Follow existing code style
+3. Add tests for new functionality
+4. Update documentation if needed
+
+### Submit Your PR
+
+1. Push your branch:
+
+```bash
+git push origin feature/your-feature-name
+```
+
+2. Open a PR on GitHub
+3. Fill in the PR template
+4. Link related issues
+
+### PR Checklist
+
+* [ ] Code follows project style guidelines
+* [ ] Tests pass locally
+* [ ] Documentation is updated
+* [ ] PR description explains the changes
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/best-practices-front.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
new file mode 100644
index 0000000000..187c2d848c
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/best-practices-front.mdx
@@ -0,0 +1,325 @@
+---
+title: Best Practices
+---
+
+This document outlines the best practices you should follow when working on the frontend.
+
+## State management
+
+React and Recoil handle state management in the codebase.
+
+### Use `useRecoilState` to store state
+
+It's good practice to create as many atoms as you need to store your state.
+
+
+ It's better to use extra atoms than trying to be too concise with props drilling.
+
+
+```tsx
+export const myAtomState = atom({
+ key: 'myAtomState',
+ default: 'default value',
+});
+
+export const MyComponent = () => {
+ const [myAtom, setMyAtom] = useRecoilState(myAtomState);
+
+ return (
+
+ setMyAtom(e.target.value)}
+ />
+
+ );
+}
+```
+
+### Do not use `useRef` to store state
+
+Avoid using `useRef` to store state.
+
+If you want to store state, you should use `useState` or `useRecoilState`.
+
+See [how to manage re-renders](#managing-re-renders) if you feel like you need `useRef` to prevent some re-renders from happening.
+
+## Managing re-renders
+
+Re-renders can be hard to manage in React.
+
+Here are some rules to follow to avoid unnecessary re-renders.
+
+Keep in mind that you can **always** avoid re-renders by understanding their cause.
+
+### Work at the root level
+
+Avoiding re-renders in new features is now made easy by eliminating them at the root level.
+
+The `PageChangeEffect` sidecar component contains just one `useEffect` that holds all the logic to execute on a page change.
+
+That way you know that there's just one place that can trigger a re-render.
+
+### Always think twice before adding `useEffect` in your codebase
+
+Re-renders are often caused by unnecessary `useEffect`.
+
+You should think whether you need `useEffect`, or if you can move the logic in a event handler function.
+
+You'll find it generally easy to move the logic in a `handleClick` or `handleChange` function.
+
+You can also find them in libraries like Apollo: `onCompleted`, `onError`, etc.
+
+### Use a sibling component to extract `useEffect` or data fetching logic
+
+If you feel like you need to add a `useEffect` in your root component, you should consider extracting it in a sidecar component.
+
+You can apply the same for data fetching logic, with Apollo hooks.
+
+```tsx
+// ❌ Bad, will cause re-renders even if data is not changing,
+// because useEffect needs to be re-evaluated
+export const PageComponent = () => {
+ const [data, setData] = useRecoilState(dataState);
+ const [someDependency] = useRecoilState(someDependencyState);
+
+ useEffect(() => {
+ if(someDependency !== data) {
+ setData(someDependency);
+ }
+ }, [someDependency]);
+
+ return {data}
;
+};
+
+export const App = () => (
+
+
+
+);
+```
+
+```tsx
+// ✅ Good, will not cause re-renders if data is not changing,
+// because useEffect is re-evaluated in another sibling component
+export const PageComponent = () => {
+ const [data, setData] = useRecoilState(dataState);
+
+ return {data}
;
+};
+
+export const PageData = () => {
+ const [data, setData] = useRecoilState(dataState);
+ const [someDependency] = useRecoilState(someDependencyState);
+
+ useEffect(() => {
+ if(someDependency !== data) {
+ setData(someDependency);
+ }
+ }, [someDependency]);
+
+ return <>>;
+};
+
+export const App = () => (
+
+
+
+
+);
+```
+
+### Use recoil family states and recoil family selectors
+
+Recoil family states and selectors are a great way to avoid re-renders.
+
+They are useful when you need to store a list of items.
+
+### You shouldn't use `React.memo(MyComponent)`
+
+Avoid using `React.memo()` because it does not solve the cause of the re-render, but instead breaks the re-render chain, which can lead to unexpected behavior and make the code very hard to refactor.
+
+### Limit `useCallback` or `useMemo` usage
+
+They are often not necessary and will make the code harder to read and maintain for a gain of performance that is unnoticeable.
+
+## Console.logs
+
+`console.log` statements are valuable during development, offering real-time insights into variable values and code flow. But, leaving them in production code can lead to several issues:
+
+1. **Performance**: Excessive logging can affect the runtime performance, especially on client-side applications.
+
+2. **Security**: Logging sensitive data can expose critical information to anyone who inspects the browser's console.
+
+3. **Cleanliness**: Filling up the console with logs can obscure important warnings or errors that developers or tools need to see.
+
+4. **Professionalism**: End users or clients checking the console and seeing a myriad of log statements might question the code's quality and polish.
+
+Make sure you remove all `console.logs` before pushing the code to production.
+
+## Naming
+
+### Variable Naming
+
+Variable names ought to precisely depict the purpose or function of the variable.
+
+#### The issue with generic names
+
+Generic names in programming are not ideal because they lack specificity, leading to ambiguity and reduced code readability. Such names fail to convey the variable or function's purpose, making it challenging for developers to understand the code's intent without deeper investigation. This can result in increased debugging time, higher susceptibility to errors, and difficulties in maintenance and collaboration. Meanwhile, descriptive naming makes the code self-explanatory and easier to navigate, enhancing code quality and developer productivity.
+
+```tsx
+// ❌ Bad, uses a generic name that doesn't communicate its
+// purpose or content clearly
+const [value, setValue] = useState('');
+```
+
+```tsx
+// ✅ Good, uses a descriptive name
+const [email, setEmail] = useState('');
+```
+
+#### Some words to avoid in variable names
+
+* dummy
+
+### Event handlers
+
+Event handler names should start with `handle`, while `on` is a prefix used to name events in components props.
+
+```tsx
+// ❌ Bad
+const onEmailChange = (val: string) => {
+ // ...
+};
+```
+
+```tsx
+// ✅ Good
+const handleEmailChange = (val: string) => {
+ // ...
+};
+```
+
+## Optional Props
+
+Avoid passing the default value for an optional prop.
+
+**EXAMPLE**
+
+Take the`EmailField` component defined below:
+
+```tsx
+type EmailFieldProps = {
+ value: string;
+ disabled?: boolean;
+};
+
+const EmailField = ({ value, disabled = false }: EmailFieldProps) => (
+
+);
+```
+
+**Usage**
+
+```tsx
+// ❌ Bad, passing in the same value as the default value adds no value
+const Form = () => ;
+```
+
+```tsx
+// ✅ Good, assumes the default value
+const Form = () => ;
+```
+
+## Component as props
+
+Try as much as possible to pass uninstantiated components as props, so children can decide on their own of what props they need to pass.
+
+The most common example for that is icon components:
+
+```tsx
+const SomeParentComponent = () => ;
+
+// In MyComponent
+const MyComponent = ({ MyIcon }: { MyIcon: IconComponent }) => {
+ const theme = useTheme();
+
+ return (
+
+
+
+ )
+};
+```
+
+For React to understand that the component is a component, you need to use PascalCase, to later instantiate it with ``
+
+## Prop Drilling: Keep It Minimal
+
+Prop drilling, in the React context, refers to the practice of passing state variables and their setters through many component layers, even if intermediary components don't use them. While sometimes necessary, excessive prop drilling can lead to:
+
+1. **Decreased Readability**: Tracing where a prop originates or where it's utilized can become convoluted in a deeply nested component structure.
+
+2. **Maintenance Challenges**: Changes in one component's prop structure might require adjustments in several components, even if they don't directly use the prop.
+
+3. **Reduced Component Reusability**: A component receiving a lot of props solely for passing them down becomes less general-purpose and harder to reuse in different contexts.
+
+If you feel that you are using excessive prop drilling, see [state management best practices](#state-management).
+
+## Imports
+
+When importing, opt for the designated aliases rather than specifying complete or relative paths.
+
+**The Aliases**
+
+```js
+{
+ alias: {
+ "~": path.resolve(__dirname, "src"),
+ "@": path.resolve(__dirname, "src/modules"),
+ "@testing": path.resolve(__dirname, "src/testing"),
+ },
+}
+```
+
+**Usage**
+
+```tsx
+// ❌ Bad, specifies the entire relative path
+import {
+ CatalogDecorator
+} from '../../../../../testing/decorators/CatalogDecorator';
+import {
+ ComponentDecorator
+} from '../../../../../testing/decorators/ComponentDecorator';
+```
+
+```tsx
+// ✅ Good, utilises the designated aliases
+import { CatalogDecorator } from '~/testing/decorators/CatalogDecorator';
+import { ComponentDecorator } from 'twenty-ui/testing';
+```
+
+## Schema Validation
+
+[Zod](https://github.com/colinhacks/zod) is the schema validator for untyped objects:
+
+```js
+const validationSchema = z
+ .object({
+ exist: z.boolean(),
+ email: z
+ .string()
+ .email('Email must be a valid email'),
+ password: z
+ .string()
+ .regex(PASSWORD_REGEX, 'Password must contain at least 8 characters'),
+ })
+ .required();
+
+type Form = z.infer;
+```
+
+## Breaking Changes
+
+Always perform thorough manual testing before proceeding to guarantee that modifications haven’t caused disruptions elsewhere, given that tests have not yet been extensively integrated.
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
index a8e85c59e1..064ac5c256 100644
--- a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
@@ -1,11 +1,11 @@
---
-title: 文件夹架构
-info: 深入了解我们的文件夹架构
+title: Folder Architecture
+info: A detailed look into our folder architecture
---
-在本指南中,您将探索项目目录结构的详细信息,以及它如何促进 Twenty 的组织和可维护性。
+In this guide, you will explore the details of the project directory structure and how it contributes to the organization and maintainability of Twenty.
-遵循此文件夹架构约定,可以更轻松地找到与特定功能相关的文件,并确保应用程序的可扩展性和可维护性。
+By following this folder architecture convention, it's easier to find the files related to specific features and ensure that the application is scalable and maintainable.
```
front
@@ -22,14 +22,14 @@ front
└───...
```
-## 页面
+## Pages
-包含由应用程序路由定义的顶级组件。 它们从模块文件夹中导入更多低级组件(详细信息见下文)。
+Includes the top-level components defined by the application routes. They import more low-level components from the modules folder (more details below).
-## 模块
+## Modules
-每个模块代表一个功能或一组功能,包括其特定组件、状态和操作逻辑。
-它们都应遵循以下结构。 您可以在模块中嵌套模块(称为子模块),同样的规则将适用。
+Each module represents a feature or a group of feature, comprising its specific components, states, and operational logic.
+They should all follow the structure below. You can nest modules within modules (referred to as submodules) and the same rules will apply.
```
module1
@@ -50,60 +50,60 @@ module1
└───utils
```
-### 上下文
+### Contexts
-上下文是一种通过组件树传递数据的方法,不必在每个级别手动传 props。
+A context is a way to pass data through the component tree without having to pass props down manually at every level.
-详情请参阅 [React Context](https://react.dev/reference/react#context-hooks)。
+See [React Context](https://react.dev/reference/react#context-hooks) for more details.
### GraphQL
-包含片段、查询和变更。
+Includes fragments, queries, and mutations.
-详情请参阅 [GraphQL](https://graphql.org/learn/)。
+See [GraphQL](https://graphql.org/learn/) for more details.
-* 片段
+* Fragments
-片段是查询的可重用部分,可以在不同地方使用。 使用片段可以更容易地避免代码重复。
+A fragment is a reusable piece of a query, which you can use in different places. By using fragments, it's easier to avoid duplicating code.
-详情请参阅 [GraphQL Fragments](https://graphql.org/learn/queries/#fragments)。
+See [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) for more details.
-* 查询
+* Queries
-详情请参阅 [GraphQL Queries](https://graphql.org/learn/queries/)。
+See [GraphQL Queries](https://graphql.org/learn/queries/) for more details.
-* 变更
+* Mutations
-详情请参阅 [GraphQL Mutations](https://graphql.org/learn/queries/#mutations)。
+See [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) for more details.
-### 钩子
+### Hooks
-详情请参阅 [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks)。
+See [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) for more details.
-### 状态
+### States
-包含状态管理逻辑。 [RecoilJS](https://recoiljs.org) 处理这部分。
+Contains the state management logic. [RecoilJS](https://recoiljs.org) handles this.
-* 选择器:详情请参阅 [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors)。
+* Selectors: See [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) for more details.
-React 内置状态管理仍然在组件内处理状态。
+React's built-in state management still handles state within a component.
-### 工具
+### Utils
-应仅包含可重用的纯函数。 否则,请在 `hooks` 文件夹中创建自定义钩子。
+Should just contain reusable pure functions. Otherwise, create custom hooks in the `hooks` folder.
## UI
-包含应用程序中使用的所有可重用的 UI 组件。
+Contains all the reusable UI components used in the application.
-这个文件夹可以包含子文件夹,像 `data`、`display`、`feedback` 和 `input`,用于特定类型的组件。 每个组件都应是自包含和可重用的,以便您可以在应用程序的不同部分使用它。
+This folder can contain sub-folders, like `data`, `display`, `feedback`, and `input` for specific types of components. Each component should be self-contained and reusable, so that you can use it in different parts of the application.
-通过将 UI 组件与 `modules` 文件夹中的其他组件分开,可以更轻松地保持一致的设计,并在更改 UI 时不影响其他部分(业务逻辑)的代码库。
+By separating the UI components from the other components in the `modules` folder, it's easier to maintain a consistent design and to make changes to the UI without affecting other parts (business logic) of the codebase.
-## 接口和依赖关系
+## Interface and dependencies
-您可以从任何模块中导入其他模块代码,但 `ui` 文件夹除外。 这将使代码易于测试。
+You can import other module code from any module except for the `ui` folder. This will keep its code easy to test.
-### 内部
+### Internal
-模块的每个部分(钩子、状态等) 都可以有一个 `internal` 文件夹,其中包含仅在模块内使用的部分。
+Each part (hooks, states, ...) of a module can have an `internal` folder, which contains parts that are just used within the module.
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
index 088e938f0d..b240929b77 100644
--- a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -1,22 +1,22 @@
---
-title: 前端命令
+title: Frontend Commands
---
-## 实用命令
+## Useful commands
-### 启动应用
+### Starting the app
```bash
npx nx start twenty-front
```
-### 根据API graphql schema重新生成graphql schema
+### Regenerate graphql schema based on API graphql schema
```bash
npx nx run twenty-front:graphql:generate --configuration=metadata
```
-或
+OR
```bash
npx nx run twenty-front:graphql:generate
@@ -25,66 +25,66 @@ npx nx run twenty-front:graphql:generate
### Lint
```bash
-npx nx run twenty-front:lint # 传递 --fix 以修复 lint 错误
+npx nx run twenty-front:lint # pass --fix to fix lint errors
```
-## 翻译
+## Translations
```bash
npx nx run twenty-front:lingui:extract
npx nx run twenty-front:lingui:compile
```
-### 测试
+### Test
```bash
-npx nx run twenty-front:test # 运行 jest 测试
-npx nx run twenty-front:storybook:serve:dev # 运行 storybook
-npx nx run twenty-front:storybook:test # 运行测试 # (需要正在运行 yarn storybook:serve:dev)
-npx nx run twenty-front:storybook:coverage # (需要正在运行 yarn storybook:serve:dev)
+npx nx run twenty-front:test # run jest tests
+npx nx run twenty-front:storybook:serve:dev # run storybook
+npx nx run twenty-front:storybook:test # run tests # (needs yarn storybook:serve:dev to be running)
+npx nx run twenty-front:storybook:coverage # (needs yarn storybook:serve:dev to be running)
```
-## 技术栈
+## Tech Stack
-项目有一个干净且简单的技术栈,使用最少的样板代码。
+The project has a clean and simple stack, with minimal boilerplate code.
-**应用**
+**App**
* [React](https://react.dev/)
* [Apollo](https://www.apollographql.com/docs/)
-* [GraphQL 代码生成](https://the-guild.dev/graphql/codegen)
+* [GraphQL Codegen](https://the-guild.dev/graphql/codegen)
* [Recoil](https://recoiljs.org/docs/introduction/core-concepts)
* [TypeScript](https://www.typescriptlang.org/)
-**测试**
+**Testing**
* [Jest](https://jestjs.io/)
* [Storybook](https://storybook.js.org/)
-**工具**
+**Tooling**
* [Yarn](https://yarnpkg.com/)
* [Craco](https://craco.js.org/docs/)
* [ESLint](https://eslint.org/)
-## 架构
+## Architecture
-### 路由
+### Routing
-[React Router](https://reactrouter.com/) 负责处理路由。
+[React Router](https://reactrouter.com/) handles the routing.
-为了避免不必要的[重新渲染](/l/zh/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders),所有路由逻辑都在 `PageChangeEffect` 的 `useEffect` 中。
+To avoid unnecessary [re-renders](/l/zh/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) all the routing logic is in a `useEffect` in `PageChangeEffect`.
-### 状态管理
+### State Management
-[Recoil](https://recoiljs.org/docs/introduction/core-concepts) 处理状态管理。
+[Recoil](https://recoiljs.org/docs/introduction/core-concepts) handles state management.
-查看[最佳实践](/l/zh/developers/contribute/capabilities/frontend-development/best-practices-front#state-management)以获取有关状态管理的更多信息。
+See [best practices](/l/zh/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) for more information on state management.
-## 测试
+## Testing
-[Jest](https://jestjs.io/) 用于单元测试,而 [Storybook](https://storybook.js.org/) 用于组件测试。
+[Jest](https://jestjs.io/) serves as the tool for unit testing while [Storybook](https://storybook.js.org/) is for component testing.
-Jest 主要用于测试工具函数,而不是组件本身。
+Jest is mainly for testing utility functions, and not components themselves.
-Storybook 用于测试隔离组件的行为,以及展示设计系统。
+Storybook is for testing the behavior of isolated components, as well as displaying the design system.
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/hotkeys.mdx
index 9b6656078d..43cde50e63 100644
--- a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/hotkeys.mdx
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -1,42 +1,42 @@
---
-title: 快捷键
+title: Hotkeys
---
-## 介绍
+## Introduction
-当你需要监听一个快捷键时,通常会使用 `onKeyDown` 事件监听器。
+When you need to listen to a hotkey, you would normally use the `onKeyDown` event listener.
-然而,在 `twenty-front` 中,你可能会遇到用于不同组件的相同快捷键之间的冲突,这些组件同时挂载。
+In `twenty-front` however, you might have conflicts between same hotkeys that are used in different components, mounted at the same time.
-例如,如果你有一个页面监听回车键,而一个包含选择组件的模态框也监听回车键,在所有这些组件同时挂载时可能会发生冲突。
+For example, if you have a page that listens for the Enter key, and a modal that listens for the Enter key, with a Select component inside that modal that listens for the Enter key, you might have a conflict when all are mounted at the same time.
-## `useScopedHotkeys` hook
+## The `useScopedHotkeys` hook
-为了解决这个问题,我们有一个自定义的 hook,可以在不产生冲突的情况下监听快捷键。
+To handle this problem, we have a custom hook that makes it possible to listen to hotkeys without any conflict.
-您可以将它放在组件中,它只会在组件挂载并且指定的 **快捷键范围** 激活时监听快捷键。
+You place it in a component, and it will listen to the hotkeys only when the component is mounted AND when the specified **hotkey scope** is active.
-## 在实践中如何监听快捷键?
+## How to listen for hotkeys in practice?
-设置快捷键监听涉及两个步骤:
+There are two steps involved in setting up hotkey listening :
-1. 设置将会监听快捷键的[快捷键范围](#what-is-a-hotkey-scope-)
-2. 使用 `useScopedHotkeys` hook 来监听快捷键
+1. Set the [hotkey scope](#what-is-a-hotkey-scope-) that will listen to hotkeys
+2. Use the `useScopedHotkeys` hook to listen to hotkeys
-即使在简单的页面中,也需要设置快捷键范围,因为其他界面元素如左侧菜单或命令菜单也可能监听快捷键。
+Setting up hotkey scopes is required even in simple pages, because other UI elements like left menu or command menu might also listen to hotkeys.
-## 快捷键的使用案例
+## Use cases for hotkeys
-通常情况下,会有两种需要快捷键的使用案例:
+In general, you'll have two use cases that require hotkeys :
-1. 在页面或页面中挂载的组件中
-2. 在由于用户操作而获得焦点的模态组件中
+1. In a page or a component mounted in a page
+2. In a modal-type component that takes the focus due to a user action
-第二种使用情况可以递归发生:例如,在模态框中的下拉框。
+The second use case can happen recursively : a dropdown in a modal for example.
-### 在页面中监听快捷键
+### Listening to hotkeys in a page
-示例:
+Example :
```tsx
const PageListeningEnter = () => {
@@ -45,37 +45,37 @@ const PageListeningEnter = () => {
goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope();
- // 1. 设置快捷键范围在 useEffect 中
+ // 1. Set the hotkey scope in a useEffect
useEffect(() => {
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleEnterPage,
);
- // 在组件卸载时恢复到先前的快捷键范围
+ // Revert to the previous hotkey scope when the component is unmounted
return () => {
goBackToPreviousHotkeyScope();
};
}, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
- // 2. 使用 useScopedHotkeys hook
+ // 2. Use the useScopedHotkeys hook
useScopedHotkeys(
Key.Enter,
() => {
- // 当用户按下回车键时,此页面上执行的一些逻辑
+ // Some logic executed on this page when the user presses Enter
// ...
},
ExampleHotkeyScopes.ExampleEnterPage,
);
- return 我的页面监听回车键
;
+ return My page that listens for Enter
;
};
```
-### 在模态类型组件中监听快捷键
+### Listening to hotkeys in a modal-type component
-在这个示例中,我们将使用一个模态组件,该组件监听 Esc 键来告诉其父组件关闭自己。
+For this example we'll use a modal component that listens for the Escape key to tell its parent to close it.
-这里用户交互正在改变范围。
+Here the user interaction is changing the scope.
```tsx
const ExamplePageWithModal = () => {
@@ -87,7 +87,7 @@ const ExamplePageWithModal = () => {
} = usePreviousHotkeyScope();
const handleOpenModalClick = () => {
- // 1. 当用户打开模态框时设置快捷键范围
+ // 1. Set the hotkey scope when user opens the modal
setShowModal(true);
setHotkeyScopeAndMemorizePreviousScope(
ExampleHotkeyScopes.ExampleModal,
@@ -95,26 +95,26 @@ const ExamplePageWithModal = () => {
};
const handleModalClose = () => {
- // 1. 当模态框关闭时恢复到先前的快捷键范围
+ // 1. Revert to the previous hotkey scope when the modal is closed
setShowModal(false);
goBackToPreviousHotkeyScope();
};
return
-
我的页面有模态框
- 打开模态框
+ My page with a modal
+ Open modal
{showModal && }
;
};
```
-然后在模态组件中:
+Then in the modal component :
```tsx
const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
- // 2. 使用 useScopedHotkeys hook 来监听 Esc 键。
- // 注意,esc 是许多其他组件可能使用的常见快捷键
- // 因此,请务必使用快捷键范围以避免冲突
+ // 2. Use the useScopedHotkeys hook to listen for Escape.
+ // Note that escape is a common hotkey that could be used by many other components
+ // So it's important to use a hotkey scope to avoid conflicts
useScopedHotkeys(
Key.Escape,
() => {
@@ -123,23 +123,23 @@ const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
ExampleHotkeyScopes.ExampleModal,
);
- return 我的模态组件
;
+ return My modal component
;
};
```
-当你不确定只使用 useEffect 并且挂载/卸载操作是否足以避免冲突时,使用此模式很重要。
+It's important to use this pattern when you're not sure that just using a useEffect with mount/unmount will be enough to avoid conflicts.
-这些冲突可能很难调试,而且可能会在使用useEffects时更频繁地发生。
+Those conflicts can be hard to debug, and it might happen more often than not with useEffects.
-## 什么是快捷键范围?
+## What is a hotkey scope?
-快捷键范围是表示快捷键激活上下文的字符串。 通常编码为枚举。
+A hotkey scope is a string that represents a context in which the hotkeys are active. It is generally encoded as an enum.
-当你更改快捷键范围时,监听此范围的快捷键将启用,监听其他范围的快捷键将被禁用。
+When you change the hotkey scope, the hotkeys that are listening to this scope will be enabled and the hotkeys that are listening to other scopes will be disabled.
-一次只能设置一个范围。
+You can set only one scope at a time.
-例如,每个页面的快捷键范围在 `PageHotkeyScope` 枚举中定义:
+As an example, the hotkey scopes for each page are defined in the `PageHotkeyScope` enum:
```tsx
export enum PageHotkeyScope {
@@ -160,7 +160,7 @@ export enum PageHotkeyScope {
}
```
-在内部,当前选择的范围存储在整个应用程序共享的 Recoil 状态中:
+Internally, the currently selected scope is stored in a Recoil state that is shared across the application :
```tsx
export const currentHotkeyScopeState = createState({
@@ -169,10 +169,10 @@ export const currentHotkeyScopeState = createState({
});
```
-但这个 Recoil 状态不应该手动处理! 我们将在下一节中学习如何使用它。
+But this Recoil state should never be handled manually ! We'll see how to use it in the next section.
-## 内部是如何运作的?
+## How is it working internally?
-我们在 [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) 之上制作了一个薄包装,使其性能更高并避免不必要的重新渲染。
+We made a thin wrapper on top of [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) that makes it more performant and avoids unnecessary re-renders.
-我们还创建了一个 Recoil 状态来处理快捷键范围状态,并使其在整个应用程序中可用。
+We also create a Recoil state to handle the hotkey scope state and make it available everywhere in the application.
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/storybook.mdx
index 1a6e63662a..5c7f5fa52a 100644
--- a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/storybook.mdx
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -1,8 +1,8 @@
---
title: Storybook
-description: 浏览 Twenty 的 UI 组件库
+description: Browse Twenty's UI component library
---
-在 Storybook 中查看我们完整的组件库和文档。
+View our complete component library and documentation in Storybook.
-[打开 Storybook →](https://storybook.twenty.com)
+[Open Storybook →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/style-guide.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/style-guide.mdx
new file mode 100644
index 0000000000..e3ba4a44f0
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/style-guide.mdx
@@ -0,0 +1,290 @@
+---
+title: Style Guide
+---
+
+This document includes the rules to follow when writing code.
+
+The goal here is to have a consistent codebase, which is easy to read and easy to maintain.
+
+For this, it's better to be a bit more verbose than to be too concise.
+
+Always keep in mind that people read code more often than they write it, specially on an open source project, where anyone can contribute.
+
+There are a lot of rules that are not defined here, but that are automatically checked by linters.
+
+## React
+
+### Use functional components
+
+Always use TSX functional components.
+
+Do not use default `import` with `const`, because it's harder to read and harder to import with code completion.
+
+```tsx
+// ❌ Bad, harder to read, harder to import with code completion
+const MyComponent = () => {
+ return Hello World
;
+};
+
+export default MyComponent;
+
+// ✅ Good, easy to read, easy to import with code completion
+export function MyComponent() {
+ return Hello World
;
+};
+```
+
+### Props
+
+Create the type of the props and call it `(ComponentName)Props` if there's no need to export it.
+
+Use props destructuring.
+
+```tsx
+// ❌ Bad, no type
+export const MyComponent = (props) => Hello {props.name}
;
+
+// ✅ Good, type
+type MyComponentProps = {
+ name: string;
+};
+
+export const MyComponent = ({ name }: MyComponentProps) => Hello {name}
;
+```
+
+#### Refrain from using `React.FC` or `React.FunctionComponent` to define prop types
+
+```tsx
+/* ❌ - Bad, defines the component type annotations with `FC`
+ * - With `React.FC`, the component implicitly accepts a `children` prop
+ * even if it's not defined in the prop type. This might not always be
+ * desirable, especially if the component doesn't intend to render
+ * children.
+ */
+const EmailField: React.FC<{
+ value: string;
+}> = ({ value }) => ;
+```
+
+```tsx
+/* ✅ - Good, a separate type (OwnProps) is explicitly defined for the
+ * component's props
+ * - This method doesn't automatically include the children prop. If
+ * you want to include it, you have to specify it in OwnProps.
+ */
+type EmailFieldProps = {
+ value: string;
+};
+
+const EmailField = ({ value }: EmailFieldProps) => (
+
+);
+```
+
+#### No Single Variable Prop Spreading in JSX Elements
+
+Avoid using single variable prop spreading in JSX elements, like `{...props}`. This practice often results in code that is less readable and harder to maintain because it's unclear which props the component is receiving.
+
+```tsx
+/* ❌ - Bad, spreads a single variable prop into the underlying component
+ */
+const MyComponent = (props: OwnProps) => {
+ return ;
+}
+```
+
+```tsx
+/* ✅ - Good, Explicitly lists all props
+ * - Enhances readability and maintainability
+ */
+const MyComponent = ({ prop1, prop2, prop3 }: MyComponentProps) => {
+ return ;
+};
+```
+
+Rationale:
+
+* At a glance, it's clearer which props the code passes down, making it easier to understand and maintain.
+* It helps to prevent tight coupling between components via their props.
+* Linting tools make it easier to identify misspelled or unused props when you list props explicitly.
+
+## JavaScript
+
+### Use nullish-coalescing operator `??`
+
+```tsx
+// ❌ Bad, can return 'default' even if value is 0 or ''
+const value = process.env.MY_VALUE || 'default';
+
+// ✅ Good, will return 'default' only if value is null or undefined
+const value = process.env.MY_VALUE ?? 'default';
+```
+
+### Use optional chaining `?.`
+
+```tsx
+// ❌ Bad
+onClick && onClick();
+
+// ✅ Good
+onClick?.();
+```
+
+## TypeScript
+
+### Use `type` instead of `interface`
+
+Always use `type` instead of `interface`, because they almost always overlap, and `type` is more flexible.
+
+```tsx
+// ❌ Bad
+interface MyInterface {
+ name: string;
+}
+
+// ✅ Good
+type MyType = {
+ name: string;
+};
+```
+
+### Use string literals instead of enums
+
+[String literals](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types) are the go-to way to handle enum-like values in TypeScript. They are easier to extend with Pick and Omit, and offer a better developer experience, specially with code completion.
+
+You can see why TypeScript recommends avoiding enums [here](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
+
+```tsx
+// ❌ Bad, utilizes an enum
+enum Color {
+ Red = "red",
+ Green = "green",
+ Blue = "blue",
+}
+
+let color = Color.Red;
+```
+
+```tsx
+// ✅ Good, utilizes a string literal
+
+let color: "red" | "green" | "blue" = "red";
+```
+
+#### GraphQL and internal libraries
+
+You should use enums that GraphQL codegen generates.
+
+It's also better to use an enum when using an internal library, so the internal library doesn't have to expose a string literal type that is not related to the internal API.
+
+Example:
+
+```TSX
+const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+} = usePreviousHotkeyScope();
+
+setHotkeyScopeAndMemorizePreviousScope(
+ RelationPickerHotkeyScope.RelationPicker,
+);
+```
+
+## Styling
+
+### Use StyledComponents
+
+Style the components with [styled-components](https://emotion.sh/docs/styled).
+
+```tsx
+// ❌ Bad
+Hello World
+```
+
+```tsx
+// ✅ Good
+const StyledTitle = styled.div`
+ color: red;
+`;
+```
+
+Prefix styled components with "Styled" to differentiate them from "real" components.
+
+```tsx
+// ❌ Bad
+const Title = styled.div`
+ color: red;
+`;
+```
+
+```tsx
+// ✅ Good
+const StyledTitle = styled.div`
+ color: red;
+`;
+```
+
+### Theming
+
+Utilizing the theme for the majority of component styling is the preferred approach.
+
+#### Units of measurement
+
+Avoid using `px` or `rem` values directly within the styled components. The necessary values are generally already defined in the theme, so it’s recommended to make use of the theme for these purposes.
+
+#### Colors
+
+Refrain from introducing new colors; instead, use the existing palette from the theme. Should there be a situation where the palette does not align, please leave a comment so that the team can rectify it.
+
+```tsx
+// ❌ Bad, directly specifies style values without utilizing the theme
+const StyledButton = styled.button`
+ color: #333333;
+ font-size: 1rem;
+ font-weight: 400;
+ margin-left: 4px;
+ border-radius: 50px;
+`;
+```
+
+```tsx
+// ✅ Good, utilizes the theme
+const StyledButton = styled.button`
+ color: ${({ theme }) => theme.font.color.primary};
+ font-size: ${({ theme }) => theme.font.size.md};
+ font-weight: ${({ theme }) => theme.font.weight.regular};
+ margin-left: ${({ theme }) => theme.spacing(1)};
+ border-radius: ${({ theme }) => theme.border.rounded};
+`;
+```
+
+## Enforcing No-Type Imports
+
+Avoid type imports. To enforce this standard, an ESLint rule checks for and reports any type imports. This helps maintain consistency and readability in the TypeScript code.
+
+```tsx
+// ❌ Bad
+import { type Meta, type StoryObj } from '@storybook/react';
+
+// ❌ Bad
+import type { Meta, StoryObj } from '@storybook/react';
+
+// ✅ Good
+import { Meta, StoryObj } from '@storybook/react';
+```
+
+### Why No-Type Imports
+
+* **Consistency**: By avoiding type imports and using a single approach for both type and value imports, the codebase remains consistent in its module import style.
+
+* **Readability**: No-type imports improve code readability by making it clear when you're importing values or types. This reduces ambiguity and makes it easier to understand the purpose of imported symbols.
+
+* **Maintainability**: It enhances codebase maintainability because developers can identify and locate type-only imports when reviewing or modifying code.
+
+### ESLint Rule
+
+An ESLint rule, `@typescript-eslint/consistent-type-imports`, enforces the no-type import standard. This rule will generate errors or warnings for any type import violations.
+
+Please note that this rule specifically addresses rare edge cases where unintentional type imports occur. TypeScript itself discourages this practice, as mentioned in the [TypeScript 3.8 release notes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). In most situations, you should not need to use type-only imports.
+
+To ensure your code complies with this rule, make sure to run ESLint as part of your development workflow.
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/work-with-figma.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
new file mode 100644
index 0000000000..6cffcc405e
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
@@ -0,0 +1,59 @@
+---
+title: Work with Figma
+info: Learn how you can collaborate with Twenty's Figma
+---
+
+Figma is a collaborative interface design tool that aids in bridging the communication barrier between designers and developers.
+This guide explains how you can collaborate with Figma.
+
+## Access
+
+1. **Access the shared link:** You can access the project's Figma file [here](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty).
+2. **Sign in:** If you're not already signed in, Figma will prompt you to do so.
+ Key features are only available to logged-in users, such as the developer mode and the ability to select a dedicated frame.
+
+
+ You will not be able to collaborate effectively without an account.
+
+
+## Figma structure
+
+On the left sidebar, you can access the different pages of Twenty's Figma. This is how they're organized:
+
+* **Components page:** This is the first page. The designer uses it to create and organize the reusable design elements used throughout the design file. For example, buttons, icons, symbols, or any other reusable components. It serves to maintain consistency across the design.
+* **Main page:** The second page is the main page, which shows the complete user interface of the project. You can press ***Play*** to use the full app prototype.
+* **Features pages:** The other pages are typically dedicated to features in progress. They contain the design of specific features or modules of the application or website. They are typically still in progress.
+
+## Useful Tips
+
+With read-only access, you can't edit the design, but you can access all features that will be useful to convert the designs into code.
+
+### Use the Dev mode
+
+Figma's Dev Mode enhances developers' productivity by providing easy design navigation, effective asset management, efficient communication tools, toolbox integrations, quick code snippets, and key layer information, bridging the gap between design and development. You can learn more about Dev Mode [here](https://www.figma.com/dev-mode/).
+
+Switch to the "Developer" mode in the right part of the toolbar to see design specs, copy CSS, and access assets.
+
+### Use the Prototype
+
+Click on any element on the canvas and press the “Play” button at the top right edge of the interface to access the prototype view. Prototype mode allows you to interact with the design as if it were the final product. It demonstrates the flow between screens and how interface elements like buttons, links, or menus behave when interacted with.
+
+1. **Understanding transitions and animations:** In the Prototype mode, you can view any transitions or animations added by a designer between screens or UI elements, providing clear visual instructions to developers on the intended behavior and style.
+2. **Implementation clarification:** A prototype can also help reduce ambiguities. Developers can interact with it to gain a better understanding of the functionality or appearance of particular elements.
+
+For more comprehensive details and guidance on learning the Figma platform, you can visit the official [Figma Documentation](https://help.figma.com/hc/en-us).
+
+### Measure distances
+
+Select an element, hold `Option` key (Mac) or `Alt` key (Windows), then hover over another element to see the distance between them.
+
+### Figma extension for VSCode (Recommended)
+
+[Figma for VS Code](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension)
+lets you navigate and inspect design files, collaborate with designers, track changes, and speed up implementation - all without leaving your text editor.
+It's part of our recommended extensions.
+
+## Collaboration
+
+1. **Using Comments:** You are welcome to use the comment feature by clicking on the bubble icon in the left part of the toolbar.
+2. **Cursor chat:** A nice feature of Figma is the Cursor chat. Just press `;` on Mac and `/` on Windows to send a message if you see someone else using Figma as the same time as you.
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/local-setup.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/local-setup.mdx
new file mode 100644
index 0000000000..760f373022
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/local-setup.mdx
@@ -0,0 +1,333 @@
+---
+title: Local Setup
+description: The guide for contributors (or curious developers) who want to run Twenty locally.
+---
+
+## Prerequisites
+
+
+
+ Before you can install and use Twenty, make sure you install the following on your computer:
+
+ * [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+ * [Node v24.5.0](https://nodejs.org/en/download)
+ * [yarn v4](https://yarnpkg.com/getting-started/install)
+ * [nvm](https://github.com/nvm-sh/nvm/blob/master/README.md)
+
+
+ `npm` won't work, you should use `yarn` instead. Yarn is now shipped with Node.js, so you don't need to install it separately.
+ You only have to run `corepack enable` to enable Yarn if you haven't done it yet.
+
+
+
+
+ 1. Install WSL
+ Open PowerShell as Administrator and run:
+
+ ```powershell
+ wsl --install
+ ```
+
+ You should now see a prompt to restart your computer. If not, restart it manually.
+
+ Upon restart, a powershell window will open and install Ubuntu. This may take up some time.
+ You'll see a prompt to create a username and password for your Ubuntu installation.
+
+ 2. Install and configure git
+
+ ```bash
+ sudo apt-get install git
+
+ git config --global user.name "Your Name"
+
+ git config --global user.email "youremail@domain.com"
+ ```
+
+ 3. Install nvm, node.js and yarn
+
+
+ Use `nvm` to install the correct `node` version. The `.nvmrc` ensures all contributors use the same version.
+
+
+ ```bash
+ sudo apt-get install curl
+
+ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
+ ```
+
+ Close and reopen your terminal to use nvm. Then run the following commands.
+
+ ```bash
+
+ nvm install # installs recommended node version
+
+ nvm use # use recommended node version
+
+ corepack enable
+ ```
+
+
+
+---
+
+## Step 1: Git Clone
+
+In your terminal, run the following command.
+
+
+
+ If you haven't already set up SSH keys, you can learn how to do so [here](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/about-ssh).
+
+ ```bash
+ git clone git@github.com:twentyhq/twenty.git
+ ```
+
+
+
+ ```bash
+ git clone https://github.com/twentyhq/twenty.git
+ ```
+
+
+
+## Step 2: Position yourself at the root
+
+```bash
+cd twenty
+```
+
+You should run all commands in the following steps from the root of the project.
+
+## Step 3: Set up a PostgreSQL Database
+
+
+
+ **Option 1 (preferred):** To provision your database locally:
+ Use the following link to install Postgresql on your Linux machine: [Postgresql Installation](https://www.postgresql.org/download/linux/)
+
+ ```bash
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ Note: You might need to add `sudo -u postgres` to the command before `psql` to avoid permission errors.
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+ **Option 1 (preferred):** To provision your database locally with `brew`:
+
+ ```bash
+ brew install postgresql@16
+ export PATH="/opt/homebrew/opt/postgresql@16/bin:$PATH"
+ brew services start postgresql@16
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ You can verify if the PostgreSQL server is running by executing:
+
+ ```bash
+ brew services list
+ ```
+
+ The installer might not create the `postgres` user by default when installing
+ via Homebrew on MacOS. Instead, it creates a PostgreSQL role that matches your macOS
+ username (e.g., "john").
+ To check and create the `postgres` user if necessary, follow these steps:
+
+ ```bash
+ # Connect to PostgreSQL
+ psql postgres
+ or
+ psql -U $(whoami) -d postgres
+ ```
+
+ Once at the psql prompt (postgres=#), run:
+
+ ```bash
+ # List existing PostgreSQL roles
+ \du
+ ```
+
+ You'll see output similar to:
+
+ ```bash
+ Role name | Attributes | Member of
+ -----------+-------------+-----------
+ john | Superuser | {}
+ ```
+
+ If you do not see a `postgres` role listed, proceed to the next step.
+ Create the `postgres` role manually:
+
+ ```bash
+ CREATE ROLE postgres WITH SUPERUSER LOGIN;
+ ```
+
+ This creates a superuser role named `postgres` with login access.
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+ All the following steps are to be run in the WSL terminal (within your virtual machine)
+
+ **Option 1:** To provision your Postgresql locally:
+ Use the following link to install Postgresql on your Linux virtual machine: [Postgresql Installation](https://www.postgresql.org/download/linux/)
+
+ ```bash
+ psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;"
+ ```
+
+ Note: You might need to add `sudo -u postgres` to the command before `psql` to avoid permission errors.
+
+ **Option 2:** If you have docker installed:
+ Running Docker on WSL adds an extra layer of complexity.
+ Only use this option if you are comfortable with the extra steps involved, including turning on [Docker Desktop WSL2](https://docs.docker.com/desktop/wsl).
+
+ ```bash
+ make postgres-on-docker
+ ```
+
+
+
+You can now access the database at [localhost:5432](localhost:5432), with user `postgres` and password `postgres` .
+
+## Step 4: Set up a Redis Database (cache)
+
+Twenty requires a redis cache to provide the best performance
+
+
+
+ **Option 1:** To provision your Redis locally:
+ Use the following link to install Redis on your Linux machine: [Redis Installation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+ **Option 1 (preferred):** To provision your Redis locally with `brew`:
+
+ ```bash
+ brew install redis
+ ```
+
+ Start your redis server:
+ `brew services start redis`
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+ **Option 1:** To provision your Redis locally:
+ Use the following link to install Redis on your Linux virtual machine: [Redis Installation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)
+
+ **Option 2:** If you have docker installed:
+
+ ```bash
+ make redis-on-docker
+ ```
+
+
+
+If you need a Client GUI, we recommend [redis insight](https://redis.io/insight/) (free version available)
+
+## Step 5: Setup environment variables
+
+Use environment variables or `.env` files to configure your project. More info [here](/l/zh/developers/self-host/capabilities/setup)
+
+Copy the `.env.example` files in `/front` and `/server`:
+
+```bash
+cp ./packages/twenty-front/.env.example ./packages/twenty-front/.env
+cp ./packages/twenty-server/.env.example ./packages/twenty-server/.env
+```
+
+
+ **Multi-Workspace Mode:** By default, Twenty runs in single-workspace mode where only one workspace can be created. To enable multi-workspace support (useful for testing subdomain-based features), set `IS_MULTIWORKSPACE_ENABLED=true` in your server `.env` file. See [Multi-Workspace Mode](/l/zh/developers/self-host/capabilities/setup#multi-workspace-mode) for details.
+
+
+## Step 6: Installing dependencies
+
+To build Twenty server and seed some data into your database, run the following command:
+
+```bash
+yarn
+```
+
+Note that `npm` or `pnpm` won't work
+
+## Step 7: Running the project
+
+
+
+ Depending on your Linux distribution, Redis server might be started automatically.
+ If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro.
+
+
+
+ Redis should already be running. If not, run:
+
+ ```bash
+ brew services start redis
+ ```
+
+
+
+ Depending on your Linux distribution, Redis server might be started automatically.
+ If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro.
+
+
+
+Set up your database with the following command:
+
+```bash
+npx nx database:reset twenty-server
+```
+
+Start the server, the worker and the frontend services:
+
+```bash
+npx nx start twenty-server
+npx nx worker twenty-server
+npx nx start twenty-front
+```
+
+Alternatively, you can start all services at once:
+
+```bash
+npx nx start
+```
+
+## Step 8: Use Twenty
+
+**Frontend**
+
+Twenty's frontend will be running at [http://localhost:3001](http://localhost:3001).
+You can log in using the default demo account: `tim@apple.dev` (password: `tim@apple.dev`)
+
+**Backend**
+
+* Twenty's server will be up and running at [http://localhost:3000](http://localhost:3000)
+* The GraphQL API can be accessed at [http://localhost:3000/graphql](http://localhost:3000/graphql)
+* The REST API can be reached at [http://localhost:3000/rest](http://localhost:3000/rest)
+
+## Troubleshooting
+
+If you encounter any problem, check [Troubleshooting](/l/zh/developers/self-host/capabilities/troubleshooting) for solutions.
diff --git a/packages/twenty-docs/l/zh/developers/contribute/contribute.mdx b/packages/twenty-docs/l/zh/developers/contribute/contribute.mdx
new file mode 100644
index 0000000000..d1684bf455
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/contribute.mdx
@@ -0,0 +1,32 @@
+---
+title: Contribute
+description: Contribute to Twenty's open-source development.
+---
+
+
+
+
+
+## Overview
+
+Twenty is open-source and welcomes contributions from the community. Whether you're fixing bugs, adding features, or improving documentation, your contributions help make Twenty better for everyone.
+
+## Ways to Contribute
+
+* **Report bugs**: Help identify and document issues
+* **Submit features**: Propose and implement new functionality
+* **Improve documentation**: Make our docs clearer and more helpful
+* **Frontend development**: Work on the React-based UI
+* **Backend development**: Contribute to the NestJS server
+
+## Getting Started
+
+
+
+ Report issues or request features
+
+
+
+ Contribute to the UI
+
+
diff --git a/packages/twenty-docs/l/zh/developers/extend/capabilities/apis.mdx b/packages/twenty-docs/l/zh/developers/extend/capabilities/apis.mdx
new file mode 100644
index 0000000000..e872a654b1
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/extend/capabilities/apis.mdx
@@ -0,0 +1,147 @@
+---
+title: APIs
+description: Query and modify your CRM data programmatically using REST or GraphQL.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Twenty was built to be developer-friendly, offering powerful APIs that adapt to your custom data model. We provide four distinct API types to meet different integration needs.
+
+## Developer-First Approach
+
+Twenty generates APIs specifically for your data model:
+
+* **No long IDs required**: Use your object and field names directly in endpoints
+* **Standard and custom objects treated equally**: Your custom objects get the same API treatment as built-in ones
+* **Dedicated endpoints**: Each object and field gets its own API endpoint
+* **Custom documentation**: Generated specifically for your workspace's data model
+
+
+ Your personalized API documentation is available under **Settings → API & Webhooks** after creating an API key. Since Twenty generates APIs that match your custom data model, the documentation is unique to your workspace.
+
+
+## The Two API Types
+
+### Core API
+
+Accessed on `/rest/` or `/graphql/`
+
+Work with your actual **records** (the data):
+
+* Create, read, update, delete People, Companies, Opportunities, etc.
+* Query and filter data
+* Manage record relationships
+
+### Metadata API
+
+Accessed on `/rest/metadata/` or `/metadata/`
+
+Manage your **workspace and data model**:
+
+* Create, modify, or delete objects and fields
+* Configure workspace settings
+* Define relationships between objects
+
+## REST vs GraphQL
+
+Both Core and Metadata APIs are available in REST and GraphQL formats:
+
+| Format | Available Operations |
+| ----------- | ---------------------------------------------------------- |
+| **REST** | CRUD, batch operations, upserts |
+| **GraphQL** | Same + **batch upserts**, relationship queries in one call |
+
+Choose based on your needs — both formats access the same data.
+
+## API Endpoints
+
+| Environment | Base URL |
+| --------------- | ------------------------- |
+| **Cloud** | `https://api.twenty.com/` |
+| **Self-Hosted** | `https://{your-domain}/` |
+
+## Authentication
+
+Every API request requires an API key in the header:
+
+```
+Authorization: Bearer YOUR_API_KEY
+```
+
+### Create an API Key
+
+1. Go to **Settings → APIs & Webhooks**
+2. Click **+ Create key**
+3. Configure:
+ * **Name**: Descriptive name for the key
+ * **Expiration Date**: When the key expires
+4. Click **Save**
+5. **Copy immediately** — the key is only shown once
+
+
+
+
+ Your API key grants access to sensitive data. Don't share it with untrusted services. If compromised, disable it immediately and generate a new one.
+
+
+### Assign a Role to an API Key
+
+For better security, assign a specific role to limit access:
+
+1. Go to **Settings → Roles**
+2. Click on the role to assign
+3. Open the **Assignment** tab
+4. Under **API Keys**, click **+ Assign to API key**
+5. Select the API key
+
+The key will inherit that role's permissions. See [Permissions](/l/zh/user-guide/permissions-access/capabilities/permissions) for details.
+
+### Manage API Keys
+
+**Regenerate**: Settings → APIs & Webhooks → Click key → **Regenerate**
+
+**Delete**: Settings → APIs & Webhooks → Click key → **Delete**
+
+## API Playground
+
+Test your APIs directly in the browser with our built-in playground — available for both **REST** and **GraphQL**.
+
+### Access the Playground
+
+1. Go to **Settings → APIs & Webhooks**
+2. Create an API key (required)
+3. Click on **REST API** or **GraphQL API** to open the playground
+
+### What You Get
+
+* **Interactive documentation**: Generated for your specific data model
+* **Live testing**: Execute real API calls against your workspace
+* **Schema explorer**: Browse available objects, fields, and relationships
+* **Request builder**: Construct queries with autocomplete
+
+The playground reflects your custom objects and fields, so documentation is always accurate for your workspace.
+
+## Batch Operations
+
+Both REST and GraphQL support batch operations:
+
+* **Batch size**: Up to 60 records per request
+* **Operations**: Create, update, delete multiple records
+
+**GraphQL-only features:**
+
+* **Batch Upsert**: Create or update in one call
+* Use plural object names (e.g., `CreateCompanies` instead of `CreateCompany`)
+
+## Rate Limits
+
+API requests are throttled to ensure platform stability:
+
+| Limit | Value |
+| -------------- | -------------------- |
+| **Requests** | 100 calls per minute |
+| **Batch size** | 60 records per call |
+
+
+ Use batch operations to maximize throughput — process up to 60 records in a single API call instead of making individual requests.
+
diff --git a/packages/twenty-docs/l/zh/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/zh/developers/extend/capabilities/apps.mdx
new file mode 100644
index 0000000000..dc528fa780
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/extend/capabilities/apps.mdx
@@ -0,0 +1,522 @@
+---
+title: Twenty Apps
+description: Build and manage Twenty customizations as code.
+---
+
+
+ Apps are currently in alpha testing. The feature is functional but still evolving.
+
+
+## What Are Apps?
+
+Apps let you build and manage Twenty customizations **as code**. Instead of configuring everything through the UI, you define your data model and serverless functions in code — making it faster to build, maintain, and roll out to multiple workspaces.
+
+**What you can do today:**
+
+* Define custom objects and fields as code (managed data model)
+* Build serverless functions with custom triggers
+* Deploy the same app across multiple workspaces
+
+**Coming soon:**
+
+* Custom UI layouts and components
+
+## Prerequisites
+
+* Node.js 24+ and Yarn 4
+* A Twenty workspace and an API key (create one at https://app.twenty.com/settings/api-webhooks)
+
+## Getting Started
+
+Create a new app using the official scaffolder, then authenticate and start developing:
+
+```bash filename="Terminal"
+# Scaffold a new app
+npx create-twenty-app@latest my-twenty-app
+cd my-twenty-app
+
+# Authenticate using your API key (you'll be prompted)
+yarn auth
+
+# Start dev mode: automatically syncs local changes to your workspace
+yarn dev
+```
+
+From here you can:
+
+```bash filename="Terminal"
+# Add a new entity to your application (guided)
+yarn create-entity
+
+# Generate a typed Twenty client and workspace entity types
+yarn generate
+
+# Run a one‑time sync (instead of watch mode)
+yarn sync
+
+# Watch your application's functions logs
+yarn logs
+
+# Uninstall the application from the current workspace
+yarn uninstall
+
+# Display commands' help
+yarn help
+```
+
+See also: the CLI reference pages for [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) and [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk).
+
+## Project structure (scaffolded)
+
+When you run `npx create-twenty-app@latest my-twenty-app`, the scaffolder:
+
+* Copies a minimal base application into `my-twenty-app/`
+* Adds a local `twenty-sdk` dependency and Yarn 4 configuration
+* Creates config files and scripts wired to the `twenty` CLI
+* Generates a default application config and a default function role
+
+A freshly scaffolded app looks like this:
+
+```text filename="my-twenty-app/"
+my-twenty-app/
+ package.json
+ yarn.lock
+ .gitignore
+ .nvmrc
+ .yarnrc.yml
+ .yarn/
+ releases/
+ yarn-4.9.2.cjs
+ install-state.gz
+ eslint.config.mjs
+ tsconfig.json
+ README.md
+ src/
+ application.config.ts
+ role.config.ts
+ // your entities, actions, and other app files
+```
+
+At a high level:
+
+* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall`, and `auth` that delegate to the local `twenty` CLI.
+* **.gitignore**: Ignores common artifacts such as `node_modules`, `.yarn`, `generated/` (typed client), `dist/`, `build/`, coverage folders, log files, and `.env*` files.
+* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Lock and configure the Yarn 4 toolchain used by the project.
+* **.nvmrc**: Pins the Node.js version expected by the project.
+* **eslint.config.mjs** and **tsconfig.json**: Provide linting and TypeScript configuration for your app’s TypeScript sources.
+* **README.md**: A short README in the app root with basic instructions.
+* **src/**: The main place where you define your application-as-code:
+ * `application.config.ts`: Global configuration for your app (metadata and runtime wiring). See “Application config” below.
+ * `role.config.ts`: Default function role used by your serverless functions. See “Default function role” below.
+ * Future entities, actions/functions, and any supporting code you add.
+
+Later commands will add more files and folders:
+
+* `yarn generate` will create a `generated/` folder (typed Twenty client + workspace types).
+* `yarn create-entity` will add entity definition files under `src/` for your custom objects.
+
+## Authentication
+
+The first time you run `yarn auth`, you'll be prompted for:
+
+* API URL (defaults to http://localhost:3000 or your current workspace profile)
+* API key
+
+Your credentials are stored per-user in `~/.twenty/config.json`. You can maintain multiple profiles and switch using `--workspace `.
+
+Examples:
+
+```bash filename="Terminal"
+# Login interactively (recommended)
+yarn auth
+
+# Use a specific workspace profile
+yarn auth --workspace my-custom-workspace
+```
+
+## Use the SDK resources (types & config)
+
+The twenty-sdk provides typed building blocks you use inside your app. Below are the key pieces you'll touch most often.
+
+### Defining objects
+
+Custom objects are regular TypeScript classes annotated with decorators from `twenty-sdk`. They live under `src/objects/` in your app and describe both schema and behavior for records in your workspace.
+
+Here is an example `postCard` object from the Hello World app:
+
+```typescript
+import { type Note } from '../../generated';
+
+import {
+ type AddressField,
+ Field,
+ FieldType,
+ type FullNameField,
+ Object,
+ OnDeleteAction,
+ Relation,
+ RelationType,
+ STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS,
+} from 'twenty-sdk';
+
+enum PostCardStatus {
+ DRAFT = 'DRAFT',
+ SENT = 'SENT',
+ DELIVERED = 'DELIVERED',
+ RETURNED = 'RETURNED',
+}
+
+@Object({
+ universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05',
+ nameSingular: 'postCard',
+ namePlural: 'postCards',
+ labelSingular: 'Post card',
+ labelPlural: 'Post cards',
+ description: ' A post card object',
+ icon: 'IconMail',
+})
+export class PostCard {
+ @Field({
+ universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b',
+ type: FieldType.TEXT,
+ label: 'Content',
+ description: "Postcard's content",
+ icon: 'IconAbc',
+ })
+ content: string;
+
+ @Field({
+ universalIdentifier: 'c6aa31f3-da76-4ac6-889f-475e226009ac',
+ type: FieldType.FULL_NAME,
+ label: 'Recipient name',
+ icon: 'IconUser',
+ })
+ recipientName: FullNameField;
+
+ @Field({
+ universalIdentifier: '95045777-a0ad-49ec-98f9-22f9fc0c8266',
+ type: FieldType.ADDRESS,
+ label: 'Recipient address',
+ icon: 'IconHome',
+ })
+ recipientAddress: AddressField;
+
+ @Field({
+ universalIdentifier: '87b675b8-dd8c-4448-b4ca-20e5a2234a1e',
+ type: FieldType.SELECT,
+ label: 'Status',
+ icon: 'IconSend',
+ defaultValue: `'${PostCardStatus.DRAFT}'`,
+ options: [
+ { value: PostCardStatus.DRAFT, label: 'Draft', position: 0, color: 'gray' },
+ { value: PostCardStatus.SENT, label: 'Sent', position: 1, color: 'orange' },
+ { value: PostCardStatus.DELIVERED, label: 'Delivered', position: 2, color: 'green' },
+ { value: PostCardStatus.RETURNED, label: 'Returned', position: 3, color: 'orange' },
+ ],
+ })
+ status: PostCardStatus;
+
+ @Relation({
+ universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe',
+ type: RelationType.ONE_TO_MANY,
+ label: 'Notes',
+ icon: 'IconComment',
+ inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note,
+ onDelete: OnDeleteAction.CASCADE,
+ })
+ notes: Note[];
+
+ @Field({
+ universalIdentifier: 'e06abe72-5b44-4e7f-93be-afc185a3c433',
+ type: FieldType.DATE_TIME,
+ label: 'Delivered at',
+ icon: 'IconCheck',
+ isNullable: true,
+ defaultValue: null,
+ })
+ deliveredAt?: Date;
+}
+```
+
+Key points:
+
+* The `@Object` decorator defines the object identity and labels used across the workspace; its `universalIdentifier` must be unique and stable across deployments.
+* Each `@Field` decorator defines a field on the object with a type, label, and its own stable `universalIdentifier`.
+* `@Relation` wires this object to other objects (standard or custom) and controls cascade behavior with `onDelete`.
+* You can scaffold new objects using `yarn create-entity`, which guides you through naming, fields, and relationships, then generates object files similar to the `postCard` example.
+
+### Application config (application.config.ts)
+
+Every app has a single `application.config.ts` file that describes:
+
+* **Who the app is**: identifiers, display name, and description.
+* **How its functions run**: which role they use for permissions.
+* **(Optional) variables**: key–value pairs exposed to your functions as environment variables.
+
+When you scaffold a new app, you start with a minimal config:
+
+```typescript
+import { type ApplicationConfig } from 'twenty-sdk';
+
+const config: ApplicationConfig = {
+ universalIdentifier: '',
+ displayName: 'My Twenty App',
+ description: 'My first Twenty app',
+ functionRoleUniversalIdentifier: '',
+};
+
+export default config;
+```
+
+You can gradually extend this file as your app grows. For example, you can add an icon and application-scoped variables:
+
+```typescript
+import { type ApplicationConfig } from 'twenty-sdk';
+
+const config: ApplicationConfig = {
+ universalIdentifier: '',
+ displayName: 'My App',
+ description: 'What your app does',
+ icon: 'IconWorld', // Choose an icon by name
+ applicationVariables: {
+ DEFAULT_RECIPIENT_NAME: {
+ universalIdentifier: '',
+ description: 'Default recipient used by functions',
+ value: 'Jane Doe',
+ isSecret: false,
+ },
+ },
+ functionRoleUniversalIdentifier: '',
+};
+
+export default config;
+```
+
+Notes:
+
+* `universalIdentifier` fields are deterministic IDs you own; generate them once and keep them stable across syncs.
+* `applicationVariables` become environment variables for your functions (for example, `DEFAULT_RECIPIENT_NAME` is available as `process.env.DEFAULT_RECIPIENT_NAME`).
+* `functionRoleUniversalIdentifier` must match the role you define in `role.config.ts` (see below).
+
+#### Roles and permissions
+
+Applications can define roles that encapsulate permissions on your workspace’s objects and actions. The field `functionRoleUniversalIdentifier` in `application.config.ts` designates the default role used by your app’s serverless functions.
+
+* The runtime API key injected as `TWENTY_API_KEY` is derived from this default function role.
+* The typed client will be restricted to the permissions granted to that role.
+* Follow least‑privilege: create a dedicated role with only the permissions your functions need, then reference its universal identifier.
+
+##### Default function role (role.config.ts)
+
+When you scaffold a new app, the CLI also creates `src/role.config.ts`. This file exports the default role your serverless functions will use at runtime:
+
+```typescript
+import { PermissionFlag, type RoleConfig } from 'twenty-sdk';
+
+export const functionRole: RoleConfig = {
+ universalIdentifier: '',
+ label: 'My Twenty App default function role',
+ description: 'My Twenty App default function role',
+ canReadAllObjectRecords: true,
+ canUpdateAllObjectRecords: true,
+ canSoftDeleteAllObjectRecords: true,
+ canDestroyAllObjectRecords: false,
+};
+```
+
+The `universalIdentifier` of this role is automatically wired into `application.config.ts` as `functionRoleUniversalIdentifier`. In other words:
+
+* **role.config.ts** defines what the default function role can do.
+* **application.config.ts** points to that role so your functions inherit its permissions.
+
+As you move beyond the initial scaffold, you should tighten this role and make it explicit about what it can access. A more production-ready role might look closer to:
+
+```typescript
+import { PermissionFlag, type RoleConfig } from 'twenty-sdk';
+
+export const functionRole: RoleConfig = {
+ universalIdentifier: '',
+ label: 'Default function role',
+ description: 'Default role for function Twenty client',
+ canReadAllObjectRecords: false,
+ canUpdateAllObjectRecords: false,
+ canSoftDeleteAllObjectRecords: false,
+ canDestroyAllObjectRecords: false,
+ canUpdateAllSettings: false,
+ canBeAssignedToAgents: false,
+ canBeAssignedToUsers: false,
+ canBeAssignedToApiKeys: false,
+ objectPermissions: [
+ {
+ objectNameSingular: 'postCard',
+ canReadObjectRecords: true,
+ canUpdateObjectRecords: true,
+ canSoftDeleteObjectRecords: false,
+ canDestroyObjectRecords: false,
+ },
+ ],
+ fieldPermissions: [
+ {
+ objectNameSingular: 'postCard',
+ fieldName: 'content',
+ canReadFieldValue: false,
+ canUpdateFieldValue: false,
+ },
+ ],
+ permissionFlags: ['APPLICATIONS'],
+};
+```
+
+Notes:
+
+* Start from the scaffolded role, then progressively restrict it following least‑privilege.
+* Replace the `objectPermissions` and `fieldPermissions` with the objects/fields your functions need.
+* `permissionFlags` control access to platform-level capabilities. Keep them minimal; add only what you need.
+* See a working example in the Hello World app: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
+
+### Serverless function config and entrypoint
+
+Each function exports a main handler and a config describing its triggers. You can mix multiple trigger types.
+
+```typescript
+// src/actions/create-new-post-card.ts
+import type {
+ FunctionConfig,
+ DatabaseEventPayload,
+ ObjectRecordCreateEvent,
+ CronPayload,
+} from 'twenty-sdk';
+import Twenty, { type Person } from '../generated';
+
+// main handler can accept parameters from route, cron, or database events
+export const main = async (
+ params:
+ | { name?: string }
+ | DatabaseEventPayload>
+ | CronPayload,
+) => {
+ const client = new Twenty(); // generated typed client
+ const name = 'name' in params
+ ? params.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world'
+ : 'Hello world';
+
+ const result = await client.mutation({
+ createPostCard: {
+ __args: { data: { name } },
+ id: true,
+ name: true,
+ },
+ });
+ return result;
+};
+
+export const config: FunctionConfig = {
+ universalIdentifier: '',
+ name: 'create-new-post-card',
+ timeoutSeconds: 2,
+ triggers: [
+ // Public HTTP route trigger '/s/post-card/create'
+ {
+ universalIdentifier: '',
+ type: 'route',
+ path: '/post-card/create',
+ httpMethod: 'GET',
+ isAuthRequired: false,
+ },
+ // Cron trigger (CRON pattern)
+ {
+ universalIdentifier: '',
+ type: 'cron',
+ pattern: '0 0 1 1 *',
+ },
+ // Database event trigger
+ {
+ universalIdentifier: '',
+ type: 'databaseEvent',
+ eventName: 'person.created',
+ },
+ ],
+};
+```
+
+Common trigger types:
+
+* route: Exposes your function on an HTTP path and method **under the `/s/` endpoint**:
+
+> e.g. `path: '/post-card/create',` -> call on `/s/post-card/create`
+
+* cron: Runs your function on a schedule using a CRON expression.
+* databaseEvent: Runs on workspace object lifecycle events
+
+> e.g. `person.created`
+
+You can create new functions in two ways:
+
+* **Scaffolded**: Run `yarn create-entity --path ` and choose the option to add a new function. This generates a starter file under `` with a `main` handler and a `config` block similar to the example above.
+* **Manual**: Create a new file and export `main` and `config` yourself, following the same pattern.
+
+### Generated typed client
+
+Run yarn generate to create a local typed client in generated/ based on your workspace schema. Use it in your functions:
+
+```typescript
+import Twenty from './generated';
+
+const client = new Twenty();
+const { me } = await client.query({ me: { id: true, displayName: true } });
+```
+
+The client is re-generated by `yarn generate`. Re-run after changing your objects and `yarn sync` or when onboarding to a new workspace.
+
+#### Runtime credentials in serverless functions
+
+When your function runs on Twenty, the platform injects credentials as environment variables before your code executes:
+
+* `TWENTY_API_URL`: Base URL of the Twenty API your app targets.
+* `TWENTY_API_KEY`: Short‑lived key scoped to your application’s default function role.
+
+Notes:
+
+* You do not need to pass URL or API key to the generated client. It reads `TWENTY_API_URL` and `TWENTY_API_KEY` from process.env at runtime.
+* The API key’s permissions are determined by the role referenced in your `application.config.ts` via `functionRoleUniversalIdentifier`. This is the default role used by serverless functions of your application.
+* Applications can define roles to follow least‑privilege. Grant only the permissions your functions need, then point `functionRoleUniversalIdentifier` to that role’s universal identifier.
+
+### Hello World example
+
+Explore a minimal, end-to-end example that demonstrates objects, functions, and multiple triggers [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps/hello-world):
+
+## Manual setup (without the scaffolder)
+
+While we recommend using `create-twenty-app` for the best getting-started experience, you can also set up a project manually. Do not install the CLI globally. Instead, add `twenty-sdk` as a local dependency and wire scripts in your package.json:
+
+```bash filename="Terminal"
+yarn add -D twenty-sdk
+```
+
+Then add scripts like these:
+
+```json filename="package.json"
+{
+ "scripts": {
+ "auth": "twenty auth login",
+ "generate": "twenty app generate",
+ "dev": "twenty app dev",
+ "sync": "twenty app sync",
+ "uninstall": "twenty app uninstall",
+ "logs": "twenty app logs",
+ "create-entity": "twenty app add",
+ "help": "twenty --help"
+ }
+}
+```
+
+Now you can run the same commands via Yarn, e.g. `yarn dev`, `yarn sync`, etc.
+
+## Troubleshooting
+
+* Authentication errors: run `yarn auth` and ensure your API key has the required permissions.
+* Cannot connect to server: verify the API URL and that the Twenty server is reachable.
+* Types or client missing/outdated: run `yarn generate` and then `yarn dev`.
+* Dev mode not syncing: ensure `yarn dev` is running and that changes are not ignored by your environment.
+
+Discord Help Channel: https://discord.com/channels/1130383047699738754/1130386664812982322
diff --git a/packages/twenty-docs/l/zh/developers/extend/capabilities/webhooks.mdx b/packages/twenty-docs/l/zh/developers/extend/capabilities/webhooks.mdx
new file mode 100644
index 0000000000..7949d9344b
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/extend/capabilities/webhooks.mdx
@@ -0,0 +1,112 @@
+---
+title: Webhooks
+description: Receive real-time notifications when events occur in your CRM.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Webhooks push data to your systems in real-time when events occur in Twenty — no polling required. Use them to keep external systems in sync, trigger automations, or send alerts.
+
+## Create a Webhook
+
+1. Go to **Settings → APIs & Webhooks → Webhooks**
+2. Click **+ Create webhook**
+3. Enter your webhook URL (must be publicly accessible)
+4. Click **Save**
+
+The webhook activates immediately and starts sending notifications.
+
+
+
+### Manage Webhooks
+
+**Edit**: Click the webhook → Update URL → **Save**
+
+**Delete**: Click the webhook → **Delete** → Confirm
+
+## Events
+
+Twenty sends webhooks for these event types:
+
+| Event | Example |
+| ------------------ | ---------------------------------------------------------- |
+| **Record Created** | `person.created`, `company.created`, `note.created` |
+| **Record Updated** | `person.updated`, `company.updated`, `opportunity.updated` |
+| **Record Deleted** | `person.deleted`, `company.deleted` |
+
+All event types are sent to your webhook URL. Event filtering may be added in future releases.
+
+## Payload Format
+
+Each webhook sends an HTTP POST with a JSON body:
+
+```json
+{
+ "event": "person.created",
+ "data": {
+ "id": "abc12345",
+ "firstName": "Alice",
+ "lastName": "Doe",
+ "email": "alice@example.com",
+ "createdAt": "2025-02-10T15:30:45Z",
+ "createdBy": "user_123"
+ },
+ "timestamp": "2025-02-10T15:30:50Z"
+}
+```
+
+| Field | Description |
+| ----------- | ------------------------------------------------ |
+| `event` | What happened (e.g., `person.created`) |
+| `data` | The full record that was created/updated/deleted |
+| `timestamp` | When the event occurred (UTC) |
+
+
+ Respond with a **2xx HTTP status** (200-299) to acknowledge receipt. Non-2xx responses are logged as delivery failures.
+
+
+## Webhook Validation
+
+Twenty signs each webhook request for security. Validate signatures to ensure requests are authentic.
+
+### Headers
+
+| Header | Description |
+| ---------------------------- | --------------------- |
+| `X-Twenty-Webhook-Signature` | HMAC SHA256 signature |
+| `X-Twenty-Webhook-Timestamp` | Request timestamp |
+
+### Validation Steps
+
+1. Get the timestamp from `X-Twenty-Webhook-Timestamp`
+2. Create the string: `{timestamp}:{JSON payload}`
+3. Compute HMAC SHA256 using your webhook secret
+4. Compare with `X-Twenty-Webhook-Signature`
+
+### Example (Node.js)
+
+```javascript
+const crypto = require("crypto");
+
+const timestamp = req.headers["x-twenty-webhook-timestamp"];
+const payload = JSON.stringify(req.body);
+const secret = "your-webhook-secret";
+
+const stringToSign = `${timestamp}:${payload}`;
+const expectedSignature = crypto
+ .createHmac("sha256", secret)
+ .update(stringToSign)
+ .digest("hex");
+
+const isValid = expectedSignature === req.headers["x-twenty-webhook-signature"];
+```
+
+## Webhooks vs Workflows
+
+| Method | Direction | Use Case |
+| ---------------------------- | --------- | ---------------------------------------------------------- |
+| **Webhooks** | OUT | Automatically notify external systems of any record change |
+| **Workflow + HTTP Request** | OUT | Send data out with custom logic (filters, transformations) |
+| **Workflow Webhook Trigger** | IN | Receive data into Twenty from external systems |
+
+For receiving external data, see [Set Up a Webhook Trigger](/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger).
diff --git a/packages/twenty-docs/l/zh/developers/extend/extend.mdx b/packages/twenty-docs/l/zh/developers/extend/extend.mdx
new file mode 100644
index 0000000000..0e3dbc96ee
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/extend/extend.mdx
@@ -0,0 +1,34 @@
+---
+title: Extend
+description: Extend Twenty's functionality with APIs, webhooks, and custom apps.
+---
+
+
+
+
+
+## Overview
+
+Twenty is designed to be extensible. Use our APIs, webhooks, and app framework to integrate with your existing tools and build custom functionality.
+
+## What You Can Do
+
+* **APIs**: Query and modify your CRM data programmatically using REST or GraphQL
+* **Webhooks**: Receive real-time notifications when events occur in Twenty
+* **Apps**: Build custom applications that extend Twenty's capabilities - Coming soon!
+
+## Getting Started
+
+
+
+ Connect to Twenty programmatically
+
+
+
+ Get notified of events in real-time
+
+
+
+ Build customizations as code (Alpha)
+
+
diff --git a/packages/twenty-docs/l/zh/developers/introduction.mdx b/packages/twenty-docs/l/zh/developers/introduction.mdx
new file mode 100644
index 0000000000..f12710341a
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/introduction.mdx
@@ -0,0 +1,23 @@
+---
+title: Getting Started
+description: Welcome to Twenty Developer Documentation, your resources for extending, self-hosting, and contributing to Twenty.
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+
+
+ Extend
+ Build integrations with APIs, webhooks, and custom apps.
+
+
+
+ Self-Host
+ Deploy and manage Twenty on your own infrastructure.
+
+
+
+ Contribute
+ Join our open-source community and contribute to Twenty.
+
+
diff --git a/packages/twenty-docs/l/zh/developers/self-host/capabilities/cloud-providers.mdx b/packages/twenty-docs/l/zh/developers/self-host/capabilities/cloud-providers.mdx
new file mode 100644
index 0000000000..809388612a
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/self-host/capabilities/cloud-providers.mdx
@@ -0,0 +1,45 @@
+---
+title: Other methods
+---
+
+
+ This document is maintained by the community. It might contain issues.
+
+
+## Kubernetes via Terraform and Manifests
+
+Community-led documentation for Kubernetes deployment is available [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s)
+
+### Coolify
+
+Deploy Twenty on servers using Coolify. (official image on Coolify will be available soon)
+
+[Coolify documentation](https://coolify.io/docs/get-started/introduction)
+
+### EasyPanel
+
+Deploy Twenty on EasyPanel with the community maintained template below.
+
+[Deploy on EasyPanel](https://easypanel.io/docs/templates/twenty)
+
+### Elest.io
+
+Deploy Twenty on servers with Elest.io using link below.
+
+[Deploy on Elest.io](https://elest.io/open-source/twenty)
+
+### Twenty on Railway
+
+Deploy Twenty on Railway with the community maintained template below.
+
+[](https://railway.com/deploy/nAL3hA)
+
+### Twenty on Sealos
+
+Deploy Twenty on Sealos with the community maintained template below.
+
+[](https://sealos.io/products/app-store/twenty)
+
+## Others
+
+Please feel free to Open a PR to add more Cloud Provider options.
diff --git a/packages/twenty-docs/l/zh/developers/self-host/capabilities/docker-compose.mdx b/packages/twenty-docs/l/zh/developers/self-host/capabilities/docker-compose.mdx
new file mode 100644
index 0000000000..1d04e2638a
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/self-host/capabilities/docker-compose.mdx
@@ -0,0 +1,253 @@
+---
+title: 1-Click w/ Docker Compose
+---
+
+
+ Docker containers are for production hosting or self-hosting, for the contribution please check the [Local Setup](/l/zh/developers/contribute/capabilities/local-setup).
+
+
+## Overview
+
+This guide provides step-by-step instructions to install and configure the Twenty application using Docker Compose. The aim is to make the process straightforward and prevent common pitfalls that could break your setup.
+
+**Important:** Only modify settings explicitly mentioned in this guide. Altering other configurations may lead to issues.
+
+See docs [Setup Environment Variables](/l/zh/developers/self-host/capabilities/setup) for advanced configuration. All environment variables must be declared in the docker-compose.yml file at the server and / or worker level depending on the variable.
+
+## System Requirements
+
+* RAM: Ensure your environment has at least 2GB of RAM. Insufficient memory can cause processes to crash.
+* Docker & Docker Compose: Make sure both are installed and up-to-date.
+
+## Option 1: One-line script
+
+Install the latest stable version of Twenty with a single command:
+
+```bash
+bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
+```
+
+To install a specific version or branch:
+
+```bash
+VERSION=vx.y.z BRANCH=branch-name bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
+```
+
+* Replace x.y.z with the desired version number.
+* Replace branch-name with the name of the branch you want to install.
+
+## Option 2: Manual steps
+
+Follow these steps for a manual setup.
+
+### Step 1: Set Up the Environment File
+
+1. **Create the .env File**
+
+ Copy the example environment file to a new .env file in your working directory:
+
+ ```bash
+ curl -o .env https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/.env.example
+ ```
+
+2. **Generate Secret Tokens**
+
+ Run the following command to generate a unique random string:
+
+ ```bash
+ openssl rand -base64 32
+ ```
+
+ **Important:** Keep this value secret / do not share it.
+
+3. **Update the `.env`**
+
+ Replace the placeholder value in your .env file with the generated token:
+
+ ```ini
+ APP_SECRET=first_random_string
+ ```
+
+4. **Set the Postgres Password**
+
+ Update the `PG_DATABASE_PASSWORD` value in the .env file with a strong password without special characters.
+
+ ```ini
+ PG_DATABASE_PASSWORD=my_strong_password
+ ```
+
+### Step 2: Obtain the Docker Compose File
+
+Download the `docker-compose.yml` file to your working directory:
+
+```bash
+curl -o docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/docker-compose.yml
+```
+
+### Step 3: Launch the Application
+
+Start the Docker containers:
+
+```bash
+docker compose up -d
+```
+
+### Step 4: Access the Application
+
+If you host twentyCRM on your own computer, open your browser and navigate to [http://localhost:3000](http://localhost:3000).
+
+If you host it on a server, check that the server is running and that everything is ok with
+
+```bash
+curl http://localhost:3000
+```
+
+## Configuration
+
+### Expose Twenty to External Access
+
+By default, Twenty runs on `localhost` at port `3000`. To access it via an external domain or IP address, you need to configure the `SERVER_URL` in your `.env` file.
+
+#### Understanding `SERVER_URL`
+
+* **Protocol:** Use `http` or `https` depending on your setup.
+ * Use `http` if you haven't set up SSL.
+ * Use `https` if you have SSL configured.
+* **Domain/IP:** This is the domain name or IP address where your application is accessible.
+* **Port:** Include the port number if you're not using the default ports (`80` for `http`, `443` for `https`).
+
+### SSL Requirements
+
+SSL (HTTPS) is required for certain browser features to work properly. While these features might work during local development (as browsers treat localhost differently), a proper SSL setup is needed when hosting Twenty on a regular domain.
+
+For example, the clipboard API might require a secure context - some features like copy buttons throughout the application might not work without HTTPS enabled.
+
+We strongly recommend setting up Twenty behind a reverse proxy with SSL termination for optimal security and functionality.
+
+#### Configuring `SERVER_URL`
+
+1. **Determine Your Access URL**
+ * **Without Reverse Proxy (Direct Access):**
+
+ If you're accessing the application directly without a reverse proxy:
+
+ ```ini
+ SERVER_URL=http://your-domain-or-ip:3000
+ ```
+
+ * **With Reverse Proxy (Standard Ports):**
+
+ If you're using a reverse proxy like Nginx or Traefik and have SSL configured:
+
+ ```ini
+ SERVER_URL=https://your-domain-or-ip
+ ```
+
+ * **With Reverse Proxy (Custom Ports):**
+
+ If you're using non-standard ports:
+
+ ```ini
+ SERVER_URL=https://your-domain-or-ip:custom-port
+ ```
+
+2. **Update the `.env` File**
+
+ Open your `.env` file and update the `SERVER_URL`:
+
+ ```ini
+ SERVER_URL=http(s)://your-domain-or-ip:your-port
+ ```
+
+ **Examples:**
+
+ * Direct access without SSL:
+ ```ini
+ SERVER_URL=http://123.45.67.89:3000
+ ```
+ * Access via domain with SSL:
+ ```ini
+ SERVER_URL=https://mytwentyapp.com
+ ```
+
+3. **Restart the Application**
+
+ For changes to take effect, restart the Docker containers:
+
+ ```bash
+ docker compose down
+ docker compose up -d
+ ```
+
+#### Considerations
+
+* **Reverse Proxy Configuration:**
+
+ Ensure your reverse proxy forwards requests to the correct internal port (`3000` by default). Configure SSL termination and any necessary headers.
+
+* **Firewall Settings:**
+
+ Open necessary ports in your firewall to allow external access.
+
+* **Consistency:**
+
+ The `SERVER_URL` must match how users access your application in their browsers.
+
+#### Persistence
+
+* **Data Volumes:**
+
+ The Docker Compose configuration uses volumes to persist data for the database and server storage.
+
+* **Stateless Environments:**
+
+ If deploying to a stateless environment (e.g., certain cloud services), configure external storage to persist data.
+
+## Backup and Restore
+
+Regular backups protect your CRM data from loss.
+
+### Create a Database Backup
+
+```bash
+docker exec twenty-postgres pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql
+```
+
+### Automate Daily Backups
+
+Add to your crontab (`crontab -e`):
+
+```bash
+0 2 * * * docker exec twenty-postgres pg_dump -U postgres twenty > /backups/twenty_$(date +\%Y\%m\%d).sql
+```
+
+### Restore from Backup
+
+1. Stop the application:
+
+```bash
+docker compose stop twenty-server twenty-front
+```
+
+2. Restore the database:
+
+```bash
+docker exec -i twenty-postgres psql -U postgres twenty < backup_20240115.sql
+```
+
+3. Restart services:
+
+```bash
+docker compose up -d
+```
+
+### Backup Best Practices
+
+* **Test restores regularly** — verify backups actually work
+* **Store backups off-site** — use cloud storage (S3, GCS, etc.)
+* **Encrypt sensitive data** — protect backups with encryption
+* **Retain multiple copies** — keep daily, weekly, and monthly backups
+
+## Troubleshooting
+
+If you encounter any problem, check [Troubleshooting](/l/zh/developers/self-host/capabilities/troubleshooting) for solutions.
diff --git a/packages/twenty-docs/l/zh/developers/self-host/capabilities/setup.mdx b/packages/twenty-docs/l/zh/developers/self-host/capabilities/setup.mdx
new file mode 100644
index 0000000000..b97c3d3666
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/self-host/capabilities/setup.mdx
@@ -0,0 +1,293 @@
+---
+title: Setup
+---
+
+# Configuration Management
+
+
+ **First time installing?** Follow the [Docker Compose installation guide](/l/zh/developers/self-host/capabilities/docker-compose) to get Twenty running, then return here for configuration.
+
+
+Twenty offers **two configuration modes** to suit different deployment needs:
+
+**Admin panel access:** Only users with admin privileges (`canAccessFullAdminPanel: true`) can access the configuration interface.
+
+## 1. Admin Panel Configuration (Default)
+
+```bash
+IS_CONFIG_VARIABLES_IN_DB_ENABLED=true # default
+```
+
+**Most configuration happens through the UI** after installation:
+
+1. Access your Twenty instance (usually `http://localhost:3000`)
+2. Go to **Settings / Admin Panel / Configuration Variables**
+3. Configure integrations, email, storage, and more
+4. Changes take effect immediately (within 15 seconds for multi-container deployments)
+
+
+ **Multi-Container Deployments:** When using database configuration (`IS_CONFIG_VARIABLES_IN_DB_ENABLED=true`), both server and worker containers read from the same database. Admin panel changes affect both automatically, eliminating the need to duplicate environment variables between containers (except for infrastructure variables).
+
+
+**What you can configure through the admin panel:**
+
+* **Authentication** - Google/Microsoft OAuth, password settings
+* **Email** - SMTP settings, templates, verification
+* **Storage** - S3 configuration, local storage paths
+* **Integrations** - Gmail, Google Calendar, Microsoft services
+* **Workflow & Rate Limiting** - Execution limits, API throttling
+* **And much more...**
+
+
+
+
+ Each variable is documented with descriptions in your admin panel at **Settings → Admin Panel → Configuration Variables**.
+ Some infrastructure settings like database connections (`PG_DATABASE_URL`), server URLs (`SERVER_URL`), and app secrets (`APP_SECRET`) can only be configured via `.env` file.
+
+ [Complete technical reference →](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts)
+
+
+## 2. Environment-Only Configuration
+
+```bash
+IS_CONFIG_VARIABLES_IN_DB_ENABLED=false
+```
+
+**All configuration managed through `.env` files:**
+
+1. Set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` in your `.env` file
+2. Add all configuration variables to your `.env` file
+3. Restart containers for changes to take effect
+4. Admin panel will show current values but cannot modify them
+
+## Multi-Workspace Mode
+
+By default, Twenty runs in **single-workspace mode** — ideal for most self-hosted deployments where you need one CRM instance for your organization.
+
+### Single-Workspace Mode (Default)
+
+```bash
+IS_MULTIWORKSPACE_ENABLED=false # default
+```
+
+* One workspace per Twenty instance
+* First user automatically becomes admin with full privileges (`canImpersonate` and `canAccessFullAdminPanel`)
+* New signups are disabled after the first workspace is created
+* Simple URL structure: `https://your-domain.com`
+
+### Enabling Multi-Workspace Mode
+
+```bash
+IS_MULTIWORKSPACE_ENABLED=true
+DEFAULT_SUBDOMAIN=app # default value
+```
+
+Enable multi-workspace mode for SaaS-like deployments where multiple independent teams need their own workspaces on the same Twenty instance.
+
+**Key differences from single-workspace mode:**
+
+* Multiple workspaces can be created on the same instance
+* Each workspace gets its own subdomain (e.g., `sales.your-domain.com`, `marketing.your-domain.com`)
+* Users sign up and log in at `{DEFAULT_SUBDOMAIN}.your-domain.com` (e.g., `app.your-domain.com`)
+* No automatic admin privileges — first user in each workspace is a regular user
+* Workspace-specific settings like subdomain and custom domain become available in workspace settings
+
+
+ **Environment-only setting:** `IS_MULTIWORKSPACE_ENABLED` can only be configured via `.env` file and requires a restart. It cannot be changed through the admin panel.
+
+
+### DNS Configuration for Multi-Workspace
+
+When using multi-workspace mode, configure your DNS with a wildcard record to allow dynamic subdomain creation:
+
+```
+*.your-domain.com -> your-server-ip
+```
+
+This enables automatic subdomain routing for new workspaces without manual DNS configuration.
+
+### Restricting Workspace Creation
+
+In multi-workspace mode, you may want to limit who can create new workspaces:
+
+```bash
+IS_WORKSPACE_CREATION_LIMITED_TO_SERVER_ADMINS=true
+```
+
+When enabled, only users with `canAccessFullAdminPanel` can create additional workspaces. Users can still create their first workspace during initial signup.
+
+## Gmail & Google Calendar Integration
+
+### Create Google Cloud Project
+
+1. Go to [Google Cloud Console](https://console.cloud.google.com/)
+2. Create a new project or select existing one
+3. Enable these APIs:
+
+* [Gmail API](https://console.cloud.google.com/apis/library/gmail.googleapis.com)
+* [Google Calendar API](https://console.cloud.google.com/apis/library/calendar-json.googleapis.com)
+* [People API](https://console.cloud.google.com/apis/library/people.googleapis.com)
+
+### Configure OAuth
+
+1. Go to [Credentials](https://console.cloud.google.com/apis/credentials)
+2. Create OAuth 2.0 Client ID
+3. Add these redirect URIs:
+ * `https://{your-domain}/auth/google/redirect` (for SSO)
+ * `https://{your-domain}/auth/google-apis/get-access-token` (for integrations)
+
+### Configure in Twenty
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Google Auth** section
+3. Set these variables:
+ * `MESSAGING_PROVIDER_GMAIL_ENABLED=true`
+ * `CALENDAR_PROVIDER_GOOGLE_ENABLED=true`
+ * `AUTH_GOOGLE_CLIENT_ID={client-id}`
+ * `AUTH_GOOGLE_CLIENT_SECRET={client-secret}`
+ * `AUTH_GOOGLE_CALLBACK_URL=https://{your-domain}/auth/google/redirect`
+ * `AUTH_GOOGLE_APIS_CALLBACK_URL=https://{your-domain}/auth/google-apis/get-access-token`
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
+
+**Required scopes** (automatically configured):
+[See relevant source code](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes.ts#L4-L10)
+
+* `https://www.googleapis.com/auth/calendar.events`
+* `https://www.googleapis.com/auth/gmail.readonly`
+* `https://www.googleapis.com/auth/profile.emails.read`
+
+### If your app is in test mode
+
+If your app is in test mode, you will need to add test users to your project.
+
+Under [OAuth consent screen](https://console.cloud.google.com/apis/credentials/consent), add your test users to the "Test users" section.
+
+## Microsoft 365 Integration
+
+
+ Users must have a [Microsoft 365 Licence](https://admin.microsoft.com/Adminportal/Home) to be able to use the Calendar and Messaging API. They will not be able to sync their account on Twenty without one.
+
+
+### Create a project in Microsoft Azure
+
+You will need to create a project in [Microsoft Azure](https://portal.azure.com/#view/Microsoft_AAD_IAM/AppGalleryBladeV2) and get the credentials.
+
+### Enable APIs
+
+On Microsoft Azure Console enable the following APIs in "Permissions":
+
+* Microsoft Graph: Mail.ReadWrite
+* Microsoft Graph: Mail.Send
+* Microsoft Graph: Calendars.Read
+* Microsoft Graph: User.Read
+* Microsoft Graph: openid
+* Microsoft Graph: email
+* Microsoft Graph: profile
+* Microsoft Graph: offline_access
+
+Note: "Mail.ReadWrite" and "Mail.Send" are only mandatory if you want to send emails using our workflow actions. You can use "Mail.Read" instead if you only want to receive emails.
+
+### Authorized redirect URIs
+
+You need to add the following redirect URIs to your project:
+
+* `https://{your-domain}/auth/microsoft/redirect` if you want to use Microsoft SSO
+* `https://{your-domain}/auth/microsoft-apis/get-access-token`
+
+### Configure in Twenty
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Microsoft Auth** section
+3. Set these variables:
+ * `MESSAGING_PROVIDER_MICROSOFT_ENABLED=true`
+ * `CALENDAR_PROVIDER_MICROSOFT_ENABLED=true`
+ * `AUTH_MICROSOFT_ENABLED=true`
+ * `AUTH_MICROSOFT_CLIENT_ID={client-id}`
+ * `AUTH_MICROSOFT_CLIENT_SECRET={client-secret}`
+ * `AUTH_MICROSOFT_CALLBACK_URL=https://{your-domain}/auth/microsoft/redirect`
+ * `AUTH_MICROSOFT_APIS_CALLBACK_URL=https://{your-domain}/auth/microsoft-apis/get-access-token`
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
+
+### Configure scopes
+
+[See relevant source code](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes.ts#L2-L9)
+
+* 'openid'
+* 'email'
+* 'profile'
+* 'offline_access'
+* 'Mail.ReadWrite'
+* 'Mail.Send'
+* 'Calendars.Read'
+
+### If your app is in test mode
+
+If your app is in test mode, you will need to add test users to your project.
+
+Add your test users to the "Users and groups" section.
+
+## Background Jobs for Calendar & Messaging
+
+After configuring Gmail, Google Calendar, or Microsoft 365 integrations, you need to start the background jobs that sync data.
+
+Register the following recurring jobs in your worker container:
+
+```bash
+# from your worker container
+yarn command:prod cron:messaging:messages-import
+yarn command:prod cron:messaging:message-list-fetch
+yarn command:prod cron:calendar:calendar-event-list-fetch
+yarn command:prod cron:calendar:calendar-events-import
+yarn command:prod cron:messaging:ongoing-stale
+yarn command:prod cron:calendar:ongoing-stale
+yarn command:prod cron:workflow:automated-cron-trigger
+```
+
+## Email Configuration
+
+1. Go to **Settings → Admin Panel → Configuration Variables**
+2. Find the **Email** section
+3. Configure your SMTP settings:
+
+
+
+ You will need to provision an [App Password](https://support.google.com/accounts/answer/185833).
+
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=smtp.gmail.com
+ * EMAIL_SMTP_PORT=465
+ * EMAIL_SMTP_USER=gmail_email_address
+ * EMAIL_SMTP_PASSWORD='gmail_app_password'
+
+
+
+ Keep in mind that if you have 2FA enabled, you will need to provision an [App Password](https://support.microsoft.com/en-us/account-billing/manage-app-passwords-for-two-step-verification-d6dc8c6d-4bf7-4851-ad95-6d07799387e9).
+
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=smtp.office365.com
+ * EMAIL_SMTP_PORT=587
+ * EMAIL_SMTP_USER=office365_email_address
+ * EMAIL_SMTP_PASSWORD='office365_password'
+
+
+
+ **smtp4dev** is a fake SMTP email server for development and testing.
+
+ * Run the smtp4dev image: `docker run --rm -it -p 8090:80 -p 2525:25 rnwood/smtp4dev`
+ * Access the smtp4dev ui here: [http://localhost:8090](http://localhost:8090)
+ * Set the following variables:
+ * EMAIL_DRIVER=smtp
+ * EMAIL_SMTP_HOST=localhost
+ * EMAIL_SMTP_PORT=2525
+
+
+
+
+ **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
+
diff --git a/packages/twenty-docs/l/zh/developers/self-host/capabilities/troubleshooting.mdx b/packages/twenty-docs/l/zh/developers/self-host/capabilities/troubleshooting.mdx
new file mode 100644
index 0000000000..d2187aedac
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/self-host/capabilities/troubleshooting.mdx
@@ -0,0 +1,227 @@
+---
+title: Troubleshooting
+---
+
+## Troubleshooting
+
+If you encounter any problem while setting up environment for development, upgrading your instance or self-hosting,
+here are some solutions for common problems.
+
+### Self-hosting
+
+#### First install results in `password authentication failed for user "postgres"`
+
+🚨 **IMPORTANT: This solution is ONLY for fresh installations** 🚨
+If you have an existing Twenty instance with production data, **DO NOT** follow these steps as they will permanently delete your database!
+
+While installing Twenty for the first time, you might want to change the default database password.
+The password you set during the first installation becomes permanently stored in the database volume. If you later try to change this password in your configuration without removing the old volume, you'll get authentication errors because the database is still using the original password.
+
+⚠️ WARNING: Following steps will PERMANENTLY DELETE all database data! ⚠️
+Only proceed if this is a fresh installation with no important data.
+
+In order to update the `PG_DATABASE_PASSWORD` you need to:
+
+```sh
+# Update the PG_DATABASE_PASSWORD in .env
+docker compose down --volumes
+docker compose up -d
+```
+
+#### CR line breaks found [Windows]
+
+This is due to the line break characters of Windows and the git configuration. Try running:
+
+```
+git config --global core.autocrlf false
+```
+
+Then delete the repository and clone it again.
+
+#### Missing metadata schema
+
+During Twenty installation, you need to provision your postgres database with the right schemas, extensions, and users.
+If you're successful in running this provisioning, you should have `default` and `metadata` schemas in your database.
+If you don't, make sure you don't have more than one postgres instance running on your computer.
+
+#### Cannot find module 'twenty-emails' or its corresponding type declarations.
+
+You have to build the package `twenty-emails` before running the initialization of the database with `npx nx run twenty-emails:build`
+
+#### Missing twenty-x package
+
+Make sure to run yarn in the root directory and then run `npx nx server:dev twenty-server`. If this still doesn't work try building the missing package manually.
+
+#### Lint on Save not working
+
+This should work out of the box with the eslint extension installed. If this doesn't work try adding this to your vscode setting (on the dev container scope):
+
+```
+"editor.codeActionsOnSave": {
+
+ "source.fixAll.eslint": "explicit"
+
+}
+```
+
+#### While running `npx nx start` or `npx nx start twenty-front`, Out of memory error is thrown
+
+In `packages/twenty-front/.env` uncomment `VITE_DISABLE_TYPESCRIPT_CHECKER=true` to disable background checks thus reducing amount of needed RAM.
+
+**If it does not work:**
+Run only the services you need, instead of `npx nx start`. For instance, if you work on the server, run only `npx nx worker twenty-server`
+
+**If it does not work:**
+If you tried to run only `npx nx run twenty-server:start` on WSL and it's failing with the below memory error:
+
+`FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory`
+
+Workaround is to execute below command in terminal or add it in .bashrc profile to get setup automatically:
+
+`export NODE_OPTIONS="--max-old-space-size=8192"`
+
+The --max-old-space-size=8192 flag sets an upper limit of 8GB for the Node.js heap; usage scales with application demand.
+Reference: https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048
+
+**If it does not work:**
+Investigate which processes are taking you most of your machine RAM. At Twenty, we noticed that some VScode extensions were taking a lot of RAM so we temporarily disable them.
+
+**If it does not work:**
+Restart your machine helps to clean up ghost processes.
+
+#### While running `npx nx start` there are weird [0] and [1] in logs
+
+That's expected as command `npx nx start` is running more commands under the hood
+
+#### No emails are sent
+
+Most of the time, it's because the `worker` is not running in the background. Try to run
+
+```
+npx nx worker twenty-server
+```
+
+#### Cannot connect my Microsoft 365 account
+
+Most of the time, it's because your admin has not enabled the Microsoft 365 Licence for your account. Check [https://admin.microsoft.com/](https://admin.microsoft.com/Adminportal/Home).
+
+If you have an error code `AADSTS50020`, it probably means that you are using a personal Microsoft account. This is not supported yet. More info [here](https://learn.microsoft.com/fr-fr/troubleshoot/entra/entra-id/app-integration/error-code-aadsts50020-user-account-identity-provider-does-not-exist)
+
+#### While running `yarn` warnings appear in console
+
+Warnings are informing about pulling additional dependencies which aren't explicitly stated in `package.json`, so as long as no breaking error appears, everything should work as expected.
+
+#### When user accesses login page, error about unauthorized user trying to access workspace appears in logs
+
+That's expected as user is unauthorized when logged out since its identity is not verified.
+
+#### How to check if your worker is running?
+
+* Go to [webhook-test.com](https://webhook-test.com/) and copy **Your Unique Webhook URL**.
+
+
+
+
+
+* Open your Twenty app, navigate to `/settings`, and enable the **Advanced** toggle at the bottom left of the screen.
+* Create a new webhook.
+* Paste **Your Unique Webhook URL** in the **Endpoint Url** field in Twenty. Set the **Filters** to `Companies` and `Created`.
+
+
+
+
+
+* Go to `/objects/companies` and create a new company record.
+* Return to [webhook-test.com](https://webhook-test.com/) and check if a new **POST request** has been received.
+
+
+
+
+
+* If a **POST request** is received, your worker is running successfully. Otherwise, you need to troubleshoot your worker.
+
+#### Front-end fails to start and returns error TS5042: Option 'project' cannot be mixed with source files on a command line
+
+Comment out checker plugin in `packages/twenty-ui/vite-config.ts` like in example below
+
+```
+plugins: [
+ react({ jsxImportSource: '@emotion/react' }),
+ tsconfigPaths(),
+ svgr(),
+ dts(dtsConfig),
+ // checker(checkersConfig),
+ wyw({
+ include: [
+ '**/OverflowingTextWithTooltip.tsx',
+ '**/Chip.tsx',
+ '**/Tag.tsx',
+ '**/Avatar.tsx',
+ '**/AvatarChip.tsx',
+ ],
+ babelOptions: {
+ presets: ['@babel/preset-typescript', '@babel/preset-react'],
+ },
+ }),
+ ],
+```
+
+#### Admin panel not accessible
+
+Run `UPDATE core."user" SET "canAccessFullAdminPanel" = TRUE WHERE email = 'you@yourdomain.com';` in database container to get access to admin panel.
+
+### 1-click Docker compose
+
+#### Unable to Log In
+
+If you can't log in after setup:
+
+1. Run the following commands:
+ ```bash
+ docker exec -it twenty-server-1 yarn
+ docker exec -it twenty-server-1 npx nx database:reset --configuration=no-seed
+ ```
+2. Restart the Docker containers:
+ ```bash
+ docker compose down
+ docker compose up -d
+ ```
+
+Note the database:reset command will completely erase your database and recreate it from scratch.
+
+#### Connection Issues Behind a Reverse Proxy
+
+If you're running Twenty behind a reverse proxy and experiencing connection issues:
+
+1. **Verify SERVER_URL:**
+
+ Ensure `SERVER_URL` in your `.env` file matches your external access URL, including `https` if SSL is enabled.
+
+2. **Check Reverse Proxy Settings:**
+
+ * Confirm that your reverse proxy is correctly forwarding requests to the Twenty server.
+ * Ensure headers like `X-Forwarded-For` and `X-Forwarded-Proto` are properly set.
+
+3. **Restart Services:**
+
+ After making changes, restart both the reverse proxy and Twenty containers.
+
+#### Error when uploading an image - permission denied
+
+Switching the data folder ownership on the host from root to another user and group resolves this problem.
+
+## Getting Help
+
+If you encounter issues not covered in this guide:
+
+* Check Logs:
+
+ View container logs for error messages:
+
+ ```bash
+ docker compose logs
+ ```
+
+* Community Support:
+
+ Reach out to the [Twenty community](https://github.com/twentyhq/twenty/issues) or [support channels](https://discord.gg/cx5n4Jzs57) for assistance.
diff --git a/packages/twenty-docs/l/zh/developers/self-host/capabilities/upgrade-guide.mdx b/packages/twenty-docs/l/zh/developers/self-host/capabilities/upgrade-guide.mdx
new file mode 100644
index 0000000000..03a53f5685
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/self-host/capabilities/upgrade-guide.mdx
@@ -0,0 +1,381 @@
+---
+title: Upgrade guide
+---
+
+## General guidelines
+
+**Always make sure to back up your database before starting the upgrade process** by running `docker exec -it {db_container_name_or_id} pg_dumpall -U {postgres_user} > databases_backup.sql`.
+
+To restore backup, run `cat databases_backup.sql | docker exec -i {db_container_name_or_id} psql -U {postgres_user}`.
+
+If you used Docker Compose, follow these steps:
+
+1. In a terminal, on the host where Twenty is running, turn off Twenty: `docker compose down`
+
+2. Upgrade the version by changing the `TAG` value in the .env file near your docker-compose. ( We recommend consuming `major.minor` version such as `v0.53` )
+
+3. Bring Twenty back online with `docker compose up -d`
+
+If you want to upgrade your instance by few versions, e.g. from v0.33.0 to v0.35.0, you have to upgrade your instance sequentially, in this example from v0.33.0 to v0.34.0, then from v0.34.0 to v0.35.0.
+
+**Make sure that after each upgraded version you have non-corrupted backup.**
+
+## Version-specific upgrade steps
+
+## v1.0
+
+Hello Twenty v1.0! 🎉
+
+## v0.60
+
+### Performance Enhancements
+
+All interactions with the metadata API have been optimized for better performance, particularly for object metadata manipulation and workspace creation operations.
+
+We've refactored our caching strategy to prioritize cache hits over database queries when possible, significantly improving the performance of metadata API operations.
+
+If you encounter any runtime issues after upgrading, you may need to flush your cache to ensure it's synchronized with the latest changes. Run this command in your twenty-server container:
+
+```bash
+yarn command:prod cache:flush
+```
+
+### v0.55
+
+Upgrade your Twenty instance to use v0.55 image
+
+You don't need to run any command anymore, the new image will automatically care about running all required migrations.
+
+### `User does not have permission` error
+
+If you encounter authorization errors on most requests after upgrading, you may need to flush your cache to recompute the latest permissions.
+
+In your `twenty-server` container, run:
+
+```bash
+yarn command:prod cache:flush
+```
+
+This issue is specific to this Twenty version and should not be required for future upgrades.
+
+### v0.54
+
+Since version `0.53`, no manual actions needed.
+
+#### Metadata schema deprecation
+
+We've merged the `metadata` schema into the `core` one to simplify data retrieval from `TypeORM`.
+We have merged the `migrate` command step within the `upgrade` command. We do not recommend running `migrate` manually within any of your server/worker containers.
+
+### Since v0.53
+
+Starting from `0.53`, upgrade is programmatically done within the `DockerFile`, this means from now on, you shouldn't have to run any command manually anymore.
+
+Make sure to keep upgrading your instance sequentially, without skipping any major version (e.g. `0.43.3` to `0.44.0` is allowed, but `0.43.1` to `0.45.0` isn't), else could lead to workspace version desynchronization that could result in runtime error and missing functionality.
+
+To check if a workspace has been correctly migrated you can review its version in database in `core.workspace` table.
+
+It should always be in the range of your current Twenty's instance `major.minor` version, you can view your instance version in the admin panel (at `/settings/admin-panel`, accessible if your user has `canAccessFullAdminPanel` property set to true in the database) or by running `echo $APP_VERSION` in your `twenty-server` container.
+
+To fix a desynchronized workspace version, you will have to upgrade from the corresponding twenty's version following related upgrade guide sequentially and so on until it reaches desired version.
+
+#### `auditLog` removal
+
+We've removed the auditLog standard object, which means your backup size might be significantly reduced after this migration.
+
+### v0.51 to v0.52
+
+Upgrade your Twenty instance to use v0.52 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+#### I have a workspace blocked in version between `0.52.0` and `0.52.6`
+
+Unfortunately `0.52.0` and `0.52.6` have been completely removed from dockerHub.
+You will have to manually update your workspace version to `0.51.0` in database and upgrade using twenty version `0.52.11` following its just above upgrade guide.
+
+### v0.50 to v0.51
+
+Upgrade your Twenty instance to use v0.51 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+### v0.44.0 to v0.50.0
+
+Upgrade your Twenty instance to use v0.50.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+#### Docker-compose.yml mutation
+
+This version includes a `docker-compose.yml` mutation to give `worker` service access to the `server-local-data` volume.
+Please update your local `docker-compose.yml` with [v0.50.0 docker-compose.yml](https://github.com/twentyhq/twenty/blob/v0.50.0/packages/twenty-docker/docker-compose.yml)
+
+### v0.43.0 to v0.44.0
+
+Upgrade your Twenty instance to use v0.44.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+### v0.42.0 to v0.43.0
+
+Upgrade your Twenty instance to use v0.43.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade
+```
+
+In this version, we have also switched to postgres:16 image in docker-compose.yml.
+
+#### (Option 1) Database migration
+
+Keeping the existing postgres-spilo image is fine, but you will have to freeze the version in your docker-compose.yml to be 0.43.0.
+
+#### (Option 2) Database migration
+
+If you want to migrate your database to the new postgres:16 image, please follow these steps:
+
+1. Dump your database from the old postgres-spilo container
+
+```
+docker exec -it twenty-db-1 sh
+pg_dump -U {YOUR_POSTGRES_USER} -d {YOUR_POSTGRES_DB} > databases_backup.sql
+exit
+docker cp twenty-db-1:/home/postgres/databases_backup.sql .
+```
+
+Make sure your dump file is not empty.
+
+2. Upgrade your docker-compose.yml to use postgres:16 image as in the [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) file.
+
+3. Restore the database to the new postgres:16 container
+
+```
+docker cp databases_backup.sql twenty-db-1:/databases_backup.sql
+docker exec -it twenty-db-1 sh
+psql -U {YOUR_POSTGRES_USER} -d {YOUR_POSTGRES_DB} -f databases_backup.sql
+exit
+```
+
+### v0.41.0 to v0.42.0
+
+Upgrade your Twenty instance to use v0.42.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.42
+```
+
+**Environment Variables**
+
+* Removed: `FRONT_PORT`, `FRONT_PROTOCOL`, `FRONT_DOMAIN`, `PORT`
+* Added: `FRONTEND_URL`, `NODE_PORT`, `MAX_NUMBER_OF_WORKSPACES_DELETED_PER_EXECUTION`, `MESSAGING_PROVIDER_MICROSOFT_ENABLED`, `CALENDAR_PROVIDER_MICROSOFT_ENABLED`, `IS_MICROSOFT_SYNC_ENABLED`
+
+### v0.40.0 to v0.41.0
+
+Upgrade your Twenty instance to use v0.41.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.41
+```
+
+**Environment Variables**
+
+* Removed: `AUTH_MICROSOFT_TENANT_ID`
+
+### v0.35.0 to v0.40.0
+
+Upgrade your Twenty instance to use v0.40.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.40
+```
+
+**Environment Variables**
+
+* Added: `IS_EMAIL_VERIFICATION_REQUIRED`, `EMAIL_VERIFICATION_TOKEN_EXPIRES_IN`, `WORKFLOW_EXEC_THROTTLE_LIMIT`, `WORKFLOW_EXEC_THROTTLE_TTL`
+
+### v0.34.0 to v0.35.0
+
+Upgrade your Twenty instance to use v0.35.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.35
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.35` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+* We replaced `ENABLE_DB_MIGRATIONS` with `DISABLE_DB_MIGRATIONS` (default value is now `false`, you probably don't have to set anything)
+
+### v0.33.0 to v0.34.0
+
+Upgrade your Twenty instance to use v0.34.0 image
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.34
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.34` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+* Removed: `FRONT_BASE_URL`
+* Added: `FRONT_DOMAIN`, `FRONT_PROTOCOL`, `FRONT_PORT`
+
+We have updated the way we handle the frontend URL.
+You can now set the frontend URL using the `FRONT_DOMAIN`, `FRONT_PROTOCOL` and `FRONT_PORT` variables.
+If FRONT_DOMAIN is not set, the frontend URL will fall back to `SERVER_URL`.
+
+### v0.32.0 to v0.33.0
+
+Upgrade your Twenty instance to use v0.33.0 image
+
+```
+yarn command:prod cache:flush
+yarn database:migrate:prod
+yarn command:prod upgrade-0.33
+```
+
+The `yarn command:prod cache:flush` command will flush the Redis cache.
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.33` takes care of the data migration of all workspaces.
+
+Starting from this version, twenty-postgres image for DB became deprecated and twenty-postgres-spilo is used instead.
+If you want to keep using twenty-postgres image, simply replace `twentycrm/twenty-postgres:${TAG}` with `twentycrm/twenty-postgres` in docker-compose.yml.
+
+### v0.31.0 to v0.32.0
+
+Upgrade your Twenty instance to use v0.32.0 image
+
+**Schema and data migration**
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.32
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.32` takes care of the data migration of all workspaces.
+
+**Environment Variables**
+
+We have updated the way we handle the Redis connection.
+
+* Removed: `REDIS_HOST`, `REDIS_PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD`
+* Added: `REDIS_URL`
+
+Update your `.env` file to use the new `REDIS_URL` variable instead of the individual Redis connection parameters.
+
+We have also simplified the way we handle the JWT tokens.
+
+* Removed: `ACCESS_TOKEN_SECRET`, `LOGIN_TOKEN_SECRET`, `REFRESH_TOKEN_SECRET`, `FILE_TOKEN_SECRET`
+* Added: `APP_SECRET`
+
+Update your `.env` file to use the new `APP_SECRET` variable instead of the individual tokens secrets (you can use the same secret as before or generate a new random string)
+
+**Connected Account**
+
+If you are using connected account to synchronize your Google emails and calendars, you will need to activate the [People API](https://developers.google.com/people) on your Google Admin console.
+
+### v0.30.0 to v0.31.0
+
+Upgrade your Twenty instance to use v0.31.0 image
+
+**Schema and data migration**:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.31
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.31` takes care of the data migration of all workspaces.
+
+### v0.24.0 to v0.30.0
+
+Upgrade your Twenty instance to use v0.30.0 image
+
+**Breaking change**:
+To enhance performances, Twenty now requires redis cache to be configured. We have updated our [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) to reflect this.
+Make sure to update your configuration and to update your environment variables accordingly:
+
+```
+REDIS_HOST={your-redis-host}
+REDIS_PORT={your-redis-port}
+CACHE_STORAGE_TYPE=redis
+```
+
+**Schema and data migration**:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.30
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.30` takes care of the data migration of all workspaces.
+
+### v0.23.0 to v0.24.0
+
+Upgrade your Twenty instance to use v0.24.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.24
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas)
+The `yarn command:prod upgrade-0.24` takes care of the data migration of all workspaces.
+
+### v0.22.0 to v0.23.0
+
+Upgrade your Twenty instance to use v0.23.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod upgrade-0.23
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the Database.
+The `yarn command:prod upgrade-0.23` takes care of the data migration, including transferring activities to tasks/notes.
+
+### v0.21.0 to v0.22.0
+
+Upgrade your Twenty instance to use v0.22.0 image
+
+Run the following commands:
+
+```
+yarn database:migrate:prod
+yarn command:prod workspace:sync-metadata -f
+yarn command:prod upgrade-0.22
+```
+
+The `yarn database:migrate:prod` command will apply the migrations to the Database.
+The `yarn command:prod workspace:sync-metadata -f` command will sync the definition of standard objects to the metadata tables and apply to required migrations to existing workspaces.
+The `yarn command:prod upgrade-0.22` command will apply specific data transformations to adapt to the new object defaultRequestInstrumentationOptions.
diff --git a/packages/twenty-docs/l/zh/developers/self-host/self-host.mdx b/packages/twenty-docs/l/zh/developers/self-host/self-host.mdx
new file mode 100644
index 0000000000..497e82236a
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/self-host/self-host.mdx
@@ -0,0 +1,30 @@
+---
+title: Self-Host
+description: Deploy and manage Twenty on your own infrastructure.
+---
+
+
+
+
+
+## Overview
+
+Twenty can be self-hosted on your own infrastructure, giving you full control over your data and deployment.
+
+## Why Self-Host?
+
+* **Data ownership**: Keep all CRM data on your own servers
+* **Compliance**: Meet regulatory requirements for data residency
+* **Customization**: Full access to modify and extend the platform
+
+## Getting Started
+
+
+
+ Quick setup with Docker
+
+
+
+ Deploy on AWS, GCP, or Azure
+
+
diff --git a/packages/twenty-docs/l/zh/navigation.json b/packages/twenty-docs/l/zh/navigation.json
index a69f38170a..8096fbf4ac 100644
--- a/packages/twenty-docs/l/zh/navigation.json
+++ b/packages/twenty-docs/l/zh/navigation.json
@@ -3,89 +3,201 @@
"userGuide": {
"label": "User Guide",
"groups": {
- "gettingStarted": {
- "label": "Getting Started"
+ "discoverTwenty": {
+ "label": "Discover Twenty",
+ "groups": {
+ "gettingStartedCapabilities": {
+ "label": "Capabilities"
+ },
+ "gettingStartedHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"dataModel": {
- "label": "數據模型"
+ "label": "Data Model",
+ "groups": {
+ "dataModelCapabilities": {
+ "label": "Capabilities"
+ },
+ "dataModelHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "crmEssentials": {
- "label": "CRM 基礎知識"
+ "dataMigration": {
+ "label": "Data Migration",
+ "groups": {
+ "dataMigrationCapabilities": {
+ "label": "Capabilities"
+ },
+ "dataMigrationHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "views": {
- "label": "視圖"
+ "calendarEmails": {
+ "label": "Calendar & Emails",
+ "groups": {
+ "calendarEmailsCapabilities": {
+ "label": "Capabilities"
+ },
+ "calendarEmailsHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"workflows": {
- "label": "Workflow"
+ "label": "Workflows",
+ "groups": {
+ "workflowsCapabilities": {
+ "label": "Capabilities"
+ },
+ "workflowsHowTos": {
+ "label": "How-Tos",
+ "groups": {
+ "crmAutomations": {
+ "label": "CRM Automations"
+ },
+ "connectToOtherTools": {
+ "label": "Connect to Other Tools"
+ },
+ "advancedConfigurations": {
+ "label": "Advanced Configurations"
+ },
+ "needMoreHelp": {
+ "label": "Need More Help"
+ }
+ }
+ }
+ }
},
- "collaboration": {
- "label": "協作"
+ "ai": {
+ "label": "AI",
+ "groups": {
+ "aiCapabilities": {
+ "label": "Capabilities"
+ },
+ "aiHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "integrationsApi": {
- "label": "Integrations & API"
+ "viewsPipelines": {
+ "label": "Views & Pipelines",
+ "groups": {
+ "viewsPipelinesCapabilities": {
+ "label": "Capabilities"
+ },
+ "viewsPipelinesHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
- "reporting": {
- "label": "報告"
+ "dashboards": {
+ "label": "Dashboards",
+ "groups": {
+ "dashboardsCapabilities": {
+ "label": "Capabilities"
+ },
+ "dashboardsHowTos": {
+ "label": "How-Tos"
+ }
+ }
+ },
+ "permissionsAccess": {
+ "label": "Permissions & Access",
+ "groups": {
+ "permissionsAccessCapabilities": {
+ "label": "Capabilities"
+ },
+ "permissionsAccessHowTos": {
+ "label": "How-Tos"
+ }
+ }
+ },
+ "billing": {
+ "label": "Billing",
+ "groups": {
+ "billingCapabilities": {
+ "label": "Capabilities"
+ },
+ "billingHowTos": {
+ "label": "How-Tos"
+ }
+ }
},
"settings": {
- "label": "設置"
- },
- "pricing": {
- "label": "定價"
- },
- "resources": {
- "label": "資源"
+ "label": "Settings",
+ "groups": {
+ "settingsCapabilities": {
+ "label": "Capabilities"
+ },
+ "settingsHowTos": {
+ "label": "How-Tos"
+ }
+ }
}
}
},
"developers": {
- "label": "開發人員",
+ "label": "Developers",
"groups": {
"developersGroup": {
- "label": "開發人員"
+ "label": "Developers"
},
- "devGettingStarted": {
- "label": "Getting Started",
+ "extend": {
+ "label": "Extend",
"groups": {
- "selfHosting": {
- "label": "Self-Hosting"
- },
- "apiAndWebhooks": {
- "label": "API 和 Webhooks"
+ "extendCapabilities": {
+ "label": "Capabilities"
}
}
},
- "contributing": {
- "label": "貢獻",
+ "selfHost": {
+ "label": "Self-Host",
"groups": {
- "frontendDevelopment": {
- "label": "前端開發",
+ "selfHostCapabilities": {
+ "label": "Capabilities"
+ }
+ }
+ },
+ "contribute": {
+ "label": "Contribute",
+ "groups": {
+ "contributeCapabilities": {
+ "label": "Capabilities",
"groups": {
- "twentyUi": {
- "label": "Twenty UI",
+ "frontendDevelopment": {
+ "label": "Frontend Development",
"groups": {
- "display": {
- "label": "顯示"
- },
- "feedback": {
- "label": "反饋"
- },
- "input": {
- "label": "輸入"
- },
- "navigation": {
- "label": "導航"
+ "twentyUi": {
+ "label": "Twenty UI",
+ "groups": {
+ "display": {
+ "label": "Display"
+ },
+ "feedback": {
+ "label": "Feedback"
+ },
+ "input": {
+ "label": "Input"
+ },
+ "navigation": {
+ "label": "Navigation"
+ }
+ }
}
}
+ },
+ "backendDevelopment": {
+ "label": "Backend Development"
}
}
- },
- "backendDevelopment": {
- "label": "後端開發"
}
}
}
}
}
}
-}
\ No newline at end of file
+}
diff --git a/packages/twenty-docs/l/zh/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/zh/twenty-ui/display/app-tooltip.mdx
index 6f9085e39a..4e620eedc7 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/display/app-tooltip.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/display/app-tooltip.mdx
@@ -1,5 +1,5 @@
---
-title: 应用程序提示
+title: App Tooltip
image: /images/user-guide/tips/light-bulb.png
---
@@ -7,82 +7,72 @@ image: /images/user-guide/tips/light-bulb.png
-当用户与一个元素互动时显示额外信息的简要信息。
+A brief message that displays additional information when a user interacts with an element.
-
+
+ ```jsx
+ import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
-```jsx
-import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
-
-export const MyComponent = () => {
- return (
- <>
-
- Customer Insights
-
-
- >
- );
-};
-```
-
-
-
-
-
-| 属性 | 类型 | 描述 |
-| ---------------- | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
-| 类名 | 字符串 | 用于额外样式的可选 CSS 类 |
-| anchorSelect | CSS 选择器 | 工具提示的锚选择器(触发工具提示的元素) |
-| 内容 | 字符串 | 您希望在工具提示中显示的内容 |
-| delayHide | 数字 | 在光标离开锚后隐藏工具提示的延迟时间(秒) |
-| offset | 数字 | 工具提示定位的像素偏移量 |
-| noArrow | 布尔值 | 如果为 `true`,则隐藏工具提示上的箭头 |
-| isOpen | 布尔值 | 如果为 `true`,工具提示默认打开 |
-| place | `PlacesType` 字符串来自 `react-tooltip` | 指定工具提示的位置。 值包括 `bottom`、`left`、`right`、`top`、`top-start`、`top-end`、`right-start`、`right-end`、`bottom-start`、`bottom-end`、`left-start` 和 `left-end` |
-| positionStrategy | `PositionStrategy` 字符串来自 `react-tooltip` | 工具提示的位置策略。 有两个值: `absolute` 和 `fixed` |
-
-
+ export const MyComponent = () => {
+ return (
+ <>
+
+ Customer Insights
+
+
+ >
+ );
+ };
+ ```
+
+
+ | Props | Type | Description |
+ | ---------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional CSS class for additional styling |
+ | anchorSelect | CSS selector | Selector for the tooltip anchor (the element that triggers the tooltip) |
+ | content | string | The content you want to display within the tooltip |
+ | delayHide | number | The delay in seconds before hiding the tooltip after the cursor leaves the anchor |
+ | offset | number | The offset in pixels for positioning the tooltip |
+ | noArrow | boolean | If `true`, hides the arrow on the tooltip |
+ | isOpen | boolean | If `true`, the tooltip is open by default |
+ | place | `PlacesType` string from `react-tooltip` | Specifies the placement of the tooltip. Values include `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, and `left-end` |
+ | positionStrategy | `PositionStrategy` string from `react-tooltip` | Position strategy for the tooltip. Has two values: `absolute` and `fixed` |
+
-## 文本溢出与工具提示
+## Overflowing Text with Tooltip
-处理文本溢出,并在文本溢出时显示工具提示。
+Handles overflowing text and displays a tooltip when the text overflows.
-
+
+ ```jsx
+ import { OverflowingTextWithTooltip } from 'twenty-ui/display';
-```jsx
-import { OverflowingTextWithTooltip } from 'twenty-ui/display';
+ export const MyComponent = () => {
+ const crmTaskDescription =
+ 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
-export const MyComponent = () => {
- const crmTaskDescription =
- 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
-
- return ;
-};
-```
-
-
-
-
-
-| 属性 | 类型 | 描述 |
-| -- | --- | -------------- |
-| 文本 | 字符串 | 想要在文本溢出区域显示的内容 |
-
-
+ return ;
+ };
+ ```
+
+
+ | Props | Type | Description |
+ | ----- | ------ | ------------------------------------------------------------ |
+ | text | string | The content you want to display in the overflowing text area |
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/display/checkmark.mdx b/packages/twenty-docs/l/zh/twenty-ui/display/checkmark.mdx
new file mode 100644
index 0000000000..ef84d5c2d5
--- /dev/null
+++ b/packages/twenty-docs/l/zh/twenty-ui/display/checkmark.mdx
@@ -0,0 +1,58 @@
+---
+title: Checkmark
+image: /images/user-guide/tasks/tasks_header.png
+---
+
+
+
+
+
+Represents a successful or completed action.
+
+
+
+ ```jsx
+ import { Checkmark } from 'twenty-ui/display';
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ Extends `React.ComponentPropsWithoutRef<'div'>` and accepts all the props of a regular `div` element.
+
+
+
+## Animated Checkmark
+
+Represents a checkmark icon with the added feature of animation.
+
+
+
+ ```jsx
+ import { AnimatedCheckmark } from 'twenty-ui/display';
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ----------- | ------- | ------------------------------------------- | ----------- |
+ | isAnimating | boolean | Controls whether the checkmark is animating | false |
+ | color | string | Color of the checkmark | |
+ | duration | number | The duration of the animation in seconds | 0.5 seconds |
+ | size | number | The size of the checkmark | 28 pixels |
+
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/display/chip.mdx b/packages/twenty-docs/l/zh/twenty-ui/display/chip.mdx
new file mode 100644
index 0000000000..ded2fd1c77
--- /dev/null
+++ b/packages/twenty-docs/l/zh/twenty-ui/display/chip.mdx
@@ -0,0 +1,138 @@
+---
+title: Chip
+image: /images/user-guide/github/github-header.png
+---
+
+
+
+
+
+A visual element that you can use as a clickable or non-clickable container with a label, optional left and right components, and various styling options to display labels and tags.
+
+
+
+ ```jsx
+ import { Chip } from 'twenty-ui/components';
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------ | ------------------------ | -------------------------------------------------------------------------------------------- |
+ | linkToEntity | string | The link to the entity |
+ | entityId | string | The unique identifier for the entity |
+ | name | string | The name of the entity |
+ | pictureUrl | string | s picture", |
+ | avatarType | Avatar Type | The type of avatar you want to display. Has two options: `rounded` and `squared` |
+ | variant | `EntityChipVariant` enum | Variant of the entity chip you want to display. Has two options: `regular` and `transparent` |
+ | LeftIcon | IconComponent | A React component representing an icon. Displayed on the left side of the chip |
+
+
+
+## Examples
+
+### Transparent Disabled Chip
+
+```jsx
+import { Chip } from 'twenty-ui/components';
+
+export const MyComponent = () => {
+ return (
+
+ );
+};
+
+```
+
+
+
+### Disabled Chip with Tooltip
+
+```jsx
+import { Chip } from "twenty-ui/components";
+
+export const MyComponent = () => {
+ return (
+
+ );
+};
+```
+
+## Entity Chip
+
+A Chip-like element to display information about an entity.
+
+
+
+ ```jsx
+ import { BrowserRouter as Router } from 'react-router-dom';
+ import { IconTwentyStar } from 'twenty-ui/display';
+ import { Chip } from 'twenty-ui/components';
+
+ export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------ | ------------------------ | -------------------------------------------------------------------------------------------- |
+ | linkToEntity | string | The link to the entity |
+ | entityId | string | The unique identifier for the entity |
+ | name | string | The name of the entity |
+ | pictureUrl | string | s picture", |
+ | avatarType | Avatar Type | The type of avatar you want to display. Has two options: `rounded` and `squared` |
+ | variant | `EntityChipVariant` enum | Variant of the entity chip you want to display. Has two options: `regular` and `transparent` |
+ | LeftIcon | IconComponent | A React component representing an icon. Displayed on the left side of the chip |
+
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/display/icons.mdx b/packages/twenty-docs/l/zh/twenty-ui/display/icons.mdx
new file mode 100644
index 0000000000..2d73154c8d
--- /dev/null
+++ b/packages/twenty-docs/l/zh/twenty-ui/display/icons.mdx
@@ -0,0 +1,73 @@
+---
+title: Icons
+image: /images/user-guide/objects/objects.png
+---
+
+
+
+
+
+A list of icons used throughout our app.
+
+## Tabler Icons
+
+We use Tabler icons for React throughout the app.
+
+
+
+
+
+ ```
+ yarn add @tabler/icons-react
+ ```
+
+
+
+ You can import each icon as a component. Here's an example:
+
+
+
+ ```jsx
+ import { IconArrowLeft } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ------ | ------ | ------------------------------------------ | ------------ |
+ | size | number | The height and width of the icon in pixels | 24 |
+ | color | string | The color of the icons | currentColor |
+ | stroke | number | The stroke width of the icon in pixels | 2 |
+
+
+
+## Custom Icons
+
+In addition to Tabler icons, the app also uses some custom icons.
+
+### Icon Address Book
+
+Displays an address book icon.
+
+
+
+ ```jsx
+ import { IconAddressBook } from 'twenty-ui/display';
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ------ | ------ | ------------------------------------------ | ------- |
+ | size | number | The height and width of the icon in pixels | 24 |
+ | stroke | number | The stroke width of the icon in pixels | 2 |
+
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/display/soon-pill.mdx b/packages/twenty-docs/l/zh/twenty-ui/display/soon-pill.mdx
index 4f60dd1870..56ace0bae7 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/display/soon-pill.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/display/soon-pill.mdx
@@ -1,5 +1,5 @@
---
-title: 即将推出的小徽章或 "药丸"。
+title: Soon Pill
image: /images/user-guide/kanban-views/kanban.png
---
@@ -7,7 +7,7 @@ image: /images/user-guide/kanban-views/kanban.png
-指示某物即将出现的小徽章或 "药丸" 。
+A small badge or "pill" to indicate something is coming soon.
```jsx
import { SoonPill } from "@/ui/display/pill/components/SoonPill";
diff --git a/packages/twenty-docs/l/zh/twenty-ui/display/tag.mdx b/packages/twenty-docs/l/zh/twenty-ui/display/tag.mdx
index 024720d369..a2226c88d4 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/display/tag.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/display/tag.mdx
@@ -1,5 +1,5 @@
---
-title: 标签
+title: Tag
image: /images/user-guide/table-views/table.png
---
@@ -7,38 +7,32 @@ image: /images/user-guide/table-views/table.png
-用于可视化分类或标记内容的组件。
+Component to visually categorize or label content.
+
+ ```jsx
+ import { Tag } from "@/ui/display/tag/components/Tag";
-
-
-```jsx
-import { Tag } from "@/ui/display/tag/components/Tag";
-
-export const MyComponent = () => {
- return (
- console.log("click")}
- />
- );
-};
-```
-
-
-
-
-
-| 属性 | 类型 | 描述 |
-| ------- | --- | --------------------------------------------------------------- |
-| 类名 | 字符串 | 用于附加样式的可选名称 |
-| 颜色 | 字符串 | 标签的颜色。 选项包括:`绿色`,`绿松石`,`天蓝`,`蓝色`,`紫色`,`粉红色`,`红色`,`橙色`,`黄色`,`灰色` |
-| 文本 | 字符串 | 标签的内容 |
-| onClick | 函数 | 用户点击标签时的可选调用函数 |
-
-
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+ | Props | Type | Description |
+ | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | color | string | Color of the tag. Options include: `green`, `turquoise`, `sky`, `blue`, `purple`, `pink`, `red`, `orange`, `yellow`, `gray` |
+ | text | string | The content of the tag |
+ | onClick | function | Optional function called when a user clicks on the tag |
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/input.mdx b/packages/twenty-docs/l/zh/twenty-ui/input.mdx
index da99958ad8..2da701caf5 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/input.mdx
@@ -1,8 +1,8 @@
---
-title: 输入
+title: Input
image: /images/user-guide/tips/light-bulb.png
---
-
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/input/block-editor.mdx b/packages/twenty-docs/l/zh/twenty-ui/input/block-editor.mdx
index ed9b82c92e..9943fa5f5d 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/input/block-editor.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/input/block-editor.mdx
@@ -1,5 +1,5 @@
---
-title: 区块编辑器
+title: Block Editor
image: /images/user-guide/api/api.png
---
@@ -7,28 +7,25 @@ image: /images/user-guide/api/api.png
-使用来自 [BlockNote](https://www.blocknotejs.org/) 的基于区块的富文本编辑器,允许用户编辑和查看内容块。
+Uses a block-based rich text editor from [BlockNote](https://www.blocknotejs.org/) to allow users to edit and view blocks of content.
-
+
+ ```jsx
+ import { useBlockNote } from "@blocknote/react";
+ import { BlockEditor } from "@/ui/input/editor/components/BlockEditor";
-```jsx
-import { useBlockNote } from "@blocknote/react";
-import { BlockEditor } from "@/ui/input/editor/components/BlockEditor";
+ export const MyComponent = () => {
+ const BlockNoteEditor = useBlockNote();
-export const MyComponent = () => {
- const BlockNoteEditor = useBlockNote();
+ return ;
+ };
+ ```
+
- return ;
-};
-```
-
-
-
-
-| 属性 | 类型 | 描述 |
-| --- | ----------------- | ---------- |
-| 编辑器 | `BlockNoteEditor` | 区块编辑器实例或配置 |
-
-
+
+ | Props | Type | Description |
+ | ------ | ----------------- | ------------------------------------------ |
+ | editor | `BlockNoteEditor` | The block editor instance or configuration |
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/input/buttons.mdx b/packages/twenty-docs/l/zh/twenty-ui/input/buttons.mdx
new file mode 100644
index 0000000000..1c53eb1816
--- /dev/null
+++ b/packages/twenty-docs/l/zh/twenty-ui/input/buttons.mdx
@@ -0,0 +1,439 @@
+---
+title: Buttons
+image: /images/user-guide/views/filter.png
+---
+
+
+
+
+
+A list of buttons and button groups used throughout the app.
+
+## Button
+
+
+
+ ```jsx
+ import { Button } from "@/ui/input/button/components/Button";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional class name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | fullWidth | boolean | Defines whether the button should span the whole width of its container |
+ | variant | string | The visual style variant of the button. Options include `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` |
+ | accent | string | The accent color of the button. Options include: `default`, `blue`, and `danger` |
+ | soon | boolean | Indicates if the button is marked as "soon" (such as for upcoming features) |
+ | disabled | boolean | Specifies whether the button is disabled or not |
+ | focus | boolean | Determines if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Button Group
+
+
+
+ ```jsx
+ import { Button } from "@/ui/input/button/components/Button";
+ import { ButtonGroup } from "@/ui/input/button/components/ButtonGroup";
+
+ export const MyComponent = () => {
+ return (
+
+ console.log("click")}
+ />
+ console.log("click")}
+ />
+ console.log("click")}
+ />
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------- | ---------------------------------------------------------------------------------------------------------------- |
+ | variant | string | The visual style variant of the buttons within the group. Options include `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the buttons within the group. Has two options: `medium` and `small` |
+ | accent | string | The accent color of the buttons within the group. Options include `default`, `blue` and `danger` |
+ | className | string | Optional class name for additional styling |
+ | children | ReactNode | An array of React elements representing the individual buttons within the group |
+
+
+
+## Floating Button
+
+
+
+ ```jsx
+ import { FloatingButton } from "@/ui/input/button/components/FloatingButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | --------------------- | ---------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `middle`, `right` |
+ | applyShadow | boolean | Determines whether to apply shadow to a button |
+ | applyBlur | boolean | Determines whether to apply a blur effect to the button |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+
+
+
+## Floating Button Group
+
+
+
+ ```jsx
+ import { FloatingButton } from "@/ui/input/button/components/FloatingButton";
+ import { FloatingButtonGroup } from "@/ui/input/button/components/FloatingButtonGroup";
+ import { IconClipboardText, IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+
+
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | -------- | --------- | ------------------------------------------------------------------------------- | ------- |
+ | size | string | The size of the button. Has two options: `small` and `medium` | small |
+ | children | ReactNode | An array of React elements representing the individual buttons within the group | |
+
+
+
+## Floating Icon Button
+
+
+
+ ```jsx
+ import { FloatingIconButton } from "@/ui/input/button/components/FloatingIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ isActive={true}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` |
+ | applyShadow | boolean | Determines whether to apply shadow to a button |
+ | applyBlur | boolean | Determines whether to apply a blur effect to the button |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+ | isActive | boolean | Determines if the button is in an active state |
+
+
+
+## Floating Icon Button Group
+
+
+
+ ```jsx
+ import { FloatingIconButtonGroup } from "@/ui/input/button/components/FloatingIconButtonGroup";
+ import { IconClipboardText, IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ const iconButtons = [
+ {
+ Icon: IconClipboardText,
+ onClick: () => console.log("Button 1 clicked"),
+ isActive: true,
+ },
+ {
+ Icon: IconCheckbox,
+ onClick: () => console.log("Button 2 clicked"),
+ isActive: true,
+ },
+ ];
+
+ return (
+
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | ----------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | iconButtons | array | An array of objects, each representing an icon button in the group. Each object should include the icon component you want to display in the button, the function you want to call when a user clicks on the button, and whether the button should be active or not. |
+
+
+
+## Light Button
+
+
+
+ ```jsx
+ import { LightButton } from "@/ui/input/button/components/LightButton";
+
+ export const MyComponent = () => {
+ return console.log('click')}
+ />;
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ----------------- | --------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | icon | `React.ReactNode` | The icon you want to display in the button |
+ | title | string | The text content of the button |
+ | accent | string | The accent color of the button. Options include: `secondary` and `tertiary` |
+ | active | boolean | Determines if the button is in an active state |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Light Icon Button
+
+
+
+ ```jsx
+ import { LightIconButton } from "@/ui/input/button/components/LightIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+ console.log("click")}
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | --------------------- | --------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | testId | string | Test identifier for the button |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | title | string | The text content of the button |
+ | size | string | The size of the button. Has two options: `small` and `medium` |
+ | accent | string | The accent color of the button. Options include: `secondary` and `tertiary` |
+ | active | boolean | Determines if the button is in an active state |
+ | disabled | boolean | Determines whether the button is disabled |
+ | focus | boolean | Indicates if the button has focus |
+ | onClick | function | A callback function that triggers when the user clicks on the button |
+
+
+
+## Main Button
+
+
+
+ ```jsx
+ import { MainButton } from "@/ui/input/button/components/MainButton";
+ import { IconCheckbox } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------------- | -------------------------------- | --------------------------------------------------------------------------------- |
+ | title | string | The text content of the button |
+ | fullWidth | boolean | Defines whether the button should span the whole width of its container |
+ | variant | string | The visual style variant of the button. Options include `primary` and `secondary` |
+ | soon | boolean | Indicates if the button is marked as "soon" (such as for upcoming features) |
+ | Icon | `React.ComponentType` | An optional icon component that's displayed within the button |
+ | React `button` props | `React.ComponentProps<'button'>` | All standard HTML button props are supported |
+
+
+
+## Rounded Icon Button
+
+
+
+ ```jsx
+ import { RoundedIconButton } from "@/ui/input/button/components/RoundedIconButton";
+ import { IconSearch } from "@tabler/icons-react";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------------- | ----------------------------------------------- | ----------- |
+ | Icon | `React.ComponentType` | |
+ | React `button` props | `React.ButtonHTMLAttributes` | |
+
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/input/checkbox.mdx b/packages/twenty-docs/l/zh/twenty-ui/input/checkbox.mdx
new file mode 100644
index 0000000000..b25eeba052
--- /dev/null
+++ b/packages/twenty-docs/l/zh/twenty-ui/input/checkbox.mdx
@@ -0,0 +1,44 @@
+---
+title: Checkbox
+image: /images/user-guide/tasks/tasks_header.png
+---
+
+
+
+
+
+Used when a user needs to select multiple values from several options.
+
+
+
+ ```jsx
+ import { Checkbox } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ return (
+ console.log("onChange function fired")}
+ onCheckedChange={() => console.log("onCheckedChange function fired")}
+ variant="primary"
+ size="small"
+ shape="squared"
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------------- | -------- | -------------------------------------------------------------------------------------------- |
+ | checked | boolean | Indicates whether the checkbox is checked |
+ | indeterminate | boolean | Indicates whether the checkbox is in an indeterminate state (neither checked nor unchecked) |
+ | onChange | function | The callback function you want to trigger when the checkbox state changes |
+ | onCheckedChange | function | The callback function you want to trigger when the `checked` state changes |
+ | variant | string | The visual style variant of the box. Options include: `primary`, `secondary`, and `tertiary` |
+ | size | string | The size of the checkbox. Has two options: `small` and `large` |
+ | shape | string | The shape of the checkbox. Has two options: `squared` and `rounded` |
+
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/input/color-scheme.mdx b/packages/twenty-docs/l/zh/twenty-ui/input/color-scheme.mdx
new file mode 100644
index 0000000000..1b1505d481
--- /dev/null
+++ b/packages/twenty-docs/l/zh/twenty-ui/input/color-scheme.mdx
@@ -0,0 +1,63 @@
+---
+title: Color Scheme
+image: /images/user-guide/fields/field.png
+---
+
+
+
+
+
+## Color Scheme Card
+
+Represents different color schemes and is specially tailored for light and dark themes.
+
+
+
+ ```jsx
+ import { ColorSchemeCard } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ---------------- | --------------------------------------- | ----------------------------------------------------------------------- | ------- |
+ | variant | string | The color scheme variant. Options include `Dark`, `Light`, and `System` | light |
+ | selected | boolean | If `true`, displays a checkmark to indicate the selected color scheme | |
+ | additional props | `React.ComponentPropsWithoutRef<'div'>` | Standard HTML `div` element props | |
+
+
+
+## Color Scheme Picker
+
+Allows users to choose between different color schemes.
+
+
+
+ ```jsx
+ import { ColorSchemePicker } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------- | -------------- | ---------------------------------------------------------------------------- |
+ | value | `Color Scheme` | The currently selected color scheme |
+ | onChange | function | The callback function you want to trigger when a user selects a color scheme |
+
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/zh/twenty-ui/input/icon-picker.mdx
index 182cbced4f..59d269242e 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/input/icon-picker.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/input/icon-picker.mdx
@@ -1,30 +1,52 @@
---
-title: 图标选择器
+title: Icon Picker
image: /images/user-guide/github/github-header.png
---
-
+
-一个基于下拉菜单的图标选择器,允许用户从列表中选择图标。
+A dropdown-based icon picker that allows users to select an icon from a list.
-
+
```jsx
- import { RecoilRoot } from \"recoil\";\nimport React, { useState } from \"react\";\nimport { IconPicker } from \"@/ui/input/components/IconPicker\";\n\nexport const MyComponent = () => {\n\n const [selectedIcon, setSelectedIcon] = useState(\"\");\n const handleIconChange = ({ iconKey, Icon }) => {\n console.log(\"Selected Icon:\", iconKey);\n setSelectedIcon(iconKey);\n };\n\n return (\n \n \n \n );\n};
+ import { RecoilRoot } from "recoil";
+ import React, { useState } from "react";
+ import { IconPicker } from "@/ui/input/components/IconPicker";
+
+ export const MyComponent = () => {
+
+ const [selectedIcon, setSelectedIcon] = useState("");
+ const handleIconChange = ({ iconKey, Icon }) => {
+ console.log("Selected Icon:", iconKey);
+ setSelectedIcon(iconKey);
+ };
+
+ return (
+
+
+
+ );
+ };
```
-
- | 属性 | 类型 | 描述 |
- | --------------- | --- | ------------------------------------------------------ |
- | 禁用 | 布尔值 | 如果设置为 `true`,则禁用图标选择器 |
- | onChange | 函数 | 当用户选择图标时触发的回调函数。 它接收一个具有 `iconKey` 和 `Icon` 属性的对象 |
- | selectedIconKey | 字符串 | 初始选中的图标键 |
- | onClickOutside | 函数 | 当用户点击下拉菜单外部时触发的回调函数 |
- | onClose | 函数 | 当下拉菜单关闭时触发的回调函数 |
- | onOpen | 函数 | 当下拉菜单打开时触发的回调函数 |
- | variant | 字符串 | 可点击图标的视觉风格变体。 可选项包括:`primary`、`secondary` 和 `tertiary` |
+
+ | Props | Type | Description |
+ | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------- |
+ | disabled | boolean | Disables the icon picker if set to `true` |
+ | onChange | function | The callback function triggered when the user selects an icon. It receives an object with `iconKey` and `Icon` properties |
+ | selectedIconKey | string | The key of the initially selected icon |
+ | onClickOutside | function | Callback function triggered when the user clicks outside the dropdown |
+ | onClose | function | Callback function triggered when the dropdown is closed |
+ | onOpen | function | Callback function triggered when the dropdown is opened |
+ | variant | string | The visual style variant of the clickable icon. Options include: `primary`, `secondary`, and `tertiary` |
diff --git a/packages/twenty-docs/l/zh/twenty-ui/input/image-input.mdx b/packages/twenty-docs/l/zh/twenty-ui/input/image-input.mdx
new file mode 100644
index 0000000000..0d563d7c37
--- /dev/null
+++ b/packages/twenty-docs/l/zh/twenty-ui/input/image-input.mdx
@@ -0,0 +1,34 @@
+---
+title: Image Input
+image: /images/user-guide/objects/objects.png
+---
+
+
+
+
+
+Allows users to upload and remove an image.
+
+
+
+ ```jsx
+ import { ImageInput } from "@/ui/input/components/ImageInput";
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------ | -------- | ------------------------------------------------------------------------------------------------- |
+ | picture | string | The image source URL |
+ | onUpload | function | The function called when a user uploads a new image. It receives the `File` object as a parameter |
+ | onRemove | function | The function called when the user clicks on the remove button |
+ | onAbort | function | The function called when a user clicks on the abort button during image upload |
+ | isUploading | boolean | Indicates whether an image is currently being uploaded |
+ | errorMessage | string | An optional error message to display below the image input |
+ | disabled | boolean | If `true`, the entire input is disabled, and the buttons are not clickable |
+
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/input/radio.mdx b/packages/twenty-docs/l/zh/twenty-ui/input/radio.mdx
index 2f7b70688e..e6246e631f 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/input/radio.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/input/radio.mdx
@@ -1,5 +1,5 @@
---
-title: 单选按钮
+title: Radio
image: /images/user-guide/create-workspace/workspace-cover.png
---
@@ -7,98 +7,91 @@ image: /images/user-guide/create-workspace/workspace-cover.png
-当用户只能从一系列选项中选择一个时使用。
+Used when users may only choose one option from a series of options.
-
+
+ ```jsx
+ import { Radio } from "twenty-ui/display";
-```jsx
-import { Radio } from "twenty-ui/display";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ const handleRadioChange = (event) => {
+ console.log("Radio button changed:", event.target.checked);
+ };
- const handleRadioChange = (event) => {
- console.log("Radio button changed:", event.target.checked);
- };
-
- const handleCheckedChange = (checked) => {
- console.log("Checked state changed:", checked);
- };
+ const handleCheckedChange = (checked) => {
+ console.log("Checked state changed:", checked);
+ };
- return (
-
- );
-};
+ return (
+
+ );
+ };
-```
+ ```
+
-
-
-
-| 属性 | 类型 | 描述 |
-| --------------- | -------------- | ------------------------------- |
-| 样式 | `React.CSS` 属性 | 组件的附加行内样式 |
-| 类名 | 字符串 | 用于额外样式的可选 CSS 类 |
-| 选中 | 布尔值 | 指示单选按钮是否被选中 |
-| 值 | 字符串 | 与单选按钮相关联的标签或文本 |
-| onChange | function | 选择的单选按钮改变时调用的函数 |
-| onCheckedChange | function | 当单选按钮的 `checked` 状态改变时调用的函数 |
-| 大小 | 字符串 | 单选按钮的尺寸。 选项包括:`大` 和 `小` |
-| disabled | 布尔值 | 如果为 `true`,则单选按钮将被禁用且不可点击 |
-| 标签位置 | 字符串 | 标签文字相对于单选按钮的位置。 有两个选项:`左` 和 `右` |
-
-
+
+ | Props | Type | Description |
+ | --------------- | ---------------------- | ------------------------------------------------------------------------------------------------ |
+ | style | `React.CSS` properties | Additional inline styles for the component |
+ | className | string | Optional CSS class for additional styling |
+ | checked | boolean | Indicates whether the radio button is checked |
+ | value | string | The label or text associated with the radio button |
+ | onChange | function | The function called when the selected radio button is changed |
+ | onCheckedChange | function | The function called when the `checked` state of the radio button changes |
+ | size | string | The size of the radio button. Options include: `large` and `small` |
+ | disabled | boolean | If `true`, the radio button is disabled and not clickable |
+ | labelPosition | string | The position of the label text relative to the radio button. Has two options: `left` and `right` |
+
-## 单选按钮组
+## Radio Group
-将相关的单选按钮组合在一起。
+Groups together related radio buttons.
-
+
+ ```jsx
+ import React, { useState } from "react";
+ import { Radio, RadioGroup } from "twenty-ui/display";
-```jsx
-import React, { useState } from "react";
-import { Radio, RadioGroup } from "twenty-ui/display";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ const [selectedValue, setSelectedValue] = useState("Option 1");
- const [selectedValue, setSelectedValue] = useState("Option 1");
+ const handleChange = (event) => {
+ setSelectedValue(event.target.value);
+ };
+
+ return (
+
+
+
+
+
+ );
+ };
- const handleChange = (event) => {
- setSelectedValue(event.target.value);
- };
-
- return (
-
-
-
-
-
- );
-};
-
-```
-
-
-
-
-| 属性 | 类型 | 描述 |
-| ------------- | ----------------- | -------------------------------- |
-| 值 | 字符串 | 当前选中单选按钮的值 |
-| onChange | function | 当单选按钮改变时触发的回调函数 |
-| onValueChange | function | 当组中选定的值发生变化时触发的回调函数。 |
-| 子元素 | `React.ReactNode` | 允许您将 React 组件(如单选按钮)作为子项传递给单选按钮组 |
-
-
+ ```
+
+
+ | Props | Type | Description |
+ | ------------- | ----------------- | ---------------------------------------------------------------------------------- |
+ | value | string | The value of the currently selected radio button |
+ | onChange | function | The callback function triggered when the radio button is changed |
+ | onValueChange | function | The callback function triggered when the selected value in the group changes. |
+ | children | `React.ReactNode` | Allows you to pass React components (such as Radio) as children to the Radio Group |
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/input/select.mdx b/packages/twenty-docs/l/zh/twenty-ui/input/select.mdx
index 13aca04d2a..d685bf4012 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/input/select.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/input/select.mdx
@@ -1,5 +1,5 @@
---
-title: 选择
+title: Select
image: /images/user-guide/what-is-twenty/20.png
---
@@ -7,48 +7,45 @@ image: /images/user-guide/what-is-twenty/20.png
-允许用户从预定义选项列表中选择一个值。
+Allows users to pick a value from a list of predefined options.
-
+
+ ```jsx
+ import { RecoilRoot } from 'recoil';
+ import { IconTwentyStar } from 'twenty-ui/display';
-```jsx
-import { RecoilRoot } from 'recoil';
-import { IconTwentyStar } from 'twenty-ui/display';
+ import { Select } from '@/ui/input/components/Select';
-import { Select } from '@/ui/input/components/Select';
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
- return (
-
-
-
- );
-};
+ ```
+
-```
-
-
-
-
-| 属性 | 类型 | 描述 |
-| -------- | -------- | ---------------------------------------------------------------- |
-| 类名 | 字符串 | 用于额外样式的可选 CSS 类 |
-| disabled | 布尔值 | 当设置为`true`时,禁用用户与组件的交互 |
-| 标签 | 字符串 | 描述`选择`组件用途的标签 |
-| onChange | function | 当所选值更改时调用的函数 |
-| 选项 | 数组 | 表示`选择`组件的可用选项。 它是一个对象数组,每个对象具有一个`值`(唯一标识符)、`标签`(唯一标识符)和一个可选的`图标` |
-| 值 | 字符串 | 表示当前选择的值。 它应匹配`选项`数组中的一个`值`属性 |
-
-
+
+ | Props | Type | Description |
+ | --------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional CSS class for additional styling |
+ | disabled | boolean | When set to `true`, disables user interaction with the component |
+ | label | string | The label to describe the purpose of the `Select` component |
+ | onChange | function | The function called when the selected values change |
+ | options | array | Represents the options available for the `Selected` component. It's an array of objects where each object has a `value` (the unique identifier), `label` (the unique identifier), and an optional `Icon` |
+ | value | string | Represents the currently selected value. It should match one of the `value` properties in the `options` array |
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/input/text.mdx b/packages/twenty-docs/l/zh/twenty-ui/input/text.mdx
index 9baf241037..8cad1352ae 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/input/text.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/input/text.mdx
@@ -1,5 +1,5 @@
---
-title: 文本
+title: Text
image: /images/user-guide/notes/notes_header.png
---
@@ -7,147 +7,131 @@ image: /images/user-guide/notes/notes_header.png
-## 文本输入
+## Text Input
-允许用户输入和编辑文本。
+Allows users to enter and edit text.
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import { TextInput } from "@/ui/input/components/TextInput";
-
+ export const MyComponent = () => {
+ const handleChange = (text) => {
+ console.log("Input changed:", text);
+ };
-```jsx
-import { RecoilRoot } from "recoil";
-import { TextInput } from "@/ui/input/components/TextInput";
+ const handleKeyDown = (event) => {
+ console.log("Key pressed:", event.key);
+ };
-export const MyComponent = () => {
- const handleChange = (text) => {
- console.log("Input changed:", text);
- };
+ return (
+
+
+
+ );
+ };
- const handleKeyDown = (event) => {
- console.log("Key pressed:", event.key);
- };
+ ```
+
- return (
-
-
-
- );
-};
-
-```
-
-
-
-
-
-| 属性 | 类型 | 描述 |
-| -------------- | -------- | ---------------------------------------------- |
-| 类名 | 字符串 | 用于附加样式的可选名称 |
-| 标签 | 字符串 | 表示输入的标签 |
-| onChange | function | 当输入值更改时调用的函数 |
-| fullWidth | 布尔值 | 指示输入是否应占用100%的宽度 |
-| disableHotkeys | 布尔值 | 指示输入是否启用热键 |
-| 错误 | 字符串 | 表示要显示的错误信息。 提供时,还会在输入的右侧添加一个错误图标 |
-| onKeyDown | function | 当输入字段获得焦点并按下按键时调用。 接收`React.KeyboardEvent`作为参数 |
-| RightIcon | 图标组件 | 在输入右侧显示的可选图标组件 |
-
-该组件还接受其他HTML输入元素属性。
-
-
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | label | string | Represents the label for the input |
+ | onChange | function | The function called when the input value changes |
+ | fullWidth | boolean | Indicates whether the input should take up 100% of the width |
+ | disableHotkeys | boolean | Indicates whether hotkeys are enabled for the input |
+ | error | string | Represents the error message to be displayed. When provided, it also adds an icon error on the right side of the input |
+ | onKeyDown | function | Called when a key is pressed down while the input field is focused. Receives a `React.KeyboardEvent` as an argument |
+ | RightIcon | IconComponent | An optional icon component displayed on the right side of the input |
+ The component also accepts other HTML input element props.
+
-## 自动调整大小的文本输入
+## Autosize Text Input
-根据内容自动调整高度的文本输入组件。
+Text input component that automatically adjusts its height based on the content.
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import { AutosizeTextInput } from "@/ui/input/components/AutosizeTextInput";
-
-
-```jsx
-import { RecoilRoot } from "recoil";
-import { AutosizeTextInput } from "@/ui/input/components/AutosizeTextInput";
-
-export const MyComponent = () => {
- return (
-
- console.log("onValidate function fired")}
- minRows={1}
- placeholder="Write a comment"
- onFocus={() => console.log("onFocus function fired")}
- variant="icon"
- buttonTitle
- value="Task: "
- />
-
- );
-};
-```
-
-
-
-
-
-| 属性 | 类型 | 描述 |
-| ----------- | --- | ----------------------------------------- |
-| onValidate | 函数 | 用户验证输入时要触发的回调函数 |
-| minRows | 数字 | 文本区域的最小行数 |
-| 占位符 | 字符串 | 在文本区域为空时要显示的占位符文本 |
-| onFocus | 函数 | 当文本区域获得焦点时要触发的回调函数 |
-| 变体 | 字符串 | 输入的变体。 选项包括:`default`, `icon`, 和 `button` |
-| buttonTitle | 字符串 | 按钮的标题(仅适用于按钮变体) |
-| 值 | 字符串 | 文本区域的初始值 |
-
-
+ export const MyComponent = () => {
+ return (
+
+ console.log("onValidate function fired")}
+ minRows={1}
+ placeholder="Write a comment"
+ onFocus={() => console.log("onFocus function fired")}
+ variant="icon"
+ buttonTitle
+ value="Task: "
+ />
+
+ );
+ };
+ ```
+
+
+ | Props | Type | Description |
+ | ----------- | -------- | --------------------------------------------------------------------------- |
+ | onValidate | function | The callback function you want to trigger when the user validates the input |
+ | minRows | number | The minimum number of rows for the text area |
+ | placeholder | string | The placeholder text you want to display when the text area is empty |
+ | onFocus | function | The callback function you want to trigger when the text area gains focus |
+ | variant | string | The variant of the input. Options include: `default`, `icon`, and `button` |
+ | buttonTitle | string | The title for the button (only applicable for the button variant) |
+ | value | string | The initial value for the text area |
+
-## 文本区域
+## Text Area
-允许你创建多行文本输入。
+Allows you to create multi-line text inputs.
-
+
+ ```jsx
+ import { TextArea } from "@/ui/input/components/TextArea";
-```jsx
-import { TextArea } from "@/ui/input/components/TextArea";
+ export const MyComponent = () => {
+ return (
+
-export const MyComponent = () => {
- return (
-
-
-
-
-| 属性 | 类型 | 描述 |
-| -------- | -------- | ----------------- |
-| disabled | 布尔值 | 指示文本区域是否被禁用 |
-| minRows | 数字 | 文本区域的最小可见行数。 |
-| onChange | function | 当文本区域内容更改时触发的回调函数 |
-| 占位符 | 字符串 | 当文本区域为空时显示的占位符文本 |
-| 值 | 字符串 | 文本区域的当前值 |
-
-
+
+ | Props | Type | Description |
+ | ----------- | -------- | -------------------------------------------------------------- |
+ | disabled | boolean | Indicates whether the text area is disabled |
+ | minRows | number | Minimum number of visible rows for the text area. |
+ | onChange | function | Callback function triggered when the text area content changes |
+ | placeholder | string | Placeholder text displayed when the text area is empty |
+ | value | string | The current value of the text area |
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/input/toggle.mdx b/packages/twenty-docs/l/zh/twenty-ui/input/toggle.mdx
new file mode 100644
index 0000000000..39f1645abd
--- /dev/null
+++ b/packages/twenty-docs/l/zh/twenty-ui/input/toggle.mdx
@@ -0,0 +1,36 @@
+---
+title: Toggle
+image: /images/user-guide/table-views/table.png
+---
+
+
+
+
+
+
+
+ ```jsx
+ import { Toggle } from "twenty-ui/input";
+
+ export const MyComponent = () => {
+ return (
+ console.log('On Change event')}
+ color="green"
+ toggleSize = "medium"
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | ---------- | -------- | ------------------------------------------------------------------------------------------- | ------------ |
+ | value | boolean | The current state of the toggle | `false` |
+ | onChange | function | Callback function triggered when the toggle state changes | |
+ | color | string | Color of the toggle when it\ | s blue color |
+ | toggleSize | string | Size of the toggle, affecting both height and weight. Has two options: `small` and `medium` | medium |
+
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/introduction.mdx b/packages/twenty-docs/l/zh/twenty-ui/introduction.mdx
new file mode 100644
index 0000000000..7b15f3ee26
--- /dev/null
+++ b/packages/twenty-docs/l/zh/twenty-ui/introduction.mdx
@@ -0,0 +1,30 @@
+---
+title: Overview
+description: Component library for Twenty CRM
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+## Components
+
+
+
+ Display
+ Display components for showing information visually
+
+
+
+ Feedback
+ Feedback components for user notifications
+
+
+
+ Input
+ Input components for user interaction
+
+
+
+ Navigation
+ Navigation components for user interface
+
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/navigation.mdx b/packages/twenty-docs/l/zh/twenty-ui/navigation.mdx
index f0d2d5809f..b17dad4220 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/navigation.mdx
@@ -1,8 +1,8 @@
---
-title: 导航
+title: Navigation
image: /images/user-guide/tasks/tasks_header.png
---
-
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/zh/twenty-ui/navigation/breadcrumb.mdx
index 4cee8a950b..aadbee8ee4 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/navigation/breadcrumb.mdx
@@ -1,26 +1,26 @@
---
-title: 面包屑
+title: Breadcrumb
image: /images/user-guide/fields/field.png
---
-
+
-呈现一个面包屑导航栏。
+Renders a breadcrumb navigation bar.
-
+
```jsx
import { BrowserRouter } from "react-router-dom";
import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
export const MyComponent = () => {
const breadcrumbLinks = [
- { children: "首页", href: "/" },
- { children: "类别", href: "/category" },
- { children: "子类别", href: "/category/subcategory" },
- { children: "当前页面" },
+ { children: "Home", href: "/" },
+ { children: "Category", href: "/category" },
+ { children: "Subcategory", href: "/category/subcategory" },
+ { children: "Current Page" },
];
return (
@@ -32,10 +32,10 @@ image: /images/user-guide/fields/field.png
```
-
- | 属性 | 类型 | 描述 |
- | --------- | --- | -------------------------------------------------------------------------------- |
- | className | 字符串 | 用于额外样式的可选类名 |
- | 链接 | 数组 | 对象数组,每个代表一个面包屑链接。 每个对象都有一个 `children` 属性(链接的文本内容)和一个可选的 `href` 属性(点击链接时导航到的URL)。 |
+
+ | Props | Type | Description |
+ | --------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | Optional class name for additional styling |
+ | links | array | An array of objects, each representing a breadcrumb link. Each object has a `children` property (the text content of the link) and an optional `href` property (the URL to navigate to when the link is clicked) |
diff --git a/packages/twenty-docs/l/zh/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/zh/twenty-ui/navigation/links.mdx
index 5c0189a85e..e9f7e3d80f 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/navigation/links.mdx
@@ -1,91 +1,154 @@
---
-title: 链接
+title: Links
image: /images/user-guide/what-is-twenty/20.png
---
-
+
-## 联系链接
+## Contact Link
-用于显示联系信息的样式化链接组件。
+A stylized link component for displaying contact information.
-
+
```jsx
- 导入 { BrowserRouter as Router } from 'react-router-dom';\n\n导入 { ContactLink } from 'twenty-ui/navigation';\n\n导出 const MyComponent = () => {\n const handleLinkClick = (event) => {\n console.log('联系链接已点击!', event);\n };\n\n 返回 (\n \n \n example@example.com\n \n \n );\n};
+ import { BrowserRouter as Router } from 'react-router-dom';
+
+ import { ContactLink } from 'twenty-ui/navigation';
+
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log('Contact link clicked!', event);
+ };
+
+ return (
+
+
+ example@example.com
+
+
+ );
+ };
```
-
- | 属性 | 类型 | 描述 |
- | --------- | ----------------- | ------------- |
- | className | 字符串 | 用于附加样式的可选名称 |
- | href | 字符串 | 链接的目标网址或路径 |
- | onClick | function | 链接被点击时触发的回调函数 |
- | 子元素 | `React.ReactNode` | 在链接中显示的内容 |
+
+ | Props | Type | Description |
+ | --------- | ----------------- | ---------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | href | string | The target URL or path for the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
-## 原始链接
+## Raw Link
-用于显示链接的风格化链接组件。
+A stylized link component for displaying links.
-
+
```jsx
- 导入 { RawLink } from "/navigation";\n导入 { BrowserRouter as Router } from "react-router-dom";\n\n导出 const MyComponent = () => {\n const handleLinkClick = (event) => {\n console.log("联系链接已点击!", event);\n };\n\n 返回 (\n \n \n 联系我们\n \n \n );\n};\n
+ import { RawLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
+
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("Contact link clicked!", event);
+ };
+
+ return (
+
+
+ Contact Us
+
+
+ );
+ };
+
```
-
- | 属性 | 类型 | 描述 |
- | ------- | ----------------- | ------------- |
- | 类名 | 字符串 | 用于附加样式的可选名称 |
- | href | 字符串 | 链接的目标网址或路径 |
- | onClick | 函数 | 链接被点击时触发的回调函数 |
- | 子元素 | `React.ReactNode` | 在链接中显示的内容 |
+
+ | Props | Type | Description |
+ | --------- | ----------------- | ---------------------------------------------------------- |
+ | className | string | Optional name for additional styling |
+ | href | string | The target URL or path for the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
-## 圆形链接
+## Rounded Link
-以 Chip 组件风格显示的圆形链接。
+A rounded-styled link with a Chip component for links.
-
+
```jsx
- 导入 { RoundedLink } from "/navigation";\n导入 { BrowserRouter as Router } from "react-router-dom";\n\n导出 const MyComponent = () => {\n const handleLinkClick = (event) => {\n console.log("联系链接已点击!", event);\n };\n\n 返回 (\n \n \n 联系我们\n \n \n );\n};
+ import { RoundedLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
+
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("Contact link clicked!", event);
+ };
+
+ return (
+
+
+ Contact Us
+
+
+ );
+ };
```
-
- | 属性 | 类型 | 描述 |
- | ------- | ----------------- | ------------- |
- | href | 字符串 | 链接的目标网址或路径 |
- | 子元素 | `React.ReactNode` | 在链接中显示的内容 |
- | onClick | 函数 | 链接被点击时触发的回调函数 |
+
+ | Props | Type | Description |
+ | -------- | ----------------- | ---------------------------------------------------------- |
+ | href | string | The target URL or path for the link |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
+ | onClick | function | Callback function to be triggered when the link is clicked |
-## 社交链接
+## Social Link
-风格化的社交链接,支持各种社交链接类型,如网址、LinkedIn 和 X(或 Twitter)。
+Stylized social links, with support for various social link types, such as URLs, LinkedIn, and X (or Twitter).
-
+
```jsx
- 导入 { SocialLink } from "twenty-ui/navigation";\n导入 { BrowserRouter as Router } from "react-router-dom";\n\n导出 const MyComponent = () => {\n 返回 (\n \n \n \n );\n};
+ import { SocialLink } from "twenty-ui/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
+
+ export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
```
-
- | 属性 | 类型 | 描述 |
- | ------- | ----------------- | ------------------------------------------ |
- | href | 字符串 | 链接的目标网址或路径 |
- | 子元素 | `React.ReactNode` | 在链接中显示的内容 |
- | 类型 | 字符串 | 社交链接的类型。 选项包括:`url`、`LinkedIn` 和 `Twitter` |
- | onClick | 函数 | 链接被点击时触发的回调函数 |
+
+ | Props | Type | Description |
+ | -------- | ----------------- | --------------------------------------------------------------------------- |
+ | href | string | The target URL or path for the link |
+ | children | `React.ReactNode` | The content to be displayed inside the link |
+ | type | string | The type of social links. Options include: `url`, `LinkedIn`, and `Twitter` |
+ | onClick | function | Callback function to be triggered when the link is clicked |
diff --git a/packages/twenty-docs/l/zh/twenty-ui/navigation/menu-item.mdx b/packages/twenty-docs/l/zh/twenty-ui/navigation/menu-item.mdx
new file mode 100644
index 0000000000..209c6270ea
--- /dev/null
+++ b/packages/twenty-docs/l/zh/twenty-ui/navigation/menu-item.mdx
@@ -0,0 +1,428 @@
+---
+title: Menu Item
+image: /images/user-guide/kanban-views/kanban.png
+---
+
+
+
+
+
+A versatile menu item designed to be used in a menu or navigation list.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { IconAlertCircle } from "@tabler/icons-react";
+ import { MenuItem } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleMenuItemClick = (event) => {
+ console.log("Menu item clicked!", event);
+ };
+
+ const handleButtonClick = (event) => {
+ console.log("Icon button clicked!", event);
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------- | ------------- | ---------------------------------------------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | accent | string | Specifies the accent color of the menu item. Options include: `default`, `danger`, and `placeholder` |
+ | text | string | The text content of the menu item |
+ | iconButtons | array | An array of objects representing additional icon buttons associated with the menu item |
+ | isTooltipOpen | boolean | Controls the visibility of the tooltip associated with the menu item |
+ | testId | string | The data-testid attribute for testing purposes |
+ | onClick | function | Callback function triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+## Variants
+
+The different variants of the menu item component include the following:
+
+### Command
+
+A command-style menu item within a menu to indicate keyboard shortcuts.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemCommand } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleCommandClick = () => {
+ console.log("Command clicked!");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | ------------ | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | firstHotKey | string | The first keyboard shortcut associated with the command |
+ | secondHotKey | string | The second keyboard shortcut associated with the command |
+ | isSelected | boolean | Indicates whether the menu item is selected or highlighted |
+ | onClick | function | Callback function triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Draggable
+
+A draggable menu item component designed to be used in a menu or list where items can be dragged, and additional actions can be performed through icon buttons.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { IconAlertCircle } from "@tabler/icons-react";
+ import { MenuItemDraggable } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleMenuItemClick = (event) => {
+ console.log("Menu item clicked!", event);
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ------------------------------------------------------------------------------------------ |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | accent | string | The accent color of the menu item. It can either be `default`, `placeholder`, and `danger` |
+ | iconButtons | array | An array of objects representing additional icon buttons associated with the menu item |
+ | isTooltipOpen | boolean | Controls the visibility of the tooltip associated with the menu item |
+ | onClick | function | Callback function to be triggered when the link is clicked |
+ | text | string | The text content of the menu item |
+ | isDragDisabled | boolean | Indicates whether dragging is disabled |
+ | className | string | Optional name for additional styling |
+
+
+
+### Multi Select
+
+Provides a way to implement multi-select functionality with an associated checkbox.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemMultiSelect } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | onSelectChange | function | Callback function triggered when the checkbox state changes |
+ | className | string | Optional name for additional styling |
+
+
+
+### Multi Select Avatar
+
+A multi-select menu item with an avatar, a checkbox for selection, and textual content.
+
+
+
+ ```jsx
+ import { MenuItemMultiSelectAvatar } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const imageUrl =
+ "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
+
+ return (
+ }
+ text="First Option"
+ selected={false}
+ className
+ />
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ----------- | -------------------------------------------------------------------- |
+ | avatar | `ReactNode` | The avatar or icon to be displayed on the left side of the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | onSelectChange | function | Callback function triggered when the checkbox state changes |
+ | className | string | Optional name for additional styling |
+
+
+
+### Navigate
+
+A menu item featuring an optional left icon, textual content, and a right-chevron icon.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemNavigate } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleNavigation = () => {
+ console.log("Navigate to another page");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Select
+
+A selectable menu item, featuring optional left content (icon and text) and an indicator (check icon) for the selected state.
+
+
+
+ ```jsx
+ import { IconBell } from "@tabler/icons-react";
+ import { MenuItemSelect } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ------------- | ---------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Select Avatar
+
+A selectable menu item with an avatar, featuring optional left content (avatar and text) and an indicator (check icon) for the selected state.
+
+
+
+ ```jsx
+ import { MenuItemSelectAvatar } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const imageUrl =
+ "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAYABgAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAABSgAwAEAAAAAQAAABQAAAAA/8AAEQgAFAAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMACwgICggHCwoJCg0MCw0RHBIRDw8RIhkaFBwpJCsqKCQnJy0yQDctMD0wJyc4TDk9Q0VISUgrNk9VTkZUQEdIRf/bAEMBDA0NEQ8RIRISIUUuJy5FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRf/dAAQAAv/aAAwDAQACEQMRAD8Ava1q728otYY98joSCTgZrnbXWdTtrhrfVZXWLafmcAEkdgR/hVltQku9Q8+OIEBcGOT+ID0PY1ka1KH2u8ToqnPLbmIqG7u6LtbQ7RXBRec4Uck9eKXcPWsKDWVnhWSL5kYcFelSf2m3901POh8jP//QoyIAnTuKpXsY82NsksUyWPU5q/L9z8RVK++/F/uCsVsaEURwgA4HtT9x9TUcf3KfUGh//9k=";
+
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
+
+ return (
+ }
+ text="First Option"
+ selected={true}
+ disabled={false}
+ hovered={false}
+ testId="menu-item-test"
+ onClick={handleSelection}
+ className
+ />
+ );
+ };
+
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | ----------- | -------------------------------------------------------------------- |
+ | avatar | `ReactNode` | The avatar or icon to be displayed on the left side of the menu item |
+ | text | string | The text content of the menu item |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | testId | string | The data-testid attribute for testing purposes |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Select Color
+
+A selectable menu item with a color sample for scenarios where you want users to choose a color from a menu.
+
+
+
+ ```jsx
+ import { MenuItemSelectColor } from "twenty-ui/display";
+
+ export const MyComponent = () => {
+ const handleSelection = () => {
+ console.log("Menu item selected");
+ };
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | color | string | The theme color to be displayed as a sample in the menu item. Options include: `green`, `turquoise`, `sky`, `blue`, `purple`, `pink`, `red`, `orange`, `yellow`, and `gray` |
+ | selected | boolean | Indicates whether the menu item is selected (checked) |
+ | disabled | boolean | Indicates whether the menu item is disabled |
+ | hovered | boolean | Indicates whether the menu item is currently being hovered over |
+ | variant | string | The variant of the color sample. It can either be `default` or `pipeline` |
+ | onClick | function | Callback function to be triggered when the menu item is clicked |
+ | className | string | Optional name for additional styling |
+
+
+
+### Toggle
+
+A menu item with an associated toggle switch to allow users to enable or disable a specific feature
+
+
+
+ ```jsx
+ import { IconBell } from '@tabler/icons-react';
+
+ import { MenuItemToggle } from 'twenty-ui/display';
+
+ export const MyComponent = () => {
+
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description |
+ | -------------- | ------------- | ----------------------------------------------------------------- |
+ | LeftIcon | IconComponent | An optional left icon displayed before the text in the menu item |
+ | text | string | The text content of the menu item |
+ | toggled | boolean | Indicates whether the toggle switch is in the "on" or "off" state |
+ | onToggleChange | function | Callback function triggered when the toggle switch state changes |
+ | toggleSize | string | The size of the toggle switch. It can be either \ |
+ | className | string | Optional name for additional styling |
+
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/zh/twenty-ui/navigation/navigation-bar.mdx
index 8b12452e55..a77e9f34e6 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/navigation/navigation-bar.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/navigation/navigation-bar.mdx
@@ -1,16 +1,16 @@
---
-title: 导航栏
+title: Navigation Bar
image: /images/user-guide/table-views/table.png
---
-
+
-渲染一个包含多个`NavigationBarItem`组件的导航栏。
+Renders a navigation bar that contains multiple `NavigationBarItem` components.
-
+
```jsx
import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
@@ -19,31 +19,31 @@ image: /images/user-guide/table-views/table.png
const navigationItems = [
{
- name: "主页",
+ name: "Home",
Icon: IconHome,
- onClick: () => console.log("主页被点击"),
+ onClick: () => console.log("Home clicked"),
},
{
- name: "个人资料",
+ name: "Profile",
Icon: IconUser,
- onClick: () => console.log("个人资料被点击"),
+ onClick: () => console.log("Profile clicked"),
},
{
- name: "设置",
+ name: "Settings",
Icon: IconSettings,
- onClick: () => console.log("设置被点击"),
+ onClick: () => console.log("Settings clicked"),
},
];
- return ;
+ return ;
};
```
-
- | 属性 | 类型 | 描述 |
- | -------------- | --- | ------------------------------------------------------------ |
- | activeItemName | 字符串 | 当前活跃导航项的名称 |
- | 项目 | 数组 | 表示每个导航项目的对象数组。 每个对象包含项目的`名称`、显示的`图标`组件以及项目被点击时调用的`onClick`函数 |
+
+ | Props | Type | Description |
+ | -------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | activeItemName | string | The name of the currently active navigation item |
+ | items | array | An array of objects representing each navigation item. Each object contains the `name` of the item, the `Icon` component to display, and an `onClick` function to be called when the item is clicked |
diff --git a/packages/twenty-docs/l/zh/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/zh/twenty-ui/navigation/step-bar.mdx
index 0027ff044f..66c420f561 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/navigation/step-bar.mdx
@@ -1,34 +1,34 @@
---
-title: 步骤条
+title: Step Bar
image: /images/user-guide/api/api.png
---
-
+
-通过突出显示活动步骤来显示一系列编号步骤的进度。 它呈现一个包含步骤的容器,每个步骤由 `Step` 组件表示。
+Displays progress through a sequence of numbered steps by highlighting the active step. It renders a container with steps, each represented by the `Step` component.
-
+
```jsx
import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
export const MyComponent = () => {
return (
- 步骤 1
- 步骤 2
- 步骤 3
+ Step 1
+ Step 2
+ Step 3
);
};
```
-
- | 属性 | 类型 | 描述 |
- | ---------- | -- | ------------------------- |
- | activeStep | 数字 | 当前活动步骤的索引。 这决定了应突出显示哪个步骤。 |
+
+ | Props | Type | Description |
+ | ---------- | ------ | ------------------------------------------------------------------------------------------------- |
+ | activeStep | number | The index of the currently active step. This determines which step should be visually highlighted |
diff --git a/packages/twenty-docs/l/zh/twenty-ui/progress-bar.mdx b/packages/twenty-docs/l/zh/twenty-ui/progress-bar.mdx
new file mode 100644
index 0000000000..2e4735ab30
--- /dev/null
+++ b/packages/twenty-docs/l/zh/twenty-ui/progress-bar.mdx
@@ -0,0 +1,66 @@
+---
+title: Feedback
+image: /images/user-guide/emails/emails_header.png
+---
+
+
+
+
+
+Indicates progress or countdown and moves from right to left.
+
+
+
+ ```jsx
+ import { ProgressBar } from "twenty-ui/feedback";
+
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | --------- | ------- | ------------------------------------------------------------------------------------ | --------- |
+ | duration | number | The total duration of the progress bar animation in milliseconds | 3 |
+ | delay | number | The delay in starting the progress bar animation in milliseconds | 0 |
+ | easing | string | Easing function for the progress bar animation | easeInOut |
+ | barHeight | number | The height of the bar in pixels | 24 |
+ | barColor | string | The color of the bar | gray80 |
+ | autoStart | boolean | If `true`, the progress bar animation starts automatically when the component mounts | `true` |
+
+
+
+## Circular Progress Bar
+
+Indicates the progress of a task, often used in loading screens or areas where you want to communicate ongoing processes to the user.
+
+
+
+ ```jsx
+ import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
+
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+
+ | Props | Type | Description | Default |
+ | -------- | ------ | ------------------------------------- | ------------ |
+ | size | number | The size of the circular progress bar | 50 |
+ | barWidth | number | The width of the progress bar line | 5 |
+ | barColor | string | The color of the progress bar | currentColor |
+
+
diff --git a/packages/twenty-docs/l/zh/user-guide/ai/capabilities/ai-agents.mdx b/packages/twenty-docs/l/zh/user-guide/ai/capabilities/ai-agents.mdx
new file mode 100644
index 0000000000..71282473ab
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/ai/capabilities/ai-agents.mdx
@@ -0,0 +1,34 @@
+---
+title: AI Agents
+description: Integrate AI capabilities directly into your automation workflows.
+---
+
+
+ This feature is in development and will be available in beta soon.
+
+
+## Overview
+
+Integrate AI capabilities directly into your automation workflows for intelligent data processing and decision-making.
+
+## Capabilities
+
+| Feature | Description |
+| ------------------- | ------------------------------------------------ |
+| **AI actions** | Add AI-powered steps to any workflow |
+| **Data enrichment** | Automatically enhance records with external data |
+| **Classification** | Categorize records based on content analysis |
+| **Summarization** | Generate summaries from text fields |
+| **Custom prompts** | Define exactly how AI processes your data |
+
+## Use Cases
+
+* **Lead scoring**: Automatically score and prioritize inbound leads
+* **Data cleanup**: Standardize company names and contact information
+* **Email drafts**: Generate follow-up emails based on meeting notes
+* **Record routing**: Assign records to the right team member based on content
+
+## Related
+
+* [Workflows Overview](/l/zh/user-guide/workflows/overview) — automation basics
+* [AI Permissions](/l/zh/user-guide/ai/capabilities/permissions-access-control) — access control for AI agents
diff --git a/packages/twenty-docs/l/zh/user-guide/ai/capabilities/ai-chatbot.mdx b/packages/twenty-docs/l/zh/user-guide/ai/capabilities/ai-chatbot.mdx
new file mode 100644
index 0000000000..d7cbbc04fc
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/ai/capabilities/ai-chatbot.mdx
@@ -0,0 +1,41 @@
+---
+title: AI Chatbot
+description: An intelligent assistant that helps you interact with your CRM data using natural language.
+---
+
+
+ This feature is in development and will be available in beta soon.
+
+
+## Overview
+
+An intelligent assistant that helps you interact with your CRM data using natural language.
+
+## Capabilities
+
+| Feature | Description |
+| ---------------------------- | ------------------------------------------------------------------------- |
+| **Natural language queries** | Ask questions in plain English instead of building filters |
+| **Full data access** | Query records, relationships, and metrics across your workspace |
+| **Page context** | Reference "this company" or "this opportunity" based on your current view |
+| **Conversational** | Follow-up questions maintain context from previous queries |
+
+## Example Interactions
+
+### Finding Records
+
+* "Show me all opportunities over $50,000"
+* "Find contacts I haven't emailed in 2 weeks"
+* "List companies in the healthcare industry"
+
+### Getting Insights
+
+* "What's my total pipeline value?"
+* "How many deals closed last month?"
+* "Which stage has the most stuck opportunities?"
+
+### Using Page Context
+
+* "Summarize my interactions with this person" (on a contact page)
+* "What opportunities are linked to this company?" (on a company page)
+* "When was this deal last updated?" (on an opportunity page)
diff --git a/packages/twenty-docs/l/zh/user-guide/ai/capabilities/permissions-access-control.mdx b/packages/twenty-docs/l/zh/user-guide/ai/capabilities/permissions-access-control.mdx
new file mode 100644
index 0000000000..6766a8557e
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/ai/capabilities/permissions-access-control.mdx
@@ -0,0 +1,35 @@
+---
+title: Permissions & Access Control
+description: Control what AI agents can access and modify in your workspace.
+---
+
+## Overview
+
+AI agents respect your existing permission structure. This is particularly important for teams who want to control exactly what automated AI processes can access or modify in their workspace.
+
+## Assign a Role to an AI Agent
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **AI Agents**, click **+ Assign to AI agent**
+5. Select the AI agent from the list
+6. Confirm the assignment
+
+## Why Assign Roles to AI Agents?
+
+| Benefit | Description |
+| ---------------- | ------------------------------------------------- |
+| **Security** | Limit what data AI agents can access or modify |
+| **Compliance** | Ensure AI only processes the data it needs |
+| **Control** | Prevent unintended actions from AI automations |
+| **Auditability** | Track which actions were performed by which agent |
+
+
+ For AI agents running within workflows, role assignment ensures the agent cannot access or modify data outside its intended scope—even if the workflow has broader permissions.
+
+
+## Related
+
+* [Permissions](/l/zh/user-guide/permissions-access/capabilities/permissions) — detailed information on creating and managing roles
+* [AI Agents](/l/zh/user-guide/ai/capabilities/ai-agents) — AI capabilities in workflows
diff --git a/packages/twenty-docs/l/zh/user-guide/ai/how-tos/ai-faq.mdx b/packages/twenty-docs/l/zh/user-guide/ai/how-tos/ai-faq.mdx
new file mode 100644
index 0000000000..774eae15c4
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/ai/how-tos/ai-faq.mdx
@@ -0,0 +1,29 @@
+---
+title: AI FAQ
+description: Frequently asked questions about AI features in Twenty.
+---
+
+
+
+ AI features are currently in development and will be released in beta soon. Stay tuned for updates!
+
+
+
+ We're building two main AI capabilities:
+
+ 1. **AI Chatbot**: A context-aware assistant that can access your Twenty data and help you with queries
+ 2. **AI Agents in Workflows**: Intelligent automation that can process data, make decisions, and execute tasks within your workflows
+
+
+
+ AI agents will operate under the permission system. You can assign specific roles to AI agents under **Settings → Roles**, giving you full control over what data they can access and what actions they can perform.
+
+
+
+ AI actions will consume workflow credits based on the complexity of the task and the AI model used. More details will be available when the features launch.
+
+
+
+ Initially, Twenty will use built-in AI models. Support for custom or external AI models may be added in future releases based on user feedback.
+
+
diff --git a/packages/twenty-docs/l/zh/user-guide/ai/overview.mdx b/packages/twenty-docs/l/zh/user-guide/ai/overview.mdx
new file mode 100644
index 0000000000..bd4ee68a79
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/ai/overview.mdx
@@ -0,0 +1,62 @@
+---
+title: AI
+description: AI-powered features coming soon to Twenty.
+---
+
+
+
+
+
+## What's Coming
+
+Twenty is building AI capabilities to help your team work smarter. We're focusing on two major areas:
+
+### 1. AI Chatbot
+
+A conversational assistant that understands your context and has access to all your Twenty data.
+
+**Key capabilities:**
+
+* **Full data access**: Query any record, relationship, or metric in your workspace
+* **Page context awareness**: Reference "this company" or "this opportunity" based on where you are in Twenty
+* **Natural language**: Ask questions and get answers without navigating menus
+
+**Example prompts:**
+
+* "What opportunities are closing this month?"
+* "Which deals have been in Negotiation for more than 30 days?"
+* "Summarize my interactions with this person"
+
+### 2. AI Agents in Workflows
+
+Extend your workflows with AI-powered actions and autonomous agents.
+
+**Key capabilities:**
+
+* **AI actions**: Use AI to enrich data, classify records, generate summaries, and more
+* **Autonomous agents**: Let agents execute multi-step tasks within a workflow
+* **Custom prompts**: Define exactly how AI should process your data
+
+**Use cases:**
+
+* Automatically categorize inbound leads
+* Enrich company data from public sources
+* Generate follow-up email drafts based on meeting notes
+* Score opportunities based on engagement patterns
+
+## Permissions and Access Control
+
+AI agents will be managed through the existing permissions system:
+
+1. Go to **Settings → Roles**
+2. Configure which data each AI agent can access
+3. Set read/write permissions per object
+
+This ensures AI agents respect your data governance policies and only access what they need.
+
+## Stay Updated
+
+We'll update this section as AI features become available. In the meantime:
+
+* Follow our [GitHub](https://github.com/twentyhq/twenty) for development updates
+* Join our [Discord](https://discord.gg/twenty) to share feedback and feature requests
diff --git a/packages/twenty-docs/l/zh/user-guide/billing/capabilities/pricing-plans.mdx b/packages/twenty-docs/l/zh/user-guide/billing/capabilities/pricing-plans.mdx
new file mode 100644
index 0000000000..90bf7e7cbb
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/billing/capabilities/pricing-plans.mdx
@@ -0,0 +1,79 @@
+---
+title: Pricing Plans
+description: Learn about Twenty's pricing plans and how to switch between them.
+---
+
+## Overview
+
+Twenty offers flexible pricing to fit teams of all sizes, whether you prefer cloud hosting or self-hosting.
+
+## Cloud Plans
+
+### Pro (Cloud)
+
+For teams ready to scale:
+
+* All core CRM features
+* Email and calendar sync
+* Workflows and automations
+* Standard support
+
+
+ Premium features (SSO and row-level permissions) are not included in the Pro plan.
+
+
+### Organization (Cloud)
+
+For larger teams with advanced needs:
+
+* Everything in Pro
+* **Premium features**: SSO integration and row-level permissions
+* Priority support
+
+## Self-Hosted Plans
+
+### Free (Self-Hosted)
+
+Host Twenty on your own infrastructure at no cost:
+
+* All Pro features included
+* Community support via Discord
+* Full control over your data
+
+### Organization (Self-Hosted)
+
+For teams who need premium features while self-hosting:
+
+* All Pro features
+* **Premium features**: SSO integration and row-level permissions
+* Twenty team support
+* No requirement to publish custom code as open-source before distributing
+
+## Premium Features
+
+Premium features are only available on the Organization plans (Cloud or Self-Hosted):
+
+* **SSO integration**: Single Sign-On with your identity provider
+* **Row-level permissions**: Fine-grained access control at the record level
+
+## Switching Plans
+
+### Upgrade to Organization
+
+1. Go to **Settings → Billing**
+2. Click **Switch to Organization**
+3. Confirm your upgrade
+
+### Downgrade to Pro
+
+Contact support to downgrade your plan.
+
+### Switch to Yearly Billing
+
+1. Go to **Settings → Billing**
+2. Click **Switch to Yearly**
+3. Save with annual billing
+
+### Switch to Monthly Billing
+
+Contact support to switch back to monthly billing.
diff --git a/packages/twenty-docs/l/zh/user-guide/billing/capabilities/workflow-credits.mdx b/packages/twenty-docs/l/zh/user-guide/billing/capabilities/workflow-credits.mdx
new file mode 100644
index 0000000000..0ce8e3be72
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/billing/capabilities/workflow-credits.mdx
@@ -0,0 +1,49 @@
+---
+title: Workflow Credits
+description: Understanding workflow credits, consumption, and how to purchase more.
+---
+
+## Overview
+
+Credits power your workflow automations in Twenty. Every workflow action consumes credits based on its complexity.
+
+## Credit Allocation
+
+Credits are based on your billing cycle, not your plan:
+
+| Billing Cycle | Credits |
+| ------------- | --------------- |
+| Monthly | 5 million/month |
+| Yearly | 50 million/year |
+
+
+ The 5 million monthly credits are designed to empower you to run automations without worrying about costs. For most workflows using standard actions, this is more than enough. You'll only need additional credits when running advanced code nodes or AI-powered features.
+
+
+## Credit Consumption
+
+Different actions consume different amounts of credits:
+
+| Action Type | Credit Usage |
+| ------------------------------------------------------- | ----------------------- |
+| **Basic operations** (search, update, create records) | Minimal |
+| **Complex operations** (code nodes, external API calls) | More credits |
+| **AI prompts** (coming soon) | Variable based on usage |
+
+Credits are deducted in real-time when workflows execute.
+
+## Monitoring Usage
+
+Track your credit consumption:
+
+1. Go to **Settings → Billing**
+2. View your current usage and remaining credits
+3. Monitor trends to plan for additional credits if needed
+
+## Purchasing Additional Credits
+
+Need more credits?
+
+1. Go to **Settings → Billing**
+2. Click on the option to purchase additional credit packs
+3. Select the amount you need
diff --git a/packages/twenty-docs/l/zh/user-guide/billing/how-tos/billing-faq.mdx b/packages/twenty-docs/l/zh/user-guide/billing/how-tos/billing-faq.mdx
new file mode 100644
index 0000000000..ee1d560cb1
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/billing/how-tos/billing-faq.mdx
@@ -0,0 +1,86 @@
+---
+title: Billing FAQ
+description: Frequently asked questions about Twenty pricing and billing.
+---
+
+## Pricing
+
+
+
+ Yes, you can use Twenty for free while self-hosting. You will get access to everything included in the Pro (Cloud) plan, except the support from our core-team. Support is accessible via our Discord community.
+
+ If you want to self-host and need the Premium features (SSO and row-level permissions), you can choose the paid Organization (Self-Hosted) license. This also includes support from the Twenty team and removes the requirement to publish custom code as open-source before distributing.
+
+
+
+ Premium features are only available on the Organization plans (Cloud or Self-Hosted):
+
+ * **SSO integration**: Single Sign-On with your identity provider
+ * **Row-level permissions**: Fine-grained access control at the record level
+
+
+
+ We do not offer free seats. Pricing is per user and each user needs a licence to access Twenty.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `Switch to Organization`.
+
+
+
+ Please reach out to our team directly via the Support, there is no easy way to do this using the UI at the moment.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `Switch to Yearly`.
+
+
+
+ Please reach out to our team directly via the Support, there is no easy way to do this using the UI at the moment.
+
+
+
+ You will find this under `Settings → Billing`.
+
+
+
+ The number of credits depends on your billing cycle, not your plan:
+
+ * **Monthly subscriptions**: 5 million credits per month
+ * **Yearly subscriptions**: 50 million credits per year
+
+
+
+ Each workflow action consumes credits based on its complexity:
+
+ * **Basic internal operations** (such as search, update, create records) consume very few credits
+ * **More complex operations** like code nodes and requests to external services consume more credits
+ * **AI prompts** (coming soon!) will also consume more credits based on usage
+
+ Credits are deducted in real-time when workflows execute. You can monitor your usage in **Settings → Billing** to track consumption and remaining credits.
+
+
+
+ You can buy additional credits under `Settings → Billing`.
+
+
+
+## Billing
+
+
+
+ You can do so under `Settings → Billing`.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll be able to add a new payment method there.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll be able to edit the billing information there.
+
+
+
+ You can do so under `Settings → Billing`. Then click on `View billing details`. You'll see all your invoices at the bottom of the screen.
+
+
diff --git a/packages/twenty-docs/l/zh/user-guide/billing/overview.mdx b/packages/twenty-docs/l/zh/user-guide/billing/overview.mdx
new file mode 100644
index 0000000000..a8d0209165
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/billing/overview.mdx
@@ -0,0 +1,45 @@
+---
+title: Billing
+description: Understand Twenty pricing and manage your subscription.
+image: /images/user-guide/setup/pricing.png
+---
+
+
+
+
+
+Twenty offers flexible pricing plans to fit your team's needs. Manage your subscription, track workflow credits, and access invoices all from **Settings → Billing**.
+
+## What's in this section
+
+
+
+ Learn about Twenty's pricing plans and what's included.
+
+
+
+ Frequently asked questions about pricing and billing.
+
+
+
+## At a glance
+
+| Plan | Key Features |
+| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| **Free (Self-Hosted)** | All Pro features, community support |
+| **Pro (Cloud)** | Everything apart from the Premium features (SSO and row-level permissions), standard support |
+| **Organization (Cloud)** | All from Pro + the Premium features (SSO and row-level permissions), priority support |
+| **Organization (Self-Hosted)** | All from Pro + the Premium features (SSO, row-level permissions), Twenty team support, not required to publish your custom code as open-source before distributing |
+
+## Quick answers
+
+**Where do I manage billing?**
+Go to **Settings → Billing** to view your plan, update payment methods, and access invoices.
+
+**Can I use Twenty for free?**
+Yes! Self-host Twenty and get all Pro features at no cost.
+
+**How do I upgrade?**
+Go to **Settings → Billing** and click **Switch to Organization** or **Switch to Yearly**.
+
+For more questions, see the [Billing FAQ](/l/zh/user-guide/billing/how-tos/billing-faq).
diff --git a/packages/twenty-docs/l/zh/user-guide/calendar-emails/capabilities/calendar.mdx b/packages/twenty-docs/l/zh/user-guide/calendar-emails/capabilities/calendar.mdx
new file mode 100644
index 0000000000..00485bf885
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/calendar-emails/capabilities/calendar.mdx
@@ -0,0 +1,43 @@
+---
+title: Calendar
+description: Understanding calendar integration features in Twenty.
+---
+
+**Note**: To connect your calendar and configure sync settings, visit [Email & Calendar Setup](/l/zh/user-guide/calendar-emails/overview).
+
+## How Calendar Integration Works
+
+Twenty automatically syncs your calendar events and links them to the relevant CRM records, giving you a complete view of your meeting history with contacts and companies.
+
+## Calendar Tab
+
+Next to the Emails tab on records, you'll find a `Calendar` tab that contains the history of meetings scheduled with the record.
+
+### Available For
+
+* **People**: View all meetings scheduled with a specific contact
+* **Companies**: See all meetings related to a company and its employees
+* **Opportunities**: Access meeting history related to the company linked to this opportunity
+
+### Viewing Meeting History
+
+1. **Navigate to a Record**: Go to any Person, Company, or Opportunity record
+2. **Select the Calendar Tab**: Click on the `Calendar` tab next to the Emails tab
+3. **Browse Meeting History**: View all scheduled meetings and their details
+4. **Access Meeting Context**: See meeting participants, times, and related information
+
+## Visibility Settings
+
+Calendar data follows the same visibility settings as emails, ensuring consistent privacy controls across both communication channels.
+
+## What Gets Synced
+
+* **External Meetings**: All meetings with contacts outside your organization
+* **Automatic Linking**: Meetings connect to existing People and Company records based on attendee email addresses
+* **Meeting Details**: Subject, time, duration, and participants
+* **Updates**: New calendar events sync automatically
+
+## What Doesn't Get Synced
+
+* **Internal Meetings**: Meetings with only colleagues (same domain) remain private
+* **Private Events**: Events marked as private in your calendar
diff --git a/packages/twenty-docs/l/zh/user-guide/calendar-emails/capabilities/mailbox.mdx b/packages/twenty-docs/l/zh/user-guide/calendar-emails/capabilities/mailbox.mdx
new file mode 100644
index 0000000000..336d9ee03e
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/calendar-emails/capabilities/mailbox.mdx
@@ -0,0 +1,85 @@
+---
+title: Mailbox
+description: Understanding email integration features in Twenty.
+---
+
+**Note**: To connect your email accounts and configure sync settings, visit [Email & Calendar Setup](/l/zh/user-guide/calendar-emails/overview).
+
+## How Email Integration Works
+
+Twenty automatically links emails from your connected mailboxes to the relevant CRM records, keeping all communication history in one place.
+
+### Objects Where Emails Can Be Found
+
+Email conversations appear in three main objects:
+
+* **People**: View all emails exchanged with a specific contact
+* **Companies**: See all emails related to a company and its employees
+* **Opportunities**: Access email threads related to the company linked to this opportunity. Email threads from individual people on the opportunity are not shown yet.
+
+### Viewing Email Threads
+
+1. **Navigate to a Record**: Go to any Person, Company, or Opportunity record
+2. **Select the Emails Tab**: Click on the `Emails` tab to view synced emails
+3. **Open an Email Thread**: Click on any email to open and read the full conversation
+4. **Browse History**: Scroll through the complete email history with that contact
+
+
+
+## What You'll See
+
+### Email Thread View
+
+When you open an email thread, you can:
+
+* **Read Full Conversations**: See the complete email exchange
+* **View Participants**: See all people involved in the email thread
+* **Check Timestamps**: Know exactly when each email was sent
+* **Access Context**: Understand the full communication history
+
+### Email Visibility
+
+Depending on your mailbox settings, you might see:
+
+* **Full Content**: Complete email text and details
+* **Subject + Metadata**: Subject line, sender, recipient, and timestamp
+* **Metadata Only**: Basic information without email content
+
+## Email Sync Behavior
+
+### What Gets Synced
+
+* **External Emails**: All emails with contacts outside your organization
+* **Automatic Linking**: Emails connect to existing People and Company records
+* **Multiple Addresses**: Emails from any address link to the same contact record
+* **Updates**: New emails appear within 5 minutes
+
+### What Doesn't Get Synced
+
+* **Internal Emails**: Emails between colleagues (same domain) remain private
+* **Group Emails**: Distribution lists and group emails are excluded
+* **Excluded Folders**: Folders you've chosen not to sync (configured under Settings → Accounts → Email)
+
+### Selective Folder Sync (Lab Feature)
+
+Control which email folders sync with Twenty:
+
+1. Enable `Message Folder` in Settings → Releases → Lab
+2. Configure folders under Settings → Accounts → Email
+3. Choose specific folders to include or exclude (Inbox, Sent, Archive, custom folders)
+
+## Troubleshooting Email Sync
+
+### Common Sync Issues
+
+* **Sync Delays**: Emails appear within 5 minutes, but initial imports take longer
+* **Missing Emails**: Check if:
+ * Folders are excluded in Message Folder settings
+ * Contact auto-creation is disabled (emails need existing Twenty records)
+ * Email is from colleagues (same domain) or group lists
+ * Mailbox is still completing initial sync
+
+### Email Limitations
+
+* **System Folders**: Some email folders may not be available for sync
+* **Aliases**: Only true mailboxes can be connected (not email aliases)
diff --git a/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx b/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx
new file mode 100644
index 0000000000..edee83875d
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty.mdx
@@ -0,0 +1,28 @@
+---
+title: Can I Book Meetings from Twenty?
+description: Information about booking meetings directly from Twenty.
+---
+
+## Current Status
+
+**No, Twenty does not currently support booking meetings directly from the platform.**
+
+Twenty's calendar integration is designed to **sync and display** your existing calendar events, not to create new ones. All meeting scheduling should be done through your native calendar application (Google Calendar, Microsoft Outlook, etc.).
+
+## What You Can Do
+
+* **View meeting history** on People, Companies, and Opportunities records
+* **See upcoming meetings** with contacts in your CRM
+* **Track meeting context** alongside email communications
+* **Auto-create contacts** from meeting participants
+
+## How to Schedule Meetings
+
+1. Use your native calendar app (Google Calendar, Outlook, etc.)
+2. Create the meeting as you normally would
+3. The meeting will automatically sync to Twenty within 5 minutes
+4. View the meeting on the relevant CRM records
+
+## Future Plans
+
+Meeting creation from within Twenty is on our roadmap. Join our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to share your use case and help prioritize this feature.
diff --git a/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx b/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx
new file mode 100644
index 0000000000..2d68bf8721
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty.mdx
@@ -0,0 +1,44 @@
+---
+title: Can I Send Emails from Twenty?
+description: Information about sending emails directly from Twenty.
+---
+
+## Current Status
+
+Twenty's email integration is designed to **sync and display** your email history. Emails cannot be composed or sent directly from Twenty's interface.
+
+When you view an email thread on a record page and click **Reply**, you'll be redirected to the original thread in your mailbox (Gmail, Outlook, etc.). This is where you compose and send your reply.
+
+## What You Can Do Today
+
+* **View email history** on People, Companies, and Opportunities records
+* **Read full email threads** with contacts in your CRM
+* **Track communication context** alongside calendar events
+* **Auto-create contacts** from email interactions
+* **Reply via redirect** — click Reply to jump to your mailbox
+
+## Sending Emails via Workflows
+
+While you can't send emails manually from Twenty, you **can send emails automatically using Workflows**. This is useful for:
+
+* Automated follow-ups
+* Notifications to contacts
+* Triggered communications based on record changes
+
+Emails sent via workflows go through your connected mailbox account.
+
+→ Learn about the [Send Email action](/l/zh/user-guide/workflows/capabilities/workflow-actions#send-email)
+
+## Email Sequences and Newsletters
+
+For email sequences and newsletters, we recommend using workflows to connect Twenty to a dedicated email marketing tool.
+
+
+ Mass emails should not be sent directly from your mailbox to protect your domain reputation. Use a dedicated tool for bulk communications.
+
+
+→ See [How to send emails from workflows](/l/zh/user-guide/workflows/capabilities/send-emails-from-workflows) for setup instructions
+
+## Future Plans
+
+Native email composition from within Twenty is on our roadmap. Join our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to share your use case and help prioritize this feature.
diff --git a/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx b/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx
new file mode 100644
index 0000000000..de258baef3
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects.mdx
@@ -0,0 +1,35 @@
+---
+title: Can I Track Email Activity on All Objects?
+description: Understanding email activity tracking across different objects.
+---
+
+## Supported Objects
+
+Email activity is currently available on **three standard objects**:
+
+| Object | What You See |
+| ----------------- | ---------------------------------------------------------------- |
+| **People** | All emails exchanged with that specific contact |
+| **Companies** | All emails with anyone from that company (based on email domain) |
+| **Opportunities** | Emails related to the company linked to the opportunity |
+
+## Why Only These Objects?
+
+People, Companies, and Opportunities are the core relationship objects where email context adds the most value. Email threads are automatically linked based on:
+
+* **Email address** → matched to People records
+* **Email domain** → matched to Company records
+* **Company relation** → linked to Opportunities
+
+## Custom Objects
+
+**Email tracking is not available on custom objects** at this time.
+
+If you need email context on a custom object, consider:
+
+* Using a relation field to link your custom object to People or Companies
+* Viewing email history on the linked People/Company record
+
+## Future Plans
+
+Extending email visibility to custom objects is being considered. Share your use case on our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to help prioritize this feature.
diff --git a/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx b/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx
new file mode 100644
index 0000000000..83da30bd83
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user.mdx
@@ -0,0 +1,42 @@
+---
+title: Connect Several Mailboxes per User
+description: Connect multiple email accounts for a single user.
+---
+
+## Overview
+
+Twenty supports **unlimited email accounts per user**. This is useful if you manage multiple inboxes, such as:
+
+* Personal work email + shared team inbox
+* Multiple client-facing email addresses
+* Different email accounts for different roles
+
+## How to Add Multiple Mailboxes
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Connect your additional Google or Microsoft account
+4. Configure sync settings for this mailbox
+5. Repeat for each mailbox you want to connect
+
+## Managing Multiple Accounts
+
+Each connected mailbox has its own settings:
+
+* **Email visibility**: Choose what teammates can see
+* **Contact auto-creation**: Enable/disable per mailbox
+* **Folder selection**: Choose which folders to sync (Lab feature)
+
+## How Emails Appear
+
+Emails from all your connected mailboxes are synced to Twenty and appear on:
+
+* **People records**: Based on the contact's email address
+* **Company records**: Based on the email domain
+* **Opportunities**: Based on the linked company
+
+Each email shows which mailbox it was sent from/received to, so you can track which account was used for each communication.
+
+## Important Notes
+
+Only true mailboxes can be connected. Email aliases that forward to another mailbox cannot be connected separately—they'll sync through the main mailbox.
diff --git a/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx b/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx
new file mode 100644
index 0000000000..c5db7745a0
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records.mdx
@@ -0,0 +1,53 @@
+---
+title: I Don't See Emails on Records
+description: Troubleshooting missing emails on records.
+---
+
+## Common Reasons
+
+### 1. Initial Sync Still in Progress
+
+Email sync takes time, especially for large mailboxes.
+
+* **Calendar sync**: Completes in minutes
+* **Email sync**: Can take several hours for large mailboxes
+
+**Solution**: Wait up to a few hours for the initial import to complete.
+
+### 2. Contact Doesn't Exist in Twenty
+
+Emails only appear on existing People records. If the contact wasn't created yet:
+
+* Enable **Contact Auto-Creation** in your mailbox settings
+* Or manually create the Person record first
+
+**Solution**: Go to **Settings → Accounts**, select your mailbox, and enable contact auto-creation.
+
+### 3. Internal Emails Are Excluded
+
+Emails between colleagues (same email domain) are never synced to maintain privacy.
+
+**Solution**: This is expected behavior. Only external emails are synced.
+
+### 4. Email Is from a Group or Distribution List
+
+Group emails and distribution lists are excluded from sync.
+
+**Solution**: This is expected behavior.
+
+### 5. Folder Not Selected for Sync
+
+If you're using the Message Folder feature, some folders might be excluded.
+
+**Solution**: Go to **Settings → Accounts**, select your mailbox, and check folder sync settings.
+
+### 6. Wrong Email Address on Record
+
+The Person record might have a different email address than the one used in the email.
+
+**Solution**: Add the correct email address to the Person record.
+
+## Still Not Working?
+
+1. Try disconnecting and reconnecting your mailbox
+2. Contact support if issues persist
diff --git a/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx b/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
new file mode 100644
index 0000000000..9569d2651a
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
@@ -0,0 +1,52 @@
+---
+title: Limit Emails Imported
+description: Control which emails are imported into Twenty.
+---
+
+## Overview
+
+By default, Twenty syncs all external emails from your connected mailbox. You can limit what gets imported using **folder selection** and **visibility settings**.
+
+## Method 1: Folder Selection (Recommended)
+
+Control which email folders sync with Twenty:
+
+1. Go to **Settings → Releases → Lab**
+2. Enable **Message Folder**
+3. Return to **Settings → Accounts**
+4. Select your connected email account
+5. Choose which folders to sync:
+
+| Folder | Description |
+| ------------------ | ----------------------------- |
+| **Inbox** | Primary incoming emails |
+| **Sent** | Outgoing emails you've sent |
+| **Archive** | Archived messages |
+| **Custom Folders** | Any specific folders you want |
+
+6. Exclude folders you don't want synced (Spam, Trash, personal folders)
+
+This gives you precise control over which emails appear in your CRM without syncing everything.
+
+## Method 2: Contact Auto-Creation Settings
+
+Control when contacts are created from emails:
+
+1. Go to **Settings → Accounts**
+2. Select your connected mailbox
+3. Choose an option:
+ * **Deactivated**: No contacts created, but emails still sync to existing contacts
+ * **Sent & Received**: Create contacts from all external emails
+ * **Sent Only**: Only create contacts from emails you send
+
+## What's Always Excluded
+
+These emails are never synced, regardless of settings:
+
+* **Internal emails**: Messages between colleagues (same domain)
+* **Group emails**: Distribution lists and group messages
+* **Spam/Trash**: System folders are typically excluded
+
+## Important Note
+
+We don't provide a CC email address for selective syncing. Use the folder selection feature above to achieve the same level of control.
diff --git a/packages/twenty-docs/l/zh/user-guide/calendar-emails/overview.mdx b/packages/twenty-docs/l/zh/user-guide/calendar-emails/overview.mdx
new file mode 100644
index 0000000000..eececa1906
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/calendar-emails/overview.mdx
@@ -0,0 +1,132 @@
+---
+title: Calendar & Emails
+description: Connect your email and calendar accounts to Twenty.
+image: /images/user-guide/emails/emails_header.png
+---
+
+
+
+
+
+## Connection Options
+
+### Google Account (Gmail & Google Calendar)
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Select **Continue with Google**
+4. Authorize Twenty to access your Gmail and Google Calendar
+5. Configure email sync settings (visibility, auto-creation) → click **Next**
+6. Configure calendar sync settings (visibility, auto-creation) → click **Add Account**
+7. Your emails and calendar events will start syncing automatically
+
+### Microsoft Account (Outlook & Microsoft Calendar)
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Select **Continue with Microsoft**
+4. Authorize Twenty to access your Outlook and Microsoft Calendar
+5. Configure email sync settings (visibility, auto-creation) → click **Next**
+6. Configure calendar sync settings (visibility, auto-creation) → click **Add Account**
+7. Your emails and calendar events will start syncing automatically
+
+### SMTP/CalDAV Setup (Other Providers)
+
+For other email and calendar providers:
+
+1. Go to **Settings → Releases → Lab** to enable the feature
+2. Return to **Settings → Accounts**
+3. Configure SMTP settings for email
+4. Configure CalDAV settings for calendar
+5. Test the connection
+
+### Multiple Mailboxes
+
+* **Unlimited Accounts**: Connect multiple email accounts per user
+* **Account Management**: Switch between different mailboxes
+* **Sync Settings**: Configure different settings per mailbox
+
+
+ Only true mailboxes can be connected (e.g., support@domain.com with its own inbox). Email aliases that forward to another mailbox cannot be connected to Twenty.
+
+
+## Email Configuration
+
+### Message Visibility
+
+Choose different levels of visibility for your emails:
+
+* **Metadata Only**: Share only basic information (sender, recipient, date, time)
+* **Subject and Metadata**: Share subject line along with metadata
+* **All Email Content**: Share entire email content including attachments
+
+### Contact Auto-Creation
+
+* **Deactivated**: No automatic contact creation
+* **For messages sent & received**: Create contacts for all external email interactions
+* **For messages sent only**: Create contacts only for emails you send
+* **Note**: Internal emails (same domain) are never synced to maintain privacy
+
+When enabled, contacts are automatically linked to their Company records based on their email domain. If the company doesn't exist yet, Twenty creates it for you.
+
+### Control which emails get sync with Message Folder Selection (Lab Feature)
+
+Control which email folders sync with Twenty:
+
+1. Go to **Settings → Releases → Lab** and enable **Message Folder**
+2. Return to **Settings → Accounts** and select your connected email account
+3. Choose which folders to sync:
+ * **Inbox**: Primary incoming emails
+ * **Sent**: Outgoing emails you've sent
+ * **Custom Folders**: Any specific folders you want to include
+ * **Exclude Folders**: Skip folders like Spam, Trash, or personal folders
+
+This gives you precise control over which emails appear in your CRM without syncing everything.
+
+**What Gets Synced:**
+
+* **External Emails**: All emails with external contacts from selected folders
+* **Internal Emails**: Not synced (same domain emails remain private)
+* **Attachments**: Coming in H1 2026
+
+**Note**: We don't provide a CC email address for selective syncing. Instead, use the Message Folder feature above to achieve the same level of control over which emails sync with Twenty.
+
+## Calendar Configuration
+
+### Event Visibility
+
+Choose what will be visible to other users in your workspace:
+
+* **Everything**: The whole event details will be shared with your team
+* **Metadata**: Only date & participants will be shared with your team
+
+### Contact Auto-Creation for Meetings
+
+* **Yes**: Automatically create contacts for meeting participants not in your CRM
+* **No**: Only link meetings to existing contacts
+
+When enabled, contacts are automatically linked to their Company records based on their email domain. If the company doesn't exist yet, Twenty creates it for you.
+
+### Control which events get sync
+
+* **Meeting Import**: Automatically import calendar events
+* **Contact Linking**: Link meetings to People and Company records
+
+**What Gets Synced:**
+
+* **Meetings**: Calendar events with external participants
+* **Contact Linking**: Events automatically linked to CRM records
+* **Team Events**: Shared calendar visibility
+
+## Sync Frequency
+
+**Updates every 5 minutes**: Both email and calendar data sync automatically every 5 minutes after the initial import.
+
+
+ **Initial sync timing**: Calendar sync completes quickly (usually within minutes), while email sync takes longer for large mailboxes—up to a few hours depending on volume. Don't worry if you see contacts from calendar events appearing before your email contacts; this is normal behavior.
+
+
+## Next Steps
+
+* [Mailbox capabilities](/l/zh/user-guide/calendar-emails/capabilities/mailbox)
+* [Troubleshoot missing emails](/l/zh/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records)
diff --git a/packages/twenty-docs/l/zh/user-guide/dashboards/capabilities/dashboards.mdx b/packages/twenty-docs/l/zh/user-guide/dashboards/capabilities/dashboards.mdx
new file mode 100644
index 0000000000..b3d731e668
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/dashboards/capabilities/dashboards.mdx
@@ -0,0 +1,74 @@
+---
+title: Dashboards
+description: Create and organize dashboards with tabs to visualize your CRM data.
+---
+
+## Overview
+
+Dashboards in Twenty are organized in a hierarchy: **Dashboards → Tabs → Widgets**. Each dashboard can contain multiple tabs, and each tab contains widgets (charts, numbers, iFrames).
+
+## Creating a Dashboard
+
+1. Go to **Dashboards** in the navigation
+2. Click **+ New Dashboard**
+3. Give your dashboard a name
+4. Start adding tabs and widgets
+
+## Working with Tabs
+
+Tabs help you organize your dashboard into logical sections.
+
+### Creating Tabs
+
+1. In edit mode, click **+ Add Tab**
+2. Name your tab (e.g., "Pipeline Overview", "Team Performance")
+3. Add widgets to the tab
+
+### Duplicating Tabs
+
+1. Click on the tab you want to duplicate
+2. Click the **Duplicate** button in the side panel
+
+## Dashboard Layout
+
+### Arranging Widgets
+
+* Drag and drop to position
+* Resize for emphasis
+* Group related charts together
+
+### Duplicating a Dashboard
+
+1. Exit edit mode (view mode only)
+2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
+3. Select **Duplicate dashboard**
+
+### Best Practices
+
+* **Logical flow**: Arrange from overview to detail
+* **Visual hierarchy**: Larger charts for key metrics
+* **Consistent styling**: Use matching colors and fonts
+
+## Visibility & Access
+
+### Dashboard Visibility
+
+Dashboards are visible to everyone who has access to your Twenty workspace. There is no private dashboard option at the moment.
+
+### Favorites
+
+You can add dashboards to your favorites for quick access. This is a personal setting—your favorites are not visible to other users.
+
+To add a dashboard to favorites, open the dashboard and click the star icon.
+
+### Timezone Behavior
+
+Dashboards currently display data based on the timezone of the user viewing them. This means the same dashboard may show different metrics for team members in different regions (e.g., APAC vs. US).
+
+
+ **Coming soon**: We will add the ability to set a specific timezone for a dashboard, so all users see consistent data regardless of their location.
+
+
+
+ **Coming soon**: Dashboard-level filters will allow you to apply filters across all widgets at once, making it faster to explore your data.
+
diff --git a/packages/twenty-docs/l/zh/user-guide/dashboards/capabilities/widgets.mdx b/packages/twenty-docs/l/zh/user-guide/dashboards/capabilities/widgets.mdx
new file mode 100644
index 0000000000..fc12e61339
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/dashboards/capabilities/widgets.mdx
@@ -0,0 +1,131 @@
+---
+title: Widgets
+description: Explore the widget types and visualization options in Twenty.
+---
+
+## Available Widgets
+
+Twenty provides various widget types to visualize your CRM data.
+
+### Bar Charts
+
+Display data as horizontal or vertical bars.
+
+**Best for:**
+
+* Comparing values across categories
+* Showing rankings
+* Tracking metrics by time period
+
+**Example uses:**
+
+* Deals by stage
+* Revenue by sales rep
+* Contacts added per month
+
+
+ **Display limits**: Bar charts can show a maximum of 100 bars (horizontal) or 50 bars (vertical). If you see the warning "Undisplayed data: max X bars per chart", add filters to narrow down your data or change the grouping (e.g., group by week instead of days).
+
+
+### Pie Charts
+
+Show proportions of a whole.
+
+**Best for:**
+
+* Showing composition or distribution
+* Comparing parts to whole
+* Highlighting major segments
+
+**Example uses:**
+
+* Deal distribution by source
+* Contact breakdown by industry
+* Pipeline composition by owner
+
+### Line Charts
+
+Display trends over time.
+
+**Best for:**
+
+* Tracking changes over time
+* Identifying trends
+* Comparing multiple metrics
+
+**Example uses:**
+
+* Monthly deal count trend
+* Revenue growth over quarters
+* Activity levels over time
+
+### Number Metrics
+
+Display single key values prominently.
+
+**Best for:**
+
+* Highlighting KPIs
+* Showing totals or averages
+* Quick status checks
+
+**Example uses:**
+
+* Total pipeline value
+* Number of open opportunities
+* Conversion rate
+
+**Advanced options:**
+
+* **Ratio**: For Select fields, calculate ratios between values. Go to **Data on display** → select your field → enable the **Ratio** option.
+* **Prefix & Suffix**: Add custom text before or after the number (e.g., "$" prefix or "%" suffix) for better readability.
+
+### iFrames
+
+Embed external tools and content directly in your dashboard.
+
+**Best for:**
+
+* Displaying external reports or dashboards
+* Integrating third-party sales tools
+* Showing live content from other systems
+
+**Example uses:**
+
+* Metrics from your Support tool
+* Metrics from your dialer
+* Live content from your Sales sequence tool
+
+
+ **Coming soon**: Gauge charts and tables are not yet available but are on our roadmap.
+
+
+## Configuring Widgets
+
+### Data Source
+
+1. Select the object to visualize (Opportunities, People, etc.)
+2. Choose the metric to display (count, sum, average)
+3. Apply filters to focus on specific data
+
+### Grouping
+
+Group data by:
+
+* Fields (stage, owner, industry)
+* Time periods (day, week, month, quarter)
+* Custom segments
+
+### Styling
+
+Customize your charts with:
+
+* Colors and themes
+* Labels and legends
+* Size and positioning
+
+### Duplicating Widgets
+
+1. Click on the widget
+2. Open **Options**
+3. Click **Duplicate widget**
diff --git a/packages/twenty-docs/l/zh/user-guide/dashboards/how-tos/dashboards-faq.mdx b/packages/twenty-docs/l/zh/user-guide/dashboards/how-tos/dashboards-faq.mdx
new file mode 100644
index 0000000000..7af41b4efa
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/dashboards/how-tos/dashboards-faq.mdx
@@ -0,0 +1,59 @@
+---
+title: Dashboards FAQ
+description: Frequently asked questions about dashboards in Twenty.
+---
+
+
+
+ No, dashboards are currently visible to everyone with access to your Twenty workspace. Private dashboards are not yet available.
+
+
+
+ Dashboards currently display data based on the viewer's timezone. If you're in different regions (e.g., APAC vs. US), you may see slightly different numbers for the same dashboard. We're working on adding a timezone setting per dashboard to ensure consistent data across teams.
+
+
+
+ Exporting dashboards is not available at the moment. This feature is on our roadmap.
+
+
+
+ No, sharing dashboards with users outside your Twenty workspace (non-Twenty users) is not currently supported.
+
+
+
+ Open the dashboard you want to favorite, then click the star icon. Favorites are personal—they won't affect other users.
+
+
+
+ * **Tabs** organize your dashboard into sections (like pages within the dashboard)
+ * **Widgets** are the individual visualizations (charts, numbers, iFrames) within each tab
+
+ Structure: Dashboard → Tabs → Widgets
+
+
+
+ Bar charts have display limits: 100 bars for horizontal charts, 50 for vertical. If your data exceeds this, add filters to narrow down the results or change the grouping (e.g., group by week instead of day).
+
+
+
+ Dashboard-level filters are not available yet, but this feature is on our roadmap. Currently, you need to apply filters to each widget individually.
+
+
+
+ Not yet. Gauge charts and tables are on our roadmap and will be added in a future release.
+
+
+
+ 1. Make sure you're in view mode (not editing)
+ 2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
+ 3. Select **Duplicate dashboard**
+
+
+
+ Widgets update automatically as your CRM data changes:
+
+ * Real-time updates for most metrics
+ * Use the refresh button for a manual update if needed
+ * Historical data is preserved for trend analysis
+
+
diff --git a/packages/twenty-docs/l/zh/user-guide/dashboards/overview.mdx b/packages/twenty-docs/l/zh/user-guide/dashboards/overview.mdx
new file mode 100644
index 0000000000..4c611ddda3
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/dashboards/overview.mdx
@@ -0,0 +1,79 @@
+---
+title: Dashboards
+description: Learn the basics of reporting and dashboards in Twenty.
+image: /images/user-guide/reporting/pie-chart.png
+---
+
+
+
+
+
+## Understanding Dashboards
+
+Dashboards in Twenty provide a visual way to track your key performance metrics and gain insights from your CRM data.
+
+
+
+## Key Concepts
+
+### Dashboards
+
+A dashboard is a collection of tabs that display your CRM data at a glance. You can create multiple dashboards for different purposes:
+
+* Sales performance
+* Team activity
+* Pipeline health
+* Custom metrics
+
+### Tabs
+
+Tabs allow you to organize your dashboard into sections. Each tab contains one or more widgets.
+
+### Widgets
+
+Widgets are individual visualizations that display specific data. Types include:
+
+* Bar charts
+* Pie charts
+* Line charts
+* Number metrics
+* iFrames
+
+
+ **Current limitations**:
+
+ * Exporting dashboards and sharing with external users (non-Twenty users) are not available at the moment.
+ * Gauge charts and tables are not yet available.
+
+
+## Getting Started
+
+### Creating Your First Dashboard
+
+1. Navigate to the **Dashboards** section
+2. Click **+ New Dashboard**
+3. Give your dashboard a name
+4. Add tabs to organize your content
+5. Add widgets to display your data
+6. Save
+
+### Adding Widgets
+
+1. Open a tab on your dashboard
+2. Click **+ Add Widget**
+3. Select the widget type
+4. Choose the data source (object)
+5. Configure the widget settings
+6. Save and view your widget
+
+## Best Practices
+
+* **Start simple**: Begin with a few key metrics and add more over time
+* **Focus on actionable data**: Display metrics that drive decisions
+* **Regular review**: Check your dashboards regularly to spot trends
+* **Share with team**: Make dashboards visible to relevant team members
+
+## Next Steps
+
+* [Widgets and visualizations](/l/zh/user-guide/dashboards/capabilities/widgets)
+* [Dashboards FAQ](/l/zh/user-guide/dashboards/how-tos/dashboards-faq)
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/error-handling.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/error-handling.mdx
new file mode 100644
index 0000000000..6de37918bc
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/error-handling.mdx
@@ -0,0 +1,76 @@
+---
+title: Error Handling & Validation
+description: Review and fix import errors directly in the UI before confirming.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Pre-Import Validation
+
+After uploading your file and mapping fields, Twenty validates your data **before** importing. This allows you to catch and fix errors without affecting your existing data.
+
+## How It Works
+
+1. **Upload** your CSV file
+2. **Map** your columns to Twenty fields
+3. **Review** the potential errors highlighted in yellow
+4. **Fix errors** directly in the UI
+5. **Confirm** the import
+
+
+
+## Error Display
+
+Rows with issues are highlighted in **yellow**. You can:
+
+* **Edit the cell directly** to fix the error
+* **Remove the row** to skip it entirely
+
+This inline editing saves time—no need to go back to your spreadsheet, fix errors, and re-upload.
+
+## Common Error Types
+
+### Duplicate Values
+
+**Cause**: A unique field (email, domain) already exists in Twenty or appears twice in your file.
+
+**Fix**:
+
+* Edit the duplicate value in the import UI
+* Remove one of the duplicate rows
+
+See [Uniqueness Constraints](/l/zh/user-guide/data-migration/capabilities/uniqueness-constraints) for more details on how uniqueness is enforced.
+
+### Invalid Format
+
+**Cause**: Data doesn't match the expected format (e.g., invalid email, wrong date format).
+
+**Fix**: Edit the cell to use the correct format.
+
+See [Field Mapping](/l/zh/user-guide/data-migration/capabilities/field-mapping) for the expected format of each field type.
+
+### Missing Required Fields
+
+**Cause**: A required field is empty.
+
+**Fix**: Enter a value in the required field or remove the row.
+
+### Relation Not Found
+
+**Cause**: The referenced record doesn't exist (e.g., a Company domain that wasn't imported).
+
+**Fix**:
+
+* Import the parent records first
+* Or correct the reference value
+
+See [Import Relations](/l/zh/user-guide/data-migration/capabilities/import-relations) for the correct import order and how to link records.
+
+## Tips for Fewer Errors
+
+1. **Download the template** to see expected format prior to importing your file
+2. **Clean your data** in the spreadsheet first
+3. **Import files in correct order** to import relations (Companies → People → Opportunities)
+4. **Test with small batches** before full import
+5. **Check for duplicates** before uploading
+6. **Limit the size of your file to 10,000 records** per file
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/field-mapping.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/field-mapping.mdx
new file mode 100644
index 0000000000..41d4dbc86f
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/field-mapping.mdx
@@ -0,0 +1,198 @@
+---
+title: Field Mapping
+description: How field mapping works during data import.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## How Field Mapping Works
+
+When you upload a file, Twenty analyzes your columns and attempts to match them to existing fields.
+
+### Automatic Mapping
+
+Twenty tries to match columns based on:
+
+* Column header names (exact or similar matches)
+* Data type detection (dates, numbers, emails)
+* Common field patterns
+
+**Quick tip:** Export a few rows from the object you want to import. The exported file will have the exact column names Twenty expects, making automatic mapping seamless during import.
+
+### Manual Mapping Options
+
+For each column, you can:
+
+* **Map to a field**: Select the matching Twenty field from a dropdown
+* **Do not map**: Skip the column entirely (data won't be imported)
+
+**Fields must exist before import.** The import creates records, not fields. Create custom fields under **Settings → Data Model** before importing.
+
+## Field Type Compatibility
+
+All field types available in the Data Model are supported for import.
+
+You can also import `id` values to either assign a specific ID to new records or update existing ones.
+
+
+
+## Data Format Requirements
+
+**Some fields have special syntax.** We recommend downloading the sample file before preparing your import to see the expected syntax for each field type.
+
+### Address Fields
+
+Address is a nested field with multiple columns. Some can be left empty.
+
+* **Address / Address 1**: Street address line 1
+* **Address / Address 2**: Street address line 2
+* **Address / City**: City name
+* **Address / State**: State or province
+* **Address / Country**: Country name
+* **Address / Post Code**: Postal/ZIP code
+
+### Array Fields
+
+Use the following format:
+
+```
+["value1","value2"]
+```
+
+### Boolean Fields
+
+Use `TRUE` or `FALSE` (uppercase) - not `true` or `false`
+
+### Currency Fields
+
+Currency is a nested field with two columns that **both must be filled**:
+
+* **Amount / Amount**: The numeric value (e.g., `1234.56`)
+* **Amount / Currency**: The currency code (e.g., `USD`, `EUR`)
+
+### Date Fields
+
+Supported formats:
+
+* `YYYY-MM-DD` (recommended)
+* `MM/DD/YYYY`
+* `DD/MM/YYYY`
+* ISO 8601 format
+
+### Domain Fields
+
+* It is recommended to use the format `https://domain.com` to avoid creating duplicates, as this is the format used for Companies created by the mailbox and calendar synchronizations
+* A `Domain Label` and `Domain URL` can be filled: best practice is to fill `domain.com` in the label and `https://domain.com` in the url
+* Domains must be unique within the Companies object
+* **Domains must be unique within the file to import**
+
+### Email Fields
+
+* Must be valid email format
+* Emails must be unique within the People object
+* **Emails must be unique within the file to import**
+* For additional emails: use **Emails / Primary Email** for the main email, and **Emails / Additional Emails** with this format:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Id Fields
+
+Specifying an `id` during import is optional. Twenty auto-generates one if not provided.
+
+Use cases for mapping an `id` column:
+
+* **Set a specific ID**: Choose the UUID for newly created records
+* **Update existing records**: Match against existing records to update them instead of creating duplicates. In that case, it is recommended to not map the other unique fields: mapping only one unique field ensures a smoother import.
+
+If you provide an `id`, it must be in UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
+
+### JSON Fields
+
+Use valid JSON format:
+
+```
+{"key":"value","key2":"value2"}
+```
+
+### Links Fields
+
+Similar to Domain fields:
+
+* Fill both the label and URL columns: **Links / Link URL** and **Links / Link Label**
+* Use full URL format: `https://example.com`
+* For secondary links, use **Links / Secondary Links** column with this format:
+
+```
+[{"url":"https://twenty.com","label":"Twenty"}]
+```
+
+### Multi-Select Fields
+
+Use the **API names** (not the display labels) in the following format:
+
+```
+["VALUE1","VALUE2"]
+```
+
+See [here](#finding-api-names-for-select-fields) where to find the API names.
+
+New select options will not be created automatically by the import. They must be added under **Settings → Data Model** before importing.
+
+
+ **Import overwrites, it does not add.**
+
+ If a record already has `VALUE2` and `VALUE3` selected, and you import `["VALUE1"]`, the record will only have `VALUE1` after import. The previous selections are replaced, not merged.
+
+
+### Number Fields
+
+* Numbers only
+* Decimals use period: `1234.56`
+* No thousands separators
+
+### Phone Fields
+
+Phone is a nested field with multiple columns that **must be filled**
+
+* **Phones / Primary Phone Number**: The phone number (e.g., `4159095555`)
+* **Phones / Primary Phone Country Code**: Country code (e.g., `US`)
+* **Phones / Primary Phone Calling Code**: Dialing code (e.g., `+1`)
+
+### Rating Fields
+
+Use the API name format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, `RATING_5`
+
+### Relation Fields
+
+Please see our dedicated article: [Import Relations Between Objects](/l/zh/user-guide/data-migration/capabilities/import-relations)
+
+### Select Fields
+
+Use the **API name** of the option (not the display label):
+
+```
+VALUE1
+```
+
+See [here](#finding-api-names-for-select-fields) where to find the API names.
+New select options will not be created automatically by the import. They must be added under **Settings → Data Model** before importing.
+
+### Text Fields
+
+* No special formatting required
+* Leading/trailing spaces are trimmed
+
+## Finding API Names
+
+For Select, Multi-Select, and Array fields with predefined options, you must use the **API names**, not the display labels.
+
+### How to Find API Names
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at the bottom right of the settings page)
+4. View the API name for each option
+
+
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/file-formats.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/file-formats.mdx
new file mode 100644
index 0000000000..cb268fb3cb
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/file-formats.mdx
@@ -0,0 +1,48 @@
+---
+title: Supported File Formats
+description: File formats supported for data import in Twenty.
+---
+
+## Supported Formats
+
+Twenty supports three file formats for import:
+
+| Format | Extension | Notes |
+| ------------------ | --------- | ---------------------------- |
+| **CSV** | .csv | Recommended, most compatible |
+| **Excel** | .xlsx | Modern Excel format |
+| **Excel (Legacy)** | .xls | Older Excel format |
+
+## File Requirements
+
+| Requirement | Value |
+| ---------------- | ------------------------------------- |
+| **Encoding** | UTF-8 recommended |
+| **Record limit** | 10,000 records per file |
+| **Structure** | First row must contain column headers |
+| **Content** | One object type per file |
+
+## CSV Best Practices
+
+* **Delimiter**: Use comma (`,`) or semicolon (`;`)
+* **Text qualifier**: Use double quotes (`"`) for text containing commas
+* **Line endings**: Windows (CRLF) or Unix (LF) both supported
+* **Empty values**: Leave cells empty, don't use "NULL" or "N/A"
+
+## Excel Best Practices
+
+When exporting from Excel:
+
+* Remove formulas (export values only)
+* Delete empty rows at the end
+* Ensure no merged cells
+* Use the first sheet only
+
+## Large Datasets
+
+For datasets larger than 10,000 records:
+
+* Split into multiple files
+* Or use the [API import](/l/zh/user-guide/data-migration/how-tos/import-data-via-api) for unlimited records
+
+For very large migrations (100,000+ records), the API is significantly faster and more reliable than CSV imports.
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/import-relations.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/import-relations.mdx
new file mode 100644
index 0000000000..b70b925b63
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/import-relations.mdx
@@ -0,0 +1,148 @@
+---
+title: Import Relations Between Objects
+description: Import relationships between records via CSV.
+---
+
+## Overview
+
+Twenty supports importing relationships between objects during CSV import. This allows you to link records (e.g., attach People to Companies) as part of your data migration.
+
+**Currently supported for import**: One-to-many relations pointing to a single object type on each side (e.g., People → Companies). Relations pointing to multiple object types are not yet supported in import/export.
+
+## How Relations Work in Twenty
+
+### One to Many / Many to One
+
+Twenty supports standard relations where one record links to many others:
+
+* **One Company → Many People**: A company can have multiple employees, but each person belongs to one company
+* **One Company → Many Opportunities**: A company can have multiple deals, but each opportunity belongs to one company
+
+### Relations That Can Point to Multiple Object Types
+
+Some relations can connect to different types of objects. This works in two ways:
+
+**Pattern 1: Many records linking to one record each from different object types**
+
+Several Notes, Tasks, or Activities can each be attached to multiple object types at once:
+
+* **Notes** can be linked to one Person, one Company, and one Opportunity simultaneously
+* **Tasks** can be linked to one Person, one Company, and one Opportunity simultaneously
+
+Here, the Notes/Tasks are on the "many" side. Each links to one record per object type.
+
+
+
+**Pattern 2: One record receiving links from many records of different object types**
+
+A Project can receive links from multiple records across different object types:
+
+* **A Project** can have many People linked to it, many Companies linked to it, and many Notes attached to it
+
+Here, the Project is on the "one" side. Multiple records from different objects can all link to the same Project.
+
+
+
+
+ **Import/Export limitation**: Relations that point to multiple object types (like Notes → People/Companies/Opportunities) are **not yet supported** in CSV import or export.
+
+ * **Import**: Only one-to-many relations pointing to a single object type on each side can be imported
+ * **Export**: Columns for relations pointing to multiple object types are currently left empty
+
+ This is on our roadmap.
+
+
+### What's Not Supported Today
+
+**Many to Many relations** are not yet available. For example, you cannot currently create a relation where:
+
+* Many People are linked to many Projects
+
+Many to Many relations are planned for H1 2026.
+
+## Linking Records During Import
+
+**Reminder**: Only one-to-many relations pointing to a single object type can be imported (e.g., People → Companies). Relations pointing to multiple object types (e.g., Notes → People/Companies/Opportunities) are not yet supported.
+
+### Step 1: Identify the "One" and "Many" Sides
+
+First, determine which object is on the "one" side and which is on the "many" side of the relationship.
+
+**Example**:
+
+* **Company** is the "one" side (one company has many employees)
+* **People** is the "many" side (each person belongs to one company)
+
+### Step 2: Ensure the "One" Side Records Exist
+
+Before importing the "many" side, the "one" side records must already exist in Twenty.
+
+* Import or create the "one" side records first (e.g., Companies)
+* Validate their unique identifier. This can be:
+ * The `id` (Twenty's UUID)
+ * A field set as unique (e.g., `domain` for Companies, or an external ID from your previous system)
+
+The import will fail if a reference is made to a record that does not exist.
+
+### Step 3: Prepare Your CSV File
+
+Add a column in your "many" side CSV file that references the "one" side record.
+
+**Example**: For a People CSV file linking to Companies:
+
+```
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+**Important**:
+
+* The value must **exactly match** the unique field on the Company record
+* For domains, use the **Domain URL** (e.g., `https://acme.com`), not the Domain Label
+* Map only **one** unique identifier per relation: this leads to a smoother import
+
+### Step 4: Ensure the Relation Field Exists
+
+Before uploading your file, make sure the relation field exists between your objects.
+
+If it doesn't exist:
+
+1. Go to **Settings → Data Model**
+2. Select your object (e.g., People)
+3. Create a relation field pointing to the target object (e.g., Company)
+
+### Step 5: Upload and Map the Relation
+
+1. Upload your CSV file via the import UI
+2. In the field mapping step, find your relation column (e.g., `companyDomain`)
+3. Map it to the relation field (e.g., Company)
+4. Twenty will automatically link each record to the matching parent
+
+### Available Unique Fields for Relations
+
+| Object | Unique Fields Available |
+| ------------------------------------- | --------------------------------------- |
+| **Companies** | `id`, `domain`, any custom unique field |
+| **People** | `id`, `email`, any custom unique field |
+| **Workspace Members** | `id`, `email` (not name) |
+| **Other standard and custom objects** | `id`, any field marked as unique |
+
+**Linking to Workspace Members**: When the relation points to Workspace Members (your team logging into Twenty), reference them by their **email address**, not their name.
+
+We recommend using `domain` for Companies and `email` for People, as these are human-readable and easy to maintain in spreadsheets.
+
+**Reminder**: Soft-deleted records (visible under Command Menu → See deleted records) count toward uniqueness criteria. If you import a record with the same unique value as a deleted record, the deleted record will be restored. See [Uniqueness Constraints](/l/zh/user-guide/data-migration/capabilities/uniqueness-constraints) for more details.
+
+## Import Order Rule
+
+
+ **Always import the "one" side first!**
+
+ 1. **Companies** first (no dependencies)
+ 2. **People** second (linked to Companies)
+ 3. **Opportunities** third (linked to Companies/People)
+ 4. **Custom objects** following their dependencies
+
+ The parent record must exist before you can reference it.
+
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/uniqueness-constraints.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/uniqueness-constraints.mdx
new file mode 100644
index 0000000000..5f6d05701b
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/capabilities/uniqueness-constraints.mdx
@@ -0,0 +1,72 @@
+---
+title: Uniqueness Constraints
+description: How Twenty enforces data uniqueness during import.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Overview
+
+Twenty enforces uniqueness on certain fields to prevent duplicate records and ensure data integrity. Understanding these constraints is essential for successful imports.
+
+## Default Unique Fields
+
+| Object | Unique Fields |
+| ------------------ | ---------------------- |
+| **People** | `id`, `email` |
+| **Companies** | `id`, `domain` |
+| **Custom objects** | `id` only (by default) |
+
+The `id` field is Twenty's internal identifier, auto-generated for each record. It uses UUID format (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`).
+
+## Custom Unique Fields
+
+You can define additional unique fields under **Settings → Data Model**:
+
+1. Go to **Settings → Data Model**
+2. Select the object
+3. Click on a field
+4. Enable **Unique** in field settings
+
+### Use Cases for Custom Unique Fields
+
+* **External IDs**: Store IDs from other systems (Salesforce ID, HubSpot ID)
+* **Business identifiers**: Employee numbers, customer codes
+* **Alternative contact info**: LinkedIn profile, phone number
+
+The field name `id` is reserved for Twenty's internal ID. Use a different name like `externalId` or `legacyId` for external identifiers.
+
+## Import Behavior
+
+### Creating New Records
+
+If a unique field value doesn't exist, a new record is created.
+
+### Updating Existing Records
+
+If a unique field value matches an existing record, that record is **updated** with the new data.
+To **update existing records**, it is recommended to **only match one unique field**.
+
+### Soft-Deleted Records
+
+
+ **Deleted records count toward uniqueness.**
+
+ Soft-deleted records (visible under Command Menu → See deleted records) are included in uniqueness checks. If you import a record with the same unique value as a deleted record, the deleted record will be **restored** with the new data.
+
+
+## Duplicate Detection During Import
+
+During the validation phase:
+
+* Duplicates within your file are highlighted in yellow
+* You can edit or remove duplicate rows from the UI before starting the import
+
+
+
+## Best Practices
+
+1. **Remove duplicates** from your file before importing
+2. **Check for existing records** in Twenty before importing
+3. **Use external IDs** when migrating from other systems
+4. **Include unique fields** if you want to update existing records
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/export-your-data.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/export-your-data.mdx
new file mode 100644
index 0000000000..e011ecddb6
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/export-your-data.mdx
@@ -0,0 +1,209 @@
+---
+title: Export Your Data
+description: Complete step-by-step guide to exporting data from Twenty.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Overview
+
+Export your workspace data to CSV for backups, reporting, or migration.
+
+**Use cases:**
+
+* **Regular backups** — keep copies of your data
+* **External reporting** — analyze data in Excel, Google Sheets, or BI tools
+* **Migration** — move data to another system
+* **Bulk updates** — export, edit, and re-import to update records
+
+## What You Need to Know
+
+### Export Limits
+
+* **Maximum 20,000 records** per export
+* Only **visible columns** are exported
+* Only **filtered records** are exported (based on your current view)
+
+For larger exports (20,000+ records), use filters to export in batches or use the [API](/l/zh/developers/extend/capabilities/apis).
+
+### Permissions
+
+You need the **"Export CSV"** permission to export data. Contact your workspace admin if you don't have this option.
+
+## Step 1: Navigate to the Object
+
+Go to the object you want to export:
+
+* **People** — for contacts
+* **Companies** — for organizations
+* **Opportunities** — for deals
+* **Custom objects** — any object you've created
+
+## Step 2: Configure Your View
+
+**Important:** The export includes only what's visible in your current view.
+
+### Add/Remove Columns
+
+1. Click **Options → Fields** (or the **+** at the end of columns)
+2. Check the fields you want to export
+3. Uncheck fields you don't need
+
+### Filter Records (Optional)
+
+If you only need a subset of data:
+
+1. Click **Filter**
+2. Add filter conditions (e.g., "Created date > January 1, 2024")
+3. Only matching records will be exported
+
+### Sort Records (Optional)
+
+1. Click a column header to sort
+2. The export will follow your sort order
+
+**Create a dedicated export view.** Save a view specifically configured for exports so you don't need to reconfigure each time.
+
+## Step 3: Export the Data
+
+1. Click the **⋮** icon on the top right of the table
+2. Select **Export view**
+3. Choose where to save the CSV file
+4. Wait for the download to complete
+
+## What Gets Exported
+
+| Included | Not Included |
+| -------------------------------- | ---------------------- |
+| All visible columns | Hidden columns |
+| Records matching current filters | Filtered-out records |
+| Custom field values | Fields not in the view |
+| Record IDs | File attachments |
+| Relation IDs | Images |
+
+### Relation Fields
+
+Relation IDs are only exported on the **"many" side** of a relationship:
+
+* **People export** includes a `companyId` column (People → Company relation)
+* **Companies export** does NOT include `peopleIds` (Companies is the "one" side)
+
+This means you can use the People export to re-import and maintain the Company link, but you'll need to re-import People after Companies to recreate the relationships.
+
+## Exporting for Specific Purposes
+
+### For Backups
+
+1. Create a view with **all fields** visible
+2. Remove all filters to include all records
+3. Export each object type separately
+4. Store exports in a secure location
+5. Set a recurring reminder (weekly/monthly)
+
+### For External Reporting
+
+1. Include only the fields you need for analysis
+2. Apply filters to focus on relevant data
+3. Consider sorting by the field you'll analyze
+
+### For Bulk Updates
+
+1. Export the records you want to update
+2. Include the unique identifier (`email`, `domain`, or `id`)
+3. Edit the exported file
+4. Re-import to update records
+ See: [How to Update Existing Records](/l/zh/user-guide/data-migration/how-tos/update-existing-records-via-import)
+
+### For Migration
+
+If you're exporting to migrate to another system:
+
+1. **Export each object separately** — People, Companies, Opportunities, etc.
+2. **Include ID fields** — these help maintain relationships
+3. **Document field mappings** — note how Twenty fields map to your target system
+
+## Handling Large Datasets (20,000+ Records)
+
+The export limit is 20,000 records. For larger datasets:
+
+### Option 1: Export in Batches
+
+1. Add a filter (e.g., "Created date" ranges)
+2. Export the first batch
+3. Change the filter
+4. Export the next batch
+5. Combine files in your spreadsheet
+
+**Example filters for batching:**
+
+* By date range (January, February, March...)
+* By owner (Team member A, Team member B...)
+* By status (Active, Inactive...)
+
+### Option 2: Use the API
+
+The API has no record limit:
+
+1. Get your API key from **Settings → Developers**
+2. Use the GraphQL API to query records
+3. Process results in your application
+
+See: [API Documentation](/l/zh/developers/extend/capabilities/apis)
+
+## Tips and Best Practices
+
+### Create Export Views
+
+Save views configured specifically for exports:
+
+1. Configure columns and filters
+2. Click **View options** → **Save as new view**
+3. Name it "Export - [Purpose]"
+
+### Secure Your Exports
+
+Exported files may contain sensitive data:
+
+* Store in secure locations
+* Delete old exports when no longer needed
+* Be careful sharing export files
+
+### Check Before Exporting
+
+Correct columns are visible
+Filters are set correctly (or removed for full export)
+You have Export permission
+
+## FAQ
+
+
+
+ Only visible columns are exported. Add the columns you need via **Options → Fields** before exporting.
+
+
+
+ Check your filters. The export only includes records matching your current view filters. Remove filters to export all records.
+
+
+
+ Not in a single export. Use filters to export in batches, or use the API for larger datasets.
+
+
+
+ CSV (Comma Separated Values). Opens in Excel, Google Sheets, or any spreadsheet application.
+
+
+
+ Yes, but only on the "many" side of relationships. For example, a People export includes `companyId`, but a Companies export does not include people IDs.
+
+
+
+ Not directly through the UI. Use the API to build automated export workflows.
+
+
+
+## Next Steps
+
+* [How to Update Existing Records](/l/zh/user-guide/data-migration/how-tos/update-existing-records-via-import) — edit and re-import your export
+* [How to Import Data via API](/l/zh/user-guide/data-migration/how-tos/import-data-via-api) — for large datasets
+* [API Documentation](/l/zh/developers/extend/capabilities/apis) — build custom export workflows
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/fix-import-errors.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/fix-import-errors.mdx
new file mode 100644
index 0000000000..a686ca1a05
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/fix-import-errors.mdx
@@ -0,0 +1,430 @@
+---
+title: Fix Import Errors
+description: Complete troubleshooting guide for resolving CSV import errors.
+---
+
+## Overview
+
+Import not working? This guide helps you identify and fix common import errors step by step.
+
+## How Import Validation Works
+
+After uploading your file and mapping columns, Twenty validates your data:
+
+1. **Validation runs** — Twenty checks each row for errors
+2. **Errors are highlighted** — problematic rows appear in **yellow**
+3. **You can fix in-place** — edit cells directly in the import UI
+4. **Or remove rows** — skip problematic records entirely
+
+**Fix errors in the UI.** You don't need to go back to your spreadsheet. Edit cells directly during import to save time.
+
+## Step-by-Step Troubleshooting
+
+### Step 1: Identify the Error Type
+
+Click on a highlighted row to see the specific error message. Common error types:
+
+| Error Message | What It Means |
+| --------------------------------------------------------------------- | ------------------------------------------------------------ |
+| Duplicate values highlighted in yellow | Value already exists in Twenty or appears twice in your file |
+| `{field} is not a valid {type}` (hover on yellow cell) | Data doesn't match expected format |
+| Required field highlighted | A required field is empty |
+| `Can't connect to {object}. No unique record found...` (import fails) | Referenced record doesn't exist |
+| `Too many records. Up to 10000 allowed` (upload blocked) | File has more than 10,000 records |
+
+### Step 2: Fix the Error
+
+Follow the specific instructions below for each error type.
+
+---
+
+## Error: Duplicate Value
+
+### What You'll See
+
+Rows with duplicate values are **highlighted in yellow** in the import UI before the import starts.
+
+### What It Means
+
+A unique field (email, domain) either:
+
+* Already exists in Twenty
+* Appears twice in your file
+
+### How to Fix
+
+**Option 1: Edit the duplicate value**
+
+1. Click the cell with the error
+2. Change to a unique value
+3. Continue with import
+
+**Option 2: Remove the duplicate row**
+
+1. Click the X next to the row
+2. The row will be skipped during import
+
+**Option 3: Let Twenty update the existing record**
+
+1. Ensure your file includes a unique identifier (`email`, `domain`, or `id`)
+2. Map the unique identifier field
+3. Twenty will update the existing record instead of creating a duplicate
+
+
+ **You can update unique fields too.**
+
+ * If you keep the `id` but change the `email` → the email will be updated
+ * If you keep the `email` but change the `id` → the id will be updated
+
+ As long as one unique identifier matches, Twenty updates the record.
+
+
+### How to Prevent This Error
+
+Before importing:
+
+1. Sort your spreadsheet by the unique field
+2. Remove duplicate rows
+3. Check if records already exist in Twenty
+
+
+ **Soft-deleted records count toward uniqueness.**
+
+ Check Command Menu → See deleted records. Records there still enforce uniqueness. Permanently delete them or restore and update.
+
+
+For more details: [Uniqueness Constraints](/l/zh/user-guide/data-migration/capabilities/uniqueness-constraints)
+
+---
+
+## Error: Invalid Format
+
+### What You'll See
+
+The cell value is highlighted in yellow. Hover over it to see the error message:
+
+```
+{field name} is not a valid {field type}
+```
+
+### What It Means
+
+The data doesn't match the expected format for that field type.
+
+### How to Fix — By Field Type
+
+#### Email
+
+**Problem:** Invalid email format
+**Solution:** Use format `name@domain.com`
+
+```
+❌ john.smith@
+❌ john smith@acme.com
+✓ john.smith@acme.com
+```
+
+#### Domain
+
+**Problem:** Inconsistent format may cause duplicates
+**Solution:** Use `https://domain.com` format (recommended)
+
+```
+⚠️ acme.com (valid, but not recommended)
+⚠️ www.acme.com (valid, but not recommended)
+✅ https://acme.com (recommended)
+```
+
+All formats are valid, but `https://domain.com` is recommended because it matches the format used by email/calendar sync. Using other formats may create duplicate companies.
+
+#### Date
+
+**Problem:** Unrecognized date format
+**Solution:** Use consistent format throughout file
+
+```
+✓ 2024-03-15 (YYYY-MM-DD - recommended)
+✓ 03/15/2024 (MM/DD/YYYY)
+✓ 15/03/2024 (DD/MM/YYYY)
+```
+
+#### Phone
+
+**Problem:** Missing required columns
+**Solution:** Include all phone columns
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+#### Boolean
+
+**Problem:** Wrong boolean value
+**Solution:** Use uppercase `TRUE` or `FALSE`
+
+```
+❌ true
+❌ yes
+❌ 1
+✓ TRUE
+✓ FALSE
+```
+
+#### Select / Multi-Select
+
+**Problem:** Value doesn't match existing options
+**Solution:** Use **API names**, not display labels
+
+How to find API names:
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at bottom right)
+4. Use the API name (e.g., `OPTION_1`, not "Option 1")
+
+```
+❌ High Priority
+✓ HIGH_PRIORITY
+```
+
+#### Currency
+
+**Problem:** Missing amount or currency code
+**Solution:** Fill both columns
+
+| Column | Example |
+| --------------------- | --------- |
+| **Amount / Amount** | `1234.56` |
+| **Amount / Currency** | `USD` |
+
+#### Number
+
+**Problem:** Non-numeric characters
+**Solution:** Numbers only, period for decimals
+
+```
+❌ $1,234.56
+❌ 1,234.56
+✓ 1234.56
+```
+
+For complete format reference: [Field Mapping](/l/zh/user-guide/data-migration/capabilities/field-mapping)
+
+---
+
+## Error: Required Field Missing
+
+### What You'll See
+
+The row is highlighted in yellow with the required field cell marked.
+
+### What It Means
+
+A required field is empty for this row.
+
+### How to Fix
+
+**Option 1: Enter a value**
+
+1. Click the empty cell
+2. Enter a value
+3. Continue with import
+
+**Option 2: Remove the row**
+
+1. If you don't have the data, click X to skip the row
+
+### How to Prevent This Error
+
+Before importing, identify required fields:
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Check which fields are marked as required
+
+---
+
+## Error: Relation Not Found
+
+### What You'll See
+
+This error appears **after the import starts** — the import fails with a message like:
+
+```
+Can't connect to company. No unique record found with condition: id = 7776ee49-f608-4a77-8cc8-6fe96ae1e43f
+```
+
+This means there is no Company in Twenty with that specific identifier.
+
+Unlike other errors, this one is not caught during the data review step. The import will start and then fail when it encounters the missing relation.
+
+### What It Means
+
+You're trying to link to a record that doesn't exist in Twenty.
+
+### How to Fix
+
+**Option 1: Import parent records first**
+
+1. Cancel the current import
+2. Import the parent records (e.g., Companies)
+3. Then import the child records (e.g., People)
+
+**Option 2: Fix the reference value**
+
+1. Check the reference value in your file
+2. Ensure it exactly matches an existing record
+3. Verify format: domains should be `https://domain.com`
+
+**Option 3: Remove the relation**
+
+1. Clear the cell to import without the relation
+2. Add the relation manually later
+
+### How to Prevent This Error
+
+1. **Import in the correct order:**
+ * Companies first
+ * People second (with company references)
+ * Opportunities third
+
+2. **Verify reference values:**
+ * Export parent records to get exact identifiers
+ * Use domain format `https://domain.com`
+ * Check for typos and case sensitivity
+
+
+ **Import will fail if a reference is made to a non-existent record.**
+
+ Always import parent objects before child objects.
+
+
+For more details: [Import Relations](/l/zh/user-guide/data-migration/capabilities/import-relations)
+
+---
+
+## Error: File Too Large
+
+### What You'll See
+
+This error appears **when uploading your file** — the upload is blocked entirely:
+
+```
+Too many records. Up to 10000 allowed
+```
+
+You won't be able to proceed to the data review step until you reduce the file size.
+
+### What It Means
+
+Your file has more than 10,000 records.
+
+### How to Fix
+
+**Option 1: Split into multiple files**
+
+1. Divide your data into files of 10,000 records or fewer
+2. Import each file separately
+3. Maintain import order (Companies before People)
+
+**Option 2: Use API import**
+For very large datasets, use the API which has no record limit.
+See: [How to Import Data via API](/l/zh/user-guide/data-migration/how-tos/import-data-via-api)
+
+---
+
+## Error: Field Not Recognized
+
+### What It Means
+
+A column in your file can't be mapped because the field doesn't exist in Twenty.
+
+### How to Fix
+
+1. Go to **Settings → Data Model**
+2. Select the object you're importing
+3. Click **+ Add field**
+4. Create the custom field with the appropriate type
+5. Re-upload your file
+
+The CSV import creates records, not fields. All fields must exist before importing.
+
+---
+
+## Error: User Relation Empty
+
+### What It Means
+
+You're trying to assign a record to a user (Owner, Assignee) but the relation isn't being mapped.
+
+### Common Causes
+
+1. **User hasn't accepted their invitation** — the user doesn't exist in Twenty yet
+2. **Using user ID from old system** — Twenty can't match IDs from another system
+3. **Wrong email format** — the email doesn't match the user's Twenty account
+
+### How to Fix
+
+1. Ensure all users have **accepted their invitation** to your Twenty workspace
+2. Use the user's **email address** (not their name or old system ID)
+3. Use the same email they used to join Twenty
+
+
+ **Users must accept invitations before importing.**
+
+ If a user hasn't accepted their invitation, records referencing them will have empty user relations.
+
+
+---
+
+## Pre-Import Checklist
+
+Avoid errors by checking these before importing:
+
+### File Requirements
+
+File is CSV, XLSX, or XLS format
+File has fewer than 10,000 records
+File uses UTF-8 encoding
+
+### Data Quality
+
+No duplicate emails (for People)
+No duplicate domains (for Companies)
+All dates use consistent format
+All domains use `https://domain.com` format
+
+### Field Formats
+
+Boolean fields use `TRUE` or `FALSE` (uppercase)
+Select fields use API names, not display labels
+Phone fields have all required columns
+Currency fields have both Amount and Currency Code
+
+### Relations
+
+Parent records imported before child records
+Relation columns reference existing records
+Domain format matches Twenty's format exactly
+
+### Data Model
+
+All custom fields exist in Settings → Data Model
+Select options exist before importing
+
+---
+
+## Still Having Issues?
+
+If you've tried the above solutions:
+
+1. **Download the sample file** — see the exact format Twenty expects
+2. **Export existing records** — compare your file to working data
+3. **Test with a small batch** — try 5-10 rows first
+4. **Check the reference articles:**
+ * [Field Mapping](/l/zh/user-guide/data-migration/capabilities/field-mapping)
+ * [Uniqueness Constraints](/l/zh/user-guide/data-migration/capabilities/uniqueness-constraints)
+ * [Import Relations](/l/zh/user-guide/data-migration/capabilities/import-relations)
+ * [Error Handling](/l/zh/user-guide/data-migration/capabilities/error-handling)
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/import-companies-via-csv.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
new file mode 100644
index 0000000000..62c6778497
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/import-companies-via-csv.mdx
@@ -0,0 +1,201 @@
+---
+title: Import Companies via CSV
+description: Complete step-by-step guide to importing companies into Twenty.
+---
+
+## Overview
+
+This guide walks you through importing your companies into Twenty. **Companies should be imported first** because People and Opportunities link to Companies.
+
+## Before You Start
+
+### Prerequisites Checklist
+
+
+ Your file is CSV, XLSX, or XLS format
+
+
+
+ File has fewer than 10,000 records
+
+
+
+ No duplicate domains in your file
+
+
+
+ All custom fields exist in **Settings → Data Model**
+
+
+
+ Need to import more than 10,000 companies? Split into multiple files or use the [API import](/l/zh/user-guide/data-migration/how-tos/import-data-via-api).
+
+
+## Step 1: Prepare Your Company Data
+
+### Required and Recommended Fields
+
+| Field | Required? | Format | Notes |
+| ----------------- | ----------- | -------------------- | ------------------------ |
+| **Name** | Recommended | Text | Company display name |
+| **Domain** | Recommended | `https://domain.com` | Unique identifier |
+| **Address** | Optional | Multiple columns | See below |
+| **Employees** | Optional | Number | Employee count |
+| **Custom fields** | Optional | Varies | Must exist in Data Model |
+
+### Domain Format
+
+
+ **Use the format `https://domain.com` for domains.**
+
+ This matches the format used when Companies are auto-created from email/calendar sync, preventing duplicates later.
+
+
+**Domain columns:**
+
+* **Domain / Domain Label**: `acme.com`
+* **Domain / Domain URL**: `https://acme.com`
+
+### Address Format
+
+Address is a nested field with multiple columns:
+
+```
+Address / Address 1,Address / City,Address / State,Address / Country,Address / Post Code
+123 Main Street,San Francisco,CA,USA,94105
+```
+
+### Sample CSV Structure
+
+```csv
+name,Domain / Domain URL,Domain / Domain Label,Address / City,Address / Country,employees
+Acme Corp,https://acme.com,acme.com,San Francisco,USA,250
+Widget Co,https://widgets.co,widgets.co,New York,USA,50
+```
+
+
+ **Pro tip:** Click **Download sample file** during import to see the exact column names Twenty expects.
+
+
+## Step 2: Access the Import Feature
+
+**Option 1: From the Companies View**
+
+1. Navigate to **Companies** in the left sidebar
+2. Click the **⋮** icon on the top right
+3. Select **Import records**
+
+**Option 2: Using Command Menu**
+
+1. Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+2. Type "import"
+3. Select **Import records**
+4. Choose **Companies**
+
+## Step 3: Upload Your File
+
+1. Click **Select file**
+2. Choose your CSV, XLSX, or XLS file
+3. Wait for Twenty to analyze your file
+
+## Step 4: Map Your Columns
+
+Twenty automatically tries to match your columns to fields. Review and adjust:
+
+1. **Check automatic mappings** — verify they're correct
+2. **Fix incorrect mappings** — click the dropdown to select the right field
+3. **Skip columns** — select **Do not map** for columns you don't want to import
+
+### Important Mapping Rules
+
+* **Domain**: Map to **Domain / Domain URL** (not Domain Label)
+* **Address**: Map each part to its specific column (City, State, etc.)
+* **Select fields**: Values must match existing options (or you'll map them in the next step)
+
+
+
+## Step 5: Map Select Field Values
+
+If you have Select or Multi-Select fields:
+
+1. Twenty shows your values alongside existing options
+2. Match each value in your file to a Twenty option
+3. Or create new options if needed
+
+
+ Select options use **API names**, not display labels. Check **Settings → Data Model** → Enable **Advanced mode** to see API names.
+
+
+## Step 6: Review and Fix Errors
+
+Before completing the import, Twenty validates your data:
+
+1. Click **Next Steps**
+2. Rows with errors are highlighted in **yellow**
+3. **Fix errors directly** — click a cell and edit the value
+4. **Remove problematic rows** — click the X to skip that row
+
+### Common Company Import Errors
+
+| Error | Cause | Solution |
+| -------------------------- | ------------------------------- | ------------------------------------------ |
+| **Duplicate domain** | Domain already exists in Twenty | Remove from file or update existing record |
+| **Invalid domain format** | Wrong format | Use `https://domain.com` |
+| **Missing required field** | Required field is empty | Fill in the value or remove the row |
+
+## Step 7: Complete the Import
+
+1. Review the import summary
+2. Click **Confirm** to import
+3. Wait for the import to complete
+4. Verify by checking a few records
+
+## After Importing Companies
+
+Now you can import records that link to Companies:
+
+1. **[Import People](/l/zh/user-guide/data-migration/how-tos/import-contacts-via-csv)** — link them to Companies using the domain
+2. **Import Opportunities** — link them to Companies
+3. **Verify the import** — spot-check a few records to ensure data is correct
+
+## Updating Existing Companies
+
+To update companies instead of creating new ones:
+
+1. Include the `domain` or `id` column in your file
+2. Twenty matches records by this unique identifier
+3. Existing companies are updated; new ones are created
+
+See [How to Update Existing Records](/l/zh/user-guide/data-migration/how-tos/update-existing-records-via-import) for details.
+
+## FAQ
+
+
+
+ Domain is a unique identifier in Twenty. This prevents duplicate companies and ensures email sync correctly links emails to the right company.
+
+
+
+ You can leave the domain empty. However, we recommend adding domains when possible for better data quality and automatic email linking.
+
+
+
+ Yes! You can import companies first, then import People later and link them using the company domain.
+
+
+
+ If you include a unique identifier (domain or id) that matches an existing company, Twenty updates that company instead of creating a duplicate.
+
+
+
+ Either remove the duplicate from your file, or include the company's `id` to update the existing record instead.
+
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/zh/user-guide/data-migration/how-tos/fix-import-errors)
+* [Field Mapping Reference](/l/zh/user-guide/data-migration/capabilities/field-mapping)
+* [Uniqueness Constraints](/l/zh/user-guide/data-migration/capabilities/uniqueness-constraints)
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
new file mode 100644
index 0000000000..ac180254af
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/import-contacts-via-csv.mdx
@@ -0,0 +1,242 @@
+---
+title: Import Contacts via CSV
+description: Complete step-by-step guide to importing people/contacts into Twenty.
+---
+
+## Overview
+
+This guide walks you through importing your contacts (People) into Twenty. **Import Companies first** if you want to link People to Companies.
+
+## Before You Start
+
+### Prerequisites Checklist
+
+
+ Your file is CSV, XLSX, or XLS format
+
+
+
+ File has fewer than 10,000 records
+
+
+
+ No duplicate email addresses in your file
+
+
+
+ **Companies imported first** (if linking People to Companies)
+
+
+
+ All custom fields exist in **Settings → Data Model**
+
+
+
+ **Import Companies Before People**
+
+ If you want to link People to Companies, import Companies first. The Company must exist before you can reference it.
+
+
+## Step 1: Prepare Your Contact Data
+
+### Required and Recommended Fields
+
+| Field | Required? | Format | Notes |
+| ----------------- | ----------- | ----------------- | ------------------------- |
+| **Email** | Recommended | `name@domain.com` | Must be unique |
+| **First Name** | Recommended | Text | |
+| **Last Name** | Recommended | Text | |
+| **Company** | Optional | Domain or ID | Links to existing Company |
+| **Phone** | Optional | Multiple columns | See below |
+| **Job Title** | Optional | Text | |
+| **Custom fields** | Optional | Varies | Must exist in Data Model |
+
+### Email Format
+
+* Must be valid email format: `name@domain.com`
+* **Must be unique** — no duplicates in your file or in Twenty
+* For additional emails, use the **Emails / Additional Emails** column:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Phone Format
+
+Phone is a **nested field** requiring multiple columns:
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+### Linking to Companies
+
+Add a column with the Company's unique identifier:
+
+| Column Name | Format | Example |
+| --------------- | ---------- | -------------------------------------- |
+| `companyDomain` | URL format | `https://acme.com` |
+| `companyId` | UUID | `c776ee49-f608-4a77-8cc8-6fe96ae1e43f` |
+
+
+ **Use Domain URL format** (`https://acme.com`), not the label. This matches how Companies are stored in Twenty.
+
+
+### Sample CSV Structure
+
+```csv
+firstName,lastName,email,jobTitle,companyDomain,Phones / Primary Phone Number,Phones / Primary Phone Country Code
+John,Smith,john@acme.com,CEO,https://acme.com,4159095555,US
+Jane,Doe,jane@widgets.co,CTO,https://widgets.co,2125551234,US
+```
+
+
+ **Pro tip:** Click **Download sample file** during import or export a few existing People to see the exact column names Twenty expects.
+
+
+## Step 2: Access the Import Feature
+
+**Option 1: From the People View**
+
+1. Navigate to **People** in the left sidebar
+2. Click the **⋮** icon on the top right
+3. Select **Import records**
+
+**Option 2: Using Command Menu**
+
+1. Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+2. Type "import"
+3. Select **Import records**
+4. Choose **People**
+
+## Step 3: Upload Your File
+
+1. Click **Select file**
+2. Choose your CSV, XLSX, or XLS file
+3. Wait for Twenty to analyze your file
+
+## Step 4: Map Your Columns
+
+Twenty automatically tries to match your columns to fields. Review and adjust:
+
+1. **Check automatic mappings** — verify they're correct
+2. **Fix incorrect mappings** — click the dropdown to select the right field
+3. **Skip columns** — select **Do not map** for columns you don't want to import
+
+### Important Mapping Rules
+
+| Column Type | Map To | Notes |
+| ----------------- | ------------------------------ | ---------------------------------- |
+| Company reference | **Company** relation field | Use domain OR id, not both |
+| Email | **Email** | Primary email address |
+| Additional emails | **Emails / Additional Emails** | Array format |
+| Phone | Separate columns | Number, Country Code, Calling Code |
+
+
+
+### Mapping the Company Relation
+
+When mapping the company column:
+
+1. Find your company reference column (e.g., `companyDomain`)
+2. Map it to the **Company** relation field
+3. Twenty will link each Person to the matching Company
+
+
+ **Map only ONE unique identifier for relations.**
+
+ Don't map both `companyId` AND `companyDomain`. Choose one—preferably domain since it's human-readable.
+
+
+## Step 5: Map Select Field Values
+
+If you have Select or Multi-Select fields (like Lead Source):
+
+1. Twenty shows your values alongside existing options
+2. Match each value in your file to a Twenty option
+3. Or create new options if needed
+
+
+ Select options use **API names**, not display labels. Check **Settings → Data Model** → Enable **Advanced mode** to see API names.
+
+
+## Step 6: Review and Fix Errors
+
+Before completing the import, Twenty validates your data:
+
+1. Click **Next Steps**
+2. Rows with errors are highlighted in **yellow**
+3. **Fix errors directly** — click a cell and edit the value
+4. **Remove problematic rows** — click the X to skip that row
+
+### Common Contact Import Errors
+
+| Error | Cause | Solution |
+| -------------------------- | -------------------------------------- | ------------------------------------------- |
+| **Duplicate email** | Email already exists in Twenty or file | Remove duplicate or update existing record |
+| **Invalid email format** | Email format incorrect | Fix to `name@domain.com` |
+| **Relation not found** | Company doesn't exist | Import Companies first or fix the reference |
+| **Missing required field** | Required field is empty | Fill in the value or remove the row |
+
+## Step 7: Complete the Import
+
+1. Review the import summary
+2. Click **Confirm** to import
+3. Wait for the import to complete
+4. Verify by checking a few records and their Company links
+
+## After Importing Contacts
+
+Your contacts are now in Twenty! Next steps:
+
+1. **Verify Company links** — open a few People records to confirm they're linked to the right Company
+2. **Import Opportunities** — if needed, link them to People and Companies
+3. **Set up email sync** — connect your mailbox to see email history on contact records
+
+## Updating Existing Contacts
+
+To update contacts instead of creating new ones:
+
+1. Include the `email` or `id` column in your file
+2. Twenty matches records by this unique identifier
+3. Existing contacts are updated; new ones are created
+
+See [How to Update Existing Records](/l/zh/user-guide/data-migration/how-tos/update-existing-records-via-import) for details.
+
+## FAQ
+
+
+
+ Email is a unique identifier in Twenty. This prevents duplicate contacts and ensures email sync correctly links emails to the right person.
+
+
+
+ You can leave the email empty. However, we recommend adding emails when possible for better data quality and email sync functionality.
+
+
+
+ Add a column with the Company's domain (e.g., `https://acme.com`) or ID. During mapping, connect this column to the Company relation field.
+
+
+
+ Import Companies first, then import People. The Company must exist before you can reference it.
+
+
+
+ Yes! Create a custom field marked as "unique" in your data model to store the external ID. Note: the field name `id` is reserved for Twenty's internal ID.
+
+
+
+ The Company you're referencing doesn't exist. Either import the Company first, or check that the domain/ID exactly matches an existing Company.
+
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/zh/user-guide/data-migration/how-tos/fix-import-errors)
+* [How to Import Relations](/l/zh/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+* [Field Mapping Reference](/l/zh/user-guide/data-migration/capabilities/field-mapping)
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/import-data-via-api.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/import-data-via-api.mdx
new file mode 100644
index 0000000000..420eef0468
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/import-data-via-api.mdx
@@ -0,0 +1,176 @@
+---
+title: Import Data via API
+description: When and how to use Twenty's APIs for large-scale data imports.
+---
+
+## Overview
+
+Twenty provides both **GraphQL** and **REST APIs** for programmatic data import. Use the API when CSV import isn't practical for your data volume or when you need automated, recurring imports.
+
+## When to Use API Import
+
+| Scenario | Recommended Method |
+| ---------------------------------- | ----------------------------- |
+| Under 10,000 records | CSV Import |
+| 10,000 - 50,000 records | CSV Import (split into files) |
+| **50,000+ records** | **API Import** |
+| One-time migration | Either (based on volume) |
+| **Recurring imports** | **API Import** |
+| **Real-time sync** | **API Import** |
+| **Integration with other systems** | **API Import** |
+
+For datasets in the hundreds of thousands, the API is significantly faster and more reliable than multiple CSV imports.
+
+## API Rate Limits
+
+Twenty enforces rate limits to ensure system stability:
+
+| Limit | Value |
+| -------------------------- | --------------------- |
+| **Requests per minute** | 100 |
+| **Records per batch call** | 60 |
+| **Maximum throughput** | ~6,000 records/minute |
+
+
+ **Plan your import around these limits.**
+
+ For 100,000 records at maximum throughput, expect approximately 17 minutes of import time. Add buffer time for error handling and retries.
+
+
+## Getting Started
+
+### Step 1: Get Your API Key
+
+1. Go to **Settings → Developers**
+2. Click **+ Create API key**
+3. Give your key a descriptive name
+4. Copy the API key immediately (it won't be shown again)
+5. Store it securely
+
+
+ **Keep your API key secret.**
+
+ Anyone with your API key can access and modify your workspace data. Never commit it to code repositories or share it publicly.
+
+
+### Step 2: Choose Your API
+
+Twenty supports two API types:
+
+| API | Best For | Documentation |
+| ----------- | ----------------------------------------------------------- | ------------------------------------------------ |
+| **GraphQL** | Flexible queries, fetching related data, complex operations | [API Docs](/l/zh/developers/extend/capabilities/apis) |
+| **REST** | Simple CRUD operations, familiar REST patterns | [API Docs](/l/zh/developers/extend/capabilities/apis) |
+
+Both APIs support:
+
+* Creating, reading, updating, and deleting records
+* **Batch operations** — create or update up to 60 records per call
+
+**For imports, use batch operations** to maximize throughput within rate limits.
+
+### Step 3: Plan Your Import Order
+
+Just like CSV imports, **order matters** for relations:
+
+1. **Companies** first (no dependencies)
+2. **People** second (can link to Companies)
+3. **Opportunities** third (can link to Companies and People)
+4. **Tasks/Notes** (can link to any of the above)
+5. **Custom objects** (following their dependencies)
+
+## Best Practices
+
+### Batch Your Requests
+
+* Don't send records one at a time
+* Group up to **60 records per API call**
+* This maximizes throughput within rate limits
+
+### Handle Rate Limits
+
+* Implement delays between requests (600ms minimum for sustained imports)
+* Use exponential backoff when you hit limits
+* Monitor for 429 (Too Many Requests) responses
+
+### Validate Data First
+
+* Clean and validate your data before importing
+* Check required fields are populated
+* Verify formats match Twenty's requirements (see [Field Mapping](/l/zh/user-guide/data-migration/capabilities/field-mapping))
+
+### Log Everything
+
+* Log every record imported (including IDs)
+* Log errors with full context
+* This helps debug issues and verify completion
+
+### Test First
+
+* Test with a small batch (10-20 records)
+* Verify data appears correctly in Twenty
+* Then run the full import
+
+### Upsert to Avoid Duplicates
+
+The GraphQL API supports **batch upsert** — update if the record exists, create if not. This prevents duplicates when re-running imports.
+
+## Finding Object and Field Names
+
+To see available objects and fields:
+
+1. Go to **Settings → API and Webhooks**
+2. Browse the **Metadata API**
+3. View all standard and custom objects with their fields
+
+The documentation shows all standard and custom objects, their fields, and the expected data types.
+
+## Professional Services
+
+For complex API migrations, our partners can help:
+
+| Service | What's Included |
+| ----------------------- | ---------------------------------- |
+| **Data Model Design** | design your optimal data structure |
+| **Migration Scripts** | write and run the import scripts |
+| **Data Transformation** | handle complex mapping and cleanup |
+| **Validation & QA** | verify the migration is complete |
+
+**Best for:**
+
+* Migrations of 100,000+ records
+* Complex data transformations
+* Tight timelines
+* Teams without developer resources
+
+Contact us at [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/zh/user-guide/getting-started/capabilities/implementation-services).
+
+## FAQ
+
+
+
+ GraphQL lets you request exactly the data you need in a single query and is better for complex operations. REST uses standard HTTP methods (GET, POST, PUT, DELETE) and may be more familiar if you've worked with traditional APIs.
+
+
+
+ Yes! Use update mutations (GraphQL) or PUT/PATCH requests (REST) with the record's `id`.
+
+
+
+ Query for existing records first using unique identifiers (email, domain). Update if exists, create if not.
+
+
+
+ Yes, use delete mutations (GraphQL) or DELETE requests (REST).
+
+
+
+ Not currently, but both APIs work with any HTTP client in any language.
+
+
+
+## API Documentation
+
+For full implementation details, code examples, and schema reference:
+
+* [API Documentation](/l/zh/developers/extend/capabilities/apis)
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx
new file mode 100644
index 0000000000..e61afe08ee
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx
@@ -0,0 +1,228 @@
+---
+title: Import Relations Between Objects via CSV
+description: Complete step-by-step guide to linking records during CSV import.
+---
+
+## Overview
+
+This guide walks you through importing relations between objects—for example, linking People to Companies, or Opportunities to People.
+
+**What can be imported:** Only one-to-many relations pointing to a single object type. Relations pointing to multiple object types (like Notes linking to People AND Companies) are not yet supported for import.
+
+## Understanding Relations
+
+### What is a "One-to-Many" Relation?
+
+In a one-to-many relation:
+
+* **One** Company has **many** People (employees)
+* **One** Company has **many** Opportunities
+* **One** Person has **many** Tasks
+
+The "one" side is the **parent**. The "many" side is the **child**.
+
+### Common Relations in Twenty
+
+| Relation | "One" Side (Parent) | "Many" Side (Child) |
+| ------------------------- | ------------------- | ------------------- |
+| Companies → People | Company | People |
+| Companies → Opportunities | Company | Opportunities |
+| People → Tasks | Person | Tasks |
+| People → Notes | Person | Notes |
+
+## Step 1: Identify the "One" and "Many" Sides
+
+Before importing, determine which object is the parent and which is the child.
+
+**Ask yourself:** "Does ONE [Object A] have MANY [Object B]?"
+
+* One Company → Many People ✓ (Company is parent)
+* One Person → Many Companies ✗ (This is wrong—a person belongs to one company)
+
+## Step 2: Import the Parent Records First
+
+The parent ("one" side) must exist in Twenty before you can reference it.
+
+**Import order:**
+
+1. **Companies** first (no dependencies)
+2. **People** second (link to Companies)
+3. **Opportunities** third (link to Companies and/or People)
+4. **Tasks/Notes** (link to any of the above)
+
+
+ **If the parent record doesn't exist, the import will fail.**
+
+ Always verify that Companies are imported before importing People with company references.
+
+
+## Step 3: Note the Parent's Unique Identifier
+
+You need to reference the parent record using a **unique identifier**. Available options:
+
+| Parent Object | Available Unique Identifiers |
+| --------------------- | --------------------------------------------------------------- |
+| **Companies** | `id` (UUID), `domain` (recommended), or any custom unique field |
+| **People** | `id` (UUID), `email`, or any custom unique field |
+| **Workspace Members** | `id` (UUID), `email` (not name) |
+| **Custom Objects** | `id` (UUID), or any field marked as unique |
+
+**Recommended:** Use `domain` for Companies and `email` for People. These are human-readable and easy to verify in your spreadsheet.
+
+### Finding the Identifier
+
+If you need the `id`:
+
+1. Export the parent records from Twenty
+2. The export includes the `id` column
+3. Use these IDs in your child records file
+
+## Step 4: Verify the Relation Field Exists
+
+Before importing, ensure the relation field exists between your objects.
+
+**To check or create:**
+
+1. Go to **Settings → Data Model**
+2. Select your child object (e.g., People)
+3. Look for a relation field pointing to the parent (e.g., Company)
+4. If it doesn't exist, create it:
+ * Click **+ Add field**
+ * Select **Relation** type
+ * Choose the parent object
+
+## Step 5: Prepare Your CSV File
+
+Add a column to your child CSV that references the parent using its unique identifier.
+
+### Example: People Linking to Companies
+
+**Your People CSV:**
+
+```csv
+firstName,lastName,email,jobTitle,companyDomain
+John,Smith,john@acme.com,CEO,https://acme.com
+Jane,Doe,jane@widgets.co,CTO,https://widgets.co
+Bob,Johnson,bob@techstart.io,Developer,https://techstart.io
+```
+
+The `companyDomain` column references the Company's domain.
+
+### Format Requirements
+
+| Identifier | Format | Example |
+| ---------- | -------------- | -------------------------------------- |
+| Domain | URL format | `https://acme.com` |
+| Email | Standard email | `john@acme.com` |
+| ID | UUID | `c776ee49-f608-4a77-8cc8-6fe96ae1e43f` |
+
+
+ **Domain format matters!**
+
+ Use `https://domain.com` (not just `domain.com`). This matches how Twenty stores Company domains and prevents matching errors.
+
+
+### Important Rules
+
+1. **Exact match required** — the value must exactly match the parent record
+2. **Map only ONE unique identifier** — don't include both `companyId` AND `companyDomain`
+3. **Case sensitive** — `Acme.com` ≠ `acme.com`
+
+## Step 6: Upload and Map the Relation
+
+1. Navigate to the child object (e.g., People)
+2. Click **⋮** → **Import records**
+3. Upload your CSV file
+4. In the field mapping step:
+ * Find your relation column (e.g., `companyDomain`)
+ * Map it to the **Company** relation field
+5. Complete the remaining mapping
+6. Review errors and confirm
+
+Twenty will automatically link each child record to the matching parent.
+
+## Step 7: Verify the Import
+
+After importing:
+
+1. Open a few child records (e.g., People)
+2. Verify the relation field shows the correct parent (e.g., Company)
+3. Open a parent record and check the related records section
+
+## Common Mistakes to Avoid
+
+| Mistake | Problem | Solution |
+| -------------------------- | -------------------------------------------------- | ------------------------------------------------------- |
+| **Wrong import order** | Importing People before Companies | Always import parents first, then children |
+| **Wrong domain format** | Using `acme.com` instead of `https://acme.com` | Use full URL format with `https://` |
+| **Multiple unique fields** | Mapping both `companyId` AND `companyDomain` | Map only ONE unique identifier |
+| **Missing relation field** | The relation field doesn't exist in the data model | Create it in **Settings → Data Model** before importing |
+| **Non-existent records** | The parent record doesn't exist in Twenty | Import parent records first, or check for typos |
+| **Case mismatch** | `Acme.com` in file but `acme.com` in Twenty | Ensure exact case matching |
+
+## Linking to Workspace Members
+
+When linking to Workspace Members (your team):
+
+* Use their **email address**, not their name
+* Example: `owner@yourcompany.com`, not "John Smith"
+
+```csv
+taskName,assignedTo
+Follow up with client,john@yourcompany.com
+Review proposal,jane@yourcompany.com
+```
+
+## FAQ
+
+
+
+ You have two options:
+
+ 1. Use the Twenty `id` (export parent records to get their IDs)
+ 2. Create a custom unique field in your data model to store an external ID from your previous system
+
+
+
+ Yes! Include the child record's unique identifier (e.g., `email` for People) and the new relation value. The import will update the relation.
+
+
+
+ Many-to-Many relations are not yet supported for import. This is planned for H1 2026.
+
+
+
+ Relations pointing to multiple object types are not yet supported for import/export. This is on our roadmap.
+
+
+
+ The import will show an error for that row. You can either:
+
+ * Import the parent record first, then re-import
+ * Fix the reference value
+ * Remove the row from import
+
+
+
+ Common causes:
+
+ * Wrong format (use `https://domain.com` for domains)
+ * Case mismatch (check exact spelling)
+ * Parent doesn't exist (import parents first)
+ * Mapping multiple identifiers (use only one)
+
+
+
+
+ **Remember: Soft-deleted records count toward uniqueness.**
+
+ If you're getting "not found" errors but the record seems to exist, check Command Menu → See deleted records. The parent may have been soft-deleted.
+
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/zh/user-guide/data-migration/how-tos/fix-import-errors)
+* [Import Relations Capabilities](/l/zh/user-guide/data-migration/capabilities/import-relations)
+* [Uniqueness Constraints](/l/zh/user-guide/data-migration/capabilities/uniqueness-constraints)
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
new file mode 100644
index 0000000000..b83422558b
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/migrating-from-other-crms.mdx
@@ -0,0 +1,293 @@
+---
+title: Migrating from Other CRMs
+description: Step-by-step guide to migrate your data from any CRM to Twenty.
+---
+
+## Overview
+
+This guide walks you through migrating your data from any CRM to Twenty. The process involves auditing your data, preparing your Twenty workspace, exporting from your current system, and importing into Twenty.
+
+Views, workflows, and permissions must be recreated manually after migration. Plan time for this configuration work.
+
+## Step 1: Audit Your Current Data
+
+Migration is an opportunity for a fresh start. Don't bring over clutter.
+
+**What to keep:**
+
+* Active contacts and companies
+* Open opportunities and deals
+* Important notes and activities
+* Custom fields you actually use
+
+**What to leave behind:**
+
+* Outdated contacts (no activity in 2+ years)
+* Duplicate records
+* Test data
+* Unused custom fields
+
+## Step 2: Map Your Data Model
+
+Create a mapping document between your current CRM and Twenty:
+
+| Your CRM | Twenty |
+| ---------------------- | -------------------- |
+| Account / Organization | **Company** |
+| Contact / Person | **People** |
+| Deal / Opportunity | **Opportunity** |
+| Activity | **Task** or **Note** |
+| Custom Object | **Custom Object** |
+
+**For each field, document:**
+
+* The source field name
+* The target Twenty field
+* Any format transformations needed (dates, phone numbers, etc.)
+
+Keep this mapping document handy during import—you'll reference it when mapping columns.
+
+## Step 3: Set Up Your Twenty Workspace
+
+Before importing data, prepare your Twenty workspace:
+
+### Create Custom Objects and Fields
+
+1. Go to **Settings → Data Model**
+2. Create any custom objects you need
+3. Add custom fields to standard and custom objects
+4. Configure field settings (unique, required, select options, etc.)
+
+
+ **Fields must exist before import.**
+
+ The CSV import creates records, not fields. Create all custom fields in Settings → Data Model before importing.
+
+
+### Invite Your Team
+
+
+ **Invite users BEFORE importing data.**
+
+ If your data includes user references (Account Owner, Assignee, etc.), those users must exist in Twenty before import. Otherwise, those relations cannot be mapped.
+
+
+1. Go to **Settings → Members**
+2. Invite all team members
+3. **Wait for everyone to accept** their invitation
+4. Verify all users appear in your Members list
+
+## Step 4: Export from Your Current CRM
+
+Export your data from your current CRM:
+
+1. Look for an **Export** function (usually under Settings, Data Management, or Admin)
+2. Export to **CSV format** when possible
+3. Export each object type separately (Companies, Contacts, Deals, etc.)
+4. Include all fields you want to migrate
+
+**Export these objects (in this order for reference):**
+
+1. Companies / Accounts / Organizations
+2. Contacts / People
+3. Deals / Opportunities
+4. Notes and Activities
+5. Custom objects
+
+## Step 5: Clean and Format Your Data
+
+Open each exported CSV in a spreadsheet application and prepare it for Twenty.
+
+### Remove Duplicates
+
+1. Sort by the unique field (email for People, domain for Companies)
+2. Remove or merge duplicate rows
+3. Verify no duplicates exist in Twenty already
+
+### Format Fields Correctly
+
+| Field Type | Required Format |
+| ----------------- | ------------------------------------------------- |
+| **Domain** | `https://domain.com` |
+| **Email** | `name@domain.com` (must be unique) |
+| **Date** | `YYYY-MM-DD` |
+| **Phone** | Three columns: Number, Country Code, Calling Code |
+| **Boolean** | `TRUE` or `FALSE` (uppercase) |
+| **Select fields** | Use API names, not display labels |
+
+
+ **Domain format is critical.**
+
+ Use `https://domain.com` (not `domain.com` or `www.domain.com`). This matches Twenty's format and prevents duplicates when you connect email/calendar sync.
+
+
+See [How to Prepare Your CSV Files](/l/zh/user-guide/data-migration/how-tos/prepare-your-csv-files) for complete formatting requirements for all field types.
+
+### Add Relation Columns
+
+To link records (e.g., People to Companies), add a column with the parent's unique identifier.
+
+**Example: People CSV with Company link**
+
+```csv
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+See [How to Import Relations](/l/zh/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for detailed instructions on linking records.
+
+### Update User References
+
+If your data includes user assignments (Owner, Assignee):
+
+1. Add a column with the **user's email** (not just their ID from the old system)
+2. Use the same email addresses that users used to join your Twenty workspace
+
+See [How to Prepare Your CSV Files](/l/zh/user-guide/data-migration/how-tos/prepare-your-csv-files) for complete formatting guide.
+
+## Step 6: Import to Twenty
+
+
+ **Import Order Matters!**
+
+ Always import in this order:
+
+ 1. **Companies** first (no dependencies)
+ 2. **People** second (link to Companies)
+ 3. **Opportunities** third (link to Companies/People)
+ 4. **Notes and Tasks** (link to records)
+ 5. **Custom objects** following their dependencies
+
+ The parent record must exist before you can reference it.
+
+
+### Import Each Object
+
+For each CSV file, in order:
+
+1. Navigate to the object in Twenty
+2. Click **⋮ → Import records**
+3. Upload the CSV file
+4. Map columns to fields:
+ * Map user email columns to the appropriate relation fields
+ * Map relation columns (like `companyDomain`) to relation fields
+5. Review and fix any errors in the UI
+6. Confirm the import
+7. Verify a few records before proceeding to the next file
+
+**Detailed guides:**
+
+* [How to Import Companies](/l/zh/user-guide/data-migration/how-tos/import-companies-via-csv)
+* [How to Import Contacts](/l/zh/user-guide/data-migration/how-tos/import-contacts-via-csv)
+* [How to Import Relations](/l/zh/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+
+## Step 7: Large Migrations (50,000+ Records)
+
+For large migrations:
+
+| Volume | Recommended Approach |
+| ----------------------- | ----------------------------- |
+| Under 10,000 records | Single CSV import |
+| 10,000 - 50,000 records | Split into multiple CSV files |
+| 50,000+ records | Use the API |
+
+**For API imports:**
+
+* Faster and more reliable for large datasets
+* Supports batch operations (up to 60 records per call)
+* See [How to Import Data via API](/l/zh/user-guide/data-migration/how-tos/import-data-via-api)
+
+## Step 8: Post-Migration Setup
+
+After importing data, complete your workspace configuration:
+
+### Recreate Views
+
+* Set up saved views with filters, sorts, and column configurations
+* Create any kanban or calendar views you need
+
+### Recreate Workflows
+
+* Rebuild your automations in **Settings → Workflows**
+* Start with the most critical workflows
+* Test each one before relying on it
+
+### Configure Roles and Permissions
+
+* Set up roles in **Settings → Roles**
+* Assign users to appropriate roles
+
+### Connect Email and Calendar
+
+* Each user connects their own account in **Settings → Accounts**
+* Twenty will start syncing emails to contact records
+* See [Email & Calendar](/l/zh/user-guide/calendar-emails/overview)
+
+### Train Your Team
+
+* Walk through the new interface together
+* Document any team-specific processes
+
+## Common Issues and Solutions
+
+| Issue | Cause | Solution |
+| ----------------------- | --------------------------- | ------------------------------------------------------------------------------------ |
+| **Duplicate errors** | Email/domain already exists | Remove duplicates from file, or include unique identifier to update existing records |
+| **Relation not found** | Parent record doesn't exist | Import parent objects first (Companies before People) |
+| **Missing fields** | Custom field doesn't exist | Create field in Settings → Data Model before importing |
+| **Select field errors** | Using display labels | Use API names (enable Advanced mode in Settings to find them) |
+| **User relation empty** | User hasn't accepted invite | Ensure all users accept invitations before importing |
+
+See [How to Fix Import Errors](/l/zh/user-guide/data-migration/how-tos/fix-import-errors) for detailed troubleshooting steps.
+
+## Post-Migration Checklist
+
+### Data Integrity
+
+All records imported (compare counts with source system)
+Relations working correctly (People linked to Companies)
+User assignments mapped correctly (Owner, Assignee)
+Custom fields populated
+No unexpected duplicates
+
+### Configuration
+
+Views recreated
+Workflows recreated and tested
+Roles and permissions configured
+Email/calendar sync connected
+
+### Team Readiness
+
+Team trained on new system
+Old CRM access plan decided (keep for reference? When to disable?)
+
+## FAQ
+
+
+
+ Not currently. Workflows must be recreated manually in Twenty.
+
+
+
+ File attachments are not included in CSV exports. You'll need to re-upload them manually, migrate via API, or contact our team for assistance.
+
+
+
+ Yes, we recommend keeping your old CRM running until you've verified the migration is complete. Just be careful not to create new data in both places.
+
+
+
+ Depends on data volume and complexity. Small migrations (under 10,000 records) can be done in a few hours. Large migrations may take several days including data cleanup and testing.
+
+
+
+## Need Help?
+
+For complex migrations or large datasets:
+
+* **Guided setup:** Book a 4-hour onboarding pack
+* **Full migration service:** Our partners can handle the entire migration
+
+Contact [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/zh/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx
new file mode 100644
index 0000000000..07fdbdaa70
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud.mdx
@@ -0,0 +1,171 @@
+---
+title: Migrating from Self-Hosted to Cloud
+description: Step-by-step guide to migrate your Twenty self-hosted instance to Twenty Cloud.
+---
+
+## Overview
+
+This guide walks you through migrating your data from a Twenty self-hosted instance to Twenty Cloud. The process involves setting up your cloud workspace, exporting your data, and re-importing it.
+
+Views, workflows, and roles must be recreated manually after migration. Plan time for this configuration work.
+
+## Step 1: Create Your Cloud Workspace
+
+1. Go to [app.twenty.com](https://app.twenty.com) and create a new workspace
+2. Complete the initial setup wizard
+3. Note your new workspace URL
+
+## Step 2: Recreate Your Data Model
+
+Before importing data, recreate your custom objects and fields:
+
+1. Go to **Settings → Data Model** in your cloud instance
+2. Create custom objects that match your self-hosted setup
+3. Add custom fields to standard and custom objects
+4. Configure field settings (unique, required, etc.)
+
+Take screenshots of your self-hosted data model for reference, or keep both instances open side by side.
+
+## Step 3: Invite All Users
+
+
+ **Critical: Invite users BEFORE importing data.**
+
+ Users must accept their invitations before you import any records that reference them (like Account Owner fields). If users don't exist yet, those relations cannot be mapped.
+
+
+1. Go to **Settings → Members** in your cloud instance
+2. Invite all team members who had accounts on self-hosted
+3. **Wait for everyone to accept** their invitation
+4. Verify all users appear in your Members list
+
+## Step 4: Export Data from Self-Hosted
+
+Export each object from your self-hosted instance:
+
+1. Navigate to each object (Companies, People, Opportunities, etc.)
+2. Configure the view to show **all columns** you want to migrate
+3. Click **⋮ → Export view**
+4. Save each CSV file with a clear name (e.g., `companies-export.csv`)
+
+**Export in this order** (for reference when importing):
+
+1. Companies
+2. People
+3. Opportunities
+4. Custom objects (following their dependencies)
+5. Tasks, Notes
+
+## Step 5: Update Workspace Member References
+
+The exported CSVs contain user IDs from your self-hosted instance. These IDs won't match your cloud instance, so you need to replace them with emails.
+
+**For each CSV file with user references (Owner, Assignee, etc.):**
+
+1. Open the CSV in a spreadsheet application
+2. Add a new column next to each user ID column (e.g., `accountOwnerEmail` next to `accountOwnerId`)
+3. Fill in the **email address** of each user
+4. You can delete the old ID column or leave it (it will be skipped during import)
+
+**Example:**
+
+Before:
+
+```csv
+name,domain,accountOwnerId
+Acme Corp,https://acme.com,old-uuid-123
+```
+
+After:
+
+```csv
+name,domain,accountOwnerEmail
+Acme Corp,https://acme.com,john@yourcompany.com
+```
+
+Use the same email addresses that users used to accept their cloud workspace invitation.
+
+## Step 6: Plan Your Import Order
+
+Import files in the correct order to maintain relationships:
+
+1. **Companies** first (no dependencies)
+2. **People** second (link to Companies)
+3. **Opportunities** third (link to Companies and People)
+4. **Custom objects** (following their dependencies)
+5. **Tasks and Notes** last (link to other records)
+
+See [How to Import Relations](/l/zh/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for details on maintaining relationships.
+
+## Step 7: Import to Cloud
+
+For each CSV file, in order:
+
+1. Navigate to the object in your cloud instance
+2. Click **⋮ → Import records**
+3. Upload the CSV file
+4. Map columns to fields:
+ * Map user email columns to the appropriate relation fields
+ * Map other columns as usual
+5. Review and fix any errors
+6. Confirm the import
+7. Verify a few records before proceeding to the next file
+
+## Step 8: Recreate Configuration
+
+After importing data, manually recreate:
+
+### Views
+
+* Recreate saved views with filters, sorts, and column configurations
+* Set up any kanban or calendar views
+
+### Workflows
+
+* Recreate automations in **Settings → Workflows**
+* Test each workflow before relying on it
+
+### Roles and Permissions
+
+* Configure roles in **Settings → Roles**
+* Assign users to appropriate roles
+
+### Integrations
+
+* Reconnect email and calendar sync for each user
+* Reconfigure any API integrations with new API keys
+
+## Post-Migration Checklist
+
+All data imported successfully
+Relations between objects working correctly
+User assignments (Owner, Assignee) mapped correctly
+Views recreated
+Workflows recreated and tested
+Roles and permissions configured
+Email/calendar sync reconnected
+API integrations updated with new keys
+
+## FAQ
+
+
+
+ Not currently. Workflows must be recreated manually in your cloud instance.
+
+
+
+ File attachments are not included in CSV exports. You'll need to re-upload any attachments manually, migrate them via API or contact our team for assistance with large migrations.
+
+
+
+ Yes, we recommend keeping your self-hosted instance running until you've verified the cloud migration is complete. Just be careful not to create new data in both places.
+
+
+
+ Records referencing that user will fail to import or the relation will be empty. Ensure all users accept invitations before importing data.
+
+
+
+## Need Help?
+
+For complex migrations or large datasets, contact us at [contact@twenty.com](mailto:contact@twenty.com) or explore our [Implementation Services](/l/zh/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
new file mode 100644
index 0000000000..49f5a7054c
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/prepare-your-csv-files.mdx
@@ -0,0 +1,270 @@
+---
+title: Prepare Your CSV Files
+description: Complete step-by-step guide to format your data for import into Twenty.
+---
+
+## Overview
+
+This guide walks you through preparing your CSV file for a successful import. Follow these steps in order to avoid errors.
+
+## Step 1: Check File Requirements
+
+Before you start, ensure your file meets these requirements:
+
+| Requirement | Details |
+| -------------- | ------------------------ |
+| **Format** | CSV, XLSX, or XLS |
+| **Size limit** | 10,000 records per file |
+| **Encoding** | UTF-8 recommended |
+| **Structure** | One object type per file |
+
+For datasets larger than 10,000 records, split into multiple files or use the [API import](/l/zh/user-guide/data-migration/how-tos/import-data-via-api).
+
+## Step 2: Download the Sample File
+
+**This is the most important step.** The sample file shows you the exact column names and format Twenty expects.
+
+1. Go to the object view (People, Companies, etc.)
+2. Click **⋮** → **Import records**
+3. Click **Download sample file**
+4. Use this file as your template
+
+**Pro tip:** Export a few existing records instead. This gives you real examples of how data should be formatted, and the column names will map automatically during import.
+
+## Step 3: Remove Duplicate Values
+
+Twenty enforces uniqueness on certain fields. Duplicates will cause import errors.
+
+| Object | Unique Fields |
+| ------------------ | ----------------------------------------- |
+| **People** | `id`, `email` |
+| **Companies** | `id`, `domain` |
+| **Custom objects** | `id`, plus any field you marked as unique |
+
+**Before importing:**
+
+1. Sort your spreadsheet by the unique field (email or domain)
+2. Remove or merge duplicate rows
+3. Check for duplicates that already exist in Twenty
+
+**Soft-deleted records count toward uniqueness.** Records in Command Menu → See deleted records will cause duplicate errors. Delete them permanently or restore and update them.
+
+## Step 4: Format Each Field Type Correctly
+
+Different field types require specific formats. Here's the complete reference:
+
+### Text Fields
+
+* No special formatting required
+* Leading/trailing spaces are automatically trimmed
+
+### Email Fields
+
+* Must be valid email format: `name@domain.com`
+* Must be unique (no duplicates in file or in Twenty)
+* For additional emails, use this format in the **Emails / Additional Emails** column:
+
+```
+["jane@twenty.com","jane.doe@twenty.com"]
+```
+
+### Domain Fields
+
+* **Recommended format**: `https://domain.com`
+* This matches the format used by mailbox/calendar sync (prevents duplicates)
+* Fill both columns:
+ * **Domain / Domain Label**: `domain.com`
+ * **Domain / Domain URL**: `https://domain.com`
+* Must be unique within your file and in Twenty
+
+### Phone Fields
+
+Phone is a **nested field** requiring multiple columns:
+
+| Column | Example |
+| --------------------------------------- | ------------ |
+| **Phones / Primary Phone Number** | `4159095555` |
+| **Phones / Primary Phone Country Code** | `US` |
+| **Phones / Primary Phone Calling Code** | `+1` |
+
+### Address Fields
+
+Address is a **nested field** with multiple columns (some can be left empty):
+
+* **Address / Address 1**: Street address line 1
+* **Address / Address 2**: Street address line 2 (optional)
+* **Address / City**: City name
+* **Address / State**: State or province
+* **Address / Country**: Country name
+* **Address / Post Code**: Postal/ZIP code
+
+### Date Fields
+
+Use consistent formatting throughout your file:
+
+* `YYYY-MM-DD` (recommended): `2024-03-15`
+* `MM/DD/YYYY`: `03/15/2024`
+* `DD/MM/YYYY`: `15/03/2024`
+* ISO 8601: `2024-03-15T10:30:00Z`
+
+### Number Fields
+
+* Numbers only (no text)
+* Use period for decimals: `1234.56`
+* No thousands separators (not `1,234.56`)
+
+### Currency Fields
+
+Currency is a **nested field** requiring two columns that **both must be filled**:
+
+| Column | Example |
+| --------------------- | --------- |
+| **Amount / Amount** | `1234.56` |
+| **Amount / Currency** | `USD` |
+
+### Boolean Fields
+
+Use uppercase: `TRUE` or `FALSE`
+
+Lowercase `true` or `false` will not work.
+
+### Select Fields
+
+Use the **API name** of the option, not the display label.
+
+**How to find API names:**
+
+1. Go to **Settings → Data Model**
+2. Select the object and field
+3. Enable **Advanced mode** (toggle at bottom right)
+4. Copy the API name (e.g., `OPTION_1`, not "Option 1")
+
+New select options are not created automatically. Add them in **Settings → Data Model** before importing.
+
+### Multi-Select Fields
+
+Use API names in array format:
+
+```
+["VALUE1","VALUE2"]
+```
+
+### Array Fields
+
+Use JSON array format:
+
+```
+["value1","value2"]
+```
+
+### Rating Fields
+
+Use the format: `RATING_1`, `RATING_2`, `RATING_3`, `RATING_4`, or `RATING_5`
+
+### Links/URL Fields
+
+Fill both columns:
+
+* **Links / Link Label**: `Twenty`
+* **Links / Link URL**: `https://twenty.com`
+
+For secondary links, use the **Links / Secondary Links** column:
+
+```
+[{"url":"https://twenty.com","label":"Twenty"}]
+```
+
+### JSON Fields
+
+Use valid JSON format:
+
+```
+{"key":"value","key2":"value2"}
+```
+
+### ID Fields
+
+* **Optional**: Twenty auto-generates IDs if not provided
+* **Format**: UUID (e.g., `c776ee49-f608-4a77-8cc8-6fe96ae1e43f`)
+* **Use case**: Include ID to update existing records instead of creating new ones
+
+## Step 5: Add Relation Columns (If Linking Records)
+
+To link records to other objects (e.g., People to Companies), add a column with the unique identifier of the related record.
+
+**Example**: Linking People to Companies
+
+Add a column to your People CSV:
+
+```
+firstName,lastName,email,companyDomain
+John,Smith,john@acme.com,https://acme.com
+Jane,Doe,jane@widgets.co,https://widgets.co
+```
+
+**Important rules for relations:**
+
+* The parent record must already exist in Twenty
+* Use the **Domain URL** format (`https://domain.com`), not the label
+* Map only ONE unique identifier (don't include both `companyId` AND `companyDomain`)
+* For Workspace Members, use their **email** (not name)
+
+
+ **Import Order Matters!**
+
+ Import the "one" side before the "many" side:
+
+ 1. **Companies** first
+ 2. **People** second (with company reference)
+ 3. **Opportunities** third
+
+ The parent record must exist before you can reference it.
+
+
+See [How to Import Relations](/l/zh/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for detailed instructions.
+
+## Step 6: Ensure Fields Exist in Twenty
+
+The import creates **records**, not **fields**. All fields you want to import must already exist in your data model.
+
+**Before importing:**
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Create any custom fields you need
+4. Note the exact field names (they must match your column headers)
+
+## Step 7: Final Checklist
+
+Before uploading your file, verify:
+
+File is CSV, XLSX, or XLS format
+File has fewer than 10,000 records
+Encoding is UTF-8
+No duplicate emails (for People) or domains (for Companies)
+Dates use consistent format throughout
+Domains use `https://domain.com` format
+Boolean fields use `TRUE` or `FALSE` (uppercase)
+Select fields use API names, not display labels
+All custom fields exist in Settings → Data Model
+Parent records imported before child records
+Relation columns reference existing records
+
+## Common Mistakes to Avoid
+
+| Mistake | Solution |
+| -------------------------------------------- | ------------------------------------- |
+| Using `true` instead of `TRUE` | Boolean values must be uppercase |
+| Using display labels for Select fields | Find and use API names in Settings |
+| Importing People before Companies | Always import parent objects first |
+| Missing currency code for Currency fields | Fill both Amount and Currency columns |
+| Wrong domain format | Use `https://domain.com` consistently |
+| Mapping multiple unique fields for relations | Map only ONE (domain OR id, not both) |
+
+## Next Steps
+
+Your file is ready! Now:
+
+* [Import Companies](/l/zh/user-guide/data-migration/how-tos/import-companies-via-csv) (import these first)
+* [Import Contacts](/l/zh/user-guide/data-migration/how-tos/import-contacts-via-csv)
+* [Fix any import errors](/l/zh/user-guide/data-migration/how-tos/fix-import-errors)
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx
new file mode 100644
index 0000000000..e373540115
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/how-tos/update-existing-records-via-import.mdx
@@ -0,0 +1,198 @@
+---
+title: Update Existing Records via Import
+description: Complete step-by-step guide to bulk updating records using CSV import.
+---
+
+## Overview
+
+Need to update many records at once? Instead of editing them one by one, use the CSV import to bulk update existing records.
+
+**Use cases:**
+
+* Update job titles for multiple people
+* Change company information in bulk
+* Add data to new custom fields
+* Correct data errors across many records
+
+## How It Works
+
+When you import a file containing a **unique identifier** that matches an existing record, Twenty updates that record instead of creating a duplicate.
+
+| If unique identifier... | Twenty will... |
+| -------------------------- | ------------------------------------------------ |
+| Matches an existing record | **Update** the existing record |
+| Doesn't match any record | **Create** a new record |
+| Is missing from your file | **Create** a new record (with auto-generated ID) |
+
+
+ **Multi-Select fields are overwritten, not merged.**
+
+ If a record has `Option A` and `Option B` selected, and you import `["Option C"]`, the record will only have `Option C` after import. The import replaces all previous selections—it does not add to them.
+
+ To keep existing values, include them all in your import: `["Option A","Option B","Option C"]`
+
+
+## Step 1: Export Your Current Data
+
+First, export the records you want to update:
+
+1. Navigate to the object (People, Companies, etc.)
+2. **Add the columns you need** — click **Options → Fields** to show the fields you want to update
+3. **Filter if needed** — narrow down to only the records you want to update
+4. Click **⋮** → **Export view**
+5. Save the CSV file
+
+**Why export first?** The exported file has the correct format, includes unique identifiers, and maps automatically during import.
+
+### What Gets Exported
+
+* All visible columns in your current view
+* The record's unique identifiers (`id`, `email`, `domain`)
+* Current field values you can modify
+
+## Step 2: Edit the CSV File
+
+Open the exported file in your spreadsheet application (Excel, Google Sheets, etc.):
+
+1. **Keep the unique identifier column** — don't delete `id`, `email`, or `domain`
+2. **Update the values** in the columns you want to change
+3. **Remove columns you don't need to update** (optional, but cleaner)
+4. **Don't change unique identifier values** — or Twenty will create new records
+
+### Example: Updating Job Titles
+
+**Exported file:**
+
+```csv
+id,email,firstName,lastName,jobTitle
+550e8400-e29b-41d4-a716-446655440001,john@acme.com,John,Smith,Sales Rep
+550e8400-e29b-41d4-a716-446655440002,jane@acme.com,Jane,Doe,Sales Rep
+550e8400-e29b-41d4-a716-446655440003,bob@acme.com,Bob,Johnson,Sales Rep
+```
+
+**After your edits:**
+
+```csv
+id,email,firstName,lastName,jobTitle
+550e8400-e29b-41d4-a716-446655440001,john@acme.com,John,Smith,Account Executive
+550e8400-e29b-41d4-a716-446655440002,jane@acme.com,Jane,Doe,Senior Account Executive
+550e8400-e29b-41d4-a716-446655440003,bob@acme.com,Bob,Johnson,Account Executive
+```
+
+
+ **Don't change the unique identifier values.**
+
+ If you change `john@acme.com` to `john.smith@acme.com`, Twenty will create a new record instead of updating the existing one.
+
+
+## Step 3: Import the Updated File
+
+1. Navigate to the object
+2. Click **⋮** → **Import records**
+3. Upload your edited CSV file
+4. **Ensure the unique identifier is mapped** — verify `email`, `domain`, or `id` is mapped correctly
+5. Review the field mappings
+6. Check for errors
+7. Click **Confirm**
+
+Twenty matches records by the unique identifier and updates them with new values.
+
+## Choosing the Right Unique Identifier
+
+| Object | Recommended | Alternative | Notes |
+| ------------------ | ---------------- | ----------- | ---------------------------- |
+| **People** | `email` | `id` | Email is human-readable |
+| **Companies** | `domain` | `id` | Domain is human-readable |
+| **Custom objects** | Any unique field | `id` | Use your custom unique field |
+
+**Use only ONE unique identifier.** Don't map both `email` AND `id`. This can cause confusion and errors.
+
+### Using Custom Unique Fields
+
+If you have a custom field marked as unique (like an external ID from another system):
+
+1. Include that field in your export and import
+2. Map it during import
+3. Twenty will match on that field
+
+## Step 4: Verify the Updates
+
+After importing:
+
+1. Open a few updated records
+2. Verify the changes were applied
+3. Check that no duplicate records were created
+
+## What About Fields Not in Your File?
+
+**Fields not included in your import file remain unchanged.**
+
+| Your file includes... | Result |
+| ---------------------------- | ------------------------------------------------------ |
+| `email`, `jobTitle` | Only `jobTitle` is updated; other fields stay the same |
+| `email`, `jobTitle`, `phone` | `jobTitle` and `phone` are updated |
+
+This means you only need to include the fields you want to change (plus the unique identifier).
+
+## Combining Updates and New Records
+
+You can update existing records AND create new ones in the same import:
+
+```csv
+email,firstName,lastName,jobTitle
+john@acme.com,John,Smith,Senior Manager ← Updates existing (email matches)
+newperson@acme.com,New,Person,Analyst ← Creates new (email doesn't match)
+```
+
+## Common Mistakes to Avoid
+
+| Mistake | Problem | Result | Solution |
+| ------------------------------ | ------------------------------------------------------- | -------------------------------------- | ----------------------------------------- |
+| **Changing unique identifier** | Changed `john@acme.com` to `john.smith@acme.com` | Creates new record instead of updating | Keep unique identifiers unchanged |
+| **Multiple unique fields** | Mapping both `email` AND `id` | Potential matching conflicts | Map only ONE unique identifier |
+| **No unique identifier** | File only has `firstName`, `lastName`, `jobTitle` | All rows create new records | Always include `email`, `domain`, or `id` |
+| **Case mismatch** | File has `John@acme.com` but Twenty has `john@acme.com` | Creates new record | Export from Twenty to get exact values |
+
+## FAQ
+
+
+
+ Records with unique identifiers that don't match existing records will be created as new records. This lets you update and create in the same import.
+
+
+
+ Yes, leave the cell empty in your CSV. The import will clear that field's value on the existing record.
+
+
+
+ Fields not in your import file remain unchanged on existing records. Only fields you include are updated.
+
+
+
+ Yes! Include the relation's unique identifier (e.g., `companyDomain`) and map it to the relation field. The relation will be updated.
+
+
+
+ During the import review step, Twenty shows you how many records will be updated vs. created based on unique identifier matches.
+
+
+
+ There's no automatic undo. We recommend exporting your data as a backup before making bulk updates.
+
+
+
+## Best Practices
+
+1. **Export first** — always start from an export to ensure correct format
+2. **Backup before updating** — export your data before making bulk changes
+3. **Test with a few records** — try updating 5-10 records first before doing a large batch
+4. **Use human-readable identifiers** — `email` and `domain` are easier to verify than `id`
+5. **Only include necessary columns** — fewer columns means less chance for errors
+
+## Troubleshooting
+
+Having issues? Check:
+
+* [How to Fix Import Errors](/l/zh/user-guide/data-migration/how-tos/fix-import-errors)
+* [Uniqueness Constraints](/l/zh/user-guide/data-migration/capabilities/uniqueness-constraints)
+* [Field Mapping Reference](/l/zh/user-guide/data-migration/capabilities/field-mapping)
diff --git a/packages/twenty-docs/l/zh/user-guide/data-migration/overview.mdx b/packages/twenty-docs/l/zh/user-guide/data-migration/overview.mdx
new file mode 100644
index 0000000000..3b6b782011
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-migration/overview.mdx
@@ -0,0 +1,89 @@
+---
+title: Data Migration
+description: Import and export your CRM data via CSV files or API.
+image: /images/user-guide/import-export-data/cloud.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+
+
+## Import Methods
+
+Twenty supports two main methods for importing data:
+
+| Method | Best For | Volume Limit |
+| -------------- | ------------------------------------ | ----------------------- |
+| **CSV Import** | Standard migrations, regular updates | 10,000 records per file |
+| **API Import** | Large-scale migrations, automation | Unlimited |
+
+For very large datasets (hundreds of thousands of records), use the API. Our [implementation partners](/l/zh/user-guide/getting-started/capabilities/implementation-services) can help run these scripts if needed.
+
+## CSV Import Basics
+
+You can import data for any object using CSV, XLSX, or XLS files. Each file should contain **only one type of object** (e.g., only People records).
+
+**Fields must exist before import.** Uploading a CSV creates records but does not create fields. If you need custom fields, create them first under **Settings → Data Model**.
+
+### Steps
+
+1. Navigate to the object where you want to import data
+2. Click the **⋮** icon on the top right (this is the Command Menu) and click on **Import records**
+3. Download the template file to ensure your data is in the expected format
+4. Upload your formatted CSV file
+5. Map your columns to Twenty fields
+6. Review errors (highlighted in yellow) and fix them, directly editing in the UI
+7. Confirm the import
+
+### Importing relations between objects
+
+You can import relations between objects using the csv import function. You need to reference the related object using a unique field from this object: the `id`, the `email` for People and Workspace Members, the `domain` for companies, any other field set as unique in the data model for any other object.
+
+**Deleted records count toward uniqueness.** Soft-deleted records (visible under Command Menu → See deleted records) are included in uniqueness checks. If you import a record with the same unique value as a deleted record, the deleted record will be restored.
+
+
+ **Import Order Matters!**
+
+ When importing related objects, upload files in this order:
+
+ 1. **Companies** first (the "one" side of relationships)
+ 2. **People** second (linked to companies via companyId)
+ 3. **Opportunities** third (linked to companies/people)
+ 4. **Custom objects** with relations last
+
+ Why? The "one" side of a one-to-many relationship must exist before you can reference it. For example, the Company record must exist before you import a Person with that company's ID.
+
+
+Please refer to [this article](/l/zh/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) for a step-by-step guide on how to proceed.
+
+## Export Data
+
+Export your workspace data for backups, reporting, or migration.
+
+### Steps
+
+1. Navigate to the object you want to export
+2. Configure the view with the columns you need
+3. Click **⋮** → **Export view**
+4. Save the CSV file
+
+**Only visible columns are exported.** The CSV file will only contain the columns displayed in your current view. Add or hide columns before exporting to control what data is included.
+
+**Export limits**: Up to 20,000 records per export.
+
+## Permissions
+
+Data import and export require specific permissions:
+
+* **Import**: Requires "Import CSV" permission
+* **Export**: Requires "Export CSV" permission
+
+Contact your workspace admin if you don't have these permissions.
+
+## Next Steps
+
+* [Prepare your CSV files](/l/zh/user-guide/data-migration/how-tos/prepare-your-csv-files)
+* [Import relations between objects](/l/zh/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+* [Import via API for large datasets](/l/zh/user-guide/data-migration/how-tos/import-data-via-api)
diff --git a/packages/twenty-docs/l/zh/user-guide/data-model/capabilities/fields.mdx b/packages/twenty-docs/l/zh/user-guide/data-model/capabilities/fields.mdx
new file mode 100644
index 0000000000..ef477158c2
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-model/capabilities/fields.mdx
@@ -0,0 +1,122 @@
+---
+title: Fields
+description: Understand the role of fields and how to manage them.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## About Fields
+
+Fields are like columns in a spreadsheet. They store different types of data like text, numbers, or dates. Fields can be standard (built-in) or custom (the ones you create).
+
+### Standard Fields
+
+Standard fields come built-in with Twenty to handle common business needs.
+
+For example, `First Name` and `Last Name` are standard fields in the `People` object. They store text data for individual names.
+
+You cannot delete standard fields, but you can deactivate them if you don't need them.
+
+You can also customize the options of the standard `SELECT` type fields, for example the options for the `Stage` on Opportunities.
+
+
+
+### Custom Fields
+
+Custom fields can be added to any object. You can store text, numbers, dates, dropdown selections, and more. Use custom fields to track information that's specific to your business.
+
+For instance, a custom field for SpaceX could be `Rocket Active Status`, indicating if a rocket is operational.
+
+
+
+## Field Types
+
+Twenty supports various field types:
+
+| Type | Description | Example |
+| ------------ | ----------------------------------------------------------------- | ------------------ |
+| Address | Structured address with street, city, state, country, postal code | Office Address |
+| Array | List of text values | Tags |
+| Boolean | True/false checkbox | Is Active |
+| Currency | Monetary value with currency code | Deal Amount (USD) |
+| Date | Date values | Close Date |
+| Date & Time | Date with time | Meeting Time |
+| Domain | Website domain (used for Companies) | acme.com |
+| Email | Email addresses (with primary + additional) | Contact Email |
+| JSON | Structured JSON data | Custom metadata |
+| Links | URLs with labels (primary + secondary) | Website, LinkedIn |
+| Long Text | Multi-line text | Description, Notes |
+| Multi-Select | Multiple choices from a predefined list | Tags, Categories |
+| Number | Numeric values (integers or decimals) | Quantity, Score |
+| Phone | Phone numbers with country code | Work Phone |
+| Rating | Star rating (1-5) | Priority, Score |
+| Relation | Links to records in other objects | Company → People |
+| Select | Single choice from a predefined list | Stage, Status |
+| Text | Single line of text | Name, Title |
+
+## Create a Custom Field
+
+To add a custom field to any object, follow these steps:
+
+1. Go to `Settings` in the left sidebar.
+2. Go to `Data Model`, then select the object you wish to customize.
+3. Proceed by clicking on `Add Field`.
+4. Choose a field name and type that suits your requirements. Consider adding a field description for better understanding.
+
+Your newly created field is now available within the application's fields. To display it on a specific view, click on the options menu, then select `Fields`.
+
+
+
+**Quick way:** Click the **+** button at the top right of any object table, then select `Customize fields`. This takes you directly to the Data Model settings.
+
+
+
+## Deactivate a Field
+
+You can deactivate a field to hide it from the app without losing your data. Think of it as hiding the field rather than deleting it.
+
+Here's how you can do it:
+
+1. Find the field you want to deactivate in your object settings.
+
+2. Click the three dots `⋮` next to the field to open the menu.
+
+3. Select `Deactivate` from the dropdown.
+
+
+
+What happens when you deactivate a field?
+
+1. **In the app:** The field disappears and you can't add new values to it.
+
+2. **Existing relationships:** If it's a relation field, existing connections stay but you can't create new ones.
+
+3. **API access:** You can still access the field and its data through the API.
+
+You can reactivate Standard and Custom Fields or have the option to permanently delete them.
+
+## Make Fields Unique
+
+Make a field unique to ensure distinct records cannot have the same value. For example, email addresses are unique for each person.
+
+If you get an error when setting uniqueness, check for duplicate values in your data (including deleted records).
+
+## Field Configuration Best Practices
+
+### Naming Conventions and Limitations
+
+* **Singular and plural named must be distinct**: Our GraphQL API needs distinct names for mutations
+* **Protected field names**: some names are reserved for system usage (e.g., `Type`, `Application`)
+
+### Currency and Phone Fields
+
+* **Default currency**: can be configured via the data model
+* **Default country codes**: can be configured for phone fields via the data model
+
+### Select Fields
+
+* **A default option can be selected** for each Select field
+
+### Record Text Fields
+
+* **Each object has one main display field**: This field appears in the leftmost column and represents the record when linked to other objects. It must be a text field. For example, People uses `Name` as the main field, so when you link a person to a company, you'll see their name in the company's view.
diff --git a/packages/twenty-docs/l/zh/user-guide/data-model/capabilities/objects.mdx b/packages/twenty-docs/l/zh/user-guide/data-model/capabilities/objects.mdx
new file mode 100644
index 0000000000..f2f1105277
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-model/capabilities/objects.mdx
@@ -0,0 +1,91 @@
+---
+title: Objects
+description: Learn about standard and custom objects in Twenty.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Standard Objects
+
+Standard objects are predefined entities in your workspace to help you get started. They're part of a shared data model accessible to all users of Twenty. You can use them as-is, customize them or deactivate them.
+
+
+
+### People
+
+The `People` object stores your contacts. It includes contact details and interaction history, so you can see all your customer interactions in one place.
+
+### Company
+
+The `Companies` object stores your business accounts. It includes details like industry, size and location. Companies connect to both `People` and `Opportunities` objects.
+
+### Opportunities
+
+The `Opportunities` object stores deal-related data. It tracks the progression of potential sales, from prospecting to closure, recording stages, deal sizes, associated account, and expected close date. You can view your sales pipeline in a kanban layout.
+
+### Notes
+
+The `Notes` object stores free-form notes that can be attached to People, Companies, Opportunities, and other records. Use notes to capture meeting summaries, important details, or any contextual information.
+
+### Tasks
+
+The `Tasks` object stores to-dos and action items. Tasks can be linked to People, Companies, Opportunities, and other records. Track due dates, assignees, and completion status to stay on top of your follow-ups.
+
+## Custom Objects
+
+Custom objects let you store information that's unique to your organization and that standard objects can't handle. For example, if you're SpaceX, you may want to create a custom object for Rockets and Launches.
+
+
+
+### Creating a New Custom Object
+
+To create a new custom object:
+
+1. Go to Settings in the sidebar on the left.
+2. Under Workspace, go to Data model. Here you'll be able to see an overview of all your existing Standard and Custom objects (both active and disabled).
+
+
+
+3. Click on `+ New object` at the top. Enter the name (both singular and plural), choose an icon, and add a description for your custom object and hit Save (at the top right). Using Listing as an example of custom object, the singular would be "listing" and the plural would be "listings" along with a description like "Listings that hosts created to showcase their property."
+
+4. Your custom object is now created and will appear in your sidebar. You can start adding records to it right away.
+
+## Managing Objects
+
+### Deactivating Objects
+
+If you don't need a standard or custom object:
+
+1. Go to Settings → Data Model
+2. Find the object you want to deactivate
+3. Click the toggle to deactivate it
+4. The object will be hidden from your workspace but data is preserved
+
+### Reactivating Objects
+
+To bring back a deactivated object:
+
+1. Go to Settings → Data Model
+2. Look for deactivated objects (they'll be grayed out)
+3. Click the toggle to reactivate it
+4. The object and all its data will be restored
+
+## Best Practices
+
+### When to Create Custom Objects
+
+* **Unique business entities**: Things specific to your industry or process
+* **Complex relationships**: When you need to track connections between multiple entities
+* **Scalable data**: When you might have many instances of something
+
+### When to Use Fields Instead
+
+* **Simple attributes**: Properties that describe existing objects
+* **Categories or labels**: Ways to classify existing records
+* **Single values**: Information that doesn't need its own lifecycle
+
+### Object Naming
+
+* **Use clear, descriptive names**: Make it obvious what the object represents
+* **Follow conventions**: Use singular for the object name, plural for the collection
+* **Consider your team**: Choose names everyone will understand
diff --git a/packages/twenty-docs/l/zh/user-guide/data-model/capabilities/relation-fields.mdx b/packages/twenty-docs/l/zh/user-guide/data-model/capabilities/relation-fields.mdx
new file mode 100644
index 0000000000..ddcd3c709e
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-model/capabilities/relation-fields.mdx
@@ -0,0 +1,92 @@
+---
+title: Relation Fields
+description: Connect records across different objects using relation fields.
+---
+
+## Types of Relations
+
+### One-to-Many
+
+One record in Object A can be linked to many records in Object B.
+
+**Example:** One Company can have many People (employees).
+
+### Many-to-One
+
+Many records in Object A can be linked to one record in Object B.
+
+**Example:** Many People can belong to one Company.
+
+### Relations to Multiple Object Types
+
+Some objects can link to multiple object types on one side of the relation.
+
+**Example:** A Note can be attached to one Person AND one Company AND one Opportunity simultaneously. The Note is on the "many" side, connecting to multiple "one" sides.
+
+
+
+Similarly, a Project (on the "one" side) could receive links from multiple People, multiple Companies, and multiple Notes.
+
+
+
+
+ **Import/Export limitation**: Relations pointing to multiple object types are not yet supported for CSV import/export. This is on our roadmap.
+
+
+### Many-to-Many
+
+Many records in Object A can be linked to many records in Object B.
+
+**Example:** Many People can be linked to many Projects, and vice versa.
+
+
+ **Many-to-Many is not yet supported.**
+
+ This relation type is planned for H1 2026. As a workaround, create an intermediate "junction" object (e.g., "Project Assignments") that has Many-to-One relations to both objects.
+
+
+## Creating a Relation Field
+
+1. Go to **Settings → Data Model**
+2. Select the object where you want to add the relation
+3. Click **+ Add Field**
+4. Select **Relation** as the field type
+5. Choose the target object(s) to relate to
+6. Configure the relation settings:
+ * **Field name on source object**: The name of the relation field on the object you're editing
+ * **Field name on destination object**: The name of the relation field that will appear on the target object
+ * Relation type (one-to-many, many-to-one)
+7. Click **Save**
+
+## Standard Relations
+
+Twenty comes with pre-built relations between standard objects:
+
+| From Object | To Object | Relation Type |
+| ------------- | --------- | ------------- |
+| People | Companies | Many-to-One |
+| Opportunities | Companies | Many-to-One |
+| Opportunities | People | Many-to-One |
+
+## Best Practices
+
+### Planning Relations
+
+* **Map your data model**: Plan relations before creating them
+* **Consider direction**: Think about which object "owns" the relationship
+* **Avoid circular dependencies**: Keep your data model clean
+
+### Naming Relations
+
+* **Use clear names**: Make it obvious what the relation represents
+* **Be consistent**: Use similar naming patterns across relations
+* **Consider both sides**: Name both sides of the relation appropriately
+
+### Performance
+
+* **Don't over-relate**: Too many relations can slow down your workspace
+
+## Limitations
+
+* **Deleting relations** removes the link but not the related records
+* **Circular relations** should be avoided for data integrity
diff --git a/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/create-custom-fields.mdx b/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/create-custom-fields.mdx
new file mode 100644
index 0000000000..61c35b86ab
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/create-custom-fields.mdx
@@ -0,0 +1,72 @@
+---
+title: Create Custom Fields
+description: Step-by-step guide to adding custom fields to any object.
+---
+
+Custom fields let you capture information specific to your business. Add them to any object—standard or custom.
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Select the object you want to add a field to
+3. Click **+ Add Field**
+4. Choose a **field type** (see [Fields](/l/zh/user-guide/data-model/capabilities/fields) for all types)
+5. Enter the **field name** and optional description
+6. Configure field-specific settings (see below)
+7. Click **Save**
+
+**Quick method:** Click the **+** at the end of column headers in any table view → **Customize fields**.
+
+## Show the Field in Views
+
+New fields aren't automatically visible. To display:
+
+1. Open the object's table view
+2. Click **Options → Fields**
+3. Click the **eye icon** next to your field to show it
+4. Drag to reorder
+
+## Configuration Options
+
+### For Select / Multi-Select
+
+1. Click **+ Add option** to create choices
+2. Set a **default option** if desired
+3. Drag to reorder options
+
+
+ **Use API names for imports.** Enable **Advanced mode** in Settings to see API names. See [Field Mapping](/l/zh/user-guide/data-migration/capabilities/field-mapping).
+
+
+### For Currency Fields
+
+Set the **default currency** (USD, EUR, etc.) for new records.
+
+### For Phone Fields
+
+Set the **default country code** to pre-fill for new phone numbers.
+
+### Making a Field Unique
+
+Toggle **Unique** to prevent duplicate values across records.
+
+
+ If duplicates exist (including in deleted records), you'll get an error. Clean up duplicates first.
+
+
+### Setting Default Values
+
+For Select fields, you can choose which option is pre-selected for new records. For Checkbox fields, set whether it's checked or unchecked by default.
+
+## Deactivating a Field
+
+1. Go to **Settings → Data Model**
+2. Find the field
+3. Click **⋮ → Deactivate**
+
+Data is preserved. You can reactivate or permanently delete later.
+
+## Related
+
+* [Fields](/l/zh/user-guide/data-model/capabilities/fields) — all field types explained
+* [Data Model FAQ](/l/zh/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/create-custom-objects.mdx b/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/create-custom-objects.mdx
new file mode 100644
index 0000000000..8816057173
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/create-custom-objects.mdx
@@ -0,0 +1,51 @@
+---
+title: Create Custom Objects
+description: Step-by-step guide to creating custom objects in Twenty.
+---
+
+Custom objects let you store information unique to your business that standard objects don't cover. For example: Projects, Products, Tickets, or Listings.
+
+
+ **Not sure if you need an object or a field?** See [Understanding Your Data Model](/l/zh/user-guide/data-model/overview) for guidance.
+
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Click **+ New object**
+3. Fill in:
+ * **Singular name** (e.g., "Listing")
+ * **Plural name** (e.g., "Listings")
+ * **Icon**
+ * **Description** (optional)
+4. Click **Save**
+
+Your object appears in the sidebar immediately.
+
+## Next: Add Fields
+
+New objects start with basic fields. Add custom fields to capture the data you need:
+
+1. In **Settings → Data Model**, select your object
+2. Click **+ Add Field**
+3. Choose a field type, configure, and save
+
+See [How to Create Custom Fields](/l/zh/user-guide/data-model/how-tos/create-custom-fields) for details on field types and configuration.
+
+## Connecting to Other Objects
+
+To link your object to People, Companies, or other objects, create a relation field. See [How to Create Relation Fields](/l/zh/user-guide/data-model/how-tos/create-relation-fields).
+
+## Deactivating an Object
+
+If you no longer need an object:
+
+1. Go to **Settings → Data Model**
+2. Toggle the object off
+
+The object is hidden but data is preserved. You can reactivate or permanently delete later.
+
+## Related
+
+* [Objects](/l/zh/user-guide/data-model/capabilities/objects) — standard vs custom objects
+* [Data Model FAQ](/l/zh/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/create-relation-fields.mdx b/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/create-relation-fields.mdx
new file mode 100644
index 0000000000..76dc37da9f
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/create-relation-fields.mdx
@@ -0,0 +1,60 @@
+---
+title: Create Relation Fields
+description: Step-by-step guide to connecting objects with relation fields.
+---
+
+Relation fields connect records from different objects—for example, linking People to Companies.
+
+
+ **Relation names cannot be changed after creation** (they affect the API). Plan your names carefully.
+
+
+## Before You Start
+
+Decide:
+
+* Which objects are you connecting? (e.g., People → Companies)
+* Which is the "one" side? (e.g., Company)
+* Which is the "many" side? (e.g., People — many people work at one company)
+* What should the field be named on each side?
+
+See [Relation Fields](/l/zh/user-guide/data-model/capabilities/relation-fields) for relation types explained.
+
+## Steps
+
+1. Go to **Settings → Data Model**
+2. Select the object where you want the relation (typically the "many" side)
+3. Click **+ Add Field**
+4. Select **Relation** as the field type
+5. Choose the **target object**
+6. Select **One-to-Many** or **Many-to-One**
+7. Enter field names for **both sides** of the relation
+8. Click **Save**
+
+## Example: People → Companies
+
+* Go to **Settings → Data Model → People**
+* Add a Relation field
+* Target: **Companies**
+* Type: **Many-to-One**
+* Field on People: **Company**
+* Field on Companies: **Employees**
+
+Now each Person can be linked to a Company, and each Company shows its People.
+
+## Deleting a Relation
+
+1. Go to **Settings → Data Model**
+2. Find the relation field
+3. Click **⋮ → Deactivate**
+
+Links are preserved but hidden. Reactivate to restore.
+
+
+ **Deleting a relation doesn't delete records.** Only the link between them is removed.
+
+
+## Related
+
+* [Relation Fields](/l/zh/user-guide/data-model/capabilities/relation-fields) — types and limitations
+* [How to Import Relations](/l/zh/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) — bulk import linked records
diff --git a/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/customize-your-data-model.mdx b/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/customize-your-data-model.mdx
new file mode 100644
index 0000000000..dfc1ed75a4
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/customize-your-data-model.mdx
@@ -0,0 +1,22 @@
+---
+title: Customize Your Data Model
+description: Overview of data model customization options.
+---
+
+Twenty's data model is fully customizable. Create objects, fields, and relations to match your business.
+
+## Quick Links
+
+| I want to... | Guide |
+| ------------------------ | -------------------------------------------------------------------------------------- |
+| Create a new object | [How to Create Custom Objects](/l/zh/user-guide/data-model/how-tos/create-custom-objects) |
+| Add fields to an object | [How to Create Custom Fields](/l/zh/user-guide/data-model/how-tos/create-custom-fields) |
+| Connect objects together | [How to Create Relation Fields](/l/zh/user-guide/data-model/how-tos/create-relation-fields) |
+
+## Learn More
+
+* [Understanding Your Data Model](/l/zh/user-guide/data-model/overview) — key concepts and planning tips
+* [Objects](/l/zh/user-guide/data-model/capabilities/objects) — standard vs custom objects
+* [Fields](/l/zh/user-guide/data-model/capabilities/fields) — all field types
+* [Relation Fields](/l/zh/user-guide/data-model/capabilities/relation-fields) — connecting objects
+* [Data Model FAQ](/l/zh/user-guide/data-model/how-tos/data-model-faq) — common questions
diff --git a/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/data-model-faq.mdx b/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/data-model-faq.mdx
new file mode 100644
index 0000000000..b6d1b5a4ac
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-model/how-tos/data-model-faq.mdx
@@ -0,0 +1,155 @@
+---
+title: Data Model FAQ
+description: Frequently asked questions about Twenty's data model.
+---
+
+## Object Management
+
+
+
+ Yes, custom objects can be deleted. You can also deactivate them first, which hides the object and its data from the interface while preserving the data.
+
+
+
+ No, standard objects cannot be deleted. You can only deactivate them, which hides them from the interface but preserves the data.
+
+
+
+ You can create as many custom objects and fields as you need — the price doesn't change.
+
+
+
+ You can rename the label of standard objects (People, Companies, Opportunities), but not their API names. The API names are fixed for consistency across all Twenty workspaces.
+
+
+
+ Yes, you can change the icon for both standard and custom objects in **Settings → Data Model**.
+
+
+
+ Not yet. Object ordering in the navigation is currently fixed, but this feature is planned for a future release.
+
+
+
+ All active objects appear in the navigation. You can deactivate objects you don't need under **Settings → Data Model**.
+
+
+
+## Field Capabilities
+
+
+
+ No, field types cannot be changed after creation. If you need a different type, create a new field with the correct type, migrate your data, then deactivate the old field.
+
+
+
+ Our GraphQL API uses both forms for different operations:
+
+ * `createPerson` (singular) for single record actions
+ * `createPeople` (plural) for bulk operations
+
+ This creates limitations when singular and plural forms are the same, but it improves the developer experience.
+
+
+
+ Certain field names like `Type` or `Application` are reserved for system use. Choose alternative names like `Category` or `Classification` instead.
+
+
+
+ * The field is hidden from the interface
+ * Existing data is preserved
+ * You can still access the field via API
+ * Existing relations remain but you can't create new ones
+ * You can reactivate the field later
+
+
+
+ Currently, you cannot make custom fields required. All fields accept empty values. You can use workflows to enforce required fields by sending alerts or blocking actions when fields are empty.
+
+
+
+ * **Unique**: No two records can have the same value in this field
+ * **Required**: The field must have a value (not currently supported for custom fields)
+
+
+
+ Formula fields are coming in **Q1 2026**. In the meantime, you can use workflows to calculate and update field values automatically.
+
+
+
+ Nested fields are coming in **Q1 2026**. Currently, you can use workflows to bring field values from related objects. For example, to display a company's industry on a Person record, create a custom field on People and use a workflow to synchronize the value.
+
+
+
+ Field reordering will be available with custom layouts in **Q4 2025**. Currently, fields appear in alphabetical order.
+
+
+
+## Relations
+
+
+
+ Yes! Self-referencing relations are supported and recommended for use cases like account hierarchies. For example, create a relation from Companies to Companies to track parent/child accounts.
+
+
+
+ Many-to-many relationships are coming in **H1 2026**. Currently, create an intermediate object with two one-to-many relationships as a workaround.
+
+ For example, to link People and Projects (many-to-many), create a "Project Assignments" object with:
+
+ * A relation to People (many assignments → one person)
+ * A relation to Projects (many assignments → one project)
+
+
+
+ These allow one object to relate to multiple different object types through a single field. For example, Notes can be attached to People AND Companies AND Opportunities simultaneously.
+
+ Each Note links to one Person, one Company, and one Opportunity at the same time.
+
+ Learn more in [Relation Fields](/l/zh/user-guide/data-model/capabilities/relation-fields).
+
+
+
+ Yes, you can create multiple relations between the same two objects. For example, a Company could have both a "Primary Contact" and "Billing Contact" relation to People.
+
+
+
+ When you delete a record, the relation link is removed from the related records. The related records themselves are not deleted.
+
+
+
+ While technically possible, circular relations (A → B → C → A) should be avoided as they can cause confusion and potential performance issues.
+
+
+
+## Access and Permissions
+
+
+
+ Go to **Settings → Data Model** to view and edit all your objects and fields.
+
+
+
+ Reach out to your workspace administrator. Data model access is usually restricted to administrators only.
+
+
+
+## Data Management
+
+
+
+ There's no hard limit on record counts. However, very large datasets may impact performance in some views. Use filters and views to manage large datasets effectively.
+
+
+
+ Yes, you can import CSV data into any object, including custom objects. The import process supports field mapping for custom fields. See [How to Prepare Your CSV Files](/l/zh/user-guide/data-migration/how-tos/prepare-your-csv-files).
+
+
+
+ Currently, there's no built-in export for data model configuration. Contact support if you need to migrate your data model between workspaces.
+
+
+
+## Need More Help?
+
+Check our [Implementation Services](/l/zh/user-guide/getting-started/capabilities/implementation-services) for help with complex data model design.
diff --git a/packages/twenty-docs/l/zh/user-guide/data-model/overview.mdx b/packages/twenty-docs/l/zh/user-guide/data-model/overview.mdx
new file mode 100644
index 0000000000..dc33390f06
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/data-model/overview.mdx
@@ -0,0 +1,180 @@
+---
+title: Data Model
+description: Learn what a data model is and how to design one that fits your business.
+image: /images/user-guide/fields/custom_data_model.png
+---
+
+
+
+
+
+## What is a Data Model?
+
+A data model is the structure that defines how information is organized in your CRM. Think of it as the **blueprint** of your customer data — you design it once, then fill it with your actual data.
+
+## Key Concepts
+
+### Objects
+
+**Objects** are the main categories of data in your CRM. Each object represents a type of thing you want to track.
+
+Twenty comes with standard objects:
+
+* **People** — individuals (contacts, leads, partners)
+* **Companies** — organizations
+* **Opportunities** — deals or sales
+* **Notes** — attached notes on records
+* **Tasks** — to-dos linked to records
+
+You can also create **custom objects** for anything specific to your business (e.g., Projects, Subscriptions, Events).
+
+### Fields
+
+**Fields** are the properties or attributes that describe each object. They store the actual information.
+
+For example, the **People** object has fields like:
+
+* Name
+* Email
+* Phone
+* Job Title
+* Company (a relation to the Companies object)
+
+Fields have different **types**: text, number, date, select, multi-select, relation, and more. You can add custom fields to any object.
+
+### Records
+
+**Records** are the individual entries within an object — the actual data you create and manage.
+
+For example:
+
+* "John Smith" is a **record** in the People object
+* "Acme Corp" is a **record** in the Companies object
+
+**An analogy:**
+
+| Data Model Concept | Real-World Analogy |
+| ------------------ | ------------------------------------------ |
+| **Objects** | Sections in a book (the categories) |
+| **Fields** | Columns in a spreadsheet (the properties) |
+| **Records** | Rows in a spreadsheet (the actual entries) |
+
+You design the data model (objects + fields) once, then create many records within that structure.
+
+## Why Customize Your Data Model?
+
+Every business works differently. Customizing your data model means you can shape Twenty around **your** processes instead of forcing yours into a rigid system.
+
+Twenty offers full flexibility:
+
+* Create as many custom objects as you need
+* Add unlimited custom fields
+* The price doesn't change based on customization
+
+## Tips to Design Your Data Model
+
+### 1. Start with Your Core Objects
+
+Identify the main concepts you work with. Twenty already provides:
+
+* **People** — your contacts
+* **Companies** — your accounts
+* **Opportunities** — your deals
+
+Think about what else you might need:
+
+* Stripe would need a `Subscriptions` object
+* Airbnb would need a `Trips` object
+* An accelerator would need a `Batches` object
+
+### 2. Use Fields for Variations, Not New Objects
+
+If something is just a characteristic of an existing object, make it a **field**.
+
+**Use fields for:**
+
+* Categories and labels (e.g., `Industry` for Companies)
+* Status values (e.g., `Stage` for Opportunities)
+* Attributes and properties
+
+### 3. Create an Object When It Stands on Its Own
+
+If the concept has its own lifecycle, properties, or relationships, it deserves an object.
+
+**Create an object for:**
+
+* **Projects** — have deadlines, owners, and tasks
+* **Subscriptions** — connect companies, products, and invoices
+* **Events** — involve attendees and follow-up actions
+
+These go beyond a single field because they carry their own data and relationships.
+
+### 4. Create an Object When Records Are Open-Ended
+
+If something can be linked multiple times and you don't know how many, use an object.
+
+**Bad approach:**
+Creating fields like `Product 1`, `Product 2`, `Product 3`...
+
+**Good approach:**
+Create a `Products` object and relate it to records. This supports one, two, or a hundred products without changing your model.
+
+### 5. Keep It Simple First
+
+Start with fields. Move to new objects only when you feel the limits:
+
+* Too many fields on one object
+* Repeated records that should be separate
+* Relationships that don't fit neatly
+
+## Special Note on People, Companies, and Opportunities
+
+
+ **Email and calendar sync only works with People, Companies, and Opportunities.**
+
+ These are the only objects where you can access synchronized emails and meetings from your mailbox/calendar. We recommend using them as much as possible.
+
+
+**Best practices:**
+
+* If you need categories of People, use fields (not new objects)
+* Example: Use a `Person Type` field with values "Prospect" and "Partner" instead of creating separate objects
+* Create different **views** to filter: one showing partners, another showing prospects
+
+**It's okay to have fields that don't apply to every record.** For example, a `Referral Link` field on People that only applies when `Person Type = Partner`. Hide this field from views where it's not relevant.
+
+## Questions to Guide Your Choice
+
+Ask yourself:
+
+Is this just a property of something I already have, or does it need its own properties?
+Will I ever need to track multiple of these per record, without knowing how many?
+Does this concept connect to several different objects, not just one?
+Will it have its own lifecycle (stages, start/end dates)?
+
+If the answer is "yes" to one or more, it's probably time for a new object.
+
+## Accessing Your Data Model
+
+1. Go to **Settings** in the left sidebar
+2. Click **Data Model**
+3. View all your objects (standard and custom)
+4. Click any object to see and edit its fields
+
+
+ **Don't see Data Model in Settings?**
+
+ Access to the data model is usually restricted to administrators. Contact your workspace admin if you need access.
+
+
+## Next Steps
+
+Once you've planned your data model:
+
+* [How to Create Custom Objects](/l/zh/user-guide/data-model/how-tos/create-custom-objects)
+* [How to Create Custom Fields](/l/zh/user-guide/data-model/how-tos/create-custom-fields)
+* [How to Create Relation Fields](/l/zh/user-guide/data-model/how-tos/create-relation-fields)
+
+## Need Help?
+
+Our team can help you design and create the data model you need. Discover our [Implementation Services](/l/zh/user-guide/getting-started/capabilities/implementation-services).
diff --git a/packages/twenty-docs/l/zh/user-guide/getting-started/capabilities/glossary.mdx b/packages/twenty-docs/l/zh/user-guide/getting-started/capabilities/glossary.mdx
new file mode 100644
index 0000000000..71ac91622f
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/getting-started/capabilities/glossary.mdx
@@ -0,0 +1,108 @@
+---
+title: Glossary
+description: Get familiar with essential terminology used in Twenty.
+---
+
+## API
+
+API (Application Programming Interface) allows you to connect Twenty with other software systems and build custom integrations.
+
+## Apps
+
+Apps are custom extensions built as code that can define data models and serverless functions. They enable developers to create reusable customizations that can be deployed across multiple workspaces.
+
+## Code Actions
+
+Code Actions are workflow steps that let you write custom JavaScript to transform data, make calculations, or perform complex logic that isn't possible with built-in actions.
+
+## Command Menu
+
+The Command Menu is a quick-access interface (opened with `Cmd + K` on Mac and `Ctrl + K` on Windows) that lets you perform actions, create records, and navigate your workspace efficiently.
+
+## Company & People
+
+The CRM has two fundamental types of records:
+
+* A `Company` represents a business or organization.
+* `People` represent your company's current and prospective customers or clients.
+
+## Custom Fields
+
+Custom Fields are data fields you create to capture information specific to your business needs and processes.
+
+## Data Model
+
+A Data Model is the structure that defines how information is organized in your CRM, including what objects exist, their properties (fields), and how they relate to each other.
+
+## Favorites
+
+Favorites are records you've marked for quick access, appearing in your sidebar for instant navigation to important data.
+
+## Field
+
+A field refers to a specific area where particular data is stored for an entity.
+
+## Integration
+
+Integrations are built-in tools that allow you to link Twenty with other software or systems.
+
+## Iterator
+
+An Iterator is a workflow action that loops through an array of items, executing subsequent actions for each item in the list.
+
+## Kanban
+
+A `Kanban` is a visual way to track your business processes using cards and columns. Each column represents a stage in your process (for example: new, ongoing, won, lost), and you move records through these stages as they progress.
+
+## Object
+
+An Object is a data structure that represents a specific type of entity in your CRM (like People, Companies, or Opportunities). Objects can be standard (built-in) or custom (created by you).
+
+## Opportunities
+
+Opportunities in Twenty CRM are potential deals or sales with accounts or contacts.
+
+## Record
+
+A Record indicates an instance of an object, like a specific account or contact.
+
+## Relation Fields
+
+Relation Fields create connections between different objects, allowing you to link records together (like connecting a Person to a Company).
+
+## Standard Fields
+
+Standard Fields are pre-built data fields that come with objects by default and provide common functionality across all workspaces.
+
+## Tasks
+
+Tasks in Twenty CRM are assigned activities relating to contacts, accounts, or opportunities.
+
+## Triggers
+
+Triggers are the starting point of a workflow — the event or condition that initiates the automation. Examples include record creation, record updates, webhooks, or scheduled times.
+
+## Views
+
+You can customize the display of your records using views, setting different filters, layouts and sorting options for each view.
+
+## Upsert
+
+Upsert is an operation that combines "update" and "insert" — it updates an existing record if a match is found, or creates a new record if no match exists.
+
+## Webhooks
+
+Webhooks are automated messages sent from Twenty to other applications when specific events occur, enabling real-time data synchronization.
+
+## Workflows
+
+Workflows are automated processes that trigger actions based on specific conditions, helping you automate repetitive tasks and business processes.
+
+## Workspace
+
+A `Workspace` typically represents a company using Twenty. It holds all the records and data that you and your team members add to Twenty.
+It has a single domain name, which is typically the domain name your company uses for employee email addresses.
+
+## Workspace Members
+
+Workspace Members are the Twenty users from your team who have access to your workspace. They can be assigned as owners or assignees for records.
diff --git a/packages/twenty-docs/l/zh/user-guide/getting-started/capabilities/implementation-services.mdx b/packages/twenty-docs/l/zh/user-guide/getting-started/capabilities/implementation-services.mdx
new file mode 100644
index 0000000000..706de4d2a0
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/getting-started/capabilities/implementation-services.mdx
@@ -0,0 +1,16 @@
+---
+title: Implementation Services
+description: Whether you need help getting started or creating advanced customizations, we have a solution.
+---
+
+## Onboarding Packs
+
+Get help from our core team to set up your Twenty workspace with our 4-hour Onboarding packs:
+
+* **Data Model Design**: Design and create your custom data model with objects, fields, and relationships
+* **Data Migration**: Migrate your existing data from your current CRM to Twenty
+* **Workflow Creation**: Create custom workflows to support your business processes
+
+## Implementation Partners
+
+Work with certified Twenty partners for more advanced customizations and integrations. Reach out to our team via [contact@twenty.com](mailto:contact@twenty.com) to be matched with our partners.
diff --git a/packages/twenty-docs/l/zh/user-guide/getting-started/capabilities/what-is-twenty.mdx b/packages/twenty-docs/l/zh/user-guide/getting-started/capabilities/what-is-twenty.mdx
new file mode 100644
index 0000000000..137775eed1
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/getting-started/capabilities/what-is-twenty.mdx
@@ -0,0 +1,42 @@
+---
+title: What is Twenty
+description: Twenty is an open-source CRM that gives you the building blocks to create exactly what your business needs.
+---
+
+## Vision
+
+Creating a good CRM is hard because it's a balancing act.
+For each business, the requirements seem straightforward, yet everyone's needs are distinct.
+The result is a CRM that's either too basic, or one that's attempting to be a jack-of-all-trades but ending up as a master of none.
+
+At first, Twenty looks like most CRMs you already know: you can track deals, organize contacts, manage tasks and notes.
+**But what sets it apart is our approach to extensibility. We are building an open platform that provides the building blocks for you to solve your unique business problems.**
+
+We prioritize universal principles and common patterns over feature lists.
+We don't try to have all the answers and instead empower users to find what works best for them.
+Open-source is the bedrock of our approach, ensuring that Twenty evolves with its community, for its community.
+
+## Benefits
+
+**Customizable:** Designed to fit your business needs.
+
+**Community-driven:** Built and maintained by a large open-source community.
+
+**Cost-effective:** You'll never be vendor-locked, because you can always self-host.
+
+## Main Features
+
+* **Calendar & Emails:** Sync your mailbox and calendar to see all communications on your CRM records. [Learn more](/l/zh/user-guide/calendar-emails/overview).
+* **Data Model:** Create custom objects and fields to match your unique business processes. [Explore](/l/zh/user-guide/data-model/overview).
+* **Data Migration:** Import and export your data via CSV or API. [Get started](/l/zh/user-guide/data-migration/overview).
+* **Views & Pipelines:** Organize your data with table views, kanban boards, and sales pipelines. [Discover](/l/zh/user-guide/views-pipelines/overview).
+* **Workflows:** Automate your business processes and integrate with external tools. [Build automations](/l/zh/user-guide/workflows/overview).
+* **AI:** Enhance your CRM with AI-powered features and agents. [Explore AI](/l/zh/user-guide/ai/overview).
+* **Dashboards:** Track performance with custom reports and visualizations. [View dashboards](/l/zh/user-guide/dashboards/overview).
+* **Permissions & Access:** Control who can view, edit, and manage your data with role-based permissions. [Configure access](/l/zh/user-guide/permissions-access/overview).
+* **Notes & Tasks:** Create notes and tasks linked to your records for better collaboration.
+* **API & Webhooks:** Connect to other apps and build custom integrations. [Start integrating](/l/zh/developers/extend/capabilities/apis).
+
+## Join now
+
+[Register here](https://app.twenty.com) or [become a contributor on GitHub](https://github.com/twentyhq/twenty).
diff --git a/packages/twenty-docs/l/zh/user-guide/getting-started/how-tos/configure-your-workspace.mdx b/packages/twenty-docs/l/zh/user-guide/getting-started/how-tos/configure-your-workspace.mdx
new file mode 100644
index 0000000000..9f4682442c
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/getting-started/how-tos/configure-your-workspace.mdx
@@ -0,0 +1,77 @@
+---
+title: Configure Your Workspace
+description: Every business works differently. Start with these 3 steps to shape Twenty around your needs.
+---
+
+**Quick Win**: Start with connecting your mailbox. This gives you immediate value and helps your team see Twenty in action with real data. You can do so under Settings → Accounts.
+
+## 1. Customize your data model
+
+Twenty offers the flexibility you need to shape the data model that will best support your day-to-day.
+Create objects and fields of any type, including relations between your different objects. You can do so under Settings → Data Model.
+Here are a few tips:
+
+* **You are not limited in the number of custom fields nor custom objects**. Adding custom objects and fields will not lead to upgrading your plan.
+* **People, Companies and Opportunities are the three objects from where you can access the emails and meetings synchronized from your mailbox and calendar**. We recommend using those as much as possible, adding fields to categorize your records if need be. Here is an example:
+ * It is best to use the People object for your prospects and partners, creating a field on the People object named `Person Type`, instead of creating a Partner custom object. Because you would not be able to access the emails exchanged with this person from the Partner records.
+ * Create different views under People, one to display partners and one to display prospects.
+* Two People cannot have the same email address. Two Companies cannot have the same domain.
+* You can deactivate standard fields and objects you do not want to use.
+* You can hide fields from views: don't be afraid of creating fields, you won't have to display all of them.
+
+Read [this article](/l/zh/user-guide/data-model/overview) to learn how to design your data model.
+
+## 2. Bring your data in
+
+Bringing your existing data into Twenty gives your team context from the start.
+
+### Connect your mailbox
+
+If you have not done so when creating your workspace, connect your **Google or Microsoft account** under Settings → Accounts. This allows Twenty to:
+
+* Import your messages and meetings
+* Auto-create contacts based on interactions (optional)
+* Keep communication history visible for your team
+
+**Using another provider?**
+You can add another mailbox via SMTP or another calendar via CalDAV. You will need to activate the feature under Settings → Releases → Lab, and then go back to the Settings → Accounts tab.
+
+### Import data via csv
+
+Use the Command menu (`Cmd + K` or `Ctrl + K`) to import People, Companies, Opportunities, or any custom objects via CSV.
+
+**Key guidelines**:
+
+* Download the sample file to understand the expected format
+* Limit each file to 10k records
+* Remove duplicate emails for People or duplicate domains for Companies
+* Review and fix errors (highlighted in yellow) before importing
+
+Read [this article](/l/zh/user-guide/data-migration/overview) to learn more about data import.
+
+## 3. Create your first view
+
+Creating different views is key to make the data actionable for your team.
+Here is how to proceed:
+
+* **Add or hide columns**
+ Manage the fields visible in a given view clicking on Options → Fields (from the top right). You can show/hide fields from there.
+
+* **Reorder fields**
+ Reorder the fields from a given view clicking on Options → Fields (from the top right). Drag and drop the fields to reorder them.
+
+* **Filter your view**
+ Narrow down the records displayed using the Filters from the top right.
+
+* **Sort records**
+ Reorder records displayed using the Sort function from the top right, or by clicking directly on the column name.
+
+* **Choose the layout**
+ You can switch to a **Kanban layout** or a list **Group By** layout, as long as the object has a `Stage` or similar select-type field.
+
+* **Save your view as Favorites**
+ This can be done using the dropdown menu showing the different views.
+
+## What's next?
+
+Start creating automations using [workflows](/l/zh/user-guide/workflows/overview).
diff --git a/packages/twenty-docs/l/zh/user-guide/getting-started/how-tos/create-workspace.mdx b/packages/twenty-docs/l/zh/user-guide/getting-started/how-tos/create-workspace.mdx
new file mode 100644
index 0000000000..f93617f83f
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/getting-started/how-tos/create-workspace.mdx
@@ -0,0 +1,48 @@
+---
+title: Create a Workspace
+description: Follow a step-by-step guide on how to register on Twenty, choose a subscription plan, and set up your account.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Step 1: Registration
+
+1. Navigate to [Twenty Sign Up](https://app.twenty.com).
+2. Select your preferred sign-up method:
+ * **Continue with Google** for Google account registration.
+ * **Continue with Microsoft** for Microsoft account registration.
+ * Or, **Continue With Email** for email registration.
+
+
+
+## Step 2: Choosing a Trial Period
+
+Choose between two trial periods:
+
+### 30 days
+
+With credit card
+
+### 7 days
+
+Without credit card
+
+Both trials include:
+
+* Full access
+* Unlimited contacts
+* Email integration
+* Custom objects
+* API & Webhooks
+
+You can click on "Change plan" to choose a different plan or billing interval.
+
+
+
+## Step 3: Payment Confirmation & Account Setup
+
+Post payment approval via Stripe, you're directed to create your workspace and user profile. Remember that you can cancel your subscription anytime.
+
+## Support
+
+For queries or help, connect with the dedicated support team at [contact@twenty.com](mailto:contact@twenty.com) or send a message on [Discord](https://discord.gg/cx5n4Jzs57).
diff --git a/packages/twenty-docs/l/zh/user-guide/getting-started/how-tos/navigate-around-twenty.mdx b/packages/twenty-docs/l/zh/user-guide/getting-started/how-tos/navigate-around-twenty.mdx
new file mode 100644
index 0000000000..e6dbdaba6a
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/getting-started/how-tos/navigate-around-twenty.mdx
@@ -0,0 +1,83 @@
+---
+title: Navigate Around Twenty
+description: Get a quick overview of how to navigate through the platform and where to take different types of actions.
+---
+
+## The Main Layout
+
+The center of the screen is **where your records live**: people, companies, opportunities, tasks, notes, dashboards, workflows and any other object you created. This is where the day-to-day work happens.
+You can **view, edit, delete records** from there as well as **creating new views**.
+
+
+
+## The Navigation Bar
+
+On the left side, from the top to the bottom, you'll be able to:
+
+* Switch between your **several workspaces** using the dropdown menu or create a new workspace
+* Use the **search bar** (press `/` to focus on it instantly)
+* Open the **Settings** section
+* Have direct access to your **Favourites views**. Favourites are unique for each user.
+* Switch between different objects
+* **Create automations** using workflows
+* Reach out to Support and open our User Guide.
+
+
+
+## The Command Menu
+
+The command menu gives you **quick access to actions** in Twenty. You can access it in two ways:
+
+* **Keyboard shortcut**: Press `Cmd + K` (Mac) or `Ctrl + K` (Windows)
+* **Mouse**: Click the three dots in the top right corner
+ From there, you can:
+* Create new records
+* **Import and export data via csv**
+* Create new views
+* Access deleted records (Twenty supports soft and hard deletes)
+* See the keyboard shortcuts to quickly access objects in your workspace
+
+
+
+## The Search Bar
+
+The search bar is accesible via the Command Menu, at the top of your navigation bar, or by pressing `/` to focus on it instantly. Search works across all object.
+
+
+
+## The Side Panel
+
+When you click on a record, the side panel appears on the right. This gives you a quick overview of the record's key information, without bringing you to another page. From there, you can decide to close this overview or to get additional information about this record, clicking on the Open button.
+
+
+
+## Views
+
+Every object (like Opportunities or People) supports multiple views. You're not limited in the number of views per object.
+
+Use the dropdown menu at the top left of the main layout to switch between the different views. For example:
+
+* Use a Kanban view to track opportunities by stage
+* Use Group By view to create sections and improve efficiency
+* Use filters to focus on specific records (e.g. leads created last week)
+* Save filtered views to reuse them later
+* Favourite views for fast access
+
+
+
+If you're new to Views, read our [Views & Pipelines guide](/l/zh/user-guide/views-pipelines/overview) to learn how to create and customize them.
+
+## Settings
+
+Open your Settings from the top left to:
+
+* **Connect your mailbox and calendar** accounts for seamless email and calendar sync
+* Customize your **data model**: create custom objects, fields, and relationships
+* **Access the API playground and configure webhooks**
+* **Manage user permissions** and workspace access controls
+* Invite team members and manage user roles
+* Edit your profile and workspace preferences
+* Configure billing and monitor workflow credits usage
+* Discover the latest releases and upcoming features (under Releases → Lab tab)
+
+If you do not see all those sections under Settings, reach out to your workspace administrator - some of them have restricted access.
diff --git a/packages/twenty-docs/l/zh/user-guide/introduction.mdx b/packages/twenty-docs/l/zh/user-guide/introduction.mdx
new file mode 100644
index 0000000000..e737b3b87a
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/introduction.mdx
@@ -0,0 +1,63 @@
+---
+title: Discover Twenty
+description: Welcome to Twenty User Guide, your resources for advanced configurations and best practices.
+---
+
+import { CardTitle } from "/snippets/card-title.mdx"
+
+
+
+ Discover Twenty
+ Learn what Twenty is and how it can help your business.
+
+
+
+ Data Model
+ Customize your data model to fit your business processes.
+
+
+
+ Data Migration
+ Import and export your data via CSV or API.
+
+
+
+ Calendar & Emails
+ Centralize your team's meetings and emails.
+
+
+
+ Workflows
+ Automate processes and integrate with external tools.
+
+
+
+ AI
+ Enhance your team with AI agents.
+
+
+
+ Views & Pipelines
+ Organize your data with actionable views and pipelines.
+
+
+
+ Dashboards
+ Real-time insights to track performance.
+
+
+
+ Permissions & Access
+ Manage roles and access to Twenty.
+
+
+
+ Billing
+ Understand how Twenty pricing and billing works.
+
+
+
+ Settings
+ Configure your workspace preferences.
+
+
diff --git a/packages/twenty-docs/l/zh/user-guide/permissions-access/capabilities/permissions.mdx b/packages/twenty-docs/l/zh/user-guide/permissions-access/capabilities/permissions.mdx
new file mode 100644
index 0000000000..ba8c87e608
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/permissions-access/capabilities/permissions.mdx
@@ -0,0 +1,198 @@
+---
+title: Permissions
+description: Control access to objects, fields, and settings with role-based permissions.
+image: /images/user-guide/permissions/permissions.png
+---
+
+Twenty's permission system allows you to control access to three main areas:
+
+* **Objects and Fields**: Control who can view, edit, or delete records and individual fields
+* **Settings**: Manage access to workspace configuration and administrative functions
+* **Actions**: Control general workspace actions like importing data or sending emails
+
+## Create a Role
+
+To create a new role:
+
+1. Go to **Settings → Roles**
+2. Under **All Roles**, click on **+ Create Role**
+3. Enter a role name
+4. In the default **Permissions** tab, [configure permissions](#customize-permissions)
+5. Click **Save** to finish
+
+## Delete a Role
+
+To delete a role:
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to remove
+3. Open the **Settings** tab, then click **Delete Role**
+4. Click **Confirm** in the modal
+
+
+ If a role is deleted, any workspace member assigned to it will be automatically reassigned to the default role. All except the **Admin** role can be deleted. There must always be at least one member assigned to the **Admin** role.
+
+
+## Assign Roles to Members
+
+### View Current Assignments
+
+* Go to **Settings → Roles**
+* See all roles and how many members are assigned to each
+* View which members have which roles
+
+### Assign a Role to a Member
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Click **+ Assign to member**
+5. Select the workspace member from the list
+6. Confirm the assignment
+
+### Set Default Role
+
+1. Go to **Settings → Roles**
+2. In the **Options** section, find **Default Role**
+3. Select which role new members should automatically receive
+4. New workspace members will be assigned this role when they join
+
+
+ You can only assign roles to existing workspace members. To invite new members, use [Member Management](/l/zh/user-guide/settings/capabilities/member-management).
+
+
+## Customize Permissions
+
+Permissions determine what each role can access or modify within your workspace, including workspace objects records, settings, and actions.
+
+### Object Permissions
+
+The **Objects** section controls what this role can do with records across your workspace.
+
+#### Set Default Permissions (All Objects)
+
+First, configure the baseline permissions that apply to **all objects** by default:
+
+| Permission | Description |
+| ---------------------------------- | -------------------------------------- |
+| **See Records on All Objects** | View records in lists and detail pages |
+| **Edit Records on All Objects** | Modify existing records |
+| **Delete Records on All Objects** | Soft-delete records (can be restored) |
+| **Destroy Records on All Objects** | Permanently delete records |
+
+Select or unselect based on what should be the default behavior for this role.
+
+
+ **Example — Intern role**: An intern should be able to see all objects but not edit them by default. Enable "See Records on All Objects" but leave "Edit Records on All Objects" unchecked.
+
+
+#### Add Object-Level Exceptions
+
+After setting defaults, use the **Object-Level** sub-section to add rules that override the defaults for specific objects.
+
+Click **+ Add rule** and select an object to create an exception.
+
+**Example rules for an Intern role:**
+
+| Rule | Effect |
+| ------------------------------------- | ------------------------------------------------------ |
+| Opportunities → disable "See Records" | Intern cannot see the Opportunities object at all |
+| People → enable "Edit Records" | Intern can edit People records (but not other objects) |
+
+### Field Permissions
+
+Within each object-level rule, you can go further and configure **field-level permissions** to control access to specific fields.
+
+| Permission | Description |
+| -------------- | -------------------------- |
+| **See Field** | View the field value |
+| **Edit Field** | Modify the field value |
+| **No Access** | Field is completely hidden |
+
+**Example — Restrict sensitive fields:**
+
+For the Intern role with People edit access, you might want to restrict certain fields:
+
+* People → Email → **See Field** only (cannot edit)
+* People → Address → **No Access** (completely hidden)
+
+This allows the intern to edit most People fields while protecting sensitive information.
+
+### How Permission Inheritance Works
+
+Permissions cascade from general to specific:
+
+1. **All Objects** → sets the baseline for all objects
+2. **Object-Level rules** → override the baseline for specific objects
+3. **Field-Level rules** → override the object setting for specific fields
+
+More specific settings always take precedence.
+
+### Managing Permission Overrides
+
+To override inherited permissions:
+
+1. Click **X** to remove the inherited rule
+2. Select the specific permissions you want
+3. Click the orange **Undo** icon (circular arrow) to revert changes
+
+When done, click **Finish**, then **Save** once redirected to the role page.
+
+### Workspace Settings Permissions
+
+Control access to workspace settings in two ways:
+
+* Toggle **Settings All Access** to grant full access
+* Or enable specific permissions (e.g., API key generation, workspace preferences, role assignment, data model configuration, security settings, and workflow management)
+
+
+ **Current limitation**: Access to workflow management is currently required to manually trigger workflows. This behavior may change in future releases.
+
+
+### Workspace Action Permissions
+
+Control access to general workspace actions:
+
+* Toggle **Application All Access** to grant full permissions
+* Or enable individual actions such as **Send Email**, **Import CSV**, and **Export CSV**
+
+## Assigning Roles to API Keys and AI Agents
+
+Beyond workspace members, roles can also be assigned to **API Keys** and **AI Agents**. This is particularly helpful for teams who want to control exactly "who" can do what in their workspace—including automated processes and integrations.
+
+### Why Assign Roles to API Keys and AI Agents?
+
+* **Security**: Limit what automated processes can access or modify
+* **Compliance**: Ensure integrations only touch the data they need
+* **Control**: Prevent accidental data changes from misconfigured automations
+* **Auditability**: Track which actions were performed by which integration or agent
+
+### Assign a Role to an API Key
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **API Keys**, click **+ Assign to API key**
+5. Select the API key from the list
+6. Confirm the assignment
+
+The API key will now inherit all permissions defined by that role. Any API calls made with this key will be restricted accordingly.
+
+
+ API keys without an assigned role use default permissions. For tighter security, always assign a specific role to production API keys.
+
+
+### Assign a Role to an AI Agent
+
+1. Go to **Settings → Roles**
+2. Click on the role you want to assign
+3. Open the **Assignment** tab
+4. Under **AI Agents**, click **+ Assign to AI agent**
+5. Select the AI agent from the list
+6. Confirm the assignment
+
+The AI agent will only be able to access data and perform actions allowed by its assigned role.
+
+
+ For AI agents running within workflows, this ensures the agent cannot access or modify data outside its intended scope—even if the workflow has broader permissions.
+
diff --git a/packages/twenty-docs/l/zh/user-guide/permissions-access/capabilities/sso-configuration.mdx b/packages/twenty-docs/l/zh/user-guide/permissions-access/capabilities/sso-configuration.mdx
new file mode 100644
index 0000000000..310c161605
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/permissions-access/capabilities/sso-configuration.mdx
@@ -0,0 +1,125 @@
+---
+title: SSO Configuration
+description: Configure Single Sign-On for secure enterprise authentication.
+---
+
+## About SSO
+
+Single Sign-On (SSO) allows your team members to log into Twenty using your organization's identity provider. This provides:
+
+* **Centralized access control**: Manage access from one place
+* **Enhanced security**: Leverage your existing security policies
+* **Better user experience**: One set of credentials for all tools
+
+## Supported Providers
+
+Twenty supports SSO with:
+
+* **SAML 2.0**: Works with most enterprise identity providers
+* **Google Workspace**: For organizations using Google
+* **Microsoft Entra ID**: (formerly Azure AD) For Microsoft environments
+
+## Setting Up SSO
+
+### Prerequisites
+
+* Organization plan (cloud and self-hosted workspaces)
+* Admin access to your identity provider
+* Admin access to Twenty workspace
+
+
+ **For self-hosting users willing to set up SSO**, reach out to contact@twenty.com
+
+
+### Configuration Steps
+
+#### 1. Access SSO Settings
+
+1. Go to **Settings → Security**
+2. Find the **SSO Configuration** section
+3. Click **Configure SSO**
+
+#### 2) Choose Your Provider
+
+Select your identity provider from the list or choose "Custom SAML" for other providers.
+
+#### 3. Configure Your Identity Provider
+
+You'll need to configure your identity provider with:
+
+* **Entity ID**: Provided by Twenty
+* **ACS URL**: The callback URL for authentication
+* **Certificate**: For secure communication
+
+#### 4. Enter Provider Details in Twenty
+
+* **SSO URL**: Login URL from your provider
+* **Entity ID**: Your provider's identifier
+* **Certificate**: X.509 certificate from your provider
+
+#### 5. Test and Enable
+
+1. Click **Test Configuration** to verify setup
+2. Enable SSO when testing is successful
+3. Configure user provisioning preferences
+
+## User Provisioning
+
+### Just-in-Time (JIT) Provisioning
+
+* Users are created automatically on first login
+* Assigned default role automatically
+* No manual user creation needed
+
+### Manual Provisioning
+
+* Invite users before they can log in
+* Pre-assign specific roles
+* More control over who can access
+
+## Managing SSO Users
+
+### Role Assignment
+
+SSO users can be assigned roles like regular users:
+
+1. Go to **Settings → Members**
+2. Find the user
+3. Change their role as needed
+
+### Access Revocation
+
+To remove access for SSO users:
+
+* Remove them from your identity provider, or
+* Remove them from the Twenty workspace
+
+## Best Practices
+
+### Security
+
+* **Require SSO**: Disable password login for SSO users
+* **Regular audits**: Review access periodically
+* **Strong IdP policies**: Enforce MFA at the identity provider
+
+### User Management
+
+* **Clear naming**: Use consistent naming from your directory
+* **Group mapping**: Map IdP groups to Twenty roles (if available)
+* **Offboarding process**: Include Twenty in your deprovisioning workflow
+
+## Troubleshooting
+
+### Common Issues
+
+* **Certificate errors**: Ensure certificate hasn't expired
+* **URL mismatches**: Verify ACS URL matches exactly
+* **User not found**: Check JIT provisioning settings
+
+### Getting Help
+
+If you encounter issues, contact support with:
+
+* Error messages received
+* Identity provider being used
+* Configuration details (without sensitive data)
diff --git a/packages/twenty-docs/l/zh/user-guide/permissions-access/how-tos/permissions-faq.mdx b/packages/twenty-docs/l/zh/user-guide/permissions-access/how-tos/permissions-faq.mdx
new file mode 100644
index 0000000000..6700b48297
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/permissions-access/how-tos/permissions-faq.mdx
@@ -0,0 +1,126 @@
+---
+title: Permissions FAQ
+description: Frequently asked questions about roles and permissions.
+---
+
+## Roles
+
+
+
+ Twenty comes with an **Admin** and **Member** roles by default. You can create additional custom roles based on your team's needs (e.g., Sales Rep, Manager, Read-Only User).
+
+
+
+ No, the Admin role cannot be deleted. There must always be at least one member assigned to the Admin role.
+
+
+
+ Any workspace member assigned to that role will be automatically reassigned to the default role.
+
+
+
+ Go to **Settings → Roles**, find the **Default Role** option, and select which role new members should automatically receive when they join.
+
+
+
+ No, each user can only have one role at a time. Create a custom role if you need a combination of permissions.
+
+
+
+## Permissions
+
+
+
+ * **Object permissions**: Control access to entire records (e.g., can see/edit/delete People records)
+ * **Field permissions**: Control access to specific fields within an object (e.g., can see but not edit the Salary field)
+
+ Field permissions allow more granular control over sensitive data.
+
+
+
+ Permissions cascade from global to specific:
+
+ 1. **All Objects** sets the baseline for all objects
+ 2. **Object-Level Permissions** can override the global setting for specific objects
+ 3. **Field-Level Permissions** can override the object setting for specific fields
+
+ More specific settings always take precedence.
+
+
+
+ For objects:
+
+ * **See Records**: View records in lists and detail pages
+ * **Edit Records**: Modify existing records
+ * **Delete Records**: Soft-delete records (can be restored)
+ * **Destroy Records**: Permanently delete records
+
+ For fields:
+
+ * **See Field**: View the field value
+ * **Edit Field**: Modify the field value
+ * **No Access**: Field is completely hidden
+
+
+
+ Row-level permissions will be available on the **Organization** plan by Q1 2026. This allows you to restrict access to specific records based on criteria (e.g., only see your own opportunities).
+
+
+
+ 1. Go to **Settings → Roles**
+ 2. Select the role
+ 3. Navigate to the object containing the field
+ 4. Set the field permission to **See Field** (without Edit Field)
+
+
+
+## Settings & Actions
+
+
+
+ You can control access to:
+
+ * API key generation
+ * Workspace preferences
+ * Role assignment
+ * Data model configuration
+ * Security settings
+ * Workflow management
+
+ Use **Settings All Access** to grant full access, or enable specific permissions.
+
+
+
+ You can control:
+
+ * **Send Email**: Ability to send emails from Twenty
+ * **Import CSV**: Ability to import data via CSV
+ * **Export CSV**: Ability to export data to CSV
+
+ Use **Application All Access** to grant all actions, or enable specific ones.
+
+
+
+## SSO
+
+
+
+ No, SSO is a Premium feature available on the **Organization** plan only.
+
+
+
+ Twenty supports:
+
+ * **SAML 2.0** (works with most enterprise identity providers)
+ * **Google Workspace**
+ * **Microsoft Entra ID** (formerly Azure AD)
+
+
+
+ With JIT provisioning, user accounts are automatically created in Twenty when someone logs in via SSO for the first time. They're assigned the default role automatically.
+
+
+
+ Yes, once SSO is configured, you can disable password login for SSO users to enforce authentication through your identity provider.
+
+
diff --git a/packages/twenty-docs/l/zh/user-guide/permissions-access/overview.mdx b/packages/twenty-docs/l/zh/user-guide/permissions-access/overview.mdx
new file mode 100644
index 0000000000..fb3d2ca5dd
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/permissions-access/overview.mdx
@@ -0,0 +1,40 @@
+---
+title: Permissions & Access
+description: Manage roles, permissions, and access control in your workspace.
+---
+
+
+
+
+
+Twenty's permission system lets you control who can access and modify data in your workspace. Create roles, assign permissions, and configure SSO for secure access.
+
+## What's in this section
+
+
+
+ Create roles and configure object, field, and settings permissions.
+
+
+
+ Set up Single Sign-On with your identity provider.
+
+
+
+ Common questions about roles, permissions, and SSO.
+
+
+
+## Key features
+
+* **Role-based access**: Create custom roles with specific permissions
+* **Object permissions**: Control who can view, edit, or delete records
+* **Field permissions**: Restrict access to sensitive fields
+* **Settings permissions**: Control access to workspace configuration
+* **SSO integration**: Configure single sign-on for enterprise security (Organization plan)
+
+## Quick links
+
+* [Create a role](/l/zh/user-guide/permissions-access/capabilities/permissions#create-a-role)
+* [Configure SSO](/l/zh/user-guide/permissions-access/capabilities/sso-configuration)
+* [Manage team members](/l/zh/user-guide/settings/capabilities/member-management)
diff --git a/packages/twenty-docs/l/zh/user-guide/settings/capabilities/domains-settings.mdx b/packages/twenty-docs/l/zh/user-guide/settings/capabilities/domains-settings.mdx
new file mode 100644
index 0000000000..b2c49c5ae2
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/settings/capabilities/domains-settings.mdx
@@ -0,0 +1,47 @@
+---
+title: Domain Settings
+description: Configure workspace domain, approved access domains, and public domains.
+---
+
+Configure domain settings under **Settings → Domains**.
+
+## Workspace Domain
+
+Edit your subdomain name or set a custom domain for your workspace.
+
+### Customize Domain
+
+1. Click **Customize Domain**
+2. Edit your subdomain (e.g., `yourcompany.twenty.com`)
+3. Or set up a custom domain (e.g., `crm.yourcompany.com`)
+
+For custom domains, you'll need to configure DNS settings with your domain provider.
+
+## Approved Domains
+
+Anyone with an email address at these domains is allowed to sign up for this workspace automatically.
+
+### Add Approved Access Domain
+
+1. Click **Add Approved Access Domain**
+2. Enter your company domain (e.g., `yourcompany.com`)
+3. Save
+
+Once configured, anyone with an email address at that domain can join your workspace without needing a direct invitation.
+
+
+ This is useful for allowing your entire team to self-register while keeping the workspace restricted to your organization.
+
+
+## Public Domains
+
+Provision a complete and secure hosting environment on these domains.
+
+### Add Public Domain
+
+1. Click **Add Public Domain**
+2. Enter the domain you want to use
+3. Configure DNS settings as instructed
+4. Verify the domain
+
+SSL certificates are automatically provisioned for public domains.
diff --git a/packages/twenty-docs/l/zh/user-guide/settings/capabilities/experience-settings.mdx b/packages/twenty-docs/l/zh/user-guide/settings/capabilities/experience-settings.mdx
index 560a61c6fb..e279f7d88b 100644
--- a/packages/twenty-docs/l/zh/user-guide/settings/capabilities/experience-settings.mdx
+++ b/packages/twenty-docs/l/zh/user-guide/settings/capabilities/experience-settings.mdx
@@ -1,38 +1,38 @@
---
-title: 体验设置
-description: 自定义界面主题和地区偏好。
+title: Experience Settings
+description: Customize your interface theme and regional preferences.
---
-在 **设置 → 体验** 中个性化您的 Twenty 体验。
+Personalize your Twenty experience under **Settings → Experience**.
-## 外观
+## Appearance
-选择您的外观主题:
+Choose your visual theme:
-* **浅色**:清爽明亮的界面
-* **深色**:在低光照条件下对眼睛更友好
-* **系统设置**:自动匹配您设备的主题
+* **Light**: Clean, bright interface
+* **Dark**: Easier on the eyes in low-light conditions
+* **System settings**: Automatically matches your device's theme
-## 语言
+## Language
-从下拉菜单中选择您在 Twenty 界面中偏好的语言。
+Select your preferred language for the Twenty interface from the dropdown menu.
-## 格式
+## Formats
-配置日期、时间、数字、时区和日历开始日。
+Configure date, time, number, timezone, and calendar start day.
-| 设置 | 描述 |
-| --------- | ---------------------------- |
-| **时区** | 您的本地时区,用于确保时间戳和日程安排的准确性 |
-| **日期格式** | 日期的显示方式(例如:2025 年 12 月 12 日) |
-| **时间格式** | 12 小时制(下午 7:22)或 24 小时制 |
-| **数字格式** | 小数和千位分隔符(例如:1,234.56) |
-| **日历开始日** | 一周的第一天(周日或周一) |
+| Setting | Description |
+| ---------------------- | ---------------------------------------------------------- |
+| **Time zone** | Your local timezone for accurate timestamps and scheduling |
+| **Date format** | How dates appear (e.g., Dec 12, 2025) |
+| **Time format** | 12-hour (7:22 PM) or 24-hour format |
+| **Number format** | Decimal and thousands separators (e.g., 1,234.56) |
+| **Calendar start day** | First day of the week (Sunday or Monday) |
-每个设置都可以设为**系统设置**以自动匹配您设备的偏好,或者您可以选择特定的格式。
+Each setting can be set to **System settings** to automatically match your device preferences, or you can choose a specific format.
-## 如何更新
+## How to Update
-1. 进入 **设置 → 体验**
-2. 在各个部分中调整偏好
-3. 更改会自动保存
+1. Go to **Settings → Experience**
+2. Adjust your preferences in each section
+3. Changes save automatically
diff --git a/packages/twenty-docs/l/zh/user-guide/settings/capabilities/member-management.mdx b/packages/twenty-docs/l/zh/user-guide/settings/capabilities/member-management.mdx
new file mode 100644
index 0000000000..c7fd84ee85
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/settings/capabilities/member-management.mdx
@@ -0,0 +1,87 @@
+---
+title: Member Management
+description: Invite team members and manage workspace access.
+---
+
+Manage who has access to your workspace under **Settings → Members**.
+
+## Invite New Members
+
+### Using Email Invitation
+
+1. Go to **Settings → Members**
+2. Click **+ Invite**
+3. Enter the person's email address
+4. Select a role for the new member
+5. Click **Send invite**
+
+The invited person will receive an email with a link to join your workspace.
+
+### Using Invite Link
+
+1. Go to **Settings → Members**
+2. Copy the workspace invite link
+3. Share the link with new team members
+4. They'll receive access once they sign up
+
+## View and Manage Members
+
+### View All Members
+
+Go to **Settings → Members** to see:
+
+* All active members
+* Pending invitations
+
+### Edit a Member's Profile
+
+Click on a member to open their profile page. As an admin, you can:
+
+* Edit their **name**
+* Update their **profile picture**
+* **Impersonate** their account (useful for troubleshooting)
+* **Delete** their account
+
+### Change a Member's Role
+
+On the member's profile page:
+
+1. Open the **Permissions** tab
+2. View the currently assigned role
+3. Select a different role from the dropdown
+4. The change takes effect immediately
+
+→ [Learn more about roles and permissions](/l/zh/user-guide/permissions-access/capabilities/permissions)
+
+### Remove a Member
+
+1. Click on the member to open their profile
+2. Click **Delete** to remove them from the workspace
+
+
+ Removed members lose access immediately. Their data (records, notes, tasks) remains in the workspace.
+
+
+
+ **Email sync is also removed.** If the deleted user was the only one who synced certain emails, those emails will be permanently removed from the workspace.
+
+
+## Pending Invitations
+
+Manage invitations that haven't been accepted:
+
+* **Resend**: Send the invitation email again
+* **Cancel**: Revoke the invitation before it's accepted
+
+## Approved Access Domains
+
+Allow team members to join automatically based on their email domain:
+
+1. Go to **Settings → Domains**
+2. Add your company domain (e.g., `yourcompany.com`)
+3. Anyone with that email domain can join without an invitation
+
+## Related
+
+* [Permissions](/l/zh/user-guide/permissions-access/capabilities/permissions) — configure what each role can do
+* [Domains Settings](/l/zh/user-guide/settings/capabilities/domains-settings) — configure approved domains
diff --git a/packages/twenty-docs/l/zh/user-guide/settings/capabilities/profile-settings.mdx b/packages/twenty-docs/l/zh/user-guide/settings/capabilities/profile-settings.mdx
index fe9c5618e1..febfa4a86f 100644
--- a/packages/twenty-docs/l/zh/user-guide/settings/capabilities/profile-settings.mdx
+++ b/packages/twenty-docs/l/zh/user-guide/settings/capabilities/profile-settings.mdx
@@ -1,43 +1,43 @@
---
-title: 个人资料设置
-description: 管理您的个人资料和安全设置。
+title: Profile Settings
+description: Manage your personal profile and security settings.
---
-## 个人信息
+## Personal Information
-### 姓名和邮箱
+### Name and Email
-* **显示名称**:更新您的姓名对其他工作空间成员的显示方式
-* **电子邮件地址**:更改您的登录电子邮件(需要验证)
-* **个人头像**:上传自定义头像或使用您的姓名首字母
+* **Display Name**: Update how your name appears to other workspace members
+* **Email Address**: Change your login email (requires verification)
+* **Profile Picture**: Upload a custom avatar or use your initials
-## 安全设置
+## Security Settings
-### 双因素认证 (2FA)
+### Two-Factor Authentication (2FA)
-启用 2FA 为您的帐户增加一个额外的安全层:
+Enable 2FA to add an extra layer of security to your account:
-1. 转到 **设置 → 个人资料设置**
-2. 单击 **启用 2FA**
-3. 使用您的身份验证应用扫描 QR 码
-4. 输入验证码以确认
+1. Go to **Settings → Profile Settings**
+2. Click **Enable 2FA**
+3. Scan the QR code with your authenticator app
+4. Enter the verification code to confirm
-### 密码管理
+### Password Management
-* **更改密码**:更新您当前的密码
-* **密码要求**:至少 8 个字符
+* **Change Password**: Update your current password
+* **Password Requirements**: Must be at least 8 characters long
-## 个人资料管理
+## Profile Management
-### 删除帐户
+### Delete Account
- 删除您的帐户将永久移除您对所有工作空间的访问权限。 此操作无法撤销。您将失去对所有工作空间的访问权限。如果您只想退出特定团队,您应该考虑单独退出工作空间。
+ Deleting your account will permanently remove your access to all workspaces. This action cannot be undone, you'll lose access to all workspaces where you're a member, and you should consider leaving individual workspaces instead if you only want to exit specific teams.
-要删除您的帐户:
+To delete your account:
-1. 转到 **设置 → 个人资料设置**
-2. 滚动至 **危险区**
-3. 单击 **删除帐户**
-4. 输入您的电子邮箱地址以确认
+1. Go to **Settings → Profile Settings**
+2. Scroll to **Danger Zone**
+3. Click **Delete Account**
+4. Confirm by typing your email address
diff --git a/packages/twenty-docs/l/zh/user-guide/settings/capabilities/releases-settings.mdx b/packages/twenty-docs/l/zh/user-guide/settings/capabilities/releases-settings.mdx
new file mode 100644
index 0000000000..4180b67161
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/settings/capabilities/releases-settings.mdx
@@ -0,0 +1,31 @@
+---
+title: Releases Settings
+description: Enable experimental features in Twenty.
+---
+
+## About Releases Settings
+
+The Releases section allows you to enable experimental features before they're generally available.
+
+## Lab Features
+
+Lab features are experimental capabilities that are still being developed. They may change or be removed without notice.
+
+### How to Enable Lab Features
+
+1. Go to **Settings → Releases**
+2. Find the feature you want to enable
+3. Toggle it on
+4. The feature will be available immediately
+
+
+ Lab features are experimental and may not work as expected. Use them with caution in production environments.
+
+
+## Feature Feedback
+
+Your feedback helps improve Twenty:
+
+* Report issues with experimental features
+* Share how you're using new features
+* Suggest improvements via the community Discord
diff --git a/packages/twenty-docs/l/zh/user-guide/settings/capabilities/workspace-settings.mdx b/packages/twenty-docs/l/zh/user-guide/settings/capabilities/workspace-settings.mdx
new file mode 100644
index 0000000000..f72f71a814
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/settings/capabilities/workspace-settings.mdx
@@ -0,0 +1,30 @@
+---
+title: Workspace Settings
+description: Customize your workspace name and branding.
+---
+
+Those are accessible under **Settings → General**.
+
+## Workspace Picture
+
+* **Upload Logo**: Add a custom workspace logo
+* **Supported formats**: PNG, JPEG, and GIF files under 10MB
+* **Remove**: Delete the current workspace logo
+
+## Workspace Name
+
+* **Name**: Change your workspace display name
+* This name appears to all workspace members
+
+## Danger Zone
+
+
+ Deleting your workspace permanently removes all data and cannot be undone. All workspace data will be lost forever, all members will lose access immediately, and this action cannot be reversed.
+
+
+To delete your workspace:
+
+1. Click **Delete workspace** button
+2. Confirm the deletion when prompted
+
+**Note**: Only workspace administrators can delete workspaces.
diff --git a/packages/twenty-docs/l/zh/user-guide/settings/how-tos/settings-faq.mdx b/packages/twenty-docs/l/zh/user-guide/settings/how-tos/settings-faq.mdx
new file mode 100644
index 0000000000..19aa50e5a0
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/settings/how-tos/settings-faq.mdx
@@ -0,0 +1,171 @@
+---
+title: Settings FAQ
+description: Frequently asked questions about Twenty settings.
+image: /images/user-guide/setup/settings.png
+---
+
+## Workspace Settings
+
+
+
+ 1. Go to **Settings → General**
+ 2. Find the Workspace Name field
+ 3. Enter your new name
+ 4. Changes save automatically
+
+
+
+ 1. Go to **Settings → General**
+ 2. Click on the current logo or upload area
+ 3. Select an image file (PNG, JPEG, or GIF under 10MB)
+ 4. The logo updates immediately
+
+
+
+ Yes, you can create and be a member of multiple workspaces. Each workspace has its own data, settings, and subscription.
+
+
+
+ 1. Go to **Settings → General**
+ 2. Scroll to Danger Zone
+ 3. Click **Delete workspace**
+ 4. Confirm the deletion
+
+ Note: This permanently deletes all data and cannot be undone.
+
+
+
+ Delete the workspaces you no longer need under **Settings → General → Delete workspace**.
+
+
+ Do not delete your **account** (accessible under Settings → Profile): your account is shared among all your workspaces. Deleting your account removes access to ALL workspaces.
+
+
+
+
+ If you want to temporarily disable your workspace (not permanently delete it), go to **Settings → Billing** and click **Cancel Plan**. Your data will be preserved for a grace period.
+
+
+
+## Profile Settings
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Find the Password section
+ 3. Enter your current password
+ 4. Enter your new password
+ 5. Save changes
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Find the 2FA section
+ 3. Click **Enable 2FA**
+ 4. Scan the QR code with your authenticator app
+ 5. Enter the verification code
+
+
+
+ To change your email address, please reach out to [contact@twenty.com](mailto:contact@twenty.com).
+
+
+
+ 1. Go to **Settings → Profile**
+ 2. Scroll to Danger Zone
+ 3. Click **Delete Account**
+ 4. Confirm by typing your email
+
+ Note: This removes your access to all workspaces and deletes all emails synced from your connected accounts.
+
+
+
+## Experience Settings
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find the Theme section
+ 3. Select Light, Dark, or System
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Date Format
+ 3. Select your preferred format
+ 4. Changes apply immediately
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Time Zone
+ 3. Select your local time zone
+ 4. All timestamps will adjust
+
+
+
+ 1. Go to **Settings → Experience**
+ 2. Find Language
+ 3. Select from available languages
+ 4. The interface updates to your selection
+
+
+
+## Account Settings
+
+
+
+ 1. Go to **Settings → Accounts**
+ 2. Click **Add account**
+ 3. Choose Google or Microsoft
+ 4. Authorize access
+ 5. Configure sync settings
+
+
+
+ Yes, you can connect multiple email accounts. Go to **Settings → Accounts** and add additional accounts as needed.
+
+
+
+ 1. Go to **Settings → Accounts**
+ 2. Find the account to remove
+ 3. Click **Disconnect**
+ 4. Confirm the action
+
+
+
+## Domains
+
+
+
+ Yes! Go to **Settings → Domains** and click **Customize Domain**. You have two options:
+
+ * **Subdomain**: Use a Twenty subdomain like `yourcompany.twenty.com`
+ * **Custom domain**: Use your own domain like `crm.yourcompany.com` (requires DNS configuration)
+
+ A subdomain is quick to set up, while a custom domain provides a fully branded experience for your team.
+
+
+
+ You can configure approved access domains so team members with company email addresses can automatically join your workspace. Go to **Settings → Domains** and add your company domain (e.g., `yourcompany.com`).
+
+
+
+## Lab Features
+
+
+
+ Lab features are experimental capabilities being tested before general release. They may change or be removed without notice.
+
+
+
+ Lab features are functional but may have bugs or unexpected behavior. Use them cautiously in production environments.
+
+
+
+ 1. Go to **Settings → Releases → Lab**
+ 2. Find the feature you want
+ 3. Toggle it on
+ 4. The feature becomes available immediately
+
+
diff --git a/packages/twenty-docs/l/zh/user-guide/settings/overview.mdx b/packages/twenty-docs/l/zh/user-guide/settings/overview.mdx
new file mode 100644
index 0000000000..974134cd13
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/settings/overview.mdx
@@ -0,0 +1,67 @@
+---
+title: Settings
+description: Set up your Twenty workspace with essential configurations.
+image: /images/user-guide/setup/settings.png
+---
+
+
+
+
+
+## Initial Setup
+
+When you first create your workspace, there are several key settings to configure.
+
+### Workspace Name and Logo
+
+1. Go to **Settings → General**
+2. Update your workspace name
+3. Upload your company logo
+4. Save your changes
+
+### Time Zone and Date Format
+
+1. Go to **Settings → Experience**
+2. Select your time zone
+3. Choose your preferred date format
+4. Save your changes
+
+## Essential Configurations
+
+### Connect Email and Calendar
+
+Set up email and calendar sync:
+
+1. Go to **Settings → Accounts**
+2. Click **Add account**
+3. Connect your Google or Microsoft account
+4. Configure sync settings
+
+→ [Complete email & calendar setup guide](/l/zh/user-guide/calendar-emails/overview)
+
+### Invite Your Team
+
+Add team members to your workspace:
+
+1. Go to **Settings → Members**
+2. Click **+ Invite**
+3. Enter email addresses
+4. Assign appropriate roles
+
+
+ Before inviting your team, check the default role under **Settings → Roles**. New members are automatically assigned this role when they join.
+
+
+## Workspace Settings Checklist
+
+* Workspace name and logo configured
+* Time zone and date format set
+* Email and calendar connected
+* Team members invited
+* Roles and permissions configured
+
+## Next Steps
+
+* [Workspace settings](/l/zh/user-guide/settings/capabilities/workspace-settings)
+* [Profile settings](/l/zh/user-guide/settings/capabilities/profile-settings)
+* [Experience settings](/l/zh/user-guide/settings/capabilities/experience-settings)
diff --git a/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/calendar-view.mdx b/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/calendar-view.mdx
new file mode 100644
index 0000000000..84649f6e30
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/calendar-view.mdx
@@ -0,0 +1,46 @@
+---
+title: Calendar View
+description: Display records with date fields on a calendar.
+---
+
+## About Calendar View
+
+Calendar view displays your records on a calendar based on a date field. Each record appears as an event on the corresponding date.
+
+
+
+## Creating a Calendar View
+
+1. Navigate to an object with date fields
+2. Click the view dropdown → **+ Add view**
+3. Name your view and click **Create**
+4. Open the **Options** on the right
+5. Select **Calendar** as the layout
+6. Choose the **date field** to use for positioning records
+7. Click **Update view**
+
+## Configuring the Calendar
+
+### Choose the Date Field
+
+Under **Options**, select which date field determines where records appear on the calendar.
+
+### Display Fields
+
+Configure which fields show on each calendar event:
+
+1. Click **Options → Fields**
+2. Toggle fields on/off
+3. Drag to reorder
+
+## Use Cases
+
+* **Meetings and calls**: View upcoming appointments
+* **Deadlines**: Track due dates and close dates
+* **Events**: Plan and visualize scheduled activities
+* **Follow-ups**: See when tasks are due
+
+## Related
+
+* [Views Overview](/l/zh/user-guide/views-pipelines/overview) — creating and managing views
+* [Filters and Sorting](/l/zh/user-guide/views-pipelines/capabilities/filters-and-sorting) — filtering calendar data
diff --git a/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/fields-and-columns.mdx b/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/fields-and-columns.mdx
new file mode 100644
index 0000000000..4024621fcc
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/fields-and-columns.mdx
@@ -0,0 +1,52 @@
+---
+title: Fields & Columns
+description: Choose which fields to display and how to organize them.
+---
+
+## Selecting Fields to Display
+
+Each view can show a different set of fields. Customize what's visible to focus on the information that matters.
+
+### Show or Hide Fields
+
+1. Click **Options** in the top right
+2. Click **Fields**
+3. Click the **eye icon** next to each field to show/hide it
+
+### Reorder Fields
+
+Change the order fields appear in your view:
+
+1. Click **Options → Fields**
+2. Drag fields up or down
+3. Changes save automatically
+
+## Field Display by View Type
+
+### Table Views
+
+* Fields appear as columns
+* Resize columns by dragging borders
+
+### Kanban Views
+
+* Fields appear on cards
+* Reorder via Options → Fields
+* Use Compact view to hide all fields
+
+### Calendar Views
+
+* Selected fields show on calendar events
+* Configure via Options → Fields
+
+## Best Practices
+
+* **Show only what's needed** — too many fields clutters the view
+* **Put important fields first** — most-used columns on the left
+* **Create multiple views** — different field sets for different purposes
+* **Use field visibility per view** — same object, different focus
+
+## Related
+
+* [Table Views](/l/zh/user-guide/views-pipelines/capabilities/table-views) — list view features
+* [Kanban Views](/l/zh/user-guide/views-pipelines/capabilities/kanban-views) — card-based views
diff --git a/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx b/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx
new file mode 100644
index 0000000000..7047b6c9f0
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/filters-and-sorting.mdx
@@ -0,0 +1,78 @@
+---
+title: Filters & Sorting
+description: Filter and sort records to find exactly what you need.
+---
+
+## Filtering Data
+
+Filters help you focus on specific records by showing only those that match your criteria.
+
+### Adding a Filter
+
+1. Click the **Filter** button in the toolbar
+2. Select the field to filter by
+3. Choose the operator (equals, contains, etc.)
+4. Enter the filter value
+5. Click **Apply**
+
+### Filter Operators
+
+| Field Type | Available Operators |
+| ---------- | -------------------------------------------------- |
+| Text | Equals, Contains, Starts with, Ends with, Is empty |
+| Number | Equals, Greater than, Less than, Between, Is empty |
+| Date | Equals, Before, After, Between, Is empty |
+| Select | Equals, Is any of, Is empty |
+| Checkbox | Is true, Is false |
+| Relation | Equals, Is empty |
+
+### Multiple Filters
+
+Combine multiple filters to narrow down results:
+
+* All filters are applied with AND logic
+* Each additional filter further restricts results
+
+### Removing Filters
+
+* Click the **X** on individual filter chips
+* Click **Clear all** to remove all filters
+
+## Sorting Data
+
+Sorting determines the order records appear.
+
+### Adding a Sort
+
+1. Click the **Sort** button in the toolbar
+2. Select the field to sort by
+3. Choose ascending (A-Z, 0-9) or descending (Z-A, 9-0)
+4. Click **Apply**
+
+### Multiple Sorts
+
+Add multiple sort levels:
+
+* First sort is primary
+* Subsequent sorts apply within groups of equal values
+
+### Quick Column Sorting
+
+Click any column header to sort:
+
+* First click: Ascending
+* Second click: Descending
+* Third click: Remove sort
+
+## Saving Filter and Sort Settings
+
+Filters and sorts are saved with the view:
+
+1. Configure your filters and sorts
+2. Click **Save** to update the current view
+3. Or click **Save as new view** to create a variant
+
+## Related
+
+* [Table Views](/l/zh/user-guide/views-pipelines/capabilities/table-views) — group by feature
+* [Views Overview](/l/zh/user-guide/views-pipelines/overview) — building and managing views
diff --git a/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/kanban-views.mdx b/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/kanban-views.mdx
new file mode 100644
index 0000000000..fa616d2f3d
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/kanban-views.mdx
@@ -0,0 +1,99 @@
+---
+title: Kanban Board Views
+description: Learn how to use Kanban views to visualize and manage your workflows.
+image: /images/user-guide/kanban-views/kanban.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## About Kanban Views
+
+Kanban views visually map out process flows, where each column stands for a distinct stage and each card represents a record.
+
+## Move Cards between Stages
+
+You can move each card between stages as it goes through your workflow by dragging and dropping. To proceed, hold your click on a card and move it to the next stage.
+
+
+
+## Add and Delete Stages
+
+You can tailor your workflow to suit your needs using stages, which represent a value in a Select Field:
+
+### Add Stages
+
+To add a stage, access the Select field settings by navigating to Settings > Data Model, selecting your object, and then the field your Kanban board depends on.
+
+
+
+### Remove Stages
+
+To remove a stage, hover the stage name or the `⋮` icon, click `Edit from settings` in the Select field settings, and then click **Delete** next to the relevant stage.
+
+## Display Fields
+
+You can configure your Kanban board to display some fields and hide others. To hide a field, click on **Options** on the top right, then on **Fields** to bring up the list of options. Look for the field needed in the Hidden Fields section and click on the eye button to display the field.
+
+You can also rearrange the order of fields by holding down the field name and dragging it to where you want it.
+
+
+
+## Compact View
+
+You can hide all the fields and get an overview of all records at a glance. To enable:
+
+1. Click **Options** on the top right
+2. Turn on the toggle for **Compact view**
+
+
+
+## Column Aggregations
+
+Each column in a Kanban view can display aggregated values at the top, helping you understand your data at a glance.
+
+### Available Aggregations
+
+| Aggregation | Description |
+| ----------- | --------------------------------------------- |
+| **Count** | Number of records in the column |
+| **Sum** | Total of a numeric field (e.g., deal amounts) |
+| **Average** | Average value of a numeric field |
+| **Min** | Lowest value |
+| **Max** | Highest value |
+
+### Configuring Aggregations
+
+1. Click on the number displayed next to the Stage value, at the top of a column
+2. Select the aggregation type
+3. Choose the field to aggregate
+
+**Example:** Show total deal value per stage by aggregating the Amount field with Sum.
+
+## When to Use Kanban Views
+
+Kanban views are ideal for:
+
+* **Sales pipelines**: Track deals through stages from lead to close
+* **Project management**: Monitor tasks through workflow states
+* **Recruitment**: Track candidates through hiring stages
+* **Any staged process**: Visualize any workflow with defined stages
+
+## Best Practices
+
+### Organize Your Stages
+
+* **Limit stages**: 5-7 stages is ideal for visibility
+* **Clear naming**: Use descriptive stage names
+* **Logical order**: Arrange stages in process order
+
+### Optimize Card Display
+
+* **Show key fields**: Display only the most important information
+* **Use compact view**: For high-level overviews
+* **Color coding**: Use stage colors to quickly identify status
+
+### Maintain Data Quality
+
+* **Update regularly**: Keep cards moving through stages
+* **Archive completed**: Move closed items out of active view
+* **Review stale cards**: Follow up on cards stuck in stages
diff --git a/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/table-views.mdx b/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/table-views.mdx
new file mode 100644
index 0000000000..b835bc7488
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/table-views.mdx
@@ -0,0 +1,64 @@
+---
+title: Table Views
+description: Display your data in a spreadsheet-like list format.
+---
+
+## About Table Views
+
+Table views display records in rows with customizable columns—like a spreadsheet. This is the default view type for most objects.
+
+
+
+## Features
+
+### Column Configuration
+
+* Show or hide columns (fields)
+* Resize column widths
+* Reorder columns by dragging
+
+### Group By a Select Field
+
+Organize records into collapsible groups based on a field of select type.
+
+
+
+1. Click **Options**
+2. Select **Group**
+3. Choose a Select field
+4. Configure group order under **Options → Group → Sort**:
+ * **Alphabetical** or **Reverse alphabetical**
+ * **Manual order**: Drag groups under "Visible groups" to reorder
+ * Click the **eye icon** next to a group to hide it
+
+**Use cases:**
+
+* Group Company by Type
+* Group Opportunities by Stage
+* Group Tasks by Status
+
+
+ **For best performance, limit to 10-15 visible groups per view.** If you need more groups, consider using a Dashboard instead.
+
+
+### Column Widths
+
+Resize columns to show more or less content:
+
+1. Hover between two column headers
+2. Click and drag the column border
+3. Release to set the new width
+
+## When to Use Table Views
+
+Table views work best for:
+
+* **Browsing large datasets** — scan many records quickly
+* **Data entry** — edit multiple records efficiently
+* **Detailed analysis** — see many fields at once
+* **Sorting and filtering** — find specific records
+
+## Related
+
+* [Fields and Columns](/l/zh/user-guide/views-pipelines/capabilities/fields-and-columns) — configuring which fields to display
+* [Filters and Sorting](/l/zh/user-guide/views-pipelines/capabilities/filters-and-sorting) — narrowing down records
diff --git a/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/view-settings.mdx b/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/view-settings.mdx
new file mode 100644
index 0000000000..d875f28c7e
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/views-pipelines/capabilities/view-settings.mdx
@@ -0,0 +1,74 @@
+---
+title: View Settings
+description: Manage view visibility, naming, icons, and organization.
+---
+
+## View Visibility
+
+Control who can see your custom views.
+
+### Visibility Options
+
+| Setting | Who Can See |
+| ------------- | --------------------- |
+| **Workspace** | All workspace members |
+| **Unlisted** | Only you |
+
+### Changing Visibility
+
+1. Open the view
+2. Click **Options → Visibility**
+3. Select **Workspace** or **Unlisted**
+
+
+ The default "All [Object Name]" views cannot have their visibility changed.
+
+
+## Rename a View
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Edit**
+4. Enter the new name
+
+## Change View Icon
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Edit**
+4. Click the icon to change it
+
+## Reorder Views
+
+Change the order views appear in the dropdown:
+
+1. Open the view dropdown
+2. Drag views by their handle
+3. Drop in the desired position
+4. Order saves automatically
+
+## Favorites
+
+Pin frequently used views for quick access:
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to a view
+3. Select **Add to favorites**
+
+Favorited views appear in a dedicated section for easy access.
+
+## Delete a View
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view
+3. Select **Delete**
+4. Confirm deletion
+
+
+ Deleted views cannot be recovered.
+
+
+## Related
+
+* [Views Overview](/l/zh/user-guide/views-pipelines/overview) — creating views
+* [How to Restrict Access](/l/zh/user-guide/views-pipelines/how-tos/restrict-access-to-your-view) — step-by-step guide
diff --git a/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx b/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
new file mode 100644
index 0000000000..06c68b9b71
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due.mdx
@@ -0,0 +1,61 @@
+---
+title: Create a Calendar View for Tasks Due
+description: Visualize your tasks and deadlines on a calendar.
+---
+
+
+
+## Prerequisites
+
+Your Tasks object needs a **Due Date** field (Date or Date & Time type).
+
+## Steps
+
+1. Navigate to **Tasks**
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Tasks Calendar")
+4. Click **Create**
+5. Click **Options** and select **Calendar** as the layout
+6. Choose **Due Date** as the date field
+7. Click **Save**
+
+## Configure Your Calendar
+
+### Display Fields on Events
+
+1. Click **Options → Fields**
+2. Click the **eye icon** to show/hide fields
+3. Drag to reorder
+
+Recommended fields to display:
+
+* **Title** — task name
+* **Assignee** — who's responsible
+* **Status** — current progress
+
+### Filter Your Calendar
+
+Create focused views:
+
+* **My Tasks**: Filter by Assignee = Me
+* **This Week**: Filter by Due Date = This week
+* **Overdue**: Filter by Due Date < Today, Status ≠ Done
+
+## Other Calendar Use Cases
+
+| Object | Date Field | Purpose |
+| ------------- | ---------- | ------------------------- |
+| Opportunities | Close Date | Track expected closes |
+| Custom Events | Event Date | Plan activities |
+| Projects | Deadline | Monitor project timelines |
+
+## Tips
+
+* **Review weekly**: Start each week by checking your calendar view
+* **Combine with table view**: Use calendar for overview, table for details
+* **Set visibility**: Keep personal task calendars as Unlisted
+
+## Related
+
+* [Calendar View](/l/zh/user-guide/views-pipelines/capabilities/calendar-view) — all calendar features
+* [Filters and Sorting](/l/zh/user-guide/views-pipelines/capabilities/filters-and-sorting) — filter your calendar
diff --git a/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx b/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
new file mode 100644
index 0000000000..e7c9f0a09b
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects.mdx
@@ -0,0 +1,80 @@
+---
+title: Create a Kanban View for Projects
+description: Track projects through stages using a visual board.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Use a Kanban view to visualize your projects (or any object with stages) as cards moving through columns.
+
+
+
+## Prerequisites
+
+Your object needs a **Select field** to use as columns (e.g., Status, Stage, Phase).
+
+If you don't have one:
+
+1. Go to **Settings → Data Model**
+2. Select your object
+3. Add a Select field with your stage options
+
+## Steps
+
+1. Navigate to your object (e.g., Projects, Tasks)
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Project Board")
+4. Click **Create**
+5. Click **Options** and select **Kanban** as the layout
+6. The view uses your Select field for columns automatically
+7. Click **Save**
+
+## Configure Your Board
+
+### Show Key Fields on Cards
+
+1. Click **Options → Fields**
+2. Find fields in the "Hidden Fields" section
+3. Click the **eye icon** to display them on cards
+4. Drag to reorder
+
+
+
+### Enable Compact View
+
+For a high-level overview:
+
+1. Click **Options**
+2. Turn on **Compact view**
+
+Cards show only the record name.
+
+
+
+### Add Aggregations
+
+Show counts or totals at the top of each column:
+
+1. Click the number next to a column name
+2. Select an aggregation (Count, Sum, etc.)
+3. Choose a field if needed
+
+## Moving Cards
+
+Drag and drop cards between columns to update their status.
+
+
+
+## Example: Task Board
+
+| Column (Status) | Cards |
+| --------------- | ----------------- |
+| **To Do** | New tasks |
+| **In Progress** | Active work |
+| **Review** | Awaiting approval |
+| **Done** | Completed |
+
+## Related
+
+* [Kanban Views](/l/zh/user-guide/views-pipelines/capabilities/kanban-views) — aggregations, compact view, stages
+* [How to Set Up a Sales Pipeline](/l/zh/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline) — Kanban for Opportunities
diff --git a/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx b/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx
new file mode 100644
index 0000000000..ee98214ec2
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping.mdx
@@ -0,0 +1,51 @@
+---
+title: Create a Table View with Grouping
+description: Organize your records into collapsible groups by field value.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+Group your table view by a Select field to organize records into collapsible sections.
+
+
+
+## Steps
+
+1. Navigate to the object (People, Companies, etc.)
+2. Click the view dropdown → **+ Add view**
+3. Name your view (e.g., "Companies by Type")
+4. Click **Create**
+5. Click **Options → Group**
+6. Choose a Select field to group by
+7. Click **Save**
+
+## Configure Group Order
+
+Under **Options → Group → Sort**, choose how groups are ordered:
+
+| Option | Description |
+| ------------------------ | --------------------------------------------- |
+| **Alphabetical** | A to Z |
+| **Reverse alphabetical** | Z to A |
+| **Manual order** | Drag groups to reorder under "Visible groups" |
+
+Click the **eye icon** next to a group to hide it from the view.
+
+
+ **For best performance, limit to 10-15 visible groups.** If you need more, consider using a Dashboard instead.
+
+
+## Example: Companies by Industry
+
+1. Go to **Companies**
+2. Create a new view named "By Industry"
+3. Click **Options → Group**
+4. Select the **Industry** field
+5. Save
+
+Now your companies are organized by industry, making it easy to focus on one segment at a time.
+
+## Related
+
+* [Table Views](/l/zh/user-guide/views-pipelines/capabilities/table-views) — all table view features
+* [Filters and Sorting](/l/zh/user-guide/views-pipelines/capabilities/filters-and-sorting) — combine grouping with filters
diff --git a/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx b/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
new file mode 100644
index 0000000000..1901e1c197
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
@@ -0,0 +1,32 @@
+---
+title: Restrict Access to Your View
+description: Control who can see your custom views.
+---
+
+Each view (except the default "All [Object Name]" views) has its own visibility setting.
+
+## Steps
+
+1. Open the view you want to restrict
+2. Click **Options** in the top right
+3. Click **Visibility**
+4. Select **Unlisted**
+
+Your view is now visible only to you.
+
+## Visibility Options
+
+| Setting | Who Can See |
+| ------------- | --------------------- |
+| **Workspace** | All workspace members |
+| **Unlisted** | Only you |
+
+## Notes
+
+* The default "All [Object Name]" views cannot be made unlisted
+* Unlisted views don't appear in other users' view dropdowns
+* You can change visibility back to Workspace at any time
+
+## Related
+
+* [View Settings](/l/zh/user-guide/views-pipelines/capabilities/view-settings) — all view configuration options
diff --git a/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx b/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx
new file mode 100644
index 0000000000..ab8aef1974
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline.mdx
@@ -0,0 +1,120 @@
+---
+title: Set Up a Sales Pipeline
+description: Configure your sales pipeline to track opportunities through stages.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+A sales pipeline in Twenty is a Kanban view of your Opportunities object, where each column represents a stage in your sales process.
+
+## Step 1: Configure Your Stages
+
+Stages are defined in the Opportunities object's **Stage** field.
+
+1. Go to **Settings → Data Model**
+2. Select **Opportunities**
+3. Find and click the **Stage** field
+4. Add, remove, or rename stages to match your process
+
+
+
+### Recommended Stages
+
+| Stage | Purpose |
+| --------------- | ----------------------------------- |
+| **New** | Fresh opportunities just identified |
+| **Qualified** | Confirmed as a good fit |
+| **Meeting** | Engaged in discussions |
+| **Proposal** | Proposal sent |
+| **Negotiation** | Working on terms |
+| **Closed Won** | Deal successful |
+| **Closed Lost** | Deal unsuccessful |
+
+
+ **5-7 stages is optimal.** Too many stages makes the pipeline hard to scan; too few loses visibility into deal progress.
+
+
+## Step 2: Create a Pipeline View
+
+1. Go to **Opportunities**
+2. Click the view dropdown → **+ Add view**
+3. Name it "Sales Pipeline"
+4. Click **Create**
+5. Open **Options** and select **Kanban** as the layout
+
+The view automatically uses the Stage field for columns.
+
+## Step 3: Configure Your View
+
+### Show Key Fields
+
+1. Click **Options → Fields**
+2. Look for fields in the "Hidden Fields" section
+3. Click the **eye icon** to display: Company, Amount, Close Date, Owner
+
+### Enable Aggregations
+
+Show totals at the top of each column:
+
+1. Click the number displayed next to a Stage name at the top of a column
+2. Select the aggregation type (Count, Sum, Average, etc.)
+3. Choose the field to aggregate (e.g., Amount)
+
+**Example:** Show total deal value per stage by aggregating Amount with Sum.
+
+### Use Compact View (Optional)
+
+For a high-level overview with minimal card content:
+
+1. Click **Options**
+2. Turn on the toggle for **Compact view**
+
+## Step 4: Create Personal and Team Views
+
+### "My Pipeline"
+
+* **Filter**: Owner = Me
+* **Visibility**: Unlisted (personal view)
+
+### "Team Pipeline"
+
+* **Filter**: None (show all)
+* **Visibility**: Workspace (shared view)
+
+### "Closing This Month"
+
+* **Type**: Table
+* **Filter**: Close Date = This month, Stage ≠ Closed Won, Stage ≠ Closed Lost
+* **Sort**: Close Date ascending
+
+## Working with Opportunities
+
+### Creating Opportunities
+
+* Click **+ New** in the Opportunities view
+* Or click **+** in a specific stage column
+
+### Moving Through Stages
+
+Drag and drop opportunity cards between columns to update their stage.
+
+
+
+## Best Practices
+
+### Pipeline Hygiene
+
+* Update deals daily as they progress
+* Move or close stale deals promptly
+* Keep close dates realistic
+
+### Stage Discipline
+
+* Define clear criteria for each stage
+* Move deals promptly when criteria are met
+* Don't let deals sit in stages too long
+
+## Related
+
+* [Kanban Views](/l/zh/user-guide/views-pipelines/capabilities/kanban-views) — aggregations and compact view
+* [Filters and Sorting](/l/zh/user-guide/views-pipelines/capabilities/filters-and-sorting) — creating filtered views
diff --git a/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx b/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
new file mode 100644
index 0000000000..70f425df81
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
@@ -0,0 +1,149 @@
+---
+title: Show Expected Amount in Your Pipeline
+description: Calculate and display weighted deal values based on stage probability.
+---
+
+The Expected Amount is a calculated value: **Amount × Probability**. This helps you forecast revenue by weighting deals based on how likely they are to close.
+
+
+ This is an example of creating [Formula Fields](/l/zh/user-guide/workflows/how-tos/crm-automations/formula-fields) using workflows.
+
+
+This guide walks you through setting up the custom fields and workflows needed to calculate and display expected amounts in your pipeline.
+
+## Step 1: Create Custom Fields
+
+You need two custom fields on the Opportunities object.
+
+### Create the Probability Field
+
+1. Go to **Settings → Data Model → Opportunities**
+2. Click **+ Add Field**
+3. Configure:
+ * **Name**: Probability
+ * **Type**: Number
+ * **Description**: Stage-based probability (0-100%)
+4. Click **Save**
+
+### Create the Expected Amount Field
+
+1. Click **+ Add Field**
+2. Configure:
+ * **Name**: Expected Amount
+ * **Type**: Currency
+ * **Description**: Calculated: Amount × Probability
+3. Click **Save**
+
+### Optional: Make Fields Read-Only for Users
+
+If you don't want users manually editing these calculated fields:
+
+1. Go to **Settings → Roles**
+2. Select the role to configure
+3. Find the Opportunities object
+4. Set **Probability** and **Expected Amount** fields to read-only
+
+This ensures only the workflows can update these values.
+
+## Step 2: Create Workflow #1 — Update Probability on Stage Change
+
+This workflow automatically sets the Probability when an opportunity moves to a new stage.
+
+### Create the Workflow
+
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Update Probability on Stage Change"
+
+### Configure the Trigger
+
+1. Add a **Record Created or Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Stage** field is updated
+
+### Add Branches for Each Stage
+
+Create a branch for each stage with its probability:
+
+| Stage | Probability |
+| ----------- | ----------- |
+| New | 10% |
+| Qualified | 25% |
+| Meeting | 40% |
+| Proposal | 60% |
+| Negotiation | 80% |
+| Closed Won | 100% |
+| Closed Lost | 0% |
+
+
+ To create a new branch, right click on the workflow canvas and click **New action**. Then, link this action to the previous node by dragging the arrow from the previous node to this new action.
+
+
+For each stage:
+
+1. Add a **Filter** node: Stage = [stage name]
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Probability
+ * Value: [probability for that stage]
+
+### Calculate Expected Amount
+
+After the branches rejoin:
+
+1. Add a **Filter** node: Amount is not empty
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Expected Amount
+ * Value: Amount × Probability
+
+## Step 3: Create Workflow #2 — Recalculate on Amount Change
+
+This workflow updates the Expected Amount when the deal Amount changes.
+
+### Create the Workflow
+
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Recalculate Expected Amount on Amount Change"
+
+### Configure the Trigger
+
+1. Add a **Record Created or Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Amount** field is updated
+
+### Add the Logic
+
+1. Add a **Filter** node: Amount is not empty
+2. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Expected Amount
+ * Value: Amount × Probability
+
+## Step 4: Display in Your Pipeline
+
+Now show the Expected Amount totals in your Kanban view:
+
+1. Open your **Sales Pipeline** Kanban view
+2. Click the **number** next to any Stage name at the top of a column
+3. Select **Sum**
+4. Choose **Expected Amount**
+
+Each column now shows the total weighted pipeline value for that stage.
+
+## Summary
+
+| Component | Purpose |
+| ------------------------- | ------------------------------------------------------------------------- |
+| **Probability field** | Stores the stage-based win probability |
+| **Expected Amount field** | Stores Amount × Probability |
+| **Workflow #1** | Updates Probability when Stage changes, then recalculates Expected Amount |
+| **Workflow #2** | Recalculates Expected Amount when Amount changes |
+| **Aggregation** | Displays Sum of Expected Amount per stage |
+
+## Related
+
+* [Formula Fields](/l/zh/user-guide/workflows/how-tos/crm-automations/formula-fields) — create calculated fields using workflows
+* [Kanban Views](/l/zh/user-guide/views-pipelines/capabilities/kanban-views) — column aggregations
+* [How to Create Custom Fields](/l/zh/user-guide/data-model/how-tos/create-custom-fields) — field configuration
diff --git a/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx b/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
new file mode 100644
index 0000000000..852856cce6
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
@@ -0,0 +1,231 @@
+---
+title: Track How Long Opportunities Stay in Each Stage
+description: Monitor deal velocity by tracking when opportunities enter each stage.
+---
+
+
+ This is an example of creating [Formula Fields](/l/zh/user-guide/workflows/how-tos/crm-automations/formula-fields) using workflows — specifically date calculations.
+
+
+Tracking when opportunities enter each stage helps you identify bottlenecks and measure deal velocity.
+
+This guide walks you through setting up custom fields and a workflow to automatically record when an opportunity moves to each stage, and calculate how many days it spent in the previous stage.
+
+## Step 1: Create Custom Fields
+
+You need two types of fields for each stage:
+
+* **Date & Time fields**: Record when the opportunity entered each stage
+* **Number fields**: Store how many days the opportunity spent in each stage
+
+### Create the "Last Entered" Fields
+
+1. Go to **Settings → Data Model → Opportunities**
+2. For each stage, click **+ Add Field** and configure:
+ * **Name**: Last Entered [Stage Name] (e.g., "Last Entered New", "Last Entered Qualified")
+ * **Type**: Date & Time
+ * **Description**: Timestamp when opportunity entered this stage
+3. Click **Save**
+
+Create these fields:
+
+* Last Entered New
+* Last Entered Qualified
+* Last Entered Meeting
+* Last Entered Proposal
+* Last Entered Negotiation
+* Last Entered Closed Won
+* Last Entered Closed Lost
+
+### Create the "Days in Stage" Fields
+
+1. For each stage, click **+ Add Field** and configure:
+ * **Name**: Days in [Stage Name] (e.g., "Days in New", "Days in Qualified")
+ * **Type**: Number
+ * **Description**: Number of days spent in this stage
+2. Click **Save**
+
+Create these fields:
+
+* Days in New
+* Days in Qualified
+* Days in Meeting
+* Days in Proposal
+* Days in Negotiation
+
+
+ You don't need "Days in" fields for Closed Won and Closed Lost since those are final stages.
+
+
+### Optional: Make Fields Read-Only
+
+If you don't want users manually editing these calculated fields:
+
+1. Go to **Settings → Roles**
+2. Select the role to configure
+3. Find the Opportunities object
+4. Set the "Last Entered" and "Days in" fields to read-only
+
+## Step 2: Create the Workflow
+
+This single workflow handles both tasks:
+
+* Records the timestamp when entering a new stage
+* Calculates days spent in the previous stage
+
+### Create the Workflow
+
+1. Go to **Workflows**
+2. Click **+ New Workflow**
+3. Name it "Track Stage Time"
+
+### Configure the Trigger
+
+1. Add a **Record Updated** trigger
+2. Select **Opportunities** as the object
+3. Filter on: **Stage** field is updated
+
+### Add Branches for Each Stage
+
+
+ To create a new branch, right click on the workflow canvas and click **New action**. Then, link this action to the previous node by dragging the arrow from the previous node to this new action.
+
+
+---
+
+**Branch 1: Stage = New (first stage)**
+
+Since this is the first stage, we only record the entry timestamp—no previous stage to calculate.
+
+1. Add a **Filter** node: Stage = New
+2. Add a **Code** action:
+
+```javascript
+export const main = async (): Promise => {
+ return { now: new Date().toISOString() };
+};
+```
+
+3. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Field: Last Entered New
+ * Value: `now` from Code node
+
+---
+
+**Branch 2: Stage = Qualified**
+
+When moving to Qualified, record entry time AND calculate days spent in New.
+
+1. Add a **Filter** node: Stage = Qualified
+2. Add a **Code** action:
+
+```javascript
+export const main = async (params: {
+ lastEnteredPreviousStage: Date;
+}): Promise => {
+ const { lastEnteredPreviousStage } = params;
+
+ const now = new Date();
+ const entryDate = new Date(lastEnteredPreviousStage);
+ const diffTime = Math.abs(now.getTime() - entryDate.getTime());
+ const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return {
+ now: now.toISOString(),
+ daysInPreviousStage: daysInPreviousStage
+ };
+};
+```
+
+3. Configure the Code node input: map `lastEnteredPreviousStage` to the **Last Entered New** field
+4. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Fields to update:
+ * Last Entered Qualified = `now`
+ * Days in New = `daysInPreviousStage`
+
+---
+
+**Branch 3: Stage = Meeting**
+
+When moving to Meeting, record entry time AND calculate days spent in Qualified.
+
+1. Add a **Filter** node: Stage = Meeting
+2. Add a **Code** action:
+
+```javascript
+export const main = async (params: {
+ lastEnteredPreviousStage: Date;
+}): Promise => {
+ const { lastEnteredPreviousStage } = params;
+
+ const now = new Date();
+ const entryDate = new Date(lastEnteredPreviousStage);
+ const diffTime = Math.abs(now.getTime() - entryDate.getTime());
+ const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return {
+ now: now.toISOString(),
+ daysInPreviousStage: daysInPreviousStage
+ };
+};
+```
+
+3. Configure the Code node input: map `lastEnteredPreviousStage` to the **Last Entered Qualified** field
+4. Add an **Update Record** action:
+ * Record: The triggering Opportunity
+ * Fields to update:
+ * Last Entered Meeting = `now`
+ * Days in Qualified = `daysInPreviousStage`
+
+---
+
+**Continue for remaining stages:**
+
+| Stage | Records | Calculates |
+| ----------- | ------------------------ | ------------------- |
+| Proposal | Last Entered Proposal | Days in Meeting |
+| Negotiation | Last Entered Negotiation | Days in Proposal |
+| Closed Won | Last Entered Closed Won | Days in Negotiation |
+| Closed Lost | Last Entered Closed Lost | Days in Negotiation |
+
+The branches do not need to rejoin—each runs independently when its stage condition is met.
+
+## Step 3: Analyze Time in Stage
+
+With timestamps and day counts recorded, you can now analyze deal velocity.
+
+### Create a "Slow Deals" View
+
+1. Create a Table view of Opportunities
+2. Add columns: Name, Stage, Days in [previous stage], Amount
+3. Sort by "Days in" field (descending)
+4. Filter by Stage to focus on one stage at a time
+
+Deals at the top spent the most time in the previous stage.
+
+### Use Aggregations
+
+In your pipeline Kanban view:
+
+1. Click the number next to a Stage name
+2. Select **Average**
+3. Choose a "Days in" field
+
+This shows the average time deals spend in each stage.
+
+## Summary
+
+| Component | Purpose |
+| ------------------------ | ------------------------------------------------- |
+| **Last Entered fields** | Store when opportunity entered each stage |
+| **Days in fields** | Store how many days spent in each stage |
+| **Workflow** | Records timestamp AND calculates days in one pass |
+| **Views & Aggregations** | Analyze deal velocity and identify bottlenecks |
+
+## Related
+
+* [Workflows](/l/zh/user-guide/workflows/overview) — automation basics
+* [How to Create Custom Fields](/l/zh/user-guide/data-model/how-tos/create-custom-fields) — field configuration
+* [Kanban Views](/l/zh/user-guide/views-pipelines/capabilities/kanban-views) — aggregations
diff --git a/packages/twenty-docs/l/zh/user-guide/views-pipelines/overview.mdx b/packages/twenty-docs/l/zh/user-guide/views-pipelines/overview.mdx
new file mode 100644
index 0000000000..1c5689ba4d
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/views-pipelines/overview.mdx
@@ -0,0 +1,137 @@
+---
+title: Views & Pipelines
+description: Learn how to create and manage views in Twenty.
+image: /images/user-guide/table-views/table.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+
+
+## Understanding Views
+
+Views are saved configurations that determine how your data is displayed. Each view can have its own:
+
+* **Layout**: Table, Kanban, or Calendar
+* **Filters**: Which records to show
+* **Sorting**: How records are ordered
+* **Fields**: Which columns are visible
+
+## View Types
+
+### Table View
+
+The default spreadsheet-like view showing records in rows with customizable columns.
+
+### Kanban View
+
+A visual board view where records appear as cards organized by stages. Ideal for:
+
+* Sales pipelines
+* Project tracking
+* Any workflow with defined stages
+
+### Calendar View
+
+Display records with date fields on a calendar. Perfect for:
+
+* Meetings and events
+* Deadlines and due dates
+* Time-based planning
+
+## Creating a View
+
+There are two ways to create a new view.
+
+### Use the View Dropdown Menu
+
+1. Navigate to any object (People, Companies, etc.)
+2. Click the view name at the top left (shows current view with a dropdown arrow)
+3. Click **+ Add view**
+4. Name your view and click **Create**
+5. Choose a layout (Table, Kanban, or Calendar) under **Options**
+6. Add filters and sorting as needed
+7. Select which fields to display and reorder them
+8. Click **Save**
+
+
+
+### Start by editting an existing view
+
+1. Navigate to any object (People, Companies, etc.)
+2. Choose a layout (Table, Kanban, or Calendar) under **Options** or Add filters and sorting as needed
+3. Click on **Save as new view**
+4. Name your view and click **Create**
+5. Keep editing your new view
+6. Click on **Update view** to save your additional configurations
+
+
+
+## Managing Views
+
+### Edit a View
+
+1. Select the view from the dropdown
+2. Make your changes (filters, sorting, columns)
+3. Click **Save** to update the view
+
+### Rename a View or Change Its Icon
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to the view name
+3. Select **Edit**
+4. Change the name or icon
+5. Click **Save**
+
+### Reorder Views
+
+1. Open the view dropdown
+2. Click and drag a view by its handle
+3. Drop it in the desired position
+4. The new order is saved automatically
+
+### Add to Favorites
+
+Pin frequently used views for quick access:
+
+1. Open the view dropdown
+2. Click the **⋮** menu next to a view
+3. Select **Add to favorites**
+4. The view appears in your favorites section
+
+### Delete a View
+
+1. Select the view to delete
+2. Click the view dropdown
+3. Click the **⋮** menu next to the view
+4. Select **Delete**
+5. Confirm deletion
+
+
+ Deleted views cannot be recovered. Make sure you want to remove it before confirming.
+
+
+## View Visibility
+
+Each view (except the default "All [Object Name]" views) has its own visibility setting.
+
+To change visibility:
+
+1. Open the view
+2. Click **Options → Visibility**
+3. Choose:
+ * **Workspace**: Visible to all workspace members
+ * **Unlisted**: Visible only to you
+
+
+ The default "All [Object Name]" views cannot have their visibility changed.
+
+
+## Next Steps
+
+* [Table Views](/l/zh/user-guide/views-pipelines/capabilities/table-views)
+* [Kanban Views](/l/zh/user-guide/views-pipelines/capabilities/kanban-views)
+* [Filters and Sorting](/l/zh/user-guide/views-pipelines/capabilities/filters-and-sorting)
+* [View Settings](/l/zh/user-guide/views-pipelines/capabilities/view-settings)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/send-emails-from-workflows.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/send-emails-from-workflows.mdx
new file mode 100644
index 0000000000..6343f06e42
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/send-emails-from-workflows.mdx
@@ -0,0 +1,149 @@
+---
+title: Send Emails from Workflows
+description: Send personalized emails automatically using workflow actions.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Automatically send emails when specific events occur in your CRM—welcome new contacts, follow up on opportunities, or notify team members.
+
+## Prerequisites
+
+Before you can send emails from workflows:
+
+1. Connect an email account under **Settings → Accounts**
+2. Ensure the account has sending permissions enabled
+
+## Basic Email Workflow
+
+### Example: Welcome Email for New Contacts
+
+**Goal**: Send a welcome email when a new person is added to the CRM.
+
+**Setup**:
+
+1. **Create workflow**: Go to **Settings → Workflows** and click **+ New Workflow**
+
+2. **Add trigger**: Select **Record is Created** → **People**
+
+3. **Add Send Email action**:
+ * Click **+** to add an action
+ * Select **Send Email**
+ * Configure the email:
+
+| Field | Value |
+| ----------- | -------------------------------------- |
+| **To** | `{{trigger.object.email}}` |
+| **Subject** | `Welcome to {{Your Company Name}}` |
+| **Body** | `Hi {{trigger.object.firstName}}, ...` |
+
+4. **Test and activate**: Test with a sample record, then activate
+
+## Using Variables in Emails
+
+Reference data from previous steps using `{{variable}}` syntax:
+
+```text
+Hi {{trigger.object.firstName}},
+
+Thank you for connecting with us!
+
+Your company, {{trigger.object.company.name}}, is now in our system.
+
+Best regards,
+The Team
+```
+
+### Available Variables from Triggers
+
+| Trigger Type | Common Variables |
+| -------------------------- | -------------------------------------- |
+| **Record Created/Updated** | `{{trigger.object.fieldName}}` |
+| **Manual** | `{{trigger.selectedRecord.fieldName}}` |
+| **Webhook** | `{{trigger.body.fieldName}}` |
+
+## Advanced: Conditional Emails
+
+### Example: Different Emails Based on Lead Source
+
+**Goal**: Send different welcome emails based on where the lead came from.
+
+**Setup**:
+
+1. **Trigger**: Record is Created (People)
+
+2. **Add Filter action**:
+ * Condition: `{{trigger.object.source}}` equals `"Website"`
+ * If true → continue to website welcome email
+
+3. **Branch for other sources**:
+ * Create parallel branches for different sources
+ * Each branch has its own Send Email action
+
+## Sending Emails to Multiple Recipients
+
+### Example: Notify Team When Deal Closes
+
+**Goal**: Email the sales rep and their manager when an opportunity is won.
+
+**Setup**:
+
+1. **Trigger**: Record is Updated (Opportunities, Stage = "Closed Won")
+
+2. **Search Records**: Find the opportunity owner's manager
+
+3. **Send Email #1**: To opportunity owner
+ * To: `{{trigger.object.owner.email}}`
+ * Subject: `Congratulations on closing {{trigger.object.name}}!`
+
+4. **Send Email #2**: To manager
+ * To: `{{searchRecords.manager.email}}`
+ * Subject: `Deal Won: {{trigger.object.name}}`
+
+## Scheduled Follow-up Emails
+
+### Example: Follow Up 3 Days After Meeting
+
+**Goal**: Send a follow-up email 3 days after a meeting is logged.
+
+**Setup**:
+
+1. **Trigger**: Record is Created (Activities, Type = "Meeting")
+
+2. **Delay action**: Wait 3 days
+
+3. **Send Email**:
+ * To: Meeting attendee
+ * Subject: Following up on our conversation
+ * Body: Reference meeting details from trigger
+
+## Best Practices
+
+### Email Content
+
+* Keep subject lines concise and relevant
+* Personalize with recipient's name
+* Include a clear call to action
+* Test emails before activating
+
+### Deliverability
+
+* Don't send too many emails too quickly
+* Use professional email signatures
+* Avoid spam trigger words
+* Ensure unsubscribe options for marketing emails
+
+### Troubleshooting
+
+* Verify email account is connected and active
+* Check recipient email address is valid
+* Review workflow runs for error messages
+* Test with your own email address first
+
+
+ **Coming soon**: Email attachments will be available in Q1 2026.
+
+
+## Related
+
+* [Workflow Triggers](/l/zh/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/use-branches-in-workflows.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
new file mode 100644
index 0000000000..ef90f84b9c
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/use-branches-in-workflows.mdx
@@ -0,0 +1,90 @@
+---
+title: Use Branches in Workflows
+description: Understand how branches work and how to control which path is executed.
+---
+
+## How Branches Work
+
+In the workflow editor, you can create multiple paths (branches) going out from a single node. This allows you to build complex automations with different outcomes.
+
+**Important**: When a workflow runs, **all branches execute in parallel by default**. There is no built-in "if/else" logic to choose one branch over another—every path will run simultaneously.
+
+## Controlling Which Branch Runs
+
+To execute only one branch based on specific conditions, **add a Filter node at the beginning of each branch**.
+
+### Example Setup
+
+1. Create your workflow with multiple branches from a single node
+2. Add a **Filter** node as the first step in each branch
+3. Set conditions on each Filter to determine when that branch should continue
+4. Only the branch(es) whose Filter conditions are met will proceed
+
+
+
+### How Filters Work
+
+* If the Filter condition is **met**: The branch continues executing
+* If the Filter condition is **not met**: The branch stops at the Filter node
+
+This effectively creates conditional logic where only the appropriate branch runs based on your data.
+
+## Example: Route by Deal Size
+
+**Scenario**: When a deal is closed, send different notifications based on deal size.
+
+1. **Trigger**: Opportunity updated (Stage = Closed Won)
+2. **Branch 1**: Filter for Amount > $10,000 → Send Slack message to #big-deals
+3. **Branch 2**: Filter for Amount ≤ $10,000 → Send email to sales manager
+
+Both branches start, but only the one matching the deal amount will continue past its Filter.
+
+## Creating Branches
+
+
+ To create a new branch from an existing step, click the **+** button on the step and add your action. You can add multiple branches by clicking **+** multiple times.
+
+
+1. In the workflow editor, select the step you want to branch from
+2. Click the **+** button to add an action
+3. This creates one branch
+4. Click **+** again on the same step to create additional branches
+5. Each branch can have its own sequence of actions
+
+## Merging Branches Back Together
+
+After parallel branches complete their work, you can merge them back into a single path:
+
+1. Complete your branched actions
+2. Add a new step that should run after all branches
+3. Drag a connection from the last step of each branch to this new step
+4. The merged step waits for all connected branches to complete before executing
+
+### Example: Process Then Notify
+
+```
+Trigger
+ │
+ ├── Branch A: Update Customer Record
+ │
+ └── Branch B: Create Support Ticket
+
+ ↘ ↙
+
+ Merged Step: Send Confirmation Email
+```
+
+The confirmation email sends only after both the customer update and ticket creation are done.
+
+## Best Practices
+
+* Always use **Filter nodes** at the start of branches when you want conditional execution
+* Keep branch conditions **mutually exclusive** to avoid duplicate actions
+* Test your workflows with different data to ensure the correct branches run
+* **Rename branch steps** descriptively so it's clear what each path does
+* **Merge branches** when you need a final action after parallel processing
+
+## Related
+
+* [Workflows FAQ](/l/zh/user-guide/workflows/how-tos/need-more-help/workflows-faq) — answers about parallel execution
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions) — available actions for branches
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/use-iterator.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/use-iterator.mdx
new file mode 100644
index 0000000000..7a3c80af44
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/use-iterator.mdx
@@ -0,0 +1,180 @@
+---
+title: Use Iterator
+description: Loop through arrays of records to perform actions on each item.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Iterator lets you loop through an array of records and perform actions on each one. It's essential for workflows that need to process multiple records returned by Search Records or received via webhooks.
+
+
+ Iterator is currently in beta. Activate it under **Settings → Releases → Lab**.
+
+
+## When to Use Iterator
+
+| Scenario | Example |
+| -------------------------- | ---------------------------------------------- |
+| **Process search results** | Send email to each person found |
+| **Handle webhook arrays** | Create records for each item in order |
+| **Bulk updates** | Update multiple records with calculated values |
+| **Notifications** | Alert multiple people about an event |
+
+## Understanding Iterator
+
+Iterator expects an **array** as input. It then:
+
+1. Takes the first item from the array
+2. Runs all actions inside the iterator with that item
+3. Moves to the next item
+4. Repeats until all items are processed
+
+## Basic Setup
+
+### Example: Email Everyone in Search Results
+
+**Goal**: Find all contacts in a specific company and send each one a personalized email.
+
+### Step 1: Search for Records
+
+1. Add **Search Records** action
+2. Object: **People**
+3. Filter: Company equals "Acme Inc"
+4. This returns an array of people
+
+### Step 2: Check Results Exist
+
+1. Add **Filter** action
+2. Condition: `{{searchRecords.length}}` is greater than 0
+3. This prevents Iterator errors on empty results
+
+### Step 3: Add Iterator
+
+1. Add **Iterator** action
+2. Array input: Select `{{searchRecords}}`
+3. This creates a loop
+
+### Step 4: Add Actions Inside Iterator
+
+Actions placed after Iterator run for each item:
+
+1. Add **Send Email** action (inside iterator)
+2. To: `{{iterator.currentItem.email}}`
+3. Subject: Hello `{{iterator.currentItem.firstName}}`!
+4. Body: Personalized message using current item fields
+
+### Result
+
+If Search Records returns 5 people, the Iterator:
+
+* Sends email to person 1
+* Sends email to person 2
+* ... continues for all 5
+
+## Accessing Current Item Data
+
+Inside Iterator, use `{{iterator.currentItem}}` to access the current record:
+
+| Variable | Description |
+| --------------------------------------- | ----------------------------------- |
+| `{{iterator.currentItem}}` | The entire current record object |
+| `{{iterator.currentItem.id}}` | Record ID |
+| `{{iterator.currentItem.email}}` | Email field |
+| `{{iterator.currentItem.company.name}}` | Related company name |
+| `{{iterator.index}}` | Current position in array (0-based) |
+
+## Common Patterns
+
+### Update Multiple Records
+
+**Goal**: Mark all overdue tasks as "Late"
+
+```
+1. Search Records (Tasks, Due Date < Today, Status ≠ Completed)
+2. Filter (length > 0)
+3. Iterator (searchRecords)
+ └── Update Record
+ - Object: Tasks
+ - Record: {{iterator.currentItem.id}}
+ - Status: Late
+```
+
+### Create Records from Array
+
+**Goal**: Webhook receives order with multiple items, create a record for each
+
+```
+1. Webhook Trigger (receives items array)
+2. Filter (items.length > 0)
+3. Iterator (trigger.body.items)
+ └── Create Record
+ - Object: Order Items
+ - Name: {{iterator.currentItem.name}}
+ - Quantity: {{iterator.currentItem.qty}}
+ - Related Order: {{trigger.body.orderId}}
+```
+
+### Conditional Processing Inside Loop
+
+**Goal**: Only send email to contacts with valid emails
+
+```
+1. Search Records (People)
+2. Iterator (searchRecords)
+ └── Filter (currentItem.email is not empty)
+ └── Send Email
+ - To: {{iterator.currentItem.email}}
+```
+
+## Troubleshooting
+
+### "Iterator expects an array"
+
+**Cause**: You passed a single record instead of an array.
+
+**Fix**: Make sure you're passing the result of Search Records or an array field, not a single record.
+
+```
+✅ Correct: {{searchRecords}}
+❌ Wrong: {{searchRecords[0]}}
+```
+
+### Iterator Doesn't Run
+
+**Cause**: The array is empty.
+
+**Fix**: Add a Filter before Iterator to check array length:
+
+```
+Filter: {{searchRecords.length}} > 0
+```
+
+### Actions Run Too Many Times
+
+**Cause**: Search Records returned more records than expected.
+
+**Fix**:
+
+* Add more specific filters to Search Records
+* Set a limit on Search Records (max 200)
+* Add Filter inside Iterator for additional conditions
+
+## Performance Considerations
+
+* **Credit usage**: Each iteration consumes credits for its actions
+* **Time**: Large arrays take longer to process
+* **Limits**: Consider batching very large operations
+* **Rate limits**: External API calls may hit rate limits with many iterations
+
+## Best Practices
+
+1. **Always check array length** before Iterator to avoid errors
+2. **Add filters inside loops** when not all items need processing
+3. **Rename your Iterator step** to describe what it's looping through
+4. **Test with small arrays** before processing large datasets
+5. **Monitor workflow runs** to ensure iterations complete as expected
+
+## Related
+
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions)
+* [How to Use Branches](/l/zh/user-guide/workflows/capabilities/use-branches-in-workflows)
+* [Workflows FAQ](/l/zh/user-guide/workflows/how-tos/need-more-help/workflows-faq)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-actions.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-actions.mdx
new file mode 100644
index 0000000000..0e07230314
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-actions.mdx
@@ -0,0 +1,311 @@
+---
+title: Workflow Actions
+description: Learn about the actions available in Twenty workflows.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## About Actions
+
+Actions define what happens after a trigger fires. You can chain multiple actions together to build complex automations.
+
+
+ * Use the variable picker (click the `(x+)` icon) to browse available data from previous steps
+ * Hover over any input field to see which step a variable comes from — helpful when the same field (e.g., ID) exists in multiple previous steps
+ * Give each action a descriptive name for easier maintenance
+
+
+## Record Actions
+
+
+
+### Create a Record
+
+Adds a new record to a selected object.
+
+**Configuration**:
+
+* Select the target object
+* Fill out the required and optional fields
+* Use data from previous steps or input values manually to populate fields
+
+**Output**: The newly created record data is available for use in subsequent steps.
+
+### Update Record
+
+Modifies an existing record in a selected object.
+
+
+
+**Configuration**:
+
+* Select the target object
+* Choose the specific record to update.
+ * You can either choose a fixed record, using the drop down menu displaying all available records.
+ * Or you can have the record dynamically selected, by designating a record found in a previous step, using the `(x+)`. You cannot search for the record based on different criteria at this stage. If you've not yet identified the record, add a `Search Record` step before this `Update Record` step.
+* Select fields to modify and enter new values
+
+**Output**: The updated record data is available for use in subsequent steps.
+
+### Delete Record
+
+Removes a record from a selected object.
+
+**Configuration**:
+
+* Select the target object
+* Choose the specific record to delete
+
+**Output**: The deleted record data remains available for use in subsequent steps.
+
+### Search Records
+
+Finds records within a selected object using filter conditions.
+
+**Configuration**:
+
+* Select the object to search
+* Set filter criteria to narrow results
+* Configure sorting and limits
+
+**Output**: Returns matching records that can be used in subsequent steps.
+
+
+ **Limit**: Search Records returns a maximum of **200 records**. If you need to process more, add specific filters to reduce results or use scheduled workflows to process in batches.
+
+
+**Best Practice**: Use [branches](/l/zh/user-guide/workflows/capabilities/workflow-branches) after Search Records to handle "found" vs "not found" scenarios.
+
+### Upsert Record
+
+Creates a new record or updates an existing one based on matching criteria. This is useful when you're not sure if a record already exists.
+
+
+
+**Configuration**:
+
+* Select the target object
+* Note which fields can be used for matching: email for People, domain for Companies, ID for any object, or any field marked as Unique. You'll need to populate at least one of these below.
+* Fill out the field values. Do not forget to populate at least one of the unique identifiers.
+
+
+ **Matching usually works even better when adding only one unique identifier.** For example, the screenshot below will match companies based on their domain. The ID is not necessarily needed.
+
+
+
+
+* Use data from previous steps to populate fields
+
+**How it works**:
+
+1. Searches for a record matching your criteria
+2. If found → updates the existing record
+3. If not found → creates a new record
+
+**Output**: The created or updated record data is available for use in subsequent steps.
+
+## Flow Actions
+
+### Iterator
+
+**Loops through an array of records** returned from a previous step, allowing you to perform actions on each record individually.
+
+**Configuration**:
+
+* Select the array of records from a previous step (e.g., results from Search Records, from a Manual trigger with Bulk availability, from a code node)
+* Define the actions to perform on each record in the loop.
+
+
+ - You can add several actions within an iterator.
+ - When using branches inside an iterator, make sure the last step of each branch connects back to the iterator to close the loop.
+
+
+* Access `Current Item` Fields: to use fields from the record currently being processed, click on the **Iterator** step, then select **Current item**. The list of available fields from that record will be displayed and can be selected for use in subsequent actions.
+
+
+
+### Filter
+
+Filters records based on specified conditions, allowing only records that meet the criteria to pass through.
+
+**Configuration**:
+
+* Select the record to filter
+* Define filter conditions and criteria
+* Configure which records should pass through to subsequent steps
+
+
+ 1. **Output**: Filter nodes don't return data—they act as gates. If the conditions are met, the workflow continues. If not, the workflow stops at that branch.
+ 2. The `IS` operator can be used with numeric fields. It performs as an `EQUAL`.
+
+
+### Delay
+
+Pauses workflow execution for a specified duration or until a specific date/time.
+
+**Delay Types**:
+
+| Type | Description |
+| ------------------ | ------------------------------------------------------------------ |
+| **Duration** | Wait for a specific amount of time (days, hours, minutes, seconds) |
+| **Scheduled Date** | Wait until a specific date and time |
+
+**Configuration for Duration**:
+
+* Set days, hours, minutes, and/or seconds
+* Combine multiple units (e.g., 2 days and 4 hours)
+
+**Configuration for Scheduled Date**:
+
+* Select a date and time
+* Can reference a date field from a previous step (e.g., follow up 3 days after a meeting)
+
+**Use cases**:
+
+* Wait 24 hours before sending a follow-up email
+* Pause until an opportunity's close date
+* Schedule actions for business hours
+
+
+ The scheduled date cannot be in the past. If a date field from a previous step is used and the date has already passed, the workflow will fail.
+
+
+**Limits & Credits**:
+
+* **No maximum duration limit**—you can set delays of minutes, days, weeks, or longer
+* **1 credit consumed** when the Delay node executes, regardless of duration
+* **No credits consumed** while waiting—a 5-minute delay costs the same as a 5-day delay
+
+## Communication Actions
+
+### Send Email
+
+Sends an email from your workflow. This is great for templated group emails. Emails will look like the ones you send from your mailbox.
+Not suited for newsletters (which require richer formatting) or automated email sequences.
+
+**Prerequisites**: Add an email account in Settings → Accounts
+
+**Configuration**:
+
+* Select the sender email account
+
+
+ You can only send emails from mailboxes synced to your own Twenty account. Sending from other team members' mailboxes (e.g., the account owner's email) is on the roadmap.
+
+
+For all the following steps, you can reference variables from previous steps for personalization.
+
+* Enter recipient email address.
+
+
+ Only one recipient is possible at the moment.
+
+
+* Set subject line.
+* Compose message body. You can format links, create numbered list, bullet point lists, add attachments.
+
+
+ Adding HTML signatures is not possible at the moment.
+
+
+### Form
+
+Prompts a form during workflow execution to collect user input. The responses can then be used in subsequent steps to create records, send emails, or execute any other action based on the input.
+
+
+ **Forms are designed for manual triggers only**. For workflows with other triggers (Record Created, Updated, etc.), forms are only accessible via the workflow run interface, which is not the expected user experience. A notifications center will be released in 2026 to properly support forms in automated workflows.
+
+
+**Configuration**:
+
+* Configure the fields that users will be asked to fill. For each field, choose
+ * a type among text, number, date, a given record, a select field. Select fields from all objects are available.
+ * a label
+ * a default value under `Placeholder` (optional)
+* Edit the form title
+
+**Output**: Form responses are available for use in subsequent steps.
+
+**Example**: The "Quick Lead" workflow is available by default in all workspaces, available anywhere in the Command Menu `Cmd + K`.
+
+**How to fill the form**:
+
+* Trigger your manual workflow from the command menu `Cmd K`
+* Fill the form that is displayed in the side panel and click `Submit`.
+
+
+ The fields cannot be made mandatory.
+
+
+
+
+## Integration Actions
+
+### Code
+
+Runs custom JavaScript within your workflow.
+
+**Configuration**:
+
+* Access variables from previous steps. You can edit the variables names dynamically.
+
+
+
+* Write JavaScript code in the editor
+* Return variables for use in subsequent steps
+* Test code directly in the step
+
+
+ If you need to use external API keys in your code, you must input them directly in the function body. You cannot configure API keys elsewhere and reference them in the serverless function.
+
+
+
+ **Working with arrays?** Arrays from external systems or previous steps may come as strings. See [How to handle arrays in Code actions](/l/zh/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions) for the solution.
+
+
+
+ Click the square icon at the top right of the code editor to display it in full screen — helpful since the default editor width is limited.
+
+
+### HTTP Request
+
+Sends a request to an external API as part of your workflow.
+
+
+
+**Configuration**:
+
+* Enter the API endpoint URL. Using parameters from previous steps is possible.
+* Select HTTP method (GET, POST, PUT, PATCH, DELETE)
+* Add required headers and values
+* Provide sample response for structure preview
+
+## AI Actions
+
+### AI Agent - Coming Soon
+
+Runs an AI agent within your workflow to perform intelligent tasks.
+
+**Configuration**:
+
+* **Agent**: Select an existing AI agent or use the default agent
+* **Prompt**: Write the instruction for the AI agent
+* Reference variables from previous steps in the prompt
+
+**What AI Agents can do**:
+
+* Analyze and summarize data
+* Classify or categorize records
+* Generate text content
+* Make decisions based on data
+* Interact with your CRM data using tools
+
+**Output**: The AI agent's response is available for use in subsequent steps. If the agent has a structured output schema, the response will follow that format.
+
+
+ AI Agent actions consume workflow credits based on the AI model used. See [Workflow Credits](/l/zh/user-guide/workflows/capabilities/workflow-credits) for details.
+
+
+
+ AI agents respect role-based permissions. You can assign specific roles to agents under **Settings → Roles** to control what data they can access. See [Permissions](/l/zh/user-guide/permissions-access/capabilities/permissions) for details.
+
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-branches.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-branches.mdx
new file mode 100644
index 0000000000..4bb7b1d527
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-branches.mdx
@@ -0,0 +1,66 @@
+---
+title: Workflow Branches
+description: Create parallel paths and conditional logic in your workflows.
+---
+
+Branches allow you to split your workflow into multiple paths that can run simultaneously or conditionally based on your data.
+
+
+
+## How Branches Work
+
+When you create multiple connections from a single node, each path becomes a branch. By default, **all branches execute in parallel**—they don't wait for each other.
+
+## Creating Branches
+
+### Add a New Branch
+
+1. **Right-click on the main canvas** of the workflow (not on an existing node)
+2. Click **Add node**
+3. Choose the node type for your new branch
+4. Drag an arrow from the bottom of the previous step to the top of this new action
+5. Repeat to add more branches from the same node
+
+
+ Each branch is independent. Adding a branch doesn't affect other existing paths from that node.
+
+
+### Visual Layout
+
+Branches appear as parallel paths in the workflow editor. You can drag nodes to rearrange the visual layout without affecting execution.
+
+## Conditional Branches
+
+Since all branches run by default, use **Filter** nodes to control which paths actually execute:
+
+| Branch | Filter Condition | Action |
+| ------ | --------------------- | -------------------------- |
+| A | Stage = "Won" | Send congratulations email |
+| B | Stage = "Lost" | Create follow-up task |
+| C | Stage = "Negotiation" | Notify manager |
+
+1. Create branches from your trigger or action
+2. Add a **Filter** node as the first step of each branch
+3. Configure each filter with mutually exclusive conditions
+4. Add your actions after each filter
+
+Only the branch(es) where the filter condition is met will continue executing.
+
+## Merging Branches
+
+**Branches don't automatically merge.** Each branch runs independently until it ends. You have full flexibility in how you handle this:
+
+* **Option 1: Keep branches separate**
+ Each branch handles its own follow-up actions independently. This is the simplest approach when branches don't need to converge.
+
+* **Option 2: Merge branches manually**
+ When creating your workflow, you can manually connect multiple branches to the same downstream action. Simply drag arrows from the end of each branch to a common node.
+
+
+ While you can use a [Delay](/l/zh/user-guide/workflows/capabilities/workflow-actions#delay) node to pause execution, it's not currently configurable to wait "until another branch ends."
+
+
+## Related
+
+* [How to Use Branches in Workflows](/l/zh/user-guide/workflows/capabilities/use-branches-in-workflows) - Step-by-step guide
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions) - Available actions including Filter
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-credits.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-credits.mdx
new file mode 100644
index 0000000000..437aee5822
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-credits.mdx
@@ -0,0 +1,76 @@
+---
+title: Workflow Credits
+description: Understand workflow credit consumption and management.
+---
+
+Workflow credits power your automations in Twenty. Understanding how they work helps you optimize costs and manage your automation budget effectively.
+
+## Credit Allocation
+
+Workflow credits are allocated based on your billing cycle, not your plan tier:
+
+| Billing Cycle | Credits |
+| ------------------------ | --------------------------- |
+| **Monthly subscription** | 5 million credits per month |
+| **Yearly subscription** | 50 million credits per year |
+
+
+ 5 million monthly credits are generous for standard automations. Most teams won't exceed this limit with typical workflow usage. Additional credits are primarily needed for advanced Code actions and AI-powered workflows.
+
+
+## How Credit Consumption Works
+
+Credits are consumed when workflows execute, not when you create them. Each workflow action consumes credits based on its complexity:
+
+### Credit Consumption by Action Type
+
+* **Basic internal operations**: Very low credit consumption
+ * Search Records
+ * Create Record
+ * Update Record
+ * Delete Record
+ * Form actions
+
+* **Complex operations**: Higher credit consumption
+ * Code actions (JavaScript execution)
+ * HTTP Requests to external services
+
+* **AI features**: Higher credit consumption
+ * AI Agent actions consume credits based on the AI model used
+ * More complex prompts and longer outputs use more credits
+
+* **Delay actions**: Minimal credit consumption
+ * The Delay node consumes **1 credit** when it executes
+ * **No credits are consumed** during the wait period
+ * A 5-minute delay costs the same as a 5-day delay
+
+### Real-Time Deduction
+
+Credits are deducted in real-time as workflows execute. This means:
+
+* Draft workflows don't consume credits
+* Only active, running workflows use your credit allocation
+* Failed workflows still consume credits for completed steps
+
+## Managing Credits
+
+### Check Credit Usage
+
+1. Go to **Settings → Billing**
+2. View your current credit consumption and remaining balance
+3. Monitor usage patterns to optimize your workflows
+
+### Purchasing Additional Credits
+
+If you need more credits beyond your plan allocation:
+
+1. Go to **Settings → Billing**
+2. Click on the option to purchase additional credits. Packages of different sizes are available.
+3. Credits are added to your current balance
+
+## Best Practices
+
+* **Batch Processing**: Use bulk operations and Iterator actions efficiently
+* **Manual Trigger Optimization**: For manual triggers, choose `Bulk` availability to process multiple records in a single workflow run
+* Optimize Code actions for efficiency
+* Batch operations to reduce individual action calls
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-runs.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-runs.mdx
new file mode 100644
index 0000000000..998489d7a1
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-runs.mdx
@@ -0,0 +1,92 @@
+---
+title: Workflow Runs
+description: Monitor and manage workflow executions.
+image: /images/user-guide/workflows/workflow.png
+---
+
+## About Runs
+
+A **Run** is a record of a workflow execution. Every time a workflow is triggered—whether by a record event, schedule, manual action, or webhook—a new run is created.
+
+## Viewing Runs
+
+### From the Workflow Editor
+
+1. Open the workflow you want to monitor
+2. Click the **Runs** panel on the right side
+3. See a list of recent runs with their status
+
+### From the Workflow Runs View
+
+1. Go to **Workflow Runs** in the sidebar
+2. View runs across all workflows
+3. Filter by status, workflow, or date
+
+## Run Statuses
+
+| Status | Description |
+| ------------- | ------------------------------------------------------------------------ |
+| **Running** | Workflow is currently executing |
+| **Completed** | Workflow finished successfully |
+| **Failed** | Workflow encountered an error and stopped |
+| **Waiting** | Workflow is paused (e.g., waiting for a Delay action or Form submission) |
+
+## Run Details
+
+Click on any run to see:
+
+* **Status**: Current state of the run
+* **Started at**: When the run began
+* **Duration**: How long the run took
+* **Trigger data**: The input that started the workflow
+* **Step outputs**: Data returned by each step
+* **Error messages**: If the run failed, what went wrong
+
+## Step-by-Step Execution
+
+Each run shows the progression through your workflow:
+
+1. See which steps completed successfully
+2. Identify where failures occurred
+3. View the data passed between steps
+4. Debug issues by examining step inputs and outputs
+
+## Error Handling
+
+When a run fails:
+
+1. Open the failed run
+2. Find the step that caused the failure
+3. Check the error message for details
+4. Common issues:
+ * Missing required fields
+ * Invalid data format
+ * External API errors
+ * Permission issues
+
+## Re-running Workflows
+
+If a run fails, you can:
+
+* Fix the underlying issue and wait for the next trigger
+* For manual workflows, trigger again with the same or updated data
+* Review the workflow logic to prevent future failures
+
+## Performance Tips
+
+### Managing Run History
+
+* Runs are retained for historical reference
+* Very old runs may be archived automatically
+* Export run data if you need to keep records
+
+### Monitoring Best Practices
+
+* Check runs regularly after activating new workflows
+* Review failed runs to identify patterns
+
+## Related
+
+* [Workflow Triggers](/l/zh/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions)
+* [Workflow Troubleshooting](/l/zh/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-triggers.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-triggers.mdx
new file mode 100644
index 0000000000..980f90c469
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-triggers.mdx
@@ -0,0 +1,136 @@
+---
+title: Workflow Triggers
+description: Learn about the different triggers that start your workflows.
+---
+
+## About Triggers
+
+Workflows always start with a single trigger that defines when the automation should run.
+
+
+
+
+ **Advanced objects are supported!** Beyond standard CRM objects (People, Companies, Opportunities), you can also trigger workflows and perform actions on:
+
+ * Workspace Members
+ * Calendar Events
+ * Messages (Emails)
+ * Tasks, Notes, and many other system objects
+
+ This opens up powerful automations like notifying team members when calendar events are created, or processing incoming emails automatically.
+
+
+## Record is Created
+
+Starts the workflow when a new record is created in a selected object (People, Companies, Opportunities, or any custom object).
+
+**Configuration**: Select the object type to monitor for new records.
+
+
+ * This trigger is great for records created by csv, mailbox and calendar synchronization, API.
+ * **It is not recommended for records created manually**: with this trigger, workflows start as soon as the record is created. Since Twenty UI offers auto-save on the fly (there is not an edit mode and then a validation to save records), the workflow will be triggered before the user inputs all the fields.
+ To trigger this workflow on records created manually, it is recommended to use the trigger `Record is created or updated` instead.
+
+
+## Record is Updated
+
+Starts the workflow when changes are made to an existing record.
+
+**Configuration**:
+
+* Select the object type
+* Optionally specify which fields to monitor for changes
+
+## Record is Updated or Created
+
+Starts the workflow when a record is either created or updated in a selected object.
+
+**Why This Matters**: This trigger is particularly helpful because records created via different methods behave differently:
+
+* **API/CSV imports**: Records are created with all fields populated immediately
+* **Manual creation**: Records are created first, then fields are added in subsequent updates
+
+**Configuration**:
+
+* Select the object type to monitor
+* Optionally specify which fields to monitor for changes
+* The workflow will trigger both on initial creation and any subsequent updates
+
+## Record is Deleted
+
+Starts the workflow when a record is removed from an object.
+
+**Configuration**: Select the object type to monitor for deletions.
+
+## Manual Trigger
+
+Starts the workflow when triggered by a user action. This trigger can be accessed through the `Cmd+K` menu or via a custom button that will be displayed in the top navbar after selecting record(s).
+
+
+
+**Availability Configuration**:
+Choose how the workflow should handle record selection:
+
+* **Global**: No record is required to trigger this workflow. The workflow is triggered from the command menu `Cmd + K` anywhere (from any object) and does not use record(s) as input.
+
+* **Single**: The selected record(s) will be passed to your workflow. This is configured for a given object. Several records can be selected before triggering the workflow. The workflow will run from beginning to end as many times as there are records selected.
+
+
+ **Soft limit: 100 runs/minute**. Beyond this, workflows remain in "Not Started" status and are processed gradually—either by a background job or when another workflow enters the queue. This means you can select more than 100 records with a Single trigger; execution will just be slower.
+
+
+* **Bulk**: The selected record(s) will be passed to your workflow. This is configured for a given object. Several records can be selected before triggering the workflow. The workflow will run once, providing the entire list of records as input. This means the workflow needs to contain an [Iterator action](/l/zh/user-guide/workflows/capabilities/workflow-actions#iterator).
+
+
+ This is more advanced, and best for people who want to optimize the number of workflow runs.
+
+
+
+
+**Additional Configuration**:
+
+* Select the target object (for Single and Bulk availability)
+* Choose a command icon for the workflow trigger
+* Configure navbar placement (Pinned or Not Pinned)
+
+**Access Methods**:
+
+* `Cmd+K` menu to find and launch manual workflows
+* Custom button in the top navbar (if configured)
+
+## Time-Based Trigger: On a Schedule
+
+Starts the workflow on a recurring basis you define.
+
+**Configuration**:
+
+* Select time unit (minutes, hours, days)
+* Enter a value or use custom cron expressions for advanced scheduling
+
+
+ **Timezone**: Scheduled workflows run in **UTC**. When setting hours for daily schedules, convert your local time to UTC.
+
+
+## External Trigger: Webhook
+
+Starts the workflow when a GET or POST request is received from an external service.
+
+
+
+**Configuration**:
+
+* The workflow provides a unique webhook URL—copy this and add it to your external system as the endpoint to call.
+* For POST requests, define the expected body structure so Twenty knows what data to expect. Add here the fields you will receive that will be needed below in your workflow.
+* Configure authentication (coming soon).
+
+## Choosing the Right Trigger
+
+| Use Case | Recommended Trigger |
+| --------------------------- | ---------------------------- |
+| New leads need processing | Record is Created |
+| Data changes need sync | Record is Updated |
+| Import/manual data handling | Record is Updated or Created |
+| Cleanup after deletion | Record is Deleted |
+| User-initiated action | Launch Manually |
+| Recurring reports | On a Schedule |
+| External integration | Webhook or On a Schedule |
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-versions.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-versions.mdx
new file mode 100644
index 0000000000..f394285ede
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/capabilities/workflow-versions.mdx
@@ -0,0 +1,85 @@
+---
+title: Workflow Versions
+description: Manage workflow versions and drafts.
+image: /images/user-guide/workflows/workflow.png
+---
+
+## About Versions
+
+Every time you activate a workflow, a new version is created. This allows you to track changes over time and revert to previous configurations if needed.
+
+## Version Statuses
+
+| Status | Description |
+| --------------- | -------------------------------------- |
+| **Draft** | Being edited, not yet published |
+| **Active** | Live version responding to triggers |
+| **Deactivated** | Previously active but manually stopped |
+| **Archived** | Past versions kept for history |
+
+## Working with Drafts
+
+When you edit an active workflow, your changes are saved as a **draft**. The active version continues to run while you work on updates.
+
+Once you're done editing, you can:
+
+* **Activate**: Publish the draft as the new active version (the previous version is archived)
+* **Discard**: Delete the draft and keep the current active version
+
+## Version History
+
+### Viewing Past Versions
+
+1. Open the workflow
+2. Click the **Versions** tab
+3. See all previous versions with timestamps
+
+### Restoring a Version
+
+1. Find the version you want to restore
+2. Click **Use as draft**
+3. The version is copied to a new draft
+4. Make any necessary updates
+5. Activate when ready
+
+## Best Practices
+
+### Version Management
+
+* Activate only when ready for production
+* Keep meaningful changes between versions
+* Document major changes in workflow names or descriptions
+* Test in draft mode before activating
+
+### Reverting Changes
+
+* If a new version causes issues, restore the previous version
+* Use the version history to track what changed
+* Always test restored versions before activating
+
+## Common Workflows
+
+### Quick Edit
+
+1. Make minor changes to an active workflow
+2. Test in draft mode
+3. Activate the new version
+
+### Major Revision
+
+1. Use the previous version as a starting point
+2. Make significant changes in draft
+3. Thoroughly test all scenarios
+4. Activate when confident
+
+### Rollback
+
+1. Identify the issue with the current version
+2. Find the last working version in history
+3. Click **Use as draft**
+4. Activate to restore the old behavior
+
+## Related
+
+* [Getting Started with Workflows](/l/zh/user-guide/workflows/overview)
+* [Workflow Runs](/l/zh/user-guide/workflows/capabilities/workflow-runs)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx
new file mode 100644
index 0000000000..bbc096202f
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions.mdx
@@ -0,0 +1,82 @@
+---
+title: Handle Arrays in Code Actions
+description: Learn how to properly handle array inputs in workflow Code actions.
+---
+
+When working with arrays in Code actions, you may encounter two common challenges:
+
+1. **Arrays passed as strings** — data from external systems or previous steps arrives as a string instead of an actual array
+2. **Can't select individual items** — you can only select the entire array, not specific fields within it
+
+Both can be solved with a Code node.
+
+## Parsing Arrays from Strings
+
+Arrays are often passed between workflow steps as strings or JSON rather than native arrays. This happens when:
+
+* Receiving data from external APIs via HTTP Request
+* Processing webhook payloads
+* Passing data between workflow steps
+
+**Solution**: Add this pattern at the start of your Code action:
+
+```javascript
+export const main = async (params: {
+ users: any;
+}): Promise => {
+ const { users } = params;
+
+ // Handle input that may come as a string or an array
+ const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;
+
+ // Now you can safely work with usersFormatted as an array
+ return {
+ users: usersFormatted.map((user) => ({
+ ...user,
+ activityStatus: String(user.activityStatus).toUpperCase(),
+ })),
+ };
+};
+```
+
+The key line `typeof users === "string" ? JSON.parse(users) : users` checks if the input is a string, parses it if needed, or uses it directly if it's already an array.
+
+## Extracting Individual Fields from Arrays
+
+A webhook might return an array like `answers: [...]`, but in subsequent workflow steps you can only select the **entire array** — not individual items within it.
+
+**Solution**: Add a Code node to extract specific fields and return them as a structured object:
+
+```javascript
+export const main = async (params: {
+ answers: any;
+}): Promise => {
+ const { answers } = params;
+
+ // Handle input that may come as a string or an array
+ const answersFormatted = typeof answers === "string"
+ ? JSON.parse(answers)
+ : answers;
+
+ // Extract specific fields from the array
+ const firstname = answersFormatted[0]?.text || "";
+ const name = answersFormatted[1]?.text || "";
+
+ return {
+ answer: {
+ firstname,
+ name
+ }
+ };
+};
+```
+
+The Code node returns a structured object instead of an array. In subsequent steps, you can now select individual fields like `answer.firstname` and `answer.name` from the variable picker.
+
+
+ We're actively working on making array handling easier in future updates.
+
+
+
+ Click the square icon at the top right of the code editor to display it in full screen — helpful since the default editor width is limited.
+
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx
new file mode 100644
index 0000000000..9cfda56045
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty.mdx
@@ -0,0 +1,182 @@
+---
+title: Bring Product Data into Twenty
+description: Sync product catalog data from a data warehouse into your CRM on a schedule.
+---
+
+Use this pattern to keep Twenty in sync with product data from your data warehouse (e.g., Snowflake, BigQuery, PostgreSQL).
+
+## Workflow Structure
+
+1. **Trigger**: On a Schedule
+2. **Code**: Query your data warehouse
+3. **Code** (optional): Format data as array
+4. **Iterator**: Loop through each product
+5. **Upsert Record**: Create or update in Twenty
+
+
+
+## Step 1: Schedule the Trigger
+
+Set the workflow to run at a frequency matching your data freshness needs:
+
+* Every 5 minutes for near real-time sync
+* Every hour for less critical data
+* Daily for batch updates
+
+## Step 2: Query Your Data Warehouse
+
+Add a **Code** action to fetch recent data:
+
+```javascript
+export const main = async () => {
+ const intervalMinutes = 10; // Match your schedule frequency
+ const cutoffTime = new Date(Date.now() - intervalMinutes * 60 * 1000).toISOString();
+
+ // Replace with your actual data warehouse connection
+ const response = await fetch("https://your-warehouse-api.com/query", {
+ method: "POST",
+ headers: {
+ "Authorization": "Bearer YOUR_API_KEY",
+ "Content-Type": "application/json"
+ },
+ body: JSON.stringify({
+ query: `
+ SELECT id, name, sku, price, stock_quantity, updated_at
+ FROM products
+ WHERE updated_at >= '${cutoffTime}'
+ `
+ })
+ });
+
+ const data = await response.json();
+ return { products: data.results };
+};
+```
+
+
+ Filter by `updated_at >= last X minutes` to retrieve only recently changed records. This keeps the sync efficient.
+
+
+## Step 3: Format Data (Optional)
+
+If your warehouse returns data in a format that needs transformation, add another **Code** action. Common transformations include type conversions, field renaming, and data cleanup.
+
+### Example: User Data with Boolean and Status Fields
+
+```javascript
+export const main = async (params: {
+ users: any;
+}): Promise => {
+ const { users } = params;
+ const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;
+
+ // Convert string "true"/"false" to actual booleans
+ const toBool = (v: any) => v === true || v === "true";
+
+ return {
+ users: usersFormatted.map((user) => ({
+ ...user,
+ activityStatus: String(user.activityStatus).toUpperCase(),
+ isActiveLast30d: toBool(user.isActiveLast30d),
+ isActiveLast7d: toBool(user.isActiveLast7d),
+ isActiveLast24h: toBool(user.isActiveLast24h),
+ isTwenty: toBool(user.isTwenty),
+ })),
+ };
+};
+```
+
+### Example: Product Data with Type Conversions
+
+```javascript
+export const main = async (params: { products: any }) => {
+ const products = typeof params.products === "string"
+ ? JSON.parse(params.products)
+ : params.products;
+
+ return {
+ products: products.map(product => ({
+ externalId: product.id,
+ name: product.name,
+ sku: product.sku,
+ price: parseFloat(product.price), // String → Number
+ stockQuantity: parseInt(product.stock_quantity),
+ isActive: product.status === "active" // String → Boolean
+ }))
+ };
+};
+```
+
+### Example: Date and Currency Formatting
+
+```javascript
+export const main = async (params: { deals: any }) => {
+ const deals = typeof params.deals === "string"
+ ? JSON.parse(params.deals)
+ : params.deals;
+
+ return {
+ deals: deals.map(deal => ({
+ ...deal,
+ // Convert Unix timestamp to ISO date
+ closedAt: deal.closed_timestamp
+ ? new Date(deal.closed_timestamp * 1000).toISOString()
+ : null,
+ // Ensure amount is a number (remove currency symbols)
+ amount: parseFloat(String(deal.amount).replace(/[^0-9.-]/g, "")),
+ // Normalize stage names
+ stage: deal.stage?.toLowerCase().replace(/_/g, " ")
+ }))
+ };
+};
+```
+
+### Common Transformations
+
+| Source Format | Target Format | Code |
+| -------------------- | ---------------- | ---------------------------------------- |
+| `"true"` / `"false"` | `true` / `false` | `v === true \|\| v === "true"` |
+| `"123.45"` | `123.45` | `parseFloat(value)` |
+| `"active"` | `"ACTIVE"` | `value.toUpperCase()` |
+| `1704067200` (Unix) | ISO date | `new Date(v * 1000).toISOString()` |
+| `"$1,234.56"` | `1234.56` | `parseFloat(v.replace(/[^0-9.-]/g, ""))` |
+| `null` / `undefined` | `""` | `value \|\| ""` |
+
+## Step 4: Iterate Through Products
+
+Add an **Iterator** action:
+
+* Input: `{{code.products}}`
+
+This loops through each product in the array.
+
+## Step 5: Upsert Each Record
+
+Inside the iterator, add an **Upsert Record** action:
+
+| Setting | Value |
+| ------------ | -------------------------------------- |
+| **Object** | Your custom Product object |
+| **Match by** | External ID or SKU (unique identifier) |
+| **Name** | `{{iterator.item.name}}` |
+| **SKU** | `{{iterator.item.sku}}` |
+| **Price** | `{{iterator.item.price}}` |
+
+
+ Use **Upsert** (update or create) instead of building separate branches for create vs. update. It's faster to build and easier to debug.
+
+
+## Example Use Cases
+
+| Source | Data |
+| ----------------------- | ----------------------------------- |
+| **ERP system** | Product catalog, pricing, inventory |
+| **E-commerce platform** | Orders, customers, product updates |
+| **Data warehouse** | Aggregated metrics, enriched data |
+| **Inventory system** | Stock levels, reorder alerts |
+
+## Related
+
+* [Workflow Triggers](/l/zh/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions)
+* [Handle Arrays in Code Actions](/l/zh/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx
new file mode 100644
index 0000000000..ad2ad5def5
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty.mdx
@@ -0,0 +1,130 @@
+---
+title: Bring Typeform Submissions into Twenty
+description: Handle Typeform's webhook payload to create leads from form submissions.
+---
+
+For standard webhook setup, see [Set Up a Webhook Trigger](/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger). This article covers the specific handling required for Typeform's custom payload structure.
+
+### Step 1: Create a Webhook Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Select **Webhook** as the trigger
+4. Copy the webhook URL
+
+### Step 2: Configure Typeform
+
+1. In Typeform, open your form
+2. Go to **Connect → Webhooks**
+3. Paste your Twenty webhook URL
+4. Save
+
+### Step 3: Understand the Typeform Payload
+
+Typeform sends a nested JSON structure. Here's a simplified example:
+
+```json
+{
+ "event_type": "form_response",
+ "form_response": {
+ "form_id": "abc123",
+ "submitted_at": "2025-01-15T10:30:00Z",
+ "answers": [
+ {
+ "text": "Jane",
+ "type": "text",
+ "field": { "id": "field1", "type": "short_text", "title": "First Name" }
+ },
+ {
+ "text": "Smith",
+ "type": "text",
+ "field": { "id": "field2", "type": "short_text", "title": "Last Name" }
+ },
+ {
+ "text": "Acme Corp",
+ "type": "text",
+ "field": { "id": "field3", "type": "short_text", "title": "Company" }
+ },
+ {
+ "email": "jane@acme.com",
+ "type": "email",
+ "field": { "id": "field4", "type": "email", "title": "Email" }
+ },
+ {
+ "type": "choice",
+ "field": { "id": "field5", "type": "dropdown", "title": "Team Size" },
+ "choice": { "label": "10-50" }
+ }
+ ]
+ }
+}
+```
+
+Key things to note:
+
+* Form data is nested under `form_response`
+* **Answers are returned as an array**, not as named fields
+* Each answer includes the field type and title for reference
+
+### Step 4: Extract Fields from the Answers Array
+
+Since `answers` is an array, you can only select the entire array in subsequent steps — not individual fields. Add a **Code** action to extract the fields you need:
+
+```javascript
+export const main = async (params: {
+ answers: any;
+}): Promise => {
+ const { answers } = params;
+
+ // Handle input that may come as a string or an array
+ const answersFormatted = typeof answers === "string"
+ ? JSON.parse(answers)
+ : answers;
+
+ // Extract fields by position or by finding the field type
+ const firstName = answersFormatted[0]?.text || "";
+ const lastName = answersFormatted[1]?.text || "";
+ const company = answersFormatted[2]?.text || "";
+ const email = answersFormatted.find(a => a.type === "email")?.email || "";
+ const teamSize = answersFormatted.find(a => a.type === "choice")?.choice?.label || "";
+
+ return {
+ contact: {
+ firstName,
+ lastName,
+ company,
+ email,
+ teamSize
+ }
+ };
+};
+```
+
+Now in subsequent steps, you can select `contact.firstName`, `contact.email`, etc. from the variable picker.
+
+
+ For more details on handling arrays in Code actions, see [Handle Arrays in Code Actions](/l/zh/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
+
+
+### Step 5: Create the Record
+
+Add a **Create Record** action:
+
+| Field | Value |
+| -------------- | ---------------------------------------------------- |
+| **Object** | People |
+| **First Name** | `{{code.contact.firstName}}` |
+| **Last Name** | `{{code.contact.lastName}}` |
+| **Email** | `{{code.contact.email}}` |
+| **Company** | Search or create based on `{{code.contact.company}}` |
+
+### Step 6: Test and Activate
+
+1. Submit a test response in Typeform
+2. Check the workflow run to verify data was captured
+3. Activate the workflow
+
+## Related
+
+* [Set Up a Webhook Trigger](/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger)
+* [Handle Arrays in Code Actions](/l/zh/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx
new file mode 100644
index 0000000000..7499752cda
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty.mdx
@@ -0,0 +1,143 @@
+---
+title: Generate a Quote or Invoice from Twenty
+description: Automatically create invoices in external tools when deals close.
+---
+
+Automatically send deal data to your invoicing system (Stripe, QuickBooks, Xero, etc.) when an opportunity is won.
+
+## Workflow Structure
+
+1. **Trigger**: Record is Updated (Opportunity)
+2. **Filter**: Stage = Closed Won
+3. **Search Record**: Get Company details
+4. **Code** (optional): Format payload
+5. **HTTP Request**: Send to invoicing system
+
+## Step 1: Set Up the Trigger
+
+1. Create a new workflow
+2. Select **Record is Updated** trigger
+3. Choose **Opportunity** as the object
+
+## Step 2: Filter for Closed Won
+
+Add a **Filter** action to only continue when the deal is won:
+
+| Setting | Value |
+| ------------- | --------------------------------- |
+| **Field** | Stage |
+| **Condition** | Equals |
+| **Value** | `CLOSED_WON` (or your stage name) |
+
+
+ The trigger fires on any Opportunity update. The Filter ensures the workflow only continues when the stage changes to Closed Won.
+
+
+## Step 3: Get Company Details
+
+The Opportunity record may not include all Company fields you need for the invoice. Add a **Search Record** action:
+
+| Setting | Value |
+| ------------ | ---------------------------------------- |
+| **Object** | Company |
+| **Match by** | ID equals `{{trigger.object.companyId}}` |
+
+This retrieves the full Company record with billing address, tax ID, etc.
+
+## Step 4: Format the Payload (Optional)
+
+If your invoicing system expects a specific format, add a **Code** action:
+
+```javascript
+export const main = async (params: {
+ opportunity: any;
+ company: any;
+}): Promise => {
+ const { opportunity, company } = params;
+
+ return {
+ invoice: {
+ // Customer info from Company
+ customer_name: company.name,
+ customer_email: company.email || "",
+ billing_address: {
+ line1: company.address?.street || "",
+ city: company.address?.city || "",
+ postal_code: company.address?.postalCode || "",
+ country: company.address?.country || ""
+ },
+ tax_id: company.taxId || null,
+
+ // Invoice details from Opportunity
+ amount: opportunity.amount,
+ currency: opportunity.currency || "USD",
+ description: `Invoice for ${opportunity.name}`,
+ due_days: 30,
+
+ // Reference back to Twenty
+ metadata: {
+ opportunity_id: opportunity.id,
+ company_id: company.id
+ }
+ }
+ };
+};
+```
+
+## Step 5: Send to Invoicing System
+
+Add an **HTTP Request** action:
+
+| Setting | Value |
+| ----------- | ----------------------------------------- |
+| **Method** | POST |
+| **URL** | Your invoicing API endpoint |
+| **Headers** | `Authorization: Bearer YOUR_API_KEY` |
+| **Body** | `{{code.invoice}}` or map fields directly |
+
+### Example: Stripe Invoice
+
+```
+POST https://api.stripe.com/v1/invoices
+Headers:
+ Authorization: Bearer sk_live_xxx
+ Content-Type: application/x-www-form-urlencoded
+
+Body:
+ customer: {{company.stripeCustomerId}}
+ collection_method: send_invoice
+ days_until_due: 30
+```
+
+### Example: QuickBooks Invoice
+
+```
+POST https://quickbooks.api.intuit.com/v3/company/{realmId}/invoice
+Headers:
+ Authorization: Bearer YOUR_ACCESS_TOKEN
+ Content-Type: application/json
+
+Body: {{code.invoice}}
+```
+
+## Complete Workflow Summary
+
+| Step | Action | Purpose |
+| ---- | ----------------------- | ------------------------------------ |
+| 1 | Trigger: Record Updated | Fires when any Opportunity changes |
+| 2 | Filter | Only proceed if Stage = Closed Won |
+| 3 | Search Record | Get full Company details for billing |
+| 4 | Code | Format data for invoicing API |
+| 5 | HTTP Request | Create invoice in external system |
+
+## Tips
+
+* **Store external IDs**: Save the invoice ID returned by the API back to the Opportunity using an **Update Record** action
+* **Error handling**: Add a branch to send a notification if the HTTP request fails
+* **Test first**: Use your invoicing system's sandbox/test mode before going live
+
+## Related
+
+* [Workflow Triggers](/l/zh/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions)
+* [Closed Won Automations](/l/zh/user-guide/workflows/how-tos/crm-automations/closed-won-automations)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx
new file mode 100644
index 0000000000..4229f4ed41
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger.mdx
@@ -0,0 +1,171 @@
+---
+title: Set Up a Webhook Trigger
+description: Receive data from external services to trigger workflows.
+image: /images/user-guide/workflows/workflow.png
+---
+
+Webhook triggers allow external services to start your workflows by sending data to a unique URL. Use them to connect forms, third-party apps, and custom integrations.
+
+## When to Use Webhooks
+
+| Use Case | Example |
+| ----------------------- | --------------------------------------- |
+| **Web forms** | Contact form submissions create leads |
+| **Third-party apps** | Stripe payment → create customer record |
+| **Custom integrations** | Your app → Twenty automation |
+| **No-code tools** | Zapier, Make, n8n connections |
+
+## Step-by-Step Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it (e.g., "Website Form Submission")
+
+### Step 2: Configure the Webhook Trigger
+
+1. Click on the trigger block
+2. Select **Webhook**
+3. You'll receive a unique webhook URL like:
+ ```
+ https://api.twenty.com/webhooks/workflow/abc123...
+ ```
+4. Copy this URL—you'll need it for your external service
+
+### Step 3: Define Expected Data Structure
+
+For **POST** requests, define the expected body structure:
+
+1. Click **Define expected body**
+2. Enter a sample JSON that matches what your service will send:
+
+```json
+{
+ "firstName": "John",
+ "lastName": "Doe",
+ "email": "john@example.com",
+ "company": "Acme Inc",
+ "message": "Interested in your product"
+}
+```
+
+3. Click **Save**—this creates variables you can use in subsequent steps
+
+### Step 4: Add Actions
+
+Now add actions that use the webhook data:
+
+**Example: Create a Person record**
+
+1. Add **Create Record** action
+2. Select **People** object
+3. Map fields:
+
+| Field | Value |
+| ---------- | ---------------------------------------------------- |
+| First Name | `{{trigger.body.firstName}}` |
+| Last Name | `{{trigger.body.lastName}}` |
+| Email | `{{trigger.body.email}}` |
+| Company | Search or create based on `{{trigger.body.company}}` |
+
+### Step 5: Test the Webhook
+
+Before activating, test your webhook:
+
+**Using cURL**:
+
+```bash
+curl -X POST https://api.twenty.com/webhooks/workflow/abc123... \
+ -H "Content-Type: application/json" \
+ -d '{"firstName":"Test","lastName":"User","email":"test@example.com"}'
+```
+
+**Using Postman or similar**:
+
+1. Create a POST request to your webhook URL
+2. Set Content-Type header to `application/json`
+3. Add your test JSON body
+4. Send and check workflow runs
+
+### Step 6: Activate
+
+Once tested, click **Activate** to make the workflow live.
+
+## Handling Different Data Structures
+
+### Nested Data
+
+If your webhook sends nested data:
+
+```json
+{
+ "contact": {
+ "name": "John Doe",
+ "email": "john@example.com"
+ },
+ "source": "website"
+}
+```
+
+Reference with: `{{trigger.body.contact.email}}`
+
+### Arrays
+
+If data includes arrays:
+
+```json
+{
+ "items": [
+ {"name": "Product A", "qty": 2},
+ {"name": "Product B", "qty": 1}
+ ]
+}
+```
+
+How you handle arrays depends on your use case:
+
+**Unknown number of items → Use Iterator**
+
+If you need to process each item in the array (e.g., create a record for each), add a **Code** action to parse the array, then use **Iterator**:
+
+```javascript
+export const main = async (params: { items: any }) => {
+ const items = typeof params.items === "string"
+ ? JSON.parse(params.items)
+ : params.items;
+ return { items };
+};
+```
+
+Then use Iterator to loop through: `{{code.items}}`
+
+**Known/specific fields → Extract to named fields**
+
+If the array contains specific fields you want to access individually (e.g., form answers where position 0 is always "first name", position 1 is always "last name"), add a **Code** action to extract them:
+
+```javascript
+export const main = async (params: { items: any }) => {
+ const items = typeof params.items === "string"
+ ? JSON.parse(params.items)
+ : params.items;
+
+ return {
+ product: {
+ name: items[0]?.name || "",
+ qty: items[0]?.qty || 0
+ }
+ };
+};
+```
+
+Now you can select `product.name` and `product.qty` individually in subsequent steps.
+
+
+ For more details on handling arrays, see [Handle Arrays in Code Actions](/l/zh/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
+
+
+## Related
+
+* [Workflow Triggers](/l/zh/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx
new file mode 100644
index 0000000000..eec74fdf5f
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/closed-won-automations.mdx
@@ -0,0 +1,179 @@
+---
+title: Closed Won Automations
+description: Automate post-win activities when opportunities close.
+---
+
+When a deal closes, multiple things need to happen: update company status, notify team members, create onboarding tasks. Automate all of this with a single workflow.
+
+## The Problem
+
+When an opportunity moves to "Closed Won":
+
+* Company type needs to change from "Prospect" to "Customer"
+* Onboarding tasks need to be created
+* Customer success team needs to be notified
+* Sales rep needs confirmation
+
+Doing this manually is time-consuming and error-prone.
+
+## The Solution
+
+Create a workflow that handles all post-win activities automatically.
+
+## Complete Workflow Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it "Deal Won - Post-Win Automation"
+
+### Step 2: Configure the Trigger
+
+1. Select **Record is Updated**
+2. Choose **Opportunities**
+3. Under "Fields to monitor", select **Stage**
+
+### Step 3: Add Stage Filter
+
+1. Add **Filter** action
+2. Condition: `{{trigger.object.stage}}` equals "Closed Won"
+
+### Step 4: Update Company Type
+
+1. Add **Update Record** action
+2. Configure:
+
+| Field | Value |
+| ------------------- | ------------------------------- |
+| **Object** | Companies |
+| **Record** | `{{trigger.object.company.id}}` |
+| **Type** | Customer |
+| **First Deal Date** | `{{trigger.object.closedAt}}` |
+| **Account Owner** | `{{trigger.object.owner.id}}` |
+
+### Step 5: Create Onboarding Task
+
+1. Add **Create Record** action
+2. Configure:
+
+| Field | Value |
+| ----------------------- | ---------------------------------------------------------------------------------------------------- |
+| **Object** | Tasks |
+| **Title** | `Onboarding: {{trigger.object.name}}` |
+| **Assignee** | Customer Success team member |
+| **Due Date** | 3 days from now |
+| **Priority** | High |
+| **Related Company** | `{{trigger.object.company.id}}` |
+| **Related Opportunity** | `{{trigger.object.id}}` |
+| **Description** | `New customer onboarding for {{trigger.object.company.name}}. Deal value: {{trigger.object.amount}}` |
+
+### Step 6: Notify Customer Success
+
+1. Add **Send Email** action
+2. Configure:
+
+| Field | Value |
+| ----------- | -------------------------------------------------- |
+| **To** | customer-success@yourcompany.com |
+| **Subject** | `🎉 New Customer: {{trigger.object.company.name}}` |
+| **Body** | See example below |
+
+**Email body example**:
+
+```
+Hi CS Team,
+
+We have a new customer!
+
+Company: {{trigger.object.company.name}}
+Deal: {{trigger.object.name}}
+Value: {{trigger.object.amount}}
+Sales Rep: {{trigger.object.owner.name}}
+Close Date: {{trigger.object.closedAt}}
+
+An onboarding task has been created automatically.
+
+Let's give them a great start!
+```
+
+### Step 7: Confirm to Sales Rep
+
+1. Add another **Send Email** action
+2. Configure:
+
+| Field | Value |
+| ----------- | -------------------------------------------------------------------------------------------------------------------- |
+| **To** | `{{trigger.object.owner.email}}` |
+| **Subject** | `✅ Deal Closed: {{trigger.object.name}}` |
+| **Body** | Congratulations! Your deal has been processed. The customer success team has been notified and onboarding has begun. |
+
+### Step 8: Test and Activate
+
+1. Test by moving a test opportunity to "Closed Won"
+2. Verify:
+ * Company type changed to "Customer"
+ * Onboarding task created
+ * CS team received email
+ * Sales rep received confirmation
+3. Activate when ready
+
+## Handling Closed Lost
+
+Create a similar workflow for lost deals:
+
+### Trigger
+
+* Record is Updated (Opportunities, Stage = "Closed Lost")
+
+### Actions
+
+1. **Create Record**: Task for "Lost Deal Analysis"
+2. **Update Record**: Add lost reason to company record
+3. **Send Email**: Notify manager of lost deal
+
+## Advanced: Multi-Step Onboarding
+
+For complex onboarding, create multiple tasks:
+
+```javascript
+export const main = async (params) => {
+ const tasks = [
+ { title: "Welcome call", daysFromNow: 1, assignee: "CS" },
+ { title: "Send onboarding materials", daysFromNow: 2, assignee: "CS" },
+ { title: "Technical setup", daysFromNow: 5, assignee: "Support" },
+ { title: "30-day check-in", daysFromNow: 30, assignee: "CS" }
+ ];
+
+ return { tasks };
+};
+```
+
+Use **Iterator** to create each task from the array.
+
+## Customization Ideas
+
+### Keep your other tools up-to-date
+
+* Create customer in billing system with an **HTTP Request**
+
+### Conditional Actions
+
+Use **Filter** actions to:
+
+* Different onboarding for enterprise vs SMB
+* Different assignees based on region
+* Skip notifications for small deals
+
+### Include Deal Details
+
+Use **Code** action to format:
+
+* Deal summary documents
+* Handoff notes for CS team
+* Custom onboarding checklists
+
+## Related
+
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/zh/user-guide/workflows/capabilities/send-emails-from-workflows)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx
new file mode 100644
index 0000000000..a2cbd3d3ba
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities.mdx
@@ -0,0 +1,136 @@
+---
+title: Detect Stale Opportunities
+description: Automatically notify managers when opportunities haven't been updated.
+---
+
+Keep your pipeline healthy by alerting managers when opportunities go stale. This workflow checks for opportunities that haven't been updated in a specified number of days.
+
+## The Problem
+
+Opportunities sitting without updates lead to:
+
+* Deals going cold
+* Unreliable forecasts
+* Lost revenue
+
+## The Solution
+
+Create a scheduled workflow that finds stale opportunities and emails their managers.
+
+## Step-by-Step Setup
+
+### Step 1: Create the Workflow
+
+1. Go to **Settings → Workflows**
+2. Click **+ New Workflow**
+3. Name it "Stale Opportunity Alert"
+
+### Step 2: Configure the Trigger
+
+1. Select **On a Schedule**
+2. Set to run daily (e.g., every day at 8 AM)
+
+### Step 3: Search for Stale Opportunities
+
+1. Add **Search Records** action
+2. Configure:
+
+| Field | Value |
+| ---------- | ----------------------------------------------- |
+| **Object** | Opportunities |
+| **Filter** | Updated At is before (today - 7 days) |
+| **Filter** | Stage is not "Closed Won" AND not "Closed Lost" |
+| **Limit** | 100 |
+
+### Step 4: Check If Any Found
+
+1. Add **Filter** action
+2. Condition: `{{searchRecords.length}}` is greater than 0
+3. If no stale opportunities, the workflow stops here
+
+### Step 5: Format the Alert (Code Action)
+
+Add a **Code** action to format the email:
+
+```javascript
+export const main = async (params) => {
+ const opportunities = params.opportunities;
+
+ // Group opportunities by owner
+ const byOwner = {};
+ opportunities.forEach(opp => {
+ const ownerEmail = opp.owner?.email || 'unassigned';
+ if (!byOwner[ownerEmail]) {
+ byOwner[ownerEmail] = [];
+ }
+ byOwner[ownerEmail].push({
+ name: opp.name,
+ amount: opp.amount,
+ lastUpdated: opp.updatedAt,
+ stage: opp.stage
+ });
+ });
+
+ // Format summary for manager
+ let summary = "Stale Opportunities Report\n\n";
+ Object.entries(byOwner).forEach(([owner, opps]) => {
+ summary += `${owner}: ${opps.length} stale opportunities\n`;
+ opps.forEach(opp => {
+ summary += ` - ${opp.name} (${opp.stage})\n`;
+ });
+ summary += "\n";
+ });
+
+ return {
+ summary,
+ totalCount: opportunities.length
+ };
+};
+```
+
+### Step 6: Send Alert Email
+
+Add **Send Email** action:
+
+| Field | Value |
+| ----------- | ----------------------------------------------------------- |
+| **To** | sales-manager@yourcompany.com |
+| **Subject** | `🚨 {{code.totalCount}} Stale Opportunities Need Attention` |
+| **Body** | `{{code.summary}}` |
+
+### Step 7: Test and Activate
+
+1. Click **Test** to run the workflow
+2. Check that the email contains the right data
+3. Activate when ready
+
+## Customization Options
+
+### Change Staleness Threshold
+
+Modify the Search Records filter to change from 7 days to your preferred period:
+
+* 3 days for high-velocity sales
+* 14 days for enterprise deals
+* 30 days for long sales cycles
+
+### Alert Individual Reps
+
+Instead of one manager email, use **Iterator** to send personalized emails to each rep about their own stale deals.
+
+### Add Escalation
+
+Create multiple workflows with increasing severity:
+
+1. Day 7: Email to rep
+2. Day 14: Email to rep + manager
+3. Day 21: Create task for manager to intervene
+
+### Include in Slack
+
+Use **HTTP Request** to post to a Slack webhook instead of or in addition to email.
+
+## Related
+
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/zh/user-guide/workflows/capabilities/send-emails-from-workflows)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
new file mode 100644
index 0000000000..a4b0742071
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received.mdx
@@ -0,0 +1,74 @@
+---
+title: Display Number of Emails Received
+description: Create a workflow to automatically count and display the number of emails received from each contact.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+## Overview
+
+This workflow triggers every time a new email is received and updates a custom field on the Person record with the total count of emails from that sender.
+
+## Prerequisites
+
+Before setting up this workflow, create a custom field on the **People** object:
+
+1. Go to **Settings → Data Model → People**
+2. Add a new **Number** field
+3. Name it something like "Number of emails received from this person"
+
+## Step-by-Step Setup
+
+
+
+### Step 1: Configure the Trigger
+
+1. Go to **Workflows** and create a new workflow
+2. Select **Record is Created** as the trigger
+3. Choose **Message Participants** (available under Advanced objects)
+
+
+ A Message Participant is a combination of a message ID and a person ID, creating one unique record per message. This is easier to track than Messages directly because we can access the `handle` field, which contains the sender's (or recipient's) email address.
+
+
+### Step 2: Filter on Role
+
+1. Add a **Filter** action
+2. Set the condition: **Role** equals **FROM**
+
+This ensures you only count messages sent by this person, not messages sent to them.
+
+### Step 3: Search All Message Participants with Same Handle
+
+1. Add a **Search Records** action
+2. Select **Message Participants** as the object
+3. Add filters: **Handle** equals the handle from the trigger (the sender's email address) and **Role** equals **FROM**
+4. Increase the **Limit** from 1 to **200** (the maximum)
+
+This finds all messages from this email address to get the total count.
+
+
+ The Search Records action is limited to returning 200 records maximum. However, since you're only using the `totalCount` value (not the individual records), this step will return the total number of emails sent by this person.
+
+
+### Step 4: Update the Person Record with a Create or Update Record action
+
+1. Add a **Create or Update Record** action
+
+
+ Use **Upsert Record** instead of **Update Record** here. This lets you identify the person by their email address (the `handle` field) rather than requiring a record ID from a previous step.
+
+
+2. Select **People** as the object
+3. Find the person by matching their email to the `handle` from the Message Participant
+4. Set your custom "Number of emails received" field to `{{searchRecords.totalCount}}`
+
+The `totalCount` value from the Search Records action represents the total number of emails received from this person.
+
+## Related
+
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions)
+* [Create Custom Fields](/l/zh/user-guide/data-model/how-tos/customize-your-data-model)
+* [Search Records Action](/l/zh/user-guide/workflows/capabilities/workflow-actions#search-records)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx
new file mode 100644
index 0000000000..29e6d394a9
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/display-related-record-data.mdx
@@ -0,0 +1,170 @@
+---
+title: Display Related Record Data
+description: Show data from related records (e.g., Company info on Opportunities) using workflows.
+---
+
+Display data from related records directly on your records — for example, show the employee count from a Company on its Opportunities. This workflow workaround is useful until nested fields are natively available.
+
+## Common Use Cases
+
+| Source | Destination | Fields to Copy |
+| ----------- | ----------- | ------------------------------- |
+| Company | Opportunity | Industry, Company Size, ARR |
+| Person | Opportunity | Email, Phone, Title |
+| Opportunity | Company | Last Deal Amount, Last Won Date |
+
+## Basic Field Copy
+
+### Example: Copy Contact Email to Opportunity
+
+**Goal**: When setting a Point of Contact on an opportunity, copy their email to the opportunity for easy access.
+
+### Prerequisite
+
+Create the destination fields in **Settings → Data Model → Opportunities** before building the workflow:
+
+* Contact Email (type: Email)
+* Contact Phone (type: Phone)
+
+### Setup
+
+1. **Trigger**: Record is Updated (Opportunities, Point of Contact field)
+
+2. **Filter**: Check that Point of Contact is not empty
+
+3. **Search Records**: Find the linked person
+ * Object: People
+ * Filter: ID equals `{{trigger.object.pointOfContact.id}}`
+
+4. **Update Record**:
+ * Object: Opportunities
+ * Record: `{{trigger.object.id}}`
+ * Contact Email: `{{searchRecords[0].email}}`
+ * Contact Phone: `{{searchRecords[0].phone}}`
+
+## Copy Multiple Fields
+
+### Example: Sync Company Info to All Related Opportunities
+
+**Goal**: When company details change, update all related opportunities.
+
+### Setup
+
+1. **Trigger**: Record is Updated (Companies)
+ * Fields: Industry, Company Size, Annual Revenue
+
+2. **Search Records**: Find all opportunities for this company
+ * Object: Opportunities
+ * Filter: Company ID equals `{{trigger.object.id}}`
+
+3. **Iterator**: Loop through each opportunity
+
+4. **Update Record** (inside iterator):
+ * Object: Opportunities
+ * Record: `{{iterator.currentItem.id}}`
+ * Company Industry: `{{trigger.object.industry}}`
+ * Company Size: `{{trigger.object.companySize}}`
+ * Company ARR: `{{trigger.object.annualRevenue}}`
+
+## Copy on Record Creation
+
+### Example: Pre-fill Opportunity with Company Data
+
+**Goal**: When creating an opportunity linked to a company, automatically copy key company info.
+
+### Prerequisite
+
+Create the destination fields in **Settings → Data Model → Opportunities**:
+
+* Company Industry (type: Text)
+* Company Size (type: Number)
+
+### Setup
+
+1. **Trigger**: Record is Created (Opportunities)
+ * Filter: Company is not empty
+
+2. **Search Records**: Get the linked company's details
+ * Object: Companies
+ * Filter: ID equals `{{trigger.object.company.id}}`
+
+3. **Update Record**:
+ * Object: Opportunities
+ * Record: `{{trigger.object.id}}`
+ * Company Industry: `{{searchRecords[0].industry}}`
+ * Company Size: `{{searchRecords[0].employees}}`
+
+
+ **Tasks and Notes limitation**: Relations on Tasks and Notes are hardcoded as many-to-many and are not yet available in workflow triggers or actions. To access these relations, use the [API](/l/zh/developers/extend/capabilities/apis) instead.
+
+
+## Bidirectional Sync
+
+### Example: Keep Primary Contact in Sync
+
+**Goal**: When a company's primary contact changes, update the contact. When a person becomes primary, update the company.
+
+### Workflow 1: Company → Person
+
+1. **Trigger**: Record is Updated (Companies, Primary Contact field)
+2. **Update Record**: Set person's "Is Primary Contact" to true
+3. **Search Records**: Find previous primary contact
+4. **Update Record**: Set previous contact's "Is Primary Contact" to false
+
+### Workflow 2: Person → Company
+
+1. **Trigger**: Record is Updated (People, Is Primary Contact = true)
+2. **Update Record**: Set company's Primary Contact to this person
+
+
+ Be careful with bidirectional syncs to avoid infinite loops. Use filters to check if the value actually changed before updating.
+
+
+## Using Code for Complex Mapping
+
+### Example: Transform Data During Copy
+
+**Goal**: Copy and format phone number from person to opportunity.
+
+```javascript
+export const main = async (params) => {
+ const { phone } = params;
+
+ if (!phone) return { formattedPhone: null };
+
+ // Remove non-numeric characters
+ const digits = phone.replace(/\D/g, '');
+
+ // Format as (XXX) XXX-XXXX
+ const formatted = digits.length === 10
+ ? `(${digits.slice(0,3)}) ${digits.slice(3,6)}-${digits.slice(6)}`
+ : phone;
+
+ return { formattedPhone: formatted };
+};
+```
+
+## Best Practices
+
+### Avoid Loops
+
+* Don't create workflows that trigger each other endlessly
+* Use specific field conditions
+* Add checks to see if value actually changed
+
+### Handle Missing Data
+
+* Always check if source record exists before copying
+* Provide default values for optional fields
+* Use filters to skip when source field is empty
+
+### Performance
+
+* Batch updates when copying to many records
+* Use scheduled workflows for bulk sync operations
+* Consider using Iterator for multiple record updates
+
+## Related
+
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions)
+* [Workflow Triggers](/l/zh/user-guide/workflows/capabilities/workflow-triggers)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx
new file mode 100644
index 0000000000..32e116a99c
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/formula-fields.mdx
@@ -0,0 +1,202 @@
+---
+title: Formula Fields
+description: Create formula fields using workflows until native support is available.
+---
+
+Twenty doesn't yet support native formula fields yet (coming in 2026), but you can achieve the same result using workflows. This workaround lets you automatically calculate and populate field values—from simple concatenations to complex business logic.
+
+## Common Use Cases
+
+| Use Case | Formula Example |
+| ------------------- | --------------------------------- |
+| **Full name** | First Name + " " + Last Name |
+| **Expected amount** | Amount × Probability |
+| **Days until due** | Due Date - Today |
+| **Days in stage** | Today - Stage Entry Date |
+| **Lead score** | Points based on multiple criteria |
+
+
+ For a complete example of tracking time in pipeline stages, see [Track How Long Opportunities Stay in Each Stage](/l/zh/user-guide/views-pipelines/how-tos/track-time-in-stage).
+
+
+## Basic Formula: Concatenation
+
+### Example: Auto-Fill Full Name
+
+**Goal**: Automatically combine first and last name into a full name field.
+
+### Setup
+
+1. **Trigger**: Record is Updated or Created (People)
+
+2. **Filter**: Check that first name or last name changed
+
+3. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { firstName, lastName } = params;
+
+ const fullName = [firstName, lastName]
+ .filter(Boolean)
+ .join(' ');
+
+ return { fullName };
+};
+```
+
+4. **Update Record**: Set Full Name to `{{code.fullName}}`
+
+## Numeric Formula: Expected Amount
+
+### Example: Calculate Expected Revenue
+
+**Goal**: Multiply opportunity amount by probability to get expected amount.
+
+See [How to Show Expected Amount in Pipeline](/l/zh/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline) for the complete workflow.
+
+### Quick Setup
+
+1. **Trigger**: Record is Updated (Opportunities, Amount OR Probability field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { amount, probability } = params;
+
+ const expectedAmount = (amount || 0) * (probability || 0) / 100;
+
+ return { expectedAmount };
+};
+```
+
+3. **Update Record**: Set Expected Amount to `{{code.expectedAmount}}`
+
+## Date Formula: Days Calculation
+
+### Example: Days Until Task Due
+
+**Goal**: Calculate how many days remain until a task's due date.
+
+### Setup
+
+1. **Trigger**: Record is Updated or Created (Tasks, Due Date field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { dueDate } = params;
+
+ if (!dueDate) {
+ return { daysUntilDue: null };
+ }
+
+ const due = new Date(dueDate);
+ const today = new Date();
+ const diffTime = due - today;
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return { daysUntilDue: diffDays };
+};
+```
+
+3. **Update Record**: Set Days Until Due to `{{code.daysUntilDue}}`
+
+
+ Negative values indicate overdue tasks. You can use this field to filter or sort tasks by urgency.
+
+
+## Conditional Formula: Lead Score
+
+### Example: Calculate Lead Score Based on Criteria
+
+**Goal**: Score leads based on company size, industry, and engagement.
+
+### Setup
+
+1. **Trigger**: Record is Updated (People or Companies)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { companySize, industry, hasEmail, hasPhone, source } = params;
+
+ let score = 0;
+
+ // Company size scoring
+ if (companySize === 'Enterprise') score += 30;
+ else if (companySize === 'Mid-Market') score += 20;
+ else if (companySize === 'SMB') score += 10;
+
+ // Industry scoring
+ const targetIndustries = ['Technology', 'Finance', 'Healthcare'];
+ if (targetIndustries.includes(industry)) score += 25;
+
+ // Contact info scoring
+ if (hasEmail) score += 10;
+ if (hasPhone) score += 15;
+
+ // Source scoring
+ if (source === 'Referral') score += 20;
+ else if (source === 'Website') score += 10;
+
+ return { leadScore: score };
+};
+```
+
+3. **Update Record**: Set Lead Score to `{{code.leadScore}}`
+
+## Text Formula: Domain Extraction
+
+### Example: Extract Domain from Email
+
+**Goal**: Automatically extract and store the email domain.
+
+### Setup
+
+1. **Trigger**: Record is Updated (People, Email field)
+
+2. **Code action**:
+
+```javascript
+export const main = async (params) => {
+ const { email } = params;
+
+ if (!email) return { domain: null };
+
+ const domain = email.split('@')[1]?.toLowerCase();
+
+ return { domain };
+};
+```
+
+3. **Update Record**: Set Domain field to `{{code.domain}}`
+
+## Best Practices
+
+### Performance
+
+* Only trigger on relevant field changes
+* Use filters to skip records that don't need calculation
+* Avoid complex calculations in high-volume workflows
+
+### Error Handling
+
+* Check for null/undefined values before calculations
+* Use default values when data is missing
+* Return clear error messages when calculations fail
+
+### Testing
+
+* Test with edge cases (empty fields, zero values)
+* Verify calculations manually before activating
+* Monitor workflow runs for unexpected results
+
+## Related
+
+* [How to Show Expected Amount in Pipeline](/l/zh/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline)
+* [How to Track Time in Stage](/l/zh/user-guide/views-pipelines/how-tos/track-time-in-stage)
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
new file mode 100644
index 0000000000..9370d4834f
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due.mdx
@@ -0,0 +1,106 @@
+---
+title: Send Email Alerts with Tasks Due
+description: Automatically notify team members about their upcoming or overdue tasks.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+Send daily email reminders to each team member about their tasks due today.
+
+## Overview
+
+This workflow runs on a schedule and:
+
+1. Fetches all workspace members
+2. Loops through each member
+3. Finds their tasks due today
+4. Formats and sends a personalized email
+
+## Step-by-Step Setup
+
+
+
+### Step 1: Configure the Trigger
+
+1. Go to **Settings → Workflows** and create a new workflow
+2. Select **On a Schedule** as the trigger
+3. Use a cron expression for daily at 8:00 AM: `0 8 * * *`
+
+### Step 2: Search for All Workspace Members
+
+1. Add a **Search Records** action
+2. Select **Workspace Members** (under advanced objects)
+3. No filters needed — this returns all members
+
+### Step 3: Add an Iterator
+
+1. Add an **Iterator** action
+2. Set the input array to the workspace members from the previous step
+3. All actions inside the iterator will run once per member
+
+### Step 4: Search for Tasks Due Today (Inside Iterator)
+
+1. Inside the iterator, add a **Search Records** action
+2. Select **Tasks** as the object
+3. Add filters:
+ * **Assignee** = current workspace member (from the iterator)
+ * **Due Date** = today
+
+### Step 5: Format Tasks into Email Body (Inside Iterator)
+
+Add a **Code** action to format the tasks into a readable list with links:
+
+```javascript
+export const main = async (params: {
+ tasksDue?: Array<{ id: string; title: string }> | null | string;
+}) => {
+ const tasksDue =
+ typeof params.tasksDue === "string"
+ ? JSON.parse(params.tasksDue)
+ : params.tasksDue;
+
+ if (!Array.isArray(tasksDue) || tasksDue.length === 0) {
+ return {
+ formattedTasks: "No tasks due today."
+ };
+ }
+
+ const formattedTasks = tasksDue
+ .map(
+ t =>
+ `${t.title}\nhttps://yourSubDomain.twenty.com/object/task/${t.id}`
+ )
+ .join("\n\n");
+
+ return { formattedTasks };
+};
+```
+
+
+ Replace `yourSubDomain` with your actual Twenty workspace subdomain.
+
+
+### Step 6: Send Email (Inside Iterator)
+
+1. Add a **Send Email** action (still inside the iterator)
+2. Configure:
+
+| Field | Value |
+| ----------- | --------------------------------------------------------------- |
+| **To** | `{{iterator.currentItem.userEmail}}` (workspace member's email) |
+| **Subject** | Your Tasks Due Today |
+| **Body** | `{{code.formattedTasks}}` |
+
+### Step 7: Test and Activate
+
+1. Click **Test** to run the workflow manually
+2. Check inboxes for the emails
+3. Activate the workflow
+
+## Related
+
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions)
+* [Send Emails from Workflows](/l/zh/user-guide/workflows/capabilities/send-emails-from-workflows)
+* [Handle Arrays in Code Actions](/l/zh/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/need-more-help/professional-services.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
new file mode 100644
index 0000000000..674ca6229f
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
@@ -0,0 +1,29 @@
+---
+title: Professional Services
+description: Get professional help building complex workflows and automations from Twenty's team and certified partners.
+---
+
+## When Do You Need Professional Help?
+
+Consider professional services for:
+
+* Complex multi-system integrations
+* Advanced business logic and automation rules
+* Large-scale data processing workflows
+* Custom API development
+* Team training and workflow optimization
+* When you don't have internal resources
+
+## Service Options
+
+### Onboarding Packs
+
+Get help from our core team with our 4-hour [Onboarding packs](https://twenty.com/onboarding-packages):
+
+* **Workflow Creation**: Build custom workflows for your business processes
+* **Data Model Design**: Optimize your data structure for workflow automation
+* **Data Migration**: Import existing data with proper workflow integration
+
+### Implementation Partners
+
+Work with certified partners for advanced customizations. Contact us at contact@twenty.com to connect with our [implementation partners](https://twenty.com/partners).
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx
new file mode 100644
index 0000000000..b243fc4acb
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting.mdx
@@ -0,0 +1,170 @@
+---
+title: Workflow Troubleshooting
+description: Common workflow issues and how to resolve them.
+---
+
+## Common Issues and Solutions
+
+### Workflow Not Triggering
+
+**Symptoms**: Your workflow doesn't run when you expect it to.
+
+**Possible Causes**:
+
+1. **Workflow not activated**: Ensure the workflow is set to "Active" not "Draft"
+2. **Trigger conditions not met**: Verify the trigger matches your expected event
+3. **Field not monitored**: For "Record is Updated" triggers, ensure the specific field is being watched
+4. **Permissions**: Check you have permission to run workflows
+
+**Solutions**:
+
+* Verify workflow status in the workflow list
+* Test with the specific action you expect to trigger it
+* Review trigger configuration
+* Contact your admin about permissions
+
+### Workflow Triggers Too Early (Empty Fields)
+
+**Symptoms**: When manually creating a record in the UI, your workflow triggers before you've had time to fill in all the fields. The workflow runs with mostly empty field values.
+
+**Why this happens**: Twenty saves everything in real-time — there's no separate "edit" vs "read" mode. When you create a record, it's saved immediately, triggering the "Record is created" event before you can fill in additional fields.
+
+**When "Record is created" works well**:
+
+* Records created via API calls (fields are populated in a single request)
+* Records created via import
+* Automated record creation from other workflows
+
+**Solution**: For records created manually in the UI, use **"Record is created or updated"** as your trigger instead. This way:
+
+* The workflow triggers after the user has finished filling in and saving the fields
+* You get the complete data rather than empty values
+
+
+ If you only want the workflow to run once per record, add a Filter action to check a field like `createdAt equals updatedAt` (first save) or use a custom checkbox field to track if the workflow has already run.
+
+
+### Actions Failing
+
+**Symptoms**: Workflow runs but some actions fail.
+
+**Possible Causes**:
+
+1. **Missing data**: Required fields are empty
+2. **Invalid references**: Variables from previous steps don't exist
+3. **API errors**: External services returning errors
+4. **Permission issues**: Action requires permissions you don't have
+
+**Solutions**:
+
+* Check the workflow run details for error messages
+* Verify all required fields have values
+* Test API connections independently
+* Review role permissions
+
+### HTTP Request Errors
+
+**Symptoms**: HTTP Request actions fail or return unexpected results.
+
+**Common Error Codes**:
+
+* **400**: Bad request - check your request body format
+* **401**: Unauthorized - verify API key
+* **403**: Forbidden - check API permissions
+* **404**: Not found - verify endpoint URL
+* **429**: Too many requests - implement rate limiting
+* **500**: Server error - external service issue
+
+**Solutions**:
+
+* Verify API endpoint URL
+* Check authentication headers
+* Test the API call outside of Twenty first
+* Add error handling in Code actions
+
+### Code Action Errors
+
+**Symptoms**: JavaScript code fails to execute.
+
+**Common Issues**:
+
+1. **Syntax errors**: Typos or invalid JavaScript
+2. **Undefined variables**: Referencing variables that don't exist
+3. **Type errors**: Operations on wrong data types
+4. **Timeouts**: Code taking too long to execute
+
+**Solutions**:
+
+* Use the built-in code editor validation
+* Test code logic in a JavaScript console first
+* Add console.log statements for debugging
+* Simplify complex operations
+
+### Email Not Sending
+
+**Symptoms**: Send Email action doesn't deliver emails.
+
+**Possible Causes**:
+
+1. **No email account connected**: Check Settings → Accounts
+2. **Invalid email address**: Recipient email is malformed
+3. **Sending limits**: Email provider rate limits reached
+4. **Spam filters**: Emails being blocked
+
+**Solutions**:
+
+* Verify email account connection
+* Validate recipient email addresses
+* Check email provider limits
+* Review email content for spam triggers
+
+## Debugging Workflows
+
+### Using Workflow Runs
+
+1. Go to the workflow editor
+2. Open the **Runs** panel
+3. Find the failed run
+4. Click to see step-by-step details
+5. Review error messages and output data
+
+### Testing Individual Steps
+
+1. For Code actions, use the **Test** button
+2. For HTTP requests, test the endpoint separately
+3. Create test records to trigger workflows
+4. Use manual triggers for controlled testing
+
+### Common Debugging Patterns
+
+**Add logging**:
+Use Code actions to log intermediate values for debugging.
+
+**Isolate steps**:
+Test each step independently to identify failures.
+
+**Check data flow**:
+Verify that each step receives the expected input data.
+
+## Best Practices to Avoid Issues
+
+### Before Activation
+
+* Test thoroughly in draft mode
+* Validate all API connections
+* Review trigger conditions carefully
+* Document expected behavior
+
+### During Development
+
+* Use descriptive step names
+* Add comments in Code actions
+* Test with realistic data
+* Plan for edge cases
+
+### After Activation
+
+* Monitor initial runs closely
+* Set up alerts for failures
+* Review run history regularly
+* Keep workflows simple when possible
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx
new file mode 100644
index 0000000000..a2f6c3a561
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/how-tos/need-more-help/workflows-faq.mdx
@@ -0,0 +1,254 @@
+---
+title: Workflows FAQ
+description: Frequently asked questions about workflows in Twenty.
+---
+
+
+
+ This is likely a permissions issue. You need access to workflows to create and activate them.
+
+ **Solution**: Contact your workspace administrator to grant you workflow access under **Settings → Roles**.
+
+ If you don't see the Workflows section at all in your sidebar, this confirms it's a permissions issue.
+
+
+
+ Manual workflows only appear in the navbar if properly configured:
+
+ 1. The workflow must be **activated** (not in draft mode)
+ 2. The navbar placement must be set to **Pinned**
+ 3. For Single/Bulk triggers, you must be on the correct object page
+
+ **To check**: Open the workflow → click the trigger → verify "Navbar placement" is set to "Pinned".
+
+ You can always access manual workflows via **Cmd + K** (or **Ctrl + K**) regardless of navbar settings.
+
+
+
+ | Type | Records Required | Workflow Runs |
+ | ---- | ---------------- | ------------- |
+
+ \| **Global** | None | Once, no record input |
+ \| **Single** | One or more selected | Once per selected record |
+ \| **Bulk** | One or more selected | Once, with all records as array |
+
+ * **Global**: Use when the workflow doesn't need any record context (e.g., generate a report)
+ * **Single**: Use when you want to process each selected record independently (e.g., send individual emails)
+ * **Bulk**: Use when you need to process records together or optimize credit usage (requires Iterator action)
+
+ See [Workflow Triggers](/l/zh/user-guide/workflows/capabilities/workflow-triggers) for details.
+
+
+
+ An explicit If/Else node is not yet available but is on our roadmap.
+
+ **Current workaround**: Create multiple branches from your step, each starting with a **Filter** action:
+
+ ```
+ Step 1
+ │
+ ├── Branch A: Filter (condition = true) → Actions...
+ │
+ └── Branch B: Filter (condition = false) → Actions...
+ ```
+
+ Only the branch where the filter condition passes will execute its subsequent actions.
+
+ See [How to Use Branches](/l/zh/user-guide/workflows/capabilities/workflow-branches) for a step-by-step guide.
+
+
+
+ **Yes**, branches run in parallel by default.
+
+ If you want only one branch to execute:
+
+ * Add a **Filter** action at the start of each branch
+ * Set opposite conditions (e.g., Branch A: status = "Open", Branch B: status ≠ "Open")
+
+ Branches that fail their filter condition stop executing, while others continue.
+
+
+
+ **Yes**. After your parallel branches complete, you can add a step that both branches connect to.
+
+ In the workflow editor:
+
+ 1. Complete your branched actions
+ 2. Add a new step after the branches
+ 3. Drag connections from the end of each branch to this new step
+
+ The merged step will execute after all connected branches complete.
+
+
+
+ **Search Records returns a maximum of 200 records.**
+
+ If you need to process more:
+
+ * Add more specific filters to reduce results
+ * Use scheduled workflows to process in batches
+ * Consider using the API for bulk operations
+
+ For most workflows, 200 records is sufficient. If you regularly hit this limit, consider restructuring your automation.
+
+
+
+ **Not yet.** CC and BCC fields for the Send Email action are on our roadmap.
+
+ **Current workaround**: Add multiple Send Email actions to send to additional recipients, or use an HTTP Request to send via an external email service that supports CC.
+
+
+
+ Every action produces output data that can be used in subsequent steps.
+
+ **To reference previous step data**:
+
+ * Use the variable picker when configuring a field
+ * Or type `{{stepName.fieldName}}` directly
+
+ **Examples**:
+
+ * Trigger data: `{{trigger.object.email}}`
+ * Search results: `{{searchRecords[0].name}}`
+ * Code output: `{{code.calculatedValue}}`
+
+ Hover over any field in the action configuration to see available variables from previous steps.
+
+
+
+ **Iterator requires an array input.** Common issues:
+
+ 1. **Input is not an array**: Ensure you're passing results from Search Records or another action that returns an array
+ 2. **Array is empty**: Add a filter before Iterator to check `{{searchRecords.length}} > 0`
+ 3. **Wrong variable selected**: Make sure you select the array itself, not a single record
+
+ **Correct setup**:
+
+ 1. Search Records (returns array)
+ 2. Filter: length > 0
+ 3. Iterator: select `{{searchRecords}}`
+ 4. Actions inside iterator use `{{iterator.currentItem.fieldName}}`
+
+
+
+ Code actions (serverless functions) have a **default timeout of 5 minutes** (300 seconds).
+
+ The maximum configurable timeout is **15 minutes** (900 seconds).
+
+ If your code exceeds this limit, the action will fail with a timeout error.
+
+ **Tips to avoid timeouts**:
+
+ * Break large operations into smaller chunks using Iterator
+ * Avoid heavy computations; use external services via HTTP Request for intensive processing
+ * Optimize your code to reduce execution time
+ * If you need longer processing, consider using scheduled workflows that process data in batches
+
+
+
+ Workflow runs show the execution history and help you debug issues.
+
+ **Access runs**:
+
+ * In workflow editor → **Runs** panel on the right
+ * Or go to **Workflow Runs** in the sidebar
+
+ **Understanding a run**:
+
+ * **Status**: Running, Completed, Failed, Waiting
+ * **Steps**: See which steps executed and their output
+ * **Errors**: Click failed steps to see error messages
+ * **Data**: View input/output data at each step
+
+ See [Workflow Runs](/l/zh/user-guide/workflows/capabilities/workflow-runs) for details.
+
+
+
+ Workflow runs might be failing immediately due to rate limits.
+
+ **Hard limit: 5,000 runs per hour per workspace.**
+
+ If you exceed this limit, workflows are immediately marked as failed and won't appear in your runs list as expected.
+
+ **Common scenarios that hit this limit**:
+
+ * Selecting more than 5,000 records with a Single manual trigger
+ * Multiple workflows running simultaneously across your workspace
+ * High-frequency automated triggers (e.g., Record Updated on a busy object)
+
+ **Solutions**:
+
+ * Use **Bulk** triggers instead of Single to process many records in one run
+ * Space out large batch operations
+ * Use filters to reduce trigger frequency
+ * Schedule heavy workflows during off-peak hours
+
+
+
+ Twenty has two rate limits to ensure system stability:
+
+ | Limit | Value | Behavior |
+ | ----- | ----- | -------- |
+
+ \| **Soft limit** | 100 runs/minute | Runs queue in "Not Started" status, processed gradually |
+ \| **Hard limit** | 5,000 runs/hour | Runs immediately fail |
+
+ **Soft limit (100/min)**: Your workflows won't fail—they just wait in the queue and are processed over time. You can trigger more than 100 records; execution will be slower.
+
+ **Hard limit (5,000/hr)**: This applies to your entire workspace. If all your workflows combined exceed 5,000 runs in an hour, additional runs will fail immediately.
+
+ **Tips to stay within limits**:
+
+ * Use Bulk triggers with Iterator instead of Single triggers for large batches
+ * Combine related automations into fewer workflows
+ * Use scheduled workflows to spread load over time
+
+
+
+ **No, there is no automatic retry functionality at the moment.**
+
+ If a workflow run fails, you'll need to:
+
+ 1. Review the error in **Settings → Workflows → [Your Workflow] → Runs**
+ 2. Fix the issue (data, configuration, or external service)
+ 3. Manually trigger the workflow again on the affected record(s)
+
+ **Tips to reduce failures**:
+
+ * Add **Filter** nodes to validate data before actions
+ * Use **Search Records** to check if related records exist
+ * Test thoroughly with a few records before bulk operations
+
+ Automatic retry functionality is on our roadmap for a future release.
+
+
+
+ **Yes, if your workflows are triggered by record creation or updates.**
+
+ When you import data via CSV, each record created or updated can trigger workflows. A large import (thousands of records) could:
+
+ * Hit the 5,000 runs/hour limit
+ * Consume significant workflow credits
+ * Send unexpected emails or notifications
+ * Create duplicate tasks or records
+
+ **Before a mass import**:
+
+ 1. Go to **Settings → Workflows**
+ 2. Identify workflows triggered by the object you're importing
+ 3. **Deactivate** them temporarily
+ 4. Run your CSV import
+ 5. **Reactivate** the workflows when done
+
+ **Alternative**: If you need the workflows to run on imported data, import in smaller batches to stay within rate limits.
+
+
+
+ If your workflow canvas looks messy with nodes scattered around, you can automatically organize it:
+
+ 1. Right-click anywhere on the workflow canvas
+ 2. Click **Tidy up workflow**
+
+ This will automatically rearrange all nodes into a clean, organized layout.
+
+
diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/overview.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/overview.mdx
new file mode 100644
index 0000000000..dd03f28677
--- /dev/null
+++ b/packages/twenty-docs/l/zh/user-guide/workflows/overview.mdx
@@ -0,0 +1,80 @@
+---
+title: Workflows
+description: Learn how to build automations in Twenty.
+image: /images/user-guide/workflows/workflow.png
+---
+
+
+
+
+
+## Why Workflows Matter
+
+Twenty was built to bring maximum flexibility to its users. Rather than forcing you to adapt your business processes to rigid, pre-built features, workflows enable you to build automations that create the CRM that best supports your unique business use cases.
+
+Workflows are Twenty's in-app feature for building these automations. They give you the building blocks to create exactly what your business needs, when it needs it.
+
+## What can I do with workflows?
+
+We recommend building automations for two main purposes:
+
+1. **Internal automations to facilitate your team's day-to-day**: Reduce the amount of manual entries and repetitive tasks that slow down your team.
+2. **Bring data in and out of Twenty**: Connect Twenty via API calls and webhooks to your database and other tools.
+
+## Building Your First Workflow
+
+### Step 1: Create a New Workflow
+
+1. Go to **Workflows** accessible below the other objects
+2. Click **+ New Record**
+3. Give your workflow a name
+
+### Step 2: Add a Trigger
+
+Every workflow starts with a trigger. Choose from:
+
+* **Record events**: When a record is created, updated, or deleted
+* **Schedule**: Run at specific times (daily, weekly, etc.)
+* **Manual**: Triggered by a user action
+* **Webhook**: Triggered by a webhook
+
+
+
+### Step 3: Add Actions
+
+After your trigger, add one or more actions:
+
+* **Create Record**: Add new records to any object
+* **Update Record**: Modify existing record data
+* **Delete Record**: Remove records from objects
+* **Search Records**: Find records matching criteria
+* **Upsert Record**: Create or update based on matching criteria
+* **Iterator**: Loop through arrays of records
+* **Filter**: Control which records proceed
+* **Delay**: Wait before continuing (duration or scheduled date)
+* **Send Email**: Send emails via your connected account
+* **Code**: Run custom JavaScript
+* **HTTP Request**: Call external APIs
+* **Form**: Get inputs from users within Twenty UI at the time of execution
+* **AI Agent** (Coming soon): Run intelligent AI tasks
+
+
+
+### Step 4: Test and Activate
+
+1. Use the **Test** button to run your workflow with sample data
+2. Review the results to ensure it works as expected
+3. Toggle the workflow **Active** when ready
+
+## Workflow Best Practices
+
+* **Edit step names**: Rename your workflow steps to clearly describe what each one does. This helps with maintenance and makes it easier to hand off to coworkers
+* **Leverage previous step data**: You can use fields from records returned by any previous step in your workflow
+* **Start simple**: Begin with basic workflows and add complexity over time as you become more comfortable with the system
+* **Plan before building**: Map out your workflow logic before you start building to avoid getting stuck halfway through
+
+## Next Steps
+
+* [Workflow Triggers](/l/zh/user-guide/workflows/capabilities/workflow-triggers)
+* [Workflow Actions](/l/zh/user-guide/workflows/capabilities/workflow-actions)
+* [CRM Automations](/l/zh/user-guide/workflows/how-tos/crm-automations/closed-won-automations)