The Upwork Demo Factory
Every relevant Upwork job is read, scored and answered with a working, deployed prototype, built by AI before anyone on the team opens the post.

8,012 jobs scored and 2,005 demos built and deployed in five months.
TL;DR
- 8,012 Upwork jobs scraped and scored by AI between 18 May and 19 October 2026.
- 2,005 custom demos built and deployed to a live URL, one per promising job.
- Human time per demo: about zero. The team reviews, it doesn't build.
The problem
Upwork rewards whoever is fast and stands out. Most freelancers send a block of text. A proposal that says "here's a working version of what you asked for" gets noticed, but building one by hand takes two to four hours. Doing that for every good job is impossible, so normally you'd only do it for two or three a week.
We wanted to answer every good job with a real prototype, within the hour.
What we built
An always-on pipeline on our own Linux server. It takes a raw job post and, without anyone stepping in, returns a live, clickable demo plus everything the next stages need.
Step by step
- 1See which jobs are online. A scraper pulls new posts in our niches (Shopify, Klaviyo, Gorgias and other helpdesks, AI automation) into a Notion database every few minutes.
- 2Read the job. Claude reads the whole post: budget, client history, hires vs posts, total spend, payment verification and country.
- 3Score it. Each job gets a 0–10 score built from three sub-scores (Relevance, AI-fit, Client quality, e.g.
R 9.0 · AI 9.5 · C 9.0), a one-sentence fit reason, a band (Low / Medium / High / Top) and an owner on the team. That job's owner gets a Telegram ping. - 4Decide on best practice. For eligible jobs, Claude Opus picks the demo angle: what would look like a real deliverable on day one? A Klaviyo job gets a flow builder with live metrics. A support job gets an AI inbox triaging realistic tickets. A Shopify↔Xero job gets a reconciliation dashboard.
- 5Build the demo. Opus writes one self-contained HTML app of 600–1,500 lines, with inline CSS and JS, realistic mock data and brand-appropriate colours. No installs, no API keys, nothing that can break in the client's browser.
- 6Deploy. The file goes to Vercel through the API. The pipeline polls until it's live, then switches off SSO protection so the client can open it.
- 7Write back. The live URL and a one-sentence description go back into the Notion row. That's the trigger for the video stage.
A real example
An Irish retailer posted a job for a "Xero + Shopify specialist": payout reconciliation, purchase orders, Irish VAT. Within minutes the pipeline had:
- scored it 7.62 / High (
R 6.5 · AI 7.0 · C 10.0, verified client with $15k spent), - built and deployed a live Shopify-to-Xero dashboard showing order sync, account mapping, Irish VAT handling and reconciliation status,
- passed it on to video and application, where it was submitted the next day with a walkthrough video and answers to all five screening questions.
Under the hood
| Layer | Choice | Why |
|---|---|---|
| Shared state | One Notion database (~50 fields per job) | The team already works in Notion; every stage reads and writes the same row, so anyone can see where a job is. |
| Scoring | Claude Sonnet with a fixed rubric | Cheap and consistent; sub-scores make the band explainable. |
| Demo generation | Claude Opus | Best at single-file apps that look like products, not dev tools. |
| Output contract | Single HTML file, last line <!--DEMO_DESCRIPTION: …--> | Easy to deploy anywhere and easy to parse the summary back out. |
| Hosting | Vercel Deployments API | Public URL in about 80 seconds, no repo needed. |
| Scheduling | Linux cron on our own server | It moved off a Windows laptop in mid-2026 and has been running 24/7 since. |
| Alerts | Telegram ops group | Missing .env, failed deploys and new top jobs all post to one chat. |
Eligibility rule: Score band = Top (later High as well) and not flagged as agent-hire and no demo yet. Each stage only fires when the field it depends on is filled, so a crash never loses work. The next run just picks it up.
Things we had to solve
- Long Notion fields. Notion caps a text block at 2,000 characters, so long applications and job texts are split into multiple segments.
- Vercel auth walls. New deployments are SSO-protected by default, so the pipeline disables protection per project.
- Server resilience. Credentials are gitignored, so a
git cleanon the server once silently broke uploads. The pipeline now sends a Telegram alert if.envor a credential file is missing.
Results
| Metric | Value |
|---|---|
| Jobs scraped and scored | 8,012 |
| Top band (8.5+) | 1,245 |
| Demo concepts written | 3,008 |
| Demos built and deployed | 2,005 |
| Most common job tags | Klaviyo 2,564 · Shopify 2,231 · Shopify audit 1,643 · Shopify Plus 322 · Gorgias 147 |
| Team members routed to | 4 (Konstantin, Anton, Aidana, Ferdinand) |
What we learned
- A demo beats a paragraph. Clients reply to "I built this for you", even when the demo is simple.
- Constrain the output format hard. Banning CDNs, external images and API keys made demos reliable enough to send without checking every single one.
- Make every stage idempotent. "Only run if the field is empty" turned a fragile chain into something that heals itself.
Connected projects
- Next stage → Personalised pitch videos
- Final stage → Auto-apply via the Upwork MCP
- Replies land in → Artikuno OS, our AI CRM
- Same demo engine reused for → App marketplace review outreach
Images.




Ready to build your AI project?
Free 30-minute discovery call. No pitch. Just a conversation about what AI could do for you.
- Free · 30 min
- A concrete first step you can act on
- In German or English, online