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

# Ereignisse

> Webhook-Ereignistypen und Payload-Strukturen

# Webhook-Ereignisse

RxScale sendet Webhooks für die folgenden Ereignistypen:

| Ereignistyp                      | Beschreibung                                                               |
| -------------------------------- | -------------------------------------------------------------------------- |
| `pharmacy_order_created`         | Eine neue Apothekenbestellung wurde erstellt und Ihrer Apotheke zugewiesen |
| `pharmacy_order_updated`         | Der Status einer bestehenden Apothekenbestellung hat sich geändert         |
| `pharmacy_sku_stock_updated`     | Der Lagerbestand einer Apotheken-SKU hat sich geändert                     |
| `appointment_reminder_due`       | Eine geplante Terminerinnerung ist fällig geworden                         |
| `patient_doctor_meeting_updated` | Eine Patient-Arzt-Besprechung hat ihren Lebenszyklus-Status geändert       |

## HTTP-Header

Jede Webhook-Anfrage enthält die folgenden HTTP-Header:

| Header                | Beschreibung                                                                        |
| --------------------- | ----------------------------------------------------------------------------------- |
| `Content-Type`        | Immer `application/json`                                                            |
| `X-Webhook-Event`     | Der Ereignistyp (z.B. `pharmacy_order_created`)                                     |
| `X-Webhook-Signature` | HMAC-SHA256-Signatur des Anfrageinhalts (siehe [Sicherheit](/de/webhooks/security)) |

Falls Sie beim Erstellen des Abonnements einen benutzerdefinierten Header konfiguriert haben, wird dieser ebenfalls mitgesendet.

***

## pharmacy\_order\_created

Wird gesendet, wenn eine neue Apothekenbestellung erstellt und Ihrer Apotheke zugewiesen wird.

**Mögliche `status`-Werte:** `init`, `waiting for pharmacy`, `pending review`, `in-progress`, `ready_for_pickup`, `completed`

### Payload-Beispiel

```json theme={null}
{
  "event_type": "pharmacy_order_created",
  "timestamp": 1711900000,
  "payload_version": "1",
  "data": {
    "uid": "po-abc123",
    "status": "init",
    "name": "#1001",
    "data": {},
    "external_status": "OPEN",
    "created_at": 1711899000,
    "updated_at": 1711899000,
    "deleted_at": null,
    "pharmacy": {
      "uid": "ph-xyz",
      "display_name": "City Pharmacy"
    },
    "order": {
      "uid": "ord-123",
      "delivery_address": {
        "first_name": "Max",
        "last_name": "Mustermann",
        "street": "Hauptstr.",
        "house_number": "1",
        "zip_code": "10115",
        "city": "Berlin",
        "country": "Germany",
        "additional_address": null,
        "province": null
      },
      "invoice_address": {
        "first_name": "Max",
        "last_name": "Mustermann",
        "street": "Hauptstr.",
        "house_number": "1",
        "zip_code": "10115",
        "city": "Berlin",
        "country": "Germany",
        "additional_address": null,
        "province": null
      },
      "shipping_costs_amount": 499,
      "shipping_costs_currency": "EUR",
      "priority": 5
    },
    "delivery_type": {
      "uid": "dt-001",
      "display_name": "Standard Shipping",
      "identifier": "standard"
    },
    "shop_shipping_methods": [
      {
        "uid": "ssm-001",
        "display_name": "DHL Standard",
        "external_id": "shopify-standard",
        "pharmacy_mapping": {
          "pharmacy_uid": "ph-xyz",
          "shipping_method_identifier_for_pharmacy": "DHL_STANDARD"
        }
      }
    ],
    "order_items": [
      {
        "uid": "oi-789",
        "amount": 1,
        "sku": {
          "uid": "sku-456",
          "display_name": "Medication X 100mg",
          "pzn": "12345678",
          "product_uid": "prod-789",
          "product_display_name": "Medication X",
          "standard_selling_unit": 1.0,
          "unit": "ml",
          "product_handle": "medication-x"
        },
        "pharmacy_sku": {
          "uid": "psku-456",
          "external_id": "EXT-001",
          "price": 1299,
          "stock": 50
        },
        "total_paid_amount": 1299
      }
    ],
    "payouts": [
      {
        "status": "projected",
        "amount": 999,
        "currency": "EUR",
        "component_type": "item_rest",
        "routing_description": "Medication X 100mg item rest",
        "provider_route_id": null,
        "pharmacy_order_uid": "po-abc123",
        "pharmacy_order_name": "#1001",
        "pharmacy_order_created_at": 1711899000,
        "routing_created_at": null
      },
      {
        "status": "projected",
        "amount": 300,
        "currency": "EUR",
        "component_type": "item_markup",
        "routing_description": "Medication X 100mg markup",
        "provider_route_id": null,
        "pharmacy_order_uid": "po-abc123",
        "pharmacy_order_name": "#1001",
        "pharmacy_order_created_at": 1711899000,
        "routing_created_at": null
      },
      {
        "status": "projected",
        "amount": 499,
        "currency": "EUR",
        "component_type": "shipping",
        "routing_description": "Standard Shipping",
        "provider_route_id": null,
        "pharmacy_order_uid": "po-abc123",
        "pharmacy_order_name": "#1001",
        "pharmacy_order_created_at": 1711899000,
        "routing_created_at": null
      }
    ],
    "patient_data": {
      "uid": "pat-123",
      "display_name": "Max Mustermann",
      "email": "max@example.com",
      "date_of_birth": "15.06.1990",
      "phone_number": "+49 170 1234567"
    },
    "doctor_data": {
      "uid": "doc-456",
      "display_name": "Dr. Schmidt"
    },
    "prescription_file": {
      "filename": "prescription_001.pdf",
      "content_base64": "JVBERi0xLjQK..."
    },
    "prepaid": 1
  }
}
```

