Schemas and export layouts

See which fields ScanToExcel extracts and how they appear in your downloads. A supported field is not a guarantee that your document contains it or that extraction will populate it.

On every plan, export templates use English headers and field names. Extracted text and source-table headers generally stay in the document’s language. Changing the website language does not translate downloads. JSON keys, predefined worksheet labels and accounting-template headers remain fixed. Dates, numbers, currency codes and some categories may be standardized; review the output.

Choose your output

JSON
JSON keeps nested document data, including lists of items and transactions. The downloaded file is the document object, without quota or file-transfer metadata. Flat settings do not change JSON.
Flat
Flat exports use a rectangular grid of rows and consistent columns. Each row represents an item or transaction, with document details repeated where needed. Every table has its own fixed column structure; Excel can contain multiple sheets, while CSV contains one grid.
Non-flat
Non-flat Excel and CSV exports place separate tables side by side, each with its own purpose and columns: document details, items, taxes, totals or warnings. They do not form one uniform data table. Word stacks these tables vertically. Paystubs and table images use dedicated layouts.
Output availability
DocumentJSONLayoutXero CSVQuickBooks CSV
ReceiptYesFlat / Non-flatYesNo
Invoice/BillYesFlat / Non-flatYesNo
Bank StatementYesFlat / Non-flatYesYes
Credit Card StatementYesFlat / Non-flatYesYes
Paystub/PayslipYesDedicated layoutNoNo
Image of TableYesDedicated layoutNoNo

Accounting CSVs are Premium output options with their own templates. They produce downloadable files, not a direct connection to Xero or QuickBooks. Review fields and account mappings before importing. Pricing

Receipt

Vendor, date, currency, receipt number, item quantities and prices, taxes, payment method and totals. Tax rate values are fractions: 0.20 means 20%.

JSON fields

Types describe serialized JSON. Parent objects and arrays are listed before their children; [] marks repeated entries. Defaulted fields need not be supplied by extraction. Decimal values serialize as strings. Downloads retain defaulted fields; a missing extracted value is not the same as an omitted JSON key.

Document
Field pathJSON typePresence
vendorstring | nullDefaulted
datestring | nullDefaulted
currencystring | nullDefaulted
document_numberstring | nullDefaulted
subtotalstring | nullDefaulted
taxstring | nullDefaulted
tax_inclusiveboolean | nullDefaulted
tipstring | nullDefaulted
payment_methodstring | nullDefaulted
totalstring | nullDefaulted
line_items
Field pathJSON typePresence
line_itemsarray<object>Defaulted
line_items[].descriptionstring | nullDefaulted
line_items[].quantitystring | nullDefaulted
line_items[].unit_pricestring | nullDefaulted
line_items[].totalstring | nullDefaulted
taxes
Field pathJSON typePresence
taxesarray<object>Defaulted
taxes[].namestring | nullDefaulted
taxes[].ratestring | nullDefaulted
taxes[].basestring | nullDefaulted
taxes[].amountstring | nullDefaulted
reconciliation_warnings
Field pathJSON typePresence
reconciliation_warningsarray<string>Defaulted

Flat

Flat includes item rows and a separate document summary in Excel. CSV contains only the item rows. Tax and tip adjustments can add rows: their line_total comes from tax, taxes[].amount or tip; their description is generated and their quantity, unit_price and line_no are blank.

Lines (Excel / CSV)
Output fieldJSON source or export rule
doc_iddoc_id
source_filenamesource_filename
vendorvendor
datedate
currencycurrency
document_numberdocument_number
line_noindex(line_items[]) + 1
descriptionline_items[].description
quantityline_items[].quantity
unit_priceline_items[].unit_price
line_totalline_items[].total
row_typeline | adjustment
Documents (Excel)
Output fieldJSON source or export rule
doc_iddoc_id
source_filenamesource_filename
vendorvendor
datedate
currencycurrency
document_numberdocument_number
subtotalsubtotal
taxtax
tax_inclusivetax_inclusive
tiptip
payment_methodpayment_method
totaltotal
tax_breakdownjoin(taxes[].name, taxes[].rate, taxes[].amount)
warningsjoin(reconciliation_warnings[])

Non-flat

Non-flat places these tables side by side. Document details and totals use field/value rows; items and taxes use columns. Warnings appear only when present. unit_price is not included in the non-flat item table.

Items
Output fieldJSON source or export rule
#index(line_items[]) + 1
Descriptionline_items[].description
Qtyline_items[].quantity
Line totalline_items[].total
Document details
Output fieldJSON source or export rule
Doc IDdoc_id
Sourcesource_filename
Vendorvendor
Datedate
Currencycurrency
Document #document_number
Payment methodpayment_method
Taxes
Output fieldJSON source or export rule
Nametaxes[].name
Ratetaxes[].rate
Basetaxes[].base
Amounttaxes[].amount
Totals
Output fieldJSON source or export rule
Subtotalsubtotal
Taxtax
Tax inclusivetax_inclusive
Tiptip
Totaltotal
Warnings
Output fieldJSON source or export rule
#index(reconciliation_warnings[]) + 1
Warningreconciliation_warnings[]

Xero CSV

One summarized row per receipt. Fields without a source below are exported blank, including AccountCode and TaxType. Complete the required mappings before importing.

