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:

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:

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:

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:

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.

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 primaryClaude (Anthropic)Reasoning, voice, instruction-following, long context
AI secondaryOpenAI GPT-4oVision, OCR, embeddings
AI localLlama 3.3 / MistralStrict data residency, on-VPS only
Orchestrationn8n self-hosted (Frankfurt)EU residency, fixed cost, code escape hatch
Custom codePython / TypeScriptWhen n8n is the wrong shape
CRM (own ops)Twenty CRM self-hostedOpen-source, Postgres-backed, EU-hosted
CRM (client)HubSpot / Pipedrive / SalesforceWhatever the client already runs
OutboundInstantly + Apify + PythonInbox warmup, scrapers, full pipeline
InboxGmail API + Python (not the MCP)Stable auth, scriptable
CalendarCal.com self-hostedWhite-label, EU, free at our scale
BookkeepingProcountor + HolviFinnish accounting + business banking
Hosting (shared)Hostinger VPS Frankfurt16 GB / 4 vCPU, ~30 EUR/mo
Hosting (sites)Vercel EU + Netlify EUEdge functions, preview deploys, EU regions
Code editorCursor + Claude CodeInline AI + agent loops
Stack (web)Next.js / React / TS / Tailwind / shadcnStandard, fast, hireable
Auth (client apps)SupabaseEU 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.

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:

  1. Week 1. Hostinger VPS Frankfurt, Docker, Traefik, n8n + Cal.com self-hosted. One workflow end-to-end before anything else.
  2. Week 2. Twenty CRM on the same VPS, Postgres backups to a separate region. n8n hits Twenty's Postgres directly.
  3. Week 3. Anthropic + OpenAI API keys, prompt caching enabled, one Claude Code skill per inbox/CRM/calendar action.
  4. Week 4. Instantly + 4 warmed inboxes + first campaign. Replies routed to Twenty via n8n.
  5. Month 2. Procountor + Holvi (or local equivalent), receipt-to-bookkeeping pipeline.
  6. 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.

FAQ