### Feldreferenz

| Feld                                                                                    | Typ               | Beschreibung                                                                                                                                                                                                                                                                                                                                                   |
| --------------------------------------------------------------------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `data.uid`                                                                              | string            | UID der Apothekenbestellung                                                                                                                                                                                                                                                                                                                                    |
| `data.status`                                                                           | string            | Aktueller Bestellstatus                                                                                                                                                                                                                                                                                                                                        |
| `data.name`                                                                             | string oder null  | Lesbarer Bestellname (z.B. `#1001`)                                                                                                                                                                                                                                                                                                                            |
| `data.data`                                                                             | object            | Benutzerdefinierte Daten der Bestellung                                                                                                                                                                                                                                                                                                                        |
| `data.external_status`                                                                  | string            | Externer Status-Bezeichner                                                                                                                                                                                                                                                                                                                                     |
| `data.created_at`                                                                       | integer           | Unix-Zeitstempel der Erstellung                                                                                                                                                                                                                                                                                                                                |
| `data.updated_at`                                                                       | integer           | Unix-Zeitstempel der letzten Aktualisierung                                                                                                                                                                                                                                                                                                                    |
| `data.deleted_at`                                                                       | integer oder null | Unix-Zeitstempel der Löschung oder `null`                                                                                                                                                                                                                                                                                                                      |
| `data.pharmacy`                                                                         | object            | Apothekenzusammenfassung mit `uid` und `display_name`                                                                                                                                                                                                                                                                                                          |
| `data.order`                                                                            | object            | Übergeordnete Bestellung mit `uid`, `delivery_address` und `invoice_address`                                                                                                                                                                                                                                                                                   |
| `data.order.shipping_costs_amount`                                                      | integer oder null | Versandkosten in Cent. `null`, wenn keine Versandkosten verfügbar sind.                                                                                                                                                                                                                                                                                        |
| `data.order.shipping_costs_currency`                                                    | string oder null  | ISO-4217-Währungscode der Versandkosten, z.B. `EUR`.                                                                                                                                                                                                                                                                                                           |
| `data.order.priority`                                                                   | integer           | Prioritätshinweis für die bevorzugte Bearbeitung. Höher = dringender. `0` bedeutet keine besondere Priorität.                                                                                                                                                                                                                                                  |
| `data.delivery_type`                                                                    | object oder null  | Versandart mit `uid`, `display_name` und `identifier`. Wird aus der Fulfillment-Methode des verbundenen Shops (pro Shop konfiguriert) ermittelt, andernfalls aus der Standard-Versandart der empfangenden Apotheke. `null`, wenn keines von beiden gesetzt ist — gehen Sie nicht davon aus, dass immer eine Versandart vorhanden ist.                          |
| `data.shop_shipping_methods`                                                            | array             | Versandmethoden des verbundenen Shop-Bestellauftrags. Leeres Array, wenn keine Shop-Versandmethoden vorliegen.                                                                                                                                                                                                                                                 |
| `data.shop_shipping_methods[].uid`                                                      | string            | UID der Shop-Versandmethode                                                                                                                                                                                                                                                                                                                                    |
| `data.shop_shipping_methods[].display_name`                                             | string            | Anzeigename der Versandmethode aus dem Shop                                                                                                                                                                                                                                                                                                                    |
| `data.shop_shipping_methods[].external_id`                                              | string oder null  | Bezeichner der Versandmethode im verbundenen Shop (z.B. der Shopify-Shipping-Line-Code)                                                                                                                                                                                                                                                                        |
| `data.shop_shipping_methods[].pharmacy_mapping`                                         | object oder null  | Apothekenspezifisches Mapping aus den RxScale-Apothekeneinstellungen, oder `null`, wenn für die empfangende Apotheke noch kein Mapping konfiguriert wurde. Konfiguriert wird dies im Apotheken-Bildschirm *Einstellungen → Versandarten-Zuordnung*.                                                                                                            |
| `data.shop_shipping_methods[].pharmacy_mapping.pharmacy_uid`                            | string            | UID der empfangenden Apotheke, für die dieses Mapping gilt                                                                                                                                                                                                                                                                                                     |
| `data.shop_shipping_methods[].pharmacy_mapping.shipping_method_identifier_for_pharmacy` | string            | Apothekenspezifischer Bezeichner, den die empfangende Apotheke für diese Versandmethode erwartet (z.B. `DHL_STANDARD`). Verwenden Sie diesen Wert, wenn Sie die Bestellung an Ihr nachgelagertes Versand-/Label-System übergeben.                                                                                                                              |
| `data.order_items`                                                                      | array             | Artikel der Bestellung                                                                                                                                                                                                                                                                                                                                         |
| `data.order_items[].sku`                                                                | object            | SKU-Informationen inkl. `pzn`, `product_uid`, `product_display_name`, `standard_selling_unit`, `unit` und `product_handle`                                                                                                                                                                                                                                     |
| `data.order_items[].sku.standard_selling_unit`                                          | number oder null  | Standard-Verkaufseinheit der SKU                                                                                                                                                                                                                                                                                                                               |
| `data.order_items[].sku.unit`                                                           | string oder null  | Einheit der SKU, z.B. `ml` oder `g`                                                                                                                                                                                                                                                                                                                            |
| `data.order_items[].pharmacy_sku`                                                       | object oder null  | Apothekenspezifische SKU-Daten mit `uid`, `external_id`, `price` (Cent), `stock`                                                                                                                                                                                                                                                                               |
| `data.order_items[].total_paid_amount`                                                  | integer oder null | Vom Patienten gezahlter Betrag für diese Position in Cent (brutto). `null`, wenn keine Zahlungsinformationen verfügbar sind.                                                                                                                                                                                                                                   |
| `data.payouts`                                                                          | array             | Auszahlungskomponenten für diese Apothekenbestellung, bei denen die aktuelle Apotheke der Receiver ist. Bezahlte Bestellungen mit physischem Rezept enthalten `projected`-Vorschauen auf Basis aktueller Werte und Routing-Konfiguration. Abgeschlossene Bestellungen enthalten `routed`-Auszahlungen, sobald eine persistierte Split-Payment-Route existiert. |
| `data.payouts[].status`                                                                 | string            | `projected` für eine unverbindliche Vorschau oder `routed` für eine persistierte Split-Payment-Route, die nach Abschluss der Apothekenbestellung erstellt wurde.                                                                                                                                                                                               |
| `data.payouts[].amount`                                                                 | integer           | Auszahlungsbetrag in Cent.                                                                                                                                                                                                                                                                                                                                     |
| `data.payouts[].currency`                                                               | string            | ISO-4217-Währungscode, z.B. `EUR`.                                                                                                                                                                                                                                                                                                                             |
| `data.payouts[].component_type`                                                         | string            | Auszahlungskomponente. Mögliche Werte sind `item_rest`, `item_markup` und `shipping`.                                                                                                                                                                                                                                                                          |
| `data.payouts[].routing_description`                                                    | string oder null  | Lesbare Beschreibung der gerouteten oder projizierten Komponente.                                                                                                                                                                                                                                                                                              |
| `data.payouts[].provider_route_id`                                                      | string oder null  | Routenbezeichner des Zahlungsanbieters. Befüllt bei gerouteten Auszahlungen, wenn der Anbieter einen Bezeichner zurückgegeben hat, und `null` bei `projected`-Auszahlungen.                                                                                                                                                                                    |
| `data.payouts[].pharmacy_order_uid`                                                     | string            | UID der zugehörigen Apothekenbestellung.                                                                                                                                                                                                                                                                                                                       |
| `data.payouts[].pharmacy_order_name`                                                    | string oder null  | Lesbarer Name der Apothekenbestellung.                                                                                                                                                                                                                                                                                                                         |
| `data.payouts[].pharmacy_order_created_at`                                              | integer           | Unix-Zeitstempel der Erstellung der Apothekenbestellung.                                                                                                                                                                                                                                                                                                       |
| `data.payouts[].routing_created_at`                                                     | integer oder null | Unix-Zeitstempel der Erstellung der Split-Payment-Route. Bei `projected`-Auszahlungen ist dieser Wert `null`.                                                                                                                                                                                                                                                  |
| `data.patient_data`                                                                     | object oder null  | Patienteninformationen mit `uid`, `display_name`, `email`, `date_of_birth`, `phone_number`                                                                                                                                                                                                                                                                     |
| `data.doctor_data`                                                                      | object oder null  | Arzt, der das Rezept signiert hat, mit `uid` und `display_name`                                                                                                                                                                                                                                                                                                |
| `data.prescription_file`                                                                | object oder null  | Signiertes Rezept-PDF mit `filename` und `content_base64`                                                                                                                                                                                                                                                                                                      |
| `data.prepaid`                                                                          | integer           | `1` wenn die Bestellung ein physisches (vorausbezahltes) Rezept hat, sonst `0`                                                                                                                                                                                                                                                                                 |