Xero CSV
Output fieldJSON source or export rule
*ContactNamevendor || "Unknown vendor"
EmailAddressLeft blank
POAddressLine1Left blank
POAddressLine2Left blank
POAddressLine3Left blank
POAddressLine4Left blank
POCityLeft blank
PORegionLeft blank
POPostalCodeLeft blank
POCountryLeft blank
*InvoiceNumberdocument_number || "RCP-" + doc_id
Reference"Receipt"
*InvoiceDatedate → DD/MM/YYYY
*DueDatedate → DD/MM/YYYY
TotalLeft blank
InventoryItemCodeLeft blank
*Descriptionjoin(line_items[].description) || vendor || "Receipt"; tip → "(incl. tip)"
*Quantity1
*UnitAmountsubtotal / total / tax / tax_inclusive / tip
DiscountLeft blank
*AccountCodeLeft blank
*TaxTypeLeft blank
TaxAmounttax (0 → blank)
TrackingName1Left blank
TrackingOption1Left blank
TrackingName2Left blank
TrackingOption2Left blank
Currencycurrency
BrandingThemeLeft blank

UnitAmount uses total (falling back to subtotal) when tax_inclusive is true. Otherwise it uses subtotal, or total minus tax when subtotal is missing. Missing amounts can fall back to zero. The exporter then adds tip. Review tax and tip handling before import.

QuickBooks CSV

No

Invoice/Bill

Invoice dates and references, sender and receiver details, line items, taxes, discounts, withholdings and totals. unit is the printed unit of measure; tax_rate is a fraction.

JSON fields

Types describe serialized JSON. Parent objects and arrays are listed before their children; [] marks repeated entries. Defaulted fields need not be supplied by extraction. Decimal values serialize as strings. Downloads retain defaulted fields; a missing extracted value is not the same as an omitted JSON key.

Document
Field pathJSON typePresence
invoice_numberstring | nullDefaulted
issue_datestring | nullDefaulted
due_datestring | nullDefaulted
currencystring | nullDefaulted
payment_termsstring | nullDefaulted
purchase_orderstring | nullDefaulted
notesstring | nullDefaulted
subtotalstring | nullDefaulted
discountstring | nullDefaulted
taxstring | nullDefaulted
tax_inclusiveboolean | nullDefaulted
withholdingsstring | nullDefaulted
totalstring | nullDefaulted
sender
Field pathJSON typePresence
senderobject | nullDefaulted
sender.namestring | nullDefaulted
sender.addressobject | nullDefaulted
sender.address.line1string | nullDefaulted
sender.address.line2string | nullDefaulted
sender.address.citystring | nullDefaulted
sender.address.regionstring | nullDefaulted
sender.address.postal_codestring | nullDefaulted
sender.address.countrystring | nullDefaulted
sender.address.rawstring | nullDefaulted
sender.tax_idstring | nullDefaulted
sender.emailstring | nullDefaulted
receiver
Field pathJSON typePresence
receiverobject | nullDefaulted
receiver.namestring | nullDefaulted
receiver.addressobject | nullDefaulted
receiver.address.line1string | nullDefaulted
receiver.address.line2string | nullDefaulted
receiver.address.citystring | nullDefaulted
receiver.address.regionstring | nullDefaulted
receiver.address.postal_codestring | nullDefaulted
receiver.address.countrystring | nullDefaulted
receiver.address.rawstring | nullDefaulted
receiver.tax_idstring | nullDefaulted
receiver.emailstring | nullDefaulted
line_items
Field pathJSON typePresence
line_itemsarray<object>Defaulted
line_items[].descriptionstring | nullDefaulted
line_items[].quantitystring | nullDefaulted
line_items[].unitstring | nullDefaulted
line_items[].unit_pricestring | nullDefaulted
line_items[].totalstring | nullDefaulted
line_items[].tax_ratestring | nullDefaulted
line_items[].tax_amountstring | nullDefaulted
taxes
Field pathJSON typePresence
taxesarray<object>Defaulted
taxes[].namestring | nullDefaulted
taxes[].ratestring | nullDefaulted
taxes[].basestring | nullDefaulted
taxes[].amountstring | nullDefaulted
reconciliation_warnings
Field pathJSON typePresence
reconciliation_warningsarray<string>Defaulted

The tables map output fields to JSON paths. || means the first nonempty value; ?? means a fallback for null. Numbering, combined descriptions and formatting are export rules. Missing values generally become blank cells.

Flat exports have one line-item grid with repeated invoice details. Non-flat groups invoice details, parties, items, tax breakdown, totals and warnings; Word arranges sections vertically.

Flat

Lines contains one row per item with repeated invoice details. Additional adjustment rows use −discount, taxes[].amount (or tax) when tax_inclusive is not true, and −withholdings. Their descriptions are generated; line_no, quantity, unit and unit_price are blank. An invoice without items still produces a document row.

Lines (Excel / CSV / Word)
Output fieldJSON source or export rule
doc_iddoc_id
source_filenamesource_filename
invoice_numberinvoice_number
issue_dateissue_date
due_datedue_date
currencycurrency
sendersender.name
receiverreceiver.name
line_noindex(line_items[]) + 1
descriptionline_items[].description
quantityline_items[].quantity
unitline_items[].unit
unit_priceline_items[].unit_price
line_totalline_items[].total
tax_rateline_items[].tax_rate
tax_amountline_items[].tax_amount
row_typeline | adjustment

Non-flat

These tables sit side by side in Excel and CSV; Word stacks them. The current Excel item table omits Line total. CSV and Word include it. Document details and totals use field/value rows. Warnings appear only when present.

