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

# Wzbogacanie e-maili (n8n)

> Zbuduj workflow w n8n, który wzbogaca kontakty z Google Sheets o zweryfikowane adresy e-mail za pomocą API Email Finder i Email Verifier od Enrow

Ten przewodnik przeprowadzi Cię przez budowę workflow w n8n, który odczytuje kontakty z arkusza Google Sheet, znajduje służbowe adresy e-mail za pomocą endpointu [Email Finder](/pl/api-reference/email-finder/find-single), weryfikuje je przy użyciu endpointu [Email Verifier](/pl/api-reference/email-verifier/verify-single) i zapisuje wyniki z powrotem w arkuszu — automatycznie, według harmonogramu. Dopiero zaczynasz z n8n i Enrow? Zacznij od [przewodnika wprowadzającego do n8n](/pl/playbooks/n8n/getting-started).

## Co zbudujesz?

Zbudujesz zautomatyzowany workflow, który:

1. **Odczytuje kontakty** z arkusza Google Sheet
2. **Znajduje adresy e-mail** za pomocą Enrow Email Finder
3. **Weryfikuje adresy e-mail** pod kątem dostarczalności za pomocą Enrow Email Verifier
4. **Zapisuje wyniki** z powrotem w arkuszu Google Sheet

**Czas budowy**: 15 minut
**Poziom trudności**: Średnio zaawansowany

## Czego potrzebujesz przed rozpoczęciem?

Zanim zaczniesz budować workflow, upewnij się, że masz:

