An outbound engine that diagnoses a restaurant before contacting it
The Challenge
Chefshot makes commercial food photography without a studio, and the product works. The problem was that a restaurant owner does not wake up wanting better photography — they want more orders. Their menu photos are, in their mind, fine. The gap between what they have and what changes their conversion rate is invisible to them, and no campaign closes an invisible gap. Doing the diagnosis by hand was not viable either: judging a restaurant's photography properly takes a minute or two of real attention, and writing a specific observation takes several more, which is five minutes per prospect for a message with a single-digit reply rate.
Stack
- n8n
- Dify
- Apify
- Apollo.io
- Twenty CRM
- PostgreSQL
- Vercel AI Gateway
Engagement: Own product: architecture and engineering by me, ongoing.
Read the full architecture and where it breaks at 100kThe Architecture
- A search matrix — city × cuisine × qualifier — built in code at the head of the pipeline, so the targeting decision is versioned and reviewable rather than scattered across a scraper config
- Batched scraping, one matrix combination per run, so a single query never has to survive a timeout
- A deduplication funnel that checks each venue against the CRM by stable Place ID before any paid API touches it — the cost control that makes the economics work
- An inverted image-triage step: a fast vision model is asked to choose the WORST dish photo from a candidate pool, because a restaurant's worst hero-dish shot is the one costing them orders
- Diagnosis through a Dify agent with a retrieval knowledge base holding the photography standard and a library of before-and-after cases, so the critique cites a rule rather than an opinion
- A parallel enrichment branch (company fundamentals and decision-maker contacts) that writes Company → Person → Diagnosis into the CRM in that order, so no record is orphaned
The Impact
- One person operates the pipeline: the diagnostic judgement, which is the only genuinely expert step, runs at machine speed while everything downstream stays reviewable
- Outreach carries a specific, checkable critique of the recipient's own photograph, which is what distinguishes it from a campaign
- Deduplication before any paid call keeps unit cost proportional to genuinely new prospects rather than to scrape volume
- The design has a known ceiling, calculated rather than assumed: about 300 venues an hour, so ten thousand takes roughly a day and a half, and a hundred thousand would take two weeks of continuous execution — at which point the orchestration has to be replaced with a queue and a stateless worker fleet rather than tuned