Case study 06 · Lab · Automation

Real client work, anonymized. Built and soak-tested, pre-launch: the numbers below are verification evidence, not production stats. No public demo by design.

A listing workflow that ran on copy-paste now runs on a timer.

A property agency found new lots by hand: watching a marketplace for private-seller ads, weeding out other agents, retyping each ad into their listing template, and posting to a spreadsheet and a Telegram channel. I built a pipeline that runs that whole chain automatically, then proved it survives 48 hours unattended.

Role
Solo · design and build
Domain
Real estate · listing automation
Core stack
Python · Sheets · Telegram
Status
Built · soak-tested, pre-launch
01

What it replaced

Five manual steps for every single lot, done by a person. The pipeline runs the same chain on a timer.

By hand
In the pipeline
Finding new lots
By handRefresh and scansomeone watches the marketplace all day
PipelineWatched on a timernew private-seller ads picked up each cycle
Weeding out agents
By handBy eyeeasy to miss, wasted calls
PipelineFiltered automaticallyagent ads dropped before anyone sees them
Photos
By handSaved one by onedownloaded by hand for every lot
PipelineCollected per lotfetched and attached automatically
Listing format
By handRetyped each timetemplate drift, missing fields
PipelineStrict templateone format, every field, every time
Publishing
By handTwo places by handthe spreadsheet, then the channel
PipelineDelivered to bothshared sheet + Telegram channel in one step
02

The pipeline

Five stages, one cycle, end to end with no one watching.

one cycle
Watchnew private-seller ads
Filteragents out, private sellers in
Mediaphotos fetched per lot
Formatstrict listing template
Deliversheet + Telegram channel

03

Proving it won't fall over

Built to run unattended. Every number here comes from the pre-launch soak run, not from the client's production.

48h
Soak runcontinuous, unattended
96/96
Clean cycleszero errors across the run
~230
Photos processedacross 22 lots
0
Manual stepsfrom new ad to published listing
How it was hardened
  • Fault injectionNetwork drops, malformed ads, and mid-write kills were thrown at the pipeline on purpose, until every failure path recovered.
  • Atomic-write crash guardState and output are written atomically: a crash at any point leaves no half-written listing and no corrupted state.
  • Soak before handover48 hours unattended: 96 cycles, ~230 photos across 22 lots, zero errors. Only then was it handed over.

04

Under the hood

Tech stack
Python Google Sheets API Telegram Bot API Fault injection Atomic writes
Working principles
  • Crash-safe by designAtomic writes and resumable state: kill the process at any step and the next cycle picks up cleanly.
  • Strict output contractEvery listing leaves in one exact template; malformed input is rejected and logged, never guessed at.
  • Boring on purposeNo queues, no cloud moving parts: one Python process, a timer, and two delivery targets. Fewer parts, fewer failure modes.
  • Verification as the deliverableThe client got not just a pipeline but the evidence it holds: injected faults recovered, 96 clean cycles on record.
listing-pipeline / one cycle
Timer fires: fetch fresh ads from the marketplace
New ad foundprivate seller, not seen before
Agent filteragency patterns checked, ad kept
Photos collectedevery photo for the lot, attached
Formattedstrict listing template, all fields present
Deliveredrow in the shared sheet · post in the channel
State saved atomically · sleep until the next cycle

Still doing by hand what a pipeline could do on a timer?

This one replaced a five-step manual routine and then proved itself: fault injection, an atomic-write crash guard, and 48 unattended hours with zero errors. Your routine can be next.