ml-connector
TallyPrimeZuora

TallyPrime and Zuora integration

TallyPrime is your accounting ledger; Zuora is your billing engine. Connecting them keeps your subscription invoices and payment records aligned across both systems without manual data entry. Sales transactions recorded in TallyPrime flow into Zuora as invoices and payments, reconciled against the correct customer accounts and subscription dimensions. ml-connector handles the polling model TallyPrime requires and OAuth 2.0 authentication Zuora enforces, so your finance and billing teams see the same transactions.

How TallyPrime works

TallyPrime is a desktop-first accounting and ERP application accessed via a local HTTP server on port 9000. All operations run through a single XML or JSON endpoint using request envelopes to specify Import Data for writes or Export Data for reads. TallyPrime has no webhooks; integration must poll day books or voucher collections with date range filters and compare returned record IDs against last-seen state to detect changes. The TallyPrime instance must be running and the target company must be open for API calls to succeed. Authentication is network-level by default but can include optional company credentials. Polling intervals are practical at 5-15 minutes given the single-user desktop architecture.

How Zuora works

Zuora is a subscription billing platform accessed via REST APIs protected by OAuth 2.0 client credentials. The base URL varies by region and must be captured from the customer's tenant. API calls require Bearer token authentication, with tokens expiring after one hour and must be refreshed per request batch. Zuora exposes accounts, subscriptions, invoices, payments, and refunds, and supports Callout Notifications via HTTPS POST webhooks for billing, payment, subscription, and account events, though payment notifications fire only for electronic payments. Rate limits are 50,000 requests per minute in production and 2,500 in the sandbox, with cursor-based pagination capped at 40 records per page.

What moves between them

Sales vouchers and receipts recorded in TallyPrime flow into Zuora as invoice records and payment application records. The integration reads TallyPrime day books on a schedule and posts matching transactions to Zuora accounts and subscriptions, using the customer ledger mapping to align TallyPrime account codes to Zuora account objects. Payments received in TallyPrime are recorded as payment records in Zuora against the correct subscription, so month-end cash application is always current on both sides.

How ml-connector handles it

ml-connector polls TallyPrime by sending Export Data requests with date-range filters on a schedule you configure, extracting sales vouchers, payment receipts, and ledger postings from the day books. It stores TallyPrime's local IP, port, company name, and optional login credentials encrypted, and maintains state tracking to avoid re-importing the same vouchers. For Zuora, ml-connector retrieves the customer's regional base URL and stores OAuth client credentials encrypted, refreshing the Bearer token before each batch of requests. Ledger accounts in TallyPrime are mapped to Zuora accounts using a configuration table, so each sales voucher or payment posts to the correct subscription or account. TallyPrime returns records sequentially without pagination, so ml-connector processes them in a single request batch. Zuora rate limits at 50,000 RPM, so large batches may exceed limits; ml-connector backs off and retries. Every record carries a full audit trail with timestamps, and failed records are marked for replay once downstream data (customer master updates in Zuora) is corrected.

A real-world example

A fast-growing SaaS company in India runs TallyPrime for GST compliance, customer accounting, and cash application, and Zuora for subscription billing and MRR reporting. Before the integration, the finance team exported invoices from Zuora each week and manually entered revenue and payment totals into TallyPrime, a process that took two hours and often introduced mismatches when invoice amendments or refunds were issued in Zuora after the manual entry. With TallyPrime and Zuora connected, each sales transaction and payment recorded in TallyPrime posts automatically to Zuora, and payments received are instantly applied to the correct subscription. The finance team now reconciles cash in minutes rather than hours, and GST filings reflect the same invoice numbers as Zuora, eliminating compliance risk from out-of-sync systems.

What you can do

  • Poll TallyPrime sales vouchers and receipts on a schedule and post them as invoices and payments into Zuora.
  • Map TallyPrime ledger accounts to Zuora accounts so each transaction posts to the correct subscription or billing dimension.
  • Encrypt TallyPrime local credentials and Zuora OAuth secrets, refreshing tokens before each request batch.
  • Track transaction state to prevent duplicate invoice and payment records across polling cycles.
  • Audit every record posted to Zuora with timestamps and replay capability if customer master data updates require correction.

Questions

How does ml-connector retrieve data from TallyPrime if it has no webhooks?
ml-connector polls TallyPrime by sending Export Data requests with date-range filters on a schedule you configure, typically every 5-15 minutes. It reads day books and voucher collections, compares the returned record IDs against its last-seen state, and posts new or updated transactions to Zuora. This polling model works within TallyPrime's single-user desktop architecture.
How are TallyPrime accounts mapped to Zuora subscriptions?
You configure a ledger account mapping table that pairs TallyPrime account codes to Zuora account IDs. When ml-connector posts a sales voucher or payment receipt, it looks up the account code in TallyPrime, finds the mapped Zuora account, and posts the transaction there. This ensures revenue and cash are applied to the correct subscription.
What happens if Zuora's OAuth token expires during a large batch?
ml-connector refreshes the Bearer token before each batch of requests, so expiry within a batch is caught immediately. If a token refresh fails or the request returns 401 Unauthorized, ml-connector backs off, obtains a fresh token, and retries the failing request. All retries and token refreshes are logged in the audit trail.

Related integrations

Connect TallyPrime and Zuora

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

Get started