Items
Output fieldJSON source or export rule
#index(line_items[]) + 1
Descriptionline_items[].description
Qtyline_items[].quantity
Unitline_items[].unit
Unit priceline_items[].unit_price
Tax rateline_items[].tax_rate
Tax amountline_items[].tax_amount
Line totalline_items[].total
Document details
Output fieldJSON source or export rule
Doc IDdoc_id
Sourcesource_filename
Invoice #invoice_number
Issue dateissue_date
Due datedue_date
Currencycurrency
Payment termspayment_terms
PO #purchase_order
Sendersender.name
Sender tax IDsender.tax_id
Sender addresssender.address.raw || join(sender.address.line1, line2, city, region, postal_code, country)
Receiverreceiver.name
Receiver tax IDreceiver.tax_id
Receiver addressreceiver.address.raw || join(receiver.address.line1, line2, city, region, postal_code, country)
Taxes
Output fieldJSON source or export rule
Nametaxes[].name
Ratetaxes[].rate
Basetaxes[].base
Amounttaxes[].amount
Totals
Output fieldJSON source or export rule
Subtotalsubtotal
Discountdiscount
Taxtax
Tax inclusivetax_inclusive
Withholdingswithholdings
Totaltotal
Warnings
Output fieldJSON source or export rule
#index(reconciliation_warnings[]) + 1
Warningreconciliation_warnings[]

Xero CSV

One row per line item, with receiver details repeated. If there are no items, one fallback row uses notes (or “Invoice”) as Description, 1 as Quantity, total (or subtotal) as UnitAmount, and tax as TaxAmount. Zero TaxAmount values are blank. Unmapped columns are left blank; no separate discount or withholding adjustment rows are added.

Xero CSV
Output fieldJSON source or export rule
*ContactNamereceiver.name || "Unknown customer"
EmailAddressreceiver.email
POAddressLine1receiver.address.line1
POAddressLine2receiver.address.line2
POAddressLine3Left blank
POAddressLine4Left blank
POCityreceiver.address.city
PORegionreceiver.address.region
POPostalCodereceiver.address.postal_code
POCountryreceiver.address.country
*InvoiceNumberinvoice_number || "INV-" + doc_id
Referencepurchase_order
*InvoiceDateissue_date → DD/MM/YYYY
*DueDate(due_date || issue_date) → DD/MM/YYYY
TotalLeft blank
InventoryItemCodeLeft blank
*Descriptionline_items[].description
*Quantityline_items[].quantity ?? 1
*UnitAmountline_items[].unit_price ?? (line_items[].total / (line_items[].quantity || 1))
DiscountLeft blank
*AccountCodeLeft blank
*TaxTypeLeft blank
TaxAmountline_items[].tax_amount (0 → "")
TrackingName1Left blank
TrackingOption1Left blank
TrackingName2Left blank
TrackingOption2Left blank
Currencycurrency
BrandingThemeLeft blank

QuickBooks CSV

No

Bank Statement

Issuer, statement period and accounts, each with identity, balances, totals and transactions. trnamt is signed: withdrawals are negative and deposits positive. dtposted is the posting date; dtuser is the value date.

JSON fields

Types describe serialized JSON. Parent objects and arrays are listed before their children; [] marks repeated entries. Defaulted fields need not be supplied by extraction. Decimal values serialize as strings. Downloads retain defaulted fields; a missing extracted value is not the same as an omitted JSON key.

issuer
Field pathJSON typePresence
issuerobjectDefaulted
issuer.namestring | nullDefaulted
statement
Field pathJSON typePresence
statementobjectDefaulted
statement.statement_datestring | nullDefaulted
statement.period_startstring | nullDefaulted
statement.period_endstring | nullDefaulted
statement.currency_defaultstring | nullDefaulted
statement.page_countinteger | nullDefaulted
accounts
Field pathJSON typePresence
accountsarray<object>Defaulted
accounts[].holderobjectDefaulted
accounts[].holder.namestring | nullDefaulted
accounts[].accountobjectDefaulted
accounts[].account.account_numberstring | nullDefaulted
accounts[].account.account_number_maskedstring | nullDefaulted
accounts[].account.ibanstring | nullDefaulted
accounts[].account.bicstring | nullDefaulted
accounts[].account.sort_codestring | nullDefaulted
accounts[].account.account_typestring | nullDefaulted
accounts[].account.account_namestring | nullDefaulted
accounts[].account.currencystring | nullDefaulted
accounts[].account.card_last4string | nullDefaulted
accounts[].balancesobjectDefaulted
accounts[].balances.openingobjectDefaulted
accounts[].balances.opening.amountstring | nullDefaulted
accounts[].balances.opening.as_ofstring | nullDefaulted
accounts[].balances.closingobjectDefaulted
accounts[].balances.closing.amountstring | nullDefaulted
accounts[].balances.closing.as_ofstring | nullDefaulted
accounts[].balances.availablestring | nullDefaulted
accounts[].totalsobjectDefaulted
accounts[].totals.credits_countinteger | nullDefaulted
accounts[].totals.credits_amountstring | nullDefaulted
accounts[].totals.debits_countinteger | nullDefaulted
accounts[].totals.debits_amountstring | nullDefaulted
accounts[].totals.fees_chargedstring | nullDefaulted
accounts[].totals.interest_paidstring | nullDefaulted
accounts[].totals.interest_chargedstring | nullDefaulted
accounts[].transactionsarray<object>Defaulted
accounts[].transactions[].trntypestring | nullDefaulted
accounts[].transactions[].dtpostedstring | nullDefaulted
accounts[].transactions[].dtuserstring | nullDefaulted
accounts[].transactions[].trnamtstring | nullDefaulted
accounts[].transactions[].namestring | nullDefaulted
accounts[].transactions[].memostring | nullDefaulted
accounts[].transactions[].running_balancestring | nullDefaulted
accounts[].transactions[].fitidstring | nullDefaulted
accounts[].transactions[].refnumstring | nullDefaulted
accounts[].transactions[].checknumstring | nullDefaulted
accounts[].transactions[].card_last4string | nullDefaulted
accounts[].transactions[].feestring | nullDefaulted
reconciliation_warnings
Field pathJSON typePresence
reconciliation_warningsarray<string>Defaulted

The tables map output fields to JSON paths. || means the first nonempty value; ?? means a fallback for null. Numbering, combined descriptions and formatting are export rules. Missing values generally become blank cells.

