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:
- New lead — form or mailto just arrived
- Qualified — fits ICP (budget, problem, timeline)
- Discovery booked — Calendly / call held or scheduled
- Proposal — scope and price out
- 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
- 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).
- 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.
- Qualify — Move to Qualified only if you would take the work. Lost-wrong-fit is healthier than a bloated pipeline.
- Discovery — Book with Calendly (pass UTMs when you wire that card). Stage → Discovery booked.
- Propose — Scope in your normal docs; stage → Proposal. Keep the commercial truth in HubSpot even if the SOW lives in Google Drive.
- 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
- Choose CRM + public fallback address + pipeline + SLA
- Authenticate the domain for email (SPF/DKIM/DMARC) so replies are seen
- Wire website → HubSpot API + thank-you page
- 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.



