The Wicflow stack is the toolkit Felix Wickholm uses to deliver AI automation projects to Finnish and Nordic B2B clients. Every tool below is either running in production right now or has been ripped out and replaced after a real fight with it. Nothing here is theoretical.
I'm publishing this because I trust transparency more than mystery. If you're evaluating us, you should know what we ship with. If you're another builder, steal what fits. The agencies that try to keep their stack secret are usually hiding the fact that there isn't much under the hood.
This post covers the AI models we call, the orchestration layer we run on a VPS in Frankfurt, the CRM we picked over HubSpot for our own ops, the cold-email machine, the bookkeeping rails, the hosting layout, and the philosophy behind every choice. Plus what we refused to put in the stack and why.
One-sentence summary of the stack
Claude as the brain, n8n on a Hostinger VPS in Frankfurt as the nervous system, Twenty CRM as the memory, Instantly for outbound, Cal.com and Procountor for the boring-but-critical parts, and Cursor plus Claude Code for everything we build. EU hosting end-to-end. No client data trains any model.
AI models: Claude first, GPT-4o for specific cases, local for residency
The model layer is where most agencies make their first identity choice, and we made ours early.
Claude (Anthropic) is the default. Reasoning, long-context tasks, writing in a specific voice, structured tool use, agent loops, and anything where instruction-following matters. Claude 4.6 and 4.7 are what we ship with in 2026. We use the EU regional endpoint where the workload supports it, and we cache prompts aggressively to keep costs sane.
OpenAI GPT-4o covers the cases where Claude is not the right tool. Image understanding (receipts, invoices, screenshots), Whisper-style audio transcription when Fathom isn't already in the pipe, and OpenAI's text embeddings for vector search. We don't have a religious view on this. Different models, different jobs.
Local models come out when a client's data residency rules forbid any external API call. We run Llama 3.3 70B and Mistral on the same Hostinger VPS for those cases. Lower quality than Claude, but the data never leaves the box. For one Finnish municipal client, that constraint was the entire reason they could work with us.
What we don't do: build the whole product around one model. The model layer should be replaceable in an afternoon. If Anthropic raises prices 3x tomorrow, we route the easy traffic to GPT-4o and the hard traffic to Llama. The orchestration layer is what stays.
Orchestration: n8n self-hosted, Python and TypeScript when needed
n8n self-hosted on a Hostinger VPS in Frankfurt is the spine of every Wicflow project. It runs the cold-email enrichment, the inbox triage, the CRM syncs, the Fathom-to-CRM pipelines, the Slack alerts, the WhatsApp/Twilio bridges, and most of the daily reports our clients see in their dashboards.
Why n8n over Make or Zapier:
- Self-hosted, EU-only. Our VPS is in Frankfurt. Make and Zapier route through US infrastructure by default, which is a problem for Finnish municipalities and any client with strict GDPR posture.
- Pricing scales with hardware, not executions. A 16 GB Hostinger VPS at around 30 EUR per month runs 100,000+ workflow executions. The same volume on Make is north of 500 EUR.
- Drop-down to code. When the no-code path runs out, we drop into a Code node and write JavaScript or Python. Make and Zapier both offer this, but n8n's developer experience is meaningfully better.
- Open-source. If n8n the company disappears tomorrow, our workflows still run on the open-source Docker image we already have.
When n8n is the wrong tool: anything that needs sub-100ms response times, anything with complex state across many requests, or anything where the workflow is the product (not the glue). For those we write proper Python or TypeScript services. Wicflow has 14 active n8n workflows in production right now and 6 standalone Python services.
CRM: Twenty for our own ops, client CRM for client work
Twenty CRM runs Wicflow's internal sales and delivery. Open-source, self-hosted on the same Frankfurt VPS, Postgres-backed. Robin (Wicflow operator) and I both work in it daily. Companies, contacts, deals, notes, every Fathom call summary, every proposal status. The data lives in our database, not someone else's tenant.
Why Twenty and not HubSpot for our own ops:
- Open-source. The whole codebase is on GitHub. We can fork it, patch it, run it. We have done all three.
- Self-hosted EU. Same Frankfurt box. Same DPA story we sell to clients.
- Postgres underneath. When we need to write a custom report, we write SQL. When we need to sync with n8n, n8n hits the Postgres directly. No 250-call-per-day API limit.
- Honest pricing. Free, because we run it. HubSpot Sales Hub Pro is 100+ EUR per seat per month, and the price ladder is designed to punish growth.
The trade-off: Twenty is younger and rougher than HubSpot. Reporting is thinner, marketplace integrations don't exist, and you have to be comfortable being your own ops team. For a 2-person agency that ships its own integrations, that is fine. For a 50-person sales org, it is not.
For client work, we use whatever the client already has. HubSpot shows up most often (we know it cold). Pipedrive is common for smaller Finnish SMBs. Salesforce for enterprise, when we have to. We do not force a CRM migration on any client.
Outbound: Instantly + Apify + custom scrapers
Cold outbound is one of the things we do for ourselves and for clients, so the stack here gets a workout.
Instantly is the sending platform. We run 8 to 12 warmed inboxes per active campaign, with daily caps of 30 to 50 messages per inbox. Instantly handles the warmup, the rotation, the unsubscribe handling, and the basic deliverability monitoring. It is not perfect, but it is the best of the bunch in 2026 for this price band.
Apify for lead-list building when an off-the-shelf scraper exists. Google Maps Pro Scraper for local SMBs, LinkedIn Sales Navigator scrapers for B2B targeting, Apollo enrichment when we need email + role + company size in one pass.
Custom Python scrapers when Apify doesn't have what we need. Finnish-specific sources like the PRH (kaupparekisteri), Asiakastieto, Vainu, and Finder.fi are scraped through internal scripts so we get the exact shape of data we want. We never buy "1 million Finnish emails" lists from murky vendors.
The full lead-to-reply pipeline goes: scrape, enrich, qualify with Claude, personalize the icebreaker with Claude, push to Instantly, monitor replies, route hot replies into Twenty as deals, send recap to Felix on Slack. That whole loop is one n8n workflow with a handful of supporting Python scripts.
Inbox: Gmail API + Python, not the Gmail MCP
Email is the most-touched surface in the entire agency. We run all of it through the Gmail API directly with custom Python scripts. OAuth tokens in a shared directory, auto-refresh handled, scripts wrapped as Claude Code skills so we can call them with one line.
We do not use the Gmail MCP. It re-authenticates constantly and breaks mid-session. Fine for prototyping, not fine for an agency processing hundreds of inbox events per day.
What runs on top of Gmail:
- Inbox triage. Claude classifies every new message into hot/follow-up/noise, drafts replies for the top tier, and surfaces a daily summary at 9:00 Helsinki.
- Receipt extraction. Receipts and supplier invoices are pulled by a scheduled job, parsed by Claude, pushed to Procountor with the PDF attached.
- Reply routing. Cold-email replies from Instantly get re-classified, routed to Twenty as fresh deals, and notify Felix or Robin.
One non-negotiable: nothing auto-sends. Every outbound email is drafted into Gmail and waits for a human click. Cold-email cadences via Instantly are the only exception, and those use pre-approved templates. The cost of a wrong-tone reply is much higher than the cost of one extra click.
Calendar: Cal.com self-hosted
Cal.com self-hosted on the same Frankfurt VPS handles every meeting booking. cal.wicflow.com for Wicflow, separate instances for clients who want their own scheduling page.
Why self-host instead of the hosted Cal.com tier or Calendly: data sovereignty, white-labeling for free, and the same logic as the rest of the stack. The Calendly equivalent costs 12 to 16 USD per user per month. The Cal.com Docker container runs on hardware we already pay for.
The trade-off: we maintain it. Updates, database backups, SMTP config when invitations stop sending. For a small team that already operates a VPS, the cost is one or two hours per quarter.
Bookkeeping: Procountor and Holvi for Finnish accounting
The unsexy half of the stack that most agency posts skip. Finnish bookkeeping has specific requirements, and the right tools save 8 to 12 hours per month.
Procountor is the accounting software. Sales invoices, purchase invoices, VAT (ALV), year-end. Our accountant works in the same instance, which means month-end takes a week, not a month.
Holvi is the business banking layer. Card transactions sync to Procountor once a day. Every euro in and out is matched to an invoice or a category within 24 hours.
On top sits a Python script (wrapped as a Claude Code skill) that reads receipt emails, extracts vendor + amount + VAT, creates the purchase invoice in Procountor with the PDF attached, and reconciles against the matching Holvi transaction. The full bookkeeping loop is now under 30 minutes per week.
Hosting: Hostinger VPS Frankfurt for shared, Vercel and Netlify EU for client sites
Hostinger VPS Frankfurt runs the shared Wicflow infrastructure: Twenty CRM, n8n, Cal.com, Postiz (social scheduling), and a few internal tools. One 16 GB / 4 vCPU box, around 30 EUR per month, Docker Compose, Traefik in front for SSL termination via Let's Encrypt. Backups to Hetzner Storage Box nightly.
Why Hostinger and not Hetzner or Scaleway: pricing in this VPS class is essentially identical, Hostinger's Frankfurt region met our latency targets from Helsinki, and the management UI is good enough that Robin can handle 80% of the day-to-day without me.
Vercel with EU regions for Next.js client sites where the client wants edge functions and the polish of Vercel's preview deployments. The Wicflow demo site, the Twenty-CRM-as-a-service test deployments, and a few client production sites run here.
Netlify with EU regions for static client sites and JAMstack projects. wicflow.com itself runs here. Forms, redirects, and the basic CDN cover 90% of what a marketing site needs.
What we avoid: AWS direct (overkill for our scale, regional config is fiddly), Heroku (US-only effectively), and any platform that does not let us pick an EU region in three clicks.
Code: Cursor + Claude Code for development
Every line of Wicflow's own code, every n8n custom node, every Python script, every client repo is written in Cursor with Claude Code (claude.ai/code) as the agent layer. Cursor handles the editor and inline completions, Claude Code handles the multi-file refactors, the planning, and anything that needs a real shell.
Stack details for the code we ship:
- Frontend: Next.js 14+ App Router, React 19, TypeScript strict, Tailwind, shadcn/ui
- Backend: Python 3.9+ with FastAPI, or TypeScript with Hono when the team prefers JS
- Database: Postgres (the Twenty/n8n shared box, or per-client RDS-equivalent)
- Auth: Supabase Auth for client apps, custom OAuth for internal tools
- CI/CD: GitHub Actions, deploy to Vercel/Netlify on merge to main
Repos live on GitHub under felixwickholm. Robin has access. Branch naming is feat/, fix/, refactor/, chore/. Commit messages explain the why, not the what. Boring discipline that pays back the first time something breaks at 11pm.
Compliance: EU-only data residency, no model training, sub-processor list on request
Compliance gets its own section because half of our prospect calls now start with a procurement question.
- EU-only data residency. Hostinger Frankfurt for shared infra, Vercel and Netlify EU regions for sites, Anthropic and OpenAI EU endpoints where the workload supports it.
- No client data trains any model. Anthropic and OpenAI both offer this contractually on the API tier, and we have it confirmed. We do not use ChatGPT consumer or Claude.ai consumer for client data, ever.
- Sub-processor list on request. Every Anthropic, OpenAI, Hostinger, Vercel, Netlify, Instantly, Cal.com line item with the data flow described.
- DPAs signed. Standard SCCs in place where transfers happen. Transfer Impact Assessments done for the US-headquartered vendors that touch metadata.
- Bring-your-own-key option. For clients with their own Anthropic or OpenAI agreements, we route through their key. Their billing, their DPA, our orchestration.
This is not the fun part of the stack. It is the part that decides whether a Finnish municipality, a regulated SaaS, or a corporate procurement team will sign at all.
The full stack at a glance
| Layer | Tool | Why |
|---|---|---|
| AI primary | Claude (Anthropic) | Reasoning, voice, instruction-following, long context |
| AI secondary | OpenAI GPT-4o | Vision, OCR, embeddings |
| AI local | Llama 3.3 / Mistral | Strict data residency, on-VPS only |
| Orchestration | n8n self-hosted (Frankfurt) | EU residency, fixed cost, code escape hatch |
| Custom code | Python / TypeScript | When n8n is the wrong shape |
| CRM (own ops) | Twenty CRM self-hosted | Open-source, Postgres-backed, EU-hosted |
| CRM (client) | HubSpot / Pipedrive / Salesforce | Whatever the client already runs |
| Outbound | Instantly + Apify + Python | Inbox warmup, scrapers, full pipeline |
| Inbox | Gmail API + Python (not the MCP) | Stable auth, scriptable |
| Calendar | Cal.com self-hosted | White-label, EU, free at our scale |
| Bookkeeping | Procountor + Holvi | Finnish accounting + business banking |
| Hosting (shared) | Hostinger VPS Frankfurt | 16 GB / 4 vCPU, ~30 EUR/mo |
| Hosting (sites) | Vercel EU + Netlify EU | Edge functions, preview deploys, EU regions |
| Code editor | Cursor + Claude Code | Inline AI + agent loops |
| Stack (web) | Next.js / React / TS / Tailwind / shadcn | Standard, fast, hireable |
| Auth (client apps) | Supabase | EU region, fair pricing |
The Wicflow philosophy
Four principles run underneath every tool choice above. They are how we think, not how we market.
Own the stack. Self-host where it matters. The infra layer is leverage. Renting it from a US SaaS that can change pricing or terms next quarter is leverage we are giving away.
EU-first. Not because of ideology, because of customers. Finnish and Nordic B2B clients increasingly require EU data residency in writing. Building EU-first from day one means we never have a "let's migrate everything" project to sell against ourselves.
Transparency. Every client sees the sub-processor list, the architecture diagram, the data flow. If we are scared to show how something works, that is a sign we should fix the thing, not hide it.
Replaceable parts. Every component should be swappable in under a week. If a vendor goes hostile, raises prices 5x, or gets acquired by someone we don't trust, we should be able to switch without a strategic crisis. This is why we self-host the heavy bits and keep the model layer abstracted.
What is intentionally NOT in the stack
Just as informative as what is in.
- Salesforce. For our own ops. Per-seat pricing punishes growth, the API limits are designed for upselling, and the data is locked behind a complex export. For client work, we will use it if they have it.
- Marketo, Pardot, HubSpot Marketing Hub Enterprise. Marketing automation suites that bundle 40 features when you need 4.
- ChatGPT consumer / Claude.ai consumer for client work. No DPA, no API-tier privacy guarantees. Fine for personal use, never for client data.
- Notion as a CRM. Lots of agencies do this. It does not scale past 5 deals.
- Make and Zapier. See the n8n section. Fine tools, wrong economics for our load.
- Slack-only knowledge. Anything important leaves Slack within 24 hours and lands in Twenty, the repo, or a markdown file. Slack is great for the conversation, terrible as the source of truth.
- Google Workspace for everything. We use Gmail and Docs. We do not use Google Sheets as a database. Postgres exists.
What this stack costs to run
Fixed monthly costs for Wicflow itself, EUR, rounded: Hostinger VPS Frankfurt 30, Instantly 97, Procountor + Holvi 80, GitHub + domains + misc 58. Cal.com, Twenty CRM, and n8n run on the same VPS at no marginal cost.
Total fixed: around 265 EUR per month. Plus variable AI API usage (Claude + OpenAI) at 200 to 800 EUR, plus Apify credits at 30 to 100 EUR. Total all-in: 500 to 1,200 EUR per month for an agency that delivered 30+ projects in the last 12 months. That is the leverage of running a tight, EU-hosted, mostly open-source stack.
How to copy this stack in 90 days
If you are another builder reading this, here is the order I would build it in if I started over today:
- Week 1. Hostinger VPS Frankfurt, Docker, Traefik, n8n + Cal.com self-hosted. One workflow end-to-end before anything else.
- Week 2. Twenty CRM on the same VPS, Postgres backups to a separate region. n8n hits Twenty's Postgres directly.
- Week 3. Anthropic + OpenAI API keys, prompt caching enabled, one Claude Code skill per inbox/CRM/calendar action.
- Week 4. Instantly + 4 warmed inboxes + first campaign. Replies routed to Twenty via n8n.
- Month 2. Procountor + Holvi (or local equivalent), receipt-to-bookkeeping pipeline.
- Month 3. Sub-processor list, DPA template, TIA doc. The compliance pack you will need on every procurement call.
The stack is not the moat. The moat is what you build on top: playbooks, client relationships, deliverables, speed of iteration. The stack just makes sure you can sleep at night.