HomeBooks

The book file

The format of a HomeBooks book file, version 1

Your books are yours. An owner of a book can download the whole book at any time, under Settings, Book file: every setting and every record ever entered, in one file that a person can read and a program can read. The same file restores the book, here or on any other HomeBooks. This page describes the file so that you, or anyone you hand it to, can use it without us.

What is in the file

The download is a ZIP file named for the book and the day, ending .homebooks.zip. It holds:

book.json

One JSON document in UTF-8: a header, then sections. The header's fields come before sections.

FieldWhat it holds
formatAlways HomeBooks book file.
format_version1. See Versions below.
migrationThe version of the HomeBooks database the file was made from. The sections and fields of a file are those of that version.
made_atWhen the file was made (UTC).
made_byThe id, in People, of the person who made it; null for a file HomeBooks made by itself.
bookThe book's id and name.
quickbooks_recordsfalse when the person left out the records and reports as QuickBooks sent them (the sections QuickBooks records and QuickBooks reports).
left_outThe secrets that are not in the file, each as section.field.
countsHow many rows each section holds, by the section's name.
sectionsA list. Each section has a name, a title in plain words, and rows: a list of objects, one per record, each on a line of its own.

Values

What is not in the file

No password, no sign-in detail, and no key or token of a connection to a bank or to QuickBooks. The file still says that each connection existed and what it was connected to; the fields left out are listed in left_out and marked below. A person's own settings (their password, two-factor, email sending) belong to the person, not to a book, and are not in a book's file.

Restoring a file

In HomeBooks, an owner restores a file under Settings, Book file; the platform administrator can restore one for a person who has no book. A restore always makes a new book and replaces nothing. Before anything is saved the file is checked: each section holds the rows the header counts, every entry balances, every row a row names is in the file, and every value fits the books' own rules. A file that fails a check is refused whole, with the reason.

In the new book every record has a new id. The person who restores it is its owner and its only member. The members, the invitations and the connections the file lists are shown for the owner to invite and connect again; the sections marked "listed, not restored" below are not carried. The people the records name are kept as names: nobody gets access by being named in a file.

Versions

format_version changes only when what this page calls the file changes: the header, the shape of a section, or how a value is written. It does not change when HomeBooks gains a table or a field: a newer file then simply has a section or a field more, and migration says which version of the database it came from.

Every file ever made stays restorable. An older file is loaded as the version it was made at and brought forward by the same steps that brought HomeBooks itself forward; there is no converter to fall out of date. A file made by a newer HomeBooks than the one restoring it is refused.

The CSV copies

Comma-separated, UTF-8, with a heading row. Amounts and dates are written as in book.json. A text that begins with =, +, - or @ is written with an apostrophe before it, so that a spreadsheet does not run it as a formula; book.json holds it as it is.

FileColumns
accounts.csvNumber, Name, Type, Kind, Sub-account of, Default use, Schedule C line, Active
journal.csvEntry, Date, Status, Reference, Payee, Memo, Line, Account number, Account, Debit, Credit, Use, Tag, Line memo, Line contact, Source, Reverses entry, Entered by, Entered at
contacts.csvName, Customer, Vendor, Job of, Active, Billing address, Shipping address, Terms days, Tax exempt, Phones, Emails
invoices.csvKind, Number, Customer, Date, Due date, Status, Line, Description, Quantity, Unit price, Amount, Taxable, Subtotal, Tax, Total, Memo
payments.csvDate, Customer, Amount, Method, Reference, Deposit account, Memo, Applied to

Sections

In the order they stand in the file. This is the current version; an older file may lack a section or a field listed here.

Book

book. The book itself: one row. Every other section holds rows of this book.

FieldTypeWhat it holds
book_ididThe id of the book. Every row of every other section carries it.
nametext
fiscal_year_start_monthwhole numberThe month the fiscal year starts in, 1 (January) to 12. Year-end closes and reports read it.
locked_throughdate, or nullThe locked period: no entry may be dated on or before this date. Empty when nothing is locked.
time_zonetextThe time zone of the book as an IANA name (America/Chicago). Today in the book is read in it.
created_attime
practice_ofid, or nullOn a practice copy, the book (Book) it was copied from. Empty on an ordinary book.
book_typetexthome, business (shown as Small business) or both. It decides only what the screens show and how a new book starts.
book_type_chosentrue or falseWhether a person has picked the book type. False on a new book until its setup or its QuickBooks connection asks.
backup_scheduletextHow often a backup copy of the book is made by schedule: daily, weekly or off.

Chart of accounts

account. One row per account. Entry lines, budgets, rules and documents point here.

FieldTypeWhat it holds
idid
book_idid
typetextasset, liability, equity, income or expense.
parent_idid, or nullThe account (Chart of accounts) this one is a sub-account of. Empty for a top-level account.
numbertext, or nullThe account number as shown on the chart (No.). Free text, optional, unique in the book.
nametext
activetrue or false
created_attime
kindtext, or nullOptional. Asset: bank, cash, fixed_asset, accumulated_depreciation. Liability: credit_card, line_of_credit, loan. Equity: opening_balance_equity. Income: other_income. Expense: cost_of_goods_sold, other_expense.
schedule_ctext, or nullThe line of IRS Schedule C (Form 1040) the account is reported on, such as 8 or 27b. Empty when it has none.
default_usetext, or nullpersonal or business: the use a line on this income or expense account takes when none is given. Empty: the nearest parent that has one, else personal.

Number counters

book_counter. One row per number sequence of the book. Entries and sales documents take their numbers from these.

FieldTypeWhat it holds
book_idid
nametextWhich sequence: txn (entries), invoice, receipt (sales receipts) or credit_memo.
last_valuewhole numberThe last number given out in that sequence.

Members

book_member. One row per person who may open the book, with their role. Listed, not restored.

