SAP S/4HANA and Asana integration
SAP S/4HANA runs procurement and finance. Asana runs the team work that surrounds it: approvals, follow-ups, and status tracking. Connecting the two turns SAP purchase requisitions, purchase orders, and supplier invoices into Asana tasks so the people who own each step can act on them without logging into SAP. When a task is finished in Asana, the outcome is written back to the matching SAP document. ml-connector handles the very different APIs on each side and keeps the two in step on a schedule you control.
What moves between them
The main flow runs from SAP S/4HANA into Asana. ml-connector polls SAP for new and changed purchase requisitions, purchase orders, and supplier invoices and creates or updates a matching Asana task, writing the document number, supplier, amount, currency, and cost center into Asana custom fields. The return flow runs from Asana to SAP: when a task is completed or its status custom field changes, an Asana webhook fires and ml-connector updates or releases the matching SAP document. Asana users and the SAP supplier list can be aligned so tasks are assigned to the right owners and reference valid suppliers.
How ml-connector handles it
ml-connector stores both credential sets encrypted, requests a SAP OAuth2 bearer token and caches it until just before its 12-hour expiry, and sends the Asana token as a bearer header. Because SAP S/4HANA has no native webhooks, it polls the OData services on the schedule you set, using $filter on LastChangeDateTime and following @odata.nextLink for pagination rather than guessing offsets. Before any write to SAP it fetches an X-CSRF-Token with the Fetch header and replays the request if SAP returns 403, and it passes the prior ETag in If-Match on updates. The SAP document number is stored on the Asana task as a stable key so an existing task is updated instead of duplicated, since neither API offers an idempotency key. On the Asana side it verifies the X-Hook-Signature on every event, completes the X-Hook-Secret handshake on registration, and re-registers the webhook if Asana auto-deletes it after 24 hours of failed delivery. Custom fields are resolved by GID, not name, because names can change, and the SAP-to-Asana field mapping for cost centers and amounts is set per customer up front. SAP 429 throttling and Asana per-token rate limits both trigger backoff with retries, and every record carries a full audit trail with error replay.
A real-world example
A mid-sized manufacturer with around 600 employees runs SAP S/4HANA Cloud for procurement and finance, but its plant managers and department heads live in Asana for day-to-day work. Before the integration, every purchase order over a threshold meant an email asking someone to log into SAP, find the document, and approve it, and supplier invoices waiting on a sign-off sat unseen until finance chased them. With SAP S/4HANA and Asana connected, each new purchase order and supplier invoice appears as an Asana task assigned to the right owner, with the supplier, amount, and cost center already filled in. When the owner marks the task done, the approval is written back to SAP, so finance can see at a glance what is still outstanding and the back-and-forth email is gone.
What you can do
- Turn new SAP S/4HANA purchase requisitions, purchase orders, and supplier invoices into assigned Asana tasks.
- Carry the SAP document number, supplier, amount, currency, and cost center in Asana custom fields.
- Write task completion and status changes from Asana back to the matching SAP document.
- Bridge SAP OAuth2 token auth and the X-CSRF-Token for writes with Asana bearer auth and signed webhooks.
- Poll SAP on your schedule and verify every Asana webhook, with retries and a full audit trail on each record.
Questions
- Can Asana hold SAP invoices, purchase orders, and GL data directly?
- No. Asana is a work management tool with no native invoice, purchase order, payment, or GL account objects. ml-connector maps each SAP document to an Asana task and stores the financial details, such as the document number, supplier, amount, and cost center, in Asana custom fields configured for your workspace. The system of record stays SAP S/4HANA; Asana is where the work around each document happens.
- How does the integration get data out of SAP S/4HANA without webhooks?
- SAP S/4HANA Cloud does not push webhooks to external endpoints, so ml-connector polls the OData services on the schedule you set. It uses a $filter on LastChangeDateTime to pick up only new and changed documents and follows the OData nextLink for pagination. This requires an SAP admin to set up a Communication Arrangement for each service first.
- What stops duplicate Asana tasks or duplicate writes back to SAP?
- Neither API provides an idempotency key, so ml-connector stores the SAP document number on the Asana task as a stable reference. On each poll it updates the existing task instead of creating a new one, and uses BullMQ job dedup for queued work. Writes back to SAP fetch the X-CSRF-Token and pass the prior ETag in If-Match, and SAP's own posting logic rejects duplicate supplier invoices for the same vendor, reference, company code, and fiscal year.
Related integrations
More SAP S/4HANA integrations
Other systems that connect to Asana
Connect SAP S/4HANA and Asana
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started