ml-connector
Infor CloudSuiteAsana

Infor CloudSuite and Asana integration

Infor CloudSuite runs ERP, finance, and procurement. Asana runs work and project tracking. Connecting the two turns finance records into trackable work without re-keying. New purchase orders and supplier invoices in Infor CloudSuite become Asana tasks for approval and follow-up, with the PO number, supplier, and amount carried in Asana custom fields. ml-connector handles the very different APIs on each side and moves the data on a schedule you control.

How Infor CloudSuite works

Infor CloudSuite exposes suppliers, purchase orders, supplier invoices, payments, and GL accounts through the ION API Gateway over REST, with M3 using m3api-rest transaction programs such as PPS100MI and APS100MI, and SyteLine using IDO REST. Every customer has a unique gateway URL, tenant ID, and OAuth token endpoint taken from the .ionapi credentials file, so there is no shared hostname. Authentication uses OAuth 2.0 with a service-account access key and secret, and the bearer token expires in one to twenty-four hours. CloudSuite has no self-service webhooks, so records are read by polling or pushed through admin-configured ION document flows.

How Asana works

Asana exposes tasks, projects, portfolios, users, teams, goals, and custom fields through its REST API at app.asana.com over JSON. Authentication is a long-lived Personal Access Token or OAuth 2.0 authorization code, both sent as a Bearer token. Asana has no native invoice, purchase order, payment, or GL account objects, so financial data is carried in customer-defined custom fields resolved by stable GID. Asana pushes record changes by HTTP webhook signed with HMAC-SHA256, and responses return only gid, name, and resource_type unless opt_fields is supplied.

What moves between them

The main flow runs from Infor CloudSuite into Asana. ml-connector polls CloudSuite for new and changed purchase orders and supplier invoices and creates or updates matching Asana tasks, writing the PO number, supplier, amount, and currency into mapped Asana custom fields. Task completion and field changes flow back from Asana, delivered by webhook, and ml-connector posts the outcome onto the source CloudSuite record where a write path exists or records it in the audit log. Reference data such as suppliers and GL account values seeds the Asana custom field options so tasks reference valid CloudSuite dimensions. CloudSuite remains the system of record for finance; Asana holds the work item and its status.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Infor CloudSuite side it accepts the full .ionapi field set per customer, requests an OAuth bearer token with the service-account access key and secret using the password grant, and refreshes the token proactively before its one-to-twenty-four-hour expiry rather than reacting to 401s. On the Asana side it authenticates with the Personal Access Token or OAuth bearer token and always passes opt_fields so task reads return assignee, due date, and custom fields instead of sparse objects. Because CloudSuite has no self-service webhooks, new POs and invoices are detected by polling M3 list programs or SyteLine IDOs on a schedule, paging with maxRecords or RecordCap and Bookmark. Asana changes arrive by webhook, and each event POST is verified by recomputing HMAC-SHA256 over the body with the stored X-Hook-Secret. Custom field GIDs are resolved per workspace, since names can change. M3 Add transactions are not idempotent, so ml-connector queries by PO or invoice number before creating, and uses a stored Asana GID to avoid duplicate tasks. CloudSuite 429 responses get exponential backoff with jitter, and the connector re-registers any Asana webhook that auto-deletes after delivery failure.

A real-world example

A mid-sized industrial distributor runs Infor CloudSuite for procurement and finance and uses Asana to coordinate approvals across purchasing, warehouse, and accounts payable. Before the integration, buyers exported a list of open purchase orders and pasted them into Asana by hand, and AP staff watched two screens to know which invoices still needed sign-off, so approvals stalled and POs were missed at receiving. With Infor CloudSuite and Asana connected, each new PO and supplier invoice creates an Asana task automatically, tagged with the supplier and amount in custom fields, and the moment a reviewer marks the task done that status flows back to the source record. The purchasing team works one queue in Asana, and finance sees approval progress without leaving CloudSuite.

What you can do

  • Create and update Asana tasks from new Infor CloudSuite purchase orders and supplier invoices.
  • Carry the PO number, supplier, amount, and currency in mapped Asana custom fields resolved by GID.
  • Push Asana task completion and field changes back onto the source CloudSuite record or audit log.
  • Bridge Infor CloudSuite OAuth2 service-account login and the Asana token, verifying every webhook with HMAC-SHA256.
  • Poll CloudSuite on a schedule with paging, retries, and a stored GID so tasks are never duplicated.

Questions

Which direction does data move between Infor CloudSuite and Asana?
The main flow runs from Infor CloudSuite into Asana, where purchase orders and supplier invoices become tasks. Task completion and field changes flow back from Asana by webhook and update the source record or the audit log. CloudSuite stays the system of record for finance, while Asana holds the work item and its status.
How does the integration get changes out of Infor CloudSuite without webhooks?
Infor CloudSuite has no self-service webhooks, so ml-connector polls the ION API Gateway on a schedule, reading M3 list programs or SyteLine IDOs and paging with maxRecords or RecordCap and Bookmark. New and changed purchase orders and invoices are detected by status and date filters. An admin can also configure ION document flows to push events where that is preferred.
How are financial values stored in Asana when it has no invoice or PO objects?
Asana has no native invoice, purchase order, or GL account objects, so financial data is carried in customer-defined custom fields such as PO number, supplier, and amount. ml-connector maps each value to a custom field and resolves it by its stable GID rather than its name, since field names can be renamed. The mapping is configured per customer up front.

Related integrations

Connect Infor CloudSuite and Asana

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

Get started