FieldTypeWhat it holds
book_idid
user_ididThe person who is a member.
roletextowner, editor, viewer or accountant.
created_attime

People

book_person. One row per person the records of the book name: who entered, changed or sent what. A file lists everyone named; no password or sign-in detail is in it.

FieldTypeWhat it holds
book_idid
ididWhat the other sections name the person by, in fields such as created_by, user_id and sent_by.
display_nametext
emailtext

Bank connections

feed_connection. One row per connection of the book to a bank-data provider. A disconnected connection keeps its row. Its accounts are in Bank feed accounts. Listed, not restored.

FieldTypeWhat it holds
idid
book_idid
providertextsimplefin or plaid.
nametextThe name shown for the connection: the name of the bank for Plaid, of the provider for SimpleFIN.
secret_enctextA secret: not in the file.
connected_byid
connected_attime
disconnected_byid, or null
disconnected_attime, or nullWhen an owner disconnected it. Empty while the connection is open.
last_fetch_attime, or nullWhen the provider was last asked.
last_ok_attime, or nullWhen the provider last answered without a failure.
scheduled_attime, or nullWhen the scheduled (daily) fetch last ran for this connection.
error_statuswhole number, or nullThe status code of the last failure, in the style of an HTTP status (0: no answer). Empty after a fetch that worked.
errortext, or nullThe message of the last failure, for the screen of the owner. Empty after a fetch that worked.
problemslist of textA list of the messages the provider itself sent with its last answer.
listedlist of textA list of the provider account ids (external_id in Bank feed accounts) its last answer listed.
requests_daydate, or nullThe day the requests count is for.
requestswhole numberHow many requests were made to the provider on requests_day, counted against its daily limit.
external_idtext, or nullThe Plaid item id of the connection. Empty for SimpleFIN.
institution_idtext, or nullThe Plaid id of the bank.
environmenttext, or nullThe Plaid environment the connection was made in: sandbox or production.
cursor_enctextA secret: not in the file.
sign_intext, or nullWhy the bank wants a new sign-in, as a Plaid code. Empty when none is needed.
sign_in_untiltext, or nullWhat clears that request: sync (the next sync that works) or window (the person signing in again through Plaid).
ends_attime, or nullThe date Plaid announced the bank sign-in will end.
consent_expirestime, or nullWhen the consent given at the bank to share data ends, as Plaid reports it.
new_accountstrue or falseTrue when Plaid reported new accounts at the bank that can be added.
last_webhook_attime, or nullWhen Plaid last sent a notice (webhook) about this connection.
webhooktext, or nullThe address Plaid posts its notices to.

Plaid keys

feed_plaid_keys. The Plaid keys of the book itself: at most one row. The secret is left out of the file. Listed, not restored.

FieldTypeWhat it holds
idid
book_idid
client_idtextThe Plaid client id of the Plaid team the household has.
secret_enctextA secret: not in the file.
environmenttextsandbox or production.
plantexttrial or paid: the Plaid plan the owner says the team is on.
saved_byid
saved_attime

Invitations

invitation. One row per invitation to join the book, sent to an email address. The secret token of the invitation is left out of the file. Listed, not restored.

FieldTypeWhat it holds
idid
book_idid
book_nametextThe name of the book when the invitation was made.
emailtextThe address the invitation was sent to. Only that person can accept it.
roletextThe role the person joins with: owner, editor, viewer or accountant.
token_hashtextA secret: not in the file.
invited_byid
created_attime
expires_attime
accepted_attime, or nullWhen it was accepted. Empty while it is open.
cancelled_attime, or nullWhen it was cancelled. A cancelled invitation cannot be accepted.

QuickBooks connection

qbo_connection. The connection of the book to a QuickBooks Online company: at most one row. The tokens are left out of the file. Listed, not restored.

FieldTypeWhat it holds
idid
book_idid
realm_idtextThe id Intuit gives the connected QuickBooks company.
environmenttextThe Intuit environment: sandbox or production.
company_nametext, or nullThe name of the company as QuickBooks gives it.
refresh_token_enctextA secret: not in the file.
refresh_expires_attime, or nullWhen the stored refresh token expires. Empty once disconnected.
access_token_enctextA secret: not in the file.
access_expires_attime, or nullWhen the stored access token expires. Empty once disconnected.
minorversiontextThe minor version of the Intuit API the connection asks for.
connected_attime
api_callswhole numberHow many metered calls to Intuit this connection has made in all.
statetextshadow (the book follows QuickBooks and nothing is entered here) or cut_over (HomeBooks is the books and nothing more comes from QuickBooks).
cut_over_attime, or nullWhen the book was cut over. Set exactly when state is cut_over.
cut_over_byid, or nullThe person who cut the book over.
calls_monthdate, or nullThe first day of the calendar month (UTC) that calls_in_month counts.
calls_in_monthwhole numberHow many metered calls to Intuit were made in that month.
disconnected_attime, or nullWhen an owner disconnected QuickBooks. The row stays so the book keeps its state and history.
disconnected_byid, or null
revoke_refusedtext, or nullThe answer Intuit gave when it did not confirm that the token was revoked at disconnect. Empty otherwise.
cut_over_monthswhole number, or nullHow many month-ends were compared with QuickBooks at the cut over. Frozen then.
cut_over_months_outwhole number, or nullHow many of those month-ends were out of balance at the cut over.
cut_over_locked_throughdate, or nullThe locked period the cut over set from the QuickBooks closing date.
cut_over_locked_beforedate, or nullThe locked period that stood before the cut over set its own.

QuickBooks pulls

qbo_pull_attempt. One row per attempt to pull data from QuickBooks and build the ledger from it: when it ran, how it ended and whether the books tie out.

