ml-connector
DeltekStedi

Deltek and Stedi integration

Deltek runs project accounting and finance for professional services firms. Stedi is an EDI platform that turns business documents into X12 and routes them to trading partners. Connecting the two lets Deltek bill its clients over EDI and accept their purchase orders without manual re-keying. AR invoices created in Deltek Vantagepoint become outbound X12 810 invoices through Stedi, and the purchase orders Stedi parses from inbound EDI post back into Deltek as projects and accounting transactions. ml-connector handles the very different auth on each side and moves the data on the cadence you set.

How Deltek works

Deltek Vantagepoint exposes firms (clients and vendors), contacts, employees, projects, AP invoices, AR invoices, journal entries, cash receipts, and GL accounts through a REST API on a tenant-specific URL such as acme.deltekfirst.com. It authenticates with OAuth2 using the password grant, which must be explicitly enabled in the instance, and every request carries a bearer token that expires in about an hour. Vantagepoint has no general event bus; its webhooks are workflow-driven callbacks with no HMAC signature, so finance records are read by polling. Older Costpoint sites are pull-only over SOAP web services instead.

How Stedi works

Stedi is an EDI translation and routing layer, not a financial system of record, so it stores no vendors, invoices, or GL accounts. It exposes a REST API that generates X12 documents such as the 850 purchase order, 810 invoice, 855 acknowledgment, and 856 ship notice, and delivers them to trading partners over SFTP, FTPS, or AS2. Outbound generation uses POST to the partnership generate-edi endpoint, authenticated with an API key in the Authorization header. Inbound documents are delivered exclusively by webhook through the transaction.processed.v2 event, which carries a download URL for the full translated JSON that your app fetches with the same API key. Partnerships and transaction settings are configured in the Stedi portal.

What moves between them

Outbound, ml-connector reads finished AR invoices from Deltek Vantagepoint and sends them to Stedi as X12 810 invoices for delivery to each client trading partner, and can send purchase orders to vendors as outbound 850s. Inbound, Stedi parses purchase orders and acknowledgments from trading partners and pushes them by webhook, and ml-connector posts them into Deltek as projects and accounting transactions. Deltek firms and GL accounts are aligned with the matching trading-partner identifiers and transaction settings so each document maps to a valid Stedi partnership. Outbound runs on a poll tied to your billing calendar, while inbound is event-driven from Stedi.

How ml-connector handles it

ml-connector stores both credential sets encrypted: the Deltek client ID, secret, username, and password used for the OAuth2 password grant against the tenant URL, and the Stedi API key. It refreshes the Deltek bearer token when a call returns 401, and presents the Stedi API key in the Authorization header on every request. Because Vantagepoint has no usable event stream for finance data, ml-connector polls Deltek for new and updated AR invoices on a schedule rather than waiting for a push, and translates each into the JSON shape Stedi expects before calling generate-edi. Inbound 850 purchase orders arrive through the transaction.processed.v2 webhook; ml-connector returns 2xx inside the five-second window, then fetches the full payload from the documentDownloadUrl with the API key and writes it into Deltek asynchronously. Every outbound EDI call carries a Stedi Idempotency-Key, and inbound events are deduplicated on the Stedi eventId, so neither a retry nor a duplicate webhook posts twice. Firms and GL accounts are mapped first so every document references a partnership and transaction setting that already exists. Deltek has no native idempotency, so ml-connector checks for an existing record by invoice or PO number before posting. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized architecture and engineering firm of about three hundred people runs Deltek Vantagepoint for project accounting and client billing, and a few of its largest institutional clients require invoices over X12 EDI rather than PDF. Before the integration, a billing clerk exported each EDI client's approved invoices from Deltek and hand-keyed them into a separate EDI portal, then watched for purchase orders to arrive by email and re-entered them as projects. With Deltek and Stedi connected, approved AR invoices flow out as 810s automatically and inbound 850 purchase orders post straight back into Deltek as projects, so the EDI clients are billed on time and the manual portal step is gone.

What you can do

  • Send approved Deltek Vantagepoint AR invoices to Stedi as outbound X12 810 invoices for delivery to client trading partners.
  • Post purchase orders that Stedi parses from inbound EDI into Deltek as projects and accounting transactions.
  • Bridge the Deltek tenant OAuth2 password grant and the Stedi API key, refreshing the Deltek token on expiry.
  • Map Deltek firms and GL accounts to Stedi partnerships and transaction settings so each document routes correctly.
  • Poll Deltek on your billing schedule and accept Stedi webhooks, with idempotency on both sides and a full audit trail on every record.

Questions

Which direction does data move between Deltek and Stedi?
It moves both ways. AR invoices created in Deltek go out to Stedi as X12 810 documents for client trading partners, and purchase orders that Stedi parses from inbound EDI come back into Deltek as projects and accounting transactions. Stedi holds no business records of its own, so Deltek remains the system of record on both halves of the flow.
Does Deltek support webhooks, or does ml-connector poll it?
Vantagepoint only has workflow-driven callbacks with no signature and no general event stream for finance data, so ml-connector polls Deltek for new and changed AR invoices on a schedule you set. Stedi is the opposite: inbound purchase orders are delivered exclusively by webhook through the transaction.processed.v2 event, with no polling alternative. The connector handles each side in its native style.
How does the integration avoid duplicate invoices and purchase orders?
Every outbound EDI call to Stedi carries an Idempotency-Key, which is valid for 24 hours and returns the cached result on retry instead of generating a second file. Inbound webhook events are deduplicated on the Stedi eventId, and because Deltek has no native idempotency, ml-connector checks for an existing record by invoice or PO number before posting. Any failed step is logged and can be replayed.

Related integrations

Connect Deltek and Stedi

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

Get started