pg4: le PMI italiane che Apollo e Clay non vedono.
Una pipeline che trova le aziende su PagineGialle e Google Maps, verifica il loro sito, le arricchisce con contatti e dati ufficiali e, se vuoi, ti dice quali vale la pena chiamare.
- 1.2k+test unitari offline
- 96,2%precisione sui siti aggiunti dal passaggio SERP a pagamento
- €0di default: le fonti a pagamento sono spente
- 3ªgenerazione dello stesso progetto
Il problema non è scrivere l'email. È sapere a chi mandarla.
Apollo e Clay sono costruiti sui dati americani. Su una PMI manifatturiera veneta da trenta persone la copertura crolla: l'azienda non c'è, oppure c'è con il sito sbagliato e un'email che rimbalza.
I dati veri esistono, ma sono sparsi in cinque posti diversi. pg4 li mette insieme e, soprattutto, si rifiuta di indovinare: un sito entra nel database solo se la P.IVA o il telefono dell'azienda compaiono nella pagina, oppure se nome, settore e città tornano tutti.
pg4 è la terza generazione. pg3 era crollato sotto il suo stesso peso operativo: Redis, sidecar, costi che nessuno riusciva a tenere sotto controllo. Dai suoi output reali sono uscite le regole di pg4: la stessa agenzia emessa 10 volte su comuni diversi, 191 "siti" che in realtà erano annunci su immobiliare.it. Ogni errore è diventato un vincolo con il suo test.
Meglio un campo vuoto che un campo sbagliato. Un'email sbagliata costa reputazione del dominio; un campo vuoto costa solo una ricerca in più.
Quattro passi. L'ultimo è facoltativo.
Scoperta
Categoria e provincia in input. Gira comune per comune su PagineGialle e Google Maps, con checkpoint: se si interrompe riprende da dove era rimasto. Deduplica su tutte le fonti, dal telefono al dominio.
Verifica del sito
Una scala a cinque gradini, dal sito dichiarato al registro .it. Ogni candidato deve dimostrare di appartenere davvero a quell'azienda.
Arricchimento
Email dello stesso dominio, PEC, social, P.IVA validata su VIES, fatturato e dipendenti. L'email inferita entra solo se il controllo MX/SMTP la dà consegnabile.
Giudizio
Incrocia il potenziale dell'azienda con la sua presenza digitale e indica chi è un target, chi è borderline e chi no. Con le leve da cui partire.
Cinque gradini per trovare il sito giusto. Si sale solo se quello sotto fallisce.
- 1
Il sito dichiarato
Quello che arriva in input, purché non sia messaggistica, un redirect, una directory o un social.
- 2
La scheda PagineGialle
Riempie P.IVA, telefono, email e indirizzo. Il sito passa solo se combaciano P.IVA o telefono.
- 3
Il dominio indovinato
Fino a 60 domini candidati dal nome, filtro DNS, si verificano i 6 migliori.
- 4
La ricerca web
DuckDuckGo, poi Bing: si verificano i primi 5 risultati. Con il paid acceso anche Serper, Tavily ed Exa, con veto sugli aggregatori.
- 5
Il registro .it
RDAP: se la P.IVA è nel record del dominio, confidenza 0,9. Altrimenti si confronta il nome.
Cerca le perle silenziose: aziende forti che online quasi non esistono.
A, il potenziale: premi, brevetti, marchio storico, stampa, registro. Conta solo se è confermato da città, provincia, P.IVA o dominio.
B, la presenza digitale: sito, social, recensioni e gli altri canali propri. Un canale è assente solo se è stato cercato davvero; altrimenti resta sconosciuto e l'azienda finisce borderline.
La soglia: A ≥ 0,60 e distacco A−B ≥ 0,30 è un target. A ≥ 0,50 e distacco ≥ 0,20 è borderline. Chiuse, rivenditori puri e aziende in liquidazione sono squalificate prima.
Le leve, in ordine:
I due giudici sono deterministici. Un LLM, se c'è, rifinisce solo ciò che è stato osservato; un critico finale controlla che A e B non si citino a vicenda e che nessuno stato sia inventato.
Le campagne girano da sole. E quando si rompono, provano a ripararsi.
Provincia × settore
La campagna lavora per celle e salta quelle già verificate. Un watchdog la rilancia se il processo muore.
Una cella si rompe a metà
Di solito perché PagineGialle ha cambiato qualcosa. Parte un workflow di recovery: un LLM scrive la patch allo scraper.
La patch passa tre controlli
Tocca solo 9 file dello scraper, niente segreti, rete, exec o cancellazioni, con un test di regressione obbligatorio. Poi typecheck e test verdi. Poi un secondo LLM, indipendente, deve approvarla.
Merge e si riparte
La PR entra in un ambiente protetto, lo scrape riprende e la cella viene riverificata.
Stesso errore due volte: serve una persona
Dopo due cicli con lo stesso errore la cella si blocca. L'automazione sa quando fermarsi.
Quattro regole che il codice non può aggirare.
Lista di esclusione GDPR
Chi ha chiesto di non essere contattato sparisce in scoperta, arricchimento e giudizio. La repo non contiene dati raccolti e include un kit GDPR: valutazione del legittimo interesse e informativa art. 14.
€0 di default
Le fonti a pagamento richiedono flag, chiave e --enable-paid. Prima di ogni chiamata si ricontrolla il tetto per lead e per run, e una chiamata fallita si registra al suo costo reale. Nato da un incidente: un tetto di €0,10 arrivato a €0,229.
Fail-closed
Se fatturato e dipendenti appartengono a un'altra entità, il dato si scarta. I campi già pieni non vengono mai sovrascritti.
Niente di inventato
Sconosciuto non vuol dire assente. I quasi-duplicati si segnalano, non si fondono. Ogni run dichiara se è completo o parziale.
Una CLI, una dashboard, un server per agenti. Una pipeline sotto.
Comandi
pnpm scrape- Scoperta su PagineGialle e Maps, riprende dal checkpoint.
pnpm enrich- Verifica del sito e arricchimento. Solo fonti gratuite, se non dici altrimenti.
pnpm run pipeline- Scoperta e arricchimento sotto un unico run. Rifiuta di arricchire uno scrape incompleto.
pnpm judge- Il giudizio a due assi su un CSV arricchito.
pnpm lookup- Ritrova un'azienda già processata per P.IVA o telefono.
pnpm coverage- Mappa dei buchi di copertura: settore × territorio contro i dati ISTAT.
pnpm mcp- Server MCP: gli agenti AI usano la pipeline come strumento, dentro una sandbox.
Un esempio
pnpm run pipeline \
--category "agenzie immobiliari" \
--province BL \
--out output/campaign
Si prova anche offline, senza chiavi né browser: pnpm demo apre la dashboard su 480 aziende fittizie. Si guida da tastiera: ⌘K trova viste, mercati e aziende. Ogni riga in output ha uno stato e un motivo, e ogni euro speso finisce nel ledger.





