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

# n8n

> Agent uruchamia workflow n8n w trakcie rozmowy i przekazuje rozmówcy to, co workflow odpowie. Plus: zdarzenia po rozmowie i wyzwalanie połączeń z n8n.

n8n łączy się z BrosBots w trzy strony. Ta strona opisuje pierwszą, która jest
osobną integracją w katalogu, i wskazuje, gdzie są pozostałe dwie.

| Kierunek | Co to robi | Gdzie |
| - | - | - |
| **Agent → n8n w trakcie rozmowy** | Agent wywołuje workflow z danymi z rozmowy i **słyszy odpowiedź** workflow | ta strona |
| **BrosBots → n8n po zdarzeniu** | Podpisany `POST` po rozmowie, SMS-ie, kampanii, przy niskim saldzie | [Webhooki](/pl/integrations/webhooks) |
| **n8n → BrosBots** | n8n każe agentowi zadzwonić: do leada z formularza albo przez API | [Oddzwanianie do leadów](/pl/integrations/leads/lead-webhook), [Wyzwalacz API](/pl/voice-agent/api-trigger) |

## Czym różni się od Zapiera

Wyzwalacz Zapier wysyła dane i na tym koniec: Catch Hook nie odpowiada.
Workflow n8n zakończony węzłem **Respond to Webhook** odpowiada, a to, co
odpowie, trafia do agenta jako wynik narzędzia. Agent może więc nie tylko
przekazać coś do Waszych systemów, ale też **o coś je zapytać** jeszcze na
linii: o stan zamówienia w sklepie, wolny termin w systemie rezerwacji, kartę
klienta w bazie, do której nie mamy gotowej integracji.

Workflow bez węzła Respond to Webhook też działa: n8n odpowiada pustym `200`,
agent dostaje „wysłano” i mówi dalej.

## Podłączenie