FieldTypeWhat it holds
idid
book_idid
kindtextfull (everything) or changes (what QuickBooks reports as changed since the last pull).
reasontext, or nullWhy a full pull ran, in words, such as requested or first full pull. Empty for a changes pull.
full_neededtrue or falseTrue when the full pull ran because something required it, not because it was asked for or due by the calendar.
started_attimeWhen the attempt began, before its first call to Intuit.
stored_attime, or nullWhen the attempt first stored anything from QuickBooks. Empty when it stored nothing.
finished_attime, or nullWhen the attempt ended. Empty while outcome is running.
outcometextrunning, no_answer (QuickBooks gave no answer before anything was stored), not_trusted (the changes could not be relied on), failed or built.
failuretext, or nullWhat ended a failed attempt: a HomeBooks message or the kind of fault, never the text of the fault.
lists_failedJSONJSON object: each QuickBooks list the attempt asked for and did not get, with why.
reports_failedJSONJSON list: each report the attempt asked for and did not get, as report, end_date and why.
callswhole numberHow many metered calls to Intuit the attempt made.
tieJSON, or nullJSON list: for each month-end compared with QuickBooks (as_of), how many accounts differ (differences). Set only when outcome is built.
resultJSON, or nullJSON: the result of the run as the QuickBooks page shows it, kept on the attempt that ended the run.
building_attime, or nullWhen the attempt began writing the ledger. Empty when it never came to build.

QuickBooks records

qbo_record. One row per record pulled from QuickBooks, kept exactly as QuickBooks returned it. A later pull replaces a record in place.

FieldTypeWhat it holds
idid
book_idid
entitytextThe QuickBooks record type: Account, Customer, Vendor, Item, Invoice, Payment, Purchase, Deposit, JournalEntry and so on.
qbo_idtextThe QuickBooks id of the record, unique within its type.
sync_tokentext, or nullThe version counter QuickBooks keeps for the record (SyncToken), as last received.
minorversiontextThe minor version of the Intuit API the record was pulled with.
bodyJSONJSON: the record exactly as QuickBooks returned it.
pulled_attime
deleted_attime, or nullWhen QuickBooks reported the record as deleted. The record is kept as last received.

QuickBooks reports

qbo_report. One row per report pulled from QuickBooks for one period, kept as returned. The ledger is built and tied out from these.

FieldTypeWhat it holds
idid
book_idid
nametextThe report: JournalReport, TrialBalance or GeneralLedger.
start_datedateThe first day of the period the report was asked for.
end_datedateThe last day of the period the report was asked for.
bodyJSONJSON: the report exactly as QuickBooks returned it.
pulled_attime

Reports sent

report_email. The log of reports sent by email: one row when a send starts and one for how it ended. The message and the PDF are not stored.

FieldTypeWhat it holds
idid
book_idid
reporttextWhich report, as a short code: profit-and-loss, balance-sheet, trial-balance, cash-flow, schedule-c, budget, reconciliation, ar-aging, general-ledger, account-review.
titletextThe title of the report as printed, such as Profit and loss.
periodtextThe period or date the report covers, in words as printed on it.
paramsJSONJSON: what the report was asked for. Only the fields given: start, end, as_of, year, from_month, to_month, reconciliation_id, account_ids and so on.
sent_attime
sent_byid
from_addresstext
to_addresstext
cc_addresseslist of textA list of the addresses copied.
subjecttext
outcometextsending (the send was started), sent or failed. A sending row with no sent or failed row for the same send_key was never confirmed.
errortext, or nullWhat the mail server said. Set exactly when outcome is failed.
send_keyidThe id of one press of Send. The sending row and its sent or failed row share it.
platform_mailtrue or falseTrue when the send went through HomeBooks mail, the mail server of the installation, and not the sender's own. False on rows from before HomeBooks mail.

Support access

support_grant. One row per grant of time-limited support access that an owner gave the platform administrator.

FieldTypeWhat it holds
idid
book_idid
leveltextviewer (view only) or editor (may edit as an editor would). Never owner powers.
notetext, or nullThe note the owner wrote on the grant.
granted_byid
created_attime
expires_attimeWhen the grant runs out: at most 7 days after it was made.
ended_attime, or nullWhen an owner ended the grant early. Empty otherwise.
ended_byid, or null
first_used_attime, or nullWhen the platform administrator first used the grant.
last_used_attime, or nullWhen the platform administrator last used the grant.

History

audit_event. One row per recorded change: who did what, to which record, and when. Rows are never changed or deleted.

FieldTypeWhat it holds
idid
book_idid
user_idid, or nullThe person who did it. Empty for what no person did, such as a scheduled bank fetch or a migration.
attimeWhen it happened: the time of the database transaction that made the change.
actiontextWhat was done, as a dotted code: txn.post, txn.void, account.kind, feed.fetch, qbo.pull and so on.
entitytextThe kind of record the event is about, by its table name: txn, account, payee, invoice, bank_line, book and so on.
entity_idid, or nullThe id of that record in the section entity names. A few events carry another identifier here, or none.
beforeJSON, or nullJSON: the values before the change, for the fields this event records. Empty when there were none.
afterJSON, or nullJSON: the values after the change, or the details of what was done. Empty when there are none.
support_grant_idid, or nullThe grant (Support access) in force when the platform administrator, who is no member, made this change. Empty otherwise.

Imported bank files

bank_import. One row per bank file imported into a bank or card account. Its lines are in Bank lines.

FieldTypeWhat it holds
idid
book_idid
account_ididThe bank or card account (Chart of accounts) the file was imported into.
filenametext
formattextThe format of the file: ofx, qfx, qbo (a Web Connect file, not QuickBooks Online) or csv.
imported_byid, or null
imported_attime
line_countwhole numberHow many lines of the file were staged as new bank lines.
duplicate_countwhole numberHow many lines of the file were already there and were not staged again.
statement_balanceamount, as text, or nullThe ending balance the file states (an OFX ledger balance), with the sign the file gives it. Empty when the file states none.
statement_datedate, or nullThe date the file gives for that balance.
csv_mappingJSON, or nullJSON: for a CSV, which column number holds the date, amount or debit and credit, description, memo, reference and id, plus has_header, negate and date_order.