Flat exports contain transaction rows with repeated statement and account details. Non-flat output groups statement details and each account’s transactions, balances and totals. Account sections depend on the document.

Flat

Transactions repeats document and account details for each transaction. If transactions or accounts are missing, the flat exporter still writes an identity row with blank transaction fields.

Transactions (Excel / CSV / Word)
Output fieldJSON source or export rule
doc_iddoc_id
source_filenamesource_filename
bankissuer.name
account_holderaccounts[].holder.name
account_numberaccounts[].account.account_number_masked || accounts[].account.account_number || accounts[].account.iban
account_typeaccounts[].account.account_type
currencyaccounts[].account.currency || statement.currency_default
period_startstatement.period_start
period_endstatement.period_end
txn_noindex(accounts[].transactions[]) + 1
dateaccounts[].transactions[].dtposted
value_dateaccounts[].transactions[].dtuser
descriptionjoinDistinct(accounts[].transactions[].name, accounts[].transactions[].memo, " - ")
referenceaccounts[].transactions[].refnum
check_numberaccounts[].transactions[].checknum
typeaccounts[].transactions[].trntype
amountaccounts[].transactions[].trnamt
feeaccounts[].transactions[].fee
running_balanceaccounts[].transactions[].running_balance

Non-flat

Each account has its own transaction and detail tables, placed side by side in Excel and CSV. Statement details accompany the first account; warnings appear only when present. Word stacks the sections. Field/value rows are shown individually below.

Transactions
Output fieldJSON source or export rule
#index(accounts[].transactions[]) + 1
Dateaccounts[].transactions[].dtposted
Value dateaccounts[].transactions[].dtuser
DescriptionjoinDistinct(accounts[].transactions[].name, accounts[].transactions[].memo, " - ")
Referenceaccounts[].transactions[].refnum
Check #accounts[].transactions[].checknum
Typeaccounts[].transactions[].trntype
Amountaccounts[].transactions[].trnamt
Running balanceaccounts[].transactions[].running_balance
Account or card details
Output fieldJSON source or export rule
Holderaccounts[].holder.name
Account nameaccounts[].account.account_name
Account numberaccounts[].account.account_number_masked || accounts[].account.account_number
IBANaccounts[].account.iban
BICaccounts[].account.bic
Sort codeaccounts[].account.sort_code
Card last 4accounts[].account.card_last4
Account typeaccounts[].account.account_type
Currencyaccounts[].account.currency
Balances
Output fieldJSON source or export rule
Openingaccounts[].balances.opening.amount
Opening as ofaccounts[].balances.opening.as_of
Closingaccounts[].balances.closing.amount
Closing as ofaccounts[].balances.closing.as_of
Availableaccounts[].balances.available
Totals
Output fieldJSON source or export rule
Credits countaccounts[].totals.credits_count
Credits amountaccounts[].totals.credits_amount
Debits countaccounts[].totals.debits_count
Debits amountaccounts[].totals.debits_amount
Fees chargedaccounts[].totals.fees_charged
Interest paidaccounts[].totals.interest_paid
Interest chargedaccounts[].totals.interest_charged
Statement details
Output fieldJSON source or export rule
Doc IDdoc_id
Sourcesource_filename
Bankissuer.name
Statement datestatement.statement_date
Period startstatement.period_start
Period endstatement.period_end
Page countstatement.page_count
Warnings
Output fieldJSON source or export rule
#index(reconciliation_warnings[]) + 1
Warningreconciliation_warnings[]

Both exports combine transactions from all accounts. Xero skips null amounts; QuickBooks skips null and zero amounts. QuickBooks uses memo before name; a numeric-only description receives a trntype, name or “Txn” prefix. Credit-card amounts have their sign reversed. The files do not include a separate account-identity column.

Xero CSV

Xero CSV
Output fieldJSON source or export rule
*Dateaccounts[].transactions[].dtposted → DD/MM/YYYY
*Amountaccounts[].transactions[].trnamt
Payeeaccounts[].transactions[].name
DescriptionjoinDistinct(accounts[].transactions[].name, accounts[].transactions[].memo, " - ")
Referenceaccounts[].transactions[].refnum
Cheque Numberaccounts[].transactions[].checknum
Account code*Left blank
Tax Rate (Display Name)*Left blank
Tracking1Left blank
Tracking2Left blank
Transaction Typeaccounts[].transactions[].trntype
Analysis codeLeft blank

QuickBooks CSV

QuickBooks CSV
Output fieldJSON source or export rule
Dateaccounts[].transactions[].dtposted → DD/MM/YYYY
Descriptionaccounts[].transactions[].memo || accounts[].transactions[].name || accounts[].transactions[].trntype || "Transaction"
Amountaccounts[].transactions[].trnamt

Credit Card Statement

Issuer, statement period, account details, balances, credit limits, activity summaries and transactions. trnamt uses the opposite purchase convention to bank statements: charges are positive; payments and refunds are negative.

JSON fields

Types describe serialized JSON. Parent objects and arrays are listed before their children; [] marks repeated entries. Defaulted fields need not be supplied by extraction. Decimal values serialize as strings. Downloads retain defaulted fields; a missing extracted value is not the same as an omitted JSON key.

