How Deals and Companies Sync
When the HubSpot sync runs, what it imports, how incremental sync works, and how to trigger it manually
Overview
Steve keeps its copy of your HubSpot deals and companies up to date in the background. This page explains when that happens, what each run does, and how to force one.
Who it's for: 📣 PMM / admin, and 🎯 any rep wondering why a deal hasn't shown up yet.
When the sync runs
| Trigger | What it syncs |
|---|---|
| You connect HubSpot | Deals and companies — the first, full import |
| You save field mapping | Deals and companies, with your new property selection |
| Daily, automatically | Deals and companies, at 00:00 UTC |
| You click Sync HubSpot Data in the deals table | Deals only |
The daily run covers every organization with a live HubSpot connection. You don't need to schedule anything.
What a run does
- Refreshes the access token. HubSpot access tokens live for 30 minutes, so every run exchanges the stored refresh token for a fresh one.
- Works out the window. Steve looks up the most recent
hs_lastmodifieddateit has already imported for your organization.- No previous sync → a full sync, walking every deal in the portal.
- Previous sync found → an incremental sync, fetching only deals modified since that timestamp.
- Builds the property list. The core deal properties, plus your six mapped properties, plus everything you selected on the Field Mapping page — de-duplicated.
- Pages through HubSpot 100 deals at a time, transforming each into Steve's format.
- Upserts. New deals are inserted; deals Steve already has are updated in place. A deal is matched on its HubSpot deal ID, so re-running a sync never creates duplicates.
- Queues analysis for new deals only. Every newly inserted deal is sent for AI analysis, which produces a deal suggestion. Re-synced deals are not re-analyzed.
- Checks win/loss triggers. After the deal sync, Steve looks for deals that just moved to closed-won or closed-lost and schedules any configured win/loss surveys.
Companies follow the same shape, using each company's last-synced timestamp as the incremental cursor.
What comes across on a deal
| Steve field | HubSpot property |
|---|---|
| Deal name | dealname |
| Stage | dealstage |
| Type | dealtype |
| Description | description |
| Amount | amount |
| Currency | deal_currency_code |
| Close date | closedate |
| Pipeline | pipeline |
| Created / updated | createdate or hs_createdate, hs_lastmodifieddate or modifieddate |
| Steve Channels, Steve Usage, Loss Reason, Win Reason | Whatever you mapped |
| Competitors | Your mapped competitor property, parsed from a JSON array, an array of objects with a name, or a plain string |
| Project | Your mapped Steve Project property, validated against your real projects |
| Connected calls | steve_connected_calls |
| Everything else you selected | Stored on the deal and available as a table column |
The complete raw HubSpot payload is kept alongside the parsed fields, which is what powers the Expand deal details dialog and the extra columns.
What comes across on a company
Name, domain, industry, description, phone, city, state, country, zip, website, number of employees, annual revenue, lifecycle stage, and HubSpot owner ID — plus created and updated timestamps and the raw payload.
Project auto-assignment
- One project in your organization → every imported deal is assigned to it automatically.
- Two or more projects → the deal is assigned from your mapped Steve Project property if that property holds a valid project ID. If the value doesn't match a project in your organization, Steve logs a warning and leaves the deal unassigned rather than failing the import.
- Neither applies → the deal arrives unassigned, and you assign it in the deals table or via Deal Suggestions.
Syncing on demand
In the Deals table header there are two icon buttons:
| Button | What it does |
|---|---|
| Sync HubSpot Data (cloud-download icon) | Triggers a real HubSpot sync in the background — deals only. Toast: "HubSpot deal sync started. Data will update shortly." |
| Refetch (circular-arrow icon) | Re-reads Steve's own database. Fast, but it does not talk to HubSpot. |
Use Sync HubSpot Data when something changed in HubSpot. Use Refetch when you've just made an edit in Steve and want the table to catch up.
The sync is asynchronous — the toast confirms it started, not that it finished. Give a large portal a few minutes, then hit Refetch.
Why a deal might be missing
| Symptom | Likely cause |
|---|---|
| A brand-new deal isn't there | The next scheduled run hasn't happened. Click Sync HubSpot Data. |
| An old deal never appeared | It hasn't been modified since your first sync, and that sync didn't reach it. Touch the deal in HubSpot to bump hs_lastmodifieddate, then sync. |
| A property is blank in Steve but filled in HubSpot | It isn't in your selected properties. Add it in Field Mapping and save. |
| Nothing at all imported | The connection may have been made against the wrong HubSpot portal. Check Troubleshooting. |
Next Steps
- The Deals Table — work with what came in.
- The Companies Tab — the company side.
- Deal Suggestions — what happens to every newly imported deal.
- Troubleshooting — when the sync doesn't behave.