> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Rezervasyon onayı ve terk edilen rezervasyon kurtarma

> Gerçek zamanlı rezervasyon durumuna göre rezervasyon onayı veya kurtarma e-postaları göndermek için Özel Etkinlikler, Journeys ve Veri Beslemelerini kullanın.

## Genel Bakış

Bu eğitimde, yaygın bir rezervasyon iş akışı kuracaksınız:

* Bir kullanıcı rezervasyon tamamladıktan sonra rezervasyon onay e-postası gönderin.
* Bir kullanıcı rezervasyon başlattı ancak zamanında tamamlamadıysa kurtarma e-postası gönderin.

Sonunda sahip olacağınız:

* İki Özel Etkinlik (`booking_started`, `booking_complete`)
* Tamamlama karşı terke göre dallanan bir Journey
* Onay ayrıntıları için bir rezervasyon Veri Beslemesi
* Kurtarma teşvikleri için isteğe bağlı kupon Veri Beslemesi

Bu rehber OneSignal yapılandırmasına odaklanır. Rezervasyon sisteminiz ve arka ucunuz herhangi bir dil veya çerçevede uygulanabilir.

### Kurulum akışı

1. Uygulamanız bir `booking_started` [özel etkinlik](./custom-events) izler.
2. Bu, kullanıcıyı bir Journey'ye dahil eder.
3. Journey bir `booking_complete` etkinliği bekler ve zamanında alınmazsa takip hatırlatıcıları gönderir.
4. Rezervasyon tamamlanırsa, OneSignal gönderim anında bir rezervasyon Veri Beslemesi çağırır ve en güncel rezervasyon ayrıntılarıyla bir onay e-postası gönderir.
5. Rezervasyon bekleme penceresi içinde tamamlanmazsa, Journey son kullanma yolunu izler ve bir kurtarma e-postası gönderir.

***

## Kurulum

### Önkoşullar

Başlamadan önce sahip olduğunuzdan emin olun:

* [**E-posta**](./email-setup) kanalı etkinleştirilmiş bir OneSignal uygulaması
* Rezervasyon ve/veya kupon verilerini JSON olarak döndürebilen bir arka uç uç noktası
* Uygulamanız, arka ucunuz ve OneSignal [Harici ID](./users#external-id) arasında paylaşılan kararlı bir kullanıcı tanımlayıcısı
* [Özel Etkinlikler](./custom-events) erişimi

### 1. Rezervasyon etkinliklerini izleme

Aşağıdaki Özel Etkinlikleri izleyin. Bunlar uygulamanızdan (SDK'mızı kullanarak) veya arka ucunuzdan (REST API'mizi kullanarak) gelebilir.

**Etkinlik adları:**

* `booking_started` — kullanıcı rezervasyon akışını başlattığında
* `booking_complete` — rezervasyon başarıyla tamamlandığında

<Tabs>
  <Tab title="Uygulama - Mobil ve Web">
    Uygulama/web sitenizden doğrudan özel etkinlikler göndermek için [Mobil SDK](./mobile-sdk-reference) ve/veya [Web SDK](./web-sdk-reference)'deki `trackEvent()` yöntemini kullanın.

    ```js Örnek theme={null}
    OneSignal.User.trackEvent("booking_started");
    OneSignal.User.trackEvent("booking_complete");
    ```
  </Tab>

  <Tab title="Sunucu Tarafı">
    Etkinlikleri arka ucunuzdan izliyorsanız, OneSignal'a etkinlik göndermek için [Özel Etkinlik Oluştur API'si](/reference/create-custom-events) kullanın.

    ```bash theme={null}
    curl --request POST \
      --url https://api.onesignal.com/apps/{app_id}/custom_events \
      --header 'Authorization: Key YOUR_APP_API_KEY' \
      --header 'Content-Type: application/json' \
      --data '{
        "events": [
          {
            "name": "booking_started",
            "external_id": "user123",
            "properties": {}
          }
        ]
      }'
    ```
  </Tab>
</Tabs>

<Note>
  Etkinlikleri izlerken ve arka ucunuzdan veri döndürürken aynı kullanıcı kimliğini kullanın. Eşleşmeyen ID'ler, eksik kişiselleştirmenin en yaygın nedenidir.
</Note>

### 2. Veri Beslemesi takma adları oluşturma

OneSignal'da **Ayarlar > Veri Beslemeleri**'ne gidin ve aşağıdaki takma adları oluşturun.

**Rezervasyon Veri Beslemesi:**
Gönderim anında en güncel rezervasyon ayrıntılarını çekmek için bu beslemeyi kullanın.

* **Takma ad:** `booking_data`
* **Yöntem:** GET
* **URL:**

