Solutions Architect – Technical Assessment
This project is a proof-of-concept (POC) demonstrating how Breezy’s smart HVAC platform could integrate with HubSpot CRM. It includes contact syncing, subscription deal tracking, and an optional AI-powered insights panel. It simulates what Breezy’s internal admin team might use to view and manage customer data in HubSpot.
The goal of this POC is to demonstrate:
- How Breezy can sync customer accounts into HubSpot Contacts
- How Breezy Premium subscription conversions can be tracked as Deals
- How HubSpot objects and associations represent Breezy’s business model
- How AI can enhance CRM and lifecycle insights
- How a simple admin UI can simulate a real integration flow
The stack includes:
Backend: Node.js, Express, HubSpot CRM API
Frontend: React (Vite)
AI: OpenAI GPT-4.1-mini
Styling: HubSpot-inspired UI (orange, white, slate blue)
- Create contacts through the UI
- Sync contacts to HubSpot CRM
- Display all HubSpot contacts
- Show firstname, lastname, email, phone, address
- Create Breezy Premium subscription deals
- Associate deals with contacts
- Display associated deals per contact
- Create thermostat hardware records
- Associate thermostats with customers
- Display thermostats per contact
- Calculate trial status (active, ending soon, expired)
- Combine contacts + deals + thermostats
- AI generates insights:
- Revenue summary
- Upsell opportunities
- Churn risks
- Recommended CRM automations
- Clean, HubSpot-style admin layout
- Cards, tables, badges, and highlight colors
A. Backend Setup (Node.js)
- Install dependencies
npm install
- Create a .env file in the backend root folder
HUBSPOT_ACCESS_TOKEN=your_private_app_token OPENAI_API_KEY=your_openai_key PORT=3005 # or 3001 if preferred
- Start the backend
npm start
Expected output:
Server running successfully API available at: http://localhost:3005
B. Frontend Setup (React + Vite)
- Navigate to the frontend
cd frontend
- Install dependencies
npm install
- Start the app
npm run dev
Open: http://localhost:3000
C. HubSpot Requirements
Required HubSpot Private App Scopes:
crm.objects.contacts.read
crm.objects.contacts.write
crm.objects.deals.read
crm.objects.deals.write
crm.schemas.custom.read
crm.objects.custom.read
crm.schemas.custom.write
crm.objects.custom.write
Go to:
Settings → Integrations → Legacy Apps → Create Legacy App → Select Private → Create a name for the app and description → add required scopes from above → Select Private → Create App → Continue Creating
Copy and paste the access token into .env. file, first line HUBSPOT_ACCESS_TOKEN=your_private_app_token
- Create a Contact
- Fill out the form
- Click Create Contact
- Refresh contacts
- Create a Deal
- Choose an existing contact
- Set deal name and amount
- Click Create Deal
- Refresh deals
- Confirm in HubSpot CRM UI
- Create a Thermostat
- Fill the Thermostat form
- Select a contact
- Submit
- Click "Refresh Thermostats"
- Expand a contact row to verify the thermostat is associated
- AI Insights
- Click Generate AI Insights
- Insights panel displays:
- segment suggestions
- revenue and pipeline patterns
possible upsell and renewal opportunities
- UI
- Resembles a HubSpot-style admin dashboard
This POC demonstrates how Breezy’s internal admin UI communicates with both HubSpot CRM and the OpenAI API via a Node.js backend. The system consists of four components:
System Functionality Breezy UI React admin panel simulating internal operations Backend API Bridges Breezy ⇆ HubSpot CRM ⇆ OpenAI HubSpot CRM Stores Contacts, Deals, and Thermostat custom objects OpenAI API Generates insights based on CRM data
#Data Flow Summary
UI → Express API → HubSpot CRM
UI ← Express API ← HubSpot CRM
UI → Express API → OpenAI
UI ← Express API ← OpenAI
#System Architecture Diagram
flowchart LR
subgraph UserBrowser[User Browser]
UI[React Admin Panel
(Vite)]
end
subgraph Backend[Node.js / Express Backend]
API[/REST API
(/api/contacts, /api/deals, /api/thermostats, /api/ai-insights)/]
end
subgraph HubSpot[HubSpot CRM]
HSContacts[(Contacts)]
HSDeals[(Deals)]
HSThermostats[(Custom Object:
Thermostat)]
end
subgraph OpenAI[OpenAI API] GPT[GPT-4.1-mini-*] end
UI <-->|fetch / create| API API -->|Sync contacts| HSContacts API -->|Sync deals| HSDeals API -->|Sync thermostats| HSThermostats
API -->|Read CRM data| HSContacts API --> HSDeals API --> HSThermostats
API -->|prompt with combined CRM data| GPT GPT -->|insights JSON| API API -->|send insights to UI| UI
Below is the recommended HubSpot CRM object model for Breezy, including Contacts, Deals, and a Thermostat custom object.
erDiagram CONTACT { string hs_object_id string firstname string lastname string email string phone string address string lifecycle_stage int thermostat_count string latest_trial_status }
THERMOSTAT { string hs_object_id string model string serial_number date purchase_date date trial_start_date date trial_end_date string trial_status }
DEAL { string hs_object_id string dealname decimal amount string dealstage string pipeline date closedate string subscription_type string subscription_term }
CONTACT ||--o{ THERMOSTAT : owns CONTACT ||--o{ DEAL : "has subscriptions" THERMOSTAT ||--o{ DEAL : "drives subscription"
Contact
Represents a Breezy customer or homeowner. Recommended properties:
ownership flags trial status thermostat count purchase timestamps
###Deal
Represents a subscription conversion or renewal. Recommended properties:
subscription type (monthly/annual) closedate amount (MRR/ARR mapping)
###Thermostat (Custom Object) (optional but recommended)
Tracks Breezy devices owned by a user:
model firmware version installation location
Breezy’s subscription lifecycle maps directly to a simple HubSpot deal pipeline, allowing Breezy to track free trials, conversions, renewals, and upsell opportunities.
Pipeline Stages
Trial Started Customer begins a 30-day free trial after purchasing a thermostat.
Trial Ending Soon Trial has ≤5 days remaining. Useful for nurturing workflows.
Subscription Started (Closed Won) Customer converts to Breezy Premium. Marked as closedwon because revenue has been realized.
Renewal Upcoming Subscription nearing renewal (typically annual).
Renewal (Closed Won) Customer renews their subscription.
Upsell Opportunity Customer owns multiple thermostats or shows high engagement.
Why “closedwon” is used
Represents booked revenue
Integrates with HubSpot’s native revenue attribution
Feeds MRR/ARR and forecasting dashboards
Helps track subscription lifecycle and retention
flowchart LR
A[Trial Started
(Thermostat purchased)] --> B[Trial Ending Soon
(≤ 5 days left)]
B --> C[Subscription Started
(Closed Won)]
C --> D[Renewal Upcoming]
D --> E[Renewal
(Closed Won)]
C --> F[Upsell Opportunity
(Multi-thermostat / high usage)]
classDef trial fill:#e5f5ff,stroke:#1d74c9,color:#003366; classDef won fill:#ff7a59,stroke:#cc5f43,color:white; classDef other fill:#f3f4f6,stroke:#9ca3af,color:#111827;
class A,B trial; class C,E won; class D,F other;
The AI feature allows Breezy to extract:
high-value customer segments customers likely to upgrade customers at churn risk overall revenue health lifecycle recommendations Great for marketing automation, CRM workflows, and sales enablement.
This project used AI tools (ChatGPT) for:
Generating boilerplate React components Designing the ERD Writing documentation Improving UI/UX decisions Debugging and refining backend errors Structuring prompts for CRM insights
What was challenging:
Prompt tuning Handling API errors and timeouts Ensuring structured output
What worked well:
Rapid prototyping Documentation Code refactoring
Decision Reason React + Vite Fast, modern, ideal for demos Express backend Simple, flexible for CRM API integration HubSpot Private App Direct CRM object control GPT-4.1-mini Cheap, fast, good insight generator HubSpot-style UI Professional look, aligns with CRM context
Add user authentication Implement webhook-based sync instead of manual refresh Use HubSpot associations API in batch mode Add pagination for large contact lists Store sync logs and statuses Add form validations
Before implementing a production-ready integration, I would clarify:
- How often should data sync (real-time, hourly, nightly)?
- Should Breezy or HubSpot be the source of truth for customer data?
- What automation workflows (emails, reminders) should be triggered by CRM events?
- Are there multiple subscription plans or pricing tiers beyond Premium?
- Should thermostat metadata (firmware, usage stats) be included in CRM?
- How should churned or cancelled subscriptions be represented in HubSpot?
- Will Breezy need reporting dashboards or custom funnel views inside HubSpot?
This POC successfully demonstrates:
✔ Integration patterns between Breezy and HubSpot ✔ How CRM objects reflect Breezy’s business model ✔ How deals can represent subscription conversions ✔ The value of AI for CRM intelligence ✔ A professional admin-style UI to present the flow
This gives Breezy a clear picture of how a HubSpot integration would work in production.









