Automation
The work your staff do by hand every week because no system does it: moving data, chasing approvals, filling forms, reconciling files. We make it run on its own, with a human only where one is needed.
- Kind
- Operate
- Timeline
- 1 to 6 weeks

What this is
Automation is any process that currently needs a person to copy, click, check or chase, and does not need to. Weekly reports assembled from four exports. Orders typed from PDFs into the ERP. Approvals that live in someone's inbox. Supplier portals that must be visited by hand. We replace the hand with a program, keep a person where judgement is needed, and make the whole thing visible.
What you get
- A written map of the process as it actually happens, including the exceptions. This alone is often worth the engagement.
- The automated version, running on a schedule or on events, with every run logged and every failure sent to a named person.
- A review step wherever money, people or legal weight is involved: one screen, approve or reject, nothing hidden.
- Browser automation for systems with no API, written to survive small layout changes and to stop loudly, not silently, on big ones.
- Document handling: PDFs, scans and spreadsheets in, structured data out, with confidence and a review queue for the uncertain ones.
- Ownership. The automation runs on your accounts and the code is yours.
Typical scope
- One process, end to end. "Every Monday, the margin report builds itself from the ERP, the bank and the sheet in finance, and lands in the channel by 08:00."
- Inbox-driven work: incoming orders or applications are parsed, checked, entered and acknowledged, with exceptions queued for a person.
- Compliance routines: evidence collected, checks run, a report produced on a schedule, with the trail an auditor expects.
How we build it
export const weeklyMargin = workflow("weekly-margin", async (step) => {
const [erp, bank, sheet] = await Promise.all([
step.do("erp export", () => erp.exportSales(lastWeek())),
step.do("bank", () => bank.transactions(lastWeek())),
step.do("sheet", () => sheets.read(FINANCE_SHEET)),
]);
const report = await step.do("reconcile", () => reconcile(erp, bank, sheet));
if (report.unmatched.length) await step.do("ask a human", () => review.request(report));
await step.do("publish", () => chat.post(CHANNEL, render(report)));
});Every step is retried on its own, the run can resume after a failure, and the history of every run is kept.
Timeline
One to six weeks. Small automations ship in days; ones involving legacy systems or document extraction take longer, mostly in testing against real cases.
Good fit if
- Someone can show us the process as they do it today, screen by screen.
- The process happens often enough to matter: weekly or more, or rarely but painfully.
Not a fit if
- The process changes every time it runs. Then it is not a process yet, and we will say so.
Related
- Automation playbook for how we decide what to automate first.
- Backend systems and APIs
- AI and LLM integration for the steps that need reading or judgement.