```liquid Uç nokta örneği theme={null}
https://your-domain.com/datafeed/booking?user_id={{subscription.external_id}}
```

Örnek yanıt:

```json JSON theme={null}
{
  "first_name": "Sam",
  "last_booking": {
    "service_type": "Danışmanlık",
    "booking_date": "22 Ocak 2026",
    "booking_time": "14:00",
    "price": 45
  }
}
```

**Kupon Veri Beslemesi (isteğe bağlı):**

Kurtarma e-postanıza bir kupon kodu eklemek istiyorsanız bu isteğe bağlı beslemeyi kullanın.

* **Takma ad:** `coupon`
* **Yöntem:** GET
* **URL:**

```liquid Uç nokta örneği theme={null}
https://your-domain.com/datafeed/coupon?user_id={{subscription.external_id}}
```

Örnek yanıt:

```json JSON theme={null}
{
  "first_name": "Sam",
  "code": "PROMO8F3K2",
  "discount_text": "%10",
  "expires_in_hours": 2,
  "deep_link": "https://your-domain.com/checkout?coupon=PROMO8F3K2"
}
```

<Warning>
  Veri Beslemesi uç noktalarınızı güvenceye alın. Üretimde, URL'ye sır gömmek yerine istek başlıklarında bir API anahtarı (örneğin `x-api-key`) gönderin ve bu başlığı **Ayarlar > Veri Beslemeleri**'nde yapılandırın.
</Warning>

### 3. E-posta şablonları oluşturma

#### Rezervasyon onay e-postası:

**Konu:**

```text theme={null}
Rezervasyon ayrıntılarınız
```

**Gövde:**

```liquid theme={null}
Merhaba {{ data_feed.booking_data.first_name | default: "müşteri" }},

Rezervasyonunuz için teşekkürler! Randevu ayrıntılarınız:

Hizmet: {{ data_feed.booking_data.last_booking.service_type }}
Tarih: {{ data_feed.booking_data.last_booking.booking_date }}
Saat: {{ data_feed.booking_data.last_booking.booking_time }}
Fiyat: {{ data_feed.booking_data.last_booking.price }} TL

Sizi görmeyi sabırsızlıkla bekliyoruz!
```

#### Rezervasyon kurtarma e-postası

**Konu:**

```text theme={null}
Rezervasyonunuzu tamamlayın ve tasarruf edin
```

**Gövde:**

<Tabs>
  <Tab title="Kupon Veri Beslemesi Kullanarak">
    ```liquid theme={null}
    Merhaba {{ data_feed.coupon.first_name | default: "müşteri" }},

    Rezervasyonunuzu önümüzdeki {{ data_feed.coupon.expires_in_hours }} saat içinde tamamlayın ve
    bu kodla {{ data_feed.coupon.discount_text }} tasarruf edin:

    {{ data_feed.coupon.code }}

    Burada kullanın:
    {{ data_feed.coupon.deep_link }}
    ```
  </Tab>

  <Tab title="Kupon Veri Beslemesi Olmadan">
    ```text theme={null}
    Merhaba, 

    Rezervasyonunuzu henüz tamamlamadınız! 

    Bir sonraki randevunuzda tasarruf etmek için şimdi tamamlayın.

    Rezervasyonunuzu tamamlamak için bu bağlantıyı kullanın:
    [Buraya derin bağlantı ekleyin]
    ```
  </Tab>
</Tabs>

<Note>
  Veri Beslemesi alanı eksikse boş içeriği önlemek için Liquid'de her zaman `default` filtreleri dahil edin.
</Note>

### 4. Journey'yi oluşturma

1. OneSignal'da **Mesajlar > Journeys > Journey Oluştur**'a gidin

2. **Giriş Tetikleyicisi**'ni şu şekilde ayarlayın:
   * **Özel Etkinlik:** `booking_started`

3. Bir **Şu Ana Kadar Bekle** adımı ekleyin:
   * **Koşul:** Özel Etkinlik gerçekleşir
   * **Etkinlik adı:** `booking_complete`
   * **Maksimum bekleme süresi:** 10 dakika
   * Sona erme yolunu etkinleştirin

4. Dalları yapılandırın:
   * **Tamamlandı:** Rezervasyon onay e-postası gönder
     * **Veri Beslemesi:** `booking_data`
   * **Süresi doldu:** Kurtarma e-postası gönder
     * **Veri Beslemesi:** `coupon`

<Info>
  Sona erme dalı, uygulamanızda ek mantık olmadan terk etmeyi ele almanızı sağlar. Bakın:

  * [Journey ayarları](./journeys-settings) - Özel Etkinlik giriş ve çıkış kuralları hakkında ayrıntılar
  * [Journeys eylemleri](./journeys-actions) - Şu Ana Kadar Bekle adımları ve sona erme dalları hakkında ayrıntılar
