ml-connector
TallyPrimeWise

TallyPrime and Wise integration

TallyPrime manages your accounting and inventory on the desktop. Wise handles your international payments and multi-currency accounts in the cloud. Connecting the two keeps your payment records and balance reconciliation in sync. Payment vouchers recorded in TallyPrime become transfer instructions to Wise, and Wise balance updates and transfer confirmations flow back into TallyPrime's receipts and payment records, eliminating manual reconciliation and duplicate data entry.

How TallyPrime works

TallyPrime exposes ledgers, groups, vouchers (purchase, sales, payment, receipt, purchase order), and stock items through an HTTP XML/JSON API at port 9000. The local TallyPrime instance must be running with the target company open and the HTTP server manually enabled in Advanced Configuration. All operations use a single endpoint controlled by request envelope fields such as TALLYREQUEST, SVCURRENTCOMPANY (company name, case-sensitive), and date range filters (SVFROMDATE, SVTODATE in YYYYMMDD format). TallyPrime has no webhooks or change streams, so all reads are polling-only with a practical minimum interval of 5-15 minutes. Write operations use Import Data to create or Alter to update vouchers; duplicate imports create duplicates, so idempotency must be managed by the integrator.

How Wise works

Wise publishes profiles, balances, BalanceStatements, recipients, quotes, transfers, and activity through a REST API at https://api.wise.com with OAuth 2.0 (12-hour token expiry, long-lived refresh tokens) or Personal API Token authentication. Wise enforces rate limits of 100 requests per second and 1000 per minute for partner OAuth or 900-1500 per minute for personal token accounts, with offset and limit pagination (max 100 per page). Transfers require a 4-step sequence: quote, recipient, transfer order, and fund payment. Wise emits webhooks for transfersstate-change, transferspayout-failure, balancesupdate, and balancescredit events with RSA-SHA256 signature verification. Recipients are immutable (update requires delete and recreate), and quotes expire, so a fresh quote must be created before funding if time has elapsed.

What moves between them

Outbound: TallyPrime payment vouchers and receipts are polled on a schedule tied to your payment or bank reconciliation cycle, mapped to Wise recipients and balances, and posted as transfer orders with funding instructions. Inbound: Wise transfer confirmations and balance updates flow into TallyPrime as receipt and payment vouchers, allocated to the ledger accounts and cost centers that match each recipient and transfer description. Profiles and balance statements can be synced in both directions for reconciliation purposes. All records carry timestamps and transaction IDs for audit and deduplication.

How ml-connector handles it

ml-connector stores the TallyPrime host IP and port and the Wise OAuth 2.0 credentials encrypted. On the outbound path, it polls TallyPrime for payment vouchers using Export Data requests with date range filters, maps each voucher amount, payee, and memo to a Wise recipient and balance, retrieves a fresh quote if the prior one expired, creates a transfer order, and funds it via the payment endpoint. It retries on Wise's 429 (rate limit) responses with exponential backoff, since both profile ID and recipient ID are required on each Wise call and rate limits may apply across the entire account. On the inbound path, it accepts Wise webhooks for transfersstate-change and balancesupdate events, verifies the RSA-SHA256 signature, and posts matching receipt or payment vouchers into TallyPrime using Import Data, with the Wise transaction ID stored in the voucher reference field to prevent re-import of the same transfer. Because TallyPrime is single-user and has no pagination, ml-connector batches Wise balance and transfer lookups and keeps requests sequential. Polling and webhook events are deduplicated using transaction IDs from both systems.

A real-world example

A small import-export company uses TallyPrime for invoicing and accounting in their local currency and Wise for international client payments in multiple currencies. Before the integration, the finance team exported payment vouchers from TallyPrime, manually entered them into Wise with currency conversion quotes, waited for the transfer to complete, and then logged back into TallyPrime to record the receipt and reconcile bank balances. With TallyPrime and Wise connected, each payment voucher in TallyPrime triggers a Wise transfer automatically, conversion quotes are locked in at posting time, and when Wise confirms the payout, the receipt posts back to TallyPrime and balances are reconciled instantly. Month-end reconciliation now takes hours instead of days.

What you can do

  • Poll TallyPrime payment and receipt vouchers on a schedule and post them as Wise transfers with the correct recipient and balance allocation.
  • Receive Wise transfer state-change and balance-update webhooks and record the results as payment receipts in TallyPrime with full transaction IDs for audit and deduplication.
  • Manage OAuth 2.0 token refresh for Wise and accept both OAuth 2.0 and Personal API Token authentication methods.
  • Map TallyPrime ledger accounts and cost centers to Wise recipients and balance types so transfers land on the correct account in both systems.
  • Deduplicate transfers using transaction IDs from both systems, handle Wise quote expiry, retry on rate limits, and maintain an encrypted audit trail on every record.

Questions

Which direction does data move between TallyPrime and Wise?
Outbound: TallyPrime payment vouchers are polled and posted as Wise transfers. Inbound: Wise transfer confirmations and balance updates are received via webhooks or polling and posted as TallyPrime receipt and payment vouchers. Ledger accounts and cost centers are aligned in both directions so transfers land on the correct accounts. Profiles and balance statements can also be synced for reconciliation.
Does the integration require a local agent or special setup for TallyPrime?
Yes. TallyPrime runs on a desktop Windows machine and exposes port 9000 only on the local network. ml-connector must be configured with the TallyPrime host IP, HTTP port (default 9000), and company name (case-sensitive). The TallyPrime application must be running with the target company open, and the HTTP server must be manually enabled in Advanced Configuration. ml-connector will poll the local endpoint on a schedule you define.
How are Wise rate limits and quote expiry handled?
Wise enforces 100 requests per second and 1000 per minute for partner OAuth. ml-connector batches requests to Wise and retries on 429 rate-limit responses with exponential backoff and jitter. Quotes from Wise expire automatically, so ml-connector creates a fresh quote before funding each transfer if time has elapsed since the original quote was issued.

Related integrations

Connect TallyPrime and Wise

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

Get started