# Eingehender Webhook

> Wie ein anderes System (CRM, Formular, ERP, n8n, Zapier) einen Workflow der Community startet, indem es eine Adresse von Memberfy aufruft. Adresse erstellen, rotieren und widerrufen, der Token im Header, die HMAC-Signatur mit Beispielen in curl und Node, wie die Person gefunden wird, die Variablen des Auslösers, die Antworten und die Zustellungen.

Der **eingehende Webhook** ist der umgekehrte Weg der [Webhooks](/api/webhooks): Statt dass Memberfy ein anderes System benachrichtigt, ruft ein anderes System (ein CRM, ein Formular, ein ERP, eine Automatisierung in n8n oder Zapier) eine Adresse von Memberfy auf und startet einen [Workflow](/notificacoes/workflows) für eine Person der Community. Zum Beispiel: Das CRM schließt einen Verkauf ab, und die Person erhält die Willkommensserie für Kunden.

## Die Adresse erstellen

*Rolle: Eigentümer oder Administrator.*

1. Öffne unter **Verwaltung › Workflows** den Workflow und zieh den Auslöser-Block **Webhook** (*Webhook empfangen*) in den Entwurf. Jeder Workflow hat nur einen Auslöser.
2. Gib unter **Wer die Person ist** an, wo die Person im JSON des Aufrufs steht: **Per E-Mail** oder **Per memberId**, und den **Pfad im JSON** (Felder durch Punkte getrennt, etwa `contact.email`, ohne Listenindizes).
3. Ordne unter **Werte für die Schritte**, wenn du willst, bis zu 20 Werte aus dem JSON zu (**Name** und Pfad).
4. **Speichere** den Workflow und klicke im Bereich des Auslösers auf **Adresse erstellen**.

Das Fenster zeigt die **Adresse**, den **Token** und das **Signaturgeheimnis (HMAC)** nur ein einziges Mal: *„Jetzt sichern: Token und Geheimnis werden nur dieses eine Mal gezeigt.“* Danach zeigt der Bereich nur noch das Ende von Token und Geheimnis.

- **Rotieren** erzeugt einen neuen Token und ein neues Geheimnis, die sofort gelten; das System, das die aktuelle Adresse aufruft, funktioniert erst wieder, wenn es die neuen erhält.
- **Widerrufen** schaltet die Adresse sofort ab: Aufrufe werden ab dann abgelehnt.

## Die Adresse aufrufen

Sende einen `POST` mit JSON-Inhalt (`Content-Type: application/json`, bis 64 KB) an `https://api.memberfy.net/api/workflow-hooks`, mit:

| Header | Was es ist |
|---|---|
| `X-Memberfy-Hook-Token` | Der Token des Auslösers. Sende ihn immer im Header: In der Adresse (`/api/workflow-hooks/{token}`) funktioniert er auch, landet aber in Logs |
| `X-Memberfy-Signature` | Die Signatur, `t=<unix>,v1=<hex>` (siehe unten) |
| `X-Memberfy-Delivery-Id` | Eine eindeutige Kennung des Aufrufs (bis 64 Buchstaben, Ziffern, `-` und `_`). Wird sie innerhalb von 10 Minuten wiederholt, wird der Aufruf abgelehnt |

### Die Signatur (HMAC)

Mit **Signatur verlangen (HMAC)** eingeschaltet (der Standard) kann nur starten, wer das Geheimnis hat. Die Signatur ist Pflicht, wenn der Weg des Auslösers Inhalte sendet (E-Mail, Nachricht, Kommentar, Reaktion oder Slack): Ohne sie lässt sich der Workflow nicht einschalten.

So signierst du:

1. `t` ist die aktuelle Zeit in Sekunden (Unix). Sie gilt **5 Minuten** nach vorne oder hinten.
2. Berechne den HMAC-SHA256 in Hexadezimal mit dem Geheimnis über `t`, einen Punkt und den **rohen Inhalt**, genau die Bytes, die im Aufruf gesendet werden: `"<t>.<inhalt>"`.
3. Sende `X-Memberfy-Signature: t=<t>,v1=<hmac>`.

**curl:**

