snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 3s

This commit is contained in:
upstream-mirror
2026-09-17 23:28:13 +05:00
commit e7da97194a
32688 changed files with 4208681 additions and 0 deletions

View File

@@ -0,0 +1,121 @@
---
title: Gelen E-postalara Otomatik Yanıt
description: Gelen e-postaları önceliklendirmek için Yapay Zeka (YZ) kullanan ve ileti dizisi içinde yanıtları otomatik olarak gönderen bir iş akışı oluşturun.
---
Gelen e-postalara saatler değil, saniyeler içinde yanıt verin. Bu iş akışı, gereksiz iletileri (bültenler, spam, otomatik yanıtlar) ayıklamak ve gerçek iletiler için kişiselleştirilmiş bir yanıt taslağı oluşturmak üzere bir YZ aracısı kullanır. Ardından yapay zekâ, bunu orijinal konuşmadaki ileti dizisinde bir yanıt olarak gönderir.
## E-posta İleti Dizisi Nasıl Çalışır
Her e-posta, göndericinin posta sunucusu tarafından atanan benzersiz bir parmak izi olan gizli bir `Message-ID` üstbilgisi taşır. Bir e-postayı yanıtladığınızda, posta istemciniz o parmak izine referans veren bir `In-Reply-To` başlığı ayarlar. Gmail, Outlook ve diğer tüm istemciler iletileri bu şekilde ileti dizilerine gruplandırır.
Twenty’de, bu parmak izi Message nesnesinde `headerMessageId` olarak saklanır. İş akışınız bunu alır ve E-posta Gönder eyleminin In-Reply-To alanına aktarır.
## İş akışını oluşturma
### Adım 1: Yeni bir İş Akışı oluşturun
**Ayarlar -> İş Akışları** bölümüne gidin ve **+ Yeni İş Akışı**'na tıklayın.
### Adım 2: Gelen iletilerde tetikleyin
**When a Record is Created** seçeneğini seçin ve **Messages**'ı seçin.
Her e-posta Twenty'ye ulaştığında bu tetiklenir.
<img src="/images/user-guide/workflows/auto-reply/workflow-overview.png" style={{width:'100%'}} />
### Adım 3: Kimin gönderdiğini bulun
Bir **Kayıtları Ara** eylemi ekleyin.
Gönderenin adresi iletinin üzerinde değil — ilgili Message Participant kaydında.
| Alan | Değer |
| ---------- | ------------------------------- |
| **Nesne** | Mesaj Katılımcıları |
| **Filtre** | Message **is** `{{trigger.id}}` |
| **Filtre** | Role **is** From |
| **Sınır** | 1 |
Bu, size gönderenin e-posta adresini `handle` içinde ve adını `displayName` içinde verir.
<img src="/images/user-guide/workflows/auto-reply/find-sender.png" style={{width:'100%'}} />
### Adım 4: Yapay zekâ ile triyaj ve yanıt taslağı oluşturma
Bir **AI Agent** eylemi ekleyin. Bu tek adım iki şey yapar: e-postanın yanıtı hak edip etmediğine karar verir ve eğer ediyorsa bir yanıt yazar.
Şuna benzer bir istem kullanın:
```
You are an email triage assistant for a sales team. Read the following
inbound email and decide if it deserves a reply.
Subject: {{trigger.subject}}
Body: {{trigger.text}}
From: {{Find Sender.first.displayName}} ({{Find Sender.first.handle}})
If this email is spam, a newsletter, an automated notification, or
otherwise does not need a human reply, respond with exactly: SKIP
Otherwise, write a short, professional reply (3-4 sentences max) that:
- Acknowledges their specific message
- Lets them know someone from the team will follow up shortly
- Is warm but not overly casual
Respond with only the reply text, no subject line or greeting prefix.
```
AI Agent, yanıtını sonraki adımların başvurabileceği `response` alanına yazar.
<img src="/images/user-guide/workflows/auto-reply/ai-triage.png" style={{width:'100%'}} />
### Adım 5: Yapay zekâ kararına göre dallandırın
Yapay zekânın yanıtlamaya mı yoksa atlamaya mı karar verdiğini kontrol etmek için bir **If/Else** eylemi ekleyin.
| Alan | Değer |
| ----------- | ----------------------------------------------- |
| **Koşul** | AI Agent `response` **does not contain** `SKIP` |
| **If true** | E-posta Gönder adımına devam edin |
| **Else** | Hiçbir şey yapmayın (iş akışı sona erer) |
Spam, bültenler ve otomatik oluşturulan iletiler atlanır. Diğer her şey bir sonraki adıma geçer.
<img src="/images/user-guide/workflows/auto-reply/should-reply.png" style={{width:'100%'}} />
### Adım 6: İleti dizisine bağlı bir yanıt gönderin
"if true" dalına bir **E-posta Gönder** eylemi ekleyin. **Advanced options**'a tıklayın, ardından **Add In-Reply-To**.
| Alan | Değer |
| --------------- | -------------------------------------- |
| **Kime** | `{{Find Sender.first.handle}}` |
| **Konu** | `Re: {{trigger.subject}}` |
| **Gövde** | `{{AI Triage & Draft Reply.response}}` |
| **In-Reply-To** | `{{trigger.headerMessageId}}` |
In-Reply-To alanı, bunun yeni bir konuşma yerine bir yanıt olmasını sağlar. Alıcı, Gmail, Outlook veya diğer herhangi bir istemcide bunu özgün e-postanın altında dizili olarak görür.
<img src="/images/user-guide/workflows/auto-reply/send-email.png" style={{width:'100%'}} />
<Tip>
**In-Reply-To**, tetikleyiciden bir `message.headerMessageId` bekler — bu bir alıcı adresi değil, e-postanın benzersiz parmak izidir. Bunu boş bırakırsanız e-posta yine de gönderilir, yalnızca bağımsız bir ileti olarak.
</Tip>
<Warning>
Gmail, iletileri diziler halinde gruplamak için konu satırını kullanır. Gmail’in yanıtı özgün dizinin içinde göstermesi için konu mutlaka `Re:` ile başlamalıdır (iki nokta ve boşluk dahil). Bu olmadan, In-Reply-To başlığı doğru ayarlanmış olsa bile yanıt ayrı bir konuşma olarak görünür.
</Warning>
### Adım 7: Test Edin ve Etkinleştirin
**Test**'e basın, ardından e-posta istemcinizi kontrol edin. Yanıt, özgün iletinin altında dizili olarak görünmelidir.
İçinize sindiğinde etkinleştirin.
## Geliştirmek için fikirler
* **Yalnızca VIP'lere yanıt verin** — gönderenin alan adını veya Twenty’de bir Contact olarak bulunup bulunmadığını kontrol eden bir dal ekleyin
* **Niyete göre yönlendirin** — satış sorgularını destek taleplerinden farklı şekilde ele almak için ayrı AI Agent istemleri kullanın
* **Yanıtlamadan önce zenginleştirin** — daha kişiselleştirilmiş yanıtlar için gönderenin şirketini veya anlaşma geçmişini AI istemine çekmek üzere bir Search Records adımı ekleyin