<Warning>
  Das tatsächliche Zahlungsrouting erfolgt erst, wenn die Apothekenbestellung abgeschlossen wird. `projected`-Auszahlungen in Webhook-Payloads sind unverbindlich, werden nur für bezahlte Bestellungen mit physischem Rezept angezeigt und können sich vor Abschluss ändern. `routed`-Auszahlungswerte werden erst nach Abschluss und vorhandenem Routing befüllt.
</Warning>

***

## pharmacy\_order\_updated

Wird gesendet, wenn sich der Status einer bestehenden Apothekenbestellung ändert.

Die Payload-Struktur ist identisch mit `pharmacy_order_created`. Das Feld `status` enthält den neuen Status.

### Payload-Beispiel

```json theme={null}
{
  "event_type": "pharmacy_order_updated",
  "timestamp": 1711910000,
  "payload_version": "1",
  "data": {
    "uid": "po-abc123",
    "status": "in-progress",
    "name": "#1001",
    "data": {},
    "external_status": "IN_PROGRESS",
    "created_at": 1711899000,
    "updated_at": 1711910000,
    "deleted_at": null,
    "pharmacy": {
      "uid": "ph-xyz",
      "display_name": "City Pharmacy"
    },
    "order": {
      "uid": "ord-123",
      "delivery_address": {
        "first_name": "Max",
        "last_name": "Mustermann",
        "street": "Hauptstr.",
        "house_number": "1",
        "zip_code": "10115",
        "city": "Berlin",
        "country": "Germany",
        "additional_address": null,
        "province": null
      },
      "invoice_address": {
        "first_name": "Max",
        "last_name": "Mustermann",
        "street": "Hauptstr.",
        "house_number": "1",
        "zip_code": "10115",
        "city": "Berlin",
        "country": "Germany",
        "additional_address": null,
        "province": null
      },
      "shipping_costs_amount": 499,
      "shipping_costs_currency": "EUR",
      "priority": 5
    },
    "delivery_type": {
      "uid": "dt-001",
      "display_name": "Standard Shipping",
      "identifier": "standard"
    },
    "shop_shipping_methods": [
      {
        "uid": "ssm-001",
        "display_name": "DHL Standard",
        "external_id": "shopify-standard",
        "pharmacy_mapping": {
          "pharmacy_uid": "ph-xyz",
          "shipping_method_identifier_for_pharmacy": "DHL_STANDARD"
        }
      }
    ],
    "order_items": [
      {
        "uid": "oi-789",
        "amount": 1,
        "sku": {
          "uid": "sku-456",
          "display_name": "Medication X 100mg",
          "pzn": "12345678",
          "product_uid": "prod-789",
          "product_display_name": "Medication X",
          "standard_selling_unit": 1.0,
          "unit": "ml",
          "product_handle": "medication-x"
        },
        "pharmacy_sku": {
          "uid": "psku-456",
          "external_id": "EXT-001",
          "price": 1299,
          "stock": 50
        },
        "total_paid_amount": 1299
      }
    ],
    "payouts": [
      {
        "status": "projected",
        "amount": 999,
        "currency": "EUR",
        "component_type": "item_rest",
        "routing_description": "Medication X 100mg item rest",
        "provider_route_id": null,
        "pharmacy_order_uid": "po-abc123",
        "pharmacy_order_name": "#1001",
        "pharmacy_order_created_at": 1711899000,
        "routing_created_at": null
      },
      {
        "status": "projected",
        "amount": 300,
        "currency": "EUR",
        "component_type": "item_markup",
        "routing_description": "Medication X 100mg markup",
        "provider_route_id": null,
        "pharmacy_order_uid": "po-abc123",
        "pharmacy_order_name": "#1001",
        "pharmacy_order_created_at": 1711899000,
        "routing_created_at": null
      },
      {
        "status": "projected",
        "amount": 499,
        "currency": "EUR",
        "component_type": "shipping",
        "routing_description": "Standard Shipping",
        "provider_route_id": null,
        "pharmacy_order_uid": "po-abc123",
        "pharmacy_order_name": "#1001",
        "pharmacy_order_created_at": 1711899000,
        "routing_created_at": null
      }
    ],
    "patient_data": {
      "uid": "pat-123",
      "display_name": "Max Mustermann",
      "email": "max@example.com",
      "date_of_birth": "15.06.1990",
      "phone_number": "+49 170 1234567"
    },
    "doctor_data": {
      "uid": "doc-456",
      "display_name": "Dr. Schmidt"
    },
    "prescription_file": {
      "filename": "prescription_001.pdf",
      "content_base64": "JVBERi0xLjQK..."
    },
    "prepaid": 1
  }
}
```