* Zainstalowane n8n ([pobierz n8n](https://n8n.io))
* Klucz API Enrow — zobacz [Uwierzytelnianie](/pl/authentication), aby dowiedzieć się, jak go uzyskać i używać
* Konto Google z arkuszem zawierającym kontakty

Każde wyszukiwanie zużywa kredyty, więc najpierw sprawdź swoje saldo. Koszty poszczególnych endpointów znajdziesz w sekcji [Kredyty i rozliczenia](/pl/credits-billing).

## Jak skonfigurować arkusz Google Sheet?

Utwórz arkusz Google Sheet z następującymi kolumnami:

| First Name | Last Name | Company Domain | Email | Status | Verified |
| ---------- | --------- | -------------- | ----- | ------ | -------- |
| John       | Doe       | apple.com      |       |        |          |
| Jane       | Smith     | microsoft.com  |       |        |          |
| Bob        | Johnson   | meta.com       |       |        |          |

**Nazwa arkusza**: "Contacts"
**URL**: Zapisz i skopiuj adres URL arkusza

## Jak wygląda workflow?

Workflow uruchamia się według harmonogramu, odczytuje każdy kontakt, znajduje i weryfikuje adres e-mail, a następnie aktualizuje arkusz:

```mermaid theme={null}
graph LR
    A[Cron Trigger] --> B[Read Google Sheet]
    B --> C[Loop Over Contacts]
    C --> D[Find Email - Enrow]
    D --> E[Verify Email - Enrow]
    E --> F[Update Google Sheet]
```

## Jak zbudować workflow krok po kroku?

Wykonaj poniższe kroki, aby złożyć każdy węzeł w n8n.

### Krok 1: Skonfiguruj połączenie z Google Sheets

1. Dodaj węzeł **"Google Sheets"**
2. Operacja: **"Read"**
3. Uwierzytelnij się w Google
4. Wybierz swój arkusz
5. Sheet Name: **"Contacts"**
6. Range: **"A:F"** (wszystkie kolumny)

### Krok 2: Dodaj wyzwalacz Cron

1. Dodaj węzeł **"Cron"** jako wyzwalacz
2. Tryb: **"Every Hour"** (lub własny harmonogram)
3. Połącz z węzłem Google Sheets

Dzięki temu nowe wiersze będą automatycznie przetwarzane co godzinę.

### Krok 3: Odfiltruj puste adresy e-mail

1. Dodaj węzeł **"IF"** po węźle Google Sheets
2. Warunek:
   * **Value 1**: `{{$json["Email"]}}`
   * **Operation**: `Is Empty`
3. Skieruj gałąź "true" do następnego kroku (przetwarzaj tylko kontakty bez adresów e-mail)

### Krok 4: Znajdź adres e-mail za pomocą Enrow

Wyślij każdy kontakt do endpointu Email Finder. Uwierzytelnij się swoim kluczem API w nagłówku `x-api-key`.

1. Dodaj węzeł **"HTTP Request"**
2. Skonfiguruj:

```
Method: POST
URL: https://api.enrow.io/email/find/single
Authentication: Header Auth
  Name: x-api-key
  Value: YOUR_ENROW_API_KEY

JSON Body:
{
  "company_domain": "{{$json["Company Domain"]}}",
  "fullname": "{{$json["First Name"]}} {{$json["Last Name"]}}"
}
```

### Krok 5: Poczekaj na wynik

Email Finder działa asynchronicznie, więc możesz albo poczekać na webhook, albo odpytywać endpoint GET o wynik.

**Opcja A: Webhook (zalecane)**

1. Dodaj węzeł **"Webhook"**
2. Ścieżka: `enrow-email-webhook`
3. Skopiuj adres URL webhooka
4. Zaktualizuj treść JSON węzła Find Email:

```json theme={null}
{
  "company_domain": "{{$json["Company Domain"]}}",
  "fullname": "{{$json["First Name"]}} {{$json["Last Name"]}}",
  "settings": {
    "webhook": "YOUR_WEBHOOK_URL"
  }
}
```

Aby poznać payload wysyłany przez Enrow oraz sposób rejestrowania endpointów, zobacz [Jak działają webhooki](/pl/how-webhooks-work).

**Opcja B: Czekaj i odpytuj**

1. Dodaj węzeł **"Wait"**: 5 sekund
2. Dodaj węzeł **"HTTP Request"**:
   * Method: `GET`
   * URL: `https://api.enrow.io/email/find/single?id={{$json["id"]}}`
3. Dodaj węzeł **"IF"**, aby sprawdzić status
4. Wróć do pętli, jeśli status to wciąż `ongoing`

Pełny format odpowiedzi znajdziesz w opisie endpointu [Get Single Result](/pl/api-reference/email-finder/get-single-result).

### Krok 6: Zweryfikuj adres e-mail

Przekaż znaleziony adres e-mail do Email Verifier, aby potwierdzić dostarczalność przed zapisaniem go z powrotem.

1. Dodaj węzeł **"HTTP Request"** po znalezieniu adresu e-mail
2. Skonfiguruj:

```
Method: POST
URL: https://api.enrow.io/email/verify/single
Authentication: Header Auth (reuse Enrow credential)

JSON Body:
{
  "email": "{{$json["email"]}}"
}
```

### Krok 7: Zaktualizuj arkusz Google Sheet

1. Dodaj węzeł **"Google Sheets"**
2. Operacja: **"Update"**
3. Wybierz ten sam arkusz
4. Sheet Name: **"Contacts"**
5. Range: **Match row** (użyj indeksu wiersza z oryginalnych danych)
6. Zmapuj pola:
   * **Email**: `{{$json["email"]}}`
   * **Status**: `{{$json["confidence"]}}`
   * **Verified**: `{{$json["status"]}}`

## Gdzie znajdę kompletny plik JSON workflow?

Zaimportuj poniższy JSON, aby uzyskać pełny workflow w jednym kroku.

<Note>
  Zaimportuj ten workflow, aby zacząć od razu. Wystarczy zaktualizować swoje klucze API!
</Note>

<details>
  <summary>Kliknij, aby wyświetlić kompletny plik JSON workflow</summary>

  ```json theme={null}
  {
    "name": "Enrow - Email Enrichment from Google Sheets",
    "nodes": [
      {
        "parameters": {
          "rule": {
            "interval": [{"field": "hours", "hoursInterval": 1}]
          }
        },
        "name": "Every Hour",
        "type": "n8n-nodes-base.cron",
        "typeVersion": 1,
        "position": [240, 300]
      },
      {
        "parameters": {
          "operation": "read",
          "sheetId": "YOUR_SHEET_ID",
          "range": "Contacts!A:F",
          "options": {}
        },
        "name": "Read Contacts",
        "type": "n8n-nodes-base.googleSheets",
        "typeVersion": 3,
        "position": [460, 300]
      },
      {
        "parameters": {
          "conditions": {
            "string": [
              {
                "value1": "={{$json[\"Email\"]}}",
                "operation": "isEmpty"
              }
            ]
          }
        },
        "name": "Filter Empty Emails",
        "type": "n8n-nodes-base.if",
        "typeVersion": 1,
        "position": [680, 300]
      },
      {
        "parameters": {
          "method": "POST",
          "url": "https://api.enrow.io/email/find/single",
          "authentication": "headerAuth",
          "sendBody": true,
          "bodyContentType": "json",
          "jsonBody": "={\n  \"company_domain\": \"{{$json[\"Company Domain\"]}}\",\n  \"fullname\": \"{{$json[\"First Name\"]}} {{$json[\"Last Name\"]}}\"\n}"
        },
        "name": "Find Email",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 3,
        "position": [900, 300],
        "credentials": {
          "headerAuth": {"name": "Enrow API"}
        }
      },
      {
        "parameters": {
          "amount": 5,
          "unit": "seconds"
        },
        "name": "Wait 5s",
        "type": "n8n-nodes-base.wait",
        "typeVersion": 1,
        "position": [1120, 300]
      },
      {
        "parameters": {
          "method": "GET",
          "url": "=https://api.enrow.io/email/find/single?id={{$json[\"id\"]}}",
          "authentication": "headerAuth"
        },
        "name": "Get Result",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 3,
        "position": [1340, 300],
        "credentials": {
          "headerAuth": {"name": "Enrow API"}
        }
      },
      {
        "parameters": {
          "conditions": {
            "string": [
              {
                "value1": "={{$json[\"status\"]}}",
                "value2": "completed"
              }
            ]
          }
        },
        "name": "Check if Complete",
        "type": "n8n-nodes-base.if",
        "typeVersion": 1,
        "position": [1560, 300]
      },
      {
        "parameters": {
          "method": "POST",
          "url": "https://api.enrow.io/email/verify/single",
          "authentication": "headerAuth",
          "sendBody": true,
          "bodyContentType": "json",
          "jsonBody": "={\n  \"email\": \"{{$json[\"email\"]}}\"\n}"
        },
        "name": "Verify Email",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 3,
        "position": [1780, 300],
        "credentials": {
          "headerAuth": {"name": "Enrow API"}
        }
      },
      {
        "parameters": {
          "operation": "update",
          "sheetId": "YOUR_SHEET_ID",
          "range": "=Contacts!A{{$json[\"row\"]}}:F{{$json[\"row\"]}}",
          "options": {
            "valueInputMode": "USER_ENTERED"
          }
        },
        "name": "Update Sheet",
        "type": "n8n-nodes-base.googleSheets",
        "typeVersion": 3,
        "position": [2000, 300]
      }
    ],
    "connections": {
      "Every Hour": {
        "main": [[{"node": "Read Contacts", "type": "main", "index": 0}]]
      },
      "Read Contacts": {
        "main": [[{"node": "Filter Empty Emails", "type": "main", "index": 0}]]
      },
      "Filter Empty Emails": {
        "main": [[{"node": "Find Email", "type": "main", "index": 0}]]
      },
      "Find Email": {
        "main": [[{"node": "Wait 5s", "type": "main", "index": 0}]]
      },
      "Wait 5s": {
        "main": [[{"node": "Get Result", "type": "main", "index": 0}]]
      },
      "Get Result": {
        "main": [[{"node": "Check if Complete", "type": "main", "index": 0}]]
      },
      "Check if Complete": {
        "main": [
          [{"node": "Verify Email", "type": "main", "index": 0}],
          [{"node": "Wait 5s", "type": "main", "index": 0}]
        ]
      },
      "Verify Email": {
        "main": [[{"node": "Update Sheet", "type": "main", "index": 0}]]
      }
    }
  }
  ```
</details>

## Jak możesz ulepszyć workflow?

Gdy podstawowy workflow już działa, te dodatki uczynią go bardziej niezawodnym i oszczędnym.

### Dodaj obsługę błędów

1. Dodaj węzeł **"Error Trigger"**
2. Dodaj węzeł **"Send Email"** lub **"Slack"**, aby powiadamiać o błędach
3. Zapisuj nieudane wiersze do osobnego arkusza

Informacje o kodach statusu, które możesz napotkać, oraz o tym, jak na nie reagować, znajdziesz w sekcjach [Obsługa błędów](/pl/error-handling) i [Kody statusu](/pl/status-codes).

### Przetwarzaj zbiorczo

Aby uzyskać lepszą wydajność przy dużej liczbie kontaktów, przejdź z pojedynczych wyszukiwań na przetwarzanie wsadowe:

1. Zmień węzeł Find Email tak, aby używał `/email/find/bulk`
2. Pogrupuj kontakty w paczki po 100
3. Przetwarzaj wszystkie naraz, zamiast pojedynczo

Przykładowe żądanie zbiorcze:

```json theme={null}
{
  "searches": [
    {
      "company_domain": "{{$json[\"Company Domain\"]}}",
      "fullname": "{{$json[\"First Name\"]}} {{$json[\"Last Name\"]}}"
    }
  ]
}
```

Endpoint [Find Bulk Emails](/pl/api-reference/email-finder/find-bulk) przyjmuje do 5000 wyszukiwań na partię.

### Dodaj warunkową weryfikację

Weryfikuj tylko adresy e-mail o wysokiej pewności, aby oszczędzać kredyty:

```javascript theme={null}
// In IF node
{{$json["confidence"]}} === "high"
```

Pozwala to oszczędzać kredyty, pomijając weryfikację niepewnych adresów e-mail.

## Kiedy warto użyć tego workflow?

Ten workflow dobrze sprawdza się w przypadku:

* **Zespołów sprzedaży**: wzbogacanie list potencjalnych klientów przed kontaktem
* **Rekruterów**: znajdowanie danych kontaktowych kandydatów
* **Marketerów**: budowanie list e-mailowych z baz danych firm
* **Zespołów danych**: czyszczenie i wzbogacanie danych w CRM

## Jakie są najlepsze praktyki?

<AccordionGroup>
  <Accordion title="Limity zapytań">
    Jeśli przetwarzasz duże listy (ponad 1000 kontaktów):

    * Używaj endpointów zbiorczych
    * Dodaj opóźnienia między partiami
    * Lub przejdź na wyższy plan Enrow

    Aktualne progi liczby żądań znajdziesz w sekcji [Limity zapytań](/pl/rate-limits).
  </Accordion>

  <Accordion title="Jakość danych">
    * Zawsze weryfikuj adresy e-mail przed ich użyciem
    * Sprawdzaj wskaźniki pewności
    * Usuwaj wyniki o niskiej jakości
  </Accordion>

  <Accordion title="Optymalizacja kosztów">
    * Deduplikuj kontakty przed przetwarzaniem
    * Buforuj wyniki, aby uniknąć ponownego wyszukiwania
    * Stosuj logikę warunkową, aby pomijać zbędne wywołania API
  </Accordion>

  <Accordion title="Odzyskiwanie po błędach">
    * Loguj wszystkie odpowiedzi API
    * Śledź nieudane wzbogacania
    * Automatycznie ponawiaj nieudane wyszukiwania
  </Accordion>
</AccordionGroup>

## Jak rozwiązywać typowe problemy?

**Workflow nie uruchamia się automatycznie?**

* Sprawdź, czy wyzwalacz Cron jest aktywowany
* Upewnij się, że harmonogram jest poprawny

**Nie znaleziono żadnych adresów e-mail?**

* Sprawdź, czy domeny firmowe są poprawne
* Upewnij się, że nazwiska są poprawnie zapisane
* Spróbuj wyłącznie z domeną firmy (bez nazwisk)

**Arkusz się nie aktualizuje?**

* Sprawdź uprawnienia w Google Sheets
* Upewnij się, że zakres odpowiada Twoim danym
* Przetestuj węzeł Update ręcznie

## FAQ

<AccordionGroup>
  <Accordion title="Czy potrzebuję webhooka, czy mogę po prostu odpytywać o wyniki?">
    Oba rozwiązania działają. Email Finder działa asynchronicznie, więc możesz albo zarejestrować webhook w polu `settings.webhook` (Opcja A), albo odpytywać endpoint [Get Single Result](/pl/api-reference/email-finder/get-single-result) w określonych odstępach czasu (Opcja B). Webhooki są zalecane, ponieważ eliminują zbędne żądania odpytujące i zwracają wyniki natychmiast po zakończeniu wyszukiwania. Zobacz [Jak działają webhooki](/pl/how-webhooks-work).
  </Accordion>

  <Accordion title="Ile kredytów zużywa ten workflow?">
    Każde wyszukiwanie w Email Finder i każda kontrola w Email Verifier zużywa kredyty za każde wywołanie. Uruchamianie obu dla każdego kontaktu zużywa więcej kredytów niż samo znajdowanie, więc dodaj warunkową weryfikację, aby pomijać niepewne adresy e-mail. Dokładne koszty poszczególnych endpointów znajdziesz w sekcji [Kredyty i rozliczenia](/pl/credits-billing).
  </Accordion>

  <Accordion title="Jak uwierzytelnić węzły HTTP Request?">
    Użyj danych uwierzytelniających Header Auth w n8n z nazwą nagłówka `x-api-key` oraz swoim kluczem API Enrow jako wartością, a następnie używaj tych samych danych uwierzytelniających we wszystkich węzłach Enrow. Pełne informacje znajdziesz w sekcji [Uwierzytelnianie](/pl/authentication).
  </Accordion>

  <Accordion title="Co, jeśli mam tysiące kontaktów?">
    Przełącz węzeł Find Email na endpoint [Find Bulk Emails](/pl/api-reference/email-finder/find-bulk), który przyjmuje do 5000 wyszukiwań na partię, i pozostań w granicach [limitów zapytań](/pl/rate-limits) swojego planu.
  </Accordion>
</AccordionGroup>

## Kolejne kroki

<CardGroup cols={2}>
  <Card title="Workflow weryfikacji" icon="shield-check" href="/pl/playbooks/n8n/lead-verification-workflow">
    Weryfikuj istniejące listy adresów e-mail za pomocą n8n i Enrow.
  </Card>

  <Card title="Znajdź adres e-mail" icon="envelope" href="/pl/api-reference/email-finder/find-single">
    Poznaj endpoint Email Finder używany w tym workflow.
  </Card>

  <Card title="Zweryfikuj adres e-mail" icon="circle-check" href="/pl/api-reference/email-verifier/verify-single">
    Sprawdź, czy adres e-mail jest prawidłowy i dostarczalny.
  </Card>

  <Card title="Webhooki" icon="bell" href="/pl/how-webhooks-work">
    Otrzymuj automatyczne powiadomienia po zakończeniu wyszukiwania.
  </Card>
</CardGroup>
