Workflow Consultants.ai
№ 02 · 2025 · SaaS · in-house Live · ours

Upwork Pipeline, end-to-end sales automation that runs while we sleep.

End-to-end sales automation we built for ourselves: it monitors job postings, filters for fit, drafts the outreach, and hands a short, pre-qualified queue to a human to send. Runs 24/7.

Engagement
Internal build · ongoing
Sector
SaaS · in-house
Primary stack
n8n · GPT-4o · Postgres
Headline outcome
200+ postings/day, hands-off
Connect

Wire the firehose, not the chair behind it.

The Upwork job feed is a firehose, and most of it is noise. Reviewing it by hand doesn't scale; skimming it fast means missing the postings that are actually a fit. Step one was wiring the feed into our own system. n8n polls the Upwork API every few minutes; every posting lands in a canonical Postgres queue with its full context; the same queue threads through to Slack where the actual outreach gets read and sent. The Upwork side, our side, and the human-in-the-loop side are one pipe now.

Decide

The AI scores. The AI drafts. The AI never sends.

Each new posting hits a scoring step that weighs the kind of work we take on, the signals in the language, the rate range, and the engagement shape. Above the bar, GPT-4o drafts the outreach, tailored to the posting, not a template. Below the bar, the queue moves on. The model's job is judgment scaled, not replacement. Every draft is a recommendation a human can read and act on.

Build

200+ postings a day. Hands-off until the send.

The full pipeline runs hands-off: Upwork API → score → draft → review queue. The one thing we deliberately did not automate is the send. A drafted message lands in Slack; a person reads it, edits if needed, and sends. The pipeline scales the sourcing and the drafting; the human still owns the relationship. n8n does the orchestration because the work is mostly glue. Postgres is the canonical record of every posting we've seen, every score, every draft.

Operate

Tune the bar. Refresh the prompts. Watch what gets sent.

A pipeline like this drifts. The fit-bar that worked last quarter starts catching the wrong things this quarter; the drafted-outreach voice starts sounding samey to recipients; a model upgrade shifts the scoring distribution. We stay on it, re-tuning the scoring criteria as response data accumulates, iterating the drafting prompts, watching the send/skip ratio, occasionally adding a new signal source. It's a daily-use system; we treat it like one.

Architecture

The shape of the system.

SourceUpwork job feedpolled · every few minutes
SpinePostgres queuecanonical posting + score table
AIGPT-4o · fit scorerscores, drafts, never sends
HumanSlack review queuea person sends · always
→ ingestion · → scoring · → drafting · → human send
Stack

What we picked, and why.

n8nGPT-4oPostgresUpwork APISlack (review queue)Terraform (infra)

n8n does the orchestration because the pipeline is mostly glue: polling, branching, calling out to a model, writing rows. Postgres is the queue and the memory: every posting we've seen, every score, every draft. GPT-4o does the scoring and the drafting. Nothing here is exotic, that's the point. It's a workflow we can hand to a client and they can read it.

Got a project in mind?

Tell us the problem. We'll tell you honestly whether we can help.

30 minutes, no pitch. Mike runs the call.