Build an internal, automated lead generation system that replaces reliance on external partners by leveraging Amazon marketplace data to identify, segment, enrich, and activate high-fit brand prospects — resulting in a repeatable pipeline of qualified outreach targets on a 1–2x/month cadence, aligned to SmartScout data refresh frequency. Send volume is intentionally conservative: ~15–20 emails/day across 6 mailboxes, supporting a goal of 3–5 new partners/quarter. Volume can be increased if needed, but is not required for the current target.
Establish access to all required systems and data sources. Understand the Smart Scout API schema, available fields, and rate limits. Align on segmentation criteria and campaign logic with Nick and the sales team. Initialize the TypeScript project and trigger.dev environment so the dev setup is correct before any pipeline code is written.
✅ Phase 1 complete. All tasks done as of May 29: SmartScout API explored, trigger.dev configured, credentials confirmed, segmentation spreadsheet reviewed. SPF/DKIM/DMARC verified across all 3 domains — all 6 mailboxes showing 100% warm-up reputation in Smartlead. Warm-up running passively, no action needed until it finishes (~3–4 weeks from May 28).
Task
Hours
✅ Kickoff meeting & requirements alignment
2
✅ Smart Scout API access, documentation review & data exploration
6
✅ Coordinate with Justin on internal tools & system access
2
✅ Segment definitions live (criteria & bands model from the June 11 session, saved + scored June 12) · ⏳ remaining: Nick's calibration pass in scoring.html — tune Segment E's gate, score thresholds, and Segment A's open bands, wire each segment to its Smartlead campaign (Step 4), and untick any excluded categories. Pipeline reads config directly from D1 — no file transfer needed.
✅ SPF/DKIM/DMARC verified on all 3 domains — all 6 mailboxes confirmed 100% warm-up reputation in Smartlead Foundation Pool (May 29)
1
Data Ingestion Pipeline
Weeks 2–3 ✅ Complete
33 hrs
Build the automated pipeline that pulls Amazon brand data from the SmartScout API, normalizes it, and fans out to per-brand scoring tasks. Deduplication checks the suppression list in D1 (existing clients + lost/fired, matched by name and Amazon store slug) before processing — no current Navira client enters the pipeline. Snowflake is deferred to Q3; in the interim the full cohort (with raw signals) persists to Cloudflare D1, the pipeline state store, so it can be re-scored without re-pulling SmartScout.
✅ Complete: Full pipeline live — SmartScout ingestion, D1 dedup (100 suppressed: existing clients + lost/fired), D1 state store wired, monthly cron scheduled (1st of month), batchTrigger fan-out to enrichment. End-to-end test passed May 29, 2026: 100 brands fetched and written to D1 in 19 seconds.
Task
Hours
✅ Design data model — Snowflake schema (brands, scores, contacts, campaign_logs, pipeline_runs)
✅ Build SmartScout API ingestion task in TypeScript
12
✅ Implement pagination, data validation & normalization
4
✅ Deduplication at ingestion — reads the D1 suppression list each run (existing clients + lost/fired), matched by name + Amazon store slug; matches excluded before they hit Apollo
2
✅ Configure trigger.dev scheduled runs (1st of month, 2 AM ET) + fan-out via batchTrigger()
4
✅ Testing & iteration against live data
6
Brand Segmentation Engine
Weeks 3–4 ✅ Complete
42 hrs
Implement the logic that scores and buckets brands based on the agreed-upon criteria, automatically assigning them to prospect segments. Each brand runs as its own trigger.dev task — if one fails, only that brand retries, not the whole pipeline.
✅ Built + deployed — the criteria & bands model is LIVE. Following the June 11 working session, the weight sliders were replaced by the "criteria & bands" model the team aligned on: each segment is defined by must-haves, nice-to-haves, value bands, and deal-breakers, in plain language (e.g. Segment D's locked decision: 4–10 third-party sellers as the sweet spot, eligible to 20). The definitions from the meeting were saved (config v10) and all 35,671 brands re-scored on the new engine June 12 — what's in the Review Queue now is the criteria model, end to end, with ~29,100 non-suppressed brands. Live signals: annual revenue, YoY & MoM growth, 3P sellers per listing (+ the sweet-spot band), catalog size, Prime-coverage gap, Vendor Central dominance (now measured by dominant-seller coverage — the literal "Amazon owns X% of the brand" number), and Brand/page score (covers ~72% of brands while the product backfill finishes). The Scoring page's Step 2 draws every band over a live sample of real brands (drag the band directly on the chart), can back-solve bands from example brands you name, and re-scores real companies in the preview as you adjust — including the proposed 1P-in-Decline segment (inactive until it gets a campaign). ⏳ Still open — the calibration pass: the first criteria run is deliberately wide (23,971 brands score Hot — Segment E's growth-only gate captures most of them), so Hot doesn't prioritize yet. Nick's remaining pass: tighten Segment E (ad-spend/TACoS data is now confirmed available to make "growth + margin pressure" measurable), nudge score thresholds, close Segment A's three open bands, untick excluded categories, and wire each segment to its Smartlead campaign — see "What I Need from Your Team."
Task
Hours
✅ segment-leads trigger.dev task — wired, deployed to production
2
✅ Scoring Configurator UI — step-by-step guide (6 steps × 5 segments), live preview of real companies per segment that re-score as you tune (expand any brand for its full per-signal breakdown), weight distribution bar, cloud save → D1 (pipeline reads config directly, no file transfer needed)
⏳ Backtest scoring against the 47 existing partners — ready to run now that the full scored cohort is live in D1
4
⏳ Unit testing & validation against known brand examples (Phase 7)
4
Contact Enrichment
Weeks 4–5 ✅ Built · live-verified June 10 — batch gated
28 hrs
Enrich segmented brand leads with real contact information for decision-makers at target companies. Apollo.io rate limits are handled automatically via trigger.dev's concurrency limiting and exponential backoff retry — no manual intervention needed if Apollo throttles. Note: LinkedIn API access is enterprise-only and heavily restricted — Phase 4 runs Apollo-only by default. LinkedIn is deprioritized unless access is confirmed before Phase 4 begins.
✅ Logic built May 31 — wired to the live Apollo API & verified June 10. Apollo.io enrichment complete — seniority/title/email ranking selects the best decision-maker contact per brand; brand_contacts table live in D1; idempotent upsert (safe to re-run). On June 10 the master Apollo API key came through: the integration was reworked to Apollo's current API (the original people-search endpoint had been deprecated) and proven with a single live test — one real decision-maker with a verified email landed in brand_contacts. Total spend to date: 1 Apollo credit. Batch enrichment has not run — it stays gated (ENRICH_MODE=dry_run — its own switch, separate from the outreach gate, so turning it on cannot send any email) until the team gives the go-ahead, after Nick has reviewed the scored cohort. Once enabled, enriched contacts flow directly into the Review Queue for Nick's sign-off before anything touches Smartlead.
Task
Hours
✅ Build Apollo enrichment task — trigger.dev task deployed with concurrency limit, 5-attempt retry, exponential backoff
8
✅ Apollo enrichment logic — seniority/title/email ranking; best contact per brand stored to D1 brand_contacts; reworked to Apollo's current API + live-verified with the master key (June 10); batch gate active
6
⏳ LinkedIn data discovery & integration — deprioritized; LinkedIn API is enterprise-only and heavily restricted
6
✅ Match enriched contacts to segmented brands — contact keyed to brand_id; review.html shows contact alongside score
✅ Pre-started + confirmed May 29: All 6 mailboxes live and showing 100% warm-up reputation in Smartlead Foundation Pool. Identities: Morgan Capri & Keira Loren (navirabrands.com), Levi Matthews & Leo Strawley (navirapartners.com), Emma Carter & Megan Brooks (navirahq.com). 4F/2M split — recommended 60–70% women. By the time Phase 5 begins, warm-up will be complete and campaigns can fire immediately.
⚠ Test safety: A PIPELINE_MODE env var gates all Smartlead enrollment. Default is dry_run — logs what would be sent without calling any Smartlead APIs. Only when explicitly set to production do real leads enroll in campaigns. Phases 2–4 never touch Smartlead regardless of this setting. The human review queue (see below) adds a second layer before any email fires.
Connect the segmented, enriched lead data to the outreach platform so campaigns fire automatically based on segment assignment. Smartlead.ai handles cold outreach and mailbox rotation, while HubSpot (the CRM) takes over after a reply or booked call. For the first 2–3 weeks post-launch, hot/warm brands land in a human review queue before enrollment — giving Nick a chance to sanity-check output before campaigns fire at scale.
Task
Hours
✅ Smartlead.ai account set up — 6 mailboxes connected across 3 domains (navirapartners.com, navirabrands.com, navirahq.com); warm-up started May 28 (Week 1); will be complete before Phase 5 campaigns fire
✅ Human review queue — review.html live May 31; Nick approves/holds/rejects per brand; nothing moves to Smartlead without sign-off; email/Slack notification on new batch (needs RESEND_API_KEY set)
5
Smartlead webhook → event tracking — Cloudflare Worker writes email events (sent, opened, bounced, replied) to Snowflake campaign_events in Q3; interim tracking via Smartlead analytics dashboard
Build an internal-facing dashboard at prospects.navira.io giving the sales team real-time visibility into the pipeline and customizable hit lists. Nick can also be given view-only access to trigger.dev to monitor pipeline health directly.
Phases overlap where possible. With ~40 hours available in Week 1, Phase 1 can be completed and Phase 2 can begin immediately. Kickoff: May 28, 2026. Final delivery targeted by ~July 23, 2026 (7–8 weeks from kickoff).
What I Need from Your Team
Nick: scoring calibration pass (the Save already happened — thank you) — the criteria definitions are saved and the full cohort is scored on them. What the first run shows is that three dials need your judgment, ~20–30 minutes in the Scoring Configurator: (1) Segment E's gate — "growing 20%+" alone qualifies ~16,700 brands, which makes Hot too big to prioritize; either tighten the growth band or wait ~a day for the ad-spend signal (now confirmed available from SmartScout) so E can require real margin pressure, which our sample suggests trims it to roughly a fifth. (2) Score thresholds (now under Global settings — one set applies to every segment) — under the new 50-to-100 scoring math the old thresholds run hot; 75/60/40 is the recommended starting point. (3) Segment A's three open bands — MoM growth, Prime-coverage gap, and Brand/page score were added without ranges, so they currently give credit to any brand that has the data; set each band or remove them (the editor flags them in amber). While you're in there: name 2–3 brands you know belong in a segment and hit back-solve to sanity-check the bands, and the live preview shows real companies moving between segments as you adjust. Save when done and Evan re-scores same-day. New June 12: two variables from your CEO's list are already live in the Step 2 "+ Add variable" picker — Top seller's brand coverage (how much of a brand its biggest 3P seller controls; the under-50% tail is the "nobody's really running this brand" group) and Single-seller brand (~67% of the cohort). Both are opt-in: nothing changes until you add them to a segment.
💡 The page now walks you through 5 steps in order: pick a segment (1) → define it (2) → verify its sequence copy (3) → wire it to Smartlead (4) → hand off to enrichment & the review queue (5). Step 3 is a per-segment checklist — read that segment's sequence and tick "copy matches this definition"; wiring in Step 4 stays locked until the tick, and editing a segment's definition automatically un-ticks it (the audience changed, so the copy needs another look). In Step 4, ⚡ Wire to Smartlead creates the (paused) campaign named after the segment, so names always match with no copy-paste — or use “link existing” if you already built it. Archiving a segment automatically pauses & detaches its campaign, so nothing dead is left running.
Nick: untick the categories NAVIRA doesn't want — every Amazon category is targeted by default; you only mark the exceptions. Open the Scoring Configurator → under Global settings, expand “Scoring rules & targets,” and untick any category NAVIRA never wants to pursue (apparel? supplements?) — brands in unticked categories are suppressed across every segment on the next re-score. The list is built from the real categories in our data, so it always matches — nothing to email. Leave everything ticked and nothing changes. ~2 minutes, fully self-serve.
Jeremy: review drafts + load 5 Smartlead sequences (Segments A–E) — working draft copy for all 30 emails (6 steps × 5 segments) is ready now at navira.evanslist.tech/sequences.html. Open the link, click any subject or body to edit in place, and hit Save — changes go straight to the shared database so Evan and Nick can see them too. When the copy looks right, load each sequence into Smartlead one step at a time using the Copy button on each card. 5 campaigns total: (A) Vendor Central friction, (B) Seller Central under-optimized, (C) no Prime presence, (D) fragmented 3P sellers, (E) revenue growth with profit pressure. Phases 1–4 are complete. Phase 5 (campaign enrollment) is the next build — sequences must be in Smartlead before it can launch. The other remaining dependency is Nick's scoring config sign-off. Once both are cleared, campaigns can fire. Sooner is better — no hard deadline today, but this is now on the critical path.💡 Naming is handled for you: in Step 4 of the Scoring Configurator, ⚡ Wire to Smartlead creates the campaign named after the segment — names match by construction, nothing to coordinate. If you already created a campaign in Smartlead yourself, use the “link existing” dropdown next to the Wire button instead (it lists your real Smartlead campaigns, so no typos). One thing the page will ask of you first: Step 3's checklist — confirm each segment's sequence copy matches its definition before its Wire button unlocks.
Nick (optional, before Phase 5 launch): enable “Stop sequence on reply” in each Smartlead campaign — When a prospect replies, Smartlead can automatically stop sending that person further emails in the sequence. This is off by default per campaign and should be toggled on before campaigns fire, otherwise follow-up steps continue even after a reply arrives. To enable: in Smartlead, open a campaign → Settings tab → find “Stop sending emails when a lead replies” (or similar wording depending on your plan) → toggle on → Save. Repeat for every campaign. You can also set this at the account level if your plan supports it: Settings → General Settings → Email sending preferences. If you prefer to leave it off and handle follow-up manually, that works too — the pipeline tracks reply status separately and will not re-enroll a lead who has replied.
GoDaddy domain setup for dashboard — configure subdomain for Phase 6 dashboard deployment (e.g. prospects.navira.io); low priority — Justin + Evan to tackle in Phase 6
Justin: Snowflake deferred — pipeline state store is Cloudflare D1 (navira-pipeline) for the foreseeable future; Snowflake not needed until Phase 5+ volume requires it. No action needed — revisit in Phase 6 if warranted.
✅ Completed — archived (11 items)
Existing-client dedup → D1 — GHL retired (redundant to HubSpot); the dedup list now lives in the pipeline database, seeded from NAVIRA's client + lost/fired lists
trigger.dev setup — correct project selected and local environment configured
Sending domains confirmed — Nick provided navirapartners.com, navirabrands.com, navirahq.com
trigger.dev environment variables set — SmartScout, Snowflake, Apollo, and Smartlead credentials loaded in prod + staging
SmartScout ingestion task built — ingest-leads task ready with discover + ingest modes
Local environment fully configured — all API keys and credentials in .env
Smartlead.ai setup started — Nick connecting mailboxes; warm-up clock running as of May 28
Apollo.io API access — master API key live June 10; integration reworked to Apollo's current API and verified with a single live contact test
SPF/DKIM/DMARC verified + warm-up running clean — confirmed May 29; all 6 mailboxes at 100% reputation in Smartlead Foundation Pool; warm-up running passively from May 28 (~3–4 weeks); no action needed until complete. Mailboxes: Morgan Capri & Keira Loren (navirabrands.com), Levi Matthews & Leo Strawley (navirapartners.com), Emma Carter & Megan Brooks (navirahq.com) — 4F/2M split per recommended 60–70% women strategy
Existing-client + lost/fired lists loaded — cleaned and loaded into the pipeline database (D1) as the dedup source (100 brands); dedup check live in ingestion; backtest dataset ready for Phase 3
Smartlead API access — connected & verified — The Scoring Configurator's Step 4 wires each segment to Smartlead directly: ⚡ Wire creates the (paused) campaign, or the “link existing” dropdown lists your real Smartlead campaigns — no copy-pasting, no risk of a typo breaking enrollment. The Smartlead API key is active and confirmed working. The dropdown populates automatically once Jeremy's campaigns exist in Smartlead. Nothing further needed from your side.
Waiting on SmartScout
Open items with SmartScout's API team (their engineer Zach is responsive — most answers have landed within a day or two). None of these block the current calibration → sequences → wiring path; each one unlocks a specific upgrade when it lands. Updated June 12.
Seller records lookup(asked June 12) — SmartScout's seller data includes the seller's country, name, and how many brands they carry, but their API doesn't yet let us connect a brand to its top seller's record. One answer from their team unlocks four of your CEO's asks at once: the China-based-seller flag, "seller name matches brand name", "only brand in their storefront", and the Review Queue filter for targeting every brand a weak seller manages. Once answered, it's a one-time pull across ~29,700 sellers (an overnight job on our side).
Price & offers history access(two parts, both with their team) — the per-product price-history endpoint currently times out (a bug they've confirmed and are investigating), and the per-seller offers history needs our key whitelisted (justification sent). Together these unlock buy-box suppression evidence — "Amazon suppressed your listing N days this year" is a strong Day-1 email hook for Vendor Central brands — plus price-stability signals.
Historical trend data — the seller-history endpoint returns empty results even on the request shape their team prescribed (open question), and we've asked whether historical in-stock-rate / coverage data can be exposed. This is what the proposed "1P in Decline" segment is waiting for: it stays parked until the trend can be measured honestly rather than guessed.
A pricing-field bug they confirmed — average buy-box price currently mirrors the spot price exactly (no real average). When their fix ships, we get a cheap price-stability signal without the heavy history pulls above.
Everything else previously open with SmartScout has been answered and is already built in — ad-spend/TACoS (live in scoring), the v2 API migration, and confirmation of which fields are placeholders we deliberately never use.
Evans List — Next Steps
Ordered action items for Evans List covering all project phases. Items marked with a blocker are waiting on a dependency from Navira’s side.
Phase 5: build campaign trigger logic — code the segment → Smartlead sequence mapping so the right outreach sequence (A–E) fires automatically per brand tier; includes 24-hr human review queue so Nick’s team can approve/reject before any email enrolls (blocked on Jeremy’s sequence load + Nick’s scoring config)
Phase 5 pre-launch: confirm every segment is verified & wired — before Phase 5 goes live, confirm each segment in the Scoring Configurator has its sequence copy ticked off in Step 3 and shows ● Live in Step 4 (wired to a Smartlead campaign). Wiring creates the campaign for you, so names match by construction — no manual parity check needed.
Phase 5: end-to-end pipeline test — full run from SmartScout ingest through scoring, Apollo enrichment, human review queue, and Smartlead enrollment against live data; confirm deliverability, bounce handling, and HubSpot handoff on reply/call booked
Phase 6: prospects dashboard — internal dashboard at prospects.navira.io showing pipeline health, lead counts by tier/persona, Smartlead performance, and converted partners; Nick’s team gets view-only access; includes “Mark as Partner” button and suppress/snooze controls (blocked on GoDaddy subdomain setup)
Phase 7: QA, documentation & handoff — full integration test, bug fixes, runbook documentation, and handoff walkthrough with Nick & team
✅ Completed — archived (9 items)
Load existing-client + lost/fired lists into D1 — cleaned and loaded as the dedup source for every run (matched by name + Amazon store slug); also the backtest dataset for Phase 3
Run ingest-leads in discover mode — confirmed exact API response structure and all real field names directly against the live API
Update ingestion field mappings — replaced all placeholder field names in src/ingestion/__init__.py with confirmed SmartScout fields; revenue filter enabled and tested (100 brands pulled successfully)
Dedup check live in ingestion task — reads the D1 suppression list every run (name + Amazon store-slug match); skips matched brands before they hit Apollo. GHL retired.
Configure scheduled runs + fan-out — scheduled-ingest cron live (1st of month, 2 AM ET); batchTrigger() fans out one enrich-leads task per brand; PRODUCTION environment only
Phase 2 end-to-end testing — live test passed May 29: 100 brands fetched from SmartScout, dedup checked against the suppression list, D1 state store populated — completed in 19 seconds
Phase 3: brand segmentation engine — multi-signal scorer (8 signals live + Category fit on the target-category list), 5 mutually-exclusive segments (A–E), Hot/Warm/Cold/Suppress buckets; built + deployed, Product Page Score gap added after the June 7 backfill. Backtest against the 47 existing partners is ready to run now that the cohort is scored.
Phase 3: scoring results view (Navira-facing) — per-brand scoring output is now live on the Review Queue (the standalone Results page was merged in). After each scoring run it lists every brand, its single best-match segment, score, Hot/Warm/Cold/Suppress bucket, and mapped Smartlead campaign — so Nick can review the cohort before Apollo credits are spent. Reads the pipeline database directly; nothing to install, no access to grant.
Phase 4: Apollo enrichment — logic built May 31; reworked to Apollo's current API and live-verified June 10 when the master API key arrived (one single-brand test, 1 credit, verified email in brand_contacts); seniority/title/email ranking; batch enrichment gated behind ENRICH_MODE (outreach stays separately locked). Review queue (review.html) live for Nick's sign-off before Smartlead enrollment.