Tally — the day lands once, and Tally's GSTR-1 equals ours
Journals go as Journal vouchers by the mapped ledger names; documents go as Sales / Credit Note / Receipt / Purchase / Payment vouchers with the party's GSTIN and the tax ledgers by rate; every voucher carries our id so a re-send alters instead of duplicating; the Tally Bridge on the accountant's PC moves the batches and reads Tally's ledger list back.
Menu → Ledger → Connectors → Tally. Two kinds of batch. Journals — every journal of the period as a Journal voucher, the ledger names from the mapping. Documents — every invoice and restaurant bill as a *Sales* voucher with the party ledger (GSTIN, state), the sales ledger by category and the tax ledgers by rate; every note as a *Credit Note*; every receipt as a *Receipt*; every bill as a *Purchase*; every payment as a *Payment* — which is what Tally's own GSTR-1 reads. Send one or the other for a period, not both. It lands once. Every voucher carries a REMOTEID that is ours. Tally creates it the first time and alters it on a re-send; the batch says CREATED / ALTERED / ERRORS as Tally answered, with the line that failed. Masters first. The ledgers a batch names that Tally's list does not have go in the same file, under the right group, party ledgers with their GSTIN. Tally's list comes from the bridge every hour, so a name the accountant changed there is known here. The bridge (tools/tally-bridge) runs on the PC where Tally is open with its port on: it asks for the next batch with its key, posts it to Tally, writes back what Tally said. Without it, download the XML and import it by hand — Gateway of Tally → Import → Vouchers. The CSV is the same rows for the sheet-import add-ons.