<Steps>
  <Step title="Workflow w n8n">
    Nowy workflow → węzeł **Webhook**. Ustaw **HTTP Method** na `POST`.
    Jeśli workflow ma odpowiadać agentowi, ustaw **Respond** na
    `Using 'Respond to Webhook' Node` i zakończ workflow węzłem
    **Respond to Webhook**.

    Zalecane: **Authentication** → `Header Auth`, nowe poświadczenie z nazwą
    nagłówka `X-Brosbots-Secret` i dowolną długą wartością. Ten sam sekret
    wpiszesz po naszej stronie.
  </Step>

  <Step title="Włącz workflow i skopiuj adres produkcyjny">
    Przełącznik **Active** w prawym górnym rogu, potem w węźle Webhook
    zakładka **Production URL**. Adres ma w ścieżce `/webhook/`.

    <Warning>
      Adres z zakładki **Test URL** (ścieżka `/webhook-test/`) działa tylko,
      gdy w edytorze jest wciśnięte **Listen for test event**. Podłączony do
      agenta zadziała raz, na Twoim biurku, i nigdy więcej. Test połączenia
      ostrzega, gdy wklejony adres jest testowy.
    </Warning>
  </Step>

  <Step title="Połączenie w BrosBots">
    **Integracje** → **n8n**. Wklej adres produkcyjny i sekret, jeśli go
    ustawiłeś. Zapis wysyła wiadomość testową, więc workflow uruchomi się raz
    z `"event": "test"` w treści.
  </Step>

  <Step title="Włącz narzędzie w agencie">
    Edytor agenta → **Integracje** → **Workflow n8n**. Wybierz połączenie i
    wypełnij **Kiedy i co wysłać** oraz **Zdania, po których ma zadziałać**.
    Bez tych pól agent ma narzędzie, ale nie wie, po co - i zwykle go nie
    użyje. Szczegóły w [Slack, e-mail, Zapier i kalendarz w trakcie
    rozmowy](/pl/integrations/overview#slack-e-mail-zapier-i-kalendarz-w-trakcie-rozmowy).
  </Step>
</Steps>

Ten sam przełącznik jest też w kreatorze nowego agenta (**Co agent potrafi**
→ **Workflow n8n**): wpisany tam adres i sekret tworzą połączenie przy
zapisie.

<Note>
  Integracja n8n jest dostępna od planu **Start**, tak jak Zapier i webhooki.
</Note>

## Co przychodzi do workflow

Agent wysyła `POST` z JSON-em. Pola `event` i `data` wymyśla sam, zgodnie z
tym, co wpisałeś w **Kiedy i co wysłać**; pozostałe dwa dokładamy my, więc
agent nie może ich zmyślić.

```json theme={null}
{
  "event": "order_status",
  "data": "numer zamówienia 10482, klient pyta o datę dostawy",
  "caller_phone": "+48600100200",
  "workflow_run_id": "3f1c2a7e-...."
}
```

| Pole | Skąd |
| - | - |
| `event` | krótka nazwa zdarzenia od agenta, np. `lead_qualified`, `order_status`, `appointment_booked` |
| `data` | to, co agent zebrał w rozmowie, albo o co pyta - wolny tekst |
| `caller_phone` | numer rozmówcy (pusty w rozmowie z widgetu) |
| `workflow_run_id` | id rozmowy; ten sam, który przychodzi później w `call.completed` i którym pobierzesz transkrypcję przez API |

Z nagłówkiem `X-Brosbots-Secret`, jeśli połączenie ma sekret.

## Co może odpowiedzieć workflow

Treść odpowiedzi trafia do agenta w polu `result`. Najwygodniej odpowiadać
jednym zdaniem, które agent ma przekazać:

```json theme={null}
{ "message": "Zamówienie 10482 zostało wysłane wczoraj, dostawa jutro do 14:00." }
```

Obsługiwane kształty:

| Odpowiedź | Co dostaje agent |
| - | - |
| `{"message": "…"}` (też `result`, `answer`, `text`) | sam tekst |
| zwykły tekst | tekst bez zmian |
| dowolny inny JSON | JSON w całości, do 2000 znaków - agent sam go odczyta |
| pusta odpowiedź | „wysłano”, bez wyniku |

Agent czeka na odpowiedź do **15 sekund**. Rozmowa trwa, więc jeśli workflow
robi coś długiego, odpowiedz od razu, a resztę zrób po odpowiedzi (w n8n:
Respond to Webhook wcześniej w łańcuchu, ciężkie węzły po nim).

Kod `4xx`/`5xx` to błąd narzędzia: agent dostaje „n8n failed (kod)” i mówi
rozmówcy, że nie udało się sprawdzić. `404` na adresie testowym jest nazwany
wprost: nikt nie nasłuchuje.

## Gotowy workflow do importu

Minimalny workflow: Webhook → Respond to Webhook. Odpowiada potwierdzeniem i
powtarza, co dostał, więc od razu widać w rozmowie, że droga działa. W n8n:
**…** (menu workflow) → **Import from File** albo wklej JSON przez
**Import from URL** / schowek.

```json theme={null}
{
  "name": "BrosBots - odpowiedź dla agenta",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "brosbots-agent",
        "responseMode": "responseNode",
        "options": {}
      },
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [0, 0]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ { \"message\": \"Przyjąłem zdarzenie \" + $json.body.event + \": \" + $json.body.data } }}",
        "options": {}
      },
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [300, 0]
    }
  ],
  "connections": {
    "Webhook": { "main": [[{ "node": "Respond to Webhook", "type": "main", "index": 0 }]] }
  }
}
```

Między te dwa węzły wstaw to, co ma się naprawdę wydarzyć: zapytanie do
sklepu, HubSpot, arkusz, własne API. Dane z agenta są pod `$json.body.event`
i `$json.body.data`.

## Zdarzenia po rozmowie w n8n

To osobna integracja, **Webhook po rozmowie** z katalogu, i osobny workflow:
węzeł **Webhook** z metodą `POST`, adres produkcyjny wklejony w kreatorze
webhooka. Przychodzi `call.completed` z transkrypcją, podsumowaniem i wynikiem,
a na życzenie też SMS-y, kampanie i `balance.low`; format i lista zdarzeń w
[Webhookach](/pl/integrations/webhooks).

Podpisu `X-Brosbots-Signature` w n8n zwykle się nie sprawdza, bo adres jest
tajny sam w sobie. Jeśli chcesz: w węźle Webhook włącz **Raw Body**, policz
HMAC-SHA256 z surowej treści węzłem **Crypto** (Action `Hmac`, Type `SHA256`,
Encoding `Hex`, Secret = Twój klucz `whsec_…`) i porównaj z nagłówkiem po
odcięciu `sha256=`.

## Rozwiązywanie problemów

| Objaw | Przyczyna | Co zrobić |
| - | - | - |
| Test połączenia: „adres testowy” | wklejony `/webhook-test/` | włącz workflow, wklej **Production URL** |
| Test: n8n zwrócił `403` | Header Auth w węźle, a sekret w połączeniu inny albo pusty | wpisz ten sam sekret po obu stronach; nazwa nagłówka to `X-Brosbots-Secret` |
| Test: n8n zwrócił `404` na adresie produkcyjnym | workflow nieaktywny albo zmieniona ścieżka | przełącznik **Active**, skopiuj adres jeszcze raz |
| Agent mówi, że nie udało się sprawdzić | workflow zwrócił błąd albo nie odpowiedział w 15 s | **Executions** w n8n pokaże, który węzeł padł; przenieś Respond to Webhook przed długie węzły |
| Agent nie używa narzędzia | puste **Kiedy i co wysłać** | opisz, kiedy ma wywołać workflow i co przekazać |
| Agent przekazuje surowy JSON | workflow odpowiada całym rekordem | odpowiadaj `{"message": "…"}` z gotowym zdaniem |

Każde wywołanie widać w n8n w **Executions**, z treścią, która przyszła od
agenta.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.