# Gelen kancalar

> Formlardan, telefon santralinden, ödeme sisteminden, veri ambarından ve randevu araçlarından CRM'e gizli bir adres üzerinden veri gönderin.

Gelen kanca, dış bir sistemin CRM'e **kimlik bilgisi olmadan** veri göndermesini sağlayan gizli bir adrestir. Her bağlantının kendi adresi vardır; adresteki rastgele anahtar hem kimliği hem de yetkiyi taşır. Adresi **Ayarlar → Uygulamalar**'da ilgili kartı bağlayınca alırsınız.

```text
https://ornek.solk.app/in/<uygulama>/<gizli anahtar>      (Aircall, Stripe, Segment, veri eşitleme…)
https://ornek.solk.app/in/form/<gizli anahtar>            (site formu, Typeform, Tally)
```

:::warning
Gizli anahtarı içeren adres bir parola gibidir. Yalnız gönderen sisteme girin; sızdıysa bağlantı kartından **Adresi yenile** ile yenisini alın — eski adres anında çalışmaz.
:::

## Ortak kurallar

- Yöntem `POST`, gövde JSON (form gönderimlerinde `application/x-www-form-urlencoded` de olur). Aynı adrese `GET` isteği bağlantının çalıştığını doğrulayan kısa bir JSON döndürür.
- Kayıtlar bağlantının **sorumlusu** adına açılır (bağlantıyı kuran kullanıcı ya da kartta seçilen kişi); olayın kendi kullanıcısı (ör. aramayı yapan temsilcinin e-postası) eşleşirse o kullanıcı kullanılır.
- Aynı olay iki kez gelirse (dış kimlik aynıysa) ikinci kez işlenmez: `{"ok": true, "skipped": "zaten işlendi"}`.
- Hız sınırı **saat başına** bağlantı başınadır: Segment 3000, veri eşitleme / Aircall / RingCentral / Stripe 600, diğerleri 120 istek. Aşılırsa `429`.
- Kapatılmış ya da silinmiş bağlantının adresi `404` döner.

## Site formu {#form}

Kendi web sitenizdeki iletişim / teklif formunu doğrudan CRM'e bağlayın. Her başvuru:

1. Firma adına göre mevcut firmayı bulur, yoksa **aday firma** açar (kaynak: Web formu),
2. Kişiyi (e-posta yoksa ekleyerek) firmaya bağlar,
3. Bağlantı sorumlusuna **bugün terminli, yüksek öncelikli** bir görev açar ve bildirim gönderir,
4. `form_submitted` olayını uygulamalara iletir.

Alanlar adlarından tanınır; Türkçe ya da İngilizce olabilir:

| CRM alanı | Tanınan alan adları |
|---|---|
| Firma | `firma`, `şirket`, `company`, `kurum`, `organization` |
| Ad soyad | `ad soyad`, `adınız`, `isim`, `name`, `full name`, `yetkili` |
| E-posta | `e-posta`, `eposta`, `email`, `mail` (değer `@` içermeli) |
| Telefon | `telefon`, `phone`, `tel`, `gsm`, `cep` |
| Şehir | `şehir`, `il`, `city` |
| Unvan | `unvan`, `görev`, `title`, `pozisyon` |
| Mesaj | `mesaj`, `message`, `not`, `açıklama`, `talep`, `konu` |

Tanınmayan alanlar da kaybolmaz: tüm alanlar görevin ayrıntısına "etiket: değer" satırları olarak yazılır.

:::code
```html HTML formu
<form action="https://ornek.solk.app/in/form/GIZLI_ANAHTAR" method="post">
  <input name="firma" placeholder="Firma" required>
  <input name="ad soyad" placeholder="Adınız">
  <input name="e-posta" type="email" placeholder="E-posta" required>
  <input name="telefon" placeholder="Telefon">
  <textarea name="mesaj" placeholder="Mesajınız"></textarea>
  <!-- gönderimden sonra yönlendirilecek sayfa (isteğe bağlı) -->
  <input type="hidden" name="_next" value="https://firmaniz.com/tesekkurler">
  <button>Gönder</button>
</form>
```
```bash cURL (JSON)
curl https://ornek.solk.app/in/form/GIZLI_ANAHTAR \
  -H "Content-Type: application/json" \
  -d '{"company": "Anadolu Gıda", "name": "Murat Er", "email": "murat@anadolugida.com.tr", "message": "Aylık 5 ton streç film"}'
```
:::

Yanıt `{"ok": true, "customer_id": 42, "task_id": 118}`. HTML formunda `_next` verilmişse kullanıcı o sayfaya yönlendirilir.

**Typeform** ve **Tally** aynı adres yapısını kullanır; formun webhook ayarına adresi yapıştırın. Kartta imza gizli anahtarı girerseniz `Typeform-Signature` / `Tally-Signature` başlıkları doğrulanır ve imzasız istekler `401` alır.

## Veri eşitleme {#sync}

Veri ambarınızdaki, ERP'nizdeki ya da başka bir CRM'deki firma ve kişileri toplu olarak gönderip **açın ya da güncelleyin**. Census, Hightouch, Airbyte, kendi betiğiniz ya da Zapier ile kullanılabilir.

```bash
curl "https://ornek.solk.app/in/sync/GIZLI_ANAHTAR?obj=customer" \
  -H "Content-Type: application/json" \
  -d '{"rows": [
        {"external_id": "ERP-1042", "name": "Kuzey Plastik Sanayi", "website": "kuzeyplastik.com.tr", "city": "Bursa", "industry": "Plastik", "status": "AC"},
        {"external_id": "ERP-1043", "name": "Anadolu Gıda Ambalaj", "phone": "+90 332 555 10 20"}
      ]}'
```

