Skip to content
scalemorph
Contact uscontact@scalemorph.com
← All insights

HubSpot

How to Run a Software House on HubSpot CRM — From Website Lead to Closed Work

A practical CRM model for a small software house: HubSpot Free, a clear inbound pipeline, website capture, contact@ fallback, and a sales cycle you can actually run.

A software house does not need enterprise Salesforce on day one. It needs a single place where inbound interest becomes a deal, someone owns the reply, and nothing dies in a personal inbox. This is how we set that up at ScaleMorph with HubSpot Free, a custom Next.js site, and a deliberate contact address.

Pick one CRM goal first

HubSpot asks what you want to achieve. For an early consultancy, ignore vanity goals and pick:

Generate software leads

Not “send invoices,” not “build product pages,” not “automate launch updates.” Those come later. The CRM’s first job is inbound → owned opportunity.

Why HubSpot Free (for us):

  • Real contacts and deals without hosting Odoo yourself
  • API access for a custom website form
  • Room to grow into sequences and reporting later

Self-hosted Odoo Community is powerful, but it is an ops product, not a 2-hour decision. We deferred it.

Roles: who owns what

Surface Address / tool Owner
Public website contact@yourdomain.com Shared / founder alias
Sales conversations Named mailbox (e.g. david@) when sales is staffed Sales
CRM system of record HubSpot Free Founder + sales
Project delivery Your board / Git / PM tool Engineering

Do not put a founder-only address on every CTA. Clients should write to a company address. Internally, that can still be an alias on one paid mailbox until you hire.

The pipeline (keep it short)

Create one deal pipeline — we call ours Website inbound:

  1. New lead — form or mailto just arrived
  2. Qualified — fits ICP (budget, problem, timeline)
  3. Discovery booked — Calendly / call held or scheduled
  4. Proposal — scope and price out
  5. Won / Lost — closed

That is enough for a software house. Extra stages feel productive and hide stalled deals.

Internal SLA: acknowledge every new lead within one business day. Put that in the team habit, not necessarily as marketing copy on the site.

Website capture: mailto first, API next

Phase A — Honest fallback (what we shipped first)

Until the API exists, the contact brief opens a mailto to contact@ with a structured draft (topic, brief, timing, name). That is better than a fake “Submit” button that drops data.

In code we centralized one constant:

export const CONTACT_EMAIL = 'contact@scalemorph.com'

Footer, header, contact page, and form all use it. When CRM write fails later, the same address is the notify path.

Phase B — Form → HubSpot (the next engineering card)

The durable flow:

Visitor → Project brief form
       → Next.js API route (server-side)
       → HubSpot: Contact + Deal in "New lead"
       → Redirect /thanks
       → On failure: notify contact@ (and/or mailto fallback)

Fields that matter for a software house:

  • Name, email, company (when you collect it)
  • Topic / offer package
  • Brief / problem statement
  • Timeline
  • UTMs (so you know which page or campaign worked)

Add a honeypot and basic rate limiting before you buy ads into the form.

How the whole CRM cycle runs day to day

  1. Lead arrives — HubSpot creates (or updates) a contact and a deal in New lead. Owner defaults to whoever owns inbound (founder now, sales when hired).
  2. Acknowledge — Reply from the company address within the SLA. Log the activity in HubSpot if you sync email; otherwise note the call/email on the deal.
  3. Qualify — Move to Qualified only if you would take the work. Lost-wrong-fit is healthier than a bloated pipeline.
  4. Discovery — Book with Calendly (pass UTMs when you wire that card). Stage → Discovery booked.
  5. Propose — Scope in your normal docs; stage → Proposal. Keep the commercial truth in HubSpot even if the SOW lives in Google Drive.
  6. Close — Won opens delivery elsewhere (Trello/Linear/GitHub). Lost gets a reason. Do not use HubSpot as the engineering backlog.

HubSpot manages revenue conversation. Delivery tools manage build. Crossing those wires is how CRMs become junk drawers.

Free-tier discipline

  • One portal. Invite sales as a user when ready — do not create a second HubSpot.
  • Login email can be a personal Gmail; public site email stays contact@.
  • Private app token + pipeline/stage IDs live in server env (HUBSPOT_ACCESS_TOKEN, etc.) — never in the browser.
  • Marketing blasts wait until capture and measurement work. Buying traffic into a leaky form is theatre.

What “managed” looks like for a small house

Weekly, 20 minutes:

  • Open Website inbound — anything older than SLA without activity?
  • Count new deals vs won — are packages and pages attracting the right ICP?
  • One cleanup: merge duplicates, close zombie deals

Monthly:

  • Which topics/packages create deals?
  • Which stages stall?
  • Is contact@ still the right public address, and is sales ownership clear?

Sequence we recommend

  1. Choose CRM + public fallback address + pipeline + SLA
  2. Authenticate the domain for email (SPF/DKIM/DMARC) so replies are seen
  3. Wire website → HubSpot API + thank-you page
  4. Only then: richer automation, enrichment, and paid acquisition

A CRM does not make you a sales organization. A short pipeline, a company inbox, and a form that writes somewhere real — that is enough to stop leaking the work you already earned from the website.