Acumatica and Microsoft Teams integration
Acumatica runs finance, distribution, and procurement. Microsoft Teams is where your staff already talk and make decisions. Connecting the two means an Acumatica event such as a purchase order moving to Open, an AP bill landing on hold for approval, or a payment being released shows up in the right Teams channel or direct chat instead of sitting unseen in the ERP. ml-connector reads the change from Acumatica, formats it as a Teams message or adaptive card, and posts it through Microsoft Graph. Microsoft Teams holds no invoices, purchase orders, or GL data, so it is used as the notification and approval surface, never as a financial source of record.
What moves between them
The flow runs from Acumatica into Microsoft Teams. ml-connector watches Acumatica purchase orders, AP bills, and payments for the status changes you care about, such as a PO reaching Open, a Bill sitting on hold for approval, or a Payment being released, and posts each as a message or adaptive card into the Teams channel or direct chat you map to that event. Acumatica employee and contact records are matched to Teams user IDs so the responsible person can be mentioned or messaged directly. The only data that comes back from Teams is the human response, such as an approval button press on an adaptive card, which ml-connector can translate into the matching Acumatica action; Teams holds no financial records to send back, so no ledger data ever flows out of it.
How ml-connector handles it
ml-connector stores both credential sets encrypted. On the Acumatica side it requests an OAuth2 bearer token from the instance OpenID Connect server, or holds a session cookie and logs out cleanly so it does not exhaust the concurrent-user license, and it pins the endpoint version per customer because a mismatched version returns 404. It learns about events either by receiving Acumatica Push Notifications, verifying the configured shared-secret header on each call, or by polling entities on a schedule with $top and $skip filtered on LastModifiedDateTime when push is not set up. Because Acumatica push retries up to five times and can deliver the same event twice with no dead-letter queue, ml-connector deduplicates on the Acumatica reference number plus a BullMQ jobId before it posts, so an approval card is never sent twice for one bill. On the Teams side it acquires an Entra ID app-only token with the .default scope, which an Azure AD admin must consent to once, refreshes it before its roughly one-hour expiry, and posts through Microsoft Graph; a 429 with a Retry-After header is honored with backoff. Acumatica employees and contacts are mapped to Teams user IDs up front so mentions resolve, and where the connector subscribes to Graph change notifications to catch a button response it renews the subscription before the three-day limit. Every notification carries a full audit trail and can be replayed if a Graph post fails.
A real-world example
A mid-sized specialty distributor with about 250 staff runs Acumatica for purchasing, AP, and finance, and runs the whole company day to day in Microsoft Teams. Before the integration, purchase orders and vendor bills waited in Acumatica until a manager happened to log in, so approvals slipped past their due dates and the AP team chased people by email for sign-off. With Acumatica and Microsoft Teams connected, each bill that lands on hold posts an approval card into the buyer's Teams channel with the vendor, amount, and due date, the right approver is mentioned by name, and a tap on the card releases the bill back in Acumatica. Approvals happen the same day, late-payment penalties drop, and the AP team stops sending reminder emails.
What you can do
- Post Acumatica purchase order, AP bill, and payment events into the right Microsoft Teams channel or direct chat as adaptive cards or notes.
- Map Acumatica employee and contact records to Teams user IDs so the responsible approver is mentioned or messaged.
- Turn an approval response in Teams back into the matching Acumatica action, such as releasing a bill.
- Authenticate Acumatica with OAuth2 or session login and Microsoft Teams with Entra ID app-only client credentials.
- Trigger on Acumatica push notifications or scheduled polling, with reference-number and jobId dedup, retries, and a full audit trail on every message.
Questions
- Which direction does data move between Acumatica and Microsoft Teams?
- The flow is Acumatica into Microsoft Teams. Purchase order, AP bill, and payment events move from Acumatica into Teams as notifications and approval cards. Microsoft Teams has no invoice, purchase order, or GL records, so the only thing that comes back is a human approval response, which ml-connector can apply as the matching Acumatica action.
- How does the integration learn about an Acumatica event, by webhook or polling?
- Both are supported. If the customer configures Acumatica Push Notifications, ml-connector verifies the shared-secret header on each delivery, since Acumatica signs no HMAC on the body. Where push is not set up, it polls entities with $top and $skip filtered on LastModifiedDateTime, and because Acumatica push can retry and deliver duplicates it deduplicates on the reference number and a BullMQ jobId so one event never produces two cards.
- What setup does the Microsoft Teams side require?
- An Azure AD admin registers an app in Microsoft Entra ID, creates a client secret, and consents to the application permissions the connector needs, such as ChannelMessage.Send and User.Read.All. ml-connector then uses OAuth2 client credentials with the https://graph.microsoft.com/.default scope to post through Microsoft Graph, and it renews any Graph change-notification subscription before its roughly three-day expiry so approval responses keep flowing back.
Related integrations
More Acumatica integrations
Other systems that connect to Microsoft Teams
Connect Acumatica and Microsoft Teams
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started