Skill flagged — suspicious patterns detected

ClawHub Security flagged this skill as suspicious. Review the scan results before using.

Tally Skill

v0.1.0

Interact with TallyPrime running locally to read reports and post accounting entries.

0· 90·0 current·0 all-time

Install

OpenClaw Prompt Flow

Install with OpenClaw

Best for remote or guided setup. Copy the exact prompt, then paste it into OpenClaw for abhi152003/tally-skill.

Previewing Install & Setup.
Prompt PreviewInstall & Setup
Install the skill "Tally Skill" (abhi152003/tally-skill) from ClawHub.
Skill page: https://clawhub.ai/abhi152003/tally-skill
Keep the work scoped to this skill only.
After install, inspect the skill metadata and help me finish setup.
Use only the metadata you can verify from ClawHub; do not invent missing requirements.
Ask before making any broader environment changes.

Command Line

CLI Commands

Use the direct CLI path if you want to install manually and keep every step visible.

OpenClaw CLI

Bare skill slug

openclaw skills install tally-skill

ClawHub CLI

Package manager switcher

npx clawhub@latest install tally-skill
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Suspicious
medium confidence
Purpose & Capability
The skill's name and description (interact with local TallyPrime) align with the runtime instructions: SKILL.md details HTTP POST/XML calls to $TALLY_URL and ledger/voucher operations. However, registry metadata presented earlier stated no required env vars or binaries, while the SKILL.md explicitly declares required env TALLY_URL, primaryCredential TALLY_URL, and lists curl under bins. That metadata mismatch is unexplained and reduces confidence in provenance.
Instruction Scope
The SKILL.md stays within the stated purpose: it shows exact curl calls, how to check server status, check/create ledgers, and post vouchers. It does assume the agent (or surrounding system) can collect invoice data (vision / WhatsApp ingestion) — that is an external responsibility but not inconsistent. The instructions do not ask to read unrelated system files or other env vars. One operational risk: $TALLY_URL is user-configurable and could point to a non-local endpoint, which would cause the skill to send accounting data off-host; SKILL.md notes Tally is local but does not enforce locality.
Install Mechanism
This is an instruction-only skill with no install spec and no code files, which minimizes supply-chain risk. The SKILL.md does reference curl as the command-line tool to use; no downloads or package installs are present.
!
Credentials
The only runtime parameter the skill needs is TALLY_URL, which is appropriate for a service that posts to Tally. But: (1) the registry metadata contradicts the SKILL.md about required env vars/binaries, (2) TALLY_URL can be set to any URL — if misconfigured (or maliciously set) it could transmit sensitive accounting data to a remote endpoint, and (3) there are no other protections described (no host restriction validation). The skill does not request direct secrets, which is appropriate, but the primary credential being a URL is sensitive because it defines where data is sent.
Persistence & Privilege
The skill is not always-enabled and does not request elevated platform privileges. It allows autonomous invocation (disable-model-invocation=false), which is platform default; combined with write capability to Tally this increases blast radius but is an expected feature for an automation skill. There is no instruction to modify other skills or global agent settings.
Scan Findings in Context
[none_detected] expected: The repository had no code files for the regex scanner to analyze; SKILL.md is instruction-only. Absence of findings is not evidence of safety — the runtime instructions are the security surface.
What to consider before installing
Before installing or enabling this skill: 1) Verify the skill's source and trust the publisher — there is no homepage or code repository listed. 2) Confirm TALLY_URL will point to a local, trusted TallyPrime instance (default localhost:9000). If TALLY_URL points to a remote host, the skill will send accounting data there. 3) Check the registry metadata mismatch: SKILL.md requires TALLY_URL and curl but the registry entry earlier claimed none; ask the publisher to reconcile metadata. 4) Because the skill can create ledgers and post vouchers, test it in a non-production/company copy first and require explicit user confirmation before making writes. 5) Ensure your agent's vision/ingestion pipeline (WhatsApp/PDF extraction) is configured and trusted, because the skill assumes the agent will extract invoice fields automatically. 6) If you need higher assurance, request the skill's source or a signed provenance artifact so you can inspect the exact commands it will run.

Like a lobster shell, security has layers — review code before you run it.

latestvk97fjk11rjvp842ehznzymj9h5841e0y
90downloads
0stars
1versions
Updated 3w ago
v0.1.0
MIT-0

