Compare commits

..
Author SHA1 Message Date
Félix MalfaitandClaude Opus 4.7 f7f9e829b6 fix(address-form): sync stale defaultSortSubField to form state
The select previously displayed a computed fallback when the stored
defaultSortSubField was no longer in the enabled subFields, but the form
state was untouched — submitting could persist the stale value. Add an
effect that keeps form state in sync with the resolved fallback whenever
subFields or the stored value changes.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 12:06:03 +02:00
Félix MalfaitandClaude Opus 4.7 634977e00e feat(field-metadata): configurable default sort sub-field for FullName and Address
Adds a `defaultSortSubField` advanced-mode setting on FullName and Address
composite fields so admins can pick which sub-field a column sort defaults
to (e.g. lastName for FullName, addressCity for Address). Address becomes
sortable for the first time; FullName previously sorted by firstName+lastName
unconditionally and now uses the configured sub-field as the primary key
with the other as a tie-breaker.

The Address sub-field dropdown is constrained to the currently-enabled
sub-fields — disabling a sub-field removes it from the sort options too,
and the runtime falls back gracefully if a previously-saved default is
later disabled.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 11:55:56 +02:00
Abdullah.andGitHub c81019965d [Website] Extract HomeVisual into shared AppPreview section. (#20432) 2026-05-11 06:46:09 +02:00
58dd5d3561 i18n - docs translations (#20431)
Created by Github action

Co-authored-by: github-actions <github-actions@twenty.com>
2026-05-10 22:35:26 +02:00
c611a7ac20 i18n - docs translations (#20429)
Created by Github action

Co-authored-by: github-actions <github-actions@twenty.com>
2026-05-10 20:37:38 +02:00
50a4fe5040 i18n - translations (#20428)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-05-10 20:24:31 +02:00
34b927ff23 feat(public-domain): bind public domains to apps + reorganize settings (#20360)
## Summary

- **Public domains can now be bound to a specific app.** When a request
hits an app-bound public domain, route resolution restricts
logic-function matching to that app's HTTP-routed functions only —
isolating each app's routes to its own domain instead of letting routes
from other apps in the workspace match nondeterministically.
- **Settings sidebar reorganized.** Removed the standalone Domains page.
Workspace Domain → General. Approved Domains + Invitations → Members
"Access" tab. Emailing Domains + Public Domains → Apps "Developer" tab.
Roles → Members "Roles" tab.

## Why

The use case: someone building a partner portal app or a lead-collection
app declares private objects (leads, partners…) plus a few public HTTP
routes. Each app needs its own domain (`partners.acme.com`,
`leads.acme.com`) without those domains exposing every other app's
routes in the same workspace. Today's PublicDomainEntity is
workspace-scoped only, so all HTTP-routed logic functions in a workspace
compete for any public domain — first match wins nondeterministically.

## Backend

- Added nullable `applicationId` FK to `PublicDomainEntity`
(cascade-deleted with the app); indexed for the route-trigger lookup.
- New fast instance command
`2-4-instance-command-fast-1798000003000-add-application-id-to-public-domain`
adds the column, index, and FK constraint.
- `createPublicDomain(domain, applicationId)` accepts an optional app
binding; new `updatePublicDomain(domain, applicationId)` mutation
rebinds/unbinds an existing domain. Both validate the application
belongs to the workspace.
- `WorkspaceDomainsService.resolveWorkspaceAndPublicDomain(origin)`
returns both the workspace and the matched public domain in one query —
replacing the old back-to-back lookups in the route-trigger hot path.
`getWorkspaceByOriginOrDefaultWorkspace` is preserved as a thin wrapper.
- `RouteTriggerService` filters `logicFunction` by `applicationId` when
the matched public domain is app-scoped; falls back to workspace-wide
when unbound.
- Three sequential validation queries in `createPublicDomain` now run in
parallel via `Promise.all`.

## Frontend

| Old location | New location |
|---|---|
| Settings sidebar → Domains (standalone page) | Removed |
| Domains page → Workspace Domain | General page |
| Domains page → Approved Domains | Members → Access tab |
| Domains page → Emailing Domains | Apps → Developer tab |
| Domains page → Public Domains | Apps → Developer tab |
| Settings sidebar → Roles (standalone) | Members → Roles tab |
| `pages/settings/roles/` | `pages/settings/members/roles/` |

- The Public Domain detail page has an Application picker that uses
`Select`'s native `emptyOption` + `null` value pattern (matches
`SettingsDataModelObjectIdentifiersForm`).
- Members page tabs use the existing `TabListFromUrlOptionalEffect`
mechanism (rendered automatically by `TabList`) for hash-based tab
activation.
- `/settings/members/roles` redirects to `/settings/members#roles` so
role sub-pages' `navigate(SettingsPath.Roles)` lands on the Members page
with the Roles tab pre-selected.
- All affected breadcrumbs updated to nest under their new parents.
- `SettingsPath.Roles` and friends now nest under `members/`;
`Subdomain` and `CustomDomain` under `general/`; `PublicDomain` and
`EmailingDomain` under `applications/`.

## Test plan

- [x] `nx typecheck twenty-front` passes
- [x] `nx typecheck twenty-server` passes
- [x] `oxlint --type-aware` clean on all touched files
- [x] `prettier --check` clean on all touched files
- [x] Migration applied locally; `publicDomain.applicationId` (uuid,
nullable) confirmed in DB
- [x] GraphQL schema exposes `PublicDomain.applicationId`,
`createPublicDomain.applicationId`, `updatePublicDomain` mutation
- [x] **End-to-end route resolution scenarios verified locally:**
  - Domain bound to App A, function in App A → route matches 
- Domain bound to App B, function in App A → route does NOT match (HTTP
404 `TRIGGER_NOT_FOUND`) 
- Domain unbound (`applicationId = NULL`) → route matches workspace-wide

  - Unknown path on bound domain → returns 404 cleanly 
- [x] UI sanity (browser-tested at `apple.localhost:3001`):
  - General page shows Workspace Domain card
  - Members page shows Team / Access / Roles tabs
  - Access tab combines Invite by link + by email + Approved Domains
  - Roles tab embeds the role list
- `/settings/members/roles` direct URL → redirects + Roles tab
pre-selected
  - Apps Developer tab shows Emailing Domains + Public Domains sections
- Public Domain detail page has Application picker dropdown listing
workspace apps
- Sidebar nav: "Domains" and "Roles" no longer present (now folded into
General/Members)

## Notes for reviewers

- Creating a public domain via the UI still requires Cloudflare
credentials in the dev `.env` (`CLOUDFLARE_API_KEY`,
`CLOUDFLARE_PUBLIC_DOMAIN_ZONE_ID`, `PUBLIC_DOMAIN_URL`). The DNS step
is unchanged from main.
- The `applicationId` column is nullable, so existing public-domain rows
continue to work workspace-wide — no data backfill required.
- `SettingsRolesContainer` was deleted (no longer referenced after
`SettingsRoles` index page was removed).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 20:17:28 +02:00
Thomas HeinrichsdoblerandGitHub 086830f81b fix(messaging): reset sync state when IMAP/SMTP/CalDAV credentials are updated (#20405)
## Problem

Updating credentials for an existing IMAP/SMTP/CalDAV connected account
in **Settings → Accounts → Connection settings** has no effect on the
sync. The save persists the new `connectionParameters`, but
`messageChannel.syncStatus` / `messageChannel.syncStage` /
`connectedAccount.authFailedAt` are left untouched, and no fetch job is
queued.

This matters most when the channel is in
`FAILED_INSUFFICIENT_PERMISSIONS` (e.g. after Apple invalidates iCloud
app-specific passwords, or on any other auth failure):
`MessagingRelaunchFailedMessageChannelsCronJob` only retries
`FAILED_UNKNOWN`, so the account is stuck on "Sync failed" forever
despite the credentials now being correct. The only known workarounds
are a direct DB update or deleting and recreating the account.

#19273 fixed the frontend cache angle of credential editing; this PR
fixes the backend half of the same UX (the channel state machine).

## Reproduce

1. Connect an IMAP/SMTP account.
2. Force an auth failure (e.g. revoke the app-specific password
upstream). Wait until `messageChannel.syncStatus` flips to
`FAILED_INSUFFICIENT_PERMISSIONS`.
3. Generate a fresh password, edit the account in **Settings →
Accounts**, save.
4. Observe: account stays "Sync failed" indefinitely;
`core.messageChannel.syncStatus` and
`core.connectedAccount.authFailedAt` are unchanged; no IMAP connect
attempt in the worker logs.

## Root cause


`packages/twenty-server/src/modules/connected-account/services/imap-smtp-caldav-apis.service.ts
→ processAccount` saves the updated `connectionParameters` but never
resets the sync state nor enqueues a fetch job.

The OAuth providers handle this:

| Reset step | `google-apis.service.ts` | `microsoft-apis.service.ts` |
`imap-smtp-caldav-apis.service.ts` (before this PR) |
|---|---|---|---|
| `updateConnectedAccountOnReconnect` (clears `authFailedAt`) | yes |
yes | — |
| `accountsToReconnectService.removeAccountToReconnect` | yes | yes | —
|
| `resetAndMarkAsMessagesListFetchPending` | yes | yes | — |
| Enqueue `MessagingMessageListFetchJob` | yes | yes | — |
| `resetAndMarkAsCalendarEventListFetchPending` | yes | yes | — |
| Enqueue `CalendarEventListFetchJob` | yes | yes | — |

#12061 introduced this behaviour for Google/Microsoft. The IMAP service
was added later and the equivalent reconnect plumbing was never ported.

## Fix

Mirrors the Google/Microsoft pattern in `processAccount`:

- **Inside** the transaction, when an account already exists: clear
`authFailedAt` on the connected account.
- **After** the transaction, when an existing account is being updated:
  - drop the account from `accountsToReconnect` user-vars,
- if the message channel exists and IMAP is configured, call
`resetAndMarkAsMessagesListFetchPending` and enqueue
`MessagingMessageListFetchJob` (skipped while the channel is still
`PENDING_CONFIGURATION`),
  - same logic for the calendar channel and `CalendarEventListFetchJob`.

Wires `MessageChannelSyncStatusService`,
`CalendarChannelSyncStatusService`, `AccountsToReconnectService` and the
messaging/calendar queues into `IMAPAPIsModule`.

## Tests

- Extended the existing `should preserve existing channels when updating
account credentials` case to assert: `authFailedAt: null` is written
within the transaction; `removeAccountToReconnect` is called with the
resolved `userId`; `resetAndMarkAs*` and queue `add` are called for both
channels.
- New case: `should not queue fetch jobs for channels still in
PENDING_CONFIGURATION`.
- New case: `should not run reconnect logic when creating a brand new
account`.

I could not run the full server test suite locally (no `node_modules`
checked out); relying on CI.

## Out of scope

- Extending `UpdateConnectedAccountOnReconnectService` to a non-OAuth
shape: kept inline to minimise the blast radius. Refactoring opportunity
for a follow-up.
- Behaviour when the user removes IMAP or CALDAV from the parameters on
update (the channel currently lingers in its old state). Pre-existing
and not made worse by this PR.
2026-05-10 11:58:53 +00:00
a962cdc34f i18n - website translations (#20418)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-05-10 11:17:55 +02:00
neo773andGitHub a15bf1e608 Reserve inbound subdomain for SES (#20414) 2026-05-10 11:17:10 +02:00
524e5d8cf7 fix: scroll AI chat to bottom on side panel reopen (#20413)
## Summary
- Fix: when reopening the AI chat side panel, users landed at the top of
the conversation and had to scroll down to find the latest messages
- Root cause: the side panel fully unmounts on close
([SidePanelForDesktop.tsx](packages/twenty-front/src/modules/side-panel/components/SidePanelForDesktop.tsx)
clears `shouldShowContent` after the close transition), so on reopen the
scroll wrapper is recreated with `scrollTop = 0`. The existing
initial-scroll-to-bottom only fires on thread change, but the
displayed-thread atom outlives the unmount, so no thread change is
detected on a remount and the scroll-to-bottom never runs
- Fix: add a tiny `AgentChatScrollToBottomOnMountLayoutEffect` rendered
inside the message list that calls `scrollAiChatToBottom()` directly in
`useLayoutEffect`. Because the parent returns `null` when there are no
messages, the mount only fires when there is content to scroll past

## Why direct scroll, not the existing flag
`agentChatIsInitialScrollPendingOnThreadChangeState` is paired with a
`MutationObserver` settle that only clears the flag once the subtree is
quiet for 150 ms. During a live stream the message subtree mutates on
every token, the settle resets indefinitely and `visibility: hidden`
never lifts. The thread-change handler avoids this because it is gated
on `!agentChatIsStreaming`
([AgentChatStreamSubscriptionEffect.tsx:78-79](packages/twenty-front/src/modules/ai/components/AgentChatStreamSubscriptionEffect.tsx)),
but a mount can happen at any time, including mid-stream. Scrolling the
DOM directly in `useLayoutEffect` runs synchronously between commit and
paint, so the user sees the bottom on the first paint with no flash and
no settle dependency.

## Tradeoff
A user who scrolled up to read history and then closes/reopens the panel
will land back at the bottom instead of where they were. Standard chat
UX (Slack, ChatGPT, iMessage); preserving per-thread scroll position
would need a new atom and is left out of scope.

## Test plan
- [ ] Open AI chat with messages, close the side panel, reopen → lands
at the bottom (latest messages visible)
- [ ] Reopen the side panel **mid-stream** → lands at the bottom and
continues to follow new tokens (chat is not hidden)
- [ ] Switch between threads → existing thread-change scroll still works
(no double-scroll, no regression)
- [ ] Open AI chat with no messages → no flash, no errors
- [ ] Rapidly close/reopen the panel a few times → each reopen lands at
the bottom

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 10:47:52 +02:00
Abdullah.andGitHub 2e5ccd9b86 [Website] Codebase cleanup and SEO improvements. (#20415) 2026-05-09 22:07:31 +02:00
459c64f642 Prevent non-admin users from impersonating admin users (#20412)
## Summary
- Adds a privilege check to workspace-level impersonation: non-admin
users can no longer impersonate users who have `canAccessFullAdminPanel`
or `canImpersonate` flags
- Adds the same check in JWT token validation as defense-in-depth
(invalidates existing impersonation sessions targeting admin users)
- Adds 3 unit tests covering: non-admin → admin blocked, non-admin →
canImpersonate blocked, admin → admin allowed

## Test plan
- [x] Unit tests pass (14/14 in `impersonation.service.spec.ts`)
- [x] Typecheck passes
- [ ] Verify workspace-level impersonation of regular users still works
normally
- [ ] Verify server-level impersonation by admins is unaffected

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-09 11:57:38 +02:00
3420d63b7a i18n - translations (#20411)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-05-09 11:12:05 +02:00
Félix MalfaitGitHubClaudeCopilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>claude[bot] <41898282+claude[bot]@users.noreply.github.com>neo773neo773
4da8878697 feat: add email forwarding message channel (#19535)
## Summary

- Add email forwarding as a new message channel type, allowing users to
forward emails from addresses like `support@mycompany.com` into Twenty
- Inbound emails arrive via S3 (SES → S3 bucket), are polled by a cron
job, parsed, routed to the correct workspace/channel, and persisted as
messages
- Dedicated settings page at `/settings/accounts/new-email-forwarding`
where users provide their source email handle and receive a unique
forwarding address
- Forwarding channels bypass the IMAP/mailbox sync state machine — they
skip cron-driven sync, relaunch, and message-list-fetch lifecycle stages
- Forwarding address section shown at the top of the Emails settings
page so users can find/copy their addresses after initial setup
- Tab names for forwarding channels display the user-provided handle
(e.g. `support@mycompany.com`) instead of the internal routing address
- Shared utilities extracted from IMAP driver: `extractThreadId`,
`extractParticipants`, `extractAddresses` to avoid code duplication
- Uses the existing S3 bucket (STORAGE_S3_*) with `inbound-email/`
prefix — no separate bucket needed
- Feature gated behind `isEmailForwardingEnabled` client config
(requires `INBOUND_EMAIL_DOMAIN` + S3 storage)

## New backend modules

- `InboundEmailS3ClientProvider` — lazy-initialized S3 client using
existing storage config
- `InboundEmailStorageService` — S3 operations (get, move to
processed/unmatched/failed)
- `InboundEmailParserService` — RFC 822 parsing via `postal-mime`,
builds `MessageWithParticipants`
- `InboundEmailImportService` — orchestrates download → parse → route →
persist → archive
- `MessagingInboundEmailPollCronJob` — polls S3 `incoming/` prefix,
enqueues import jobs
- `CreateEmailForwardingChannelInput` DTO — accepts user-provided
`handle`

## New frontend components

- `SettingsAccountsNewEmailForwardingChannel` — dedicated page with
handle input form + forwarding address result
- `SettingsAccountsEmailForwardingSection` — forwarding address list on
the Emails settings page
- `useConnectedAccountHandleMap` — shared hook for account ID → handle
lookup
- `useCreateEmailForwardingChannel` — mutation hook accepting handle
parameter

## Test plan

- [x] 17 unit tests for inbound email import service (all outcomes:
imported, unmatched, loop_dropped, unconfigured, parse_failed,
persist_failed)
- [x] 16 tests for `computeSyncStatus` including EMAIL_FORWARDING cases
- [x] 11 tests for `extractEnvelopeRecipient` utility
- [x] TypeScript typechecks pass for both twenty-server and twenty-front
- [x] Lint passes for both packages
- [ ] Manual: create forwarding channel, verify forwarding address
generated
- [ ] Manual: send email to forwarding address, verify it appears in
Twenty

https://claude.ai/code/session_01KpyF6p4cUEnuaT4h8DP5Pm

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: neo773 <62795688+neo773@users.noreply.github.com>
Co-authored-by: neo773 <neo773@protonmail.com>
2026-05-09 11:00:57 +02:00
23aa859502 refactor: scope ApplicationRegistrationService findOneById to tenant rows (#20408)
## Summary

- `findOneById` is the lookup used by tenant-scoped operations
(`update`, `delete`, `rotateClientSecret`, `getStats`,
`transferOwnership`). It currently also matches `ownerWorkspaceId IS
NULL` rows, which was a leftover from when `ownerWorkspaceId` was made
nullable to support catalog-synced apps.
- System-level rows (marketplace catalog entries, the Twenty CLI
registration, dynamic OAuth client registrations) are already managed
through dedicated admin paths — `findAll()` and `findOneByIdGlobal()`
behind `AdminPanelGuard` — so the `IS NULL` fallback in `findOneById` is
unused by any real caller.
- Dropping it tightens the contract: tenant-scoped helpers operate on
tenant rows, global helpers operate on the global view. No behavior
change for any current legitimate flow.

## Test plan

- [ ] Existing application-registration GraphQL queries/mutations
(`findOneApplicationRegistration`, `updateApplicationRegistration`,
`deleteApplicationRegistration`,
`rotateApplicationRegistrationClientSecret`,
`findApplicationRegistrationStats`,
`transferApplicationRegistrationOwnership`) continue to work for a
workspace's own registrations.
- [ ] Admin Panel "Apps" tab continues to list and view all
registrations (uses `findAllApplicationRegistrations` /
`findOneAdminApplicationRegistration`, unaffected).
- [ ] Marketplace catalog sync still upserts catalog rows (uses
`findOneByUniversalIdentifier`, unaffected).
- [ ] Twenty CLI registration bootstrap still works (uses
`findOneByUniversalIdentifier`, unaffected).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 15:37:21 +02:00
martmullandGitHub 773245fa65 Isolate twenty apps from nx project (#20406)
- avoids importing twenty-shared or else in twenty-apps applications
- update and add workflow action in twenty linear app
2026-05-08 13:16:25 +00:00
Félix MalfaitandGitHub 0f8ee5714f feat(sdk): warn when local server image is behind latest (#20352)
Closes #20328.

## Summary
- Adds a CLI-side check that warns when `twenty-app-dev` is older than
the latest published Docker Hub tag.
- Reads `APP_VERSION` from the running container via `docker inspect` —
no server endpoint, no version exposed publicly. (`APP_VERSION` is
already baked in by `packages/twenty-docker/twenty/Dockerfile` for both
`twenty` and `twenty-app-dev` targets.)
- Fetches latest semver tag from Docker Hub (same API the admin panel
already uses) and caches the result for 24h in
`~/.twenty/version-check-cache.json`.
- Wired into `twenty dev`, `twenty install`, and `twenty server start`.
- Best-effort: silent on container-missing / docker / network errors,
never blocks a command.

## Why CLI-side instead of a `/healthz` extension
The original issue suggested comparing the running server version
against Docker Hub. Exposing the running version on a public endpoint
has a small but real security cost (helps attackers fingerprint
vulnerable deployments), and the version is already inside the image —
so the CLI can read it directly without ever calling the server.

## Test plan
- [x] `nx run twenty-sdk:test` — added unit tests for `parseSemver` /
`compareSemver`
- [x] `nx run twenty-sdk:typecheck`
- [x] `nx run twenty-sdk:lint`
- [ ] Manual: with an old `twenty-app-dev` image running, run `yarn
twenty install` → see warning
- [ ] Manual: with an up-to-date image, run `yarn twenty dev` → no
warning, cache file written
- [ ] Manual: no container at all → no warning, no error
2026-05-08 14:11:34 +02:00
Paul RastoinandGitHub 7f4f2e932c Simplify dispatch pr review (#20397)
# Introduction
Sending minimal information for required metadata to be fetched
afterwards
2026-05-08 12:53:59 +02:00
martmullandGitHub 0d05788547 Protect sendEmail endpoint and thread user context through logic function executor (#20369)
- Thread userId and userWorkspaceId through
LogicFunctionExecutorService.execute() so
application access tokens carry user context when available. This allows
logic functions
triggered by authenticated HTTP routes to call sendEmail with proper
user identity, making
  the existing verifyOwnership() check work naturally.
  - Gate the sendEmail resolver with
SettingsPermissionGuard(PermissionFlagType.SEND_EMAIL_TOOL) instead of
NoPermissionGuard,
ensuring only callers with the SEND_EMAIL_TOOL permission can send
emails.
2026-05-08 10:03:39 +00:00
Abdullah.andGitHub 837a946b5f fix: basic-ftp has FTP Command injection via CRLF (#20396)
Resolves [Dependabot Alert
918](https://github.com/twentyhq/twenty/security/dependabot/918).
2026-05-08 09:38:40 +00:00
WeikoandGitHub cb0b71dbdc fix: validate enum values before opening transaction in alterEnumValues (#20376)
## Context
The validation throws after startTransaction() and outside the
surrounding try.
If the empty-enum branch ever fires, a BEGIN is left open on the
borrowed QueryRunner and never rolled back by this method the caller has
no way of knowing it now owes a ROLLBACK. Whatever the caller does next
on that QueryRunner runs inside the leftover transaction, and if its
lifecycle ends with a release() instead of a rollbackTransaction(), the
connection goes back to the pool with state still pending.
2026-05-08 07:00:13 +00:00
Charles BochetandGitHub 546ab0a036 fix: handle widgets with missing universalConfiguration in 2.3 delete-gauge-widgets command (#20393)
## Summary

The 2.3 `upgrade:2-3:delete-gauge-widgets` workspace command crashed in
production for ~10 workspaces (out of 5000) with:

```
[Error] Cannot read properties of undefined (reading 'configurationType')
    at .../2-3-workspace-command-1798000000000-delete-gauge-widgets.command.js:35:164
    at Array.filter (<anonymous>)
```

### Root cause

Those workspaces have legacy `pageLayoutWidget` rows whose
`configuration` JSONB does not contain a recognized `configurationType`.
This is consistent with the 1.15 backfill
(`MigratePageLayoutWidgetConfigurationCommand`) only migrating widgets
with the deprecated `graphType` and the `IFRAME` /
`STANDALONE_RICH_TEXT` types — any other widget type that was already
missing `configurationType` (or has a value not in the current enum) was
left as-is.

When the cache is recomputed,
`fromPageLayoutWidgetConfigurationToUniversalConfiguration` switches on
`configuration.configurationType`. With no matching case, the function
falls through and returns `undefined`, so the cached
`widget.universalConfiguration` ends up `undefined`. The gauge filter
then dereferences `.configurationType` and throws.

We can't reproduce the affected data locally, but the symptom uniquely
points at this fall-through path — every other code path either throws
earlier (e.g. when `configuration` itself is null) or yields a defined
`universalConfiguration`.

### Fix

In
`2-3-workspace-command-1798000000000-delete-gauge-widgets.command.ts`:

- Skip widgets whose `universalConfiguration` is `undefined` — by
definition they aren't gauge widgets, so they don't belong in the
deletion set.
- Log them as a warning (id and count) so we still have visibility on
the corrupt rows for follow-up cleanup.
- Use optional chaining when comparing the configuration type so the
filter is robust to the same shape going forward.

The fix is minimal and additive: workspaces without corrupt widgets
behave exactly as before, and the upgrade can now succeed on the
affected workspaces.

## Test plan

- [ ] CI lint + typecheck green
- [ ] Run the upgrade on a healthy workspace locally — gauge widgets are
still deleted, no warnings logged
- [ ] On production, verify the 2.3 upgrade no longer fails on the
affected ~10 workspaces and that the warning logs surface the offending
widget ids for follow-up

## Follow-ups (out of scope of this PR)

- Investigate the corrupt widgets surfaced by the new warning log and
decide whether to backfill / delete them in a dedicated upgrade command
- Consider hardening
`fromPageLayoutWidgetConfigurationToUniversalConfiguration` so the
switch fall-through fails loudly (or returns a sentinel) instead of
silently yielding `undefined`
2026-05-08 09:05:22 +02:00
89eeb34ca7 i18n - website translations (#20384)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-05-08 09:00:45 +02:00
ee8004922e chore: sync AI model catalog from models.dev (#20392)
Automated daily sync of `ai-providers.json` from
[models.dev](https://models.dev).

This PR updates pricing, context windows, and model availability based
on the latest data.
New models meeting inclusion criteria (tool calling, pricing data,
context limits) are added automatically.
Deprecated models are detected based on cost-efficiency within the same
model family.

**Please review before merging** — verify no critical models were
incorrectly deprecated.

Co-authored-by: FelixMalfait <6399865+FelixMalfait@users.noreply.github.com>
2026-05-08 08:32:12 +02:00
1415 changed files with 36344 additions and 26493 deletions
@@ -20,15 +20,7 @@ jobs:
env:
GH_TOKEN: ${{ secrets.CI_PRIVILEGED_DISPATCH_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}
PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
PR_AUTHOR_ASSOCIATION: ${{ github.event.pull_request.author_association }}
REPO: ${{ github.repository }}
run: |
gh api repos/twentyhq/ci-privileged/dispatches \
-f event_type=pr-review \
-f "client_payload[pr_number]=$PR_NUMBER" \
-f "client_payload[pr_head_sha]=$PR_HEAD_SHA" \
-f "client_payload[pr_author]=$PR_AUTHOR" \
-f "client_payload[pr_author_association]=$PR_AUTHOR_ASSOCIATION" \
-f "client_payload[repo]=$REPO"
-f "client_payload[pr_number]=$PR_NUMBER"
+26 -26
View File
@@ -6,14 +6,14 @@
<h2 align="center" >The #1 Open-Source CRM</h2>
<p align="center"><a href="https://twenty.com"><img src="./packages/twenty-website-new/public/images/readme/globe-icon.svg" width="12" height="12"/> Website</a> · <a href="https://docs.twenty.com"><img src="./packages/twenty-website-new/public/images/readme/book-icon.svg" width="12" height="12"/> Documentation</a> · <a href="https://github.com/orgs/twentyhq/projects/1"><img src="./packages/twenty-website-new/public/images/readme/map-icon.svg" width="12" height="12"/> Roadmap </a> · <a href="https://discord.gg/cx5n4Jzs57"><img src="./packages/twenty-website-new/public/images/readme/discord-icon.svg" width="12" height="12"/> Discord</a> · <a href="https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty"><img src="./packages/twenty-website-new/public/images/readme/figma-icon.png" width="12" height="12"/> Figma</a></p>
<p align="center"><a href="https://twenty.com"><img src="./packages/twenty-website-new/public/images/readme/globe-icon.svg" width="12" height="12"/> Website</a> · <a href="https://docs.twenty.com"><img src="./packages/twenty-website-new/public/images/readme/book-icon.svg" width="12" height="12"/> Documentation</a> · <a href="https://github.com/orgs/twentyhq/projects/1"><img src="./packages/twenty-website-new/public/images/readme/map-icon.svg" width="12" height="12"/> Roadmap </a> · <a href="https://discord.gg/cx5n4Jzs57"><img src="./packages/twenty-website-new/public/images/readme/discord-icon.svg" width="12" height="12"/> Discord</a> · <a href="https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty"><img src="./packages/twenty-website-new/public/images/readme/figma-icon.webp" width="12" height="12"/> Figma</a></p>
<p align="center">
<a href="https://www.twenty.com">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="./packages/twenty-website-new/public/images/readme/github-cover-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="./packages/twenty-website-new/public/images/readme/github-cover-light.png" />
<img src="./packages/twenty-website-new/public/images/readme/github-cover-light.png" alt="Twenty banner" />
<source media="(prefers-color-scheme: dark)" srcset="./packages/twenty-website-new/public/images/readme/github-cover-dark.webp" />
<source media="(prefers-color-scheme: light)" srcset="./packages/twenty-website-new/public/images/readme/github-cover-light.webp" />
<img src="./packages/twenty-website-new/public/images/readme/github-cover-light.webp" alt="Twenty banner" />
</picture>
</a>
</p>
@@ -85,17 +85,17 @@ Want to go deeper? Read the <a href="https://docs.twenty.com/user-guide/introduc
<tr>
<td width="50%">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="./packages/twenty-website-new/public/images/readme/v2-build-apps-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="./packages/twenty-website-new/public/images/readme/v2-build-apps-light.png" />
<img src="./packages/twenty-website-new/public/images/readme/v2-build-apps-light.png" alt="Create your apps" />
<source media="(prefers-color-scheme: dark)" srcset="./packages/twenty-website-new/public/images/readme/v2-build-apps-dark.webp" />
<source media="(prefers-color-scheme: light)" srcset="./packages/twenty-website-new/public/images/readme/v2-build-apps-light.webp" />
<img src="./packages/twenty-website-new/public/images/readme/v2-build-apps-light.webp" alt="Create your apps" />
</picture>
<p align="center"><a href="https://docs.twenty.com/developers/extend/apps/getting-started"><img src="./packages/twenty-website-new/public/images/readme/code-icon.svg" width="16" height="16"/> Learn more about apps in doc</a></p>
</td>
<td width="50%">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="./packages/twenty-website-new/public/images/readme/v2-version-control-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="./packages/twenty-website-new/public/images/readme/v2-version-control-light.png" />
<img src="./packages/twenty-website-new/public/images/readme/v2-version-control-light.png" alt="Stay on top with version control" />
<source media="(prefers-color-scheme: dark)" srcset="./packages/twenty-website-new/public/images/readme/v2-version-control-dark.webp" />
<source media="(prefers-color-scheme: light)" srcset="./packages/twenty-website-new/public/images/readme/v2-version-control-light.webp" />
<img src="./packages/twenty-website-new/public/images/readme/v2-version-control-light.webp" alt="Stay on top with version control" />
</picture>
<p align="center"><a href="https://docs.twenty.com/developers/extend/apps/publishing"><img src="./packages/twenty-website-new/public/images/readme/monitor-icon.svg" width="16" height="16"/> Learn more about version control in doc</a></p>
</td>
@@ -103,17 +103,17 @@ Want to go deeper? Read the <a href="https://docs.twenty.com/user-guide/introduc
<tr>
<td width="50%">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="./packages/twenty-website-new/public/images/readme/v2-all-tools-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="./packages/twenty-website-new/public/images/readme/v2-all-tools-light.png" />
<img src="./packages/twenty-website-new/public/images/readme/v2-all-tools-light.png" alt="All the tools you need to build anything" />
<source media="(prefers-color-scheme: dark)" srcset="./packages/twenty-website-new/public/images/readme/v2-all-tools-dark.webp" />
<source media="(prefers-color-scheme: light)" srcset="./packages/twenty-website-new/public/images/readme/v2-all-tools-light.webp" />
<img src="./packages/twenty-website-new/public/images/readme/v2-all-tools-light.webp" alt="All the tools you need to build anything" />
</picture>
<p align="center"><a href="https://docs.twenty.com/developers/extend/apps/building"><img src="./packages/twenty-website-new/public/images/readme/rocket-icon.svg" width="16" height="16"/> Learn more about primitives in doc</a></p>
</td>
<td width="50%">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="./packages/twenty-website-new/public/images/readme/v2-tools-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="./packages/twenty-website-new/public/images/readme/v2-tools-light.png" />
<img src="./packages/twenty-website-new/public/images/readme/v2-tools-light.png" alt="Customize your layouts" />
<source media="(prefers-color-scheme: dark)" srcset="./packages/twenty-website-new/public/images/readme/v2-tools-dark.webp" />
<source media="(prefers-color-scheme: light)" srcset="./packages/twenty-website-new/public/images/readme/v2-tools-light.webp" />
<img src="./packages/twenty-website-new/public/images/readme/v2-tools-light.webp" alt="Customize your layouts" />
</picture>
<p align="center"><a href="https://docs.twenty.com/user-guide/layout/overview"><img src="./packages/twenty-website-new/public/images/readme/planner-icon.svg" width="16" height="16"/> Learn more about layouts in doc</a></p>
</td>
@@ -121,17 +121,17 @@ Want to go deeper? Read the <a href="https://docs.twenty.com/user-guide/introduc
<tr>
<td width="50%">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="./packages/twenty-website-new/public/images/readme/v2-ai-agents-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="./packages/twenty-website-new/public/images/readme/v2-ai-agents-light.png" />
<img src="./packages/twenty-website-new/public/images/readme/v2-ai-agents-light.png" alt="AI agents and chats" />
<source media="(prefers-color-scheme: dark)" srcset="./packages/twenty-website-new/public/images/readme/v2-ai-agents-dark.webp" />
<source media="(prefers-color-scheme: light)" srcset="./packages/twenty-website-new/public/images/readme/v2-ai-agents-light.webp" />
<img src="./packages/twenty-website-new/public/images/readme/v2-ai-agents-light.webp" alt="AI agents and chats" />
</picture>
<p align="center"><a href="https://docs.twenty.com/user-guide/ai/overview"><img src="./packages/twenty-website-new/public/images/readme/message-icon.svg" width="16" height="16"/> Learn more about AI in doc</a></p>
</td>
<td width="50%">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="./packages/twenty-website-new/public/images/readme/v2-crm-tools-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="./packages/twenty-website-new/public/images/readme/v2-crm-tools-light.png" />
<img src="./packages/twenty-website-new/public/images/readme/v2-crm-tools-light.png" alt="Plus all the tools of a good CRM" />
<source media="(prefers-color-scheme: dark)" srcset="./packages/twenty-website-new/public/images/readme/v2-crm-tools-dark.webp" />
<source media="(prefers-color-scheme: light)" srcset="./packages/twenty-website-new/public/images/readme/v2-crm-tools-light.webp" />
<img src="./packages/twenty-website-new/public/images/readme/v2-crm-tools-light.webp" alt="Plus all the tools of a good CRM" />
</picture>
<p align="center"><a href="https://docs.twenty.com/user-guide/introduction"><img src="./packages/twenty-website-new/public/images/readme/star-icon.svg" width="16" height="16"/> Learn more about CRM features in doc</a></p>
</td>
@@ -152,13 +152,13 @@ Want to go deeper? Read the <a href="https://docs.twenty.com/user-guide/introduc
# Thanks
<p align="center">
<a href="https://www.chromatic.com/"><img src="./packages/twenty-website-new/public/images/readme/chromatic.png" height="28" alt="Chromatic" /></a>
<a href="https://www.chromatic.com/"><img src="./packages/twenty-website-new/public/images/readme/chromatic.webp" height="28" alt="Chromatic" /></a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://greptile.com"><img src="./packages/twenty-website-new/public/images/readme/greptile.png" height="28" alt="Greptile" /></a>
<a href="https://greptile.com"><img src="./packages/twenty-website-new/public/images/readme/greptile.webp" height="28" alt="Greptile" /></a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://sentry.io/"><img src="./packages/twenty-website-new/public/images/readme/sentry.png" height="28" alt="Sentry" /></a>
<a href="https://sentry.io/"><img src="./packages/twenty-website-new/public/images/readme/sentry.webp" height="28" alt="Sentry" /></a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://crowdin.com/"><img src="./packages/twenty-website-new/public/images/readme/crowdin.png" height="28" alt="Crowdin" /></a>
<a href="https://crowdin.com/"><img src="./packages/twenty-website-new/public/images/readme/crowdin.webp" height="28" alt="Crowdin" /></a>
</p>
Thanks to these amazing services that we use and recommend for UI testing (Chromatic), code review (Greptile), catching bugs (Sentry) and translating (Crowdin).
-1
View File
@@ -60,7 +60,6 @@
"packages/twenty-sdk",
"packages/twenty-front-component-renderer",
"packages/twenty-client-sdk",
"packages/twenty-apps",
"packages/twenty-cli",
"packages/create-twenty-app",
"packages/twenty-oxlint-rules",
@@ -0,0 +1,14 @@
## Base documentation
- Documentation: https://docs.twenty.com/developers/extend/apps/getting-started
- Rich app example: https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps/examples/postcard
## UUID requirement
- All generated UUIDs must be valid UUID v4.
## Common Pitfalls
- Creating an object without an index view associated. Unless this is a technical object, user will need to visualize it.
- Creating a view without a navigationMenuItem associated. This will make the view available on the left sidebar.
- Creating a front-end component that has a scroll instead of being responsive to its fixed widget height and width, unless it is specifically meant to be used in a canvas tab.
@@ -0,0 +1,14 @@
## Base documentation
- Documentation: https://docs.twenty.com/developers/extend/apps/getting-started
- Rich app example: https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps/examples/postcard
## UUID requirement
- All generated UUIDs must be valid UUID v4.
## Common Pitfalls
- Creating an object without an index view associated. Unless this is a technical object, user will need to visualize it.
- Creating a view without a navigationMenuItem associated. This will make the view available on the left sidebar.
- Creating a front-end component that has a scroll instead of being responsive to its fixed widget height and width, unless it is specifically meant to be used in a canvas tab.
@@ -0,0 +1,14 @@
## Base documentation
- Documentation: https://docs.twenty.com/developers/extend/apps/getting-started
- Rich app example: https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps/examples/postcard
## UUID requirement
- All generated UUIDs must be valid UUID v4.
## Common Pitfalls
- Creating an object without an index view associated. Unless this is a technical object, user will need to visualize it.
- Creating a view without a navigationMenuItem associated. This will make the view available on the left sidebar.
- Creating a front-end component that has a scroll instead of being responsive to its fixed widget height and width, unless it is specifically meant to be used in a canvas tab.
@@ -20,7 +20,7 @@
"test:watch": "vitest --config vitest.unit.config.ts"
},
"dependencies": {
"twenty-sdk": "2.1.0"
"twenty-sdk": "2.3.0"
},
"devDependencies": {
"@types/node": "^24.7.2",
@@ -31,4 +31,35 @@ export default defineLogicFunction({
required: ['teamId', 'title'],
},
},
workflowActionTriggerSettings: {
label: 'Create Linear Issue',
inputSchema: [
{
type: 'object',
properties: {
teamId: { type: 'string' },
title: { type: 'string' },
description: { type: 'string' },
},
},
],
outputSchema: [
{
type: 'object',
properties: {
success: { type: 'boolean' },
issue: {
type: 'object',
properties: {
id: { type: 'string' },
identifier: { type: 'string' },
title: { type: 'string' },
url: { type: 'string' },
},
},
error: { type: 'string' },
},
},
],
},
});
File diff suppressed because it is too large Load Diff
-1
View File
@@ -1 +0,0 @@
{"tags": ["scope:apps"]}
@@ -1752,6 +1752,7 @@ enum FeatureFlagKey {
IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED
IS_PUBLIC_DOMAIN_ENABLED
IS_EMAILING_DOMAIN_ENABLED
IS_EMAIL_GROUP_ENABLED
IS_JUNCTION_RELATIONS_ENABLED
IS_CONNECTED_ACCOUNT_MIGRATED
IS_RICH_TEXT_V1_MIGRATED
@@ -1926,6 +1927,7 @@ type ClientConfig {
isGoogleCalendarEnabled: Boolean!
isConfigVariablesInDbEnabled: Boolean!
isImapSmtpCaldavEnabled: Boolean!
isEmailGroupEnabled: Boolean!
allowRequestsToTwentyIcons: Boolean!
calendarBookingPageId: String
isCloudflareIntegrationEnabled: Boolean!
@@ -2354,6 +2356,7 @@ type PublicDomain {
id: UUID!
domain: String!
isValidated: Boolean!
applicationId: UUID
createdAt: DateTime!
}
@@ -2777,6 +2780,7 @@ type MessageChannel {
connectedAccountId: UUID!
createdAt: DateTime!
updatedAt: DateTime!
connectedAccount: ConnectedAccountPublicDTO
}
enum MessageChannelVisibility {
@@ -2788,6 +2792,7 @@ enum MessageChannelVisibility {
enum MessageChannelType {
EMAIL
SMS
EMAIL_GROUP
}
enum MessageChannelContactAutoCreationPolicy {
@@ -2826,6 +2831,11 @@ enum MessageChannelSyncStage {
FAILED
}
type CreateEmailGroupChannelOutput {
messageChannel: MessageChannel!
forwardingAddress: String!
}
type MessageFolder {
id: UUID!
name: String
@@ -3243,6 +3253,8 @@ type Mutation {
updateMessageFolder(input: UpdateMessageFolderInput!): MessageFolder!
updateMessageFolders(input: UpdateMessageFoldersInput!): [MessageFolder!]!
updateMessageChannel(input: UpdateMessageChannelInput!): MessageChannel!
createEmailGroupChannel(input: CreateEmailGroupChannelInput!): CreateEmailGroupChannelOutput!
deleteEmailGroupChannel(id: UUID!): MessageChannel!
deleteConnectedAccount(id: UUID!): ConnectedAccountDTO!
updateCalendarChannel(input: UpdateCalendarChannelInput!): CalendarChannel!
createWebhook(input: CreateWebhookInput!): Webhook!
@@ -3316,7 +3328,8 @@ type Mutation {
updateLabPublicFeatureFlag(input: UpdateLabPublicFeatureFlagInput!): FeatureFlag!
enablePostgresProxy: PostgresCredentials!
disablePostgresProxy: PostgresCredentials!
createPublicDomain(domain: String!): PublicDomain!
createPublicDomain(domain: String!, applicationId: String): PublicDomain!
updatePublicDomain(domain: String!, applicationId: String): PublicDomain!
deletePublicDomain(domain: String!): Boolean!
checkPublicDomainValidRecords(domain: String!): DomainValidRecords
createEmailingDomain(domain: String!, driver: EmailingDomainDriver!): EmailingDomain!
@@ -4171,6 +4184,10 @@ input UpdateMessageChannelInputUpdates {
excludeGroupEmails: Boolean
}
input CreateEmailGroupChannelInput {
handle: String!
}
input UpdateCalendarChannelInput {
id: UUID!
update: UpdateCalendarChannelInputUpdates!
@@ -1388,7 +1388,7 @@ export interface FeatureFlag {
__typename: 'FeatureFlag'
}
export type FeatureFlagKey = 'IS_UNIQUE_INDEXES_ENABLED' | 'IS_JSON_FILTER_ENABLED' | 'IS_COMMAND_MENU_ITEM_ENABLED' | 'IS_MARKETPLACE_SETTING_TAB_VISIBLE' | 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED' | 'IS_PUBLIC_DOMAIN_ENABLED' | 'IS_EMAILING_DOMAIN_ENABLED' | 'IS_JUNCTION_RELATIONS_ENABLED' | 'IS_CONNECTED_ACCOUNT_MIGRATED' | 'IS_RICH_TEXT_V1_MIGRATED' | 'IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED' | 'IS_DATASOURCE_MIGRATED' | 'IS_BILLING_V2_ENABLED'
export type FeatureFlagKey = 'IS_UNIQUE_INDEXES_ENABLED' | 'IS_JSON_FILTER_ENABLED' | 'IS_COMMAND_MENU_ITEM_ENABLED' | 'IS_MARKETPLACE_SETTING_TAB_VISIBLE' | 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED' | 'IS_PUBLIC_DOMAIN_ENABLED' | 'IS_EMAILING_DOMAIN_ENABLED' | 'IS_EMAIL_GROUP_ENABLED' | 'IS_JUNCTION_RELATIONS_ENABLED' | 'IS_CONNECTED_ACCOUNT_MIGRATED' | 'IS_RICH_TEXT_V1_MIGRATED' | 'IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED' | 'IS_DATASOURCE_MIGRATED' | 'IS_BILLING_V2_ENABLED'
export interface WorkspaceUrls {
customUrl?: Scalars['String']
@@ -1554,6 +1554,7 @@ export interface ClientConfig {
isGoogleCalendarEnabled: Scalars['Boolean']
isConfigVariablesInDbEnabled: Scalars['Boolean']
isImapSmtpCaldavEnabled: Scalars['Boolean']
isEmailGroupEnabled: Scalars['Boolean']
allowRequestsToTwentyIcons: Scalars['Boolean']
calendarBookingPageId?: Scalars['String']
isCloudflareIntegrationEnabled: Scalars['Boolean']
@@ -2025,6 +2026,7 @@ export interface PublicDomain {
id: Scalars['UUID']
domain: Scalars['String']
isValidated: Scalars['Boolean']
applicationId?: Scalars['UUID']
createdAt: Scalars['DateTime']
__typename: 'PublicDomain'
}
@@ -2459,12 +2461,13 @@ export interface MessageChannel {
connectedAccountId: Scalars['UUID']
createdAt: Scalars['DateTime']
updatedAt: Scalars['DateTime']
connectedAccount?: ConnectedAccountPublicDTO
__typename: 'MessageChannel'
}
export type MessageChannelVisibility = 'METADATA' | 'SUBJECT' | 'SHARE_EVERYTHING'
export type MessageChannelType = 'EMAIL' | 'SMS'
export type MessageChannelType = 'EMAIL' | 'SMS' | 'EMAIL_GROUP'
export type MessageChannelContactAutoCreationPolicy = 'SENT_AND_RECEIVED' | 'SENT' | 'NONE'
@@ -2476,6 +2479,12 @@ export type MessageChannelSyncStatus = 'NOT_SYNCED' | 'ONGOING' | 'ACTIVE' | 'FA
export type MessageChannelSyncStage = 'PENDING_CONFIGURATION' | 'MESSAGE_LIST_FETCH_PENDING' | 'MESSAGE_LIST_FETCH_SCHEDULED' | 'MESSAGE_LIST_FETCH_ONGOING' | 'MESSAGES_IMPORT_PENDING' | 'MESSAGES_IMPORT_SCHEDULED' | 'MESSAGES_IMPORT_ONGOING' | 'FAILED'
export interface CreateEmailGroupChannelOutput {
messageChannel: MessageChannel
forwardingAddress: Scalars['String']
__typename: 'CreateEmailGroupChannelOutput'
}
export interface MessageFolder {
id: Scalars['UUID']
name?: Scalars['String']
@@ -2772,6 +2781,8 @@ export interface Mutation {
updateMessageFolder: MessageFolder
updateMessageFolders: MessageFolder[]
updateMessageChannel: MessageChannel
createEmailGroupChannel: CreateEmailGroupChannelOutput
deleteEmailGroupChannel: MessageChannel
deleteConnectedAccount: ConnectedAccountDTO
updateCalendarChannel: CalendarChannel
createWebhook: Webhook
@@ -2846,6 +2857,7 @@ export interface Mutation {
enablePostgresProxy: PostgresCredentials
disablePostgresProxy: PostgresCredentials
createPublicDomain: PublicDomain
updatePublicDomain: PublicDomain
deletePublicDomain: Scalars['Boolean']
checkPublicDomainValidRecords?: DomainValidRecords
createEmailingDomain: EmailingDomain
@@ -4495,6 +4507,7 @@ export interface ClientConfigGenqlSelection{
isGoogleCalendarEnabled?: boolean | number
isConfigVariablesInDbEnabled?: boolean | number
isImapSmtpCaldavEnabled?: boolean | number
isEmailGroupEnabled?: boolean | number
allowRequestsToTwentyIcons?: boolean | number
calendarBookingPageId?: boolean | number
isCloudflareIntegrationEnabled?: boolean | number
@@ -5024,6 +5037,7 @@ export interface PublicDomainGenqlSelection{
id?: boolean | number
domain?: boolean | number
isValidated?: boolean | number
applicationId?: boolean | number
createdAt?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
@@ -5487,6 +5501,14 @@ export interface MessageChannelGenqlSelection{
connectedAccountId?: boolean | number
createdAt?: boolean | number
updatedAt?: boolean | number
connectedAccount?: ConnectedAccountPublicDTOGenqlSelection
__typename?: boolean | number
__scalar?: boolean | number
}
export interface CreateEmailGroupChannelOutputGenqlSelection{
messageChannel?: MessageChannelGenqlSelection
forwardingAddress?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
@@ -5828,6 +5850,8 @@ export interface MutationGenqlSelection{
updateMessageFolder?: (MessageFolderGenqlSelection & { __args: {input: UpdateMessageFolderInput} })
updateMessageFolders?: (MessageFolderGenqlSelection & { __args: {input: UpdateMessageFoldersInput} })
updateMessageChannel?: (MessageChannelGenqlSelection & { __args: {input: UpdateMessageChannelInput} })
createEmailGroupChannel?: (CreateEmailGroupChannelOutputGenqlSelection & { __args: {input: CreateEmailGroupChannelInput} })
deleteEmailGroupChannel?: (MessageChannelGenqlSelection & { __args: {id: Scalars['UUID']} })
deleteConnectedAccount?: (ConnectedAccountDTOGenqlSelection & { __args: {id: Scalars['UUID']} })
updateCalendarChannel?: (CalendarChannelGenqlSelection & { __args: {input: UpdateCalendarChannelInput} })
createWebhook?: (WebhookGenqlSelection & { __args: {input: CreateWebhookInput} })
@@ -5901,7 +5925,8 @@ export interface MutationGenqlSelection{
updateLabPublicFeatureFlag?: (FeatureFlagGenqlSelection & { __args: {input: UpdateLabPublicFeatureFlagInput} })
enablePostgresProxy?: PostgresCredentialsGenqlSelection
disablePostgresProxy?: PostgresCredentialsGenqlSelection
createPublicDomain?: (PublicDomainGenqlSelection & { __args: {domain: Scalars['String']} })
createPublicDomain?: (PublicDomainGenqlSelection & { __args: {domain: Scalars['String'], applicationId?: (Scalars['String'] | null)} })
updatePublicDomain?: (PublicDomainGenqlSelection & { __args: {domain: Scalars['String'], applicationId?: (Scalars['String'] | null)} })
deletePublicDomain?: { __args: {domain: Scalars['String']} }
checkPublicDomainValidRecords?: (DomainValidRecordsGenqlSelection & { __args: {domain: Scalars['String']} })
createEmailingDomain?: (EmailingDomainGenqlSelection & { __args: {domain: Scalars['String'], driver: EmailingDomainDriver} })
@@ -6206,6 +6231,8 @@ export interface UpdateMessageChannelInput {id: Scalars['UUID'],update: UpdateMe
export interface UpdateMessageChannelInputUpdates {visibility?: (MessageChannelVisibility | null),isContactAutoCreationEnabled?: (Scalars['Boolean'] | null),contactAutoCreationPolicy?: (MessageChannelContactAutoCreationPolicy | null),messageFolderImportPolicy?: (MessageFolderImportPolicy | null),isSyncEnabled?: (Scalars['Boolean'] | null),excludeNonProfessionalEmails?: (Scalars['Boolean'] | null),excludeGroupEmails?: (Scalars['Boolean'] | null)}
export interface CreateEmailGroupChannelInput {handle: Scalars['String']}
export interface UpdateCalendarChannelInput {id: Scalars['UUID'],update: UpdateCalendarChannelInputUpdates}
export interface UpdateCalendarChannelInputUpdates {visibility?: (CalendarChannelVisibility | null),isContactAutoCreationEnabled?: (Scalars['Boolean'] | null),contactAutoCreationPolicy?: (CalendarChannelContactAutoCreationPolicy | null),isSyncEnabled?: (Scalars['Boolean'] | null)}
@@ -8163,6 +8190,14 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null
const CreateEmailGroupChannelOutput_possibleTypes: string[] = ['CreateEmailGroupChannelOutput']
export const isCreateEmailGroupChannelOutput = (obj?: { __typename?: any } | null): obj is CreateEmailGroupChannelOutput => {
if (!obj?.__typename) throw new Error('__typename is missing in "isCreateEmailGroupChannelOutput"')
return CreateEmailGroupChannelOutput_possibleTypes.includes(obj.__typename)
}
const MessageFolder_possibleTypes: string[] = ['MessageFolder']
export const isMessageFolder = (obj?: { __typename?: any } | null): obj is MessageFolder => {
if (!obj?.__typename) throw new Error('__typename is missing in "isMessageFolder"')
@@ -8691,6 +8726,7 @@ export const enumFeatureFlagKey = {
IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED: 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED' as const,
IS_PUBLIC_DOMAIN_ENABLED: 'IS_PUBLIC_DOMAIN_ENABLED' as const,
IS_EMAILING_DOMAIN_ENABLED: 'IS_EMAILING_DOMAIN_ENABLED' as const,
IS_EMAIL_GROUP_ENABLED: 'IS_EMAIL_GROUP_ENABLED' as const,
IS_JUNCTION_RELATIONS_ENABLED: 'IS_JUNCTION_RELATIONS_ENABLED' as const,
IS_CONNECTED_ACCOUNT_MIGRATED: 'IS_CONNECTED_ACCOUNT_MIGRATED' as const,
IS_RICH_TEXT_V1_MIGRATED: 'IS_RICH_TEXT_V1_MIGRATED' as const,
@@ -8790,7 +8826,8 @@ export const enumMessageChannelVisibility = {
export const enumMessageChannelType = {
EMAIL: 'EMAIL' as const,
SMS: 'SMS' as const
SMS: 'SMS' as const,
EMAIL_GROUP: 'EMAIL_GROUP' as const
}
export const enumMessageChannelContactAutoCreationPolicy = {
File diff suppressed because it is too large Load Diff
@@ -37,7 +37,7 @@ Both are available as REST and GraphQL. GraphQL adds batch upserts and the abili
Authorization: Bearer YOUR_API_KEY
```
Create an API key in **Settings → API & Webhooks → + Create key**. Copy it immediately — it's shown once. Keys can be scoped to a specific role under **Settings → Roles → Assignment tab** to limit what they can access.
Create an API key in **Settings → API & Webhooks → + Create key**. Copy it immediately — it's shown once. Keys can be scoped to a specific role under **Settings → Members → Roles → Assignment tab** to limit what they can access.
<VimeoEmbed videoId="928786722" title="Creating API key" />
@@ -83,7 +83,7 @@ Your API key grants access to sensitive data. Don't share it with untrusted serv
For better security, assign a specific role to limit access:
1. Go to **Settings → Roles**
1. Go to **Settings → Members → Roles**
2. Click on the role to assign
3. Open the **Assignment** tab
4. Under **API Keys**, click **+ Assign to API key**
@@ -37,7 +37,7 @@ Beide sind als REST und GraphQL verfügbar. GraphQL bietet Batch-Upserts und die
Authorization: Bearer YOUR_API_KEY
```
Erstellen Sie einen API-Schlüssel unter **Settings > APIs & Webhooks > + Create key**. Kopieren Sie ihn sofort — er wird nur einmal angezeigt. Schlüssel können unter **Settings > Roles > Assignment tab** auf eine bestimmte Rolle beschränkt werden, um ihren Zugriff einzuschränken.
Erstellen Sie einen API-Schlüssel unter **Settings > APIs & Webhooks > + Create key**. Kopieren Sie ihn sofort — er wird nur einmal angezeigt. Schlüssel können unter **Settings → Members → Roles Assignment tab** auf eine bestimmte Rolle beschränkt werden, um ihren Zugriff einzuschränken.
<VimeoEmbed videoId="928786722" title="API-Schlüssel erstellen" />
@@ -88,7 +88,7 @@ Ihr API-Schlüssel gewährt Zugriff auf sensible Daten. Teilen Sie ihn nicht mit
Für mehr Sicherheit weisen Sie eine spezifische Rolle zu, um den Zugriff zu beschränken:
1. Gehen Sie zu **Einstellungen → Rollen**
1. Gehen Sie zu **Einstellungen → Mitglieder → Rollen**
2. Klicken Sie auf die Rolle, die Sie zuweisen möchten
3. Öffnen Sie den Tab **Zuweisungen**
4. Unter **API-Schlüssel** auf **+ API-Schlüssel zuweisen** klicken
@@ -9,7 +9,7 @@ KI-Agenten respektieren Ihre bestehende Berechtigungsstruktur. Dies ist besonder
## Weisen Sie einem KI-Agenten eine Rolle zu
1. Gehen Sie zu **Einstellungen → Rollen**
1. Gehen Sie zu **Einstellungen → Mitglieder → Rollen**
2. Klicken Sie auf die Rolle, die Sie zuweisen möchten
3. Öffnen Sie den Tab **Zuweisungen**
4. Unter **KI-Agenten** klicken Sie auf **+ KI-Agent zuweisen**
@@ -17,7 +17,7 @@ description: Häufig gestellte Fragen zu KI-Funktionen in Twenty.
</Accordion>
<Accordion title="Haben KI-Agenten Zugriff auf alle meine Daten?">
KI-Agenten werden über das Berechtigungssystem verwaltet. Sie können KI-Agenten unter **Einstellungen → Rollen** bestimmte Rollen zuweisen und haben damit volle Kontrolle darüber, auf welche Daten sie zugreifen können und welche Aktionen sie ausführen dürfen.
KI-Agenten werden über das Berechtigungssystem verwaltet. Sie können KI-Agenten unter **Einstellungen → Mitglieder → Rollen** bestimmte Rollen zuweisen und haben damit volle Kontrolle darüber, auf welche Daten sie zugreifen können und welche Aktionen sie ausführen dürfen.
</Accordion>
<Accordion title="Wie funktionieren KI-Credits?">
@@ -48,7 +48,7 @@ Erweitern Sie Ihre Workflows mit KI-gestützten Aktionen und autonomen Agenten.
KI-Agenten werden über das bestehende Berechtigungssystem verwaltet:
1. Gehen Sie zu **Einstellungen → Rollen**
1. Gehen Sie zu **Einstellungen → Mitglieder → Rollen**
2. Konfigurieren Sie, auf welche Daten jeder KI-Agent zugreifen kann
3. Legen Sie Lese-/Schreibberechtigungen pro Objekt fest
@@ -214,7 +214,7 @@ Schließen Sie nach dem Import der Daten die Konfiguration Ihres Arbeitsbereichs
### Rollen und Berechtigungen konfigurieren
* Richten Sie Rollen unter **Einstellungen → Rollen** ein
* Richten Sie Rollen unter **Einstellungen → Mitglieder → Rollen** ein
* Weisen Sie Benutzer den entsprechenden Rollen zu
### E-Mail und Kalender verbinden
@@ -127,7 +127,7 @@ Erstellen Sie nach dem Import der Daten manuell neu:
### Rollen und Berechtigungen
* Konfigurieren Sie Rollen in **Einstellungen → Rollen**
* Richten Sie Rollen unter **Einstellungen → Mitglieder → Rollen** ein
* Weisen Sie Benutzer den entsprechenden Rollen zu
### Integrationen
@@ -13,7 +13,7 @@ Das Berechtigungssystem von Twenty ermöglicht es Ihnen, den Zugriff auf drei Ha
Um eine neue Rolle zu erstellen:
1. Gehen Sie zu **Einstellungen → Rollen**
1. Gehen Sie zu **Einstellungen → Mitglieder → Rollen**
2. Unter **Alle Rollen** klicken Sie auf **+ Rolle erstellen**
3. Geben Sie einen Rollennamen ein
4. Im Standard-Tab **Berechtigungen** [Berechtigungen konfigurieren](#customize-permissions)
@@ -23,7 +23,7 @@ Um eine neue Rolle zu erstellen:
Um eine Rolle zu löschen:
1. Gehen Sie zu **Einstellungen → Rollen**
1. Gehen Sie zu **Einstellungen → Mitglieder → Rollen**
2. Klicken Sie auf die Rolle, die Sie entfernen möchten
3. Öffnen Sie den Tab **Einstellungen** und klicken Sie auf **Rolle löschen**
4. Klicken Sie im Modal auf **Bestätigen**
@@ -36,13 +36,13 @@ Wenn eine Rolle gelöscht wird, wird jedes ihr zugewiesene Mitglied des Arbeitsb
### Aktuelle Zuweisungen anzeigen
* Gehen Sie zu **Einstellungen → Rollen**
* Gehen Sie zu **Einstellungen → Mitglieder → Rollen**
* Sehen Sie alle Rollen und wie viele Mitglieder jeweils zugewiesen sind
* Anzeigen, welche Mitglieder welche Rollen haben
### Weisen Sie einem Mitglied eine Rolle zu
1. Gehen Sie zu **Einstellungen → Rollen**
1. Gehen Sie zu **Einstellungen → Mitglieder → Rollen**
2. Klicken Sie auf die Rolle, die Sie zuweisen möchten
3. Öffnen Sie den Tab **Zuweisungen**
4. Klicken Sie auf **+ Mitglied zuweisen**
@@ -51,7 +51,7 @@ Wenn eine Rolle gelöscht wird, wird jedes ihr zugewiesene Mitglied des Arbeitsb
### Standardrolle festlegen
1. Gehen Sie zu **Einstellungen → Rollen**
1. Gehen Sie zu **Einstellungen → Mitglieder → Rollen**
2. Suchen Sie im Abschnitt **Optionen** nach **Standardrolle**
3. Wählen Sie aus, welche Rolle neue Mitglieder automatisch erhalten sollen
4. Neue Arbeitsbereichsmitglieder werden beim Beitritt dieser Rolle zugewiesen
@@ -168,7 +168,7 @@ Neben Mitgliedern des Arbeitsbereichs können Rollen auch **API-Schlüsseln** un
### Einem API-Schlüssel eine Rolle zuweisen
1. Gehen Sie zu **Einstellungen → Rollen**
1. Gehen Sie zu **Einstellungen → Mitglieder → Rollen**
2. Klicken Sie auf die Rolle, die Sie zuweisen möchten
3. Öffnen Sie den Tab **Zuweisungen**
4. Unter **API-Schlüssel** auf **+ API-Schlüssel zuweisen** klicken
@@ -183,7 +183,7 @@ API-Schlüssel ohne zugewiesene Rolle verwenden Standardberechtigungen. Weisen S
### Einem KI-Agenten eine Rolle zuweisen
1. Gehen Sie zu **Einstellungen → Rollen**
1. Gehen Sie zu **Einstellungen → Mitglieder → Rollen**
2. Klicken Sie auf die Rolle, die Sie zuweisen möchten
3. Öffnen Sie den Tab **Zuweisungen**
4. Unter **KI-Agenten** auf **+ KI-Agenten zuweisen** klicken
@@ -19,7 +19,7 @@ Jedes Mitglied des Arbeitsbereichs, dem diese Rolle zugewiesen ist, wird automat
</Accordion>
<Accordion title="Wie lege ich eine Standardrolle für neue Mitglieder fest?">
Gehen Sie zu **Einstellungen → Rollen**, suchen Sie die Option **Standardrolle** und wählen Sie aus, welche Rolle neue Mitglieder beim Beitritt automatisch erhalten sollen.
Gehen Sie zu **Einstellungen → Mitglieder → Rollen**, suchen Sie die Option **Standardrolle** und wählen Sie aus, welche Rolle neue Mitglieder beim Beitritt automatisch erhalten sollen.
</Accordion>
<Accordion title="Kann ich einem Benutzer mehrere Rollen zuweisen?">
@@ -64,7 +64,7 @@ Berechtigungen auf Zeilenebene werden bis Q1 2026 im Tarif **Organization** verf
</Accordion>
<Accordion title="Wie mache ich ein Feld für bestimmte Benutzer schreibgeschützt?">
1. Gehen Sie zu **Einstellungen → Rollen**
1. Gehen Sie zu **Einstellungen → Mitglieder → Rollen**
2. Wählen Sie die Rolle aus
3. Navigieren Sie zu dem Objekt, das das Feld enthält
4. Setzen Sie die Feldberechtigung auf **Feld anzeigen** (ohne Feld bearbeiten)
@@ -3,10 +3,12 @@ title: Domäneneinstellungen
description: Konfigurieren Sie die Arbeitsbereichsdomäne, genehmigte Zugriffsdomänen und öffentliche Domänen.
---
Konfigurieren Sie die Domäneneinstellungen unter **Einstellungen → Domänen**.
Domain-Einstellungen befinden sich an drei Stellen, abhängig davon, was Sie konfigurieren.
## Arbeitsbereichsdomäne
Konfigurieren Sie dies unter **Einstellungen → Allgemein → Arbeitsbereichs-Domain**.
Bearbeiten Sie den Namen Ihrer Subdomäne oder legen Sie eine benutzerdefinierte Domäne für Ihren Arbeitsbereich fest.
### Domäne anpassen
@@ -19,6 +21,8 @@ Für benutzerdefinierte Domänen müssen Sie die DNS-Einstellungen bei Ihrem Dom
## Genehmigte Domänen
Konfigurieren Sie dies unter **Einstellungen → Mitglieder → Zugriff**.
Jede Person mit einer E-Mail-Adresse in diesen Domänen darf sich automatisch für diesen Arbeitsbereich registrieren.
### Genehmigte Zugriffsdomäne hinzufügen
@@ -35,13 +39,16 @@ Dies ist nützlich, um Ihrem gesamten Team die Selbstregistrierung zu ermöglich
## Öffentliche Domains
Stellen Sie eine vollständige und sichere Hosting-Umgebung auf diesen Domains bereit.
Konfigurieren Sie dies unter **Einstellungen → Apps → Entwickler**.
Stellen Sie eine vollständige und sichere Hosting-Umgebung auf diesen Domains bereit. Eine öffentliche Domain kann an eine bestimmte App gebunden werden wenn sie gebunden ist, sind unter dieser Domain nur die HTTP-gerouteten Logikfunktionen dieser App erreichbar. Lassen Sie die Bindung leer, um alle HTTP-Routen des Arbeitsbereichs bereitzustellen.
### Öffentliche Domäne hinzufügen
1. Klicken Sie auf **Öffentliche Domäne hinzufügen**
2. Geben Sie die Domäne ein, die Sie verwenden möchten
3. Konfigurieren Sie die DNS-Einstellungen gemäß Anleitung
4. Überprüfen Sie die Domäne
3. Optional an eine App binden
4. Konfigurieren Sie die DNS-Einstellungen gemäß Anleitung
5. Überprüfen Sie die Domäne
SSL-Zertifikate werden für öffentliche Domänen automatisch bereitgestellt.
@@ -77,7 +77,7 @@ Verwalten Sie Einladungen, die noch nicht angenommen wurden:
Erlauben Sie Teammitgliedern, basierend auf ihrer E-Mail-Domäne automatisch beizutreten:
1. Gehen Sie zu **Einstellungen → Domänen**
1. Gehen Sie zu **Einstellungen → Mitglieder → Zugriff**
2. Fügen Sie die Domäne Ihres Unternehmens hinzu (z. B. `yourcompany.com`)
3. Jede Person mit dieser E-Mail-Domäne kann ohne Einladung beitreten
@@ -137,7 +137,7 @@ Ja, Sie können mehrere E-Mail-Konten verbinden. Gehen Sie zu **Einstellungen
<AccordionGroup>
<Accordion title="Kann ich meine Arbeitsbereichsdomäne anpassen?">
Ja! Gehen Sie zu **Einstellungen → Domänen** und klicken Sie auf **Domäne anpassen**. Sie haben zwei Optionen:
Ja! Gehen Sie zu **Einstellungen → Allgemein → Workspace-Domäne** und klicken Sie auf **Domäne anpassen**. Sie haben zwei Optionen:
* **Subdomain**: Verwenden Sie eine Twenty-Subdomain wie `yourcompany.twenty.com`
* **Benutzerdefinierte Domäne**: Verwenden Sie Ihre eigene Domäne wie `crm.yourcompany.com` (erfordert DNS-Konfiguration)
@@ -146,7 +146,7 @@ Eine Subdomain ist schnell eingerichtet, während eine benutzerdefinierte Domän
</Accordion>
<Accordion title="Wie funktionieren genehmigte Zugriffsdomänen?">
Sie können genehmigte Zugriffsdomänen konfigurieren, damit Teammitglieder mit Firmen-E-Mail-Adressen Ihrem Arbeitsbereich automatisch beitreten können. Gehen Sie zu **Einstellungen → Domänen** und fügen Sie Ihre Firmendomäne hinzu (z. B. `yourcompany.com`).
Sie können genehmigte Zugriffsdomänen konfigurieren, damit Teammitglieder mit Firmen-E-Mail-Adressen Ihrem Arbeitsbereich automatisch beitreten können. Gehen Sie zu **Einstellungen → Mitglieder → Zugriff** und fügen Sie Ihre Firmendomäne hinzu (z. B. `yourcompany.com`).
</Accordion>
</AccordionGroup>
@@ -44,7 +44,7 @@ Fügen Sie Ihrem Arbeitsbereich Teammitglieder hinzu:
4. Weisen Sie geeignete Rollen zu
<Note>
Bevor Sie Ihr Team einladen, überprüfen Sie die Standardrolle unter **Einstellungen → Rollen**. Neuen Mitgliedern wird diese Rolle beim Beitritt automatisch zugewiesen.
Bevor Sie Ihr Team einladen, überprüfen Sie die Standardrolle unter **Einstellungen → Mitglieder → Rollen**. Neuen Mitgliedern wird diese Rolle beim Beitritt automatisch zugewiesen.
</Note>
## Checkliste für Arbeitsbereichseinstellungen
@@ -38,7 +38,7 @@ Sie benötigen zwei benutzerdefinierte Felder am Objekt „Opportunities“.
Wenn Benutzer diese berechneten Felder nicht manuell bearbeiten sollen:
1. Gehen Sie zu **Einstellungen → Rollen**
1. Gehen Sie zu **Einstellungen → Mitglieder → Rollen**
2. Wählen Sie die zu konfigurierende Rolle aus
3. Suchen Sie das Objekt „Opportunities“
4. Setzen Sie die Felder **Probability** und **Expected Amount** auf schreibgeschützt
@@ -61,7 +61,7 @@ Sie benötigen keine "Days in"-Felder für Closed Won und Closed Lost, da dies f
Wenn Benutzer diese berechneten Felder nicht manuell bearbeiten sollen:
1. Gehen Sie zu **Einstellungen → Rollen**
1. Gehen Sie zu **Einstellungen → Mitglieder → Rollen**
2. Rolle zum Konfigurieren auswählen
3. Suchen Sie das Objekt Opportunities
4. Setzen Sie die Felder "Last Entered" und "Days in" auf schreibgeschützt
@@ -307,5 +307,5 @@ AI Agent actions consume workflow credits based on the AI model used. See [Workf
</Note>
<Note>
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/de/user-guide/permissions-access/capabilities/permissions) for details.
AI agents respect role-based permissions. Sie können Agenten unter **Einstellungen → Mitglieder → Rollen** bestimmte Rollen zuweisen, um zu steuern, auf welche Daten sie zugreifen können. See [Permissions](/l/de/user-guide/permissions-access/capabilities/permissions) for details.
</Note>
@@ -8,7 +8,7 @@ description: Häufig gestellte Fragen zu Workflows in Twenty.
<Accordion title="Warum kann ich einen Workflow nicht aktivieren?">
Dies ist wahrscheinlich ein Berechtigungsproblem. Sie benötigen Zugriff auf Workflows, um sie zu erstellen und zu aktivieren.
**Lösung**: Wenden Sie sich an Ihren Workspace-Administrator, damit er Ihnen unter **Einstellungen → Rollen** Zugriff auf Workflows gewährt.
**Lösung**: Wenden Sie sich an Ihren Workspace-Administrator, damit er Ihnen unter **Einstellungen → Mitglieder → Rollen** Zugriff auf Workflows gewährt.
Wenn Sie den Bereich Workflows in Ihrer Seitenleiste überhaupt nicht sehen, bestätigt dies ein Berechtigungsproblem.
</Accordion>
@@ -37,7 +37,7 @@ Ambas estão disponíveis como REST e GraphQL. GraphQL adiciona upserts em lote
Authorization: Bearer YOUR_API_KEY
```
Crie uma chave de API em **Settings → API & Webhooks → + Create key**. Copie-a imediatamente — ela é exibida apenas uma vez. As chaves podem ter escopo para uma função específica em **Settings → Roles → Assignment tab** para limitar o que podem acessar.
Crie uma chave de API em **Settings → API & Webhooks → + Create key**. Copie-a imediatamente — ela é exibida apenas uma vez. As chaves podem ser limitadas a uma função específica em **Settings → Members → Roles → Assignment tab** para restringir o que podem acessar.
<VimeoEmbed videoId="928786722" title="Criando chave de API" />
@@ -88,7 +88,7 @@ Sua chave de API concede acesso a dados confidenciais. Não a compartilhe com se
Para maior segurança, atribua uma função específica para limitar o acesso:
1. Vá para **Configurações → Funções**
1. Vá para **Configurações → Membros → Funções**
2. Clique na função que deseja atribuir
3. Abra a aba de **Atribuição**
4. Em **Chaves de API**, clique em **+ Atribuir à chave de API**
@@ -9,7 +9,7 @@ Os agentes de IA respeitam sua estrutura de permissões existente. Isso é parti
## Atribuir uma Função a um Agente de IA
1. Vá para **Configurações → Funções**
1. Vá para **Configurações → Membros → Funções**
2. Clique na função que deseja atribuir
3. Abra a aba de **Atribuição**
4. Em **Agentes de IA**, clique em **+ Atribuir ao agente de IA**
@@ -17,7 +17,7 @@ description: Perguntas frequentes sobre recursos de IA na Twenty.
</Accordion>
<Accordion title="Os agentes de IA terão acesso a todos os meus dados?">
Os agentes de IA funcionarão de acordo com o sistema de permissões. Você pode atribuir funções específicas aos agentes de IA em **Configurações → Funções**, dando a você controle total sobre quais dados eles podem acessar e quais ações podem executar.
Os agentes de IA funcionarão de acordo com o sistema de permissões. Você pode atribuir funções específicas aos agentes de IA em **Configurações → Membros → Funções**, dando a você controle total sobre quais dados eles podem acessar e quais ações podem executar.
</Accordion>
<Accordion title="Como os créditos de IA vão funcionar?">
@@ -48,7 +48,7 @@ Amplie seus fluxos de trabalho com ações com IA e agentes autônomos.
Os agentes de IA serão gerenciados pelo sistema de permissões existente:
1. Vá para **Configurações → Funções**
1. Vá para **Configurações → Membros → Funções**
2. Configure quais dados cada agente de IA pode acessar
3. Defina permissões de leitura/gravação por objeto
@@ -214,7 +214,7 @@ Após importar os dados, complete a configuração do seu espaço de trabalho:
### Configure funções e permissões
* Configure as funções em **Definições → Funções**
* Configure as funções em **Definições → Membros → Funções**
* Atribua os utilizadores às funções apropriadas
### Ligue o e-mail e o calendário
@@ -127,7 +127,7 @@ Depois de importar os dados, recrie manualmente:
### Funções e Permissões
* Configure as funções em **Configurações → Funções**
* Configure as funções em **Definições → Membros → Funções**
* Atribua os utilizadores às funções apropriadas
### Integrações
@@ -13,7 +13,7 @@ O sistema de permissões do Twenty permite que você controle o acesso a três
Para criar uma nova função:
1. Vá para **Configurações → Funções**
1. Vá para **Configurações → Membros → Funções**
2. Em **Todas as Funções**, clique em **+ Criar Função**
3. Digite um nome para a função
4. Na aba padrão **Permissões**, [configure as permissões](#customize-permissions)
@@ -23,7 +23,7 @@ Para criar uma nova função:
Para excluir uma função:
1. Vá para **Configurações → Funções**
1. Vá para **Configurações → Membros → Funções**
2. Clique na função que deseja remover
3. Abra a aba de **Configurações** e clique em **Excluir Função**
4. Clique em **Confirmar** no modal
@@ -36,13 +36,13 @@ Se uma função for excluída, qualquer membro do espaço de trabalho atribuído
### Visualizar Atribuições Atuais
* Vá para **Configurações → Funções**
* Vá para **Configurações → Membros → Funções**
* Veja todas as funções e quantos membros estão atribuídos a cada uma
* Veja quais membros têm quais funções
### Atribuir uma Função a um Membro
1. Vá para **Configurações → Funções**
1. Vá para **Configurações → Membros → Funções**
2. Clique na função que deseja atribuir
3. Abra a aba de **Atribuição**
4. Clique em **+ Atribuir a membro**
@@ -51,7 +51,7 @@ Se uma função for excluída, qualquer membro do espaço de trabalho atribuído
### Definir Função Padrão
1. Vá para **Configurações → Funções**
1. Vá para **Configurações → Membros → Funções**
2. Na seção **Opções**, encontre **Função Padrão**
3. Selecione qual função novos membros devem receber automaticamente
4. Novos membros do espaço de trabalho serão atribuídos a essa função ao ingressar
@@ -168,7 +168,7 @@ Além dos membros do espaço de trabalho, funções também podem ser atribuída
### Atribuir uma função a uma chave de API
1. Vá para **Configurações → Funções**
1. Vá para **Configurações → Membros → Funções**
2. Clique na função que deseja atribuir
3. Abra a aba de **Atribuição**
4. Em **Chaves de API**, clique em **+ Atribuir à chave de API**
@@ -183,7 +183,7 @@ Chaves de API sem uma função atribuída usam permissões padrão. Para maior s
### Atribuir uma função a um agente de IA
1. Vá para **Configurações → Funções**
1. Vá para **Configurações → Membros → Funções**
2. Clique na função que deseja atribuir
3. Abra a aba de **Atribuição**
4. Em **Agentes de IA**, clique em **+ Atribuir ao agente de IA**
@@ -19,7 +19,7 @@ Qualquer membro do espaço de trabalho atribuído a essa função será automati
</Accordion>
<Accordion title="Como defino uma função padrão para novos membros?">
Vá para **Configurações → Funções**, encontre a opção **Função Padrão** e selecione qual função os novos membros devem receber automaticamente ao entrar.
Vá para **Configurações → Membros → Funções**, encontre a opção **Função Padrão** e selecione qual função os novos membros devem receber automaticamente ao entrar.
</Accordion>
<Accordion title="Posso atribuir várias funções a um único usuário?">
@@ -64,7 +64,7 @@ As permissões em nível de linha estarão disponíveis no plano **Organization*
</Accordion>
<Accordion title="Como deixar um campo somente leitura para determinados usuários?">
1. Vá para **Configurações → Funções**
1. Vá para **Configurações → Membros → Funções**
2. Selecione a função
3. Navegue até o objeto que contém o campo
4. Defina a permissão do campo como **Ver campo** (sem Editar campo)
@@ -3,10 +3,12 @@ title: Configurações de Domínio
description: Configure o domínio do espaço de trabalho, os domínios de acesso aprovados e os domínios públicos.
---
Configure as configurações de domínio em **Configurações → Domínios**.
As configurações de domínio ficam em três lugares, dependendo do que você está configurando.
## Domínio do espaço de trabalho
Configure em **Configurações → Geral → Domínio do workspace**.
Edite o nome do seu subdomínio ou defina um domínio personalizado para o seu espaço de trabalho.
### Personalizar domínio
@@ -19,6 +21,8 @@ Para domínios personalizados, você precisará configurar as configurações de
## Domínios Aprovados
Configure em **Configurações → Membros → Acesso**.
Qualquer pessoa com um endereço de e-mail nesses domínios pode inscrever-se neste espaço de trabalho automaticamente.
### Adicionar Domínio de Acesso Aprovado
@@ -35,13 +39,16 @@ Isso é útil para permitir que toda a sua equipe se registre por conta própria
## Domínios Públicos
Provisionar um ambiente de hospedagem completo e seguro nestes domínios.
Configure em **Configurações → Aplicativos → Desenvolvedor**.
Provisionar um ambiente de hospedagem completo e seguro nestes domínios. Um domínio público pode ser vinculado a um app específico — quando vinculado, somente as funções de lógica roteadas por HTTP desse app ficam acessíveis no domínio. Deixe a vinculação vazia para expor todas as rotas HTTP do workspace.
### Adicionar Domínio Público
1. Clique em **Adicionar Domínio Público**
2. Insira o domínio que você deseja usar
3. Configure as configurações de DNS conforme as instruções
4. Verifique o domínio
3. Opcionalmente vincule-o a um app
4. Configure as configurações de DNS conforme as instruções
5. Verifique o domínio
Os certificados SSL são provisionados automaticamente para domínios públicos.
@@ -77,7 +77,7 @@ Gerencie convites que ainda não foram aceitos:
Permita que membros da equipe ingressem automaticamente com base no domínio de e-mail:
1. Vá para **Configurações → Domínios**
1. Vá para **Configurações → Membros → Acesso**
2. Adicione o domínio da sua empresa (por exemplo, `yourcompany.com`)
3. Qualquer pessoa com esse domínio de e-mail pode ingressar sem convite
@@ -137,7 +137,7 @@ Sim, você pode conectar várias contas de e-mail. Vá para **Configurações
<AccordionGroup>
<Accordion title="Posso personalizar o domínio do meu espaço de trabalho?">
Sim! Vá para **Configurações → Domínios** e clique em **Personalizar domínio**. Você tem duas opções:
Sim! Vá para **Configurações → Geral → Domínio do espaço de trabalho** e clique em **Personalizar domínio**. Você tem duas opções:
* **Subdomínio**: Use um subdomínio do Twenty como `yourcompany.twenty.com`
* **Domínio personalizado**: Use seu próprio domínio, como `crm.yourcompany.com` (requer configuração de DNS)
@@ -146,7 +146,7 @@ Um subdomínio é rápido de configurar, enquanto um domínio personalizado ofer
</Accordion>
<Accordion title="Como funcionam os domínios de acesso aprovados?">
Você pode configurar domínios de acesso aprovados para que membros da equipe com endereços de e-mail da empresa possam ingressar automaticamente no seu espaço de trabalho. Vá para **Configurações → Domínios** e adicione o domínio da sua empresa (por exemplo, `yourcompany.com`).
Você pode configurar domínios de acesso aprovados para que membros da equipe com endereços de e-mail da empresa possam ingressar automaticamente no seu espaço de trabalho. Vá para **Configurações → Membros → Acesso** e adicione o domínio da sua empresa (por exemplo, `yourcompany.com`).
</Accordion>
</AccordionGroup>
@@ -44,7 +44,7 @@ Adicione membros da equipa ao seu espaço de trabalho:
4. Atribua funções apropriadas
<Note>
Antes de convidar a sua equipa, verifique a função padrão em **Configurações → Funções**. Novos membros recebem automaticamente essa função ao entrar.
Antes de convidar a sua equipa, verifique a função padrão em **Configurações → Membros → Funções**. Novos membros recebem automaticamente essa função ao entrar.
</Note>
## Lista de Verificação das Configurações do Espaço de Trabalho
@@ -38,7 +38,7 @@ Você precisa de dois campos personalizados no objeto Oportunidades.
Se você não quiser que os usuários editem manualmente esses campos calculados:
1. Vá para **Configurações → Funções**
1. Vá para **Configurações → Membros → Funções**
2. Selecione a função a configurar
3. Encontre o objeto Oportunidades
4. Defina os campos **Probability** e **Expected Amount** como somente leitura
@@ -61,7 +61,7 @@ Você não precisa de campos "Dias em" para Fechado Ganho e Fechado Perdido, poi
Se você não quiser que os usuários editem manualmente esses campos calculados:
1. Vá para **Configurações → Funções**
1. Vá para **Configurações → Membros → Funções**
2. Selecione a função a configurar
3. Encontre o objeto Oportunidades
4. Defina os campos "Última entrada" e "Dias em" como somente leitura
@@ -307,5 +307,5 @@ As ações do Agente de IA consomem créditos de fluxo de trabalho com base no m
</Note>
<Note>
Os agentes de IA respeitam permissões baseadas em funções. Você pode atribuir funções específicas aos agentes em **Configurações → Funções** para controlar a quais dados eles podem acessar. Veja [Permissões](/l/pt/user-guide/permissions-access/capabilities/permissions) para obter detalhes.
Os agentes de IA respeitam permissões baseadas em funções. Você pode atribuir funções específicas aos agentes em **Configurações → Membros → Funções** para controlar a quais dados eles podem acessar. Veja [Permissões](/l/pt/user-guide/permissions-access/capabilities/permissions) para obter detalhes.
</Note>
@@ -8,7 +8,7 @@ description: Perguntas frequentes sobre fluxos de trabalho na Twenty.
<Accordion title="Por que não consigo ativar um fluxo de trabalho?">
Isso provavelmente é um problema de permissões. Você precisa de acesso a fluxos de trabalho para criá-los e ativá-los.
**Solução**: Entre em contato com o administrador do seu espaço de trabalho para conceder acesso a fluxos de trabalho em **Configurações → Funções**.
**Solução**: Entre em contato com o administrador do seu espaço de trabalho para conceder acesso a fluxos de trabalho em **Configurações → Membros → Funções**.
Se você não vê a seção de fluxos de trabalho na sua barra lateral, isso confirma que é um problema de permissões.
</Accordion>
@@ -37,7 +37,7 @@ Ambele sunt disponibile ca REST și GraphQL. GraphQL adaugă upsert-uri în lot
Authorization: Bearer YOUR_API_KEY
```
Creează o cheie API în **Settings → API & Webhooks → + Create key**. Copiază-o imediat — este afișată o singură dată. Cheile pot fi limitate la un rol specific în **Settings → Roles → Assignment tab** pentru a restricționa la ce pot avea acces.
Creează o cheie API în **Settings → API & Webhooks → + Create key**. Copiază-o imediat — este afișată o singură dată. Cheile pot fi limitate la un rol specific în **Settings → Members → Roles → Assignment tab** pentru a restricționa la ce pot avea acces.
<VimeoEmbed videoId="928786722" title="Crearea unei chei API" />
@@ -88,7 +88,7 @@ Cheia dvs. API oferă acces la date sensibile. Nu o partajați cu servicii care
Pentru o securitate sporită, atribuiți un rol specific pentru a limita accesul:
1. Accesați **Setări → Roluri**
1. Accesați **Setări → Membri → Roluri**
2. Faceți clic pe rolul pe care doriți să-l atribuiți
3. Deschideți fila **Atribuire**
4. În **API Keys**, faceți clic pe **+ Assign to API key**
@@ -9,7 +9,7 @@ Agenții AI respectă structura de permisiuni existentă. Acest lucru este deose
## Atribuiți un Rol unui Agent AI
1. Accesați **Setări → Roluri**
1. Accesați **Setări → Membri → Roluri**
2. Faceți clic pe rolul pe care doriți să-l atribuiți
3. Deschideți fila **Atribuire**
4. În **Agenți AI**, faceți clic pe **+ Atribuiți agentului AI**
@@ -17,7 +17,7 @@ description: Întrebări frecvente despre funcționalitățile IA din Twenty.
</Accordion>
<Accordion title="Vor avea agenții IA acces la toate datele mele?">
Agenții IA vor funcționa conform sistemului de permisiuni. Puteți atribui agenților IA roluri specifice în **Settings → Roles**, oferindu-vă control total asupra datelor la care pot avea acces și a acțiunilor pe care le pot efectua.
Agenții IA vor funcționa conform sistemului de permisiuni. Puteți atribui agenților IA roluri specifice în **Settings → Members → Roles**, oferindu-vă control total asupra datelor la care pot avea acces și a acțiunilor pe care le pot efectua.
</Accordion>
<Accordion title="Cum vor funcționa creditele IA?">
@@ -48,7 +48,7 @@ Extinde-ți fluxurile de lucru cu acțiuni bazate pe IA și agenți autonomi.
Agenții IA vor fi gestionați prin sistemul de permisiuni existent:
1. Accesați **Setări → Roluri**
1. Accesați **Setări → Membri → Roluri**
2. Configurează la ce date poate avea acces fiecare agent IA
3. Stabilește permisiuni de citire/scriere pentru fiecare obiect
@@ -214,7 +214,7 @@ După importul datelor, finalizați configurarea spațiului de lucru:
### Configurați roluri și permisiuni
* Configurați rolurile în **Setări → Roluri**
* Configurați rolurile în **Setări → Membri → Roluri**
* Atribuiți utilizatorilor rolurile corespunzătoare
### Conectați e-mailul și calendarul
@@ -127,7 +127,7 @@ După importarea datelor, recreați manual:
### Roluri și permisiuni
* Configurați rolurile în **Setări → Roluri**
* Configurați rolurile în **Setări → Membri → Roluri**
* Atribuiți utilizatorilor rolurile corespunzătoare
### Integrări
@@ -13,7 +13,7 @@ Sistemul de permisiuni al Twenty vă permite să controlați accesul la trei dom
Pentru a crea un rol nou:
1. Accesați **Setări → Roluri**
1. Accesați **Setări → Membri → Roluri**
2. Sub **Toate Rolurile**, faceți clic pe **+ Creează Rol**
3. Introduceți un nume de rol
4. În fila implicită **Permisiuni**, [configurați permisiunile](#customize-permissions)
@@ -23,7 +23,7 @@ Pentru a crea un rol nou:
Pentru a șterge un rol:
1. Accesați **Setări → Roluri**
1. Accesați **Setări → Membri → Roluri**
2. Faceți clic pe rolul pe care doriți să-l eliminați
3. Deschideți tab-ul **Setări**, apoi faceți clic pe **Șterge Rol**
4. Faceți clic pe **Confirmă** în fereastra modală
@@ -36,13 +36,13 @@ Dacă un rol este șters, orice membru al workspace-ului alocat acestuia va fi r
### Vizualizați Atribuirile Curente
* Accesați **Setări → Roluri**
* Accesați **Setări → Membri → Roluri**
* Vedeți toate rolurile și câți membri sunt alocați fiecăruia
* Vizualizați ce membri au ce roluri
### Atribuiți un Rol unui Membru
1. Accesați **Setări → Roluri**
1. Accesați **Setări → Membri → Roluri**
2. Faceți clic pe rolul pe care doriți să-l atribuiți
3. Deschideți fila **Atribuire**
4. Faceți clic pe **+ Atribuie membrului**
@@ -51,7 +51,7 @@ Dacă un rol este șters, orice membru al workspace-ului alocat acestuia va fi r
### Setați Rolul Implicit
1. Accesați **Setări → Roluri**
1. Accesați **Setări → Membri → Roluri**
2. În secțiunea **Opțiuni**, găsiți **Rol Implicit**
3. Selectați ce rol ar trebui să primească automat noii membri
4. Noii membri ai workspace-ului vor primi acest rol când se alătură
@@ -168,7 +168,7 @@ Pe lângă membrii workspace-ului, rolurile pot fi atribuite și cheilor API și
### Atribuiți un rol unei chei API
1. Accesați **Setări → Roluri**
1. Accesați **Setări → Membri → Roluri**
2. Faceți clic pe rolul pe care doriți să-l atribuiți
3. Deschideți fila **Atribuire**
4. În **API Keys**, faceți clic pe **+ Assign to API key**
@@ -183,7 +183,7 @@ Cheile API fără un rol atribuit folosesc permisiunile implicite. Pentru o secu
### Atribuiți un rol unui agent AI
1. Accesați **Setări → Roluri**
1. Accesați **Setări → Membri → Roluri**
2. Faceți clic pe rolul pe care doriți să-l atribuiți
3. Deschideți fila **Atribuire**
4. În **AI Agents**, faceți clic pe **+ Assign to AI agent**
@@ -19,7 +19,7 @@ Orice membru al spațiului de lucru atribuit acelui rol va fi reatribuit automat
</Accordion>
<Accordion title="Cum setez un rol implicit pentru noii membri?">
Accesați **Settings → Roles**, găsiți opțiunea **Default Role** și selectați ce rol ar trebui să primească automat noii membri când se alătură.
Accesați **Setări → Membri → Roluri**, găsiți opțiunea **Default Role** și selectați ce rol ar trebui să primească automat noii membri când se alătură.
</Accordion>
<Accordion title="Pot să atribui mai multe roluri unui singur utilizator?">
@@ -64,7 +64,7 @@ Permisiunile la nivel de rând vor fi disponibile în planul **Organization** p
</Accordion>
<Accordion title="Cum fac un câmp doar pentru citire pentru anumiți utilizatori?">
1. Accesați **Setări → Roluri**
1. Accesați **Setări → Membri → Roluri**
2. Selectați rolul
3. Navigați la obiectul care conține câmpul
4. Setați permisiunea câmpului la **See Field** (fără Edit Field)
@@ -3,10 +3,12 @@ title: Setări domeniu
description: Configurați domeniul spațiului de lucru, domeniile de acces aprobate și domeniile publice.
---
Configurați setările de domeniu în **Setări → Domenii**.
Setările de domeniu se află în trei locuri, în funcție de ceea ce configurați.
## Domeniu Spațiu de lucru
Configurați în **Setări → General → Domeniu al spațiului de lucru**.
Editați numele subdomeniului sau setați un domeniu personalizat pentru spațiul de lucru.
### Personalizează Domeniul
@@ -19,6 +21,8 @@ Pentru domeniile personalizate, va trebui să configurați setările DNS la furn
## Domenii Aprobate
Configurați în **Setări → Membri → Acces**.
Oricine are o adresă de email pe aceste domenii se poate înscrie automat în acest spațiu de lucru.
### Adaugă Domeniu de Acces Aprobat
@@ -35,13 +39,16 @@ Acest lucru este util pentru a permite întregii echipe să se înregistreze sin
## Domenii Publice
Provisionați un mediu de găzduire complet și sigur pe aceste domenii.
Configurați în **Setări → Aplicații → Dezvoltator**.
Provisionați un mediu de găzduire complet și sigur pe aceste domenii. Un domeniu public poate fi asociat cu o anumită aplicație — când este asociat, numai funcțiile de logică rutată HTTP ale acelei aplicații sunt accesibile pe domeniu. Lăsați asocierea goală pentru a expune toate rutele HTTP ale spațiului de lucru.
### Adaugă Domeniu Public
1. Faceți clic pe **Adăugați domeniu public**
2. Introduceți domeniul pe care doriți să îl utilizați
3. Configurați setările DNS conform instrucțiunilor
4. Verificați domeniul
3. Opțional, asociați-l unei aplicații
4. Configurați setările DNS conform instrucțiunilor
5. Verificați domeniul
Certificatele SSL sunt furnizate automat pentru domeniile publice.
@@ -77,7 +77,7 @@ Gestionați invitațiile care nu au fost acceptate:
Permiteți membrilor echipei să se alăture automat pe baza domeniului lor de e-mail:
1. Accesați **Setări → Domenii**
1. Accesați **Setări → Membri → Acces**
2. Adăugați domeniul companiei dvs. (de ex., `yourcompany.com`)
3. Oricine are acel domeniu de e-mail se poate alătura fără invitație
@@ -137,7 +137,7 @@ Da, puteți conecta mai multe conturi de e-mail. Accesați **Setări → Conturi
<AccordionGroup>
<Accordion title="Pot personaliza domeniul spațiului meu de lucru?">
Da! Accesați **Setări → Domenii** și faceți clic pe **Personalizează domeniul**. Aveți două opțiuni:
Da! Accesați **Setări → General → Domeniul spațiului de lucru** și faceți clic pe **Personalizează domeniul**. Aveți două opțiuni:
* **Subdomeniu**: Folosiți un subdomeniu Twenty, de exemplu `yourcompany.twenty.com`
* **Domeniu personalizat**: Folosiți propriul domeniu, de exemplu `crm.yourcompany.com` (necesită configurarea DNS)
@@ -146,7 +146,7 @@ Un subdomeniu se configurează rapid, în timp ce un domeniu personalizat oferă
</Accordion>
<Accordion title="Cum funcționează domeniile de acces aprobate?">
Puteți configura domenii de acces aprobate astfel încât membrii echipei cu adrese de e-mail ale companiei să se poată alătura automat spațiului dvs. de lucru. Accesați **Setări → Domenii** și adăugați domeniul companiei (de ex., `yourcompany.com`).
Puteți configura domenii de acces aprobate astfel încât membrii echipei cu adrese de e-mail ale companiei să se poată alătura automat spațiului dvs. de lucru. Accesați **Setări → Membri → Acces** și adăugați domeniul companiei (de ex., `yourcompany.com`).
</Accordion>
</AccordionGroup>
@@ -44,7 +44,7 @@ Adăugați membri ai echipei în spațiul de lucru:
4. Atribuiți rolurile corespunzătoare
<Note>
Înainte de a vă invita echipa, verificați rolul implicit în **Setări → Roluri**. Noilor membri li se atribuie automat acest rol când se alătură.
Înainte de a vă invita echipa, verificați rolul implicit în **Setări → Membri → Roluri**. Noilor membri li se atribuie automat acest rol când se alătură.
</Note>
## Listă de verificare pentru setările spațiului de lucru
@@ -38,7 +38,7 @@ Aveți nevoie de două câmpuri personalizate pe obiectul Oportunități.
Dacă nu doriți ca utilizatorii să editeze manual aceste câmpuri calculate:
1. Accesați **Setări → Roluri**
1. Accesați **Setări → Membri → Roluri**
2. Selectați rolul pe care doriți să-l configurați
3. Găsiți obiectul Oportunități
4. Setați câmpurile **Probabilitate** și **Sumă estimată** ca numai în citire
@@ -61,7 +61,7 @@ Nu aveți nevoie de câmpuri "Zile în" pentru Închis - câștigat și Închis
Dacă nu doriți ca utilizatorii să editeze manual aceste câmpuri calculate:
1. Accesați **Setări → Roluri**
1. Accesați **Setări → Membri → Roluri**
2. Selectați rolul de configurat
3. Găsiți obiectul Oportunități
4. Setați câmpurile "Ultima intrare" și "Zile în" ca doar pentru citire
@@ -307,5 +307,5 @@ Acțiunile agentului AI consumă credite ale fluxului de lucru în funcție de m
</Note>
<Note>
Agenții AI respectă permisiunile bazate pe roluri. Puteți atribui roluri specifice agenților în **Settings → Roles** pentru a controla la ce date pot avea acces. Consultați [Permisiuni](/l/ro/user-guide/permissions-access/capabilities/permissions) pentru detalii.
Agenții AI respectă permisiunile bazate pe roluri. Puteți atribui roluri specifice agenților în **Settings → Members → Roles** pentru a controla la ce date pot avea acces. Consultați [Permisiuni](/l/ro/user-guide/permissions-access/capabilities/permissions) pentru detalii.
</Note>
@@ -8,7 +8,7 @@ description: Întrebări frecvente despre fluxurile de lucru din Twenty.
<Accordion title="De ce nu pot activa un flux de lucru?">
Este probabil o problemă de permisiuni. Aveți nevoie de acces la fluxuri de lucru pentru a le crea și activa.
**Soluție**: Contactați administratorul spațiului de lucru pentru a vă acorda acces la fluxuri de lucru în **Setări → Roluri**.
**Soluție**: Contactați administratorul spațiului de lucru pentru a vă acorda acces la fluxuri de lucru în **Setări → Membri → Roluri**.
Dacă nu vedeți deloc secțiunea Fluxuri de lucru în bara laterală, acest lucru confirmă că este o problemă de permisiuni.
</Accordion>
@@ -37,7 +37,7 @@ CRUD над записями: Люди, Компании, Сделки, ваши
Authorization: Bearer YOUR_API_KEY
```
Создайте ключ API в **Settings → API & Webhooks → + Create key**. Сразу скопируйте его — он показывается только один раз. Ключам можно задать область действия для конкретной роли в разделе **Settings → Roles → Assignment tab**, чтобы ограничить их доступ.
Создайте ключ API в **Settings → API & Webhooks → + Create key**. Сразу скопируйте его — он показывается только один раз. Ключам можно задать область действия для конкретной роли в разделе **Settings → Members → Roles → Assignment tab**, чтобы ограничить их доступ.
<VimeoEmbed videoId="928786722" title="Создание ключа API" />
@@ -88,7 +88,7 @@ Authorization: Bearer YOUR_API_KEY
Для повышения безопасности назначьте конкретную роль, чтобы ограничить доступ:
1. Перейдите в **Настройки → Роли**
1. Перейдите в **Настройки → Участники → Роли**
2. Нажмите на роль, которую хотите назначить
3. Откройте вкладку **Назначение**
4. В разделе **Ключи API** нажмите **+ Назначить ключу API**
@@ -9,7 +9,7 @@ description: Управляйте тем, к чему агенты ИИ могу
## Назначить роль агенту ИИ
1. Перейдите в **Настройки → Роли**
1. Перейдите в **Настройки → Участники → Роли**
2. Нажмите на роль, которую вы хотите назначить
3. Откройте вкладку **Назначение**
4. В разделе **Агенты ИИ** нажмите **+ Назначить агенту ИИ**
@@ -17,7 +17,7 @@ description: Часто задаваемые вопросы о функциях
</Accordion>
<Accordion title="Будут ли ИИ-агенты иметь доступ ко всем моим данным?">
ИИ-агенты будут работать в рамках системы разрешений. Вы можете назначать ИИ-агентам конкретные роли в **Настройки → Роли**, получая полный контроль над тем, к каким данным у них есть доступ и какие действия они могут выполнять.
ИИ-агенты будут работать в рамках системы разрешений. Вы можете назначать ИИ-агентам конкретные роли в **Настройки → Участники → Роли**, получая полный контроль над тем, к каким данным у них есть доступ и какие действия они могут выполнять.
</Accordion>
<Accordion title="Как будут работать кредиты ИИ?">
@@ -48,7 +48,7 @@ Twenty разрабатывает возможности ИИ, чтобы пом
ИИ-агенты будут управляться через существующую систему разрешений:
1. Перейдите в **Настройки → Роли**
1. Перейдите в **Настройки → Участники → Роли**
2. Настройте, к каким данным каждый ИИ-агент может получать доступ
3. Задайте права на чтение и запись для каждого объекта
@@ -214,7 +214,7 @@ Jane,Doe,jane@widgets.co,https://widgets.co
### Настройте роли и разрешения
* Настройте роли в **Настройки → Роли**
* Настройте роли в **Настройки → Участники → Роли**
* Назначьте пользователей на соответствующие роли
### Подключите электронную почту и календарь
@@ -127,7 +127,7 @@ Acme Corp,https://acme.com,john@yourcompany.com
### Роли и разрешения
* Настройте роли в **Настройки → Роли**
* Настройте роли в **Настройки → Участники → Роли**
* Назначьте пользователям соответствующие роли
### Интеграции
@@ -13,7 +13,7 @@ description: Управляйте доступом к объектам, поля
Чтобы создать новую роль:
1. Перейдите в **Настройки → Роли**
1. Перейдите в **Настройки → Участники → Роли**
2. В разделе **Все роли** нажмите **+ Создать роль**
3. Введите имя роли
4. На вкладке **Разрешения** по умолчанию [настройте разрешения](#customize-permissions)
@@ -23,7 +23,7 @@ description: Управляйте доступом к объектам, поля
Чтобы удалить роль:
1. Перейдите в **Настройки → Роли**
1. Перейдите в **Настройки → Участники → Роли**
2. Нажмите на роль, которую хотите удалить
3. Откройте вкладку **Настройки**, затем нажмите **Удалить роль**
4. Нажмите **Подтвердить** в модальном окне
@@ -36,13 +36,13 @@ description: Управляйте доступом к объектам, поля
### Просмотр текущих назначений
* Перейдите в **Настройки → Роли**
* Перейдите в **Настройки → Участники → Роли**
* Просмотрите все роли и количество назначенных им участников
* Просмотрите, какие роли у каких участников
### Назначить роль участнику
1. Перейдите в **Настройки → Роли**
1. Перейдите в **Настройки → Участники → Роли**
2. Нажмите на роль, которую вы хотите назначить
3. Откройте вкладку **Назначение**
4. Нажмите **+ Назначить участнику**
@@ -51,7 +51,7 @@ description: Управляйте доступом к объектам, поля
### Установить роль по умолчанию
1. Перейдите в **Настройки → Роли**
1. Перейдите в **Настройки → Участники → Роли**
2. В разделе **Опции** найдите **Роль по умолчанию**
3. Выберите, какую роль новые участники должны получать автоматически
4. Новые участники рабочего пространства будут получать эту роль при присоединении
@@ -168,7 +168,7 @@ description: Управляйте доступом к объектам, поля
### Назначить роль ключу API
1. Перейдите в **Настройки → Роли**
1. Перейдите в **Настройки → Участники → Роли**
2. Нажмите на роль, которую вы хотите назначить
3. Откройте вкладку **Назначение**
4. В разделе **Ключи API** нажмите **+ Назначить ключу API**
@@ -183,7 +183,7 @@ description: Управляйте доступом к объектам, поля
### Назначить роль AI-агенту
1. Перейдите в **Настройки → Роли**
1. Перейдите в **Настройки → Участники → Роли**
2. Нажмите на роль, которую вы хотите назначить
3. Откройте вкладку **Назначение**
4. В разделе **AI-агенты** нажмите **+ Назначить AI-агенту**
@@ -19,7 +19,7 @@ description: Часто задаваемые вопросы о ролях и р
</Accordion>
<Accordion title="Как установить роль по умолчанию для новых участников?">
Перейдите в **Настройки → Роли**, найдите параметр **Роль по умолчанию** и выберите, какую роль новые участники должны автоматически получать при присоединении.
Перейдите в **Настройки → Участники → Роли**, найдите параметр **Роль по умолчанию** и выберите, какую роль новые участники должны автоматически получать при присоединении.
</Accordion>
<Accordion title="Могу ли я назначить одному пользователю несколько ролей?">
@@ -64,7 +64,7 @@ description: Часто задаваемые вопросы о ролях и р
</Accordion>
<Accordion title="Как сделать поле доступным только для чтения для отдельных пользователей?">
1. Перейдите в **Настройки → Роли**
1. Перейдите в **Настройки → Участники → Роли**
2. Выберите роль
3. Перейдите к объекту, который содержит это поле
4. Установите для поля разрешение **Просмотр поля** (без **Редактирование поля**)
@@ -3,10 +3,12 @@ title: Настройки доменов
description: Настройте домен рабочего пространства, утверждённые домены доступа и публичные домены.
---
Настройте параметры доменов в **Настройки → Домены**.
Настройки доменов находятся в трёх местах, в зависимости от того, что вы настраиваете.
## Домен рабочей области
Настройте в **Настройки → Общие → Домен рабочего пространства**.
Измените имя своего субдомена или установите собственный домен для вашего рабочего пространства.
### Настроить домен
@@ -19,6 +21,8 @@ description: Настройте домен рабочего пространст
## Утвержденные домены
Настройте в **Настройки → Участники → Доступ**.
Любой пользователь с адресом электронной почты в этих доменах может автоматически зарегистрироваться в этом рабочем пространстве.
### Добавить утвержденный домен доступа
@@ -35,13 +39,16 @@ description: Настройте домен рабочего пространст
## Публичные домены
Подготовьте полную и безопасную хостинг-среду на этих доменах.
Настройте в **Настройки → Приложения → Разработчик**.
Подготовьте полную и безопасную хостинг-среду на этих доменах. Публичный домен можно привязать к определённому приложению — при такой привязке только функции логики с HTTP-маршрутизацией этого приложения будут доступны на домене. Оставьте привязку пустой, чтобы открыть доступ ко всем HTTP-маршрутам рабочего пространства.
### Добавить публичный домен
1. Нажмите **Добавить публичный домен**
2. Введите домен, который вы хотите использовать
3. Настройте параметры DNS согласно инструкциям
4. Подтвердите домен
3. При желании привяжите его к приложению
4. Настройте параметры DNS согласно инструкциям
5. Подтвердите домен
SSL-сертификаты автоматически выпускаются для публичных доменов.
@@ -77,7 +77,7 @@ description: Пригласите членов команды и управля
Разрешите участникам команды присоединяться автоматически на основе домена их электронной почты:
1. Перейдите в **Настройки → Домены**
1. Перейдите в **Настройки → Участники → Доступ**
2. Добавьте домен вашей компании (например, `yourcompany.com`)
3. Любой с таким доменом электронной почты сможет присоединиться без приглашения
@@ -137,7 +137,7 @@ description: Часто задаваемые вопросы о настройк
<AccordionGroup>
<Accordion title="Могу ли я настроить домен моего рабочего пространства?">
Да! Перейдите в **Настройки → Домены** и нажмите **Настроить домен**. У вас есть два варианта:
Да! Перейдите в **Настройки → Общие → Домен рабочего пространства** и нажмите **Настроить домен**. У вас есть два варианта:
* **Поддомен**: используйте поддомен Twenty, например `yourcompany.twenty.com`
* **Пользовательский домен**: используйте собственный домен, например `crm.yourcompany.com` (требуется настройка DNS)
@@ -146,7 +146,7 @@ description: Часто задаваемые вопросы о настройк
</Accordion>
<Accordion title="Как работают утвержденные домены доступа?">
Вы можете настроить утвержденные домены доступа, чтобы участники команды с корпоративными адресами электронной почты могли автоматически присоединяться к вашему рабочему пространству. Перейдите в **Настройки → Домены** и добавьте домен вашей компании (например, `yourcompany.com`).
Вы можете настроить утвержденные домены доступа, чтобы участники команды с корпоративными адресами электронной почты могли автоматически присоединяться к вашему рабочему пространству. Перейдите в **Настройки → Участники → Доступ** и добавьте домен вашей компании (например, `yourcompany.com`).
</Accordion>
</AccordionGroup>
@@ -44,7 +44,7 @@ description: Настройте рабочее пространство Twenty
4. Назначьте соответствующие роли
<Note>
Прежде чем приглашать команду, проверьте роль по умолчанию в разделе **Настройки → Роли**. Новые участники автоматически получают эту роль при присоединении.
Прежде чем приглашать команду, проверьте роль по умолчанию в разделе **Настройки → Участники → Роли**. Новые участники автоматически получают эту роль при присоединении.
</Note>
## Контрольный список настроек рабочего пространства
@@ -38,7 +38,7 @@ description: Рассчитывайте и отображайте взвешен
Если вы не хотите, чтобы пользователи вручную редактировали эти вычисляемые поля:
1. Перейдите в **Настройки → Роли**
1. Перейдите в **Настройки → Участники → Роли**
2. Выберите роль для настройки
3. Найдите объект «Сделки»
4. Установите поля **Вероятность** и **Ожидаемая сумма** как доступные только для чтения
@@ -61,7 +61,7 @@ description: Отслеживайте скорость сделок, фикси
Если вы не хотите, чтобы пользователи вручную редактировали эти вычисляемые поля:
1. Перейдите в **Настройки → Роли**
1. Перейдите в **Настройки → Участники → Роли**
2. Выберите роль для настройки
3. Найдите объект «Сделки»
4. Сделайте поля «Последний вход» и «Дней на этапе» доступными только для чтения
@@ -307,5 +307,5 @@ import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
</Note>
<Note>
ИИ-агенты соблюдают права доступа на основе ролей. Вы можете назначать агентам конкретные роли в **Настройки → Роли**, чтобы контролировать, к каким данным у них есть доступ. См. [Разрешения](/l/ru/user-guide/permissions-access/capabilities/permissions) для подробностей.
ИИ-агенты соблюдают права доступа на основе ролей. Вы можете назначать агентам конкретные роли в разделе **Настройки → Участники → Роли**, чтобы контролировать, к каким данным у них есть доступ. См. [Разрешения](/l/ru/user-guide/permissions-access/capabilities/permissions) для подробностей.
</Note>
@@ -8,7 +8,7 @@ description: Часто задаваемые вопросы о рабочих п
<Accordion title="Почему я не могу активировать рабочий процесс?">
Скорее всего, это проблема с правами доступа. Вам нужен доступ к рабочим процессам, чтобы создавать и активировать их.
**Решение**: Свяжитесь с администратором рабочего пространства, чтобы он предоставил вам доступ к рабочим процессам в **Настройки → Роли**.
**Решение**: Свяжитесь с администратором рабочего пространства, чтобы он предоставил вам доступ к рабочим процессам в разделе **Настройки → Участники → Роли**.
Если вы совсем не видите раздел "Рабочие процессы" в боковой панели, это подтверждает, что проблема в правах доступа.
</Accordion>
@@ -37,7 +37,7 @@ Her ikisi de REST ve GraphQL olarak mevcuttur. GraphQL, toplu upsert işlemleri
Authorization: Bearer YOUR_API_KEY
```
**Settings → API & Webhooks → + Create key** bölümünde bir API anahtarı oluşturun. Hemen kopyalayın — yalnızca bir kez gösterilir. Anahtarlar, erişebilecekleri alanları sınırlamak için **Settings → Roles → Assignment** sekmesi altında belirli bir role bağlanabilir.
**Settings → API & Webhooks → + Create key** bölümünde bir API anahtarı oluşturun. Hemen kopyalayın — yalnızca bir kez gösterilir. Anahtarlar, erişebilecekleri alanları sınırlamak için **Settings → Members → Roles → Assignment** sekmesi altında belirli bir role bağlanabilir.
<VimeoEmbed videoId="928786722" title="API anahtarı oluşturma" />
@@ -88,7 +88,7 @@ API anahtarınız hassas verilere erişim sağlar. Güvenilmeyen hizmetlerle pay
Daha iyi güvenlik için, erişimi sınırlamak amacıyla belirli bir rol atayın:
1. **Ayarlar → Roller** bölümüne gidin
1. **Ayarlar → Üyeler → Roller** bölümüne gidin
2. Atamak istediğiniz role tıklayın
3. **Atama** sekmesini açın
4. **API Anahtarları** altında, **+ API anahtarına ata**'ya tıklayın
@@ -9,7 +9,7 @@ Yapay zekâ ajanları mevcut izin yapınıza uyar. Bu, özellikle çalışma ala
## Bir Yapay Zekâ Ajanına Rol Atama
1. **Ayarlar → Roller** bölümüne gidin
1. **Ayarlar → Üyeler → Roller** bölümüne gidin
2. Atamak istediğiniz role tıklayın
3. **Atama** sekmesini açın
4. **Yapay Zekâ Ajanları** altında, **+ Yapay zekâ ajanına ata** seçeneğine tıklayın
@@ -17,7 +17,7 @@ description: Twenty'deki yapay zeka özellikleri hakkında sıkça sorulan sorul
</Accordion>
<Accordion title="Yapay zeka ajanlarının tüm verilerime erişimi olacak mı?">
Yapay zeka ajanları izin sistemi kapsamında çalışacaktır. **Ayarlar → Roller** altında yapay zeka ajanlarına belirli roller atayarak hangi verilere erişebilecekleri ve hangi işlemleri gerçekleştirebilecekleri üzerinde tam kontrol sahibi olabilirsiniz.
Yapay zeka ajanları izin sistemi kapsamında çalışacaktır. **Ayarlar → Üyeler → Roller** altında yapay zeka ajanlarına belirli roller atayarak hangi verilere erişebilecekleri ve hangi işlemleri gerçekleştirebilecekleri üzerinde tam kontrol sahibi olabilirsiniz.
</Accordion>
<Accordion title="Yapay zeka kredileri nasıl çalışacak?">
@@ -48,7 +48,7 @@ Bağlamınızı anlayan ve tüm Twenty verilerinize erişimi olan konuşmaya day
Yapay zeka ajanları mevcut izin sistemi aracılığıyla yönetilecektir:
1. **Ayarlar → Roller** bölümüne gidin
1. **Ayarlar → Üyeler → Roller** bölümüne gidin
2. Her bir yapay zeka ajanının hangi verilere erişebileceğini yapılandırın
3. Nesne başına okuma/yazma izinleri belirleyin
@@ -214,7 +214,7 @@ Verileri içe aktardıktan sonra çalışma alanı yapılandırmanızı tamamlay
### Rolleri ve İzinleri Yapılandırın
* Rolleri **Ayarlar → Roller** bölümünde yapılandırın
* Rolleri **Ayarlar → Üyeler → Roller** bölümünde yapılandırın
* Kullanıcıları uygun rollere atayın
### E-posta ve Takvimi Bağlayın
@@ -127,7 +127,7 @@ Verileri içe aktardıktan sonra, aşağıdakileri manuel olarak yeniden oluştu
### Roller ve İzinler
* Rolleri **Ayarlar → Roller** bölümünde yapılandırın
* Rolleri **Ayarlar → Üyeler → Roller** bölümünde yapılandırın
* Kullanıcıları uygun rollere atayın
### Entegrasyonlar
@@ -13,7 +13,7 @@ Twenty'nin izin sistemi, üç ana alana erişimi kontrol etmenizi sağlar:
Yeni bir rol oluşturmak için:
1. **Ayarlar → Roller** bölümüne gidin
1. **Ayarlar → Üyeler → Roller** bölümüne gidin
2. **Tüm Roller** altında, **+ Rol Oluştur** seçeneğine tıklayın
3. Bir rol adı girin
4. Varsayılan **İzinler** sekmesinde, [izinleri yapılandırın](#customize-permissions)
@@ -23,7 +23,7 @@ Yeni bir rol oluşturmak için:
Bir rolü silmek için:
1. **Ayarlar → Roller** bölümüne gidin
1. **Ayarlar → Üyeler → Roller** bölümüne gidin
2. Kaldırmak istediğiniz role tıklayın
3. **Ayarlar** sekmesini açın, ardından **Rolü Sil** seçeneğine tıklayın
4. Modalde **Onayla**'ya tıklayın
@@ -36,13 +36,13 @@ Bir rol silinirse, ona atanmış olan herhangi bir çalışma alanı üyesi otom
### Mevcut Atamaları Görüntüle
* **Ayarlar → Roller** bölümüne gidin
* **Ayarlar → Üyeler → Roller** bölümüne gidin
* Tüm rolleri ve her birine kaç üye atandığını görün
* Hangi üyelerin hangi rollere sahip olduğunu görün
### Bir Üyeye Rol Atama
1. **Ayarlar → Roller** bölümüne gidin
1. **Ayarlar → Üyeler → Roller** bölümüne gidin
2. Atamak istediğiniz role tıklayın
3. **Atama** sekmesini açın
4. **+ Üyeye Atama**'ya tıklayın
@@ -51,7 +51,7 @@ Bir rol silinirse, ona atanmış olan herhangi bir çalışma alanı üyesi otom
### Varsayılan Rol Ayarlama
1. **Ayarlar → Roller** bölümüne gidin
1. **Ayarlar → Üyeler → Roller** bölümüne gidin
2. **Seçenekler** bölümünde, **Varsayılan Rol**'ü bulun
3. Yeni üyelerin otomatik olarak alacağı rolü seçin
4. Yeni çalışma alanı üyeleri katıldığında bu role atanacaklardır
@@ -168,7 +168,7 @@ Genel çalışma alanı aksiyonlarına erişimi kontrol edin:
### Bir API Anahtarına Rol Atama
1. **Ayarlar → Roller** bölümüne gidin
1. **Ayarlar → Üyeler → Roller** bölümüne gidin
2. Atamak istediğiniz role tıklayın
3. **Atama** sekmesini açın
4. **API Anahtarları** altında, **+ API anahtarına ata**'ya tıklayın
@@ -183,7 +183,7 @@ Atanmış rolü olmayan API anahtarları varsayılan izinleri kullanır. Daha s
### Bir Yapay Zeka Ajanına Rol Atama
1. **Ayarlar → Roller** bölümüne gidin
1. **Ayarlar → Üyeler → Roller** bölümüne gidin
2. Atamak istediğiniz role tıklayın
3. **Atama** sekmesini açın
4. **Yapay Zeka Ajanları** altında, **+ Yapay zeka ajanına ata**'ya tıklayın
@@ -19,7 +19,7 @@ Any workspace member assigned to that role will be automatically reassigned to t
</Accordion>
<Accordion title="How do I set a default role for new members?">
Go to **Settings → Roles**, find the **Default Role** option, and select which role new members should automatically receive when they join.
**Ayarlar → Üyeler → Roller** bölümüne gidin, **Varsayılan Rol** seçeneğini bulun ve yeni üyeler katıldıklarında otomatik olarak hangi rolü alacaklarını seçin.
</Accordion>
<Accordion title="Can I assign multiple roles to one user?">
@@ -64,7 +64,7 @@ Row-level permissions will be available on the **Organization** plan by Q1 2026.
</Accordion>
<Accordion title="How do I make a field read-only for certain users?">
1. **Ayarlar → Roller** bölümüne gidin
1. **Ayarlar → Üyeler → Roller** bölümüne gidin
2. Select the role
3. Navigate to the object containing the field
4. Set the field permission to **See Field** (without Edit Field)
@@ -3,10 +3,12 @@ title: Alan Adı Ayarları
description: Çalışma alanı alan adını, onaylanmış erişim alan adlarını ve herkese açık alan adlarını yapılandırın.
---
Alan adı ayarlarını **Ayarlar → Alan Adları** bölümünde yapılandırın.
Alan adı ayarları, neyi yapılandırdığınıza bağlı olarak üç yerde bulunur.
## İş Alanı Alan Adı
**Ayarlar → Genel → Çalışma Alanı Alan Adı** altında yapılandırın.
Alt alan adınızı düzenleyin veya çalışma alanınız için özel bir alan adı ayarlayın.
### Alan adını özelleştir
@@ -19,6 +21,8 @@ Alt alan adınızı düzenleyin veya çalışma alanınız için özel bir alan
## Onaylanmış Alan Adları
**Ayarlar → Üyeler → Erişim** altında yapılandırın.
Bu alan adlarındaki bir e-posta adresine sahip olan herkes bu çalışma alanına otomatik olarak kaydolabilir.
### Onaylanmış Erişim Alanı Ekle
@@ -35,13 +39,16 @@ Bu, çalışma alanını kuruluşunuzla sınırlı tutarken tüm ekibinizin kend
## Herkese Açık Alan Adları
Bu alan adları üzerinde eksiksiz ve güvenli bir barındırma ortamı sağlayın.
**Ayarlar → Uygulamalar → Geliştirici** altında yapılandırın.
Bu alan adları üzerinde eksiksiz ve güvenli bir barındırma ortamı sağlayın. Genel bir alan adı belirli bir uygulamaya bağlanabilir — bağlandığında, yalnızca o uygulamanın HTTP üzerinden yönlendirilen mantık işlevlerine bu alan adı üzerinden erişilebilir. Çalışma alanındaki tüm HTTP rotalarını dışa açmak için ilişkilendirmeyi boş bırakın.
### Kamusal Alan Ekle
1. **Herkese Açık Alan Adı Ekle**'ye tıklayın
2. Kullanmak istediğiniz alan adını girin
3. DNS ayarlarını talimatlara uygun şekilde yapılandırın
4. Alan adını doğrulayın
3. İsteğe bağlı olarak bir uygulamaya bağlayın
4. DNS ayarlarını talimatlara uygun şekilde yapılandırın
5. Alan adını doğrulayın
Herkese açık alan adları için SSL sertifikaları otomatik olarak sağlanır.
@@ -77,7 +77,7 @@ Kabul edilmemiş davetleri yönetin:
Ekip üyelerinin e-posta alan adına göre otomatik olarak katılmasına izin verin:
1. **Ayarlar → Alan Adları** kısmına gidin
1. **Ayarlar → Üyeler → Erişim** bölümüne gidin
2. Şirketinizin alan adını ekleyin (örneğin, `yourcompany.com`)
3. Bu e-posta alan adına sahip olan herkes davet olmadan katılabilir
@@ -137,7 +137,7 @@ Evet, birden fazla e-posta hesabını bağlayabilirsiniz. **Ayarlar → Hesaplar
<AccordionGroup>
<Accordion title="Çalışma alanı alan adımı özelleştirebilir miyim?">
Evet! **Ayarlar → Alanlar**'a gidin ve **Alan Adını Özelleştir**'e tıklayın. İki seçeneğiniz var:
Evet! **Ayarlar → Genel → Çalışma Alanı Alan Adı**'na gidin ve **Alan Adını Özelleştir**'e tıklayın. İki seçeneğiniz var:
* **Alt alan adı**: `yourcompany.twenty.com` gibi bir Twenty alt alan adı kullanın
* **Özel alan adı**: `crm.yourcompany.com` gibi kendi alan adınızı kullanın (DNS yapılandırması gerektirir)
@@ -146,7 +146,7 @@ Alt alan adı kurmak hızlıdır; özel alan adı ise ekibiniz için tam markal
</Accordion>
<Accordion title="Onaylı erişim alan adları nasıl çalışır?">
Şirket e-posta adreslerine sahip ekip üyelerinin çalışma alanınıza otomatik olarak katılabilmeleri için onaylı erişim alan adlarını yapılandırabilirsiniz. **Ayarlar → Alanlar**'a gidin ve şirket alan adınızı ekleyin (ör. `yourcompany.com`).
Şirket e-posta adreslerine sahip ekip üyelerinin çalışma alanınıza otomatik olarak katılabilmeleri için onaylı erişim alan adlarını yapılandırabilirsiniz. **Ayarlar → Üyeler → Erişim**'e gidin ve şirket alan adınızı ekleyin (ör. `yourcompany.com`).
</Accordion>
</AccordionGroup>
@@ -44,7 +44,7 @@ E-posta ve takvim senkronizasyonunu ayarlayın:
4. Uygun rolleri atayın
<Note>
Ekibinizi davet etmeden önce, **Ayarlar → Roller** altında varsayılan rolü kontrol edin. Yeni üyeler katıldıklarında otomatik olarak bu role atanır.
Ekibinizi davet etmeden önce, **Ayarlar → Üyeler → Roller** altında varsayılan rolü kontrol edin. Yeni üyeler katıldıklarında otomatik olarak bu role atanır.
</Note>
## Çalışma Alanı Ayarları Kontrol Listesi
@@ -38,7 +38,7 @@ Fırsatlar nesnesinde iki özel alana ihtiyacınız var.
Kullanıcıların bu hesaplanan alanları manuel olarak düzenlemesini istemiyorsanız:
1. **Ayarlar → Roller** bölümüne gidin
1. **Ayarlar → Üyeler → Roller** bölümüne gidin
2. Yapılandırılacak rolü seçin
3. Fırsatlar nesnesini bulun
4. **Olasılık** ve **Beklenen Tutar** alanlarını salt okunur yapın
@@ -61,7 +61,7 @@ Closed Won ve Closed Lost için "Days in" alanlarına ihtiyaç yoktur; çünkü
Bu hesaplanan alanların kullanıcılar tarafından manuel olarak düzenlenmesini istemiyorsanız:
1. **Ayarlar → Roller** bölümüne gidin
1. **Ayarlar → Üyeler → Roller** bölümüne gidin
2. Yapılandırılacak rolü seçin
3. Fırsatlar nesnesini bulun
4. "Last Entered" ve "Days in" alanlarını salt okunur yapın
@@ -307,5 +307,5 @@ Yapay Zeka Aracısı eylemleri, kullanılan yapay zeka modeline bağlı olarak i
</Note>
<Note>
Yapay zeka aracıları role dayalı izinlere uyar. **Ayarlar → Roller** altında aracılara hangi verilere erişebileceklerini kontrol etmek için belirli roller atayabilirsiniz. Ayrıntılar için [İzinler](/l/tr/user-guide/permissions-access/capabilities/permissions) bölümüne bakın.
Yapay zeka aracıları role dayalı izinlere uyar. Temsilcilerin hangi verilere erişebileceklerini kontrol etmek için **Ayarlar → Üyeler → Roller** altında temsilcilere belirli roller atayabilirsiniz. Ayrıntılar için [İzinler](/l/tr/user-guide/permissions-access/capabilities/permissions) bölümüne bakın.
</Note>
@@ -8,7 +8,7 @@ description: Twenty'deki iş akışları hakkında sıkça sorulan sorular.
<Accordion title="Bir iş akışını neden etkinleştiremiyorum?">
Bu muhtemelen bir yetki sorunudur. İş akışlarını oluşturmak ve etkinleştirmek için iş akışlarına erişiminiz olmalıdır.
**Çözüm**: **Ayarlar → Roller** altında size iş akışı erişimi vermesi için çalışma alanı yöneticinizle iletişime geçin.
**Çözüm**: **Ayarlar → Üyeler → Roller** altında size iş akışı erişimi vermesi için çalışma alanı yöneticinizle iletişime geçin.
Kenar çubuğunuzda İş Akışları bölümünü hiç görmüyorsanız, bunun bir yetki sorunu olduğunu doğrular.
</Accordion>

Some files were not shown because too many files have changed in this diff Show More