TallyPrime Deep-Dive Part 7: Voucher Architecture — All 16 Types, Classes, Numbering & Code | FreeLearning365

TallyPrime Deep-Dive Part 7: Voucher Architecture — All 16 Types, Classes, Numbering & Code | FreeLearning365
Go to Job Interview Portal HOT 🔥
VCH
Part 07 of 45 — TallyPrime Deep-Dive Masterclass

Voucher Architecture

Every number in Tally comes from a voucher. Every report traces back to a voucher. Master this, and you master Tally. We cover all 16 voucher types, Voucher Classes, numbering schemes, security, TDL/XML code, and 40+ real-world scenarios — with Bangladesh VAT examples.

📖 85 min read 📋 16 Voucher Types 🎯 Voucher Classes 💻 TDL & XML 🇧🇩 Bangladesh VAT
🎯 What You Will Learn in Part 7: If Part 6 was the engine, Part 7 is the control panel. Every TallyPrime transaction — from a simple cash receipt to a complex manufacturing journal — flows through a voucher. In this part, we dissect every voucher type, reveal the underrated power of Voucher Classes, decode numbering schemes, explore security controls, and show how developers interact with vouchers via TDL and XML. Expect 40+ examples, Bangladesh VAT vouchers, and 30 pro tips.

Why Vouchers Are the Most Important Pillar

Here is a statement that will sound strange to beginners but obvious to experts: Every financial statement in Tally is just an aggregation of vouchers.

Your Trial Balance? It is a sum of all ledger movements across all vouchers. Your Balance Sheet? It is a hierarchy of groups built from voucher postings. Your GST return? It is a filtered extract of vouchers where the tax ledgers are non-zero.

If you understand vouchers deeply, every report becomes self-explanatory. If you only understand reports, you will spend your life debugging "why does this number not match?"

🧑‍💼 For Accountants

A Voucher Is a Business Event Recorded

A voucher captures what happened, when it happened, who was involved, and for how much. That is it. Choose the right voucher type, and TallyPrime handles the accounting entries automatically.

Choose the wrong type, and TallyPrime will still accept it — but your reports will be silently wrong. This is why voucher type selection is the single most important decision in data entry.

👨‍💻 For Developers

A Voucher Is an Atomic Transaction Object

In TallyPrime's object model, a voucher is a Voucher object containing one or more LedgerEntry objects, one or more InventoryEntry objects, plus BillAllocation, CostCentreAllocation, and BatchAllocation sub-collections.

The voucher type is a first-class entity in Tally's storage — not a field on the voucher. This is why TDL can customize voucher types completely, and why XML must specify VCHTYPE explicitly.

🎯
Fun Fact: The word "voucher" comes from the Latin vocare — "to call." Originally, a voucher was a document that "called" someone to pay. In Tally, the meaning is broader: a voucher is a document that calls the accounting engine to record a business event. Same word, evolved meaning, same purpose — to prove something happened.

The 16 Voucher Types: Complete Deep Dive

TallyPrime ships with 16 standard voucher types. Each has a specific purpose, a function-key shortcut, and a defined accounting behavior. Let's dissect every one — with examples you can try today.

💰
F8

1. Sales Voucher

Record revenue from goods or services sold

The Sales voucher is the most-used voucher in any business. It records revenue and simultaneously reduces inventory. The party ledger is debited; sales and tax ledgers are credited.

📝 Journal Entry (Credit Sale with VAT)
Rahim Traders ................ Dr 57,500
    Sales A/c ............... Cr 50,000
    Output VAT @ 15% ........ Cr 7,500

Bangladesh Context: Every VAT-registered sale must generate a Mushak 6.3 challan. In TallyPrime, configure the Sales voucher type to print Mushak 6.3 by default. The voucher number becomes the challan number.

💡 Pro Tip: Create separate Sales voucher types for each tax rate — "Sales @ 5%", "Sales @ 15%", "Export Sales (Zero Rated)". This makes filing GSTR-1 and Mushak 6.3 automatic. The voucher type itself carries the tax configuration, so the accountant just picks the right type and Tally does the rest.
🛒
F9

2. Purchase Voucher

Record procurement of goods or services

The Purchase voucher mirrors the Sales voucher. Purchase ledger is debited; supplier is credited. If inventory integration is enabled, stock increases simultaneously.

📝 Journal Entry (Credit Purchase with VAT)
Purchase A/c .............. Dr 100,000
Input VAT @ 15% ........... Dr 15,000
    Karim Supplies .......... Cr 115,000
⚠️ Landed Cost Trap: Freight, insurance, and duty are NOT automatically part of the purchase cost. You must either (a) include them in the purchase invoice as "additional cost," or (b) pass a separate Journal to capitalize them. If you ignore this, your gross margin will be overstated.
📥
F6

3. Receipt Voucher

Money coming in from customers

Receipt vouchers record money received. The bank or cash ledger is debited; the customer ledger is credited. Use bill-wise tracking to link receipts to specific invoices.

📝 Journal Entry (Customer Pays by Bank Transfer)
SBI Bank ................... Dr 30,000
    Rahim Traders .......... Cr 30,000