Budgets

budget. One row per income or expense account, year and month: the amount planned. Actual figures are read from Entry lines, never stored here.

FieldTypeWhat it holds
idid
book_idid
account_ididThe income or expense account (Chart of accounts) the amount is planned for.
yearwhole numberThe calendar year.
monthwhole numberThe calendar month of that year, 1 to 12.
amountamount, as textThe amount planned for the month, never negative: the income expected, or the expense allowed.

Bank feed accounts

feed_account. One row per account a bank connection lists, and the account of the book it feeds, if any. Listed, not restored.

FieldTypeWhat it holds
idid
book_idid
connection_ididThe connection (Bank connections) that lists the account.
external_idtextThe id the provider gives the account.
nametextThe name of the account as the provider gives it.
banktextThe name of the bank as the provider gives it. May be empty.
currencytext, or nullThe currency of the account as the provider gives it.
account_idid, or nullThe bank or card account (Chart of accounts) this feed account feeds. Empty when it feeds none.
start_datedate, or nullThe first day whose transactions are taken. Set exactly when account_id is set.
backfill_fromdate, or nullThe start of earlier days still to be fetched, when the start date reaches back past the regular fetch. Empty when nothing waits.
created_attime
masktext, or nullThe last digits of the account number, as Plaid gives them.
kindtext, or nullThe type of the account as Plaid gives it: depository, credit, loan and so on.
paired_withid, or nullOn a SimpleFIN account that feeds nothing: the Plaid account (Bank feed accounts) of the same bank and last four digits whose blanked descriptions it fills.

Loan terms

loan_term. One row per day the terms of a Loan account change. A row holds only what changed that day; a field with no value means as before.

FieldTypeWhat it holds
idid
book_idid
account_ididThe Loan account (Chart of accounts) the terms are of.
starts_ondateThe day these terms begin.
interest_methodtext, or nullHow interest is calculated: monthly (balance x rate / 12) or daily (balance x rate / 365 x days).
ratedecimal number, as text, or nullThe yearly interest rate as a percentage, 0 to 100: 6.5 is 6.5%.
payments_duetext, or nullmonthly, quarterly or annually.
due_daywhole number, or nullThe day of the month a payment is due, 1 to 31.
due_monthwhole number, or nullThe month a yearly payment is due, or one of the four a quarterly payment is due, 1 to 12.
payment_typetext, or nullinterest_only or amortized.
payment_amountamount, as text, or nullThe regular payment of principal and interest. An amortized loan has one.
maturitydate, or nullThe maturity date of the loan.
escrow_amountamount, as text, or nullThe escrow paid with each payment; 0.00 for none.
escrow_account_idid, or nullThe asset account (Chart of accounts) escrow is paid into.
interest_account_idid, or nullThe expense account (Chart of accounts) the interest goes to.
created_attime

Contacts

payee. One row per contact: anyone the book pays or bills. Customers and vendors are contacts with that role.

FieldTypeWhat it holds
idid
book_idid
nametext
is_customertrue or falseTrue when the contact is a customer. A contact may be a customer, a vendor, both or neither.
is_vendortrue or falseTrue when the contact is a vendor.
default_account_idid, or nullNo longer used. The account a contact was last paid from is now read from the ledger.
tax_exempttrue or falseTrue when the customer pays no sales tax.
activetrue or false
created_attime
billing_addresstext, or null
terms_dayswhole number, or nullThe payment terms of the customer in days, 0 to 365. A new invoice starts from it.
tax_certificatetext, or nullThe tax exemption certificate number of the customer.
shipping_addresstext, or null
merged_into_idid, or nullOn a contact merged into another, the contact (Contacts) that survives. Records that name this contact are read as naming the survivor.
job_of_idid, or nullFor a QuickBooks job (sub-customer), the customer (Contacts) it is a job of.

Products and services

product. One row per product or service sold. Document lines may point here.

FieldTypeWhat it holds
idid
book_idid
nametext
descriptiontext, or null
unit_pricedecimal number, as textThe price a new document line starts from. Up to five decimals.
income_account_ididThe income account (Chart of accounts) its sales are posted to.
taxabletrue or falseWhether sales tax applies to it by default.
activetrue or false
created_attime

Statements

reconciliation. One row per bank or card statement reconciled against an account. Its cleared lines are in Cleared lines.

FieldTypeWhat it holds
idid
book_idid
account_ididThe asset or liability account (Chart of accounts) being reconciled.
statement_datedate
statement_balanceamount, as textThe ending balance of the statement, in the sign of the ledger: a card that owes 500.00 is -500.00.
opening_balanceamount, as textThe beginning balance of the statement, in the same sign.
statustextopen or finished. An account has at most one open statement.
created_byid, or null
created_attime
finished_byid, or null
finished_attime, or nullWhen it was finished. Set exactly when status is finished.
show_fromdate, or nullOn the first statement of an account only: entries dated before this date start as cleared before the statement. Shown as Show entries from.
opening_daydate, or nullThe day of the opening balance the statement counts as cleared before it, on the first statement of an account: written by the database when the statement is begun, from the account as it then stands, and never changed. Empty when the account had no opening balance then, and on every statement begun before this field was added: such a statement lists an opening balance as a line to tick.

Contact emails

contact_email. One row per email address of a contact.

FieldTypeWhat it holds
idid
book_idid
payee_ididThe contact (Contacts) the address belongs to.
positionwhole numberThe order of the address among the emails of the contact, starting at 0.
addresstext
is_primarytrue or falseTrue on the primary email of the contact. At most one per contact.

Merged contacts

contact_merge. One row per merge of two contacts, with what it changed so that Split can undo exactly that.