TallyPrime Skill

Connect to a locally running TallyPrime instance and perform read/write operations via its XML-over-HTTP API. All requests are HTTP POST to $TALLY_URL (default: http://localhost:9000) with XML body.

TallyPrime must be open and running on the user's machine. There is no cloud API — all communication is local.

Company name: CAs manage multiple companies. Always get the company name from the user — either they'll mention it in their message, or ask them before proceeding. Never assume.


Hero Use Case: WhatsApp Invoice → Tally Entry (Zero Manual Entry)

The problem for CAs: You manage 10+ businesses. A client sends a purchase bill PDF on WhatsApp. You have to open Tally, find the right company, check if the vendor ledger exists, create it if not, then manually type every field. This takes 5–10 minutes per invoice.

With this skill: Client sends the PDF to your OpenClaw WhatsApp number. The agent reads the invoice, extracts all fields, checks/creates the vendor ledger, and posts the purchase voucher — in under 30 seconds.

Step-by-step Flow

1. Receive PDF/image of purchase invoice via WhatsApp
2. Extract invoice fields using vision (vendor name, GSTIN, date, line items, amounts, tax)
3. Switch to the correct Tally company (ask user if unclear)
4. Check if vendor ledger exists → create it if not (under Sundry Creditors)
5. Check if expense/purchase ledger exists → create if not
6. Check if GST ledger exists → create if not
7. Post Purchase voucher with all ledger entries
8. Confirm back to user with voucher number and summary

When to Use This Skill

  • User sends a purchase invoice, bill, or receipt (PDF or image) and wants it entered in Tally
  • User asks to create a sales invoice / purchase bill / payment / receipt in Tally
  • User wants to check outstanding receivables or payables
  • User asks for a ledger statement, day book, or trial balance
  • User wants to know their GST liability for a period
  • User asks "what did we buy from X vendor last month?"
  • User wants to add a new ledger or group in Tally
  • User wants to check if Tally is running / connected
  • User mentions "book this entry", "add to Tally", "post this bill"
  • User wants to reconcile vendor invoices against Tally entries

⚠️ Critical Rules (Read Before Any Operation)

  1. Never guess ledger names. Always check if a ledger exists before using it in a voucher. If it doesn't exist, create it first.
  2. Never assume the company name. If the user mentions it (e.g., "for Reliance Industries" or "in ABC Traders"), use that exact name. If they don't mention it, ask: "Which company should I post this to?" before proceeding.
  3. Date format is YYYYMMDD — no dashes or slashes. March 2, 2026 → 20260302.
  4. Always include a unique GUID when creating vouchers to prevent duplicates on retry.
  5. Amount sign convention:
    • Party/vendor entry: AMOUNT is negative (e.g., -50000), ISDEEMEDPOSITIVE = No for creditors
    • Expense/purchase entry: AMOUNT is positive (e.g., 50000), ISDEEMEDPOSITIVE = No
    • See the voucher section for exact signs per voucher type.
  6. "Voucher date is missing" error = date is outside the company's configured financial year. Ask user to check Tally's company period settings.
  7. "Ledger X does not exist" error = create the ledger first, then retry the voucher.
  8. For multi-company CAs: Always confirm which company the entry belongs to before posting.

Step 0: Check Server Status

Always verify Tally is running before any operation.

curl -s --max-time 5 "$TALLY_URL"

Expected response:

<RESPONSE>TallyPrime Server is Running</RESPONSE>

If connection is refused or times out, tell the user: "TallyPrime doesn't seem to be running. Please open TallyPrime on your computer and try again."


Step 1: Check If a Ledger Exists

Before creating any voucher, verify all referenced ledgers exist.

curl -s -X POST "$TALLY_URL" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0" encoding="utf-8"?>
<ENVELOPE>
  <HEADER><TALLYREQUEST>Export Data</TALLYREQUEST></HEADER>
  <BODY>
    <EXPORTDATA>
      <REQUESTDESC>
        <REPORTNAME>List of Accounts</REPORTNAME>
        <STATICVARIABLES>
          <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>
          <SVCURRENTCOMPANY>COMPANY_NAME</SVCURRENTCOMPANY>
        </STATICVARIABLES>
      </REQUESTDESC>
    </EXPORTDATA>
  </BODY>
</ENVELOPE>'

Parse the XML response and grep for <NAME>LEDGER_NAME</NAME> to confirm existence.


Step 2: Create a Ledger (if missing)

Use REPORTNAME=All Masters for all master creation.

curl -s -X POST "$TALLY_URL" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0" encoding="utf-8"?>
<ENVELOPE>
  <HEADER><TALLYREQUEST>Import Data</TALLYREQUEST></HEADER>
  <BODY>
    <IMPORTDATA>
      <REQUESTDESC>
        <REPORTNAME>All Masters</REPORTNAME>
        <STATICVARIABLES>
          <SVCURRENTCOMPANY>COMPANY_NAME</SVCURRENTCOMPANY>
        </STATICVARIABLES>
      </REQUESTDESC>
      <REQUESTDATA>
        <TALLYMESSAGE xmlns:UDF="TallyUDF">
          <LEDGER NAME="LEDGER_NAME" ACTION="Create">
            <NAME>LEDGER_NAME</NAME>
            <PARENT>PARENT_GROUP</PARENT>
            <ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
          </LEDGER>
        </TALLYMESSAGE>
      </REQUESTDATA>
    </IMPORTDATA>
  </BODY>
</ENVELOPE>'

Ledger Group Reference

Ledger TypeParent GroupISDEEMEDPOSITIVE
Customer (debtor)Sundry DebtorsYes
Vendor (creditor)Sundry CreditorsNo
Sales incomeSales AccountsNo
Purchase expensePurchase AccountsNo
Bank accountBank AccountsYes
CashCash-in-HandYes
GST Output (sales tax)Duties & TaxesNo
GST Input (purchase tax)Duties & TaxesYes
Other expenseIndirect ExpensesNo
Direct cost/COGSDirect ExpensesNo

Success response:

<RESPONSE><CREATED>1</CREATED><ERRORS>0</ERRORS></RESPONSE>

Step 3: Create Vouchers

Use REPORTNAME=Vouchers for all voucher creation.

3a. Purchase Voucher (Vendor Bill)

Use when: A vendor sends a bill/invoice for goods or services purchased.

Accounting entry:

  • Debit: Purchase / Expense ledger (cost increases)
  • Debit: GST Input Credit ledger (if GST applicable)
  • Credit: Vendor ledger (liability increases)
curl -s -X POST "$TALLY_URL" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0" encoding="utf-8"?>
<ENVELOPE>
  <HEADER><TALLYREQUEST>Import Data</TALLYREQUEST></HEADER>
  <BODY>
    <IMPORTDATA>
      <REQUESTDESC>
        <REPORTNAME>Vouchers</REPORTNAME>
        <STATICVARIABLES>
          <SVCURRENTCOMPANY>COMPANY_NAME</SVCURRENTCOMPANY>
        </STATICVARIABLES>
      </REQUESTDESC>
      <REQUESTDATA>
        <TALLYMESSAGE xmlns:UDF="TallyUDF">
          <VOUCHER VCHTYPE="Purchase" ACTION="Create">
            <GUID>UNIQUE_GUID_HERE</GUID>
            <DATE>YYYYMMDD</DATE>
            <VOUCHERTYPENAME>Purchase</VOUCHERTYPENAME>
            <VOUCHERNUMBER>INVOICE_NUMBER</VOUCHERNUMBER>
            <NARRATION>Purchase from VENDOR_NAME | Invoice: INVOICE_NUMBER</NARRATION>
            <ISINVOICE>Yes</ISINVOICE>
            <PARTYLEDGERNAME>VENDOR_LEDGER_NAME</PARTYLEDGERNAME>

            <!-- Debit: Purchase/Expense account -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>PURCHASE_LEDGER_NAME</LEDGERNAME>
              <ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
              <AMOUNT>-BASE_AMOUNT</AMOUNT>
            </ALLLEDGERENTRIES.LIST>

            <!-- Debit: GST Input (if applicable, 18% example) -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>GST Input Credit</LEDGERNAME>
              <ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
              <AMOUNT>-GST_AMOUNT</AMOUNT>
            </ALLLEDGERENTRIES.LIST>

            <!-- Credit: Vendor (payable) -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>VENDOR_LEDGER_NAME</LEDGERNAME>
              <ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
              <AMOUNT>TOTAL_AMOUNT</AMOUNT>
            </ALLLEDGERENTRIES.LIST>
          </VOUCHER>
        </TALLYMESSAGE>
      </REQUESTDATA>
    </IMPORTDATA>
  </BODY>
</ENVELOPE>'

Amount signs for Purchase voucher:

  • Purchase/expense: AMOUNT = -(base amount) → e.g., -42373
  • GST Input: AMOUNT = -(gst amount) → e.g., -7627
  • Vendor (credit): AMOUNT = +(total invoice amount) → e.g., 50000
  • All amounts must balance to zero.

3b. Sales Voucher (Customer Invoice)

Use when: Business raises an invoice to a customer for goods/services sold.

curl -s -X POST "$TALLY_URL" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0" encoding="utf-8"?>
<ENVELOPE>
  <HEADER><TALLYREQUEST>Import Data</TALLYREQUEST></HEADER>
  <BODY>
    <IMPORTDATA>
      <REQUESTDESC>
        <REPORTNAME>Vouchers</REPORTNAME>
        <STATICVARIABLES>
          <SVCURRENTCOMPANY>COMPANY_NAME</SVCURRENTCOMPANY>
        </STATICVARIABLES>
      </REQUESTDESC>
      <REQUESTDATA>
        <TALLYMESSAGE xmlns:UDF="TallyUDF">
          <VOUCHER VCHTYPE="Sales" ACTION="Create">
            <GUID>UNIQUE_GUID_HERE</GUID>
            <DATE>YYYYMMDD</DATE>
            <VOUCHERTYPENAME>Sales</VOUCHERTYPENAME>
            <VOUCHERNUMBER>INVOICE_NUMBER</VOUCHERNUMBER>
            <NARRATION>Sales invoice to CUSTOMER_NAME</NARRATION>
            <ISINVOICE>Yes</ISINVOICE>
            <PARTYLEDGERNAME>CUSTOMER_LEDGER_NAME</PARTYLEDGERNAME>

            <!-- Debit: Customer (receivable) -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>CUSTOMER_LEDGER_NAME</LEDGERNAME>
              <ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
              <AMOUNT>-TOTAL_AMOUNT</AMOUNT>
            </ALLLEDGERENTRIES.LIST>

            <!-- Credit: Sales account -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>SALES_LEDGER_NAME</LEDGERNAME>
              <ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
              <AMOUNT>BASE_AMOUNT</AMOUNT>
            </ALLLEDGERENTRIES.LIST>

            <!-- Credit: GST Output (if applicable) -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>GST Output</LEDGERNAME>
              <ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
              <AMOUNT>GST_AMOUNT</AMOUNT>
            </ALLLEDGERENTRIES.LIST>
          </VOUCHER>
        </TALLYMESSAGE>
      </REQUESTDATA>
    </IMPORTDATA>
  </BODY>
</ENVELOPE>'

3c. Payment Voucher (Money Paid Out)

Use when: Business pays a vendor, rent, salary, or any expense.

curl -s -X POST "$TALLY_URL" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0" encoding="utf-8"?>
<ENVELOPE>
  <HEADER><TALLYREQUEST>Import Data</TALLYREQUEST></HEADER>
  <BODY>
    <IMPORTDATA>
      <REQUESTDESC>
        <REPORTNAME>Vouchers</REPORTNAME>
        <STATICVARIABLES>
          <SVCURRENTCOMPANY>COMPANY_NAME</SVCURRENTCOMPANY>
        </STATICVARIABLES>
      </REQUESTDESC>
      <REQUESTDATA>
        <TALLYMESSAGE xmlns:UDF="TallyUDF">
          <VOUCHER VCHTYPE="Payment" ACTION="Create">
            <GUID>UNIQUE_GUID_HERE</GUID>
            <DATE>YYYYMMDD</DATE>
            <VOUCHERTYPENAME>Payment</VOUCHERTYPENAME>
            <NARRATION>Payment to PAYEE_NAME</NARRATION>
            <ISINVOICE>No</ISINVOICE>
            <PARTYLEDGERNAME>PAYEE_LEDGER_NAME</PARTYLEDGERNAME>

            <!-- Debit: Who is being paid -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>PAYEE_LEDGER_NAME</LEDGERNAME>
              <ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
              <AMOUNT>-AMOUNT</AMOUNT>
            </ALLLEDGERENTRIES.LIST>

            <!-- Credit: Bank / Cash (source of payment) -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>BANK_OR_CASH_LEDGER</LEDGERNAME>
              <ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
              <AMOUNT>AMOUNT</AMOUNT>
            </ALLLEDGERENTRIES.LIST>
          </VOUCHER>
        </TALLYMESSAGE>
      </REQUESTDATA>
    </IMPORTDATA>
  </BODY>
</ENVELOPE>'

3d. Receipt Voucher (Money Received)

Use when: Business receives money from a customer.

curl -s -X POST "$TALLY_URL" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0" encoding="utf-8"?>
<ENVELOPE>
  <HEADER><TALLYREQUEST>Import Data</TALLYREQUEST></HEADER>
  <BODY>
    <IMPORTDATA>
      <REQUESTDESC>
        <REPORTNAME>Vouchers</REPORTNAME>
        <STATICVARIABLES>
          <SVCURRENTCOMPANY>COMPANY_NAME</SVCURRENTCOMPANY>
        </STATICVARIABLES>
      </REQUESTDESC>
      <REQUESTDATA>
        <TALLYMESSAGE xmlns:UDF="TallyUDF">
          <VOUCHER VCHTYPE="Receipt" ACTION="Create">
            <GUID>UNIQUE_GUID_HERE</GUID>
            <DATE>YYYYMMDD</DATE>
            <VOUCHERTYPENAME>Receipt</VOUCHERTYPENAME>
            <NARRATION>Receipt from CUSTOMER_NAME</NARRATION>
            <ISINVOICE>No</ISINVOICE>
            <PARTYLEDGERNAME>CUSTOMER_LEDGER_NAME</PARTYLEDGERNAME>

            <!-- Debit: Bank / Cash (destination) -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>BANK_OR_CASH_LEDGER</LEDGERNAME>
              <ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
              <AMOUNT>-AMOUNT</AMOUNT>
            </ALLLEDGERENTRIES.LIST>

            <!-- Credit: Customer ledger (reduces receivable) -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>CUSTOMER_LEDGER_NAME</LEDGERNAME>
              <ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
              <AMOUNT>AMOUNT</AMOUNT>
            </ALLLEDGERENTRIES.LIST>
          </VOUCHER>
        </TALLYMESSAGE>
      </REQUESTDATA>
    </IMPORTDATA>
  </BODY>
</ENVELOPE>'

3e. Journal Voucher (Adjustments / Provisions)

Use when: GST adjustments, provisions, depreciation, accruals, or any internal accounting entry.

curl -s -X POST "$TALLY_URL" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0" encoding="utf-8"?>
<ENVELOPE>
  <HEADER><TALLYREQUEST>Import Data</TALLYREQUEST></HEADER>
  <BODY>
    <IMPORTDATA>
      <REQUESTDESC>
        <REPORTNAME>Vouchers</REPORTNAME>
        <STATICVARIABLES>
          <SVCURRENTCOMPANY>COMPANY_NAME</SVCURRENTCOMPANY>
        </STATICVARIABLES>
      </REQUESTDESC>
      <REQUESTDATA>
        <TALLYMESSAGE xmlns:UDF="TallyUDF">
          <VOUCHER VCHTYPE="Journal" ACTION="Create">
            <GUID>UNIQUE_GUID_HERE</GUID>
            <DATE>YYYYMMDD</DATE>
            <VOUCHERTYPENAME>Journal</VOUCHERTYPENAME>
            <NARRATION>NARRATION_TEXT</NARRATION>
            <ISINVOICE>No</ISINVOICE>

            <!-- Debit entry -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>DEBIT_LEDGER</LEDGERNAME>
              <ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
              <AMOUNT>-AMOUNT</AMOUNT>
            </ALLLEDGERENTRIES.LIST>

            <!-- Credit entry -->
            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>CREDIT_LEDGER</LEDGERNAME>
              <ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
              <AMOUNT>AMOUNT</AMOUNT>
            </ALLLEDGERENTRIES.LIST>
          </VOUCHER>
        </TALLYMESSAGE>
      </REQUESTDATA>
    </IMPORTDATA>
  </BODY>
</ENVELOPE>'

Reading Data (Export Operations)

Get Day Book (All Transactions for a Period)

curl -s -X POST "$TALLY_URL" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0" encoding="utf-8"?>
<ENVELOPE>
  <HEADER><TALLYREQUEST>Export Data</TALLYREQUEST></HEADER>
  <BODY>
    <EXPORTDATA>
      <REQUESTDESC>
        <REPORTNAME>Day Book</REPORTNAME>
        <STATICVARIABLES>
          <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>
          <SVCURRENTCOMPANY>COMPANY_NAME</SVCURRENTCOMPANY>
          <SVFROMDATE>FROM_DATE_YYYYMMDD</SVFROMDATE>
          <SVTODATE>TO_DATE_YYYYMMDD</SVTODATE>
        </STATICVARIABLES>
      </REQUESTDESC>
    </EXPORTDATA>
  </BODY>
</ENVELOPE>'

Get Balance Sheet

curl -s -X POST "$TALLY_URL" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0" encoding="utf-8"?>
<ENVELOPE>
  <HEADER><TALLYREQUEST>Export Data</TALLYREQUEST></HEADER>
  <BODY>
    <EXPORTDATA>
      <REQUESTDESC>
        <REPORTNAME>Balance Sheet</REPORTNAME>
        <STATICVARIABLES>
          <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>
          <SVCURRENTCOMPANY>COMPANY_NAME</SVCURRENTCOMPANY>
        </STATICVARIABLES>
      </REQUESTDESC>
    </EXPORTDATA>
  </BODY>
</ENVELOPE>'

Get Trial Balance

curl -s -X POST "$TALLY_URL" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0" encoding="utf-8"?>
<ENVELOPE>
  <HEADER><TALLYREQUEST>Export Data</TALLYREQUEST></HEADER>
  <BODY>
    <EXPORTDATA>
      <REQUESTDESC>
        <REPORTNAME>Trial Balance</REPORTNAME>
        <STATICVARIABLES>
          <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>
          <SVCURRENTCOMPANY>COMPANY_NAME</SVCURRENTCOMPANY>
          <SVFROMDATE>FROM_DATE_YYYYMMDD</SVFROMDATE>
          <SVTODATE>TO_DATE_YYYYMMDD</SVTODATE>
        </STATICVARIABLES>
      </REQUESTDESC>
    </EXPORTDATA>
  </BODY>
</ENVELOPE>'

Get Ledger Statement (Transactions for a Specific Ledger)

curl -s -X POST "$TALLY_URL" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0" encoding="utf-8"?>
<ENVELOPE>
  <HEADER><TALLYREQUEST>Export Data</TALLYREQUEST></HEADER>
  <BODY>
    <EXPORTDATA>
      <REQUESTDESC>
        <REPORTNAME>Ledger Vouchers</REPORTNAME>
        <STATICVARIABLES>
          <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>
          <SVCURRENTCOMPANY>COMPANY_NAME</SVCURRENTCOMPANY>
          <SVLEDGERNAME>LEDGER_NAME</SVLEDGERNAME>
          <SVFROMDATE>FROM_DATE_YYYYMMDD</SVFROMDATE>
          <SVTODATE>TO_DATE_YYYYMMDD</SVTODATE>
        </STATICVARIABLES>
      </REQUESTDESC>
    </EXPORTDATA>
  </BODY>
</ENVELOPE>'

Full Example: WhatsApp Purchase Invoice → Tally

Scenario: Client sends a PDF invoice from "Reliance Retail Ltd." for ₹59,000 (₹50,000 base + ₹9,000 GST @ 18%), dated 15-Jan-2026, invoice no. RRL/2026/00123.

Step 1 — Extract from PDF/Image

Use your vision capability to extract:

Vendor: Reliance Retail Ltd.
Vendor GSTIN: 27AABCR1234A1Z5
Invoice No: RRL/2026/00123
Date: 15-Jan-2026 → 20260115
Base Amount: ₹50,000
GST (18%): ₹9,000
Total: ₹59,000
Description: Office Supplies

Step 2 — Check & Create Ledgers

Check if these 3 ledgers exist. Create any that are missing:

LedgerGroupAction
Reliance Retail Ltd.Sundry CreditorsCreate if missing
Office SuppliesPurchase AccountsCreate if missing
GST Input CreditDuties & TaxesCreate if missing

Step 3 — Post Purchase Voucher

curl -s -X POST "$TALLY_URL" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0" encoding="utf-8"?>
<ENVELOPE>
  <HEADER><TALLYREQUEST>Import Data</TALLYREQUEST></HEADER>
  <BODY>
    <IMPORTDATA>
      <REQUESTDESC>
        <REPORTNAME>Vouchers</REPORTNAME>
        <STATICVARIABLES>
          <SVCURRENTCOMPANY>COMPANY_NAME</SVCURRENTCOMPANY>
        </STATICVARIABLES>
      </REQUESTDESC>
      <REQUESTDATA>
        <TALLYMESSAGE xmlns:UDF="TallyUDF">
          <VOUCHER VCHTYPE="Purchase" ACTION="Create">
            <GUID>rrl-2026-00123-purchase</GUID>
            <DATE>20260115</DATE>
            <VOUCHERTYPENAME>Purchase</VOUCHERTYPENAME>
            <VOUCHERNUMBER>RRL/2026/00123</VOUCHERNUMBER>
            <NARRATION>Purchase from Reliance Retail Ltd. | Invoice: RRL/2026/00123 | Office Supplies</NARRATION>
            <ISINVOICE>Yes</ISINVOICE>
            <PARTYLEDGERNAME>Reliance Retail Ltd.</PARTYLEDGERNAME>

            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>Office Supplies</LEDGERNAME>
              <ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
              <AMOUNT>-50000</AMOUNT>
            </ALLLEDGERENTRIES.LIST>

            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>GST Input Credit</LEDGERNAME>
              <ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
              <AMOUNT>-9000</AMOUNT>
            </ALLLEDGERENTRIES.LIST>

            <ALLLEDGERENTRIES.LIST>
              <LEDGERNAME>Reliance Retail Ltd.</LEDGERNAME>
              <ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
              <AMOUNT>59000</AMOUNT>
            </ALLLEDGERENTRIES.LIST>
          </VOUCHER>
        </TALLYMESSAGE>
      </REQUESTDATA>
    </IMPORTDATA>
  </BODY>
</ENVELOPE>'

Step 4 — Confirm to User

On success (CREATED=1), reply:

Purchase entry booked in Tally

FieldValue
Company(as confirmed by user)
VendorReliance Retail Ltd.
Invoice NoRRL/2026/00123
Date15 Jan 2026
Base Amount₹50,000
GST (18%)₹9,000
Total₹59,000

The vendor ledger "Reliance Retail Ltd." was created under Sundry Creditors.


Error Handling

Error MessageCauseFix
TallyPrime Server is Running not returnedTally not openTell user to open TallyPrime
Ledger 'X' does not existLedger missingCreate it via Step 2, then retry
Voucher date is missingDate outside company's FYAsk user: "What financial year is configured in your Tally company?"
The date X is Out of RangeSame as aboveSame fix
Could not find Report 'X'Wrong report nameUse exact report names from this skill
CREATED=0, EXCEPTIONS=1Generic data errorCheck narration for special characters — escape & as &amp;

GUID Generation

Always generate a unique GUID per voucher to prevent duplicates. A good pattern:

{company-short}-{voucher-type}-{invoice-number}-{date}

Examples:

  • ape-purchase-rrl202600123-20260115
  • ape-sales-si001-20260302
  • ape-payment-hdfc-20260115

If the same GUID is sent twice, Tally will update the existing record instead of creating a duplicate — this makes the operation safely idempotent.


Multi-Company Workflow for CA Firms

CAs typically manage 10–50+ companies in a single Tally installation. Handle company context like this:

  1. If the user mentions the company (e.g., "for Sharma Traders" or "in my textile client's books") — use that name directly as SVCURRENTCOMPANY in the XML.
  2. If the user doesn't mention it — always ask before posting: "Which company should I book this in?" Never assume.
  3. After posting — always confirm the company name in your reply so the user can catch any mistakes.
  4. If unsure about the exact Tally company name — you can fetch all available company names by querying List of Accounts without a SVCURRENTCOMPANY filter, or simply ask the user to confirm the exact spelling as it appears in Tally.

Note: The company name in SVCURRENTCOMPANY must match exactly (case-sensitive) how it appears in Tally. Even a trailing space or different capitalisation will cause the request to fail silently or return data from the wrong company.

Comments

Loading comments...