New entrepreneur meets sales. A classic combination that produces anxiety. You're supposed to make cold calls, send LinkedIn messages, attend networking events, and "build a personal brand." Sounds like a full-time job, because it is.

I have a better idea: build a machine that does the exhausting part for me.

The problem: sales that don't scale

Traditional B2B sales for a small business looks like this: google potential clients, browse websites, guess who might need your services, write a message, send it, hope for a reply, forget to follow up.

Every step is manual. If you spend an hour a day on this, you might reach five companies. 25 a week. 100 a month. And most won't respond because your message didn't hit the right pain point at the right time.

That's break/fix sales. Reactive, inefficient, and the first thing that stops happening when real client work picks up.

The solution: the machine prepares, the human decides

I built a tool that automates the entire B2B sales process — up to the draft stage. From prospecting to analysis, message drafts, and reply detection. I click Send; the machine handles everything else.

This distinction matters: drafting is automatic, sending is a deliberate choice. No mass mail, no scheduled spam campaigns. Every message that leaves kmhit.fi has passed my eyeballs first. If I sell automation that splits work between humans and machines, my own pipeline needs to be the showcase.

1. Prospecting: the trade register tells you everything

The tool searches companies directly from the Finnish Trade Register (YTJ/PRH). No googling. I narrow the search by industry code (TOL), region, or company name, and get a structured list into the database.

Searches are saved as profiles — "Kuopio law firms", "North Savo property managers" — so I can re-run the same query when new companies get registered. The pipeline refreshes itself.

At the same time, the tool scrapes each company's website and extracts contact information. It prioritizes the company's own domain and common decision-maker prefixes (info@, myynti@, sales@), but also pulls named contacts when a "Contacts" section exists on the page. Name, title, and address get stored, and they sharpen the analysis in the next step.

2. Analysis: AI scores automation potential

Every prospect gets analyzed automatically. The tool collects three data sources: company website content (services, technology references), open job listings from the Finnish Työmarkkinatori and European EURES, and financial statements from the Finnish trade register's XBRL interface.

Data is fed to Claude. Model selection is automatic, based on the prospect's data richness: thin prospects (one page, no named contact, no job postings) run on Haiku 4.5 — fast, cheap, good enough for bulk scoring. Rich prospects use Sonnet 4.6, with stronger reasoning. This saves money where discrimination isn't critical, and spends quality where it matters.

The system prompt is prompt-cached. In practice, analyses run within the same cache window read it back at roughly 10% of normal cost. Hundred- or thousand-company runs come in significantly cheaper than a naive implementation.

AI scores each company on two axes: automation potential (0–10) and readiness (0–10). High scorers get a detailed analysis and a tailored sales pitch.

Every prospect also produces a downloadable PDF report — a company-specific analysis, not a generic brochure — that goes as an attachment to first meetings. The report contains a summary with the recommended approach, a company profile (industry, headcount, revenue, open roles), key contacts with the suggested person to reach and a personal angle for them, identified automation opportunities, and detailed implementation plans with timelines and ROI estimates. The conversation starts from specifics, not from a pitch deck.

3. Outreach: the machine works the night shift

Writing the first cold email is the most expensive stage in the pipeline: it requires company-specific references to the analysis, the right tone (personal-feeling, not marketing-speak), and the right length (60–120 words, one open question). That's why drafting happens at night.

At 01:00 Helsinki time, the Anthropic Batch API takes over. Batch pricing is 50% of list, and generating 50 prospects' drafts finishes by morning. Cost per message is cents.

In the morning I open the approval queue. I go through the drafts on the keyboard: 's' sends, 'e' opens an editor, 'h' rejects and asks for a short Finnish feedback note in a text field — "too formal", "the job reference got it wrong", "section X is clunky." The feedback flows into the next night's batch, where the message is regenerated with it in mind. The machine learns one failure at a time.

