The ENVELOPE structure
Every Tally XML payload is wrapped in an ENVELOPE with a HEADER and BODY. The header tells Tally this is an import; the body carries the vouchers:
<ENVELOPE>
<HEADER>
<VERSION>1</VERSION>
<TALLYREQUEST>Import Data</TALLYREQUEST>
<TYPE>Data</TYPE>
<ID>Vouchers</ID>
</HEADER>
<BODY>
<IMPORTDATA>
<REQUESTDESC>
<REPORTNAME>Vouchers</REPORTNAME>
</REQUESTDESC>
<REQUESTDATA>
<TALLYMESSAGE>
<!-- one or more <VOUCHER> entries go here -->
</TALLYMESSAGE>
</REQUESTDATA>
</IMPORTDATA>
</BODY>
</ENVELOPE>The three tags that matter are TALLYREQUEST (set to Import Data), REPORTNAME (set to Vouchers), and the TALLYMESSAGE block that holds the transactions. A minimal header with just TALLYREQUEST imports cleanly too — the VERSION, TYPE and ID fields shown above are the full documented form.
Inside a VOUCHER element
Each transaction is one VOUCHER element inside TALLYMESSAGE. For a bank statement, each row becomes a Payment (money out) or Receipt (money in) voucher:
<VOUCHER VCHTYPE="Payment">
<DATE>20260317</DATE>
<VOUCHERTYPENAME>Payment</VOUCHERTYPENAME>
<PARTYLEDGERNAME>State Bank of India</PARTYLEDGERNAME>
<ALLLEDGERENTRIES.LIST>
<LEDGERNAME>State Bank of India</LEDGERNAME>
<ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
<AMOUNT>-15000.00</AMOUNT>
</ALLLEDGERENTRIES.LIST>
</VOUCHER>- VCHTYPE — the voucher kind: Payment, Receipt, Contra (or Sales, Journal…). A converter picks it per transaction: credit row = Payment, debit row = Receipt.
- DATE — strictly YYYYMMDD with leading zeros.
- PARTYLEDGERNAME — the bank ledger the voucher posts to (e.g. State Bank of India, grouped under Bank).
- ALLLEDGERENTRIES.LIST — the double-entry legs: each leg names a LEDGERNAME, sets ISDEEMEDPOSITIVE to Yes/No, and carries an AMOUNT. Together, the flag, the voucher type and the amount's sign decide the debit/credit side — keep them in sync.
One envelope, many vouchers
A single TALLYMESSAGE can hold hundreds or thousands of VOUCHER entries — which is exactly how a statement converts: every transaction row becomes a voucher in one file. Import it via Gateway of Tally → Import Data → Vouchers (newer Tally Prime releases label the option Transactions), select the file, and Tally loads the batch.
Check the ledger mapping before you import
Every ledger named in the file must exist in the company first — create the bank ledger under the Bank group with the exact spelling, or Tally asks you to remap on-screen. The step-by-step import guide covers this end to end.
Three errors that fail imports
Invalid dates
Tally expects YYYYMMDD with leading zeros — 20240607, not 202467 or 07/06/2024. A single malformed date can stop the whole import.
Ledger not found
Every ledger named in the file must already exist in the company (grouped under Bank for bank ledgers). Missing masters are the most common import failure.
Encoding and escaping
Files should be UTF-8, and special characters in narrations or ledger names must be XML-escaped (& as &). Tally writes a tally.imp log to help you trace failures.
You don't need to write this by hand
The format above is the reference, not the workflow. A converter builds the file for you: upload a bank statement PDF, review the extracted rows, and download a Tally-ready XML with every transaction as a voucher — correctly dated and ledgered. Hand-writing it is how dates get mangled and ledgers get missed.