View File

@@ -0,0 +1,179 @@
---
title: Closed Won Otomasyonları
description: Fırsatlar kazanılarak kapandığında kazanım sonrası faaliyetleri otomatikleştirin.
---
Bir anlaşma kapandığında birden çok şeyin olması gerekir: şirket durumunu güncelleyin, ekip üyelerini bilgilendirin, müşteri işe alıştırma görevleri oluşturun. Bunların tümünü tek bir iş akışıyla otomatikleştirin.
## Sorun
Bir fırsat "Closed Won" aşamasına geçtiğinde:
* Şirket türünün "Prospect"'ten "Customer"'a değişmesi gerekir
* Onboarding görevleri oluşturulmalıdır
* Müşteri başarı ekibinin bilgilendirilmesi gerekir
* Satış temsilcisinin onay alması gerekir
Bunu elle yapmak zaman alıcıdır ve hataya açıktır.
## Çözüm
Kazanım sonrası tüm faaliyetleri otomatik olarak yöneten bir iş akışı oluşturun.
## Tam İş Akışı Kurulumu
### Adım 1: İş akışını oluşturun
1. **Ayarlar → İş Akışları** bölümüne gidin
2. **+ Yeni İş Akışı**'na tıklayın
3. Adını "Deal Won - Post-Win Automation" olarak verin
### Adım 2: Tetikleyiciyi yapılandırın
1. **Kayıt Güncellendi**'yi seçin
2. **Fırsatlar**'ı seçin
3. "Fields to monitor" altında, **Stage**'i seçin
### Adım 3: Aşama Filtresi ekleyin
1. **Filtre** eylemi ekleyin
2. Koşul: `{{trigger.object.stage}}` "Closed Won" değerine eşittir
### Adım 4: Şirket Türünü Güncelleyin
1. **Kayıt Güncelle** eylemini ekleyin
2. Alanı Yapılandır:
| Alan | Değer |
| ---------------------- | ------------------------------- |
| **Nesne** | Şirketler |
| **Kayıt** | `{{trigger.object.company.id}}` |
| **Tür** | Müşteri |
| **İlk Anlaşma Tarihi** | `{{trigger.object.closedAt}}` |
| **Hesap Sahibi** | `{{trigger.object.owner.id}}` |
### Adım 5: Onboarding Görevi Oluşturun
1. **Kayıt Oluştur** eylemini ekleyin
2. Alanı Yapılandır:
| Alan | Değer |
| ----------------- | ------------------------------------------------------------------------------------------------------------- |
| **Nesne** | Görevler |
| **Başlık** | `Onboarding: {{trigger.object.name}}` |
| **Atanan kişi** | Müşteri başarı ekibi üyesi |
| **Bitiş Tarihi** | Şu andan itibaren 3 gün |
| **Öncelik** | Yüksek |
| **İlgili Şirket** | `{{trigger.object.company.id}}` |
| **İlgili Fırsat** | `{{trigger.object.id}}` |
| **Açıklama** | `{{trigger.object.company.name}} için yeni müşteri uyumlandırması. Anlaşma değeri: {{trigger.object.amount}}` |
### Adım 6: Müşteri Başarı Ekibini Bilgilendirin
1. **E-posta Gönder** eylemini ekleyin
2. Alanı Yapılandır:
| Alan | Değer |
| --------- | -------------------------------------------------- |
| **Kime** | customer-success@yourcompany.com |
| **Konu** | `🎉 Yeni Müşteri: {{trigger.object.company.name}}` |
| **Gövde** | Aşağıdaki örneğe bakın |
**E-posta gövdesi örneği**:
```
Hi CS Team,
We have a new customer!
Company: {{trigger.object.company.name}}
Deal: {{trigger.object.name}}
Value: {{trigger.object.amount}}
Sales Rep: {{trigger.object.owner.name}}
Close Date: {{trigger.object.closedAt}}
An onboarding task has been created automatically.
Let's give them a great start!
```
### Adım 7: Satış temsilcisine onay gönderin
1. Bir tane daha **E-posta Gönder** eylemi ekleyin
2. Alanı Yapılandır:
| Alan | Değer |
| --------- | --------------------------------------------------------------------------------------------------- |
| **Kime** | `{{trigger.object.owner.email}}` |
| **Konu** | `✅ Anlaşma Kapandı: {{trigger.object.name}}` |
| **Gövde** | Tebrikler! Anlaşmanız işleme alındı. Müşteri başarı ekibi bilgilendirildi ve onboarding başlatıldı. |
### Adım 8: Test Edin ve Etkinleştirin
1. Bir test fırsatını "Closed Won" aşamasına taşıyarak test edin
2. Doğrula:
* Şirket türü "Customer" olarak değiştirildi
* Onboarding görevi oluşturuldu
* CS ekibi e-postayı aldı
* Satış temsilcisi onayı aldı
3. Hazır olduğunuzda etkinleştirin
## Closed Lost'u Yönetme
Kaybedilen anlaşmalar için benzer bir iş akışı oluşturun:
### Tetikleyici
* Kayıt Güncellendi (Fırsatlar, Aşama = "Closed Lost")
### Eylemler
1. **Kayıt Oluştur**: "Lost Deal Analysis" için görev
2. **Kayıt Güncelle**: Şirket kaydına kaybetme nedenini ekleyin
3. **E-posta Gönder**: Kaybedilen anlaşmayı yöneticiye bildirin
## Gelişmiş: Çok Aşamalı Onboarding
Karmaşık onboarding için birden fazla görev oluşturun:
```javascript
export const main = async (params) => {
const tasks = [
{ title: "Welcome call", daysFromNow: 1, assignee: "CS" },
{ title: "Send onboarding materials", daysFromNow: 2, assignee: "CS" },
{ title: "Technical setup", daysFromNow: 5, assignee: "Support" },
{ title: "30-day check-in", daysFromNow: 30, assignee: "CS" }
];
return { tasks };
};
```
Diziden her bir görevi oluşturmak için **Iterator** kullanın.
## Özelleştirme Fikirleri
### Diğer araçlarınızı güncel tutun
* Faturalama sisteminde bir **HTTP Request** ile müşteri oluşturun
### Koşullu Eylemler
**Filtre** eylemlerini şunlar için kullanın:
* Kurumsal ve KOBİ için farklı onboarding
* Bölgeye göre farklı atanan kişiler
* Küçük anlaşmalar için bildirimleri atlayın
### Anlaşma Ayrıntılarını Dahil Edin
Biçimlendirmek için **Kod** eylemini kullanın:
* Anlaşma özet belgeleri
* CS ekibi için devir notları
* Özel onboarding kontrol listeleri
## İlgili
* [İş Akışı Eylemleri](/l/tr/user-guide/workflows/capabilities/workflow-actions)
* [İş Akışlarından E-posta Gönderme](/l/tr/user-guide/workflows/capabilities/send-emails-from-workflows)

