In Vietnam, an invoice is not paperwork — it is a legal event. Under the electronic invoice regime built on Decree 123/2020/NĐ-CP and its successors, invoices are issued electronically, carry tax authority codes (for most sellers), and are validated on submission. For an e-commerce shop doing dozens of orders a day, issuing them by hand inside MISA AMIS is an hour of daily typing with legal consequences for every typo. The automation is straightforward in shape — order in, invoice out — but compliance lives in the details, and the details are where we spend this article.
When a B2C seller must issue an invoice
The regime's direction of travel has been consistent: more transactions invoiced, sooner, with fewer exemptions. In practice, B2C sellers should design for invoice every order rather than litigating thresholds per sale. A buyer who does not provide a tax code still gets a valid invoice — the buyer tax code is optional for B2C, while your seller details, line items and VAT must always be exact. Building "invoice everything" from day one also means a tax inspection finds a complete, ordered series instead of gaps you must explain.
Mapping a Shopify order to an AMIS invoice
The pipeline listens to Shopify order webhooks and builds the invoice payload from a deterministic mapping:
- Line items. Each Shopify line item becomes an invoice line: item name (Vietnamese, from your catalogue master data — not the marketing title), unit, quantity, unit price and VAT rate. Shipping charged to the customer is its own line with its own VAT treatment.
- VAT rates. Most goods sit at 10%, with a reduced 8% applying to qualifying categories during VAT-reduction periods. The rate is a property of the product in your master data, reviewed by your accountant — never inferred per order by the pipeline, and definitely never by an AI guessing from the product name.
- Buyer block. Name and address from the order; tax code only when the buyer supplies one (company purchases). Validate the format before submission — malformed tax codes are a top rejection cause.
- Timing. Issue on delivery or on payment? For COD, delivery and payment coincide, so the delivered webhook from your carrier integration is the natural trigger. For prepaid orders, issue on fulfilment. Pick one policy with your accountant and encode it once.
VND rounding: the mismatch that never stops
Shopify computes totals its way; Vietnamese invoices are denominated in whole VND with their own rounding conventions per line and per total. Discounts split across lines make it worse. If you copy Shopify's numbers naively, some invoices will disagree with the order by a few hundred đồng — enough to fail validation or annoy an auditor.
The rejection-handling review queue
Submissions get rejected: malformed buyer tax codes, unit names that fail validation, VAT rate mismatches, series/numbering issues. The pipeline's contract must be:
- Pre-validate everything you can locally — formats, required fields, arithmetic — so most errors never reach submission.
- Queue rejects for humans. A rejected invoice enters a review queue with the order, the payload and the rejection reason side by side. Someone fixes the data and resubmits with one click.
- Never silently drop a failure. A missing invoice is a compliance liability that surfaces months later, during an inspection, with no context. The queue must be zero-inbox by design: unresolved items escalate daily until cleared.
Returns and refunds: the adjustment-invoice trap
The part most automations forget: in this regime you cannot simply void history. A return or refund against an already-issued invoice requires an adjustment invoice (hóa đơn điều chỉnh) or a replacement invoice (hóa đơn thay thế), formally linked to the original. If your pipeline issues invoices automatically but handles returns manually, your books will drift within a month.
Automate the linkage: a Shopify refund webhook looks up the original invoice, determines whether the change is partial (adjustment) or total (replacement), generates the corrective document referencing the original invoice's identifiers, and routes it through the same review queue. Store the link both ways — original → corrections, correction → original — because that chain is exactly what an auditor will ask to see.
Storage, lookup and the daily rhythm
Issued invoices must be retained and retrievable for years. Keep your own copy of every issued XML/PDF and its status history, independent of the provider portal, keyed by order ID — so "send me the invoice for order #4821" is a lookup, not an archaeology project. A daily summary closes the loop: invoices issued, rejected, corrected, and any gap between orders delivered and invoices issued. That last number should be zero, and when it is not, you want to know today — this is the finance layer of the end-to-end automation stack, and it pairs with automated COD reconciliation to close the money loop entirely.
MISA AMIS is the incumbent choice and integrates well, but it is not the only path — if you are evaluating alternatives or need a failover story, read our companion piece on xCyber and other e-invoice providers.