Back to work
RE
Workflow / outreach ops
ReachLog - Outreach workflow and dedupe proof
Single-owner outreach system for tracking targets, messages, replies, bounces, forms, follow-ups, and dedupe protection.
Best for
- private GTM workflow proof
- dedupe-heavy target tracking
- reply and follow-up operations
- small internal tools that need auditability
Built to keep high-volume outreach auditable, searchable, and hard to duplicate.
What it does
Useful proof without the full internal dump.
- stores targets, contacts, source, status, and dedupe keys
- imports canonical CSV outreach data with dedupe preview
- tracks emails, forms, replies, bounces, skips, and follow-up state
- syncs mailbox activity through worker scripts
- links inbound replies to existing threads where possible
- exports targets, messages, events, forms, and follow-ups
Build notes
Implementation choices that matter.
- Dedupe first
- The schema treats duplicate prevention as a database concern, not just a UI warning.
- Mailbox sync
- Worker scripts connect outbound, inbound, bounce, and follow-up state to one target record.
- Review queue
- Replies and due follow-ups stay visible so execution does not depend on memory.
Workflow summary
Reply and follow-up control
Reply triage
Action queue
Follow-ups
Due / overdue / upcoming
Dedupe
Import and send guard
Reply needs action
today
Follow-up due
open
Dedupe key hit
skip
Next.js
TypeScript
React
Tailwind CSS
Drizzle ORM
SQLite
IMAP
SMTP
Node Workers
CSV Import
UI screenshots
ReachLog in use
Private UI excerpts from the outreach workflow. Names, emails, and mailbox data are masked where needed.
Dedupe schema / unique-index logic
typescriptexport const targets = sqliteTable(
"targets",
{
id: text("id").primaryKey(),
dedupeKey: text("dedupe_key").notNull(),
doNotResend: integer("do_not_resend", { mode: "boolean" }).notNull(),
},
(table) => ({
dedupeKeyUnique: uniqueIndex("targets_dedupe_key_unique").on(table.dedupeKey),
})
);
- Purpose
- Resolve each target to one canonical dedupe key.
- Guardrail
- Stops duplicate imports and sends when the same company appears through email, form, or CSV.
- Tradeoff
- Requires normalization before insert; the database becomes the final protection layer.
Fit
Relevant when workflow state, dedupe protection, and private operator UX matter more than a generic CRM.
Demo available on request.
Related project pages
Crawler / audit evidence
ILCrawler
Crawler/audit system for turning raw crawl, rendered, Lighthouse, and issue evidence into reviewable SEO handoff data.
SEO decision layer
MarketEngine
Internal system for deciding whether an SEO task is worth doing before it becomes a ticket.
Search intelligence cockpit
SearchCaliber
Private dashboard that connects a site, its crawl evidence, market research, and approved SEO actions in one place.