issuer
Field pathJSON typePresence
issuerobjectDefaulted
issuer.namestring | nullDefaulted
statement
Field pathJSON typePresence
statementobjectDefaulted
statement.statement_datestring | nullDefaulted
statement.period_startstring | nullDefaulted
statement.period_endstring | nullDefaulted
statement.currency_defaultstring | nullDefaulted
statement.page_countinteger | nullDefaulted
accounts
Field pathJSON typePresence
accountsarray<object>Defaulted
accounts[].holderobjectDefaulted
accounts[].holder.namestring | nullDefaulted
accounts[].accountobjectDefaulted
accounts[].account.account_numberstring | nullDefaulted
accounts[].account.account_number_maskedstring | nullDefaulted
accounts[].account.card_last4string | nullDefaulted
accounts[].account.binstring | nullDefaulted
accounts[].account.card_networkstring | nullDefaulted
accounts[].account.card_brandstring | nullDefaulted
accounts[].account.card_productstring | nullDefaulted
accounts[].account.card_typestring | nullDefaulted
accounts[].account.currencystring | nullDefaulted
accounts[].balancesobjectDefaulted
accounts[].balances.previous_balanceobjectDefaulted
accounts[].balances.previous_balance.amountstring | nullDefaulted
accounts[].balances.previous_balance.as_ofstring | nullDefaulted
accounts[].balances.new_balanceobjectDefaulted
accounts[].balances.new_balance.amountstring | nullDefaulted
accounts[].balances.new_balance.as_ofstring | nullDefaulted
accounts[].balances.statement_balancestring | nullDefaulted
accounts[].balances.minimum_payment_duestring | nullDefaulted
accounts[].balances.payment_due_datestring | nullDefaulted
accounts[].balances.past_due_amountstring | nullDefaulted
accounts[].credit_limitsobjectDefaulted
accounts[].credit_limits.credit_limitstring | nullDefaulted
accounts[].credit_limits.available_creditstring | nullDefaulted
accounts[].credit_limits.cash_advance_limitstring | nullDefaulted
accounts[].credit_limits.available_cashstring | nullDefaulted
accounts[].credit_limits.over_limit_amountstring | nullDefaulted
accounts[].summaryobjectDefaulted
accounts[].summary.previous_balancestring | nullDefaulted
accounts[].summary.paymentsstring | nullDefaulted
accounts[].summary.credits_returnsstring | nullDefaulted
accounts[].summary.purchasesstring | nullDefaulted
accounts[].summary.cash_advancesstring | nullDefaulted
accounts[].summary.balance_transfersstring | nullDefaulted
accounts[].summary.fees_chargedstring | nullDefaulted
accounts[].summary.interest_chargedstring | nullDefaulted
accounts[].summary.adjustmentsstring | nullDefaulted
accounts[].summary.new_balancestring | nullDefaulted
accounts[].transactionsarray<object>Defaulted
accounts[].transactions[].trntypestring | nullDefaulted
accounts[].transactions[].dtpostedstring | nullDefaulted
accounts[].transactions[].dtuserstring | nullDefaulted
accounts[].transactions[].trnamtstring | nullDefaulted
accounts[].transactions[].namestring | nullDefaulted
accounts[].transactions[].memostring | nullDefaulted
accounts[].transactions[].fitidstring | nullDefaulted
accounts[].transactions[].refnumstring | nullDefaulted
accounts[].transactions[].card_last4string | nullDefaulted
accounts[].transactions[].cardholder_namestring | nullDefaulted
accounts[].transactions[].is_foreignboolean | nullDefaulted
reconciliation_warnings
Field pathJSON typePresence
reconciliation_warningsarray<string>Defaulted

The tables map output fields to JSON paths. || means the first nonempty value; ?? means a fallback for null. Numbering, combined descriptions and formatting are export rules. Missing values generally become blank cells.

Flat exports contain transaction rows with repeated statement and account fields. Non-flat output includes account sections for transactions, balances, limits and summaries. Multiple accounts change the number of sections.

Flat

Transactions repeats document and account details for each transaction. If transactions or accounts are missing, the flat exporter still writes an identity row with blank transaction fields.

Transactions (Excel / CSV / Word)
Output fieldJSON source or export rule
doc_iddoc_id
source_filenamesource_filename
issuerissuer.name
cardholderaccounts[].transactions[].cardholder_name || accounts[].holder.name
card_last4accounts[].transactions[].card_last4 || accounts[].account.card_last4
card_networkaccounts[].account.card_network
card_brandaccounts[].account.card_brand
currencyaccounts[].account.currency || statement.currency_default
period_startstatement.period_start
period_endstatement.period_end
txn_noindex(accounts[].transactions[]) + 1
dateaccounts[].transactions[].dtposted
posted_dateaccounts[].transactions[].dtuser
descriptionjoinDistinct(accounts[].transactions[].name, accounts[].transactions[].memo, " - ")
referenceaccounts[].transactions[].refnum
typeaccounts[].transactions[].trntype
amountaccounts[].transactions[].trnamt
is_foreignaccounts[].transactions[].is_foreign → Yes / No / ""

Non-flat

Each account has its own transaction and detail tables, placed side by side in Excel and CSV. Statement details accompany the first account; warnings appear only when present. Word stacks the sections. Field/value rows are shown individually below.

