swittgtm
04 · Notes

— N° 01 · Build log

Pseudocode 101: what survived contact with the actual tools

The pseudocode I wrote a few days ago had five clean steps. Building it took most of a day, and almost none of that day went to the parts I planned for.

Slack → n8n → Clay @BoothNotes #tradeshow-leads Sep 2026
i · The plan

At the time this was clean IF/THEN logic — credit-conscious, one direction. Five lines:

  1. Capture
  2. Single AI pass
  3. Enrich if Hot
  4. CRM lookup
  5. One-way push

// clean IF/THEN logic · credit-conscious · one direction

ii · What survived

The actual shape of the pipeline. Slack capture, n8n as the connector, Clay as the qualification layer, enrichment gated behind a hot flag. The architecture in the pseudocode is the architecture I built.

iii · What broke, in order
  1. challenge‑responsehit Capture

    Slack’s Events API needs a synchronous challenge-response handshake before it will accept a webhook URL at all.

  2. Socket Modehit Capture

    Socket Mode was silently on in my Slack app, routing events over a WebSocket instead of my Request URL. Everything downstream looked perfectly configured and nothing arrived — no error, just silence. This one cost the most time and taught me nothing about GTM logic, only about Slack’s config surface.

    ◦ biggest time sink
  3. Generate transcripthit Single AI pass

    I assumed Slack’s native “Generate transcript” feature could replace AssemblyAI. It can’t run headless — it’s a manual, per-message button tap in the Slack UI. My “single AI pass” step quietly assumed transcription was a solved input, not a thing I’d have to build.

  4. files:readhit Capture

    A missing files:read scope produced a 403 that looked identical to a dozen other possible failures. I chased token formatting, redirect settings, and file-type mismatches before finding the actual cause.

  5. n8n credentialshit Capture

    n8n’s credential dropdowns kept silently reverting to unselected after node edits. Twice I re-tested a “fixed” node and got the exact same failure, because the fix never actually saved.

iv · Off-plan

What I added that wasn’t in the plan

The entire file-download step — Slack → n8n, an authenticated pull of the actual audio bytes — doesn’t exist anywhere in my pseudocode. I wrote “if a voice memo lands in the table” as if the memo just appears. Getting from “rep records audio” to “AI can read text” is four separate authenticated hops, each with its own failure mode.

  1. Slack event delivered
  2. authenticated GET of file bytes
  3. upload to AssemblyAI
  4. POST transcript to Clay

The built Process Booth Notes workflow. One node (Slack Trigger) is pseudocode step 1 as written. One (HTTP Request · GET file bytes) was in the plan nowhere. The middle four are the transcription service I assumed I’d get for free; the last hands the transcript to the Clay table.

(The working table runs on placeholder company and contact names, so the enrich-company waterfall stays dormant — invalid domains, nothing to fire on.)

v · The assertion

Good pseudocode tells you whether your logic is sound. It tells you nothing about whether your infrastructure will let that logic run.

Pseudocode is a plan for the business logic, not a plan for the plumbing. My IF/THEN steps were right about when to enrich, when to flag as hot, when to notify a rep. They were silent on everything about how two systems actually exchange data — auth, verification, async waits, format mismatches.

The gap wasn’t in my reasoning about the GTM problem. It was in treating “capture the voice memo” as one pseudocode line when it’s the majority of the real build.

4 of 5 breakages landed inside step 1, Capture 1 node of 7 matched the plan as written
vi · Review — RS

Rethinking what data is available to a vendor pre- and post-event, versus what you get as an attendee gathering leads.

  • Registration-list matching

    lower efforthigher near-term value

    If the full attendee registration list is provided pre-event, cross-reference the extracted company and contact name from the hot-flagged rows against that list.

  • Badge OCR

    separate project

    If a rep photographs the attendee’s badge, OCR extracts name / company / title directly from the badge — bypassing the “AI has to correctly parse a rambling voice memo” problem entirely.

← All notes