### Webhooks auf Organisationsebene

Wenn das Webhook-Abonnement über die Management API (auf Organisationsebene) erstellt wurde, enthalten Bestellereignisse zusätzliche Daten:

* Die `sku`-Objekte in `order_items` und `fulfillment.items` werden um Shopify-Bezeichner (`shop_variation_id`, `shop_product_external_id`) erweitert.
* Ein `fulfillment`-Objekt mit Details zur Fulfillment-Bestellung wird hinzugefügt.

```json theme={null}
{
  "event_type": "pharmacy_order_updated",
  "timestamp": 1711910000,
  "payload_version": "1",
  "data": {
    "uid": "po-abc123",
    "status": "in-progress",
    "...": "... gleiche Felder wie oben ...",
    "order_items": [
      {
        "uid": "oi-789",
        "amount": 1,
        "sku": {
          "uid": "sku-456",
          "display_name": "Medication X 100mg",
          "pzn": "12345678",
          "product_uid": "prod-789",
          "product_display_name": "Medication X",
          "standard_selling_unit": 1.0,
          "unit": "ml",
          "product_handle": "medication-x",
          "shop_variation_id": "48372910234",
          "shop_product_external_id": "93847261045"
        },
        "pharmacy_sku": {
          "uid": "psku-456",
          "external_id": "EXT-001",
          "price": 1299,
          "stock": 50
        },
        "total_paid_amount": 1299
      }
    ],
    "fulfillment": {
      "uid": "fo-abc123",
      "external_id": "EXT-FO-001",
      "items": [
        {
          "uid": "foi-001",
          "amount": 1,
          "status": "init",
          "external_id": "EXT-FOI-001",
          "order_item": {
            "uid": "oi-789",
            "amount": 1,
            "sku": {
              "uid": "sku-456",
              "display_name": "Medication X 100mg",
              "pzn": "12345678",
              "product_uid": "prod-789",
              "product_display_name": "Medication X",
              "standard_selling_unit": 1.0,
              "unit": "ml",
              "product_handle": "medication-x",
              "shop_variation_id": "48372910234",
              "shop_product_external_id": "93847261045"
            }
          }
        }
      ],
      "order": {
        "uid": "ord-123",
        "shop_order": {
          "uid": "so-456",
          "external_id": "SHOP-789",
          "shop_identifier": "my-shopify-store"
        }
      }
    }
  }
}
```