FieldTypeWhat it holds
idid
book_idid
survivor_ididThe contact (Contacts) that was kept.
merged_ididThe contact (Contacts) that was merged into it. Its row stays, pointing at the survivor.
merged_byid
merged_attime
detailJSONJSON: what the merge changed. The fields of the survivor before and after, the phones and emails added to it, and the ids of the rows moved to it.
split_byid, or nullThe person who split the merge again. Empty while the merge stands.
split_attime, or nullWhen the merge was split again. Empty while the merge stands.

Not duplicates

contact_not_duplicate. One row per pair of contacts a person marked as not duplicates, so the pair is not suggested for merging again.

FieldTypeWhat it holds
idid
book_idid
a_ididOne contact (Contacts) of the pair: the one with the lower id.
b_ididThe other contact (Contacts) of the pair.
dismissed_byid
dismissed_attime

Contact phones

contact_phone. One row per phone number of a contact.

FieldTypeWhat it holds
idid
book_idid
payee_ididThe contact (Contacts) the number belongs to.
positionwhole numberThe order of the number among the phones of the contact, starting at 0.
numbertext
labeltextMobile, Work, Home, Fax or Other.
notetext, or null
is_primarytrue or falseTrue on the primary phone of the contact. At most one per contact.

Bank balances

feed_balance. One row per balance a bank feed reported for a feed account, shown as Bank balance beside the book balance. Listed, not restored.

FieldTypeWhat it holds
idid
book_idid
feed_account_ididThe feed account (Bank feed accounts) the balance is of.
balanceamount, as textThe balance at the bank, in the sign of the ledger: owed on a card or loan is negative. Plaid figures are turned to that sign; SimpleFIN figures are kept as sent.
available_balanceamount, as text, or nullThe available balance as the provider sends it. For a Plaid card this is the credit left to spend, not an amount owed.
as_oftimeThe moment the provider dates the balance by.
fetched_attimeWhen HomeBooks was last told this balance.

Pending bank transactions

feed_pending. One row per transaction a bank feed lists as pending, replaced at every fetch. They are not bank lines and reach Review only once they post. Listed, not restored.

FieldTypeWhat it holds
idid
book_idid
feed_account_ididThe feed account (Bank feed accounts) the transaction is on.
external_idtextThe id the provider gives the transaction.
daydateThe date of the transaction as the provider gives it.
amountamount, as textSigned as a bank line: positive is money into the account, negative is money out.
nametext, or null
memotext, or null
seen_attimeWhen the fetch that listed it ran.

Rules

import_rule. One row per rule that categorizes bank lines by their text. Rules apply in order and the first active one that matches decides.

FieldTypeWhat it holds
idid
book_idid
positionwhole numberThe place of the rule in the order. Lower numbers are tried first.
match_fieldtextWhich text of the bank line is matched: name (shown as Payee), memo, or any (either).
match_typetextcontains, starts_with or equals. Case and extra spaces are ignored.
match_texttextThe text looked for.
account_ididThe account (Chart of accounts) the rule gives a matching line.
usetext, or nullpersonal or business: the use the rule gives the line. Empty: the default use of the account, or a business share is set instead.
business_sharedecimal number, as text, or nullThe share of the line posted as business, from 0 to 1 (0.25 is 25%). Never set together with use.
payee_idid, or nullThe contact (Contacts) the rule gives a matching line. Optional.
activetrue or false
created_attime
principal_onlytrue or falseOn a rule to a Loan account: true posts the whole line to principal; false splits it as the payment of the loan.

Reconciliation reports

reconciliation_report. One row per finish of a statement: the reconciliation report saved at that moment. A statement reopened and finished again has more than one.

FieldTypeWhat it holds
idid
book_idid
reconciliation_ididThe statement (Statements) the report is of.
finished_attime
finished_byid, or null
reportJSONJSON: the report as saved: account, statement date, the balances and difference, the cleared and outstanding lines, the register balance, who finished it and when.

Sales tax agencies

tax_agency. One row per agency that sales tax is collected for and paid to. Its rates are in Sales tax rates.

FieldTypeWhat it holds
idid
book_idid
nametext
payee_ididThe contact (Contacts) the sales tax payments of the agency are made to.
activetrue or false
created_attime

Entries

txn. One row per journal entry. Its lines are in Entry lines. A posted entry is never edited: it is voided by a reversing entry.

FieldTypeWhat it holds
idid
book_idid
numberwhole numberThe number of the entry in this book, counted from 1.
datedate
payee_idid, or nullThe contact (Contacts) of the entry. Optional.
memotext, or null
statustextposted or void. A void entry has been reversed by another entry.
reverses_idid, or nullOn a reversal, the entry (Entries) it reverses. An entry is reversed at most once.
sourcetextWhat posted it: manual, import (a bank line), setup (opening balances), qbo, invoice, sales_receipt, credit_memo, payment, write_off, tax_payment, correction, void, close.
source_reftext, or nullThe key of the entry at its source, unique per source: for qbo the type and id (Invoice:130); a document, payment or write-off id; bank_line:id:attempt; the entry corrected.
created_byid, or null
created_attime
referencetext, or nullThe check number, confirmation code or document number. Free text.

Bank lines

bank_line. One row per transaction a bank reported, from a file or a feed, shown under Review. A line added or matched points to its entry in Entries.

