Cel:
Stworzyć autonomiczny system generowania leadów, który codziennie skanuje rejestr Prozorro w poszukiwaniu dwóch kategorii możliwości: zawartych umów (ciepłe leady — organizacje, które już kupują odpowiedni towar) oraz aktywnych przetargów (gdzie można złożyć ofertę). Końcowy produkt — zorganizowana baza CRM w Airtable z pełnymi danymi kontaktowymi zamawiającego, uczestnikami oraz cenami ofert.
Kluczowe wymagania:
Dwa równoległe workflow: izolowane przetwarzanie umów (/contracts) oraz aktywnych przetargów (/tenders?status=active.tendering)
Rozszerzone filtrowanie: 5 kodów CPV + 15 marek znaczników + minimalna kwota 50 000 UAH
Paginacja kursorowa z historycznym backfill: skanowanie Prozorro od 01.01.2025 bez utraty pozycji między uruchomieniami
Szczegółowa struktura CRM: kontakty (EDRPOU, email, telefon), uczestnicy aukcji z cenami, linki do rejestru ofert
Dedupikacja na poziomie Airtable: zapobieganie powtórnym zapisom przy ciągłej pracy
Hybrydowa logika: zamknięte przetargi, które przeszły filtr, automatycznie wzbogacają bazę leadów danymi uczestników do przyszłych kampanii emailowych
Mój wkład:
Zamawiający handluje sprzętem energetycznym (akumulatory, UPS, panele słoneczne) i spędzał godziny dziennie na ręcznym monitorowaniu Prozorro. Zadanie polegało nie tylko na "przesyłaniu przetargów", ale na zbudowaniu gotowego do sprzedaży leja leadów z pełnym rozrachunkiem rynku.
Architektoniczna dekompozycja: zamiast jednego "grubego" flow podzieliłem system na dwa niezależne workflow — dla umów i aktywnych przetargów. Każdy ma własny kursor, harmonogram uruchamiania i tabelę Airtable. To pozwoliło na skalowanie źródeł bez wzajemnych blokad.
Paginacja kursorowa z logiką self-healing: Prozorro zwraca opakowany kursor w formacie {timestamp}.{seq}.{hash}. Zrealizowałem warstwę ochronną, która waliduje kursor przed użyciem i automatycznie przywraca go z ważnej daty, jeśli API zwraca anomalię (na przykład, reset do 2015 roku). Bez interwencji administratora.
Dwustopniowe wzbogacenie danych: dla leadów stworzyłem kaskadę zapytań HTTP — najpierw umowa (nabywca, dostawca, kwota), potem przetarg (uczestnicy, stawki, rejestr ofert). Oddzielny węzeł JavaScript łączy te strumienie i formuje JSON z tablicą uczestników (nazwa, EDRPOU, email, stawka początkowa + końcowa), gotowy do integracji z kampaniami emailowymi.
Dedupikacja przez Airtable Search: przed każdym zapisem flow wykonuje wyszukiwanie po contractID/tenderID, co pozwala na bezpieczne ponowne uruchamianie workflow tyle razy, ile potrzeba, bez tworzenia duplikatów.
Routing zamkniętych przetargów: przetargi, które zakończyły się przed momentem przetwarzania, nie są usuwane — logika IF przekierowuje je do tabeli "Leady" z pełną listą uczestników. W ten sposób zamawiający otrzymuje nie tylko potencjalnych klientów-nabywców, ale także konkurentów-dostawców do analizy rynku.
Wynik:
Działający system, który codziennie wzbogaca CRM zamawiającego bez żadnej interwencji ludzkiej:
2 źródła danych w jednej bazie danych: Airtable z dwiema tabelami ("Leady" i "Aktywne przetargi"), każda z kontaktami, cenami, dokumentami i linkami
Gotowość do email marketingu: zorganizowane dane uczestników (z emailami i telefonami) można bezpośrednio przesyłać do Mailchimp/SendPulse/własnego skryptu
Oszczędność 2-3 godziny/dzień: zamiast ręcznego googlowania zamawiający od razu otrzymuje tabelę z 18 polami
Historyczny zasięg: backfill od 01.01.2025 pozwolił na stworzenie bazy ciepłych leadów przez 16+ miesięcy jeszcze przed uruchomieniem
Stabilność 24/7: system uruchamiany 4 razy dziennie według harmonogramu, z logiką retry na błędy API i samoodtwarzaniem kursora
#n8n #Airtable #LeadGeneration #SalesAutomation #Prozorro #API #WorkflowAutomation #JavaScript #CRM #DataPipeline #BusinessAutomation #NoCode #B2B #GenerowanieLeadów #Automatyzacja
Stworzyć autonomiczny system generowania leadów, który codziennie skanuje rejestr Prozorro w poszukiwaniu dwóch kategorii możliwości: zawartych umów (ciepłe leady — organizacje, które już kupują odpowiedni towar) oraz aktywnych przetargów (gdzie można złożyć ofertę). Końcowy produkt — zorganizowana baza CRM w Airtable z pełnymi danymi kontaktowymi zamawiającego, uczestnikami oraz cenami ofert.
Kluczowe wymagania:
Dwa równoległe workflow: izolowane przetwarzanie umów (/contracts) oraz aktywnych przetargów (/tenders?status=active.tendering)
Rozszerzone filtrowanie: 5 kodów CPV + 15 marek znaczników + minimalna kwota 50 000 UAH
Paginacja kursorowa z historycznym backfill: skanowanie Prozorro od 01.01.2025 bez utraty pozycji między uruchomieniami
Szczegółowa struktura CRM: kontakty (EDRPOU, email, telefon), uczestnicy aukcji z cenami, linki do rejestru ofert
Dedupikacja na poziomie Airtable: zapobieganie powtórnym zapisom przy ciągłej pracy
Hybrydowa logika: zamknięte przetargi, które przeszły filtr, automatycznie wzbogacają bazę leadów danymi uczestników do przyszłych kampanii emailowych
Mój wkład:
Zamawiający handluje sprzętem energetycznym (akumulatory, UPS, panele słoneczne) i spędzał godziny dziennie na ręcznym monitorowaniu Prozorro. Zadanie polegało nie tylko na "przesyłaniu przetargów", ale na zbudowaniu gotowego do sprzedaży leja leadów z pełnym rozrachunkiem rynku.
Architektoniczna dekompozycja: zamiast jednego "grubego" flow podzieliłem system na dwa niezależne workflow — dla umów i aktywnych przetargów. Każdy ma własny kursor, harmonogram uruchamiania i tabelę Airtable. To pozwoliło na skalowanie źródeł bez wzajemnych blokad.
Paginacja kursorowa z logiką self-healing: Prozorro zwraca opakowany kursor w formacie {timestamp}.{seq}.{hash}. Zrealizowałem warstwę ochronną, która waliduje kursor przed użyciem i automatycznie przywraca go z ważnej daty, jeśli API zwraca anomalię (na przykład, reset do 2015 roku). Bez interwencji administratora.
Dwustopniowe wzbogacenie danych: dla leadów stworzyłem kaskadę zapytań HTTP — najpierw umowa (nabywca, dostawca, kwota), potem przetarg (uczestnicy, stawki, rejestr ofert). Oddzielny węzeł JavaScript łączy te strumienie i formuje JSON z tablicą uczestników (nazwa, EDRPOU, email, stawka początkowa + końcowa), gotowy do integracji z kampaniami emailowymi.
Dedupikacja przez Airtable Search: przed każdym zapisem flow wykonuje wyszukiwanie po contractID/tenderID, co pozwala na bezpieczne ponowne uruchamianie workflow tyle razy, ile potrzeba, bez tworzenia duplikatów.
Routing zamkniętych przetargów: przetargi, które zakończyły się przed momentem przetwarzania, nie są usuwane — logika IF przekierowuje je do tabeli "Leady" z pełną listą uczestników. W ten sposób zamawiający otrzymuje nie tylko potencjalnych klientów-nabywców, ale także konkurentów-dostawców do analizy rynku.
Wynik:
Działający system, który codziennie wzbogaca CRM zamawiającego bez żadnej interwencji ludzkiej:
2 źródła danych w jednej bazie danych: Airtable z dwiema tabelami ("Leady" i "Aktywne przetargi"), każda z kontaktami, cenami, dokumentami i linkami
Gotowość do email marketingu: zorganizowane dane uczestników (z emailami i telefonami) można bezpośrednio przesyłać do Mailchimp/SendPulse/własnego skryptu
Oszczędność 2-3 godziny/dzień: zamiast ręcznego googlowania zamawiający od razu otrzymuje tabelę z 18 polami
Historyczny zasięg: backfill od 01.01.2025 pozwolił na stworzenie bazy ciepłych leadów przez 16+ miesięcy jeszcze przed uruchomieniem
Stabilność 24/7: system uruchamiany 4 razy dziennie według harmonogramu, z logiką retry na błędy API i samoodtwarzaniem kursora
#n8n #Airtable #LeadGeneration #SalesAutomation #Prozorro #API #WorkflowAutomation #JavaScript #CRM #DataPipeline #BusinessAutomation #NoCode #B2B #GenerowanieLeadów #Automatyzacja