| Feld                                                               | Typ              | Beschreibung                                   |
| ------------------------------------------------------------------ | ---------------- | ---------------------------------------------- |
| `data.order_items[].sku.shop_variation_id`                         | string oder null | Shopify-Varianten-ID                           |
| `data.order_items[].sku.shop_product_external_id`                  | string oder null | Shopify-Produkt-ID                             |
| `data.fulfillment.uid`                                             | string           | UID der Fulfillment-Bestellung                 |
| `data.fulfillment.external_id`                                     | string oder null | Externer Bezeichner der Fulfillment-Bestellung |
| `data.fulfillment.items[].order_item.sku.shop_variation_id`        | string oder null | Shopify-Varianten-ID                           |
| `data.fulfillment.items[].order_item.sku.shop_product_external_id` | string oder null | Shopify-Produkt-ID                             |
| `data.fulfillment.order.uid`                                       | string           | UID der übergeordneten Bestellung              |
| `data.fulfillment.order.shop_order.uid`                            | string           | UID der Shop-Bestellung                        |
| `data.fulfillment.order.shop_order.external_id`                    | string oder null | Externer Bezeichner der Shop-Bestellung        |
| `data.fulfillment.order.shop_order.shop_identifier`                | string           | Shop-Bezeichner                                |

<Note>
  Das `fulfillment`-Feld und die Shopify-Bezeichner (`shop_variation_id`, `shop_product_external_id`) in `sku`-Objekten sind nur in Webhook-Zustellungen auf Organisationsebene enthalten. Webhooks auf Apothekenebene enthalten diese Felder nicht.
</Note>

***

## pharmacy\_sku\_stock\_updated

Wird gesendet, wenn sich der Lagerbestand einer Apotheken-SKU ändert. Dies umfasst:

* Direkte Bestandsaktualisierungen über die Pharmacy-API (`PATCH /v1/.../pharmacy_skus/{uid}/stock` oder Inventar-Endpunkte).
* Automatische Bestandsreduzierung bei Abschluss einer Apothekenbestellung. Dies wird sowohl beim manuellen Abschluss (über die Apotheken-Oberfläche / API) als auch beim automatischen Abschluss ausgelöst, wenn RxScale über die Statusabfrage-Integration mit dem Backend der Apotheke erkennt, dass die Bestellung versendet oder abgeschlossen wurde. Pro Apotheken-SKU der abgeschlossenen Bestellung wird ein Event emittiert.

### Payload-Beispiel

```json theme={null}
{
  "event_type": "pharmacy_sku_stock_updated",
  "timestamp": 1711900000,
  "payload_version": "1",
  "data": {
    "uid": "psku-abc123",
    "pharmacy_uid": "ph-xyz",
    "sku_uid": "sku-456",
    "external_id": "EXT-001",
    "price": 1299,
    "stock": 45,
    "reserved_amount": 7,
    "markup": 0,
    "priority": 0,
    "type": "default",
    "created_at": 1711800000,
    "updated_at": 1711900000,
    "deleted_at": null,
    "sku": {
      "uid": "sku-456",
      "display_name": "Medication X 100mg",
      "pzn": "12345678",
      "product_uid": "prod-789",
      "product_display_name": "Medication X",
      "standard_selling_unit": 1.0,
      "unit": "ml",
      "product_handle": "medication-x"
    }
  }
}
```

