CorbieTech · ALE Platform

Wiring & Operations

Everything ALE touches, how the signal flows, and the runbook for bringing each piece online. Snapshot: September 2026.

Signal flow

Lead source — Namu Travel / Google

Creatio CRMassigns opportunity → sends notification email
Gmail mailboxsubject "New Opportunity Assigned" · OAuth gmail.readonly · GCP project "corbietech"
polled every minute (read-only)

Compute — AWS account 593518286265 · us-east-1

EventBridge DISABLEDale-poller-schedule · rate(1 minute) · enable at go-live
Lambda ale-pollerPython 3.12 / arm64 / 512MB · concurrency 1 · repo agency-lead-enrichment
SSM Parameter Store/ale/* SecureString secrets · /ale/state/processed dedup ids
CloudWatch Logsper-run summaries + dry-run alert bodies
per lead: parse → history → enrich → research → validate

Research & scoring — external APIs, all best-effort except Claude

People Data Labsperson enrich · work emails only
Enrich Layeremail → LinkedIn · work emails only
Tavilyadvanced web search · main discovery
Exaneural search · main discovery
ZeroBouncevalidity / disposable check
Claude (Anthropic)claude-haiku-4-5 · cross-source identity check · verdict + talking points · REQUIRED
verdict: POTENTIAL / COULD_BE / DISCARD

Alerts — to Anastasia

WhatsApp DRY-RUNMeta Cloud API · template ale_lead_alert · go-live channel
Email OFFneeds gmail.send re-mint (or SES) — Gmail grant is read-only

Web estate & identity

Route 53 · corbietech.comzone Z064132922RJUNBQWYD67 · also serves ACM DNS validation
ale.corbietech.comtool site · S3 + CloudFront E2I928WSIHRTDP · OAuth home page
docs.ale.corbietech.comthis page · S3 + CloudFront
anastasia.corbietech.comAnastasia's personal site · S3 + CloudFront E3R7DJCFIVC0HU
Google Cloud "corbietech"OAuth consent (published) · Desktop client · Gmail API · scope gmail.readonly
Source of truthrepo gmaddaloni-projects-public/agency-lead-enrichment · deploy/deploy.sh

Runbook — wiring in the API keys

  1. Put keys in .env

    Edit the gitignored .env at the repo root. Gmail entries are already there; add whichever of these you have (only Anthropic is required to run):

    cd ~/gmaddaloni-projects-public/agency-lead-enrichment
    nano .env
  2. Probe — find out what's still alive

    Tests every configured key against its provider (free/cheapest call each) and reports alive, DEAD, or out of credits:

    ./.venv/bin/python -m ale probe
  3. Ship to SSM

    Pushes everything present in .env to /ale/* — values never touch shell history:

    AWS_PROFILE=corbietech ./deploy/push_secrets.sh
  4. Dry-run end to end

    Expect {"ok": true, ..., "dry_run": true}; alert bodies appear in CloudWatch Logs, nothing is sent:

    AWS_PROFILE=corbietech aws lambda invoke --function-name ale-poller /dev/stdout
  5. Go live

    Enable the 1-minute schedule (still dry-run until ALE_DRY_RUN=false is set on the function):

    AWS_PROFILE=corbietech aws events enable-rule --name ale-poller-schedule

Provider keys — where to get them, what matters

KeyRoleNeedGet it / free tier
ANTHROPIC_API_KEY The scorer — no key, no verdicts. ~half a cent per lead on Haiku. REQUIRED console.anthropic.com
reuse the n8n key or mint "ale-lambda"
TAVILY_API_KEY Main web discovery — the layer that actually finds consumer leads. high value app.tavily.com
free tier ~1,000 credits/mo
EXA_API_KEY Neural search — second discovery angle, surfaces profiles by name. high value dashboard.exa.ai
free starter credit
ZEROBOUNCE_API_KEY Email validity / disposable check — cheap discard signal. medium zerobounce.net
100 free validations/mo
PDL_API_KEY Person enrich — only fires for corporate emails (rare in this business). low — skip if dead peopledatalabs.com
rotate: old key leaked in repo history
ENRICHLAYER_API_KEY Email → LinkedIn — corporate emails only, same caveat as PDL. low — skip if dead enrichlayer.com
paid; Proxycurl successor
WHATSAPP_TOKEN + PHONE_NUMBER_ID, TO Alert channel at go-live; needs approved template ale_lead_alert. at go-live developers.facebook.com
Meta Cloud API, business-initiated

A missing optional key never breaks a run — that provider is skipped and the scorer is told about the data gap. Minimum useful set: ANTHROPIC + TAVILY + EXA.