ml-connector
TallyPrimeAsana

TallyPrime and Asana integration

TallyPrime runs the accounting and the books. Asana runs the day-to-day work and approvals that sit around those numbers. This connection turns TallyPrime vouchers, such as purchase bills and sales invoices that need a sign-off, into trackable Asana tasks so the people who own a review can act on them in the tool they already use. When the Asana task is completed, ml-connector alters the matching TallyPrime voucher to record the approval. Because Asana has no invoice or ledger objects of its own, the financial detail rides along in Asana custom fields that map to TallyPrime voucher fields.

How TallyPrime works

TallyPrime is a desktop application, not a cloud API, so all access runs against a local HTTP server on port 9000 that takes XML or JSON envelopes over POST at http://<tally-host>:9000. There are no REST resource URLs; one endpoint handles everything, and the envelope TALLYREQUEST field selects Import Data for writes or Export Data for reads. Every account is a Ledger, and transactions are Vouchers such as Purchase, Sales, Payment, and Receipt, plus Purchase Orders and Stock Items. The HTTP server enforces no API key or token by default, relying on network controls, and TallyPrime must be running with the company open. It never pushes events and has no webhook system, so change detection is done by polling the Day Book over a date range, and there is no native pagination or idempotency key.

How Asana works

Asana exposes projects, tasks, portfolios, users, teams, goals, and custom fields through its REST API at https://app.asana.com/api/1.0, authenticated with a Personal Access Token or an OAuth2 bearer token. It has no native invoice, purchase order, payment, or ledger objects, so financial metadata is carried in customer-defined custom fields that are resolved by GID rather than by name, since names can be renamed. Responses return only gid, name, and resource_type unless opt_fields names the fields you want, and listing tasks always needs a project, assignee, section, or tag filter. Asana pushes change events by webhook, signed with HMAC-SHA256 keyed on the handshake secret, and silently deletes a webhook after 24 hours of failed delivery. Rate limits are per token, returning HTTP 429 with a Retry-After header.

What moves between them

The primary flow runs from TallyPrime into Asana. ml-connector polls the TallyPrime Day Book for purchase and sales vouchers, and the bills allocated to them, that need a review, and creates or updates an Asana task for each, writing the voucher number, party ledger, amount, due date, and approval status into Asana custom fields. When the Asana task is completed, the completion flows back so ml-connector alters the matching TallyPrime voucher to record the approval. New or changed party ledgers under Sundry Creditors and Sundry Debtors can also sync into an Asana reference list. The cadence is event-driven on the Asana side where its webhooks fire, and poll-driven on the TallyPrime side because TallyPrime cannot push, typically every five to fifteen minutes.

How ml-connector handles it

ml-connector stores both credential sets encrypted. Because TallyPrime runs on the customer LAN and its port 9000 is not reachable from the cloud, calls go through a local agent installed alongside TallyPrime that relays XML or JSON envelopes to http://localhost:9000, and the connector authenticates to that agent rather than to TallyPrime, which enforces no transport auth of its own. On the Asana side it sends the token as a bearer header. Field mapping is the core of this pair: because Asana has no finance objects, each TallyPrime voucher field maps to an Asana custom field resolved by GID, set up once per customer, and every Asana read passes opt_fields so the custom field values come back rather than sparse objects. TallyPrime never pushes, so vouchers are found by polling the Day Book over a moving date window in strict YYYYMMDD format, and the connector keeps requests sequential because TallyPrime is a single-user desktop app that lags under parallel load. Asana webhooks are registered by echoing the X-Hook-Secret during the handshake and verifying the HMAC-SHA256 signature on every event, and because Asana deletes a webhook after 24 hours of failed delivery it re-checks and re-registers on a schedule. Neither side offers an idempotency key, so ml-connector tracks imported voucher numbers and the stored Asana task GID and uses TallyPrime Alter rather than a second Import to update, so a retry does not create a duplicate voucher. TallyPrime has no rate limit and Asana returns 429 with Retry-After, so both are throttled with backoff and every record carries a full audit trail and can be replayed.

A real-world example

A 60-person distribution business in India runs TallyPrime for accounting, GST, and inventory, while its purchasing and operations team coordinates day to day in Asana. Before the integration, every supplier bill entered in Tally that needed a manager's sign-off was chased over WhatsApp and email, approvals were given verbally and forgotten, and the accountant spent the start of each month reconciling which bills had actually been cleared to pay. With TallyPrime and Asana connected, each purchase voucher that needs review becomes an Asana task assigned to the right manager with the supplier, amount, and bill reference in custom fields. The manager completes the task, ml-connector alters the Tally voucher to approved, and the accountant sees a cleared queue instead of a chat thread.

What you can do

  • Create and update Asana tasks from TallyPrime purchase and sales vouchers and bills that need review.
  • Carry the TallyPrime voucher number, party ledger, amount, due date, and approval status in mapped Asana custom fields.
  • Write Asana task completion back to TallyPrime by altering the matching voucher to record the approval.
  • Bridge the Asana bearer token and a local agent that reaches the TallyPrime port 9000 HTTP server on the customer LAN.
  • Poll the TallyPrime Day Book on a schedule and verify Asana HMAC-SHA256 webhooks, with retries and a full audit trail on every record.

Questions

Can Asana hold the bills and ledgers from TallyPrime?
Not as native objects. Asana has no invoice, purchase order, payment, or ledger entities, so ml-connector carries that financial detail in Asana custom fields that map to the TallyPrime voucher fields. The fields are set up once per customer and resolved by their Asana GID, since field names can be renamed.
How does ml-connector reach TallyPrime if it has no cloud API?
TallyPrime only exposes a local HTTP server on port 9000 on the customer machine or LAN, which the cloud cannot reach directly. ml-connector talks to a local agent installed alongside TallyPrime that relays XML or JSON envelopes to that port and returns the responses. The connector authenticates to the agent, since TallyPrime itself enforces no transport auth.
How are changes detected and kept from duplicating?
TallyPrime never pushes events, so ml-connector polls the Day Book over a moving date window, usually every five to fifteen minutes, while Asana changes arrive by signed webhook. Because neither side offers an idempotency key, the connector tracks imported voucher numbers and the stored Asana task GID and uses the TallyPrime Alter action to update rather than importing again, so a retry never creates a duplicate voucher.

Related integrations

Connect TallyPrime and Asana

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

Get started