Transactions
Output fieldJSON source or export rule
#index(accounts[].transactions[]) + 1
Dateaccounts[].transactions[].dtposted
Postedaccounts[].transactions[].dtuser
DescriptionjoinDistinct(accounts[].transactions[].name, accounts[].transactions[].memo, " - ")
Referenceaccounts[].transactions[].refnum
Typeaccounts[].transactions[].trntype
Card last 4accounts[].transactions[].card_last4 || accounts[].account.card_last4
Amountaccounts[].transactions[].trnamt
Account or card details
Output fieldJSON source or export rule
Holderaccounts[].holder.name
Card last 4accounts[].account.card_last4
Card networkaccounts[].account.card_network
Card brandaccounts[].account.card_brand
Card productaccounts[].account.card_product
Card typeaccounts[].account.card_type
Account numberaccounts[].account.account_number_masked || accounts[].account.account_number
Currencyaccounts[].account.currency
Balances
Output fieldJSON source or export rule
Previous balanceaccounts[].balances.previous_balance.amount
Previous balance as ofaccounts[].balances.previous_balance.as_of
New balanceaccounts[].balances.new_balance.amount
New balance as ofaccounts[].balances.new_balance.as_of
Statement balanceaccounts[].balances.statement_balance
Minimum paymentaccounts[].balances.minimum_payment_due
Payment due dateaccounts[].balances.payment_due_date
Past dueaccounts[].balances.past_due_amount
Credit limits
Output fieldJSON source or export rule
Credit limitaccounts[].credit_limits.credit_limit
Available creditaccounts[].credit_limits.available_credit
Cash advance limitaccounts[].credit_limits.cash_advance_limit
Available cashaccounts[].credit_limits.available_cash
Over limitaccounts[].credit_limits.over_limit_amount
Activity summary
Output fieldJSON source or export rule
Previous balanceaccounts[].summary.previous_balance
Paymentsaccounts[].summary.payments
Credits / returnsaccounts[].summary.credits_returns
Purchasesaccounts[].summary.purchases
Cash advancesaccounts[].summary.cash_advances
Balance transfersaccounts[].summary.balance_transfers
Fees chargedaccounts[].summary.fees_charged
Interest chargedaccounts[].summary.interest_charged
Adjustmentsaccounts[].summary.adjustments
New balanceaccounts[].summary.new_balance
Statement details
Output fieldJSON source or export rule
Doc IDdoc_id
Sourcesource_filename
Issuerissuer.name
Statement datestatement.statement_date
Period startstatement.period_start
Period endstatement.period_end
Page countstatement.page_count
Warnings
Output fieldJSON source or export rule
#index(reconciliation_warnings[]) + 1
Warningreconciliation_warnings[]

Both exports combine transactions from all accounts. Xero skips null amounts; QuickBooks skips null and zero amounts. QuickBooks uses memo before name; a numeric-only description receives a trntype, name or “Txn” prefix. Credit-card amounts have their sign reversed. The files do not include a separate account-identity column.

Xero CSV

Xero CSV
Output fieldJSON source or export rule
*Dateaccounts[].transactions[].dtposted → DD/MM/YYYY
*Amount−accounts[].transactions[].trnamt
Payeeaccounts[].transactions[].name
DescriptionjoinDistinct(accounts[].transactions[].name, accounts[].transactions[].memo, " - ")
Referenceaccounts[].transactions[].refnum
Cheque NumberLeft blank
Account code*Left blank
Tax Rate (Display Name)*Left blank
Tracking1Left blank
Tracking2Left blank
Transaction Typeaccounts[].transactions[].trntype
Analysis codeLeft blank

QuickBooks CSV

QuickBooks CSV
Output fieldJSON source or export rule
Dateaccounts[].transactions[].dtposted → DD/MM/YYYY
Descriptionaccounts[].transactions[].memo || accounts[].transactions[].name || accounts[].transactions[].trntype || "Transaction"
Amount−accounts[].transactions[].trnamt

Paystub/Payslip

Pay period, employee and employer, rates, earnings, deductions, taxes, employer contributions and totals. current_amount refers to this period; ytd_amount is year to date.

JSON fields

Types describe serialized JSON. Parent objects and arrays are listed before their children; [] marks repeated entries. Defaulted fields need not be supplied by extraction. Decimal values serialize as strings. Downloads retain defaulted fields; a missing extracted value is not the same as an omitted JSON key.

