Actions and results
What each Billing button and automatic behaviour does, with worked numbers and what the system refuses.
On this page (13)
Overview
| Action | When | What you do | What happens |
|---|---|---|---|
| Figures match the lists | Some drafts, approvals, overdue invoices, a refund requested | Open Billing > Overview; compare each figure with the list it opens | Sales orders to invoice, Draft invoices, Waiting for approval, Overdue receivables, Matching exceptions, Refunds pending all equal the list counts/amounts (company currency AED) |
| Period selector | Documents this month and last month | Switch This month / Last month / This quarter / This year | The recent-activity list follows the period; the figures stay 'as of today' |
| Exceptions panel | A draft bill repeating a posted supplier invoice number; a draft line with no tax code | Open the Overview | 'Duplicate supplier reference' and 'Missing tax treatment' rows appear with owner and count |
| Receivables aging | Posted invoices 10, 40 and 100 days past due | Read the aging panel | Each invoice sits in its days-past-due bucket; buckets add to the overdue figure |
To invoice
| Action | When | What you do | What happens |
|---|---|---|---|
| Backlog shows what is left to bill | Sales order 10 units, delivered 6, invoiced 0 (basis delivered) | Open To invoice | Line shows Ordered 10, Delivered 6, Invoiced 0, To bill 6, Value = 6 x price |
| Create one invoice from one order | Confirmed SO: 1 line 1,000.00 AED, VAT 5% | Tick its line > Create invoices > Submit | One draft invoice: net 1,000.00, VAT 50.00, total 1,050.00; due date from the customer's payment terms; order untouched (own number), invoice line linked to the order line |
| Group orders of one customer | Two confirmed SOs, same customer and currency; no grouping policy | Tick both > Create invoices | Preview: 1 invoice with both orders; Submit makes one invoice with both orders' lines |
| Split by currency / customer | Same customer: one SO in AED, one in USD; plus an SO for another customer | Tick all three > Create invoices | Preview: 3 invoices; the AED/USD pair shows 'split by currency' |
| Grouping policy key | Active default policy with key customer_po; two SOs same customer, different Customer PO | Tick both > Create invoices | 2 invoices, 'split by customer_po' |
| Max orders per invoice | Policy max orders 2; three SOs same customer | Create invoices | 2 invoices (2 + 1), split reason 'max_orders' |
| Skipped orders | A draft SO and a fully invoiced SO in the selection (API or two tabs) | Create invoices | Preview lists them under Skipped: '<state> - nothing to bill.' / 'Fully billed.' |
| Create twice = once | Press Submit twice quickly (same selection) | Only one set of invoices (same idempotency key); the second answer is the first | |
| Over-billing refused | SO 10 units delivered 6 (delivered basis) | Via the order's Create invoice ask for 8 | Refused: '<line>: only 6 can be invoiced now - 6 of 10 delivered, 0 already invoiced.' |
| Order invoiced on itself | An SO that posted itself (no warehouse) | Try to invoice it | Refused: '<SO number> was invoiced on the order itself, so there is nothing left to bill.' |
| Supplier side | Confirmed PO with receipt | Side = Suppliers; tick; Create invoices | A draft vendor bill (kind bill) is created from the PO |
| Cash rounding carried | SO with cash rounding 0.25 and total 1,050.10 | Invoice it | Invoice gets an untaxed CASHROUND line bringing the total to 1,050.00 (step 0.25); the order is unchanged |
| Down payment deducted | SO 10,000 + VAT with a posted 2,000 down-payment invoice | Invoice the rest | The final invoice deducts the 2,000 down payment (and its VAT) once |
Billing record
| Action | When | What you do | What happens |
|---|---|---|---|
| Open from any list | Open an invoice from Invoices, Approvals, Register, Corrections | The billing record opens; Back returns to the list | |
| Open document | Smart button Open document | Opens the invoice in Sales > Invoices (bill in Purchase > Bills) with lines and totals | |
| Set bill-to, payer and supply date | Draft invoice | Edit; set Bill to = another customer, Payer, Date of supply = yesterday; Save | Saved; History shows 'billing.header'; revision +1 |
| Header locked after posting | Posted invoice | Try Edit / PUT the billing header | No Edit button; API refused 'Only an unposted document is changed. A posted invoice is corrected by a credit note.' |
| Issue check shown before posting | Active issue profile AE requiring partner.tax_id; customer without TRN | Open the draft | Approval and issue card: 'Issue profile <CODE> · missing: Customer tax registration number' |
| Needs approval chip | Active approval policy threshold 10,000; draft invoice total 10,500 | Open the record | Chip 'Needs approval'; Send for approval offered; Post refused until approved |
| Below threshold - no approval | Same policy; invoice total 9,999.99 (from an order) | Open; Post | No approval needed ('No policy asks for it'); posts |
| Threshold in company currency | Policy 10,000 AED; invoice USD 3,000 at rate 3.6725 (= 11,017.50 AED) | Open the draft | Needs approval (total x rate compared) |
| Manual invoice always approved | Policy with 'Always approve invoices with no order behind them' on, threshold 1,000,000 | Create a 100 AED invoice directly in Sales (no order); open its billing record | Needs approval |
| Send for approval | Draft needing approval | Send for approval with a note | State pending ('Waiting for approval'); appears on Billing > Approvals with Asked by = you |
| Send when not needed | Draft below threshold | Call request-approval (API) | Refused: 'No approval policy asks for this document; it can be posted.' |
| Approve (another person) | Pending invoice, user B with billing.approve | B opens it > Approve | Approved; approved_by B; event billing.approval_decided.v1; Post now allowed |
| Refuse with reason | Pending invoice | B > Refuse with 'Price not agreed' | State rejected; note kept; A can edit and send again |
| Edit after approval voids it | Approved invoice | Change a line price on the document (Open document), then Post | Record shows '(changed since)'; Post refused: 'The document changed after it was approved. Send it for approval again.' |
| Approving changed content | Pending invoice; A edits a line before B approves | B > Approve | Refused: 'The invoice changed after it was sent for approval. Send it again.' |
| Nothing waiting | Invoice not pending | Call approve (API) | Refused: 'Nothing is waiting for approval.' |
| Post an invoice - journal | Approved/no-approval draft: net 1,000.00, VAT 5% 50.00 | Post | State posted, chip Issued. Journal: Dr Trade receivable 1,050.00 / Cr Revenue 1,000.00 / Cr Output VAT 50.00; open item 1,050.00 on the customer |
| Legal snapshot frozen | Posted invoice | Open tab Legal snapshot; then change the customer's name, TRN and address; reprint the invoice | Snapshot shows customer, TRN, address, our TRN, supply date, totals and SHA-256; the reprint still shows the old name/TRN/address |
| Supply date defaulted on post | Draft with no date of supply (mode Optional) | Post | Snapshot and record show date of supply = invoice date |
| Issue profile blocks posting | Profile requiring company.tax_registration; company TRN empty | Post | Refused: 'The issue profile <CODE> needs: Our tax registration number.' - nothing posted |
| B2B-only profile | Profile with 'Only for customers with a tax number'; customer without TRN | Post | Profile does not apply; invoice posts |
| Every line needs a tax code | Profile requiring document.lines_tax_code; one line without a tax code | Post | Refused naming 'A tax code on every line' |
| Post twice = once | Post with the same idempotency key twice (double click) | One journal; second answer 'replayed' | |
| Print shows a tax invoice | VAT-registered company, posted invoice, layout Arabic/bilingual | Title 'Tax invoice / فاتورة ضريبية', seller TRN, buyer and item Arabic names, VAT by rate | |
| Tax-inclusive price helper | POST price-from-gross {gross:105, rate:5}; then {gross:10, rate:5, quantity:3} | First: price 100.00, net 100.00, tax 5.00, total 105.00, exact true. Second: reports exact true/false and the difference in fils | |
| Header charge line | Invoice saved with a charge {label 'Freight', amount 50, tax_rate 5} | Open the document | A CHARGE line 'Freight' 50.00 + VAT 2.50; totals include it |
| Instalments written on posting | Customer payment terms 50% now / 50% in 30 days; invoice total 1,050.00 | Post; open tab Instalments | 2 instalments: 525.00 due invoice date, 525.00 due +30 days; they add to 1,050.00 |
| Last instalment takes the remainder | Terms 3 equal parts; invoice total 1,000.00 | Post | 333.33, 333.33, 333.34 (sum exactly 1,000.00) |
| No terms = one instalment | Customer with no payment terms | Post | One instalment for the total on the due date |
| Paid fills in date order | Invoice with 2 x 525.00; record a 600.00 payment in Accounting | Open Instalments | #1 paid 525 (Paid); #2 paid 75, open 450 (Part paid or Overdue if past due) |
| Credit note keeps the original rate | Posted invoice 1,000 + 5% VAT dated last month; rate later changed | Credit note (whole) > Post | Draft credit note 1,000.00 + 50.00 = 1,050.00 at the ORIGINAL rate/code; posted: Dr Revenue 1,000 / Dr Output VAT 50 / Cr Receivable 1,050 |
| Partial credit | Posted invoice 10 units x 100 + VAT | API credit with lines [{line, quantity 2}] | Credit note 200.00 + 10.00 VAT = 210.00 |
| Credit more than invoiced | Earlier credit of 8 of 10 units | Credit 3 more units | Refused: only 2 left to credit |
| Note against a draft invoice | Draft invoice | Try Credit note (API) | Refused: 'A note is raised against a posted invoice or bill.' |
| Reason required once reasons exist | One active correction reason; a credit note without a reason | Post the note | Refused: 'Choose the correction reason for this note.' |
| Reason needs the original | Reason with 'Must name the original'; a standalone credit note (no original) with it | Post | Refused: 'The reason <CODE> needs the original invoice on the note.' |
| Reason cap % | Reason max 20%; invoice 1,050.00; posted note 105.00 with it | Raise and post a second note 126.00 | Refused: 'The reason <CODE> allows notes up to 20% of INV/...; this note would exceed it.' (cap 210.00, 105 + 126 = 231) |
| Reason needing approval | Reason 'Needs approval'; default approval policy active | Credit note with that reason > Post | Refused until sent for approval and approved by another person |
| Debit note from a bill | Posted vendor bill | Credit note action on the bill | Creates a debit note (kind debit_note) against the bill |
| Credit and rebill | Posted invoice INV-A | Credit and rebill with a reason | Two drafts: a full credit note against INV-A and a new invoice dated today 'Replaces INV-A' with the same lines, parties and header; Rebill of = INV-A; nothing posts until a person posts both |
| Correction chain | INV-A, its credit, rebill INV-B and a refund | Open tab Corrections on any of them | Same chain: INV-A > credit note > refund; INV-B at the same level; counts on the smart button |
| Request a refund | Posted credit note 1,050.00 not applied to any invoice | Refund 500.00 by bank with a reason | Refund RF-00001 Requested; 'Left to refund' 550.00 |
| Refund more than left | Credit note 1,050.00 with 400.00 applied to an invoice | Refund 700.00 | Refused: 'Only 650.00 of CN/... is left to refund.' |
| Defer revenue | Active recognition policy: product SUPPORT-12M, 12 months, from invoice date, deferred 2400, revenue 4000; posted invoice with 12,000 of it | Defer revenue | Journal: Dr Revenue 4000 12,000 / Cr Deferred revenue 2400 12,000; an Accounting deferral 12,000 over 12 months (releases 1,000/month once approved); record lists it |
| Defer twice = once | Same invoice | Defer revenue again | No second journal |
| Defer in foreign currency | Posted USD invoice 1,000 at 3.6725 | Defer revenue | Amount deferred in AED: 3,672.50 |
| Reversal recorded | Posted invoice | Reverse it in Finance/Sales | Billing record chip 'Reversed'; event billing.invoice_reversed.v1 |
Instalments due
| Action | When | What you do | What happens |
|---|---|---|---|
| Hand overdue to collections | One instalment past due, unpaid | Instalments due > Hand overdue to collections; press again | First time: 'To collections' date set, event billing.collections_handoff.v1; second press hands nothing again |
| Feature off | Applications > Billing > Features: Instalment schedules Off (approved) | Post a new invoice | No instalments written; menu Instalments due hidden; existing schedules still shown |
| Report reconciles | Posted invoices with instalments | Open Instalments due | 'Each invoice's instalments add to its total' - Reconciles |
Refunds
| Action | When | What you do | What happens |
|---|---|---|---|
| Approve a refund (another person) | Requested refund by A | B (holds billing.refund.approve) > Approve | Approved; Decided by B; event billing.refund_approved.v1 |
| Refuse a refund | Requested refund | B > Refuse with a reason | Rejected; reason ends with ' | Refused: <why>'; amount is refundable again |
| Mark paid | Approved refund; payment made in Accounting | Mark paid with reference BANK-TRF-0001 | Paid; Payment column shows the reference; paid_by recorded. NOTE: no journal is posted by Billing - the payment itself is recorded in Accounting |
| Wrong-state actions | Approve a paid refund; mark paid a requested one; cancel a paid one (API) | 'Only a requested refund is decided.' / 'Only an approved refund is paid.' / 'This refund has been decided or paid.' | |
| Cancel a refund | Requested refund | POST refunds/<id>/cancel (API - no button on the screen) | Cancelled; amount refundable again |
Recurring invoices
| Action | When | What you do | What happens |
|---|---|---|---|
| Create and start a contract | Active customer; product SUPPORT 1,000 | New; code, name, customer, Monthly, First period = 1st of this month, lines JSON; Save; Start | Running; Next invoice = first period |
| Run raises one invoice per period | Running contract, first period two months ago | Run (POST recurring/run or wait for the 05:00 Dubai job) | One draft invoice per past period (3: two months ago, last month, this month), each with supply date = period and notes '<name> - <date>'; tab Invoices raised lists them; Next invoice moves on |
| Run again raises nothing | Same contract | Run again | No new invoice (one per contract per period) |
| Auto-post | Contract with Post each invoice straight away; no approval needed | Run | Invoices are posted (journal, instalments, snapshot) |
| Month-end start | First period 31 Jan, monthly | Run through April | Periods 31 Jan, 28/29 Feb, 28/29 Mar... (day kept within each month) |
| End date ends the contract | Last period = next month | Run after it | Contract Ended after the last period; no further invoices |
| Edit only when paused | Running contract | Edit | Refused: 'Pause the contract before changing it.'; Pause > Edit > Start works |
| Start without lines | Draft with lines [] | Start | Refused: 'Add the lines the contract invoices.' |
Any billing master
| Action | When | What you do | What happens |
|---|---|---|---|
| Create, then activate by another person | Users A and B with billing.configure | A creates an approval policy (draft); A presses Activate; B presses Activate | A refused: 'Somebody other than the person who prepared this approval policy must decide it.'; B: Active, Activated by B |
| Active master is not edited | Active grouping policy | Edit (API PUT) | Refused: 'An active grouping policy is not edited. Archive it and create a new one.' |
| Archive and back to draft | Active policy | Archive; then Back to draft | Archived (no longer applies); Back to draft makes it editable again |
| Default switch | Active default policy P1; draft P2 with Company default on | Activate P2 (another person) | P2 default; P1 no longer default |
| Valid dates | Approval policy valid from next month | Post a 50,000 invoice dated today | Policy does not apply yet: no approval needed |
Invoice register
| Action | When | What you do | What happens |
|---|---|---|---|
| Register totals | Period with invoice 1,050.00 and its credit note 210.00 | Open the register for the period | Rows net + tax = total; Signed of the note is negative; totals 'documents less notes' net 800.00, tax 40.00, total 840.00; 'Reconciles' |
| Purchases side | Posted bills | Side = Purchases | Bills and debit notes only |
Tax bridge
| Action | When | What you do | What happens |
|---|---|---|---|
| Register vs ledger | Posted invoices only in the period | Open Tax bridge | Output side: register tax = movement of the output VAT account; difference 0.00; 'Reconciles' |
| Manual tax journal shows a difference | Post a manual journal 100.00 to the output VAT account | Reopen | Difference 100.00; 'Does not reconcile' |
Correction chain
| Action | When | What you do | What happens |
|---|---|---|---|
| Over-credit flagged | Notes against an original | Open the report | Original total, Credited so far, This note, Refunded correct; notes never exceed the original |
Applications > Billing > Features
| Action | When | What you do | What happens |
|---|---|---|---|
| Turn Approval policies off (two people) | A pending invoice; admins A and B | A: Approval policies Off > Preview (note '1 document(s) waiting for approval will no longer need it.') > Propose; B approves | Approvals and Approval policies menus disappear; the pending invoice posts without approval; approve/request routes refused as turned off |
| Refunds Off blocked | A requested refund | Propose Refunds Off | Blocked: '1 refund(s) are requested or approved and not paid. Decide or pay them first.' |
| Recurring Off blocked, then allowed | A running contract | Propose Recurring Off; then pause the contract and propose again | First blocked ('... recurring contract(s) are running ...'); second accepted; menu hidden; the daily run skips 'Recurring invoices are turned off for this company.' |
| Revenue recognition Off | Turn Off (approved); press Defer revenue (API) | Refused as turned off; menu Revenue recognition hidden; existing deferrals keep releasing |
Applications > Billing > Fields
| Action | When | What you do | What happens |
|---|---|---|---|
| Date of supply Required | Set Required (approved); post a draft invoice with no supply date | Refused: 'Enter the date of supply: this company requires one on every invoice.'; the field shows * | |
| Date of supply Hidden | Set Hidden; open a draft; send supply_date (API) | Box gone; API refused 'Date of supply is turned off for this company.'; posting uses the invoice date | |
| Parties Hidden | Set Sold-to, bill-to and payer Hidden; send bill_to (API) | Pickers gone (existing values still shown); API refused 'Sold-to, bill-to and payer is turned off for this company.' |
Event log (API)
| Action | When | What you do | What happens |
|---|---|---|---|
| Outbox events | After posting, approving, refunding | GET billing/events | Events billing.invoice_issued.v1, approval_decided.v1, refund_approved.v1, collections_handoff.v1 with sequence numbers |