Bill Allocation: INV-001 marked "Agst Ref" for ৳30,000
Remaining Outstanding: ৳27,500
💡 Pro Tip: Always use Bill-wise allocation in Receipt vouchers. Without it, you cannot identify which invoices are still outstanding. With it, TallyPrime's ageing report tells you exactly who owes you what, and for how long.
📤
F5

4. Payment Voucher

Money going out to suppliers or expenses

Payment vouchers record money paid. The expense or supplier ledger is debited; bank or cash is credited. Handles both supplier payments and expense payments.

📝 Journal Entry (Pay Supplier by Cheque)
Karim Supplies ........... Dr 50,000
    SBI Bank ............... Cr 50,000

Bill Allocation: PUR-001 marked "Agst Ref" for ৳50,000
Cheque No: 123456 · Bank Date: 30-Apr-2026
⚠️ Cheque Clearing Trap: When you issue a cheque, Tally records the payment immediately. But the bank has not cleared it yet. This creates a timing difference. Use Post-Dated Vouchers if the cheque is dated in the future, or reconcile against the bank statement (Alt+G → Bank Reconciliation).
🔄
F4

5. Contra Voucher

Cash ↔ Bank transfers only

Contra is a specialized voucher for cash-bank transfers only. It is the only voucher type where both sides of the entry involve cash/bank ledgers. It appears automatically in Bank Reconciliation reports.

📝 Journal Entry (Deposit Cash into Bank)
SBI Bank ................... Dr 100,000
    Cash .................... Cr 100,000
📝 Journal Entry (Withdraw Cash from Bank)
Cash ...................... Dr 50,000
    SBI Bank ............... Cr 50,000
🚨 #1 Beginner Mistake: Using a Journal voucher for cash-bank transfers. This WORKS for the ledger balance but does not appear in Bank Reconciliation. Your bank balance will be correct, but your reconciliation will be broken. ALWAYS use Contra for cash-bank transactions.
📔
F7

6. Journal Voucher

Adjustments, provisions, non-cash entries

Journal is the "catch-all" voucher for entries that are not Sales, Purchase, Receipt, Payment, or Contra. Depreciation, provisions, write-offs, adjustments, opening balances, and reversals all use Journal.

📝 Journal Entry (Depreciation for the Year)
Depreciation Expense ...... Dr 50,000
    Accumulated Depreciation Cr 50,000
📝 Journal Entry (Provision for Bad Debts)
Bad Debt Provision Expense Dr 20,000
    Provision for Doubtful Debts Cr 20,000
⚠️ Journal Vouchers Leave No Inventory Trail: If you use Journal for stock adjustments, TallyPrime will post the accounting entries but inventory will NOT move. Use Stock Journal or Manufacturing Journal instead.
📝
Ctrl+F9

7. Debit Note

Purchase return or rate revision

Debit Note is issued when you return goods to a supplier, or when you negotiate a rate reduction after invoicing. It reduces your payable and reverses the inventory and tax impact.

📝 Journal Entry (Return Damaged Goods to Supplier)
Karim Supplies ........... Dr 23,000
    Purchase Return ......... Cr 20,000
    Input VAT @ 15% ........ Cr 3,000
💡 Bangladesh Context: Debit Notes must use Mushak 12 format for VAT purposes. Configure the Debit Note voucher type to print Mushak 12 by default.
📄
Ctrl+F8

8. Credit Note

Sales return or customer discount

Credit Note is issued when a customer returns goods or when you grant a post-invoice discount. It reduces your receivable and reverses the tax.

📝 Journal Entry (Customer Returns Goods)
Sales Return .............. Dr 5,000
Output VAT @ 15% .......... Dr 750
    Rahim Traders ........... Cr 5,750
💡 Bangladesh Context: Credit Notes must use Mushak 12A format. Configure the Credit Note voucher type to print Mushak 12A by default.
🚚
Alt+F8

9. Delivery Note

Dispatch goods without invoice (yet)

When you dispatch goods before raising the invoice, use Delivery Note. It moves stock out of your godown into "Goods Out" — tracking goods that have left but have not yet been invoiced.

ℹ️ No Accounting Entry: Delivery Note is non-accounting. It does not post to ledgers. It only moves inventory. When you raise the Sales Invoice, the Delivery Note is referenced, and the accounting entries are created at that point.
📝 Stock Movement Only
Godown (Main) → Goods Out
10 bags Basmati Rice 5kg × ৳1,200 = ৳12,000
No ledger entry · No P&L effect · No VAT
📦
Alt+F9

10. Receipt Note

Receive goods without invoice (yet)

When goods arrive before the supplier's invoice, use Receipt Note. It moves stock into "Goods In" — tracking goods that have arrived but have not been billed yet.

ℹ️ No Accounting Entry: Receipt Note is non-accounting. It moves stock into a "Goods In" godown. When the Purchase Invoice arrives, the Receipt Note is referenced, and the accounting entries are created at that point.
↩️
Alt+F6

11. Rejection In