statement
Field pathJSON typePresence
statementobjectDefaulted
statement.issue_datestring | nullDefaulted
statement.pay_datestring | nullDefaulted
statement.period_startstring | nullDefaulted
statement.period_endstring | nullDefaulted
statement.period_typestring | nullDefaulted
statement.tax_yearinteger | nullDefaulted
statement.currencystring | nullDefaulted
statement.countrystring | nullDefaulted
employee
Field pathJSON typePresence
employeeobjectDefaulted
employee.namestring | nullDefaulted
employee.pay_frequencystring | nullDefaulted
employee.employment_typestring | nullDefaulted
employee.employment_statusstring | nullDefaulted
employee.filing_statusstring | nullDefaulted
employee.tax_codestring | nullDefaulted
employer
Field pathJSON typePresence
employerobjectDefaulted
employer.namestring | nullDefaulted
rates
Field pathJSON typePresence
ratesobjectDefaulted
rates.base_pay_ratestring | nullDefaulted
rates.base_pay_unitstring | nullDefaulted
rates.annual_salarystring | nullDefaulted
rates.regular_hours_per_periodstring | nullDefaulted
rates.overtime_multiplierstring | nullDefaulted
earnings
Field pathJSON typePresence
earningsarray<object>Defaulted
earnings[].codestring | nullDefaulted
earnings[].descriptionstring | nullDefaulted
earnings[].categorystring | nullDefaulted
earnings[].jurisdictionstring | nullDefaulted
earnings[].hoursstring | nullDefaulted
earnings[].ratestring | nullDefaulted
earnings[].current_amountstring | nullDefaulted
earnings[].ytd_amountstring | nullDefaulted
earnings[].employer_matchstring | nullDefaulted
earnings[].employer_match_ytdstring | nullDefaulted
earnings[].is_taxableboolean | nullDefaulted
earnings[].is_imputedboolean | nullDefaulted
earnings[].memostring | nullDefaulted
pre_tax_deductions
Field pathJSON typePresence
pre_tax_deductionsarray<object>Defaulted
pre_tax_deductions[].codestring | nullDefaulted
pre_tax_deductions[].descriptionstring | nullDefaulted
pre_tax_deductions[].categorystring | nullDefaulted
pre_tax_deductions[].jurisdictionstring | nullDefaulted
pre_tax_deductions[].hoursstring | nullDefaulted
pre_tax_deductions[].ratestring | nullDefaulted
pre_tax_deductions[].current_amountstring | nullDefaulted
pre_tax_deductions[].ytd_amountstring | nullDefaulted
pre_tax_deductions[].employer_matchstring | nullDefaulted
pre_tax_deductions[].employer_match_ytdstring | nullDefaulted
pre_tax_deductions[].is_taxableboolean | nullDefaulted
pre_tax_deductions[].is_imputedboolean | nullDefaulted
pre_tax_deductions[].memostring | nullDefaulted
taxes
Field pathJSON typePresence
taxesarray<object>Defaulted
taxes[].codestring | nullDefaulted
taxes[].descriptionstring | nullDefaulted
taxes[].categorystring | nullDefaulted
taxes[].jurisdictionstring | nullDefaulted
taxes[].hoursstring | nullDefaulted
taxes[].ratestring | nullDefaulted
taxes[].current_amountstring | nullDefaulted
taxes[].ytd_amountstring | nullDefaulted
taxes[].employer_matchstring | nullDefaulted
taxes[].employer_match_ytdstring | nullDefaulted
taxes[].is_taxableboolean | nullDefaulted
taxes[].is_imputedboolean | nullDefaulted
taxes[].memostring | nullDefaulted
post_tax_deductions
Field pathJSON typePresence
post_tax_deductionsarray<object>Defaulted
post_tax_deductions[].codestring | nullDefaulted
post_tax_deductions[].descriptionstring | nullDefaulted
post_tax_deductions[].categorystring | nullDefaulted
post_tax_deductions[].jurisdictionstring | nullDefaulted
post_tax_deductions[].hoursstring | nullDefaulted
post_tax_deductions[].ratestring | nullDefaulted
post_tax_deductions[].current_amountstring | nullDefaulted
post_tax_deductions[].ytd_amountstring | nullDefaulted
post_tax_deductions[].employer_matchstring | nullDefaulted
post_tax_deductions[].employer_match_ytdstring | nullDefaulted
post_tax_deductions[].is_taxableboolean | nullDefaulted
post_tax_deductions[].is_imputedboolean | nullDefaulted
post_tax_deductions[].memostring | nullDefaulted
employer_contributions
Field pathJSON typePresence
employer_contributionsarray<object>Defaulted
employer_contributions[].codestring | nullDefaulted
employer_contributions[].descriptionstring | nullDefaulted
employer_contributions[].categorystring | nullDefaulted
employer_contributions[].jurisdictionstring | nullDefaulted
employer_contributions[].hoursstring | nullDefaulted
employer_contributions[].ratestring | nullDefaulted
employer_contributions[].current_amountstring | nullDefaulted
employer_contributions[].ytd_amountstring | nullDefaulted
employer_contributions[].employer_matchstring | nullDefaulted
employer_contributions[].employer_match_ytdstring | nullDefaulted
employer_contributions[].is_taxableboolean | nullDefaulted
employer_contributions[].is_imputedboolean | nullDefaulted
employer_contributions[].memostring | nullDefaulted
totals
Field pathJSON typePresence
totalsobjectDefaulted
totals.gross_pay_currentstring | nullDefaulted
totals.gross_pay_ytdstring | nullDefaulted
totals.taxable_gross_currentstring | nullDefaulted
totals.taxable_gross_ytdstring | nullDefaulted
totals.total_pre_tax_deductions_currentstring | nullDefaulted
totals.total_pre_tax_deductions_ytdstring | nullDefaulted
totals.total_taxes_currentstring | nullDefaulted
totals.total_taxes_ytdstring | nullDefaulted
totals.total_post_tax_deductions_currentstring | nullDefaulted
totals.total_post_tax_deductions_ytdstring | nullDefaulted
totals.total_deductions_currentstring | nullDefaulted
totals.total_deductions_ytdstring | nullDefaulted
totals.total_employer_contributions_currentstring | nullDefaulted
totals.total_employer_contributions_ytdstring | nullDefaulted
totals.net_pay_currentstring | nullDefaulted
totals.net_pay_ytdstring | nullDefaulted
totals.hours_worked_currentstring | nullDefaulted
totals.hours_worked_ytdstring | nullDefaulted
reconciliation_warnings
Field pathJSON typePresence
reconciliation_warningsarray<string>Defaulted

The tables map output fields to JSON paths. || means the first nonempty value; ?? means a fallback for null. Numbering, combined descriptions and formatting are export rules. Missing values generally become blank cells.

There is no flat/non-flat choice. The Paystub sheet uses sections for statement, employee, employer, rates, earnings, deductions, taxes, contributions and totals. CSV is a sectioned grid; Word stacks sections vertically.

Dedicated layout

These are the sections of the Paystub layout, placed side by side in Excel and CSV and stacked in Word. Descriptions use description or code and append “imputed” when is_imputed is true and “non-taxable” when is_taxable is false. Rate columns use percentage formatting. Totals pair Current and YTD values for each Metric. Warnings appear only when present.