### Feldreferenz

| Feld                             | Typ               | Beschreibung                                                                                                                                                                                                                                                              |
| -------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `data.uid`                       | string            | UID der Apotheken-SKU                                                                                                                                                                                                                                                     |
| `data.pharmacy_uid`              | string            | UID der Apotheke                                                                                                                                                                                                                                                          |
| `data.sku_uid`                   | string            | UID der SKU                                                                                                                                                                                                                                                               |
| `data.external_id`               | string oder null  | Externer Bezeichner in Ihrem eigenen System                                                                                                                                                                                                                               |
| `data.price`                     | integer           | Preis in Cent                                                                                                                                                                                                                                                             |
| `data.stock`                     | integer           | Aktueller Lagerbestand                                                                                                                                                                                                                                                    |
| `data.reserved_amount`           | integer           | Für diese SKU reservierte Einheiten — Summe der Bestellpositionsmengen aller in Bearbeitung befindlichen Apothekenbestellungen (also Bestellungen, die weder abgeschlossen noch storniert sind). Verfügbarer Bestand kann als `stock - reserved_amount` berechnet werden. |
| `data.markup`                    | integer           | Aufschlagswert                                                                                                                                                                                                                                                            |
| `data.priority`                  | integer           | Prioritätsstufe                                                                                                                                                                                                                                                           |
| `data.type`                      | string            | Typ der Apotheken-SKU                                                                                                                                                                                                                                                     |
| `data.created_at`                | integer           | Unix-Zeitstempel der Erstellung                                                                                                                                                                                                                                           |
| `data.updated_at`                | integer           | Unix-Zeitstempel der letzten Aktualisierung                                                                                                                                                                                                                               |
| `data.deleted_at`                | integer oder null | Unix-Zeitstempel der Löschung oder `null`                                                                                                                                                                                                                                 |
| `data.sku`                       | object            | Verschachtelte SKU- und Produktinformationen                                                                                                                                                                                                                              |
| `data.sku.uid`                   | string            | UID der SKU                                                                                                                                                                                                                                                               |
| `data.sku.display_name`          | string            | Anzeigename der SKU                                                                                                                                                                                                                                                       |
| `data.sku.pzn`                   | string            | Pharmazentralnummer (PZN)                                                                                                                                                                                                                                                 |
| `data.sku.product_uid`           | string            | UID des übergeordneten Produkts                                                                                                                                                                                                                                           |
| `data.sku.product_display_name`  | string oder null  | Anzeigename des übergeordneten Produkts                                                                                                                                                                                                                                   |
| `data.sku.standard_selling_unit` | number oder null  | Standard-Verkaufseinheit der SKU                                                                                                                                                                                                                                          |
| `data.sku.unit`                  | string oder null  | Einheit der SKU, z.B. `ml` oder `g`                                                                                                                                                                                                                                       |
| `data.sku.product_handle`        | string oder null  | URL-Handle/Slug des übergeordneten Produkts                                                                                                                                                                                                                               |

### Webhooks auf Organisationsebene

Wenn das Webhook-Abonnement über die Management API (auf Organisationsebene) erstellt wurde, enthalten Lagerbestandsereignisse zusätzliche Daten:

* Das `sku`-Objekt wird um Shopify-Bezeichner (`shop_variation_id`, `shop_product_external_id`) erweitert.
* Ein `shop_identifier`-Feld wird auf der `data`-Ebene hinzugefügt.

```json theme={null}
{
  "event_type": "pharmacy_sku_stock_updated",
  "timestamp": 1711900000,
  "payload_version": "1",
  "data": {
    "uid": "psku-abc123",
    "pharmacy_uid": "ph-xyz",
    "sku_uid": "sku-456",
    "external_id": "EXT-001",
    "price": 1299,
    "stock": 45,
    "reserved_amount": 7,
    "markup": 0,
    "priority": 0,
    "type": "default",
    "created_at": 1711800000,
    "updated_at": 1711900000,
    "deleted_at": null,
    "shop_identifier": "my-shopify-store",
    "sku": {
      "uid": "sku-456",
      "display_name": "Medication X 100mg",
      "pzn": "12345678",
      "product_uid": "prod-789",
      "product_display_name": "Medication X",
      "standard_selling_unit": 1.0,
      "unit": "ml",
      "product_handle": "medication-x",
      "shop_variation_id": "48372910234",
      "shop_product_external_id": "93847261045"
    }
  }
}
```

| Feld                                | Typ              | Beschreibung         |
| ----------------------------------- | ---------------- | -------------------- |
| `data.shop_identifier`              | string oder null | Shop-Bezeichner      |
| `data.sku.shop_variation_id`        | string oder null | Shopify-Varianten-ID |
| `data.sku.shop_product_external_id` | string oder null | Shopify-Produkt-ID   |