FieldTypeWhat it holds
idid
book_idid
account_ididThe bank or card account (Chart of accounts) the line belongs to.
import_idid, or nullThe file (Imported bank files) the line came from. Empty for a line from a bank feed.
sourcetextWhere the line came from: import (a file), simplefin or plaid.
source_reftextThe id the bank gave the transaction: an OFX FITID, the transaction id of the feed, or csv: plus a hash of the row. A suffix ~2, ~3 marks an id the bank used again.
posted_ondateThe day the bank posted the transaction.
amountamount, as textSigned from the side of the account holder: positive is money in (a deposit, a payment to a card), negative is money out (a purchase, a card charge). Never zero.
nametext, or nullThe description or payee text the bank gave.
memotext, or nullThe memo the bank gave. For a Plaid line, the merchant name.
referencetext, or nullThe check or reference number a file gave. Empty for a line from a feed.
trntypetext, or nullThe transaction type an OFX file gave (TRNTYPE). Empty for CSV and feeds.
fingerprinttextDate, amount and the first word of the name, in lower case. The same transaction from another source has the same one, which flags a possible duplicate.
rawJSONJSON: the transaction as the source gave it (OFX fields, a CSV row by column name, or the id, day, amount and texts of a feed). A Plaid amount here is positive for money out.
statustextnew (to review), posted (added as a new entry), matched (matched to an entry already posted) or excluded.
txn_idid, or nullThe entry (Entries) the line was added as or matched to. Set exactly when status is posted or matched.
suggested_account_idid, or nullThe account (Chart of accounts) the line will be added to, chosen by a rule or by a person.
suggested_usetext, or nullpersonal or business: the use the line will be added with. Empty: the default use of the account, or a business share is set instead.
suggested_sharedecimal number, as text, or nullThe business share the line will be split by, from 0 to 1 (0.25 is 25% business). Never set together with suggested_use.
suggested_payee_idid, or nullThe contact (Contacts) the line will be added with.
rule_idid, or nullThe rule (Rules) that made the suggestion. Empty when a person chose it or nothing is suggested.
possible_duplicate_ofid, or nullAn earlier line (Bank lines) that may be the same transaction: the same fingerprint from another source, or the same bank id with another date or amount.
decided_byid, or nullThe person who added, matched or excluded the line. Empty while it is to review, and when no person did it (an automatic match).
decided_attime, or nullWhen the line was added, matched or excluded. Empty while it is to review.
created_attime
attemptwhole numberHow many times the line went back to Review because the entry it was added as was voided. Starts at 0.
picked_by_handtrue or falseTrue when a person gave the line its account. Rules then leave the line alone.
possible_entry_idid, or nullAn entry (Entries) that may already record this feed line, when more than one could. The line waits for a person to decide.
fill_nametext, or nullA readable description taken from a SimpleFIN transaction for a Plaid line whose own description the bank blanked. Kept beside name, never in place of it.
fill_memotext, or nullThe memo that came with that SimpleFIN description.
fill_reftext, or nullThe id of the SimpleFIN transaction the description came from.
filled_attime, or nullWhen that description was filled in.
taken_backtrue or falseTrue when the bank changed or removed the transaction after it was staged. The line stays as a record and can only be excluded. Never unset.
fill_clearedlist of textA list of SimpleFIN transaction ids a person cleared from this line, oldest first. None of them fills the line again.
unmatched_fromlist of idsA list of entry ids (Entries) a person unmatched the line from. Automatic matching never offers them again.
pair_declinedtrue or falseTrue when a person said the line is not one side of the transfer it was paired as. It is not paired again until the person picks the other account.

Contact aliases

contact_alias. One row per other name a contact answers to: the name of a contact merged into it, or its own name before a rename. Shown as Aliases.

FieldTypeWhat it holds
idid
book_idid
payee_ididThe contact (Contacts) that answers to this name.
nametext
merge_idid, or nullThe merge (Merged contacts) that brought this name. Empty for a name kept after a rename.
created_attime

Loan payments

loan_payment. One row per entry recorded as the payment of a loan, by Review or by Record payment. Its amounts are the lines of the entry.

FieldTypeWhat it holds
book_idid
txn_ididThe entry (Entries) that is the payment.
account_ididThe Loan account (Chart of accounts) it pays.
due_ondate, or nullThe due date the payment was split as paying; none for an extra payment.

Payments

payment. One row per payment received from a customer. What it paid is in Payments applied. Any amount not applied is credit of the customer.

FieldTypeWhat it holds
idid
book_idid
customer_ididThe customer (Contacts) who paid.
datedate
amountamount, as textThe amount received, always above zero.
deposit_account_ididThe account (Chart of accounts) the money went into: a bank account or Undeposited funds.
referencetext, or nullThe check number or other reference of the payment.
memotext, or null
txn_ididThe entry (Entries) that recorded the payment. The payment stands while that entry is not void.
created_byid, or null
created_attime
qbo_reftext, or nullFor a payment that came from QuickBooks, its transaction as type and id (Payment:128). Empty for one recorded in HomeBooks.
methodtext, or nullThe QuickBooks payment method, such as Check. Set only on a payment from QuickBooks.

Sales tax rates

tax_rate. One row per version of a sales tax rate. Rows with the same name are versions of one rate. Its parts are in Sales tax components.

FieldTypeWhat it holds
idid
book_idid
agency_ididThe agency (Sales tax agencies) the rate belongs to.
nametext
effective_fromdateThe first day this version applies. A document uses the newest version effective on or before its date.
activetrue or false
created_attime

Entry lines

txn_line. One row per line of an entry: an account and a signed amount. The lines of an entry add up to 0.00, and a posted line never changes.

FieldTypeWhat it holds
idid
book_idid
txn_ididThe entry (Entries) this line belongs to.
line_nowhole numberThe place of the line in the entry, starting at 1.
account_ididThe account (Chart of accounts) the line is on.
amountamount, as textSigned: positive is a debit, negative is a credit. Never zero.
usetext, or nullpersonal or business. Every income and expense line has one.
tagtext, or nullAn optional free-text label on the line. The screens leave it empty.
memotext, or null
payee_idid, or nullThe contact (Contacts) of the line itself, as on a journal entry. Optional.

Sales documents

invoice. One row per invoice, sales receipt or credit memo. Its figures are in Document revisions, its lines in Document lines.

