ml-connector
DeltekHubSpot

Deltek and HubSpot integration

Deltek Vantagepoint runs project delivery, billing, and finance for professional services firms. HubSpot runs sales, marketing, and customer relationships. Connecting the two gives sales and marketing teams the client, contact, project, and opportunity data that lives in the ERP, without anyone re-keying it. ml-connector reads the Deltek Hub records and keeps the matching HubSpot companies, contacts, and deals in step on a schedule you control.

How Deltek works

Deltek Vantagepoint exposes Hub records (firms, contacts, employees, projects, opportunities, activities) and accounting transactions (AP and AR invoices, journal entries) through a REST JSON API on a tenant-specific URL such as company.deltekfirst.com. It authenticates with OAuth2 using the password grant, which returns a bearer access token that expires in about an hour plus a refresh token; the password grant must be explicitly enabled in newer versions. Pagination is page-based with page and pagesize parameters, and there is no idempotency key, so the caller checks for an existing record before posting. Webhooks exist only as workflow-triggered callbacks with no HMAC signature, so records are read by polling.

How HubSpot works

HubSpot exposes CRM objects (contacts, companies, deals) and commerce objects (invoices, line items, payments) through a REST JSON API at api.hubapi.com, with both legacy crm/v3 paths and newer date-versioned paths active. For server-to-server work it authenticates with a Private App access token sent as a static bearer header, scoped to the object permissions you grant. Pagination is cursor-based with a limit up to 200 and an after token, and the batch upsert endpoint updates a record when a matching idProperty exists or creates it otherwise. Webhook subscriptions cannot run on a Private App; they require a separate Public OAuth app registered in HubSpot.

What moves between them

The flow runs from Deltek into HubSpot. ml-connector reads Deltek firms and posts them as HubSpot companies, reads Deltek contacts and posts them as HubSpot contacts associated to those companies, and turns Deltek projects and opportunities into HubSpot deals so the sales pipeline reflects active engagements. Contact identity is matched on email and company on name so updates land on the existing CRM record rather than creating duplicates. HubSpot is treated as the downstream CRM, so ml-connector does not write financial transactions back into Deltek; the cadence is a scheduled poll you set, typically a few times a day.

How ml-connector handles it

ml-connector stores both credential sets encrypted. For Deltek it runs the OAuth2 password grant against the tenant token endpoint, caches the bearer token, and refreshes it when a call returns 401, since the token expires roughly hourly. For HubSpot it sends the Private App token as a static bearer header on every request. Deltek firms map to HubSpot companies, Deltek contacts to HubSpot contacts linked by association, and Deltek projects and opportunities to HubSpot deals with stage and amount carried across. Writes use the HubSpot batch upsert endpoint keyed on email or a stored Deltek key so re-runs update instead of duplicate, which matters because Deltek has no idempotency header. Because Deltek cloud is effectively pull-only for connectors and HubSpot webhooks need a separate Public app, ml-connector polls Deltek on your schedule using page-based paging rather than relying on a push. The Deltek API user must have full field visibility, or hidden fields like fees return as zero rather than an error. HubSpot rate limits return HTTP 429 with a Retry-After header, so ml-connector backs off and retries, and every record carries a full audit trail and can be replayed if a HubSpot write fails.

A real-world example

A 200-person architecture and engineering firm runs Deltek Vantagepoint as its system of record for clients, projects, and billing, and uses HubSpot for business development and marketing. Before the integration, business developers worked from stale spreadsheets exported out of Deltek, so new client firms and won opportunities took days to appear in HubSpot and contact details drifted apart between the two systems. With Deltek and HubSpot connected, each new firm becomes a HubSpot company, project contacts stay current, and opportunities show up as deals with the right stage and value. The pipeline in HubSpot matches what finance and project teams see in Deltek, and the manual export step is gone.

What you can do

  • Create and update HubSpot companies from Deltek firms, matched on company name to avoid duplicates.
  • Sync Deltek contacts into HubSpot contacts, keyed on email and associated to the right company.
  • Turn Deltek projects and opportunities into HubSpot deals with stage and amount carried across.
  • Bridge Deltek's expiring OAuth2 password-grant token and HubSpot's static Private App token automatically.
  • Poll Deltek on the schedule you set, with retries, upserts, and a full audit trail on every record.

Questions

Which direction does data move between Deltek and HubSpot?
The flow runs from Deltek into HubSpot. Firms, contacts, projects, and opportunities move from Deltek into HubSpot as companies, contacts, and deals. HubSpot is treated as the downstream CRM, so ml-connector does not write financial transactions back into Deltek.
How does the integration avoid creating duplicate records in HubSpot?
HubSpot contacts are matched on email and companies on name using the batch upsert endpoint, which updates an existing record when a matching idProperty is found and creates one otherwise. Deltek has no idempotency key, so ml-connector keys every write on a stable identifier and re-runs update rather than duplicate.
Why does the connector poll instead of using webhooks?
Deltek's only webhooks are workflow-triggered callbacks with no HMAC signature, and HubSpot webhook subscriptions require a separate Public OAuth app rather than the Private App token used for syncing. Because neither side offers a reliable signed push for this pair, ml-connector reads Deltek on a schedule you set using page-based pagination.

Related integrations

Connect Deltek and HubSpot

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started