ml-connector
DeltekShipBob

Deltek and ShipBob integration

ShipBob is where an e-commerce brand stores stock and runs pick, pack, and ship across distributed fulfillment centers, and it bills the merchant for that work. Deltek Vantagepoint is where the same firm keeps project accounting, vendors, and the general ledger. Connecting the two moves the cost of fulfillment from ShipBob into the Deltek ledger without re-keying. ShipBob billing invoices and the fee transactions behind them become AP invoices in Deltek, posted against the ShipBob firm and coded to the right GL account and project, while ShipBob shipment and inventory data is available for reference. ml-connector handles the very different APIs on each side and moves the data on a schedule you control.

How Deltek works

Deltek Vantagepoint exposes firms (vendors and clients), contacts, employees, and projects through Hub REST APIs, and AP invoices, journal entries, payments, GL accounts, and organizations through its Accounting Transaction APIs. Every call uses a bearer token obtained from an OAuth2 password grant against a tenant-specific URL such as https://company.deltekfirst.com/company/api/, so there is no shared hostname and the password grant must be explicitly enabled on the instance. Vantagepoint only pushes data through workflow-triggered webhooks with no signature, so for a connector its finance records are read by paging through the REST API rather than by a reliable event feed. Vantagepoint has no native idempotency key, so duplicate prevention is the caller's job, and it has no documented inventory or sales-order resource, since it is a project services and GovCon ERP rather than a stock-keeping one.

How ShipBob works

ShipBob exposes orders, shipments, products, inventory levels, warehouse receiving orders, returns, and its own billing invoices through the ShipBob Developer API, a REST interface over JSON at api.shipbob.com on a date-versioned path such as 2026-01. It authenticates with OAuth 2.0 authorization code or a personal access token, and every write call must carry the shipbob_channel_id header that identifies the acting application channel. Billing invoices, their line-item transactions, and the fee breakdown per transaction are read-only and are the record of what ShipBob charges the merchant. Listing endpoints page with a next-page response header rather than a body cursor, and ShipBob pushes events such as billing.charge.created and order.shipped by webhook, signed with HMAC-SHA256.

What moves between them

The flow runs from ShipBob into Deltek. ml-connector reads ShipBob billing invoices and the fee transactions on each one, then posts the fulfillment charges into Deltek as AP invoices against the ShipBob firm, with each line mapped to the matching Deltek GL account and, where the brand wants it, a project. ShipBob fee types such as pick and pack, storage, and shipping are aligned to Deltek GL accounts so every posted line lands on a valid account, and a billing.charge.created webhook can trigger the work as soon as a charge is raised. ShipBob shipment tracking and on-hand inventory are read for reference and reconciliation. ShipBob owns the physical fulfillment and its own billing, so ml-connector treats Deltek as the accounting destination and never writes invoices or financial entries back into ShipBob.

How ml-connector handles it

ml-connector stores both credential sets encrypted and runs two separate auth paths. On the ShipBob side it holds the OAuth 2.0 token, refreshes it on the one-hour expiry and rotates the 30-day refresh token, and attaches the shipbob_channel_id header to every call so reads stay uniform and any write is accepted. On the Deltek side it runs the OAuth2 password grant against the customer's tenant URL and refreshes the bearer token when a call returns 401. ShipBob fee types map to Deltek GL accounts and the ShipBob account maps to a single Deltek firm, and these maps are built first so every posted line references an account and a firm that already exists. Two real gotchas shape the flow: Deltek has no idempotency key, so the connector queries Deltek by invoice number and the ShipBob invoice id before writing to avoid duplicates; and the Deltek API user role must have full field visibility or amounts can come back as zero. ShipBob pages with a next-page header rather than a cursor, so the connector follows that header to read every invoice and transaction. A billing.charge.created webhook, verified by recomputing the HMAC-SHA256 over the webhook id, timestamp, and raw body, can trigger a run, while a scheduled poll on the billing invoices endpoint backfills anything a webhook missed. Every record carries a full audit trail and can be replayed if a Deltek post fails.

A real-world example

A direct-to-consumer brand doing a few thousand orders a month outsources warehousing to ShipBob across two fulfillment centers, while its finance team runs the books in Deltek Vantagepoint and tracks margin by product line as a project. Before the integration, an accountant downloaded the ShipBob invoice each cycle, split the pick and pack, storage, and shipping fees by hand, and keyed the totals into Deltek as a vendor bill, then spent month-end close reconciling the ShipBob charges against the ledger. With Deltek and ShipBob connected, each ShipBob billing invoice posts into Deltek as an AP invoice on the ShipBob firm, split across the right GL accounts and project, and the manual download and re-keying step is gone. Close starts from fulfillment costs that already tie out.

What you can do

  • Post ShipBob billing invoices into Deltek as AP invoices against the ShipBob firm, coded to the right GL accounts.
  • Split ShipBob pick and pack, storage, and shipping fees across Deltek GL accounts and an optional project.
  • Read ShipBob shipment tracking and on-hand inventory for reference and reconciliation against the ledger.
  • Receive ShipBob billing webhooks, verified by HMAC-SHA256, so a fulfillment charge posts soon after it is raised.
  • Bridge the ShipBob OAuth token and shipbob_channel_id header with the Deltek tenant login, with by-number dedup, retries, and a full audit trail.

Questions

Which direction does data move between Deltek and ShipBob?
The flow runs from ShipBob into Deltek. ShipBob billing invoices and their fee transactions move from ShipBob into Deltek as AP invoices against the ShipBob firm, while ShipBob shipment tracking and inventory are read for reference. ShipBob owns the fulfillment and its own billing, so ml-connector treats Deltek as the accounting destination and does not write entries back into ShipBob.
Why does the integration sync ShipBob billing rather than sales orders into Deltek?
Deltek Vantagepoint is a project services and government contracting ERP, so it has no documented inventory or sales-order resource to push fulfillment orders into. What it does have is AP invoices and a general ledger. ShipBob is a fulfillment vendor that charges the merchant, so the grounded sync posts ShipBob billing invoices into Deltek as vendor bills coded to GL accounts and projects. Order capture and inventory stay in ShipBob and the merchant's storefront.
How does the integration prevent duplicate postings into Deltek?
Deltek has no native idempotency key, so the connector checks each record before writing. It queries Deltek by invoice number and the ShipBob invoice id, creates the AP invoice only when no match exists, and keys its own job dedup to that ShipBob id. A scheduled poll on the ShipBob billing invoices endpoint catches any charge a webhook missed without re-posting work that already landed.

Related integrations

Connect Deltek and ShipBob

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

Get started