```json
{ "ok": true, "created": 1, "updated": 1, "errors": [] }
```

- Nesne `?obj=customer` / `?obj=contact` ya da gövdede `"object"` ile seçilir; verilmezse satırda `email` olan ve `industry` olmayanlar kişi sayılır.
- Gövde bir dizi, `rows` / `records` / `batch` / `data` alanı ya da tek bir nesne olabilir. Tek istekte en çok **500 satır**.
- Eşleşme sırası — firma: `external_id` (daha önce gönderildiyse) → ad → web sitesinin alan adı. Kişi: `external_id` → e-posta.
- Firma alanları: `name`/`company`, `website`/`domain`, `phone`, `city`, `industry`/`sector`, `address`, `status` (`AC`/`Prospect`). Kişi alanları: `name` (ya da `first_name` + `last_name`), `email`, `phone`/`mobile`, `title`/`job_title`, `department`, firma için `company` ya da `company_external_id`.
- Boş değerler mevcut veriyi silmez; yalnız dolu alanlar yazılır.

## Segment {#segment}

Segment'te **Webhooks (Actions)** hedefi ekleyip adresi girin.

- `identify` → kişi (ve `traits.company` varsa firma) açılır ya da güncellenir; `userId` dış kimlik olarak saklanır.
- `group` → firma açılır ya da güncellenir (`groupId`, `traits.name`, `website`, `industry`).
- `track` → kartta seçtiğiniz olay adları (ör. `Demo Requested, Trial Started`) kişinin firmasına not olarak düşer.

Toplu gönderimde (`batch`) istek başına en çok 100 olay işlenir.

## Telefon: Aircall ve RingCentral {#calls}

**Aircall** webhook'unda `call.ended` ve `call.voicemail_left` olaylarını seçin. **RingCentral** ve diğer santraller için Zapier / Make üzerinden şu düz gövdeyi gönderin:

```json
{
  "id": "rc-88231",
  "direction": "outbound",
  "number": "+90 224 555 01 02",
  "result": "answered",
  "duration": 312,
  "started_at": "2026-10-02T10:41:00+03:00",
  "user_email": "deniz@ornekkimya.com.tr",
  "recording_url": "https://…",
  "notes": "Fiyat görüşüldü"
}
```

- Numara bir kişi ya da firmayla eşleşirse **telefon görüşmesi** kaydı açılır (süre, yön, kayıt bağlantısı, not).
- Cevapsız gelen aramada sorumluya **"Geri ara"** görevi açılır (yüksek öncelik, sesli mesaj bağlantısıyla).
- Numara bilinmiyorsa "kaydı firmaya bağlayın" görevi açılır.

## Stripe {#stripe}

Stripe panelinde webhook uç noktası olarak adresi ekleyin ve `invoice.paid`, `invoice.payment_failed`, `customer.subscription.deleted`, `checkout.session.completed` olaylarını seçin. Kartta **imza gizli anahtarını** (`whsec_…`) girerseniz `Stripe-Signature` doğrulanır. Ödemeler firmaya not düşer; başarısız ödeme ve sona eren abonelik için sorumluya görev açılır. Firma, daha önce bağlanmış Stripe müşteri kimliğinden ya da müşterinin e-postasından bulunur; `checkout.session.completed` olayında firma yoksa aday olarak açılır.

## Randevu: Calendly ve Cal.com {#booking}

Randevu alındığında takvime toplantı, firmaya kişi ve not düşer; randevu iptal edilince toplantı da iptal olur. Calendly'de `invitee.created` / `invitee.canceled`, Cal.com'da `BOOKING_CREATED`, `BOOKING_RESCHEDULED`, `BOOKING_CANCELLED` olaylarını seçin.

## Toplantı notları {#meeting-notes}

Yapay zekâ toplantı notu araçlarından (Fireflies, Fathom, tl;dv, Otter… doğrudan ya da Zapier ile) gelen özet, katılımcıların firmasına not olarak; eylem maddeleri iki gün terminli görev olarak düşer.

```json
{
  "id": "mtg_5521",
  "title": "Kuzey Plastik · haftalık",
  "summary": "Numune sonuçları olumlu, fiyat revizyonu istendi.",
  "attendees": [{ "email": "emre.yildiz@kuzeyplastik.com.tr", "name": "Emre Yıldız" }],
  "action_items": ["Revize fiyatı gönder", "Hat denemesi tarihini netleştir"],
  "url": "https://…"
}
```

## lemlist {#lemlist}

Kampanya olayları (`emailsReplied`, `linkedinReplied`, `emailsInterested`, `meetingBooked`, `emailsNotInterested`, `emailsBounced`, `emailsUnsubscribed`, `emailsClicked`) kişinin firmasına not düşer; yanıt, ilgi ve toplantı olaylarında sorumluya "dönüş yapın" görevi açılır.

## Slack komutu {#slack}

Slack uygulamanızda bir **Slash Command** (ör. `/crm`) tanımlayıp istek adresi olarak bağlantının adresini, kartta da Slack'in **Signing Secret**'ını girin. `/crm kuzey` yazan kullanıcı eşleşen firma, kişi ve fırsatları yalnız kendisinin göreceği bir yanıtla alır.