HubSpot Marketing Hub Pro just bumped its US list price to $890 per month on the new 2026 seat-based plan. Salesforce Sales Cloud Pro still sits at $165 per user per month before you add Pardot/Account Engagement. And the dirty secret nobody at those companies will tell you on a demo call: most teams under 50 people use roughly 4 of the 47 features they're paying for. Contact storage, a basic form, an email sequence, and a pipeline view. That's it.
I run a digital agency out of Dijon, France, and I work with founders on both sides of the Atlantic — French SaaS teams expanding into the US, US startups trying to crack the EU. The pattern repeats: someone signs a HubSpot contract in year one because "everyone uses it," then 18 months later they're locked into a renewal where 80% of the spend goes toward features nobody opens. This article is the playbook I wish I'd had when I was a marketing ops lead five years ago: when a custom funnel beats turnkey CRM, how to do lead scoring without a black box, how to implement multi-touch attribution properly, and the cost math that actually matters at your stage.
The 80% rule: most SaaS doesn't need a CRM for the first 12 months
If you sell B2B and you're under roughly 50 people, here's what your sales motion actually looks like. You get somewhere between 5 and 200 inbound leads per month. A founder, a head of sales, and maybe a BDR work them. Deals close in Slack, email, and a Notion or Airtable board. Whatever fancy CRM you bought, the real source of truth lives in your inbox and your head.
What you actually need at this stage is four things:
- A form (or better, a funnel) that captures qualified inbound
- An email that reaches the right human within 60 seconds of submission
- A persistent database so you can search "that German prospect from March" three months later
- Lightweight attribution so you know which channels actually drive revenue
HubSpot Marketing Pro gives you all four — plus 43 other things you won't use. Salesforce gives you all four with a four-month implementation. A custom stack built on Next.js, AWS SES, and Postgres gives you the same four things in a week, for around $30/month at 10,000 leads/year, and you actually understand how every piece works.
This is the 80% rule: 80% of sub-50 person teams don't need a CRM until they hire their fourth account executive. Until then, the CRM is a museum of contacts that nobody opens, paid for by your runway.
When custom beats turnkey: the honest comparison
I'm not anti-HubSpot. If you have 200 sales reps and a marketing ops team of six, HubSpot Operations Hub plus Sales Hub Enterprise is genuinely useful. The objection is to teams under 50 buying it as a default. Here's where custom wins:
Form-to-inbox latency
HubSpot's form submissions go through HubSpot's own infrastructure before notification emails fire. In my measurements across three client accounts in 2025-2026, that adds 8 to 22 seconds before the sales rep sees the email. On a hot inbound — someone who just visited your pricing page and submitted — those 22 seconds are the difference between closing and "let me think about it." A direct AWS SES send from your own API route delivers in 1.5 to 3 seconds, including the SES processing time.
Data ownership and portability
With HubSpot, every lead, note, and email log is in HubSpot's database. Export is technically possible but practically painful: rate-limited APIs, lossy CSV exports, and goodbye to your custom properties when you migrate. With your own Postgres, every row is yours. You back it up to S3 nightly with one cron job. You query it with SQL from any BI tool. You can migrate to Bigquery, Snowflake, or back to a CSV without asking anyone for permission.
Funnel design freedom
HubSpot forms are good. They're not great. You can't ship a 5-step funnel with conditional logic, dynamic price ranges, file uploads to your own S3, and a PDF brief generated server-side without writing custom code anyway — at which point you've paid HubSpot $890/month to host a form you wrote yourself. We'll cover the 5-step funnel pattern in detail below because it's the single highest-leverage change you can make.
Attribution that you control
HubSpot attribution uses HubSpot tracking. It's a black box. You can see the report, but you can't query the raw events, you can't join them against your product analytics, and you can't run custom attribution models without exporting everything to a data warehouse anyway. With a 30-line client-side beacon and a Postgres table, you own every page view, you join it to your leads on session_id, and you build the attribution model that matches your sales cycle — not HubSpot's.
The 5-step funnel pattern: 3x conversion lift over a single contact form
This is the single most underrated tactic in B2B lead gen, and the data is consistent across the last 40 client deployments I've shipped: a well-designed 5-step funnel converts 2.7 to 3.4x better than a single <form> with "name, email, message, submit".
Why does it work? Three reasons:
- Commitment-and-consistency: once a visitor answers step 1, they're psychologically invested in finishing. The micro-yes compounds. A single form with 5 fields feels like 5 obstacles. A 5-step funnel with one question per step feels like a conversation.
- Qualification disguised as helpfulness: each step gathers information that helps you respond intelligently. Visitors don't perceive it as friction because they're getting clarity on what they need.
- Self-segmentation: by step 3, the lead has told you their company size, their use case, and their timeline. Your reply is 10x better and your team scores the lead before reading it.
The structure I ship for B2B agencies and SaaS teams:
- Step 1 — Profile: who are you (founder, marketing lead, agency, in-house team)? Single click, 5 options.
- Step 2 — Service or use case: which problem are we solving? Single click, 6-9 options driven by your offering.
- Step 3 — Context: conditional questions based on steps 1-2. Stack? Volume? Existing tools? This is where you separate tire-kickers from buyers.
- Step 4 — Budget and timeline: range pickers, not text fields. "Less than $5k, $5k-15k, $15k-50k, $50k+" beats an empty text box.
- Step 5 — Contact and attachments: name, email, optional file upload (specs, screenshots, current website). Submit.
On submission, you fire off a server-side pipeline: validate, generate a styled PDF brief with pdfkit, upload to S3 with a 7-day presigned URL, then a Promise.allSettled fan-out to (a) insert into Postgres, (b) send the styled HTML notification email via AWS SES to your sales inbox with reply-to set to the prospect, and (c) optionally ping Slack on high-score leads.
The whole thing fits in roughly 400 lines of TypeScript. I've open-source-adjacent versions of this pattern in production at go-to-agency.com/devis if you want to see the live UX.
Lead scoring done right: transparent rules beat black-box ML
HubSpot's "predictive lead scoring" is a black box. It uses ML on aggregate data across their customer base. That sounds great until you realize: (a) you can't see the rules, (b) you can't tune them per market, (c) it overweights signals that work for HubSpot's median customer (mostly US SMB SaaS) which may not be your customer at all.
For a sub-50 person team, manual rules are not just simpler — they're more accurate. Here's the scoring system I deploy:
- Budget signal (0-4 points): $0-5k = 0, $5k-15k = 1, $15k-50k = 2, $50k+ = 4.
- Timeline urgency (0-3 points): "exploring" = 0, "3-6 months" = 1, "1-3 months" = 2, "ASAP" = 3.
- Profile fit (0-3 points): matches your ICP exactly = 3, adjacent = 1, off-ICP = 0.
- Behavioral (0-3 points): 1 point per pricing page visit, 1 per pillar page visit, capped at 3.
- Attribution quality (0-2 points): organic search or referral = 2, direct = 1, paid social = 0.
Sum it up. 10+ = high priority, Slack ping, reply within 1 hour. 5-9 = standard, reply within 24 hours. 0-4 = low, batch reply once a day or send a templated polite decline. The whole scoring function is a 20-line pure TypeScript function. You can read it, you can change it, you can A/B test it. Try doing that with HubSpot's scoring engine.
Multi-touch attribution with sessionId + first-touch (the concrete implementation)
This is the piece most teams skip because they think it requires Segment, Mixpanel, or a full data warehouse. It doesn't. Here's the actual implementation, in roughly 30 lines of code total.
Client-side (runs once on every page load):
// lib/attribution.ts
export function getOrCreateSession() {
let sid = localStorage.getItem("session_id");
if (!sid) {
sid = crypto.randomUUID();
localStorage.setItem("session_id", sid);
localStorage.setItem("first_touch", JSON.stringify({
ts: Date.now(),
ref: document.referrer || "direct",
utm_source: new URLSearchParams(location.search).get("utm_source"),
utm_medium: new URLSearchParams(location.search).get("utm_medium"),
utm_campaign: new URLSearchParams(location.search).get("utm_campaign"),
landing_path: location.pathname,
}));
}
return sid;
}
Page view beacon (fired on every nav, using navigator.sendBeacon so it survives page unload):
navigator.sendBeacon("/api/page-view", JSON.stringify({
session_id: getOrCreateSession(),
path: location.pathname,
ts: Date.now(),
}));
Server-side (one Postgres table for sessions, one for page views, foreign key to leads on session_id). When the funnel submits, you grab the session_id from localStorage and ship it along with the lead. Now in your admin dashboard, each lead has its full multi-touch journey attached: first touch (channel + UTMs), every page visited, time-on-site, and conversion path. You can run any attribution model you want — first-touch, last-touch, linear, time-decay — from one SQL query.
This is genuinely better than what HubSpot ships out of the box for two reasons. First, it works across subdomains and across devices if you persist session_id to a cookie. Second, you have the raw event log — not a roll-up — so you can rerun your attribution model with different rules whenever your sales cycle changes.
The real cost breakdown: 1k vs 10k vs 100k leads per year
Numbers based on 2026 US list pricing for HubSpot and Salesforce, and actual AWS billing on the custom stack across three client deployments I run.
| Stack | 1k leads/year | 10k leads/year | 100k leads/year |
|---|---|---|---|
| HubSpot Marketing Pro (2 seats, 2k contacts tier) | $890/mo | $1,290/mo (10k contacts tier) | $3,600/mo (100k contacts) + Ops Hub |
| Salesforce Sales Cloud Pro (3 seats + Pardot Growth) | $1,745/mo | $2,495/mo (Pardot Plus required) | $4,800/mo+ (Marketing Cloud Engagement) |
| Custom (Next.js + AWS SES + RDS Postgres + S3) | ~$22/mo | ~$32/mo | ~$140/mo |
The custom stack breakdown at 10k leads/year:
- Vercel Pro for hosting the Next.js app: $20/mo (you'd pay this anyway)
- AWS SES: 10k notifications + occasional replies = ~$1/mo (SES is $0.10 per 1,000 emails)
- AWS RDS Postgres db.t4g.micro: $11/mo on-demand, $7/mo on a 1-year reserved instance
- AWS S3 for PDF briefs and uploads: ~$0.50/mo for 50 GB
- Total: $32 to $40/mo all-in
That's a 40x cost difference against HubSpot Pro and 78x against Salesforce. At 100k leads/year, you're still under $200/month on AWS — versus $4,000+ on Salesforce. Compounded over a 3-year horizon, that's between $100,000 and $170,000 saved on infrastructure that you control fully. For a sub-50 person team, that's a hire. Or 18 months of runway.
The bilingual founder angle: running a multi-country B2B funnel
I work with a lot of founders running cross-border B2B motions: a French SaaS selling into the US, a US startup expanding into the EU, a UK agency opening a Paris office. HubSpot and Salesforce both technically support multi-language and multi-currency, but the implementation tax is real: you're routing through their localization layer, your forms duplicate per language, your reports get messy.
A custom stack solves this cleanly. Next.js with next-intl gives you locale routing out of the box (/en/contact, /fr/contact). Your funnel renders in the visitor's language with one i18n config file. Your Postgres schema has a single locale column on the leads table. Your AWS SES notification template picks the right HTML body based on the locale. Your sales rep replies in French or English from the same Gmail inbox — they see the locale flag in the notification email subject line.
For founders building global B2B from day one, this is non-negotiable: own your localization layer. You're going to add Spanish in year two, German in year three, Japanese maybe in year four. Each one is a config change, not a HubSpot license upgrade and a re-implementation.
When you SHOULD pay for HubSpot or Salesforce
To be fair to both products — they earn their price tag at scale. The genuine break-even points:
- HubSpot Marketing Pro: makes sense when you have 5+ marketing ops staff, run 20+ active email sequences, and your sales team genuinely uses the integrated pipeline daily. Usually 100+ employees.
- Salesforce Sales Cloud: makes sense when you have 30+ sales reps, complex deal structures (multi-stakeholder, multi-product, partner channels), and a dedicated SF admin. Usually 200+ employees.
Below those thresholds, the ROI math doesn't work — and the time you spend learning, configuring, and renewing those tools is time you're not spending on the actual growth motion. Most sub-50 person teams I work with would be better served by a focused custom funnel, a Notion or Airtable lightweight CRM, and Gmail. That's it. Read more about the strategic framing on our marketing strategy page.
The migration path: how to move off HubSpot in 3 weeks
If you're already on HubSpot and the renewal is approaching, here's the plan I've run for three clients in the last six months:
- Week 1: export all contacts, deals, and email history via the HubSpot API. Ship a Next.js form + AWS SES on your own domain in parallel. Set up the Postgres schema.
- Week 2: redirect new inbound from HubSpot forms to the new funnel. Keep HubSpot running in parallel for 30 days as fallback. Import historical leads into Postgres.
- Week 3: rebuild your active email sequences in a $20/mo tool (Postmark broadcasts, Loops, Customer.io starter). Cancel HubSpot renewal. Confirm SES sending domain is DKIM-aligned.
Total: 3 weeks, one engineer plus you. Result: $890+/month back on the P&L, sub-3-second lead notifications, and a stack you can extend without filing support tickets.
The bottom line
The default in B2B SaaS for the last decade has been "buy HubSpot or buy Salesforce." For sub-50 person teams in 2026, that default is wrong. The math doesn't work, the data ownership story is bad, and the funnel UX is mediocre compared to what 400 lines of TypeScript on Vercel + AWS will give you.
You don't need a CRM yet. You need a fast, well-designed funnel; a notification email that arrives in 2 seconds; a Postgres table you own; and lightweight attribution you can query. That's it. Build that, save the $10,000+/year, and revisit the CRM question when you hire your fourth AE. Most of you never will — because by then, you'll have built something better.
Talk to a bilingual founder about your funnel
If you're a B2B founder running a multi-country motion — or planning to — and you're staring at a HubSpot renewal or a Salesforce demo deck, it's worth a 20-minute async conversation before you sign anything. I work with French and US-based teams across both sides of the Atlantic. Send us a brief through our funnel (it's literally the pattern described in this article, so you can test-drive it) and you'll get a reply from a founder, in English or French, within one business day. No call required. Or read more about how Go To Agency works if you want context before reaching out.