FieldTypeWhat it holds
idid
book_idid
kindtextinvoice, sales_receipt or credit_memo.
numberwhole number, or nullThe document number, given from the sequence of its kind when issued. Empty on a draft, and on a QuickBooks document whose number is in doc_number or that has none.
customer_ididThe customer (Contacts).
datedate
terms_dayswhole numberDays from the date to the due date. 0 to 365 for a document typed here. A QuickBooks document keeps its QuickBooks due date, so it may be outside that range.
due_datedate
memotext, or null
statustextdraft (posts nothing), issued or void. Paid and partly paid are not stored: they are worked out from what is applied.
tax_rate_idid, or nullThe sales tax rate (Sales tax rates) chosen for the document. Empty for none.
deposit_account_idid, or nullFor a sales receipt, the account (Chart of accounts) the money went into. Empty on invoices and credit memos.
current_revisionwhole numberThe revision in force (Document revisions). 0 while a draft, 1 when issued, one more for each later change.
created_byid, or null
created_attime
issued_attime, or null
voided_attime, or null
qbo_reftext, or nullFor a document that came from QuickBooks, its transaction as type and id (Invoice:130). Empty for one typed in HomeBooks.
doc_numbertext, or nullThe QuickBooks number exactly as printed, when it cannot be held in number: not a plain number, a leading zero, or already used.
billing_addresstext, or nullThe billing address as written on a QuickBooks document. A document typed here has none and reads the address of the customer.
shipping_addresstext, or nullThe shipping address as written on a QuickBooks document. A document typed here has none and reads the address of the customer.

QuickBooks cleared marks

qbo_line_mark. One row per entry line that QuickBooks held as cleared or reconciled. The first statement of an account starts from these marks.

FieldTypeWhat it holds
book_idid
line_ididThe entry line (Entry lines) the mark is on. Only lines of entries that came from QuickBooks carry one.
account_ididThe account (Chart of accounts) of that line, repeated here by the database.
marktextR (reconciled in QuickBooks) or C (cleared in QuickBooks, not yet on a finished reconciliation there).

QuickBooks record map

qbo_map. One row per QuickBooks list record and the record of the book made from it: an account, a contact, a product, a tax agency or a tax rate.

FieldTypeWhat it holds
idid
book_idid
entitytextThe QuickBooks record type: Account, Customer, Vendor, Item, TaxAgency or TaxCode.
qbo_idtextThe QuickBooks id of the record, unique within its type.
account_idid, or nullThe account (Chart of accounts) a QuickBooks Account became. Exactly one of the five target columns is set.
payee_idid, or nullThe contact (Contacts) a QuickBooks Customer or Vendor became.
seen_nametext, or nullThe name QuickBooks last gave the record, so a rename there is told from a rename here.
seen_activetrue or false, or nullThe active flag QuickBooks last gave the record.
product_idid, or nullThe product or service (Products and services) a QuickBooks Item became.
seenJSON, or nullJSON: the details QuickBooks last gave for a contact, a product or a tax code, so a field follows QuickBooks only when QuickBooks changed it.
tax_agency_idid, or nullThe agency (Sales tax agencies) a QuickBooks TaxAgency became.
tax_rate_idid, or nullThe rate (Sales tax rates) a QuickBooks TaxCode became.

Cleared lines

reconciliation_line. One row per entry line ticked as cleared on a statement, or marked cleared before the first statement of an account. A line is on one statement at most.

FieldTypeWhat it holds
book_idid
reconciliation_ididThe statement (Statements).
line_ididThe entry line (Entry lines) that is ticked or marked.
ticked_byid, or nullThe person in scope when the line was ticked or marked. Empty when no person was.
ticked_attime
priortrue or falseTrue for a line marked cleared before the first statement of an account. Marks count for nothing in its figures; together they must equal its beginning balance.

Marks taken off

reconciliation_line_off. One row per entry line a person took a tick or mark off on the first statement of an account, so QuickBooks marks do not put it back. No screen shows it.

FieldTypeWhat it holds
book_idid
reconciliation_ididThe statement (Statements).
line_ididThe entry line (Entry lines) the tick or mark was taken off.

Sales settings

sales_setting. The sales settings of the book: one row. The accounts sales post to, the heading printed on a document, and what a new document starts from.

FieldTypeWhat it holds
book_idid
receivable_account_idid, or nullThe account (Chart of accounts) used as Accounts receivable. An invoice is issued only once it is set.
undeposited_account_idid, or nullThe account (Chart of accounts) used as Undeposited funds, for payments received and not yet deposited.
business_nametext, or nullThe business name printed at the head of a document.
addresstext, or nullThe address printed at the head of a document.
phonetext, or nullThe phone number printed at the head of a document.
emailtext, or nullThe email address printed at the head of a document.
default_terms_dayswhole number, or nullThe terms in days a new invoice starts with when its customer has none.
default_tax_rate_idid, or nullThe sales tax rate (Sales tax rates) a new document starts with.
default_memotext, or nullThe memo a new document starts with.
email_subjecttext, or nullThe subject a new document email starts with.
email_messagetext, or nullThe message a new document email starts with.
discount_account_idid, or nullThe income or expense account (Chart of accounts) a new discount line starts with.
bad_debt_account_idid, or nullThe expense account (Chart of accounts) the last write-off of an invoice was charged to, offered for the next one.

Sales tax components

tax_component. One row per part of a sales tax rate, such as State, County or City, each with its own percentage and liability account.

FieldTypeWhat it holds
idid
book_idid
rate_ididThe rate (Sales tax rates) the component belongs to.
positionwhole numberThe place of the component within the rate, starting at 1.
nametext
percentdecimal number, as textThe rate of the component as a percentage: 6.25 is 6.25%. From 0 to below 100, up to four decimals.
liability_account_ididThe liability account (Chart of accounts) the tax of the component is credited to.

Credit applied

