Skip to content
Architecture · Object Schema

Every object in QBO by Tally, on one tree.

The data model behind the sync — generated straight from the managed package metadata. Salesforce CRM on top, QuickBooks mirrors beneath it, transaction documents in the middle with their line items hanging off master-detail spines, reference books at the base — and the plumbing kept deliberately link-free at the bottom. Expand any object to see every field it ships with.

32objects
614fields
7master-detail spines
36lookups
4self-hierarchies
2platform events
master-detail — owns its children, roll-upslookup — arrow points at the referenced objectconversion path
01Salesforce Core

Contact

Standard
Contact · 5 fields
  • QuickBooksRefId__ctext
  • Primary_Billing_Contact__ccheckbox

Account

Standard
Account — untouched — no packaged fields

    Opportunity Line Item

    Standard
    OpportunityLineItem · 1 field
    • QuickBooks_Taxable__ccheckbox
    fires ActionOnOLI__e

    Product

    Standard
    Product2 · 12 fields
    • QuickBooksRefId__ctext
    • QBO_Sync_Status__ctext · formula
    • Last_Synced__cdatetime
    02Identity Mirrors

    QBO Payment Option

    Custom
    Payment_Option__c · 24 fields
    • Quickbooks_Card_Id__ctext
    • Account_Number__cencrypted
    • Tokenization_Status__cpicklist
    card + ACH vault

    QBO Customer

    Custom
    QBO_Customer__c · 33 fields
    • QuickBooksRefId__cext id
    • SyncToken__ctext
    • Display_Name__ctext
    ⟲ Parent_Customer__cbill-with-parent

    Vendor

    Custom
    Vendor__c · 54 fields
    • Id__cext id
    • Balance__cnumber
    • Vendor1099__ccheckbox
    full QBO vendor mirror
    03Transaction Documents

    QBO Estimate

    Custom
    QBO_Estimate__c · 40 fields
    • QBO_RefId__ctext
    • SubTotal__cΣ roll-up
    • Status__cpicklist
    ⇄ converts to Invoice__cParent_Object + Id pointer

    QBO Invoice

    Custom
    Invoice__c · 77 fields — the hub
    • Invoice_Id__ctext
    • SubTotal__cΣ roll-up
    • Amount_Paid__ccurrency
    • Payment_Status__ctext
    ⟲ Parent_Invoice__c12-field recurring engine

    QBO Sales Receipt

    Custom
    QBO_Sales_Receipt__c · 36 fields
    • QBO_Ref_Id__ctext
    • Sub_Total__cΣ roll-up
    • Payment_Method__ctext
    sale + payment in one

    QBO Purchase Order

    Custom
    QBO_Purchase_Order__c · 38 fields
    • QuickBook_RefId__cext id
    • Status__cpicklist
    • Total_Amount__cnumber
    money going out, not in
    04Line Items & Money

    QBO Estimate Item

    Custom
    QBO_Estimate_Item__c · 9 fields
    • Amount__ccurrency · formula
    • Rate__ccurrency
    • Quantity__cnumber

    QBO Invoice Item

    Custom
    Invoice_Item__c · 14 fields
    • QBO_Line_Id__cext id
    • Amount__ccurrency · formula

    QBO Payment

    Custom
    QBO_Payment__c · 9 fields
    • Amount__ccurrency
    • Status__cpicklist

    QBO Sales Receipt Item

    Custom
    QBO_Sales_Receipt_Item__c · 11 fields
    • Amount__ccurrency · formula
    • Quantity__cnumber

    PO Line Item

    Custom
    QBO_Purchase_Order_Line_Item__c · 15 fields
    • Type__cpicklist
    • Amount__cnumber
    05Reference Books

    QBO Account

    Custom
    QBO_Account__c · 13 fields
    • AccountType__cpicklist
    ⟲ ParentRef__cchart of accounts

    QBO Class

    Custom
    QBO_Class__c · 9 fields
    • FullyQualifiedName__ctext
    ⟲ Parent_Class__c

    QBO Tax Code

    Custom
    TaxCode__c · 9 fields
    • Total_Tax_Value__cΣ roll-up

    QBO Tax Rate

    Custom
    TaxRate__c · 7 fields
    • Tax_Value__cnumber

    Payment Method

    Custom
    PaymentMethod__c · 6 fields
    • Id__cext id
    Cash · Check · Credit Card

    QBO Custom Field

    Custom
    QBO_Custom_Field__c · 7 fields
    • Entity__cmultipicklist
    Custom Fields API defs

    Custom Field Value

    Custom
    QBO_Custom_Field_for_Invoice__c · 9 fields — junction — one row per doc × field
    • Value__ctext
    • Label__ctext · formula
    ⚙︎ Plumbing — zero hard links, by design

    QBO API Token

    Custom
    API_Token__c · 60 fields

    OAuth access + refresh tokens, realm id, and a mirror of QBO company preferences.

    Configurations

    Setting
    Quick_Book_Configurations__c · 32 fields

    The switchboard: endpoints + every feature toggle (product sync, sales receipts, custom fields…).

    Configuration

    Metadata
    Quick_Book_Configuration_New__mdt · 9 fields

    Package-shipped defaults: client id/secret, auth + callback URLs. (v1 __mdt kept but deprecated.)

    Customer Sync Settings

    Setting
    QBO_Customer_Sync_Settings__c · 26 fields

    One checkbox per attribute — field-by-field control over what syncs on a customer.

    Trigger Switch

    Setting
    Trigger_Setting_Switch__c · 1 fields

    One checkbox per trigger — the kill-switch for automation.

    QBO Log

    Custom
    Log__c · 24 fields

    Correlation id, direction, payloads, stack trace, duration — record ids stored as text so logging can never block a transaction.

    Action On OLI

    Event
    ActionOnOLI__e · 2 fields

    Fired when opportunity products change; decouples CRM edits from sync work.

    Populate Invoice Products

    Event
    Populate_QBO_Invoice_Products__e · 13 fields

    Streams product lines onto a draft invoice asynchronously.

    Why it's shaped this way

    Six deliberate decisions

    None of this structure is accidental — each pattern answers a specific constraint of syncing two systems that both think they own the data.

    01

    Mirror, don't mangle

    Every QuickBooks entity gets its own __c mirror object instead of being crammed into Account or Opportunity. Standard CRM objects stay clean (Account gets zero packaged fields), and each mirror carries a QuickBooksRefId__c external id plus SyncToken__c — the pair that makes every sync an idempotent upsert instead of a duplicate factory.

    02

    Master-detail where money rolls up

    All five line-item objects, payments, and tax rates hang on master-detail. That's what buys the SubTotal__c roll-up summaries (the total is computed by the platform, never drift-prone Apex math) and cascade delete — an orphaned invoice line is structurally impossible.

    03

    Lookups where records outlive each other

    Documents reference customers, tax codes, and products through plain lookups. Deactivating a QBO class or deleting a product must never take three years of invoices down with it — so ownership is reserved for lines, and reference is kept loose everywhere else.

    04

    The generic parent pointer

    Every document carries a Parent_Object__c + Parent_Record_Id__ctext pair instead of a polymorphic lookup. That's what lets an invoice be spawned from an Opportunity, a Work Order, or any custom object — in any subscriber org — without the package declaring a hard dependency on objects that may not exist there.

    05

    Hierarchies mirror QuickBooks' own trees

    QuickBooks nests things: sub-customers billed with parents, sub-classes, sub-accounts in the chart of accounts. Each mirror gets a self-lookup (Parent_Customer__c, Parent_Class__c, ParentRef__c) so the tree survives the trip — and Parent_Invoice__c chains recurring invoices to their template the same way.

    06

    Plumbing stays link-free

    Tokens, config, logs, and events hold no foreign keys at all. Log__c stores related ids as text so a failed sync can be logged even when the record it references is gone; custom settings and metadata sit outside the transaction graph entirely; platform events decouple CRM edits from callout work. The plumbing can never deadlock the money.

    Ready to unify QuickBooks and Salesforce?

    Unify your QuickBooks experience directly from your Opportunities in Salesforce.