<Note>
  Das `shop_identifier`-Feld und die Shopify-Bezeichner (`shop_variation_id`, `shop_product_external_id`) im `sku`-Objekt sind nur in Webhook-Zustellungen auf Organisationsebene enthalten. Webhooks auf Apothekenebene enthalten diese Felder nicht.
</Note>

***

## appointment\_reminder\_due

Wird gesendet, wenn eine konfigurierte Terminerinnerung fällig wird. Dieses Ereignis wird ausschließlich an Webhook-Abonnements auf Organisationsebene geliefert.

### Payload-Beispiel

```json theme={null}
{
  "event_type": "appointment_reminder_due",
  "timestamp": 1893452400,
  "payload_version": "1",
  "data": {
    "appointment_uid": "appt-e2e-123",
    "organisation_uid": "org-abc123",
    "shop_uid": "shop-e2e-1",
    "appointment_type_reminder_uid": "reminder-e2e-1",
    "recipient_role": "doctor",
    "recipient_email": "doctor@example.com",
    "recipient_phone_number": "+491701234567",
    "recipient_display_name": "Dr. Grace Hopper",
    "patient_uid": "patient-e2e-1",
    "patient_display_name": "Ada Lovelace",
    "doctor_uid": "doctor-e2e-1",
    "doctor_display_name": "Dr. Grace Hopper",
    "appointment_type_uid": "type-e2e-1",
    "appointment_type_name": "Consultation",
    "visit_reason": "Medikationsreview vor Dosisanpassung",
    "start_date": 1893456000,
    "end_date": 1893457800,
    "minutes_before": 60,
    "send_email": true,
    "send_sms": false
  }
}
```

### Feldreferenz

| Feld                                 | Typ               | Beschreibung                                                                     |
| ------------------------------------ | ----------------- | -------------------------------------------------------------------------------- |
| `data.appointment_uid`               | string            | UID des geplanten Termins                                                        |
| `data.organisation_uid`              | string            | UID der Organisation, zu der der Termin gehört                                   |
| `data.shop_uid`                      | string oder null  | Shop-UID des Patienten, falls verfügbar                                          |
| `data.appointment_type_reminder_uid` | string            | UID der Erinnerungsregel                                                         |
| `data.recipient_role`                | string            | Empfängerrolle: `patient`, `doctor` oder `admin`                                 |
| `data.recipient_email`               | string oder null  | Aufgelöste Empfänger-E-Mail, falls verfügbar                                     |
| `data.recipient_phone_number`        | string oder null  | Aufgelöste Empfänger-Telefonnummer, falls verfügbar                              |
| `data.recipient_display_name`        | string oder null  | Aufgelöster Anzeigename des Empfängers                                           |
| `data.patient_uid`                   | string            | Patientenprofil-UID                                                              |
| `data.patient_display_name`          | string            | Anzeigename des Patienten                                                        |
| `data.doctor_uid`                    | string            | Arzt-UID                                                                         |
| `data.doctor_display_name`           | string            | Anzeigename des Arztes                                                           |
| `data.appointment_type_uid`          | string oder null  | UID des Termintyps                                                               |
| `data.appointment_type_name`         | string oder null  | Name des Termintyps                                                              |
| `data.visit_reason`                  | string oder null  | Optionaler bei der Buchung angegebener Termingrund                               |
| `data.start_date`                    | integer           | Startzeit des Termins (Unix-Zeitstempel)                                         |
| `data.end_date`                      | integer oder null | Endzeit des Termins (Unix-Zeitstempel), falls bekannt                            |
| `data.minutes_before`                | integer           | Erinnerungsvorlauf in Minuten vor dem Termin                                     |
| `data.send_email`                    | boolean           | Ob der RxScale-Notification-Handler für diese Erinnerung eine E-Mail senden soll |
| `data.send_sms`                      | boolean           | Ob der RxScale-Notification-Handler für diese Erinnerung eine SMS senden soll    |

***

## patient\_doctor\_meeting\_updated

Wird gesendet, wenn eine Patient-Arzt-Besprechung ihren Lebenszyklus-Status ändert. Dieses Ereignis wird ausschließlich an Webhook-Abonnements auf Organisationsebene geliefert (registriert über die Management API).

**Mögliche `change`-Werte:**

| Wert        | Wann ausgelöst                                                                                                                                |
| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `held`      | Ein geplanter Termin wurde gehalten (das Besprechungsfenster öffnete sich)                                                                    |
| `confirmed` | Ein geplanter Termin wurde bestätigt                                                                                                          |
| `expired`   | Ein geplanter Termin ist abgelaufen, ohne beigetreten zu sein                                                                                 |
| `cancelled` | Eine Besprechung wurde storniert                                                                                                              |
| `rebooked`  | Eine Besprechung wurde umgebucht (eine neue Besprechung hat diese ersetzt)                                                                    |
| `completed` | Eine Besprechung wurde abgeschlossen — eine On-Demand-Besprechung endete oder ein Arzt hat einen bestätigten Termin als abgeschlossen erfasst |
| `no_show`   | Ein Arzt hat einen bestätigten Termin als Nichterscheinen erfasst (der Patient ist nicht erschienen)                                          |