credit_application. One row per amount of customer credit applied to an invoice, from a credit memo or from the unapplied part of a payment. It posts no entry.

FieldTypeWhat it holds
idid
book_idid
credit_memo_idid, or nullThe credit memo (Sales documents) the credit comes from. Exactly one of credit_memo_id and payment_id is set.
invoice_ididThe invoice (Sales documents) the credit is applied to.
amountamount, as textThe credit applied, always above zero.
qbo_reftext, or nullThe QuickBooks transaction that made the application, as type and id (Payment:74). Empty for one applied by hand in HomeBooks.
created_attime
removed_attime, or nullWhen the application was taken back. A row is never changed or deleted, only marked removed. Empty while it stands.
payment_idid, or nullThe payment (Payments) whose unapplied remainder the credit comes from.
datedateThe day the credit was applied.
created_byid, or null
removed_byid, or nullThe person who took it back. Empty when it stands, or when QuickBooks took it back.

Documents sent

document_email. The log of sales documents sent by email: one row when a send starts and one for how it ended. The message and the PDF are not stored.

FieldTypeWhat it holds
idid
book_idid
invoice_ididThe document (Sales documents) that was sent.
revisionwhole numberThe revision of the document that was sent (Document revisions).
sent_attime
sent_byid
to_addresstext
cc_addresseslist of textA list of the addresses copied.
subjecttext
outcometextsending (the send was started), sent or failed. A sending row with no sent or failed row for the same send_key was never confirmed.
errortext, or nullWhat the mail server said. Set exactly when outcome is failed.
from_addresstext, or nullThe address the message was sent from. Empty on the oldest rows.
send_keyid, or nullThe id of one press of Send. The sending row and its sent or failed row share it. Empty on the oldest rows.
platform_mailtrue or falseTrue when the send went through HomeBooks mail, the mail server of the installation, and not the sender's own. False on rows from before HomeBooks mail.

Document lines

invoice_line. One row per line of a sales document, for each of its revisions: an item, the one discount line, or a text line.

FieldTypeWhat it holds
idid
book_idid
invoice_ididThe document (Sales documents) the line is on.
revisionwhole numberThe revision of the document the line belongs to. 0 for the lines of a draft.
positionwhole numberThe place of the line on the document, starting at 1.
product_idid, or nullThe product or service (Products and services) sold. Optional, item lines only.
descriptiontext
quantitydecimal number, as text, or nullUp to three decimals, never zero. Item lines only.
unit_pricedecimal number, as text, or nullUp to five decimals. Item lines only.
taxabletrue or false, or nullWhether sales tax applies to the line. Item lines only.
income_account_idid, or nullThe account of the line (Chart of accounts): the income account of an item, or the account of the discount. Empty on a text line.
amountamount, as text, or nullItem: quantity times unit price, rounded half up to the cent (a QuickBooks line keeps the QuickBooks amount). Discount: below zero. Text line: empty.
line_typetextitem, discount (at most one per revision, after the items) or text (a description only, with no amount).
discount_percentdecimal number, as text, or nullOn a discount given as a percentage, that percentage: above 0, at most 100 (10 is 10%). Empty otherwise.

Document revisions

invoice_revision. One row per issued version of a sales document, with its totals and the entry it posted. Changing an issued document adds a revision.

FieldTypeWhat it holds
idid
book_idid
invoice_ididThe document (Sales documents).
revisionwhole number1 for the document as first issued, then 2, 3 and so on.
txn_ididThe entry (Entries) this revision posted. For a QuickBooks document, the entry built from QuickBooks for its transaction.
datedateThe date of the document in this revision.
due_datedateThe due date in this revision.
tax_rate_idid, or nullThe sales tax rate (Sales tax rates) used in this revision.
subtotalamount, as textThe item lines plus the discount line. A credit memo keeps the same sign as an invoice.
taxable_subtotalamount, as textThe part of the subtotal that sales tax is worked out on. 0.00 for a tax-exempt customer.
tax_amountamount, as textThe sales tax: the sum of the rows of this revision in Document sales tax.
totalamount, as textsubtotal plus tax_amount.
created_byid, or null
created_attime

Document sales tax

invoice_tax. One row per component of the sales tax on one revision of a sales document: its percentage, its liability account and the tax.

FieldTypeWhat it holds
idid
book_idid
invoice_ididThe document (Sales documents).
revisionwhole numberThe revision of the document (Document revisions).
positionwhole numberThe place of the component among the tax rows of the revision, starting at 1.
nametextThe name of the component, such as State or County, copied onto the document.
percentdecimal number, as textThe rate of the component as a percentage: 6.25 is 6.25%.
liability_account_ididThe liability account (Chart of accounts) the tax was credited to.
amountamount, as textThe tax for this component: the taxable subtotal times the percentage, rounded half up to the cent. A QuickBooks document keeps the QuickBooks figure.

Payments applied

payment_application. One row per amount of a payment applied to an invoice, written with the payment.

FieldTypeWhat it holds
idid
book_idid
payment_ididThe payment (Payments).
invoice_ididThe invoice (Sales documents) it paid.
amountamount, as textThe amount applied to that invoice, always above zero.
created_attime

Write-offs

write_off. One row per write-off of the balance of an invoice, or of the credit left on a payment or credit memo. It stands while its entry is not void.

FieldTypeWhat it holds
idid
book_idid
invoice_idid, or nullThe invoice (Sales documents) whose balance is written off. Exactly one of invoice_id, payment_id and credit_memo_id is set.
payment_idid, or nullThe payment (Payments) whose unapplied credit is written off.
credit_memo_idid, or nullThe credit memo (Sales documents) whose remaining credit is written off.
txn_ididThe entry (Entries) that posted the write-off. The date, memo and expense account of the write-off are those of the entry.
amountamount, as textThe amount written off, always above zero.
created_byid, or null
created_attime