Pedro V. Nova Cape Town

Automation, data pipelines, scraping

I build automation that keeps running after the day it was built.

Most automation breaks quietly. An interface changes, a login expires, a step fires sixty times instead of once, and nobody notices until the numbers are already wrong.

I have hit all three of those in production and fixed them. So I build with them in mind from the start, which is a different thing from building something that works on the day you hand it over.

Things that broke

Real failures from workflows I have shipped, and what each one turned out to be. Open any of them.

FAIL Every store came back as "not a real shop", including ones I could open in a browser Fix

Cause: the address parser stopped early It read a web address up to the first ".co" it found, so a South African shop at dunns.co.za was being read as "dunns.co", which does not exist. Everything after that failed for the wrong reason, and the real problem, that my search was returning South African results instead of American ones, stayed invisible. Reading the whole address first, then filtering by country, made the actual problem obvious in one run.

FAIL A coffee roaster passed a filter designed to find clothing shops Fix

Cause: the test asked the wrong question It looked for a few clothing words anywhere in a catalogue. A roaster selling three branded t-shirts cleared that easily, and so did a gift shop selling cotton napkins. Counting product by product and requiring most of the catalogue to be clothing fixed it. The lesson generalises: a check that scans for the presence of something will always be looser than a check that measures how much.

FAIL A workflow that ran fine for weeks started being refused by the spreadsheet Fix

Cause: one step was running once per row It was reading the same sheet once for every incoming item. At fifteen rows nobody noticed. At sixty-seven it exceeded the allowed requests per minute and stopped. The fix was one setting, but the useful part was recognising the shape: a failure that arrives with growth rather than with a change, and would have returned at a hundred rows if I had only cleared the error.

FAIL Contact details were being collected from the wrong company Fix

Cause: nothing checked whether the result made sense The collector took the first plausible looking address it found on a page. Sometimes that was placeholder text left in a template. Sometimes it was a phone number and an address run together. Once it belonged to an entirely different business. Adding a validation step that rejects placeholders outright, and flags anything sitting on a domain that does not match the site it came from, turned silent bad data into a visible note I could act on.

FAIL Checking fifty sites in one run timed out before finishing Fix

Cause: expensive work happening before cheap work Every site was getting a second request to check its trading currency, including the great majority that had already failed on price or size. Moving that request so it only runs on sites that passed everything else cut the outbound calls by roughly ninety percent, with no change to the result. Ordering checks from cheapest to most expensive is free performance, and it is almost always available.

FAIL A report showed a total of zero against data that clearly had sales in it Fix

Cause: numbers that were not numbers, and dates read backwards Quantities had arrived as text, and dates in day-month-year order were being read as month-day-year, so most rows fell outside the reporting week. Neither threw an error. Both produced a confident, wrong answer. Every reporting engine I build now opens with a data quality check that runs before anything is calculated, because output that looks finished is more dangerous than output that fails.

What I build

Mostly work where the value sits in the data being right, not just in the thing running.

Lead generation pipelines

Find businesses, check them against your rules, pull their contact details, put the good ones where your team already works. One I built checks fifty online stores per run against nine separate filters and rejects around ninety percent of them without anyone looking.

Data cleanup and reporting

Turning messy exports into something a person can read in two minutes. Built and tested against twelve different ways the incoming data can be broken, because in practice it usually is.

Integrations that survive

Spreadsheets, interfaces, scraping, scheduled jobs. Built around the parts that quietly fail later: expired logins, request limits, paging, and steps that run more times than you think they do.

How I work

Short, clear steps, and I tell you what I am doing as I go. You should never have to ask where something is.

If part of a brief will not work the way you expect it to, I say so before we start rather than after. That conversation is cheap at the beginning and expensive at the end.

Around fifteen hours a week, so I take one or two projects at a time and finish them properly rather than carrying five.

Background in Data Science and IT, Honours. Which mostly means I care whether the numbers coming out are correct, not just whether the workflow turned green.

Get in touch

hello@valerynova.com

Tell me what you are trying to automate and what it currently costs you to do by hand. That is usually enough for me to say whether it is worth building.