</Info>

### 5. Test etme ve doğrulama

#### Etkinlikleri doğrulama

Uygulamanızdan veya arka ucunuzdan özel etkinlikleri tetikleyin ve onaylayın.

OneSignal'da **Analytics > Özel Etkinlikler**'e gidin ve şunları gördüğünüzü onaylayın:

* Harici ID'niz için `booking_started` etkinlikleri görünür
* Harici ID'niz için `booking_complete` etkinlikleri görünür

#### Veri Beslemelerini doğrulama

Bilinen bir kullanıcı ID'si kullanarak Veri Beslemesi uç noktalarınızı manuel olarak çağırın ve onaylayın:

* 200 yanıtı döndürülür
* Tüm beklenen alanlar mevcut

#### E-postaları doğrulama

Journey editöründen test mesajları gönderin ve onaylayın:

* Rezervasyon e-postaları gerçek rezervasyon ayrıntıları içerir
* Kurtarma e-postaları geçerli bir kupon içerir
* Hiçbir Liquid değişkeni boş işlenmez

<Check>
  Kişiselleştirme eksikse, Veri Beslemesi isteğindeki kullanıcı ID'sinin Journey'yi tetikleyen kullanıcıyla eşleştiğini onaylayın.
</Check>

## Örnek: Veri Beslemesi uygulaması

<Accordion title="Örnek Node.js Veri Beslemesi uç noktaları">
  Bu örnek, rezervasyon onayı ve kurtarma Veri Beslemeleri için minimal bir Express uygulaması gösterir. JSON yanıt şekli e-posta şablonlarınızla eşleştikçe arka uç diliniz, çerçeveniz ve veri kaynağınız farklılık gösterebilir.

  ### Rezervasyon Veri Beslemesi örneği

  ```js theme={null}
  import express from "express";

  const app = express();

  function dataFeedAuth(req, res, next) {
    if (req.headers["x-api-key"] !== process.env.DATAFEED_API_KEY) {
      return res.status(401).json({ error: "Unauthorized" });
    }
    next();
  }

  app.get("/datafeed/booking", dataFeedAuth, async (req, res) => {
    const { user_id } = req.query;

    if (!user_id) {
      return res.status(400).json({ error: "Missing user_id" });
    }

    const booking = await getLatestBookingForUser(user_id);

    if (!booking) {
      return res.status(404).json({ error: "No booking found" });
    }

    res.json({
      first_name: booking.first_name,
      last_booking: {
        service_type: booking.service_type,
        booking_date: booking.booking_date,
        booking_time: booking.booking_time,
        price: booking.price
      }
    });
  });
  ```

  ### Kupon Veri Beslemesi örneği

  ```js theme={null}
  app.get("/datafeed/coupon", dataFeedAuth, async (req, res) => {
    const { user_id } = req.query;

    if (!user_id) {
      return res.status(400).json({ error: "Missing user_id" });
    }

    const coupon = await generateCouponForUser(user_id);

    res.json({
      first_name: coupon.first_name,
      code: coupon.code,
      discount_text: coupon.discount_text,
      expires_in_hours: coupon.expires_in_hours,
      deep_link: coupon.deep_link
    });
  });
  ```

  ### Uygulama yönergeleri

  * Yanıtları hızlı tutun (Veri Beslemeleri gönderim anında çağrılır)
  * Her zaman öngörülebilir bir JSON yapısı döndürün
  * Veri mevcut olmadığında 404 kullanın
  * İstek başlıkları aracılığıyla gönderilen API anahtarıyla uç noktaları güvenceye alın
</Accordion>

## Yaygın sorunlar

### E-posta boş değerler gösteriyor

* Veri Beslemesi 404 döndürdü
* JSON yanıtında alan adları değişti
* Kullanıcı kimliği uyumsuzluğu

### Journey dallanmıyor

* `booking_complete` etkinliği izlenmedi
* Etkinlik adı uyumsuzluğu (büyük/küçük harf duyarlı)
* Etkinlik bekleme penceresi dışında gerçekleşti

### Veri Beslemesi 401 veya 403 döndürüyor

* Eksik veya geçersiz API anahtarı
* Veri Beslemesi ayarlarında başlık yapılandırılmadı

## Sonraki adımlar

* Daha gelişmiş Journey koşulları için etkinlik özellikleri (hizmet türü, fiyat) ekleyin
* Push veya SMS hatırlatıcıları gibi ek kurtarma adımları ekleyin
* Tekrarlanan kurtarma mesajlarını önlemek için Journey çıkış kuralları kullanın

***