<Note>
  Verwenden Sie `change` als maßgeblichen Indikator für das eingetretene Ereignis. `status` spiegelt den aktuellen Datenbankstatus der Besprechung wider und ist bei On-Demand-Besprechungen `null`.
</Note>

### Payload-Beispiel

```json theme={null}
{
  "event_type": "patient_doctor_meeting_updated",
  "timestamp": 1893456000,
  "payload_version": "1",
  "data": {
    "organisation_uid": "org-abc123",
    "meeting_uid": "m-e2e-1",
    "change": "confirmed",
    "status": "confirmed",
    "meeting_type": "consultation",
    "meeting_format": "digital",
    "start_date": 1893456000,
    "end_date": 1893456900,
    "estimated_duration_minutes": 15,
    "confirmed_at": 1893450000,
    "cancelled_at": null,
    "cancellation_reason": null,
    "visit_reason": "Medikationsreview vor Dosisanpassung",
    "expires_at": null,
    "previous_meeting_uid": null,
    "appointment_type_uid": "at-1",
    "doctor_uid": "doc-1",
    "patient_profile_uid": "pat-1"
  }
}
```

### Feldreferenz

| Feld                              | Typ               | Beschreibung                                                                                                                                                               |
| --------------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `data.organisation_uid`           | string            | UID der Organisation, zu der die Besprechung gehört                                                                                                                        |
| `data.meeting_uid`                | string            | Eindeutiger Bezeichner der Besprechung                                                                                                                                     |
| `data.change`                     | string            | Der Lebenszyklus-Übergang, der dieses Ereignis ausgelöst hat — siehe Tabelle oben                                                                                          |
| `data.status`                     | string oder null  | Aktueller Status der Besprechung. `null` bei On-Demand-Besprechungen; verwenden Sie stattdessen `change` für die Logik                                                     |
| `data.meeting_type`               | string            | Art der Besprechung (z.B. `consultation`)                                                                                                                                  |
| `data.meeting_format`             | string            | Format der Besprechung (z.B. `digital`)                                                                                                                                    |
| `data.start_date`                 | integer oder null | Unix-Zeitstempel des geplanten Starts (nur bei geplanten Terminen)                                                                                                         |
| `data.end_date`                   | integer oder null | Unix-Zeitstempel des geplanten Endes bei geplanten Terminen. Dies ist der ursprünglich geplante Endzeitpunkt, nicht das tatsächliche Ende                                  |
| `data.estimated_duration_minutes` | integer oder null | Geschätzte Dauer in Minuten                                                                                                                                                |
| `data.confirmed_at`               | integer oder null | Unix-Zeitstempel der Bestätigung oder `null`                                                                                                                               |
| `data.cancelled_at`               | integer oder null | Unix-Zeitstempel der Stornierung oder `null`                                                                                                                               |
| `data.cancellation_reason`        | string oder null  | Grund für die Stornierung oder `null`                                                                                                                                      |
| `data.visit_reason`               | string oder null  | Optionaler bei der Buchung angegebener Termingrund. Kann auch in Erinnerungen und synchronisierten Kalendereinladungen erscheinen                                          |
| `data.expires_at`                 | integer oder null | Unix-Zeitstempel, nach dem der Besprechungslink abläuft, oder `null`                                                                                                       |
| `data.previous_meeting_uid`       | string oder null  | UID der Besprechung, aus der diese umgebucht wurde, oder `null`. Gesetzt wenn `change` den Wert `rebooked` hat                                                             |
| `data.appointment_type_uid`       | string oder null  | UID des Termintyps (nur bei geplanten Terminen)                                                                                                                            |
| `data.doctor_uid`                 | string oder null  | UID des zugeordneten Arztes                                                                                                                                                |
| `data.patient_profile_uid`        | string            | UID des Patientenprofils. Dies ist der einzige Patientenbezeichner im Payload — es werden keine personenbezogenen Daten (Name, Geburtsdatum oder Kontaktdaten) übermittelt |

### Abonnieren

Abonnieren Sie über die Management API, um dieses Ereignis zu empfangen:

```bash theme={null}
curl -X POST "https://api.rxscale.com/v1/management/notification-subscriptions/" \
  -H "X-API-Key: your-api-key-here" \
  -H "Content-Type: application/json" \
  -d '{
    "notification_type": "patient_doctor_meeting_updated",
    "target": "https://your-system.com/webhooks/rxscale"
  }'
```

### Zustellung und Idempotenz

Webhooks werden mindestens einmal zugestellt. Ihr Endpunkt sollte Zustellungen als idempotent behandeln und die Kombination aus `data.meeting_uid` und `data.change` als eindeutigen Schlüssel verwenden — erneut zugestellte Events tragen dieselben Werte.
