Book a callFree 30-min discovery call
Case study · Client: Internal (Artikuno Commerce)

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.

The Upwork Demo Factory
Impact

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

  1. 1
    See 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.
  2. 2
    Read the job. Claude reads the whole post: budget, client history, hires vs posts, total spend, payment verification and country.
  3. 3
    Score 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.
  4. 4
    Decide 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.
  5. 5
    Build 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.
  6. 6
    Deploy. 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.
  7. 7
    Write 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

LayerChoiceWhy
Shared stateOne 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.
ScoringClaude Sonnet with a fixed rubricCheap and consistent; sub-scores make the band explainable.
Demo generationClaude OpusBest at single-file apps that look like products, not dev tools.
Output contractSingle HTML file, last line <!--DEMO_DESCRIPTION: …-->Easy to deploy anywhere and easy to parse the summary back out.
HostingVercel Deployments APIPublic URL in about 80 seconds, no repo needed.
SchedulingLinux cron on our own serverIt moved off a Windows laptop in mid-2026 and has been running 24/7 since.
AlertsTelegram ops groupMissing .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 clean on the server once silently broke uploads. The pipeline now sends a Telegram alert if .env or a credential file is missing.

Results

MetricValue
Jobs scraped and scored8,012
Top band (8.5+)1,245
Demo concepts written3,008
Demos built and deployed2,005
Most common job tagsKlaviyo 2,564 · Shopify 2,231 · Shopify audit 1,643 · Shopify Plus 322 · Gorgias 147
Team members routed to4 (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

Gallery

Images.

How it works: The Upwork Demo Factory
Auto-generated demo: a growth command center
Auto-generated demo: an AI operations assistant
Auto-generated demo: a workspace audit

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
The Upwork Demo Factory – AI project in Vienna | AI Labs