ml-connector
DeltekGoogle Sheets

Deltek and Google Sheets integration

Deltek Vantagepoint runs project accounting and finance for professional services firms. Google Sheets is where many of those firms still review numbers, stage entries, and share data with people who do not have an ERP login. Connecting the two pushes Deltek projects, firms, AP invoices, and journal entries into named spreadsheet tabs on a schedule, and reads staged rows back so AP invoices and journal entries entered in a sheet post into Deltek's accounting transaction API. ml-connector handles the very different APIs on each side and maps each Deltek field to a spreadsheet column by reading the header row. The sheet becomes a controlled work surface rather than a manual export.

How Deltek works

Deltek Vantagepoint exposes firms, contacts, employees, projects, and opportunities through Hub REST APIs with full CRUD, and exposes AP invoices, AR invoices, journal entries, cash receipts, expense reports, and vendor payments through Accounting Transaction APIs, all on a company-specific deltekfirst.com URL. Authentication is OAuth2 using the password grant, which must be explicitly enabled in newer versions, and the bearer token expires in about an hour and is renewed with the refresh token. Webhooks exist only as workflow-triggered callbacks with no fixed schema and no HMAC signature, so for finance records ml-connector reads by polling with page-based pagination. There is no native idempotency header, so duplicate checks are the caller's responsibility.

How Google Sheets works

Google Sheets has no native ERP objects, so the connector treats named sheet tabs as entity containers that the customer defines. The Sheets API v4 reads and writes cell data through the values resource over HTTPS, reading a range in A1 notation, overwriting a range with values.update, or adding rows with values.append, and structural changes go through batchUpdate. Authentication is Google OAuth2, normally the auth-code flow with an offline refresh token, or a service account that is shared on the target spreadsheet. The Sheets API has no native webhook; near-real-time change push is only available indirectly through Drive watch channels that expire within 24 hours, so polling is the practical model.

What moves between them

Data moves in both directions. From Deltek into Google Sheets, ml-connector reads projects, firms, employees, AP invoices, AR invoices, and journal entries and writes them as rows into matching tabs such as Projects, Vendors, and Invoices, refreshing on a schedule. From Google Sheets into Deltek, ml-connector reads rows staged in agreed tabs and posts them as AP invoices and journal entries through the Deltek accounting transaction API after the bearer token is refreshed. Reference data such as GL accounts and employees is read from Deltek so the spreadsheet shows valid codes. The cadence is a poll every few minutes to fifteen minutes on each side, since neither system offers a dependable push for this pair.

How ml-connector handles it

ml-connector stores both credential sets encrypted. It obtains the Deltek bearer token with the OAuth2 password grant against the company URL and renews it when a call returns 401, and it uses a stored Google refresh token to mint Sheets access tokens. Field mapping is by header row: the connector reads row 1 of each tab to learn which column holds each Deltek field, since Sheets has no fixed schema. Writes into Sheets use values.update for full-range overwrites and values.append for new rows, and reads use a bounded A1 range so empty cells are not scanned. There are real gotchas. Sheets returns every cell as a string and omits trailing empty cells, so the connector pads and casts each row. values.append is not idempotent, so a last-synced cursor prevents duplicate rows on retry. Deltek has no idempotency header either, so the connector queries by invoice number before posting an AP invoice. Posting an AP invoice may hit the customer's approval workflow, so entries can land in draft. Sheets rate limits return 429 at 60 writes per minute per user, so the connector batches and backs off. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A 120-person architecture and engineering firm runs Deltek Vantagepoint for project accounting but its project managers and principals live in Google Sheets. Each month a controller exported project budget-to-actual and open AP invoice reports from Deltek and pasted them into shared workbooks by hand, and project assistants typed expense and invoice details into a sheet that someone later re-keyed into Vantagepoint. With Deltek and Google Sheets connected, project, invoice, and journal data refreshes into the workbook tabs automatically, and the rows assistants stage in an approved tab post into Deltek's accounting API as AP invoices and journal entries. The export step disappears and the firm stops re-keying the same numbers twice.

What you can do

  • Push Deltek Vantagepoint projects, firms, employees, AP invoices, AR invoices, and journal entries into named Google Sheets tabs on a schedule.
  • Post AP invoices and journal entries staged in agreed spreadsheet tabs back into Deltek's accounting transaction API.
  • Map each Deltek field to a spreadsheet column by reading the header row, since Google Sheets has no fixed schema.
  • Bridge Deltek's OAuth2 password grant on the tenant URL with Google's OAuth2 refresh-token flow, renewing each token as it expires.
  • Poll both sides on a schedule with duplicate checks, retries, and a full audit trail on every record.

Questions

Which direction does data move between Deltek and Google Sheets?
It is bidirectional. Deltek projects, firms, invoices, and journal entries are read and written into named Google Sheets tabs, and rows staged in agreed tabs are read back and posted into Deltek as AP invoices and journal entries. You choose which tabs and entities sync in each direction so the spreadsheet stays a controlled work surface.
Since Google Sheets has no invoice or vendor objects, how are records mapped?
Google Sheets is a general-purpose spreadsheet with no native ERP entities, so the connector treats named sheet tabs as entity containers that you define. It reads the header row of each tab to learn which column holds each Deltek field, then reads and writes the data rows below. Because the API returns every cell as a string and drops trailing empty cells, the connector pads and casts each row to match the Deltek fields.
Do either system's webhooks drive the sync, or is it polling?
Polling drives it. Deltek webhooks are workflow-triggered callbacks with no fixed schema or signature, and the Sheets API has no native webhook, with change push only available through Drive watch channels that expire within 24 hours. ml-connector reads both sides on a schedule you set, with a last-synced cursor so retried appends do not create duplicate rows.

Related integrations

Connect Deltek and Google Sheets

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

Get started