No mass sending. When I approve 20 messages in the morning, they don't all fly out at 9:30 — that would look like a marketing blast in the recipient's inbox. Sends are spread across the workday window (9–16 Helsinki) with random jitter, so each message arrives at a naturally-seeming moment.

4. Sending and reply detection

Sending goes through Microsoft Graph, from my own mailbox (kalle.huttunen@kmhit.fi). No SMTP, no username/password pairs, no client secrets — just a refresh token bootstrapped once and a public Entra app client-id. The message leaves exactly as if I had clicked "Send" in Outlook.

Reply detection: a background loop polls the same mailbox for unread "Re:" and "Vs:" messages every five minutes. When a matching campaign is found, it's marked "reply received", pending follow-ups are cancelled, and I get a notification. The human picks up the conversation where the machine left off.

Messages go out GDPR/PECR-compliant: List-Unsubscribe header included, and by default no tracking pixel, no click-through redirects. Open tracking can be switched on, but it instantly makes the message look like marketing — which isn't the impression a personalized outreach is going for.

5. Dashboard: the entire pipeline in one view

A scoring table shows the hottest prospects. A kanban view tells you where each one stands. An approval queue shows what's waiting for a click. Campaign stats: reply rate, conversions, pipeline growth per week. One "Draft All Outreach" button creates drafts for every eligible prospect at once, which the nightly batch then takes over.

Why I built it myself

There are dozens of sales automation tools on the market. HubSpot, Pipedrive, Apollo, Lemlist. Each costs 50–500 euros per month, and none of them integrate with Finnish data sources: YTJ, PRH, Työmarkkinatori. And none of them are built draft-first — they all default to mass scheduling, and if you want an operator in the loop, that's an add-on you have to engineer yourself.

I built my own because I needed a tool that understands the Finnish market. And because I want to eat my own dog food: if I sell automation to clients, my own sales should be automated. But automated in a way that keeps control — not one where next week I get a message from a client asking "why did three identical emails arrive from you an hour apart?"

The tech under the hood

Since this is a technical blog, here's a quick look at the architecture.

Backend: Python 3.12, FastAPI async throughout, SQLAlchemy async, PostgreSQL 16, Alembic migrations. Frontend: React 19, TypeScript, Tailwind, Vite.

AI: Anthropic Claude API. Model selection is based on a calculated data-richness score — not a fixed rule but a computed threshold (named contacts, website depth, job postings, revenue level). Haiku 4.5 for thin prospects, Sonnet 4.6 for rich ones. Prompt caching cuts repeated-run input costs to a fraction. Nightly bulk drafts go through the Batch API at 50% pricing.

Sending: Microsoft Graph, public-client + refresh-token flow. No client secret, no SMTP, no IMAP. Mailbox polling picks up replies at a five-minute resolution.

Scraping: BeautifulSoup by default, Playwright fallback for JavaScript-heavy sites that don't render server-side. SSE streaming pushes analysis progress into the browser in real time.

Dev mode: works without an API key (MOCK_CLAUDE=true). Mock responses are calibrated to be realistic, so the UI can be developed without costs or network access.

All Finnish data sources are free and public. No paid data providers.

What this looks like in practice

The old way: 1 hour per day on prospecting and writing messages. 25 contacts per week. Most of them generic. Follow-ups forgotten. When the first client work picks up, sales stops entirely.

The automated way: The nightly batch drafts 50 messages, 15 minutes of keyboard approval in the morning, sends spread across the workday window. Replies picked up from the inbox automatically. When client work picks up, the pipeline doesn't stop.

This is the same principle I build for clients: identify repetitive manual work, automate the preparation, keep decision authority with the human. The difference is that this time, the client is me.

What about your sales pipeline?

This tool solves my problem. But the same thinking applies to any business where sales, quoting, reporting, or client communication is manual work.

If you recognized your own daily routine in this description, that's a good sign. It means automation could have a concrete impact on your work too.

Want to find out what could be automated in your daily work? Automation Kickstart begins with a mapping session: we identify repetitive processes, prioritize, and implement the quickest win first.