Totals
Output fieldJSON source or export rule
Gross pay / Currenttotals.gross_pay_current
Gross pay / YTDtotals.gross_pay_ytd
Taxable gross / Currenttotals.taxable_gross_current
Taxable gross / YTDtotals.taxable_gross_ytd
Pre-tax deductions / Currenttotals.total_pre_tax_deductions_current
Pre-tax deductions / YTDtotals.total_pre_tax_deductions_ytd
Taxes / Currenttotals.total_taxes_current
Taxes / YTDtotals.total_taxes_ytd
Post-tax deductions / Currenttotals.total_post_tax_deductions_current
Post-tax deductions / YTDtotals.total_post_tax_deductions_ytd
Total deductions / Currenttotals.total_deductions_current
Total deductions / YTDtotals.total_deductions_ytd
Employer contributions / Currenttotals.total_employer_contributions_current
Employer contributions / YTDtotals.total_employer_contributions_ytd
Net pay / Currenttotals.net_pay_current
Net pay / YTDtotals.net_pay_ytd
Hours worked / Currenttotals.hours_worked_current
Hours worked / YTDtotals.hours_worked_ytd
Statement details
Output fieldJSON source or export rule
Doc IDdoc_id
Sourcesource_filename
Issue datestatement.issue_date
Pay datestatement.pay_date
Period startstatement.period_start
Period endstatement.period_end
Period typestatement.period_type
Tax yearstatement.tax_year
Currencystatement.currency
Countrystatement.country
Employee
Output fieldJSON source or export rule
Nameemployee.name
Pay frequencyemployee.pay_frequency
Employment typeemployee.employment_type
Employment statusemployee.employment_status
Filing statusemployee.filing_status
Tax codeemployee.tax_code
Employer
Output fieldJSON source or export rule
Nameemployer.name
Pay rates
Output fieldJSON source or export rule
Base pay raterates.base_pay_rate
Base pay unitrates.base_pay_unit
Annual salaryrates.annual_salary
Regular hours/periodrates.regular_hours_per_period
Overtime multiplierrates.overtime_multiplier
Earnings
Output fieldJSON source or export rule
#index(earnings[]) + 1
Descriptionearnings[].description || earnings[].code
Codeearnings[].code
Hoursearnings[].hours
Rateearnings[].rate
Currentearnings[].current_amount
YTDearnings[].ytd_amount
Memoearnings[].memo
Pre-tax deductions
Output fieldJSON source or export rule
#index(pre_tax_deductions[]) + 1
Descriptionpre_tax_deductions[].description || pre_tax_deductions[].code
Codepre_tax_deductions[].code
Currentpre_tax_deductions[].current_amount
YTDpre_tax_deductions[].ytd_amount
Memopre_tax_deductions[].memo
Taxes
Output fieldJSON source or export rule
#index(taxes[]) + 1
Descriptiontaxes[].description || taxes[].code
Codetaxes[].code
Jurisdictiontaxes[].jurisdiction
Ratetaxes[].rate
Currenttaxes[].current_amount
YTDtaxes[].ytd_amount
Post-tax deductions
Output fieldJSON source or export rule
#index(post_tax_deductions[]) + 1
Descriptionpost_tax_deductions[].description || post_tax_deductions[].code
Codepost_tax_deductions[].code
Currentpost_tax_deductions[].current_amount
YTDpost_tax_deductions[].ytd_amount
Memopost_tax_deductions[].memo
Employer contributions
Output fieldJSON source or export rule
#index(employer_contributions[]) + 1
Descriptionemployer_contributions[].description || employer_contributions[].code
Codeemployer_contributions[].code
Currentemployer_contributions[].current_amount
YTDemployer_contributions[].ytd_amount
Warnings
Output fieldJSON source or export rule
#index(reconciliation_warnings[]) + 1
Warningreconciliation_warnings[]

Xero CSV

No

QuickBooks CSV

No

Image of Table

The table’s title, header rows, body cells and notes. headers and rows[].cells follow the source columns; they are not a fixed financial schema. Row type identifies data, subtotal or other row roles.

JSON fields

Types describe serialized JSON. Parent objects and arrays are listed before their children; [] marks repeated entries. Defaulted fields need not be supplied by extraction. Decimal values serialize as strings. Downloads retain defaulted fields; a missing extracted value is not the same as an omitted JSON key.

Document
Field pathJSON typePresence
titlestring | nullDefaulted
captionstring | nullDefaulted
source_typestring | nullDefaulted
border_stylestring | nullDefaulted
languagestring | nullDefaulted
header_rowsinteger | nullDefaulted
notesstring | nullDefaulted
headers
Field pathJSON typePresence
headersarray<array<any>>Defaulted
rows
Field pathJSON typePresence
rowsarray<object>Defaulted
rows[].typestring | nullDefaulted
rows[].cellsarray<any>Defaulted
reconciliation_warnings
Field pathJSON typePresence
reconciliation_warningsarray<string>Defaulted

The tables map output fields to JSON paths. || means the first nonempty value; ?? means a fallback for null. Numbering, combined descriptions and formatting are export rules. Missing values generally become blank cells.

There is no flat/non-flat choice. A single Table sheet uses the extracted headers and cells. The number of columns is dynamic; titles, notes and warnings can add rows. CSV cannot preserve Excel cell merging or styling.

Dedicated layout

Column names come from headers, not a fixed list. Body cells retain their order; short rows are padded and null cells become blank. title and caption appear above the grid, notes and warnings below. Repeated adjacent header values merge in Excel. rows[].type controls Excel/Word styling, not an extra output column. CSV has no styling. A warnings row can use two columns even when the data grid has only one.

Table structure
Output fieldJSON source or export rule
titletitle
captioncaption
headers[][]headers[][]
rows[].cells[]rows[].cells[]
Row formatting (Excel / Word)rows[].type → DATA | HEADER | SECTION | SUBTOTAL | GRAND_TOTAL
Grid widthmax(length(headers[]), length(rows[].cells)) || 1
Notesnotes
#index(reconciliation_warnings[]) + 1
Reconciliation warningsreconciliation_warnings[]

Xero CSV

No

QuickBooks CSV

No

Missing values and reviewing results

Nullable fields can contain null; missing lists default to []. Nested objects can have their own default fields. Spreadsheet exporters commonly render missing values as blank cells. Dates and amounts may be normalized, and reconciliation can derive missing totals or add warnings. doc_id and source_filename are export metadata, not extracted financial fields.

Review the source and the exported values. An empty reconciliation_warnings list does not prove accuracy.

Schemas and export layouts | ScanToExcel