```bash
SECRET='das-geheimnis-des-ausloesers'
TOKEN='der-token-des-ausloesers'
BODY='{"customer":{"email":"maria@memberfy.net"},"plan":{"name":"Anual"}}'
T=$(date +%s)
SIG=$(printf '%s.%s' "$T" "$BODY" | openssl dgst -sha256 -hmac "$SECRET" -hex | sed 's/^.* //')

curl -X POST https://api.memberfy.net/api/workflow-hooks \
  -H 'Content-Type: application/json' \
  -H "X-Memberfy-Hook-Token: $TOKEN" \
  -H "X-Memberfy-Signature: t=$T,v1=$SIG" \
  -H "X-Memberfy-Delivery-Id: crm-$(date +%s%N)" \
  --data "$BODY"
```

**Node:**

```js
const crypto = require('crypto');

async function startWorkflow(payload) {
  const body = JSON.stringify(payload); // signiere genau das, was im Aufruf gesendet wird
  const t = Math.floor(Date.now() / 1000);
  const v1 = crypto
    .createHmac('sha256', process.env.MEMBERFY_HOOK_SECRET)
    .update(`${t}.${body}`)
    .digest('hex');

  const res = await fetch('https://api.memberfy.net/api/workflow-hooks', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-Memberfy-Hook-Token': process.env.MEMBERFY_HOOK_TOKEN,
      'X-Memberfy-Signature': `t=${t},v1=${v1}`,
      'X-Memberfy-Delivery-Id': crypto.randomUUID(),
    },
    body,
  });
  return res.status; // 202, wenn angenommen
}

startWorkflow({ customer: { email: 'maria@memberfy.net' }, plan: { name: 'Anual' } });
```

## Die Person und die Variablen

- Memberfy sucht die Person **nach** der Antwort, per E-Mail oder per `memberId` im eingestellten Pfad. Sie muss Mitglied der Community sein; sonst steht die Zustellung als *Person nicht gefunden* da.
- Nur die zugeordneten Werte werden gespeichert, im Durchlauf der Person; der Rest des Inhalts wird verworfen.
- Jeder Wert wird zur Variable `{{gatilho_<nome>}}`, zum Beispiel `{{gatilho_plano}}`. Sie gilt im Text der Nachrichten, der Kommentare und von Slack und **im Inhalt** der E-Mails, nie im Betreff und nie in Links.
- **Wie oft eine Person eintritt** gilt wie bei jedem Auslöser, und jede Person tritt über den Webhook jedes Workflows höchstens **5 Mal pro Tag** ein.
- Ein Aufruf mit dem Header `X-Memberfy-Run-Id` eines Durchlaufs desselben Workflows (ein externes System, das den Aufruf des Workflows zurückschickt) wird ignoriert, damit keine Schleife entsteht. Die Slack-Posts eines Workflows tragen diesen Header.

## Antworten

| Status | Wann |
|---|---|
| `202` | Token und Signatur gelten. Die Antwort ist dieselbe, ob die Person gefunden wird oder nicht; das Ergebnis erscheint in den Zustellungen |
| `401` | Signatur fehlt, ist falsch oder liegt außerhalb der 5 Minuten |
| `404` | Token unbekannt, widerrufen oder von einem gelöschten Workflow |
| `409` | `X-Memberfy-Delivery-Id` innerhalb von 10 Minuten wiederholt |
| `413` | Inhalt über 64 KB |
| `429` | Mehr als 60 Aufrufe pro Minute oder 5.000 pro Tag an dieselbe Adresse; warte auf `Retry-After` |
| `503` | Die Prüfung auf Wiederholung ist gerade nicht verfügbar; versuche es erneut |

## Zustellungen

Im Bereich des Auslösers listet **Zustellungen** jeden empfangenen Aufruf mit dem Ergebnis: **Gestartet**, **In der Warteschlange**, **Person nicht gefunden**, **Workflow aus**, **Schon eingetreten**, **Tageslimit der Person**, **Unsigniert** oder **Wiederholter Aufruf (Schleife)**.

## Über den Assistenten (MCP)

Eigentümer und Administrator erstellen (`create_workflow_webhook`: Token und Geheimnis erscheinen einmal), rotieren und widerrufen (`rotate_workflow_webhook` und `revoke_workflow_webhook`, mit Bestätigung); das Team sieht die Adresse (`get_workflow_webhook`, nie den Token) und die Zustellungen (`list_workflow_webhook_deliveries`). Siehe [Werkzeuge · Community und Struktur](/mcp/ferramentas-comunidade#workflows).

## Verwandte Artikel

- [Workflows](/notificacoes/workflows)
- [Webhooks](/api/webhooks)
- [Zapier, Make und n8n](/integracoes/zapier-make-n8n)