Customer rejects goods after invoice

When a customer rejects goods AFTER the invoice has been raised, use Rejection In. It reverses the sale, reverses the VAT, and brings stock back into your godown. Unlike a Credit Note, Rejection In is used specifically for goods coming back physically.

📝 Journal Entry (Customer Rejects Goods)
Sales Return .............. Dr 10,000
Output VAT @ 15% .......... Dr 1,500
    Rahim Traders ........... Cr 11,500

Stock: +10 bags back into Main Godown
↪️
Alt+F7

12. Rejection Out

You reject goods from a supplier

When you reject goods from a supplier AFTER the purchase invoice, use Rejection Out. It reverses the purchase, reverses the input VAT, and moves stock out of your godown back to the supplier.

📝 Journal Entry (You Reject Supplier's Goods)
Karim Supplies ........... Dr 11,500
    Purchase Return ........ Cr 10,000
    Input VAT @ 15% ........ Cr 1,500

Stock: -10 bags out of Main Godown
🔀
F10 / Alt+F10

13. Stock Journal

Internal stock movement between godowns

Stock Journal moves stock between godowns within the same company, or converts raw material to finished goods (in a simple setup). No accounting entry is created.

📝 Stock Movement (Dhaka → Chattogram)
Source Godown: Dhaka Main Warehouse
Destination Godown: Chattogram Branch Warehouse
Item: Basmati Rice 5kg · Qty: 50 bags
Rate: ৳1,200/bag · Value: ৳60,000
💡 Pro Tip: Use Manufacturing Journal (a configurable voucher type) for actual production — not Stock Journal. Manufacturing Journal handles BOM, additional costs, and by-products in a single transaction.
🧮
F10

14. Physical Stock

Reconcile book stock to physical count

Physical Stock records the actual inventory count at the end of a period. TallyPrime compares the physical count to the book balance and adjusts the difference.

📝 Physical Stock (End of April 2026)
Book Stock: 100 bags Basmati Rice
Physical Count: 98 bags
Difference: -2 bags (shortage)
Auto Journal: Stock Shortage Expense Dr ৳2,400
    Stock-in-Hand Cr ৳2,400
📋
Ctrl+F8 (configurable)

15. Sales Order

Customer order — pre-invoice

Sales Order records a customer's intent to buy. It does NOT create accounting entries or affect stock. It is purely operational — tracking pending orders until they convert to invoices.

⚠️ Order Vouchers Do Not Appear in Financial Reports: Sales Orders, Purchase Orders, Delivery Notes, and Receipt Notes are non-accounting. Developers integrating with Tally must remember: querying the Trial Balance will never return these vouchers. Query the voucher type collection instead.
📋
Ctrl+F9 (configurable)

16. Purchase Order

Order to supplier — pre-GRN

Purchase Order records your intent to buy. It tracks pending procurement until Receipt Note or Purchase Invoice is recorded. Like Sales Order, it is non-accounting.

🎁
Bonus Voucher Types You Can Create: TallyPrime lets you create custom voucher types from the base 16. Common additions: Manufacturing Journal (for production), Material In/Material Out (for job work), Excise Sales, Excise Purchase, Attendance, Payroll, and Memorandum vouchers (for non-accounting notes). Custom voucher types inherit behavior from a base type and can have their own numbering, printing, and defaults.

Voucher Classes: The Most Underrated Feature in Tally

If you only learn one thing from this part, learn this: Voucher Classes turn generic voucher types into industry-specific data-entry machines.

A Voucher Class is a pre-configured variant of a voucher type. When you create a Sales Invoice, instead of manually picking ledgers and tax rates every time, you select a Voucher Class and TallyPrime auto-fills the correct ledgers, tax rates, and defaults.

┌─────────────────────────────────────────────────────────┐
│         ONE VOUCHER TYPE → MANY VOUCHER CLASSES          │
│                                                          │
│  VOUCHER TYPE: Sales                                     │
│  ├── Voucher Class: Local Sales @ 15% VAT                │
│  │   ├── Default Sales Ledger: Sales (Local 15%)         │
│  │   ├── Default Tax Ledger: Output VAT @ 15%            │
│  │   └── Print Format: Mushak 6.3                        │
│  ├── Voucher Class: Local Sales @ 5% VAT                 │
│  │   ├── Default Sales Ledger: Sales (Local 5%)          │
│  │   ├── Default Tax Ledger: Output VAT @ 5%             │
│  │   └── Print Format: Mushak 6.3                        │
│  ├── Voucher Class: Export Sales (Zero Rated)            │
│  │   ├── Default Sales Ledger: Export Sales              │
│  │   ├── Default Tax Ledger: (None — Zero Rated)         │
│  │   └── Print Format: Commercial Invoice                │
│  └── Voucher Class: Retail Sales (Mushak 11A)            │
│      ├── Default Sales Ledger: Retail Sales              │
│      ├── Default Tax Ledger: Output VAT @ 15%            │
│      └── Print Format: Mushak 11A                        │
└─────────────────────────────────────────────────────────┘

Hands-On: Create a Voucher Class

1 Open the Voucher Type
Press Alt+G → Create Voucher Type. Or alter the existing "Sales" type: Alt+G → Alter Voucher Type → Sales.
2 Enable "Use Class"
In the voucher type screen, set "Use Class" to Yes. A new field appears: "Name of Class".
3 Name the Class
Enter Local Sales @ 15% VAT. Press Enter. TallyPrime now asks you to configure the class defaults.
4 Configure Default Ledgers
In the class configuration:
  • → Default Sales Ledger: Sales (Local 15%)
  • → Default Tax Ledger: Output VAT @ 15%
  • → Tax Rate: 15%
  • → Print Format: Mushak 6.3
5 Save and Test
Press Ctrl+A to save. Now when you create a Sales voucher, TallyPrime asks: "Which class?" Select Local Sales @ 15% VAT and the ledgers, tax rate, and print format are pre-selected. Data entry speed triples.
💡 The Voucher Class Superpower: In Bangladesh, VAT has multiple rates (5%, 7.5%, 12%, 15%). Create a Voucher Class for each rate under the same Sales voucher type. Now your data entry operator cannot accidentally apply the wrong rate — the class enforces it. Voucher Classes convert compliance from a hope into a guarantee.

Voucher Numbering: The Complete Reference

Voucher numbers are not decoration. In Bangladesh, they are the legal identifier printed on Mushak forms. In India, they are the GST invoice number. In every country, they are the audit trail. TallyPrime offers multiple numbering schemes.

📊 The Four Numbering Modes
1. Automatic — Tally assigns the next number sequentially. Cannot be overridden. INV-001, INV-002, INV-003...
2. Manual — User types the number. Must be unique within the FY. INV-2026-001, INV-2026-002...
3. Automatic (Override) — Tally suggests a number; user can override. Best of both worlds.
4. Multi-User — Multiple users can enter vouchers. Tally ensures no duplicate numbers.

Hands-On: Configure Sales Invoice Numbering

1 Open Voucher Type Alteration
Alt+G → Alter Voucher Type → Select Sales.
2 Set Method of Numbering
Set "Method of Numbering" to Automatic. Now TallyPrime will assign numbers automatically.
3 Configure Prefix
Set "Prefix" to DT-INV-2026-. Now every invoice is numbered DT-INV-2026-001, DT-INV-2026-002, ... The prefix makes the invoice number instantly identifiable.
4 Set Starting Number
Set "Starting Number" to 1. This is where TallyPrime begins numbering. Use this to continue from your previous system during migration.
5 Set Restart Numbering
Set "Restart Numbering" to Yes. Choose "Financial Year". This ensures numbering restarts every April 1.
6 Save
Press Ctrl+A. Your sales invoice numbering is now compliant and audit-ready.
⚠️ Bangladesh VAT Rule: Mushak 6.3 challan numbers must be sequential without gaps. If you delete an invoice, the number is "gapped." NBR auditors will flag this. Configure TallyPrime to prevent deletion of numbered invoices — use User Access Control to disable Delete permission for data-entry operators.

Voucher Type Configuration: 20 Settings That Matter

SettingWhat It DoesWhen to Enable
Use ClassEnable Voucher Classes for this typeAlways, for production use
Method of NumberingAutomatic / Manual / Multi-UserAutomatic for compliance
Prevent Duplicate NumbersBlocks duplicate voucher numbersAlways
Restart NumberingResets counter periodicallyFinancial Year for compliance
Use Effective DatesActivates the voucher type only for a date rangeFor seasonal voucher types
Allow Zero-Valued TransactionsPermits ₹0 or ৳0 vouchersFor sample or free goods tracking
Warn on Negative StockAlerts when stock goes negativeAlways, for trading businesses
Warn on Negative Cash/BankAlerts on overdraftAlways
Track Additional CostTrack landed cost in purchaseFor trading and manufacturing
Print After SaveAuto-print on voucher saveFor POS-style counter sales
Default Print FormatMushak 6.3 / Mushak 11A / CommercialBased on voucher type
Set/ Alter NarrationDefault narration templateTo save data-entry time
Default Voucher ClassWhich class to auto-selectIf you use one class 90% of the time
Enable GST/VATTax tracking on voucherAlways for tax-registered
Use Batch-wise DetailsTrack stock by batchPharma, FMCG, chemicals
Use Cost CentreEnable cost allocationFor departmental accounting
Use Bill-wise DetailsTrack credit by billAlways for Sales/Purchase
Use Multiple GodownAllow godown selection per lineFor multi-warehouse operations
Use Rejection / ReturnsLink to original invoiceFor Credit/Debit Note types
Track Delivery/Receipt NoteLink dispatch to sales/purchaseFor structured supply chains

Voucher in Code: TDL and XML for Developers

🧑‍💼 For Accountants

Why You Should Care About Code

Even if you never write code, understanding that every voucher is stored as a structured object helps you reason about Tally's behavior. When you press F8, you are populating a data structure that the engine validates and stores.

This is why some errors ("voucher does not balance") are so cryptic — they are data-structure violations, not user-interface issues.

👨‍💻 For Developers

The Voucher Object Model

Every voucher in Tally's storage is represented as an object with sub-collections. The XML interface exposes this directly. When integrating, you must generate XML that respects the invariant SUM(LedgerEntries.Amount) = 0.

The ISDEEMEDPOSITIVE flag determines whether an amount's sign is natural or against the ledger's nature.

TDL: A Custom Voucher Type

This TDL creates a new voucher type called "Mushak 6.3 Sales" that inherits from Sales and auto-prints Mushak 6.3:

;; Mushak63Sales.tdl — Custom Voucher Type for Bangladesh VAT

[VoucherType: Mushak 6.3 Sales]
    Parent: Sales
    PrintVoucherType: Mushak 6.3
    NumberingMethod: Automatic
    Prefix: "MUSHAK-6.3-"
    RestartNumbering: Financial Year

;; Auto-populate the VAT ledger on every voucher
[VoucherType: Mushak 6.3 Sales]
    UseDefaultVoucherClass: Yes
    DefaultVoucherClass: Local Sales @ 15% VAT

;; Force narration to include VAT registration number
[VoucherType: Mushak 6.3 Sales]
    DefaultNarration: "VAT BIN: 0001234567"

XML: Creating a Full Sales Voucher

Here is a complete XML payload to create a Sales Voucher in TallyPrime via the HTTP interface on port 9000:

<ENVELOPE>
  <HEADER>
    <TALLYREQUEST>Import Data</TALLYREQUEST>
  </HEADER>
  <BODY>
    <IMPORTDATA>
      <REQUESTDESC>
        <REPORTNAME>Vouchers</REPORTNAME>
        <STATICVARIABLES>
          <SVCURRENTCOMPANY>Dhaka Traders Ltd.</SVCURRENTCOMPANY>
          <SVFROMDATE>20260401</SVFROMDATE>
          <SVTODATE>20260430</SVTODATE>
        </STATICVARIABLES>
      </REQUESTDESC>
      <REQUESTDATA>
        <TALLYMESSAGE>
          <VOUCHER VCHTYPE="Mushak 6.3 Sales" ACTION="Create">
            <DATE>20260415</DATE>
            <VOUCHERTYPENAME>Mushak 6.3 Sales</VOUCHERTYPENAME>
            <VOUCHERNUMBER>MUSHAK-6.3-0001</VOUCHERNUMBER>
            <REFERENCE>ERP-ORD-98765</REFERENCE>
            <NARRATION>Sold to Rahim Traders via ERP sync</NARRATION>
            <PARTYLEDGERNAME>Rahim Traders</PARTYLEDGERNAME>

            <!-- DEBIT: Party Ledger +13,800 -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>Rahim Traders</LEDGERNAME>
              <ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
              <AMOUNT>13800.00</AMOUNT>
              <BILLALLOCATIONS.LIST>
                <NAME>MUSHAK-6.3-0001</NAME>
                <BILLTYPE>New Ref</BILLTYPE>
                <AMOUNT>13800.00</AMOUNT>
              </BILLALLOCATIONS.LIST>
            </ALLLEDGERENTRIES.LIST>

            <!-- CREDIT: Sales Ledger -12,000 -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>Sales A/c</LEDGERNAME>
              <ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
              <AMOUNT>-12000.00</AMOUNT>
            </ALLLEDGERENTRIES.LIST>

            <!-- CREDIT: VAT Ledger -1,800 -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>Output VAT @ 15%</LEDGERNAME>
              <ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
              <AMOUNT>-1800.00</AMOUNT>
            </ALLLEDGERENTRIES.LIST>

            <!-- INVENTORY: 10 bags @ 1,200 -->
            <ALLINVENTORYENTRIES.LIST>
              <STOCKITEMNAME>Basmati Rice 5kg</STOCKITEMNAME>
              <ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
              <RATE>1200.00/Bag</RATE>
              <AMOUNT>-12000.00</AMOUNT>
              <ACTUALQTY>10 Bag</ACTUALQTY>
              <BILLEDQTY>10 Bag</BILLEDQTY>
              <BATCHALLOCATIONS.LIST>
                <GODOWNNAME>Dhaka Main Warehouse</GODOWNNAME>
                <BATCHNAME>Primary Batch</BATCHNAME>
                <ACTUALQTY>10 Bag</ACTUALQTY>
                <AMOUNT>-12000.00</AMOUNT>
              </BATCHALLOCATIONS.LIST>
            </ALLINVENTORYENTRIES.LIST>

          </VOUCHER>
        </TALLYMESSAGE>
      </REQUESTDATA>
    </IMPORTDATA>
  </BODY>
</ENVELOPE>
💻 Three Non-Negotiable Rules for XML Voucher Integration:
1. SUM(AMOUNT) must equal zero. Party debit (+13,800) + Sales credit (-12,000) + VAT credit (-1,800) = 0.
2. VCHTYPE must match an existing voucher type. "Sales" is different from "Mushak 6.3 Sales." Create the custom type via TDL first.
3. REFERENCE is your idempotency key. Use a unique ERP-generated ID. Query Tally for existing vouchers with that reference before pushing.

20 Real-World Voucher Scenarios (Bangladesh Focus)

1️⃣ Cash Sale at Retail Counter (Mushak 11A)

Context: A Dhaka electronics showroom sells a ৳25,000 LED TV for cash.

Voucher Type: Sales (Mushak 11A Retail)

Entry: Cash Dr 28,750 · Sales Cr 25,000 · Output VAT @ 15% Cr 3,750.

Print: Mushak 11A (Retail Invoice) — must include BIN, item details, and VAT breakdown.

2️⃣ Wholesale Credit Sale (Mushak 6.3)

Context: An FMCG distributor in Chattogram sells 500 cartons to a dealer on 45-day credit.

Voucher Type: Sales (Mushak 6.3)

Entry: Dealer Dr · Sales Cr · Output VAT @ 15% Cr.

Bill Allocation: New Ref created with the Mushak 6.3 challan number.

3️⃣ Import Purchase with LC

Context: A Gazipur RMG factory imports fabric from China via Letter of Credit.

Voucher Type: Purchase (Import)

Complications: LC margin, bank charges, freight, insurance, and customs duty must all be tracked. Create a Voucher Class "Import Purchase" with default ledgers for LC Margin, Freight Inward, and Customs Duty.

4️⃣ Receipt with TDS Deduction

Context: A consulting firm in Dhaka receives ৳100,000 from a client but the client deducts ৳10,000 TDS.

Voucher Type: Receipt

Entry: Bank Dr 90,000 · TDS Receivable Dr 10,000 · Client Cr 100,000.

Bill Allocation: Two allocations — ৳90,000 "Agst Ref" (bank), ৳10,000 "Agst Ref" (TDS).

5️⃣ Contra: ATM Cash Withdrawal

Context: A trader withdraws ৳30,000 from an ATM.

Voucher Type: Contra

Entry: Cash Dr 30,000 · Bank Cr 30,000.

Pitfall: The bank charges ৳20 for the transaction. This is a separate Payment voucher: Bank Charges Dr 20 · Bank Cr 20.

6️⃣ Journal: Depreciation with Accumulated Contra-Account

Context: A Tongi factory depreciates machinery by ৳1,50,000 at year-end.

Voucher Type: Journal

Entry: Depreciation Expense Dr 1,50,000 · Accumulated Depreciation Cr 1,50,000.

Tip: Never reduce the Fixed Asset ledger directly. Accumulated Depreciation is a contra-asset that shows on the Balance Sheet as a deduction.

7️⃣ Debit Note for Purchase Return (Mushak 12)

Context: A pharma company returns ৳80,000 of non-compliant raw material to a supplier.

Voucher Type: Debit Note (Mushak 12)

Entry: Supplier Dr 92,000 · Purchase Return Cr 80,000 · Input VAT Cr 12,000.

Print: Mushak 12 format as required by NBR.

8️⃣ Credit Note for Customer Discount

Context: A Dhaka distributor grants a post-invoice 2% volume discount to a key dealer.

Voucher Type: Credit Note (Mushak 12A)

Entry: Sales Discount Dr · Dealer Cr.

Tip: If the dealer is also a supplier, use a single ledger with bill-wise tracking, or create separate ledgers.

9️⃣ Delivery Note → Sales Invoice Conversion

Context: A Gazipur RMG factory dispatches 5,000 T-shirts to a buyer on 15-Apr. The invoice is raised on 20-Apr after buyer confirmation.

Step 1: Delivery Note on 15-Apr — stock moves to "Goods Out." No accounting entry.

Step 2: Sales Invoice on 20-Apr — reference the Delivery Note. Accounting entries and stock reduction occur at this point.

Benefit: Accurate dispatch tracking without double-counting stock.

🔟 Rejection Out with Batch Reversal

Context: A pharma company rejects a supplier's batch of raw material after QC failure.

Voucher Type: Rejection Out

Entry: Supplier Dr · Purchase Return Cr · Input VAT Cr. Stock moves out of the QC-Pending godown.

Batch: Auto-reverse the specific batch via batch allocation.

1️⃣1️⃣ Stock Journal — Inter-Branch Transfer

Context: A Dhaka distributor transfers 200 units from Central Warehouse to Uttara Branch Warehouse.

Voucher Type: Stock Journal

Entry: Uttara Godown Dr (200 units) · Central Godown Cr (200 units).

No accounting effect. Valuation remains unchanged because it is the same company.

1️⃣2️⃣ Manufacturing Journal — Production with By-Product

Context: A Gazipur food processor consumes 500 kg wheat (৳40,000), 100 kg sugar (৳10,000), and ৳5,000 labour to produce 400 kg biscuits + 20 kg scrap.

Voucher Type: Manufacturing Journal

Entry: Finished Goods (Biscuits) Dr 53,000 · By-Product (Scrap) Dr 2,000 · Raw Material Consumed Cr 50,000 · Labour Applied Cr 5,000.

1️⃣3️⃣ Physical Stock Adjustment

Context: A Chattogram trader counts stock at month-end. Book says 500 bags; physical is 495 bags.

Voucher Type: Physical Stock

Entry: Stock Shortage Dr (5 bags × cost) · Stock-in-Hand Cr (adjustment).

Automatically creates the adjustment Journal, but the physical count drives the entry.

1️⃣4️⃣ Sales Order → Delivery Note → Invoice (Full Cycle)

Context: A Dhaka distributor's dealer places a ৳5,00,000 order on 1-Apr.

Day 1: Sales Order (non-accounting).

Day 5: Delivery Note — goods dispatched (stock moves).

Day 10: Sales Invoice — accounting and stock reduction finalized, Mushak 6.3 generated.

Result: Complete order-to-cash traceability with zero manual intervention.

1️⃣5️⃣ The Purchase Return That Broke Stock

Problem: An accountant used a Journal voucher to record a purchase return. The payable reduced correctly, but stock stayed elevated. Physical stock did not match book stock.

Fix: Reverse the Journal and re-enter as a Debit Note. Stock now correctly reduces, and Input VAT reverses automatically.

Lesson: Never use Journal for inventory-affecting returns. Always use Debit Note / Credit Note.

1️⃣6️⃣ The Contra That Never Reconciled

Problem: An accountant used Journal instead of Contra for a cash-to-bank deposit. The bank balance was correct, but Bank Reconciliation did not show the transaction.

Fix: Delete the Journal, re-enter as Contra. Bank Reconciliation now shows the deposit.

Lesson: Only Contra vouchers appear in Bank Reconciliation reports.

1️⃣7️⃣ Multi-Currency Export Invoice

Context: An RMG factory invoices a US buyer for $50,000 at ৳110/USD.

Voucher Type: Sales (Export) with multi-currency enabled.

Entry: Buyer (USD) Dr $50,000 · Export Sales Cr $50,000.

Functional Value: TallyPrime auto-converts to ৳55,00,000 for bookkeeping.

1️⃣8️⃣ Job Work Material Out and In

Context: A Narayanganj textile mill sends 1,000 kg grey fabric to a dyeing subcontractor.

Step 1: Material Out (Job Work) — stock moves to "Job Worker Godown." No accounting entry.

Step 2: Material In (Job Work) — dyed fabric returns. Stock moves back. Subcontractor charges recorded separately in a Purchase Invoice.

1️⃣9️⃣ Memorandum Voucher for Internal Notes

Context: A CFO wants to record a "pending board approval" for a future acquisition without affecting books.

Voucher Type: Memorandum

Effect: No accounting, no P&L, no Balance Sheet. Purely an internal note that appears in the Day Book with the "Memorandum" tag.

2️⃣0️⃣ Post-Dated Cheque for Scheduled Payment

Context: A Dhaka trading house issues a cheque dated 30-Jun-2026 for a supplier payment, but issues it on 15-May-2026.

Voucher Type: Payment with "Post-Dated" enabled.

Effect: Voucher is recorded but does not affect current bank balance until 30-Jun. On 30-Jun, TallyPrime automatically activates it.

Voucher Architecture: Do's and Don'ts

DO
  • Use the correct voucher type — Contra for cash-bank, Sales for revenue, Purchase for procurement
  • Create Voucher Classes for every tax rate you handle
  • Enable bill-wise tracking on every Sales and Purchase voucher
  • Set Numbering Method = Automatic for compliance-critical types (Sales, Mushak)
  • Configure print formats per voucher type (Mushak 6.3, Mushak 12A, etc.)
  • Enable Audit Trail to log every voucher alteration
  • Use Post-Dated Vouchers for scheduled future payments
  • Add narrations to every Journal voucher
  • Reference original invoices in Debit/Credit Notes
  • Back up before any bulk voucher import
DON'T
  • Never use Journal for cash-bank — use Contra
  • Never use Journal for inventory movements — use Stock Journal or Debit/Credit Note
  • Never use Sales voucher for a purchase return — use Debit Note
  • Never delete numbered vouchers — alter them or reverse them
  • Never skip bill-wise tracking on credit sales
  • Never allow duplicate voucher numbers
  • Never mix order vouchers with accounting vouchers in reports
  • Never send XML vouchers without validating SUM = 0
  • Never let Suspense remain on a Journal after a period close
  • Never overwrite a Mushak 6.3 challan number with a new one

30 Pro Tips for Voucher Mastery

1 Learn Every Function Key
F4 = Contra · F5 = Payment · F6 = Receipt · F7 = Journal · F8 = Sales · F9 = Purchase · F10 = Stock Journal · Alt+F6 = Rejection In · Alt+F7 = Rejection Out · Alt+F8 = Delivery Note · Alt+F9 = Receipt Note.
2 Ctrl+H Changes Voucher Type
Accidentally started Sales when you wanted Purchase? Ctrl+H changes the voucher type without losing entered data.
3 Alt+C Inside Voucher = Add Ledger
In a voucher, after entering the party ledger, press Alt+C to add an additional ledger entry (like tax, freight, discount).
4 F12 = Configure Voucher Screen
Press F12 inside any voucher to toggle settings: Show GST details, Show Godown, Show Cost Centre, Show Batch details.
5 Alt+F2 = Change Voucher Date
Quick way to backdate a voucher. Use sparingly — backdated entries without justification are an audit red flag.
6 Ctrl+A Saves, Ctrl+Enter Also Saves
Ctrl+A is universal. Ctrl+Enter works in some screens. Get in the habit of Ctrl+A.
7 Batch Entry for High-Volume Counters
In Sales voucher type config, enable Batch Entry. Multiple invoices are entered in one screen, drastically speeding up retail operations.
8 Use Voucher Class Defaults
Every Sales voucher with tax should be a Voucher Class. Set the default sales ledger, tax ledger, and print format once, then enjoy 3x faster entry forever.
9 Reference Field = Idempotency Key
For ERP integrations, use the REFERENCE field to store your ERP voucher ID. Before pushing, query Tally for existing vouchers with that reference.
10 Enable "Warn on Negative Stock"
F11 → Inventory Features → Warn on Negative Stock = Yes. TallyPrime blocks or warns you before overselling.
11 Use "Prevent Duplicate Numbers"
In Voucher Type config, enable "Prevent Duplicate Numbers" = Yes. This ensures no two invoices share a number.
12 Configure Mushak Print Formats
For Bangladesh: set Sales → Mushak 6.3; Retail Sales → Mushak 11A; Debit Note → Mushak 12; Credit Note → Mushak 12A.
13 Use Rejection In/Out, Not Returns
For goods physically coming back, use Rejection In/Out — not Credit Note or Debit Note. The distinction matters because Rejection vouchers link to original invoices for reconciliation.
14 Reference Delivery Note in Sales Invoice
If you use Delivery Notes, always reference them in the Sales Invoice. TallyPrime then reconciles dispatch and invoice quantities automatically.
15 Set Order Voucher Expiry
In Sales Order/Purchase Order config, set "Provide Order Validity Period" = 30/60/90 days. Expired orders appear in a specific report.
16 Use "Set/Alter Narration" for Defaults
In Voucher Type config, set a default narration template. Every new voucher auto-fills it — the user can override.
17 Enable "Audit Trail"
F11 → Accounting Features → Use Audit Trail = Yes. Every change to every voucher is logged with user and timestamp. Non-negotiable for compliance.
18 Master the Alt+Shortcuts
Alt+A = Add Ledger · Alt+C = Add Column/New Ledger · Alt+D = Delete Line · Alt+I = Insert Line · Alt+N = Change Narration · Alt+V = Vault (Bank Details).
19 Use Multi-Currency Only If You Need It
Enable multi-currency in F11 Features only if you have export/import transactions. Enabling it unnecessarily complicates every voucher.
20 Use Optional Vouchers for Approvals
A voucher type can be configured as Optional — it does not affect books until "Regularized." Use this for a maker-checker workflow.
21 Don't Over-Rely on Post-Dated Vouchers
Post-dated vouchers are useful for scheduled payments, but they delay accounting recognition. Use only when the business logic truly warrants it.
22 Use Batch Allocation for Inventory Traceability
In pharma, FMCG, and food, enable batch tracking. Every sales/purchase voucher records the batch number. Essential for recalls and expiry management.
23 Cost Centre Allocation at Voucher Level
For departmental accounting, allocate each voucher line to a cost centre. Enables departmental P&L without separate vouchers.
24 Use "Provide Aliases" for Speed
In ledger masters, set aliases like "RT" for "Rahim Traders." In voucher entry, type "RT" and Tally finds the ledger instantly.
25 Ctrl+K for Company Features Inside Voucher
Some configurations can be changed from within a voucher using Ctrl+K. Useful for real-time adjustments without leaving the voucher screen.
26 For Developers: Handle Voucher Rejection
TallyPrime returns per-message status. Parse LINEERROR blocks from the response XML and log the rejected voucher payload. Retry after fixing.
27 For Developers: Batch Voucher Imports
Never send one HTTP request per voucher. Batch 50-100 TALLYMESSAGE blocks per request. Throughput rises from 2/sec to 50+/sec.
28 For Developers: Set Long Timeouts
TallyPrime processes XML requests sequentially. For bulk imports, set HTTP timeout to 5+ minutes. Default 30-second timeouts will fail.
29 For Developers: UTF-8 Without BOM
TallyPrime expects UTF-8 XML without a byte order mark. Some editors add BOM by default and cause cryptic errors. Always save as "UTF-8 without BOM."
30 For Everyone: Document Your Voucher Types
Maintain a one-page reference list: voucher type name, purpose, default ledgers, print format, who uses it. New employees will thank you. Auditors will love you.

Explore the Full 45-Part Masterclass

This is Part 7 of a 45-part series. The full masterclass covers everything from first ledger to CFO dashboards, ERP integration, TDL development, Power BI, and AI. Navigate to any part from the master page.

🚀 Go to Job Interview Portal — Start Your Preparation Now JOIN FREE

Post a Comment

0 Comments