ml-connector
TallyPrimeBILL

TallyPrime and BILL integration

TallyPrime keeps the books and the supplier ledger. BILL runs the accounts payable workflow, paying vendors by check, ACH, or virtual card. Connecting the two means purchase bills entered in TallyPrime move into BILL for approval and payment without re-keying, and the payments BILL settles flow back into TallyPrime as payment vouchers against the right bill. ml-connector handles the very different access models on each side and moves the records on a schedule you control. Purchase orders stay in TallyPrime, since BILL has no purchase order object, so only bills and payments cross between the two systems.

How TallyPrime works

TallyPrime is a desktop application, not a cloud API, so all access runs against its built-in HTTP server on port 9000 using XML or JSON envelopes rather than REST resources. There is no transport-level API key or OAuth; security comes from the LAN, with an optional company password passed in the envelope, and a local agent on the customer network is required for a cloud service to reach it. Suppliers and customers are both Ledgers, while bills and payments are vouchers of type Purchase, Payment, and Receipt. TallyPrime never pushes events and has no pagination or idempotency, so records are read by polling the Day Book over a date range.

How BILL works

BILL exposes vendors, bills, payments, invoices, customers, and GL accounts through its REST v3 API at gateway.prod.bill.com. Authentication is a session token: a login call with a developer key plus organization credentials returns a sessionId that is sent on every request and expires after 35 minutes of inactivity. Pagination is offset based with a maximum of 100 records per page, and the API allows only three concurrent requests per organization. BILL pushes signed webhooks for events such as bill.created and payment.updated, but has no purchase order object.

What moves between them

The main flow runs from TallyPrime into BILL. ml-connector reads supplier ledgers and Purchase vouchers from TallyPrime and creates matching vendors and bills in BILL so each invoice can be approved and paid through the BILL workflow. Once BILL settles a payment, the payment record flows back into TallyPrime as a Payment voucher, allocated against the original bill so the supplier balance clears. Vendor master records are kept aligned so each bill in BILL references a vendor that already exists. Purchase orders stay in TallyPrime, since BILL has no purchase order object, so only bills and payments move between the two systems.

How ml-connector handles it

ml-connector stores both credential sets encrypted. It forwards XML or JSON envelopes to the TallyPrime local agent, which relays them to the port 9000 server on the customer LAN, and on the BILL side it performs the session login, caches the sessionId, and re-authenticates and retries when a call returns a 401 because the session has gone silent. TallyPrime supplier ledgers map to BILL vendors and Purchase vouchers map to BILL bills, with vendors synced first so every bill resolves to a vendor that exists. Because TallyPrime cannot push events, ml-connector polls the Day Book over a date range on a schedule rather than waiting for a callback, and it can take a BILL bill.created or payment.updated webhook, verified by HMAC-SHA256 against the x-bill-sha-signature header, as a trigger to pull the latest state. Neither system offers an idempotency key, so ml-connector dedupes on the TallyPrime voucher number and the BILL entity ID before writing, which is the only safe guard against duplicate bills since a repeated Import Data call in TallyPrime creates a duplicate voucher. It keeps BILL requests within the three-concurrent limit and backs off on the BDC_1144 hourly rate-limit error.

A real-world example

A mid-sized distributor in India with roughly eighty staff runs TallyPrime for accounting, inventory, and GST, but pays its overseas and domestic suppliers through BILL to get approval routing and ACH payments. Before the integration, the AP clerk entered each purchase bill in TallyPrime and then typed it again into BILL to schedule payment, and once BILL paid, a second person recorded the payment back in TallyPrime by hand. Bills were paid late when the second entry slipped, and the supplier ledger in TallyPrime often disagreed with what BILL had actually paid. With TallyPrime and BILL connected, each purchase bill flows into BILL for approval automatically, settled payments post back as payment vouchers against the right bill, and the supplier balances in TallyPrime match BILL without a reconciliation pass.

What you can do

  • Push TallyPrime supplier ledgers and Purchase vouchers into BILL as vendors and bills for approval and payment.
  • Pull settled BILL payments back into TallyPrime as Payment vouchers allocated against the original bill.
  • Keep the BILL vendor list aligned with TallyPrime supplier ledgers so every bill resolves to a known vendor.
  • Bridge the TallyPrime local agent on port 9000 with BILL session-token login, refreshing the session on expiry.
  • Dedupe on voucher number and BILL entity IDs, with retries and a full audit trail on every record.

Questions

Which direction does data move between TallyPrime and BILL?
Supplier ledgers and Purchase vouchers move from TallyPrime into BILL as vendors and bills for payment, and settled payments flow back from BILL into TallyPrime as Payment vouchers against the original bill. Purchase orders stay in TallyPrime because BILL has no purchase order object. Only bills and payments cross between the two systems.
How does ml-connector reach TallyPrime if it is a desktop application?
TallyPrime's HTTP server on port 9000 is only reachable on the customer LAN, so ml-connector talks to it through a local agent installed on the customer network. The agent relays XML or JSON envelopes to port 9000 and returns the responses. There is no public cloud endpoint, so this local agent is required.
How are duplicate bills and payments prevented?
Neither TallyPrime nor BILL offers a native idempotency key, and a repeated Import Data call in TallyPrime creates a duplicate voucher. To prevent this, ml-connector tracks the TallyPrime voucher number and the BILL entity ID and checks them before writing, so a record that is read more than once is never booked twice.

Related integrations

Connect TallyPrime and BILL

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

Get started