View File

@@ -0,0 +1,136 @@
---
title: Durağan Fırsatları Tespit Et
description: Fırsatlar güncellenmediğinde yöneticileri otomatik olarak bilgilendirin.
---
Fırsatlar durağanlaştığında yöneticileri uyararak satış boru hattınızı sağlıklı tutun. Bu iş akışı, belirli sayıda gündür güncellenmeyen fırsatları kontrol eder.
## Sorun
Güncellenmeden bekleyen fırsatlar şunlara yol açar:
* Anlaşmaların soğuması
* Güvenilmez tahminler
* Kaybedilen gelir
## Çözüm
Durağan fırsatları bulan ve yöneticilerine e-posta gönderen zamanlanmış bir iş akışı oluşturun.
## Adım adım kurulum
### Adım 1: İş akışını oluşturun
1. **Ayarlar → İş Akışları** bölümüne gidin
2. **+ Yeni İş Akışı**'na tıklayın
3. Adını "Durağan Fırsat Uyarısı" koyun
### Adım 2: Tetikleyiciyi yapılandırın
1. **Zamanlanmış Olarak** seçin
2. Günlük çalışacak şekilde ayarlayın (ör. her gün saat 08:00'de)
### Adım 3: Durağan Fırsatları Ara
1. **Kayıt Ara** eylemini ekleyin
2. Alanı Yapılandır:
| Alan | Değer |
| ---------- | ------------------------------------------------ |
| **Nesne** | Fırsatlar |
| **Filtre** | Updated At, (bugün - 7 gün) tarihinden önce |
| **Filtre** | Stage, "Closed Won" DEĞİL VE "Closed Lost" DEĞİL |
| **Sınır** | 100 |
### Adım 4: Bulunup Bulunmadığını Kontrol Edin
1. **Filtre** eylemi ekleyin
2. Koşul: `{{searchRecords.length}}` 0'dan büyüktür
3. Durağan fırsat yoksa iş akışı burada durur
### Adım 5: Uyarıyı Biçimlendirin (Kod Eylemi)
E-postayı biçimlendirmek için bir **Kod** eylemi ekleyin:
```javascript
export const main = async (params) => {
const opportunities = params.opportunities;
// Group opportunities by owner
const byOwner = {};
opportunities.forEach(opp => {
const ownerEmail = opp.owner?.email || 'unassigned';
if (!byOwner[ownerEmail]) {
byOwner[ownerEmail] = [];
}
byOwner[ownerEmail].push({
name: opp.name,
amount: opp.amount,
lastUpdated: opp.updatedAt,
stage: opp.stage
});
});
// Format summary for manager
let summary = "Stale Opportunities Report\n\n";
Object.entries(byOwner).forEach(([owner, opps]) => {
summary += `${owner}: ${opps.length} stale opportunities\n`;
opps.forEach(opp => {
summary += ` - ${opp.name} (${opp.stage})\n`;
});
summary += "\n";
});
return {
summary,
totalCount: opportunities.length
};
};
```
### Adım 6: Uyarı E-postası Gönderin
**E-posta Gönder** eylemini ekleyin:
| Alan | Değer |
| ---------- | ----------------------------------------------------------- |
| **Kime** | sales-manager@yourcompany.com |
| **Konu** | `🚨 {{code.totalCount}} Stale Opportunities Need Attention` |
| **İçerik** | `{{code.summary}}` |
### Adım 7: Test Edin ve Etkinleştirin
1. İş akışını çalıştırmak için **Test**'e tıklayın
2. E-postanın doğru verileri içerdiğini kontrol edin
3. Hazır olduğunuzda etkinleştirin
## Özelleştirme Seçenekleri
### Durağanlık Eşiğini Değiştirin
7 günü tercih ettiğiniz süreyle değiştirmek için Kayıt Ara filtresini düzenleyin:
* Hızlı tempolu satışlar için 3 gün
* Kurumsal anlaşmalar için 14 gün
* Uzun satış döngüleri için 30 gün
### Bireysel Temsilcileri Uyarın
Tek bir yönetici e-postası yerine, her temsilciye kendi durağan anlaşmaları hakkında kişiselleştirilmiş e-postalar göndermek için **Iterator** kullanın.
### Eskalasyon Ekle
Artan ciddiyette birden fazla iş akışı oluşturun:
1. Gün 7: Temsilciye e-posta
2. Gün 14: Temsilciye + yöneticiye e-posta
3. Gün 21: Müdahale etmesi için yöneticiye görev oluşturun
### Slack'e Dahil Edin
E-postaya ek olarak veya yerine, bir Slack webhook'una gönderi yapmak için **HTTP Request** kullanın.
## İlgili
* [İş Akışı Eylemleri](/l/tr/user-guide/workflows/capabilities/workflow-actions)
* [İş Akışlarından E-posta Gönderme](/l/tr/user-guide/workflows/capabilities/send-emails-from-workflows)

View File

@@ -0,0 +1,69 @@
---
title: Alınan E-posta Sayısını Görüntüle
description: Her bir kişiden alınan e-posta sayısını otomatik olarak sayıp görüntülemek için bir iş akışı oluşturun.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
<img src="/images/user-guide/workflows/workflow-number-of-emails-received.png" style={{width:'100%'}} />
## Genel Bakış
Bu iş akışı, her yeni e-posta alındığında tetiklenir ve Kişi kaydındaki özel bir alanı, bu gönderenin e-postalarının toplam sayısıyla günceller.
## Ön Gereksinimler
Bu iş akışını kurmadan önce, **Kişiler** nesnesinde özel bir alan oluşturun:
1. **Ayarlar → Veri Modeli → Kişiler** bölümüne gidin
2. Yeni bir **Sayı** alanı ekleyin
3. Adını "Bu kişiden alınan e-posta sayısı" gibi koyun
## Adım Adım Kurulum
<VimeoEmbed videoId="1148700336" title="Video gösterimi" />
### Adım 1: Tetikleyiciyi Yapılandırın
1. **İş Akışları**'na gidin ve yeni bir iş akışı oluşturun
2. Tetikleyici olarak **Kayıt Oluşturuldu**'yu seçin
3. **Mesaj Katılımcıları**'nı seçin (Gelişmiş nesneler altında kullanılabilir)
<Note>
Bir Mesaj Katılımcısı, bir mesaj kimliği ile bir kişi kimliğinin birleşimidir ve mesaj başına tekil bir kayıt oluşturur. Bu, Mesajları doğrudan izlemekten daha kolaydır çünkü gönderenin (veya alıcının) e-posta adresini içeren `handle` alanına erişebiliriz.
</Note>
### Adım 2: Role göre filtreleyin
1. **Filtre** eylemi ekleyin
2. Koşulu ayarlayın: **Rol** **FROM**'a eşittir
Bu, yalnızca bu kişi tarafından gönderilen mesajları saymanızı ve onlara gönderilen mesajları saymamanızı sağlar.
### Adım 3: Aynı handle'a sahip tüm Mesaj Katılımcılarını arayın
1. Bir **Kayıtları Ara** eylemi ekleyin
2. Nesne olarak **Mesaj Katılımcıları**'nı seçin
3. Filtreler ekleyin: **Handle**, tetikleyicideki handle'a (gönderenin e-posta adresi) eşittir ve **Rol** **FROM**'a eşittir
4. **Limit** değerini 1'den **200**'e (maksimum) yükseltin
Bu, toplam sayıyı elde etmek için bu e-posta adresinden gelen tüm mesajları bulur.
<Note>
Kayıtları Ara eylemi en fazla 200 kayıt döndürmekle sınırlıdır. Ancak, yalnızca `totalCount` değerini (tek tek kayıtları değil) kullandığınız için bu adım, bu kişi tarafından gönderilen e-postaların toplam sayısını döndürecektir.
</Note>
### Adım 4: Kayıt Oluştur veya Güncelle eylemiyle Kişi kaydını güncelleyin
1. Bir **Kayıt Oluştur veya Güncelle** eylemi ekleyin
2. Nesne olarak **Kişiler**'i seçin
3. E-postasını Mesaj Katılımcısı'ndaki `handle` ile eşleştirerek kişiyi bulun.
4. Özel "Alınan e-posta sayısı" alanınızı `{{searchRecords.totalCount}}` olarak ayarlayın
Kayıtları Ara eyleminden gelen `totalCount` değeri, bu kişiden alınan e-postaların toplam sayısını ifade eder.
## İlgili
* [İş Akışı Eylemleri](/l/tr/user-guide/workflows/capabilities/workflow-actions)
* [Özel Alanlar Oluşturma](/l/tr/user-guide/data-model/how-tos/customize-your-data-model)
* [Kayıtları Ara Eylemi](/l/tr/user-guide/workflows/capabilities/workflow-actions#search-records)

View File

@@ -0,0 +1,170 @@
---
title: İlişkili Kayıt Verilerini Görüntüle
description: İş akışlarını kullanarak ilişkili kayıtlardaki verileri gösterin (ör. Fırsatlarda Şirket bilgileri).
---
İlişkili kayıtlardaki verileri doğrudan kendi kayıtlarınızda görüntüleyin — örneğin, bir Şirketin çalışan sayısını o Şirketin Fırsatlarında gösterin. İç içe alanlar yerel olarak kullanılabilir olana kadar bu iş akışı geçici çözümü faydalıdır.
## Ortak Kullanım Durumları
| Kaynak | Hedef | Kopyalanacak Alanlar |
| ------ | ------ | -------------------------------------- |
| Şirket | Fırsat | Sektör, Şirket Büyüklüğü, ARR |
| Kişi | Fırsat | E-posta, Telefon, Unvan |
| Fırsat | Şirket | Son Anlaşma Tutarı, Son Kazanma Tarihi |
## Temel Alan Kopyalama
### Örnek: İrtibat Kişisinin E-postasını Fırsata Kopyalama
**Hedef**: Bir fırsatta İletişim Noktası belirlerken, kolay erişim için e-postasını fırsata kopyalayın.
### Ön Gereksinim
İş akışını oluşturmadan önce **Ayarlar → Veri Modeli → Fırsatlar** içinde hedef alanları oluşturun:
* İrtibat E-postası (türü: E-posta)
* İrtibat Telefonu (türü: Telefon)
### Kurulum
1. **Tetikleyici**: Kayıt Güncellenir (Fırsatlar, İletişim Noktası alanı)
2. **Filtre**: İletişim Noktasının boş olmadığını kontrol edin
3. **Kayıtları Ara**: Bağlantılı kişiyi bulun
* Nesne: Kişiler
* Filtre: ID `{{trigger.object.pointOfContact.id}}` değerine eşittir
4. **Kayıt Güncelle**:
* Nesne: Fırsatlar
* Kayıt: `{{trigger.object.id}}`
* İrtibat E-postası: `{{searchRecords[0].email}}`
* İrtibat Telefonu: `{{searchRecords[0].phone}}`
## Birden Fazla Alanı Kopyalama
### Örnek: Şirket Bilgilerini Tüm İlişkili Fırsatlarla Senkronize Edin
**Hedef**: Şirket detayları değiştiğinde tüm ilişkili fırsatları güncelleyin.
### Kurulum
1. **Tetikleyici**: Kayıt Güncellenir (Şirketler)
* Alanlar: Sektör, Şirket Büyüklüğü, Yıllık Gelir
2. **Kayıtları Ara**: Bu şirket için tüm fırsatları bulun
* Nesne: Fırsatlar
* Filtre: Şirket ID'si `{{trigger.object.id}}` değerine eşittir
3. **Yineleyici**: Her fırsat üzerinde döngü kurun
4. **Kayıt Güncelle** (yineleyici içinde):
* Nesne: Fırsatlar
* Kayıt: `{{iterator.currentItem.id}}`
* Şirket Sektörü: `{{trigger.object.industry}}`
* Şirket Büyüklüğü: `{{trigger.object.companySize}}`
* Şirket ARR: `{{trigger.object.annualRevenue}}`
## Kayıt Oluşturma Sırasında Kopyalama
### Örnek: Fırsatı Şirket Verileriyle Önceden Doldurma
**Hedef**: Bir şirkete bağlı bir fırsat oluştururken, temel şirket bilgilerini otomatik olarak kopyalayın.
### Ön Gereksinim
Hedef alanları **Ayarlar → Veri Modeli → Fırsatlar** içinde oluşturun:
* Şirket Sektörü (türü: Metin)
* Şirket Büyüklüğü (türü: Sayı)
### Kurulum
1. **Tetikleyici**: Kayıt Oluşturulur (Fırsatlar)
* Filtre: Şirket boş değil
2. **Kayıtları Ara**: Bağlantılı şirketin detaylarını alın
* Nesne: Şirketler
* Filtre: ID `{{trigger.object.company.id}}` değerine eşittir
3. **Kayıt Güncelle**:
* Nesne: Fırsatlar
* Kayıt: `{{trigger.object.id}}`
* Şirket Sektörü: `{{searchRecords[0].industry}}`
* Şirket Büyüklüğü: `{{searchRecords[0].employees}}`
<Note>
**Görevler ve Notlar sınırlaması**: Görevler ve Notlar üzerindeki ilişkiler çoktan çoğa olarak sabit kodlanmıştır ve henüz iş akışı tetikleyicileri veya eylemlerinde mevcut değildir. Bu ilişkilere erişmek için bunun yerine [API](/l/tr/developers/extend/api) kullanın.
</Note>
## Çift Yönlü Senkronizasyon
### Örnek: Birincil İrtibatı Senkron Tutun
**Hedef**: Bir şirketin birincil irtibatı değiştiğinde, ilgili kişiyi güncelleyin. Bir kişi birincil olduğunda, şirketi güncelleyin.
### İş Akışı 1: Şirket → Kişi
1. **Tetikleyici**: Kayıt Güncellenir (Şirketler, Birincil İrtibat alanı)
2. **Kayıt Güncelle**: Kişinin "Birincil İrtibat mı" alanını true yapın
3. **Kayıtları Ara**: Önceki birincil irtibatı bulun
4. **Kayıt Güncelle**: Önceki irtibatın "Birincil İrtibat mı" alanını false yapın
### İş Akışı 2: Kişi → Şirket
1. **Tetikleyici**: Kayıt Güncellenir (Kişiler, Birincil İrtibat mı = true)
2. **Kayıt Güncelle**: Şirketin Birincil İrtibatını bu kişi olarak ayarlayın
<Note>
Sonsuz döngülerden kaçınmak için çift yönlü senkronizasyonlarda dikkatli olun. Güncellemeden önce değerin gerçekten değişip değişmediğini kontrol etmek için filtreler kullanın.
</Note>
## Karmaşık Eşleştirme için Kod Kullanma
### Örnek: Kopyalama Sırasında Verileri Dönüştürme
**Hedef**: Kişiden fırsata telefon numarasını kopyalayın ve biçimlendirin.
```javascript
export const main = async (params) => {
const { phone } = params;
if (!phone) return { formattedPhone: null };
// Remove non-numeric characters
const digits = phone.replace(/\D/g, '');
// Format as (XXX) XXX-XXXX
const formatted = digits.length === 10
? `(${digits.slice(0,3)}) ${digits.slice(3,6)}-${digits.slice(6)}`
: phone;
return { formattedPhone: formatted };
};
```
## En İyi Uygulamalar
### Döngülerden Kaçının
* Birbirini sonsuza dek tetikleyen iş akışları oluşturmayın
* Belirli alan koşulları kullanın
* Değerin gerçekten değişip değişmediğini görmek için kontroller ekleyin
### Eksik Verileri Ele Alma
* Kopyalamadan önce kaynak kaydın var olup olmadığını daima kontrol edin
* İsteğe bağlı alanlar için varsayılan değerler sağlayın
* Kaynak alan boş olduğunda atlamak için filtreler kullanın
### Performans
* Birçok kayda kopyalama yaparken toplu güncellemeler kullanın
* Toplu senkronizasyon işlemleri için zamanlanmış iş akışları kullanın
* Birden fazla kayıt güncellemesi için Yineleyici kullanmayı değerlendirin
## İlgili
* [İş Akışı Eylemleri](/l/tr/user-guide/workflows/capabilities/workflow-actions)
* [İş Akışı Tetikleyicileri](/l/tr/user-guide/workflows/capabilities/workflow-triggers)

View File

@@ -0,0 +1,202 @@
---
title: Formül Alanları
description: Yerel destek sunulana kadar iş akışlarını kullanarak formül alanları oluşturun.
---
Twenty henüz yerel formül alanlarını desteklemiyor (2026'da geliyor), ancak aynı sonuca iş akışlarını kullanarak ulaşabilirsiniz. Bu geçici çözüm, basit birleştirmelerden karmaşık iş mantığına kadar alan değerlerini otomatik olarak hesaplayıp doldurmanızı sağlar.
## Ortak Kullanım Durumları
| Kullanım Senaryosu | Formül Örneği |
| ------------------------ | --------------------------------- |
| **Ad Soyad** | First Name + " " + Last Name |
| **Beklenen tutar** | Amount × Probability |
| **Son tarihe kalan gün** | Due Date - Today |
| **Aşamadaki gün sayısı** | Today - Stage Entry Date |
| **Lead skoru** | Birden çok kritere dayalı puanlar |
<Tip>
Boru hattı aşamalarında zamanı izlemeye dair eksiksiz bir örnek için bkz. [Fırsatların Her Aşamada Ne Kadar Kaldığını İzleme](/l/tr/user-guide/views-pipelines/how-tos/track-time-in-stage).
</Tip>
## Temel Formül: Birleştirme
### Örnek: Ad Soyad'ı Otomatik Doldur
**Amaç**: Ad ve soyadı otomatik olarak bir Ad Soyad alanında birleştirmek.
### Kurulum
1. **Tetikleyici**: Kayıt Güncellenir veya Oluşturulur (Kişiler)
2. **Filtre**: Adın veya soyadın değişip değişmediğini kontrol edin
3. **Kod eylemi**:
```javascript
export const main = async (params) => {
const { firstName, lastName } = params;
const fullName = [firstName, lastName]
.filter(Boolean)
.join(' ');
return { fullName };
};
```
4. **Kaydı Güncelle**: Ad Soyad'ı `{{code.fullName}}` olarak ayarla
## Sayısal Formül: Beklenen Tutar
### Örnek: Beklenen Geliri Hesapla
**Amaç**: Beklenen tutarı elde etmek için fırsat tutarını olasılıkla çarpın.
Tam iş akışı için [Boru Hattında Beklenen Tutar Nasıl Gösterilir](/l/tr/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline) bölümüne bakın.
### Kurulum
1. **Tetikleyici**: Kayıt Güncellenir (Fırsatlar, Tutar VEYA Olasılık alanı)
2. **Kod eylemi**:
```javascript
export const main = async (params) => {
const { amount, probability } = params;
const expectedAmount = (amount || 0) * (probability || 0) / 100;
return { expectedAmount };
};
```
3. **Kaydı Güncelle**: Beklenen Tutar'ı `{{code.expectedAmount}}` olarak ayarla
## Tarih Formülü: Gün Hesaplaması
### Örnek: Görevin Son Tarihine Kalan Gün Sayısı
**Amaç**: Bir görevin son tarihine kaç gün kaldığını hesaplamak.
### Kurulum
1. **Tetikleyici**: Kayıt Güncellenir veya Oluşturulur (Görevler, Son Tarih alanı)
2. **Kod eylemi**:
```javascript
export const main = async (params) => {
const { dueDate } = params;
if (!dueDate) {
return { daysUntilDue: null };
}
const due = new Date(dueDate);
const today = new Date();
const diffTime = due - today;
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
return { daysUntilDue: diffDays };
};
```
3. **Kaydı Güncelle**: Son Tarihe Kalan Gün'ü `{{code.daysUntilDue}}` olarak ayarla
<Note>
Negatif değerler, vadesi geçmiş görevleri belirtir. Bu alanı, görevleri aciliyetine göre filtrelemek veya sıralamak için kullanabilirsiniz.
</Note>
## Koşullu Formül: Lead Skoru
### Örnek: Kriterlere Göre Lead Skoru Hesapla
**Amaç**: Şirket büyüklüğü, sektör ve etkileşime göre lead'leri puanlamak.
### Kurulum
1. **Tetikleyici**: Kayıt Güncellenir (Kişiler veya Şirketler)
2. **Kod eylemi**:
```javascript
export const main = async (params) => {
const { companySize, industry, hasEmail, hasPhone, source } = params;
let score = 0;
// Company size scoring
if (companySize === 'Enterprise') score += 30;
else if (companySize === 'Mid-Market') score += 20;
else if (companySize === 'SMB') score += 10;
// Industry scoring
const targetIndustries = ['Technology', 'Finance', 'Healthcare'];
if (targetIndustries.includes(industry)) score += 25;
// Contact info scoring
if (hasEmail) score += 10;
if (hasPhone) score += 15;
// Source scoring
if (source === 'Referral') score += 20;
else if (source === 'Website') score += 10;
return { leadScore: score };
};
```
3. **Kaydı Güncelle**: Lead Skorunu `{{code.leadScore}}` olarak ayarla
## Metin Formülü: Alan Adı Çıkarma
### Örnek: E-postadan Alan Adı Çıkar
**Amaç**: E-posta alan adını otomatik olarak çıkarmak ve saklamak.
### Kurulum
1. **Tetikleyici**: Kayıt Güncellenir (Kişiler, E-posta alanı)
2. **Kod eylemi**:
```javascript
export const main = async (params) => {
const { email } = params;
if (!email) return { domain: null };
const domain = email.split('@')[1]?.toLowerCase();
return { domain };
};
```
3. **Kaydı Güncelle**: Alan Adı alanını `{{code.domain}}` olarak ayarla
## En İyi Uygulamalar
### Performans
* Yalnızca ilgili alan değişikliklerinde tetikleyin
* Hesaplama gerektirmeyen kayıtları atlamak için filtreler kullanın
* Yüksek hacimli iş akışlarında karmaşık hesaplamalardan kaçının
### Hata Yönetimi
* Hesaplamalardan önce null/undefined değerleri kontrol edin
* Veri eksikse varsayılan değerleri kullanın
* Hesaplamalar başarısız olduğunda açık hata mesajları döndürün
### Test
* Sınır durumlarıyla test edin (boş alanlar, sıfır değerler)
* Etkinleştirmeden önce hesaplamaları manuel olarak doğrulayın
* Beklenmeyen sonuçlar için iş akışı çalıştırmalarını izleyin
## İlgili
* [Boru Hattında Beklenen Tutar Nasıl Gösterilir](/l/tr/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline)
* [Aşamadaki Süre Nasıl İzlenir](/l/tr/user-guide/views-pipelines/how-tos/track-time-in-stage)
* [İş Akışı Eylemleri](/l/tr/user-guide/workflows/capabilities/workflow-actions)

View File

@@ -0,0 +1,127 @@
---
title: Gözden Geçirilecek Bir Not Hakkında Ekip Arkadaşlarını Bilgilendirin
description: Bir notu gözden geçirmesi için bir meslektaş atadığınızda otomatik e-posta bildirimleri gönderin.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
<Note>
**Notların içinde ekip arkadaşlarını doğrudan etiketleme henüz desteklenmiyor.** Bu özellik 2026'nın ikinci yarısı için planlanmıştır. Bu arada, bu iş akışı pratik bir geçici çözüm sunar.
</Note>
## Zorluk
Bir notta bir meslektaşınızı etiketleyerek gözden geçirmesi için bildirim almasını istiyorsunuz. Bugün itibarıyla, Twenty notlarda veya görevlerde @bahsetmeleri desteklemiyor.
## Geçici Çözüm
Not metni içinde etiketlemek yerine şunları yapabilirsiniz:
1. Notlar nesnesinde bir **Gözden Geçiren** ilişki alanı oluşturun
2. Notu oluştururken veya düzenlerken gözden geçiren kişiyi atayın
3. Bir iş akışının, notun bağlantısını içeren bir e-postayı gözden geçirene otomatik olarak göndermesini sağlayın
<Warning>
**Sınırlama**: Bu yaklaşım, alan başına bir gözden geçiren atanmasına izin verir. Birden fazla kişiyi bilgilendirmeniz gerekiyorsa, ek ilişki alanları oluşturun (ör. Gözden Geçiren 1, Gözden Geçiren 2). Bu yöntem, aynı anda birçok işbirlikçiyi etiketlemeniz gerekirse iyi ölçeklenmez.
</Warning>
## Adım adım kurulum
### Adım 1: Gözden Geçiren Alanını Oluşturun
<img src="/images/user-guide/workflows/reviewer-field-for-note.png" style={{width:'100%'}} />
1. **Ayarlar → Veri Modeli → Notlar** bölümüne gidin
2. **Alan Ekle**'ye tıklayın
3. Alanı Yapılandır:
| Ayar | Değer |
| ------------------ | ------------------------------------ |
| **Ad** | Gözden Geçiren |
| **Tür** | İlişki |
| **İlişkili Nesne** | Çalışma Alanı Üyesi |
| **İlişki Türü** | Birçok Not → Bir Çalışma Alanı Üyesi |
4. Alanı kaydedin
### Adım 2: İş akışını oluşturun
<VimeoEmbed videoId="1151897168" title="Video gösterimi" />
#### İş Akışı Tetikleyicisini Oluşturun
1. Ana görünüme gidin ve yeni bir iş akışı oluşturun
2. Tetikleyici olarak **Kayıt Güncellendi**'yi seçin
3. Nesne olarak **Not**'u seçin ve Gözden Geçiren alanını belirtin.
4. Bu, bir notun gözden geçireni güncellendiğinde tetiklenecektir.
#### Gözden Geçirenin Az Önce Atandığını Kontrol Etmek İçin Bir Filtre Ekleyin
İş akışının yalnızca bir gözden geçiren atandığında devam etmesini sağlamak için bir **Filtre** eylemi ekleyin:
| Koşul | Değer |
| ------------------ | --------- |
| **Gözden Geçiren** | boş değil |
#### Çalışma Alanı Üyesini Arayın
1. Bir **Kayıtları Ara** eylemi ekleyin
2. (Gelişmiş Nesneler altında) **Çalışma Alanı Üyesi**'ni seçin
3. Bir filtre ekleyin:
| Koşul | Değer |
| ------ | ----------------------------- |
| **ID** | eşittir `{{note.reviewerId}}` |
Bu, e-posta adresi ve adı dahil olmak üzere çalışma alanı üyesinin tam kaydını getirir.
#### Bildirim E-postasını Gönderin
1. **E-posta Gönder** eylemi ekleyin
2. Alanı Yapılandır:
| Alan | Değer |
| ---------- | --------------------------------------------------------- |
| **Kime** | Kayıt Ara → İlk Çalışma Alanı Üyesi → Kullanıcı E-postası |
| **Konu** | Bir not gözden geçirmenizi bekliyor |
| **İçerik** | Aşağıdaki örneğe bakın |
**E-posta gövdesi örneği:**
```text
Hi {{searchRecord.firstWorkspaceMember.name.firstName}},
You've been assigned to review a note.
View the note here:
https://yourSubDomain.twenty.com/object/note/{{recordIsUpdated.id}}
Best,
Twenty
```
<Note>
`yourSubDomain` değerini, gerçek Twenty çalışma alanı alt alan adınızla değiştirin.
</Note>
#### Test Edin ve Etkinleştirin
1. İş akışını manuel olarak çalıştırmak için **Test**'e tıklayın
2. Bir not oluşturun veya düzenleyin ve bir gözden geçiren atayın
3. Bildirim e-postası için gözden geçirenin gelen kutusunu kontrol edin
4. İş akışını etkinleştirin
## Kullanım
Kurulum tamamlandıktan sonra ekibiniz bu iş akışını şu şekilde kullanabilir:
1. Yeni bir not oluşturarak (veya mevcut bir notu düzenleyerek)
2. **Gözden Geçiren** alanında bir meslektaş seçerek
3. Meslektaş, nota doğrudan bağlantı içeren bir e-postayı otomatik olarak alır
## İlgili
* [İş Akışı Tetikleyicileri](/l/tr/user-guide/workflows/capabilities/workflow-triggers)
* [İş Akışlarından E-posta Gönderme](/l/tr/user-guide/workflows/capabilities/send-emails-from-workflows)
* [Özel Alanlar Oluşturma](/l/tr/user-guide/data-model/how-tos/create-custom-fields)
* [İlişki Alanları Oluşturma](/l/tr/user-guide/data-model/how-tos/create-relation-fields)

View File

@@ -0,0 +1,106 @@
---
title: Süresi Gelen Görevler için E-posta Uyarıları Gönderin
description: Takım üyelerini yaklaşan veya gecikmiş görevleri hakkında otomatik olarak bilgilendirin.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
<img src="/images/user-guide/workflows/email_tasks_due.png" style={{genişlik:'100%'}} />
Her takım üyesine, son tarihi bugün olan görevleri hakkında günlük e-posta hatırlatmaları gönderin.
## Genel Bakış
Bu iş akışı bir zamanlamaya göre çalışır ve:
1. Tüm çalışma alanı üyelerini getirir
2. Her bir üye üzerinde döner
3. Son tarihi bugün olan görevlerini bulur
4. Kişiselleştirilmiş bir e-postayı biçimlendirir ve gönderir
## Adım adım kurulum
<VimeoEmbed videoId="1147463514" title="Video gösterimi" />
### Adım 1: Tetikleyiciyi Yapılandırın
1. **Ayarlar → İş Akışları**'na gidin ve yeni bir iş akışı oluşturun
2. Tetikleyici olarak **Zamanlanmış Olarak**'ı seçin
3. Her gün saat 08:00 için bir cron ifadesi kullanın: `0 8 * * *`
### Adım 2: Tüm Çalışma Alanı Üyelerini Arayın
1. Bir **Kayıtları Ara** eylemi ekleyin
2. (Gelişmiş nesneler altında) **Çalışma Alanı Üyeleri**'ni seçin
3. Filtre gerekmez — bu, tüm üyeleri döndürür
### Adım 3: Bir Yineleyici Ekleyin
1. Bir **Iterator** eylemi ekleyin
2. Girdi dizisini önceki adımdaki çalışma alanı üyelerine ayarlayın
3. Yineleyici içindeki tüm eylemler, üye başına bir kez çalışır
### Adım 4: Bugün Son Tarihi Olan Görevleri Arayın (Yineleyici İçinde)
1. Yineleyici içinde bir **Kayıtları Ara** eylemi ekleyin
2. Nesne olarak **Görevler**'i seçin
3. Filtreler ekleyin:
* **Atanan** = mevcut çalışma alanı üyesi (yineleyiciden)
* **Son Tarih** = bugün
### Adım 5: Görevleri E-posta Gövdesine Biçimlendirin (Yineleyici İçinde)
Görevleri bağlantılarla okunabilir bir listeye dönüştürmek için bir **Kod** eylemi ekleyin:
```javascript
export const main = async (params: {
tasksDue?: Array<{ id: string; title: string }> | null | string;
}) => {
const tasksDue =
typeof params.tasksDue === "string"
? JSON.parse(params.tasksDue)
: params.tasksDue;
if (!Array.isArray(tasksDue) || tasksDue.length === 0) {
return {
formattedTasks: "No tasks due today."
};
}
const formattedTasks = tasksDue
.map(
t =>
`${t.title}\nhttps://yourSubDomain.twenty.com/object/task/${t.id}`
)
.join("\n\n");
return { formattedTasks };
};
```
<Note>
`yourSubDomain` değerini, gerçek Twenty çalışma alanı alt alan adınızla değiştirin.
</Note>
### Adım 6: E-posta Gönderin (Yineleyici İçinde)
1. Bir **E-posta Gönder** eylemi ekleyin (halen yineleyici içinde)
2. Yapılandırın:
| Alan | Değer |
| ---------- | ----------------------------------------------------------------------- |
| **Kime** | `{{iterator.currentItem.userEmail}}` (çalışma alanı üyesinin e-postası) |
| **Konu** | Bugün Son Tarihi Olan Görevleriniz |
| **İçerik** | `{{code.formattedTasks}}` |
### Adım 7: Test Edin ve Etkinleştirin
1. İş akışını manuel olarak çalıştırmak için **Test**'e tıklayın
2. E-postalar için gelen kutularını kontrol edin
3. İş akışını etkinleştirin
## İlgili
* [İş Akışı Eylemleri](/l/tr/user-guide/workflows/capabilities/workflow-actions)
* [İş Akışlarından E-posta Gönderme](/l/tr/user-guide/workflows/capabilities/send-emails-from-workflows)
* [Kod Eylemlerinde Dizileri Ele Alma](/l/tr/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)