ml-connector
Sage 50Tipalti

Sage 50 and Tipalti integration

Sage 50 holds your vendor master, purchase orders, and invoices. Tipalti runs global payment processing and compliance. Connecting them moves your unpaid invoices from Sage 50 into Tipalti's payment workflow without manual export-and-import, and once Tipalti processes a payment, the record returns to Sage 50 so your cash and payables stay synchronized. ml-connector handles the Windows SDK on one side and Tipalti's dual SOAP and REST APIs on the other, polling Sage 50 on a regular cycle and listening for payment events from Tipalti.

How Sage 50 works

Sage 50 runs as a desktop or local LAN installation on Windows with no native REST API. Integration occurs via the Sage 50 .NET SDK (US edition) or Sage Data Objects COM layer (UK edition), accessed from a Windows process with direct access to the company data files. Sage 50 authenticates with Windows local username and password; there is no token-based or API-key authentication. The system exposes vendors, purchase invoices, purchase orders, general journal accounts, and vendor payments through the SDK. Because there are no webhooks or event streams, integration relies on polling: querying modified records by LastModifiedDate or scanning the audit trail for changes within a time window.

How Tipalti works

Tipalti is a web-based AP automation platform that exposes payees, invoices, purchase orders, payments, and GL accounts through both SOAP/XML (at https://api.tipalti.com/v14/PayeeFunctions.asmx for payees and PayerFunctions.asmx for payer operations) and REST/JSON (at https://triggers.approve.com). SOAP endpoints use HMAC-SHA256 signatures with a payer name and API key, while REST endpoints use OAuth2 client credentials or a static x-api-key header. Tipalti pushes payment events (payee details changed, payment submitted, payment completed, payment cancelled) via a single account-wide IPN webhook endpoint, verified using HMAC-SHA256.

What moves between them

The main flow runs from Sage 50 into Tipalti. Unpaid invoices and new vendor records are read from Sage 50 on a regular polling cycle (e.g., hourly), then posted to Tipalti's invoice and payee endpoints via SOAP or REST. When Tipalti processes a payment, an IPN webhook notifies ml-connector with a payment_completed event; ml-connector then queries Tipalti for payment details and records the payment back into Sage 50's vendor payment records and general journal to reflect the cash outflow. Vendor master data can flow bidirectionally: new suppliers added in Tipalti can be synced back to Sage 50 if needed, though the primary flow is Sage 50 to Tipalti for payment initiation.

How ml-connector handles it

ml-connector runs a Windows process with access to the Sage 50 SDK and company files. On a scheduled interval (e.g., every hour), it queries Sage 50 for invoices modified since the last poll, extracts vendor name, amount, GL account, and other details, and posts them to Tipalti using SOAP (with HMAC-SHA256 signing of the request) or REST (with OAuth2 bearer token). If the same invoice is already in Tipalti, the system deduplicates by invoice number and skips re-posting. Sage 50 vendors are mapped to Tipalti payees by vendor ID or name; if a vendor does not yet exist in Tipalti, ml-connector can create a payee record first. When Tipalti IPN webhooks arrive, ml-connector verifies the HMAC signature, looks up the matching invoice in Sage 50, and creates a vendor payment record in Sage 50's GL, allocating the cash to the correct GL account and cost center. The audit trail on both sides records the mapping between Sage 50 invoice and Tipalti payment ID, so any replay or failure can be traced.

A real-world example

A mid-market manufacturing company with regional distribution centers uses Sage 50 for accounts payable on Windows servers at each location. Each month, the AP team exports unpaid invoices from Sage 50, enters them into Tipalti's web portal by hand, processes approvals and payments, then manually updates Sage 50 with payment details. With Sage 50 and Tipalti connected, unpaid invoices flow automatically from Sage 50 into Tipalti each morning, the payment workflow runs in Tipalti (with approvals and compliance checks), and once a payment is sent, it posts back into Sage 50 with no manual re-entry. Month-end close now includes automatic cash updates and payables reconciliation, and the manual AP entry step is eliminated.

What you can do

  • Read unpaid invoices from Sage 50 and post them to Tipalti for payment processing via SOAP or REST.
  • Map Sage 50 vendors to Tipalti payees, creating new payee records in Tipalti if the vendor does not yet exist.
  • Poll Sage 50 on a regular schedule to capture new and modified invoices without requiring webhooks or SDK callbacks.
  • Receive payment completion events from Tipalti via IPN webhooks, verify HMAC signatures, and record payments back into Sage 50 GL and vendor payment records.
  • Maintain a full audit trail linking Sage 50 invoices to Tipalti payment IDs for reconciliation, replay, and compliance.

Questions

How does ml-connector access Sage 50 if there is no REST API?
ml-connector runs a Windows process with the Sage 50 .NET SDK (or COM layer for UK edition) installed, connecting directly to the company data files on the local machine or LAN. It authenticates with the Sage 50 Windows user credentials (username and password) and polls for modified invoices on a regular schedule, since Sage 50 does not offer webhooks or push events.
What happens if an invoice is posted to Tipalti but the vendor does not exist?
ml-connector checks for the Sage 50 vendor in Tipalti's payee database before posting an invoice. If the vendor does not exist in Tipalti, ml-connector creates a new payee record with the vendor name, ID, and other key details, then posts the invoice. This ensures all invoices land on a valid payee in Tipalti.
How are payments from Tipalti recorded back into Sage 50?
When Tipalti sends a payment_completed IPN webhook, ml-connector verifies the HMAC signature, retrieves the payment details and Sage 50 invoice number from Tipalti, then creates a vendor payment record in Sage 50's general journal. The payment is allocated to the GL account and cost center that match the original invoice, keeping payables and cash in sync.

Related integrations

Connect Sage 50 and Tipalti

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

Get started