Skip to content

The compatibility contract

We deliver the most QuickBooks Online compatibility we can, and we're honest about the rest. Reads are almost entirely compatible; writes are where QuickBooks Desktop's quirks show up. Every partial or unsupported case below comes with the exact fix.

This page is the full entity matrix — every QBO Accounting API entity we track, whether live, planned, or a documented gap. Jump to an entity from the tables below, or read IDs, SyncToken & sparse updates for the cross-cutting rules.

Entity matrix

Every QBO Accounting API entity we track, with an honest verdict and a one-line Desktop reality check. Use this page to answer "does TenkeyBridge cover what I use?" in under a minute.

Legend — Full: works unchanged · Partial: common cases work, see the entity section · Full (read-only): reads work; no write path · Planned: real Desktop analog, not yet shipped · Stretch: lower-priority planned · Never: no honest Desktop equivalent · Future: platform ops after the entity matrix.

Sales

EntityVerdictHeadline
CreditMemoPartialInvoice twin — Balance and RemainingCredit both map from Desktop CreditRemaining
CustomerFullSub-customer maps to Desktop Customer:Job
EstimatePartialSame shape as Invoice; no expiration/acceptance tracking
InvoicePartialLine model, tax, discount, linked txns, and custom fields
ItemPartialOne Item becomes several Desktop item types
PaymentPartialApplying a payment to specific invoices
RefundReceiptPartialCard refunds of applied credits only (ARRefundCreditCard) — not general item-line refunds
SalesReceiptPartialSame as Invoice + deposit account

Purchasing

EntityVerdictHeadline
BillFullAccount vs. item expense lines map cleanly
BillPaymentPartialFans out to BillPaymentCheck / BillPaymentCreditCard by PayType
PurchasePartialFans out to Check / CreditCardCharge / CreditCardCredit by PaymentType
PurchaseOrderPartialNon-posting; item lines only — never touches the GL on either side
VendorFull1099 / tax-ID field naming only
VendorCreditPartialBill mirror image — expense and item lines

Banking

EntityVerdictHeadline
AccountFullAccountType / AccountSubType enum mapping
DepositPartialUndeposited Funds → bank via LinkedTxn or manual DepositLineDetail
JournalEntryPartialDebit/Credit lines split across Desktop JournalDebitLine / JournalCreditLine
TransferFullBank-to-bank transfer between two accounts

Lists & config

EntityVerdictHeadline
ClassFullHierarchical Class list; SubClass/FullyQualifiedName from Desktop Sublevel/FullName
CompanyCurrencyFull (read-only)Desktop CurrencyQuery list; empty when multicurrency is off (statusCode 3250, confirmed live, and 3170 both normalized to [])
CustomerTypeFull (read-only)Read/query only — QBO CustomerType is read-only via the API; Desktop hierarchy is not exposed
EmployeeFull (read-only)Read/query only — no Desktop write path this release; payroll aggregates out of scope
ExchangeRatePartialProjected from CurrencyRet.ExchangeRate + AsOfDate; one row per currency that carries a rate; empty when multicurrency is off (statusCode 3250, confirmed live, and 3170 both normalized to [])
PaymentMethodPartialCreate only — Desktop has no PaymentMethodMod; Type coarsens Desktop's fine enum to CREDIT_CARD
TaxAgencyFull (read-only)Read-only projection — Vendors referenced by any ItemSalesTax.TaxVendorRef (no native Desktop TaxAgency list)
TaxCodeFullDesktop SalesTaxCode list (TAX/NON); Name max 3 chars (fail-loud, never truncated); a plain taxable/non-taxable flag pair, not a rate container
TaxRateFull (read-only)Read-only (parity with QBO) — Desktop ItemSalesTaxQuery; each single rate item is a TaxRate; sales-tax groups are not projected as TaxRates
TermPartialMerged StandardTerms + DateDrivenTerms; Type STANDARD
TimeActivityPartialEmployee time only; Duration compiled from Hours/Minutes or a StartTime/EndTime span

Company

EntityVerdictHeadline
CompanyInfoFull (read-only)Read-only; Id equals the realm ID, no Desktop write path
PreferencesPartialRead-only singleton (Id=1); honest subset of Desktop PreferencesQuery groups

Planned (Desktop analog exists)

EntityVerdictHeadline
BudgetPlannedqbXML has no Budget records, but budget figures are readable through BudgetSummaryReportQuery — a read-only Budget synthesized from that report is planned; budget writes stay in the Desktop UI forever.

Never — no Desktop equivalent

EntityVerdictHeadline
AttachableNeverQuickBooks Desktop's qbXML API has no attachments interface — the word 'Attachment' does not occur anywhere in the qbxmlops130 message set.
DepartmentNeverQBO Departments (locations) have no Desktop equivalent — the only 'Department'/'Location' strings in qbXML are free-text fields on Employee, FixedAsset, and Lead, and Desktop's one real dimensional list (Class) is already exposed faithfully as Class.
JournalCodeNeverFrance-only QBO regulatory feature; not applicable to Desktop — 'JournalCode' occurs nowhere in the qbxmlops130 message set.
RecurringTransactionNeverDesktop's memorized transactions are not exposed by qbXML — there is no message to list, read, create, or execute them.
ReimburseChargeNeverQBO's billable-charge object has no Desktop record behind it — in qbXML, billability is a status flag (BillableStatus) on the source expense/item/time lines, never a standalone charge you can query.
TaxClassificationNeverCloud automated-sales-tax concept with no Desktop counterpart — Desktop's tax model is explicit tax items and codes, all of which TenkeyBridge exposes.
TaxServiceNeverCloud AST onboarding operation with no Desktop counterpart — 'TaxService' occurs nowhere in the qbxmlops130 message set.

Platform

EntityVerdictHeadline
BatchFullBatch envelope — up to 30 create/update/delete/query operations in one request, executed sequentially with per-item faults.
CDCFull (read-only)Change Data Capture — one poll returns changed + deleted records across entities.
ReportsPartialFive QBO-compatible reports translated live from Desktop's report engine.

Entity detail

CreditMemo

Verdict: Partial · Read: Full · Write: Partial — Invoice twin — Balance and RemainingCredit both map from Desktop CreditRemaining

QBO fieldSupportNotes
CustomerMemoFullMaps to Desktop CustomerMsgRef by FullName; the message must already exist as a Desktop customer message. Updatable via sparse update (#55).
LinePartialSame DetailType support as Invoice: SalesItemLineDetail, GroupLineDetail, and DescriptionOnly map cleanly; DiscountLineDetail requires a Desktop discount item; other DetailTypes return UNSUPPORTED_BY_DESKTOP. Group lines read back as GroupLineDetail without nested line expansion; Desktop discount lines read back as regular item lines referencing the discount item. Updates carrying Line replace the entire line table: every line is re-created with a new line Id and lines omitted from the update are deleted by Desktop (v1 full replacement, #55).
TxnTaxDetailPartialSet TxnTaxCodeRef explicitly; computed TotalTax alone is rejected. Updatable via sparse update (#55).
LinkedTxnPartialRead-only; reflects applied payments/credits, ignored on write — same as QBO.
TotalAmtFullRead-only, mapped from Desktop TotalAmount.
BalanceFullRead-only remaining unapplied credit; mapped from Desktop CreditRemaining.
RemainingCreditFullRead-only — total credit still available to apply. A distinct QBO field, not an alias of Balance; both map from Desktop's single CreditRemaining since Desktop has only the one figure.
ApplyTaxAfterDiscountNoneUNSUPPORTED_BY_DESKTOP — Desktop credit memos have no ApplyTaxAfterDiscount toggle. Control tax via per-line TaxCodeRef / TxnTaxDetail.TxnTaxCodeRef instead.

Everything else listed as full works unchanged.

Full fields
  • CustomerRef
  • TxnDate
  • DocNumber
  • BillAddr
  • ShipAddr
  • PONumber
  • SalesTermRef
  • DueDate
  • PrivateNote

Query support

Standard SELECT * FROM CreditMemo with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • TxnTaxDetail.TotalTax supplied without TxnTaxCodeRefUNSUPPORTED_BY_DESKTOP: Desktop cannot honor a computed tax total. Set TxnTaxDetail.TxnTaxCodeRef or per-line TaxCodeRef explicitly. See COMPATIBILITY.md.
  • Line.DiscountLineDetail without an ItemRef (bare-percentage or amount-off discounts)MISSING_REQUIRED_DESKTOP_ITEM: Desktop discounts are items. Create a discount item in the company file and reference it as DiscountLineDetail.ItemRef. See COMPATIBILITY.md.
  • Nested/grouped line types other than SalesItemLineDetail, DiscountLineDetail, GroupLineDetail, and DescriptionOnlyUNSUPPORTED_BY_DESKTOP: These line types do not map to QuickBooks Desktop sales transactions. Remove them or flatten to a supported DetailType. See COMPATIBILITY.md.
  • ApplyTaxAfterDiscount suppliedUNSUPPORTED_BY_DESKTOP: Desktop credit memos have no ApplyTaxAfterDiscount toggle. Control tax via per-line TaxCodeRef / TxnTaxDetail.TxnTaxCodeRef instead.

Customer

Verdict: Full · Read: Full · Write: Full — Sub-customer maps to Desktop Customer:Job

QBO fieldSupportNotes
ParentRefFullBecomes a Desktop Job under the parent; FullName is colon-delimited.
SalesTermRefFullDesktop TermsRef.
DefaultTaxCodeRefFullDesktop SalesTaxCodeRef.
AcctNumFullDesktop AccountNumber.
BalanceFullRead-only, as in QBO.
BalanceWithJobsFullRead-only; Desktop TotalBalance.
FullyQualifiedNameFullRead-only, derived by Desktop.
JobFullRead-only, derived by Desktop Sublevel.
CustomFieldPartialName/StringValue populated from Desktop custom fields (DataExt); DefinitionId not available from Desktop; read-only for now. Accepted and ignored on write.
CurrencyRefPartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
ExchangeRatePartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
PreferredPaymentMethodRefPartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
PreferredDeliveryMethodNoneUNSUPPORTED_BY_DESKTOP — Desktop has no delivery-method preference. Remove the field from your payload.
TaxableNoneUNSUPPORTED_BY_DESKTOP — Desktop customers have no taxable flag; set tax codes on transactions instead.
PrintOnCheckNameNoneUNSUPPORTED_BY_DESKTOP — Desktop CustomerRet has no PrintAs element (unlike Vendor/Employee).
MobileNoneUNSUPPORTED_BY_DESKTOP — Desktop CustomerRet has no separate mobile-phone element beyond Phone/AltPhone/Fax.
WebAddrNoneUNSUPPORTED_BY_DESKTOP — Desktop CustomerRet has no website element.

Everything else listed as full works unchanged.

Full fields
  • DisplayName
  • CompanyName
  • Title
  • GivenName
  • MiddleName
  • FamilyName
  • PrimaryEmailAddr
  • PrimaryPhone
  • AlternatePhone
  • Fax
  • BillAddr
  • ShipAddr
  • Notes
  • Active
  • CustomerTypeRef

Query support

Standard SELECT * FROM Customer with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Estimate

Verdict: Partial · Read: Full · Write: Partial — Same shape as Invoice; no expiration/acceptance tracking

QBO fieldSupportNotes
CustomerMemoFullMaps to Desktop CustomerMsgRef by FullName; the message must already exist as a Desktop customer message. Updatable via sparse update (#55).
LinePartialSame DetailType support as Invoice: SalesItemLineDetail, GroupLineDetail, and DescriptionOnly map cleanly; line-level ClassRef and ServiceDate are populated on read; DiscountLineDetail requires a Desktop discount item; other DetailTypes return UNSUPPORTED_BY_DESKTOP. Group lines read back as GroupLineDetail without nested line expansion; Desktop discount lines read back as regular item lines referencing the discount item. Updates carrying Line replace the entire line table: every line is re-created with a new line Id and lines omitted from the update are deleted by Desktop (v1 full replacement, #55).
TxnTaxDetailPartialSet TxnTaxCodeRef explicitly on write; computed TotalTax alone is rejected. On read: TotalTax, TxnTaxCodeRef, and TaxLine[{Amount, TaxLineDetail{TaxRateRef, TaxPercent}}]. NetAmountTaxable never returned. Updatable via sparse update (#55).
LinkedTxnFullPopulated on read from LinkedTxnRet (IncludeLinkedTxns automatic) — progress-invoicing links when present. Links to Desktop-only transaction types (SalesOrder, ItemReceipt, …) are omitted rather than guessed at. Accepted and ignored on write.
CustomFieldPartialName/StringValue populated from Desktop custom fields (DataExt); DefinitionId not available from Desktop; read-only for now. Accepted and ignored on write.
TotalAmtFullRead-only, computed by Desktop as Subtotal + SalesTaxTotal (not independently verified live — see issue #38 report).
CurrencyRefPartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
ExchangeRatePartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
ExpirationDateNoneUNSUPPORTED_BY_DESKTOP — Desktop estimates have no expiration date. Track it in your own system if needed.
AcceptedByNoneUNSUPPORTED_BY_DESKTOP — Desktop estimates have no accepted-by field. Track acceptance in your own system.
AcceptedDateNoneUNSUPPORTED_BY_DESKTOP — Desktop estimates have no accepted-date field. Track acceptance in your own system.
TxnStatusNoneUNSUPPORTED_BY_DESKTOP — Desktop estimates have no status field matching QBO's Pending/Accepted/Closed/Rejected enum. Track status in your own system.

Everything else listed as full works unchanged.

Full fields
  • CustomerRef
  • TxnDate
  • DocNumber
  • BillAddr
  • ShipAddr
  • PONumber
  • SalesTermRef
  • DueDate
  • PrivateNote

Query support

Standard SELECT * FROM Estimate with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • TxnTaxDetail.TotalTax supplied without TxnTaxCodeRefUNSUPPORTED_BY_DESKTOP: Desktop cannot honor a computed tax total. Set TxnTaxDetail.TxnTaxCodeRef or per-line TaxCodeRef explicitly. See COMPATIBILITY.md.
  • Line.DiscountLineDetail without an ItemRef (bare-percentage or amount-off discounts)MISSING_REQUIRED_DESKTOP_ITEM: Desktop discounts are items. Create a discount item in the company file and reference it as DiscountLineDetail.ItemRef. See COMPATIBILITY.md.
  • Nested/grouped line types other than SalesItemLineDetail, DiscountLineDetail, GroupLineDetail, and DescriptionOnlyUNSUPPORTED_BY_DESKTOP: These line types do not map to QuickBooks Desktop sales transactions. Remove them or flatten to a supported DetailType. See COMPATIBILITY.md.

Invoice

Verdict: Partial · Read: Full · Write: Partial — Line model, tax, discount, linked txns, and custom fields

QBO fieldSupportNotes
CustomerMemoFullMaps to Desktop CustomerMsgRef by FullName; the message must already exist as a Desktop customer message. Updatable via sparse update (#55).
LinePartialSalesItemLineDetail, GroupLineDetail, and DescriptionOnly map cleanly; line-level ClassRef and ServiceDate are populated on read; DiscountLineDetail requires a Desktop discount item referenced via DiscountLineDetail.ItemRef; other DetailTypes (e.g. SubTotalLineDetail) return UNSUPPORTED_BY_DESKTOP. Group lines read back as GroupLineDetail without nested line expansion; Desktop discount lines read back as regular item lines referencing the discount item. Updates carrying Line replace the entire line table: every line is re-created with a new line Id and lines omitted from the update are deleted by Desktop (v1 full replacement, #55).
TxnTaxDetailPartialSet TxnTaxCodeRef explicitly on write; computed TotalTax alone is rejected. On read: TotalTax, TxnTaxCodeRef (from ItemSalesTaxRef), and TaxLine[{Amount, TaxLineDetail{TaxRateRef, TaxPercent}}] from SalesTaxTotal/ItemSalesTaxRef/SalesTaxPercentage. NetAmountTaxable is never returned (Desktop has no taxable basis). Updatable via sparse update (#55).
LinkedTxnFullPopulated on read from LinkedTxnRet when IncludeLinkedTxns is requested (automatic). Desktop ReceivePayment → QBO Payment; links to Desktop-only transaction types (SalesOrder, ItemReceipt, …) are omitted rather than guessed at. Accepted and ignored on write — same as QBO treats it as read-only.
CustomFieldPartialName/StringValue populated from Desktop custom fields (DataExt); DefinitionId not available from Desktop; read-only for now. Accepted and ignored on write.
TotalAmtFullRead-only, computed by Desktop as Subtotal + SalesTaxTotal.
BalanceFullRead-only, computed by Desktop as BalanceRemaining.
CurrencyRefPartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
ExchangeRatePartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.

Everything else listed as full works unchanged.

Full fields
  • CustomerRef
  • TxnDate
  • DocNumber
  • BillAddr
  • ShipAddr
  • ShipDate
  • ShipMethodRef
  • PONumber
  • SalesTermRef
  • DueDate
  • PrivateNote

Query support

Standard SELECT * FROM Invoice with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • TxnTaxDetail.TotalTax supplied without TxnTaxCodeRefUNSUPPORTED_BY_DESKTOP: Desktop cannot honor a computed tax total. Set TxnTaxDetail.TxnTaxCodeRef or per-line TaxCodeRef explicitly. See COMPATIBILITY.md.
  • Line.DiscountLineDetail without an ItemRef (bare-percentage or amount-off discounts)MISSING_REQUIRED_DESKTOP_ITEM: Desktop discounts are items. Create a discount item in the company file and reference it as DiscountLineDetail.ItemRef. See COMPATIBILITY.md.
  • Nested/grouped line types other than SalesItemLineDetail, DiscountLineDetail, GroupLineDetail, and DescriptionOnly (e.g. SubTotalLineDetail)UNSUPPORTED_BY_DESKTOP: These line types do not map to QuickBooks Desktop sales transactions. Remove them or flatten to a supported DetailType. See COMPATIBILITY.md.

Item

Verdict: Partial · Read: Partial · Write: None — One Item becomes several Desktop item types

QBO fieldSupportNotes
FullyQualifiedNameFullRead-only in this release.
ActiveFullRead-only in this release.
TypePartialService, NonInventory, Inventory, Group map; other Desktop types are omitted from query results.
DescriptionFullRead-only in this release.
UnitPriceFullRead-only in this release.
SkuPartialQBO Sku ⇄ Desktop ManufacturerPartNumber — Desktop has no first-class SKU field; barcode (Advanced Inventory) is intentionally not used. Read-only in this release.
QtyOnHandFullRead-only in this release.
IncomeAccountRefFullRead-only in this release.
ExpenseAccountRefPartialInventory: COGSAccountRef. Two-sided Service/NonInventory (SalesAndPurchase): ExpenseAccountRef. One-sided Service/NonInventory have no expense account.
AssetAccountRefFullRead-only in this release; Inventory only.
PurchaseDescFullInventory and two-sided Service/NonInventory (SalesAndPurchase).
PurchaseCostFullInventory and two-sided Service/NonInventory (SalesAndPurchase).
PrefVendorRefFullInventory and two-sided Service/NonInventory.
ParentRefFullDesktop item hierarchy.
SubItemFullDerived from Desktop Sublevel.
CustomFieldPartialName/StringValue populated from Desktop custom fields (DataExt); DefinitionId not available from Desktop; read-only for now.

Everything else listed as full works unchanged.

Full fields
  • Name

Query support

Standard SELECT * FROM Item with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • Item types other than Service, NonInventory, Inventory, and Group (assemblies, discounts, sales tax items, payment items, fixed assets, other charge, subtotal)UNSUPPORTED_BY_DESKTOP: Omitted from query results; a direct get by id on one of these Desktop items returns a 422 UNSUPPORTED_BY_DESKTOP fault.
  • Item create/updateUNSUPPORTED_BY_DESKTOP: Lands in a later release.

Payment

Verdict: Partial · Read: Full · Write: Partial — Applying a payment to specific invoices

QBO fieldSupportNotes
PaymentRefNumFullDesktop RefNumber. Query filtering by PaymentRefNum is not supported yet — query by Id or date range.
DepositToAccountRefFullOmit to use Desktop's Undeposited Funds preference, same as QBO.
LinePartialLinkedTxn applications to Invoices only; no Line means an unapplied payment (IsAutoApply=false). CreditMemo/Deposit applications land later. AppliedToTxnRet.TxnDate/RefNumber/BalanceRemaining have no honest home in QBO Payment.Line.LinkedTxn ({TxnId, TxnType} only) and are not projected — re-fetch the invoice for balance/date/doc number.
UnappliedAmtFullRead-only; Desktop UnusedPayment.
CustomFieldPartialName/StringValue populated from Desktop custom fields (DataExt); DefinitionId not available from Desktop; read-only for now. Accepted and ignored on write.
CurrencyRefPartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
ExchangeRatePartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
ProcessPaymentPartialAccepted and ignored — TenkeyBridge never initiates card processing.
TxnNumberNoneUNSUPPORTED_BY_DESKTOP — Desktop's internal auto-increment TxnNumber has no QBO equivalent and is not surfaced.
UnusedCreditsNoneUNSUPPORTED_BY_DESKTOP — Desktop UnusedCredits (unapplied credit memos available to the customer) is distinct from UnappliedAmt/UnusedPayment; no honest home on Payment — belongs on CreditMemo.Balance.

Everything else listed as full works unchanged.

Full fields
  • CustomerRef
  • ARAccountRef
  • TxnDate
  • TotalAmt
  • PaymentMethodRef
  • PrivateNote

Query support

Standard SELECT * FROM Payment with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

RefundReceipt

Verdict: Partial · Read: Partial · Write: Partial — Card refunds of applied credits only (ARRefundCreditCard) — not general item-line refunds

QBO fieldSupportNotes
DepositToAccountRefFullMaps to Desktop RefundFromAccountRef.
PaymentMethodRefFullMust be a credit-card payment method in the company file.
LinePartialLinkedTxn credit-memo applications → RefundAppliedToTxnAdd only. At least one Line is required on create — Desktop's ARRefundCreditCardAdd requires one or more RefundAppliedToTxnAdd; an empty/missing Line array fails loud rather than sending Desktop an invalid request. SalesItemLineDetail / item-line refunds return UNSUPPORTED_BY_DESKTOP — use CreditMemo + payment/refund pair instead (see CreditMemo).
TotalAmtFullRead-only from Desktop TotalAmount.
CurrencyRefNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.
ExchangeRateNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.

Everything else listed as full works unchanged.

Full fields
  • CustomerRef
  • TxnDate
  • DocNumber
  • PrivateNote

Query support

Standard SELECT * FROM RefundReceipt with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • Item-line RefundReceipt (SalesItemLineDetail etc.)UNSUPPORTED_BY_DESKTOP: Desktop has no general item-line refund receipt. Create a CreditMemo and refund via payment/ARRefundCreditCard, or handle cash/check refunds outside this entity.
  • Update / sparse updateUNSUPPORTED_BY_DESKTOP: ARRefundCreditCard has no Mod path in this release.

SalesReceipt

Verdict: Partial · Read: Full · Write: Partial — Same as Invoice + deposit account

QBO fieldSupportNotes
CustomerMemoFullMaps to Desktop CustomerMsgRef by FullName; the message must already exist as a Desktop customer message. Updatable via sparse update (#55).
LinePartialSalesItemLineDetail, GroupLineDetail, and DescriptionOnly map cleanly; line-level ClassRef and ServiceDate are populated on read; DiscountLineDetail requires a Desktop discount item referenced via DiscountLineDetail.ItemRef; other DetailTypes (e.g. SubTotalLineDetail) return UNSUPPORTED_BY_DESKTOP. Group lines read back as GroupLineDetail without nested line expansion; Desktop discount lines read back as regular item lines referencing the discount item. Updates carrying Line replace the entire line table: every line is re-created with a new line Id and lines omitted from the update are deleted by Desktop (v1 full replacement, #55).
TxnTaxDetailPartialSet TxnTaxCodeRef explicitly on write; computed TotalTax alone is rejected. On read: TotalTax, TxnTaxCodeRef, and TaxLine[{Amount, TaxLineDetail{TaxRateRef, TaxPercent}}]. NetAmountTaxable never returned. Updatable via sparse update (#55).
LinkedTxnPartialDesktop SalesReceiptQueryRq has no IncludeLinkedTxns and SalesReceiptRet carries no LinkedTxnRet (qbXML 13.0) — never populated on read. Accepted and ignored on write.
CustomFieldPartialName/StringValue populated from Desktop custom fields (DataExt); DefinitionId not available from Desktop; read-only for now. Accepted and ignored on write.
TotalAmtFullRead-only; Desktop computes it.
CurrencyRefPartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
ExchangeRatePartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.

Everything else listed as full works unchanged.

Full fields
  • CustomerRef
  • TxnDate
  • DocNumber
  • BillAddr
  • ShipAddr
  • ShipDate
  • ShipMethodRef
  • PrivateNote
  • DepositToAccountRef

Query support

Standard SELECT * FROM SalesReceipt with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • TxnTaxDetail.TotalTax supplied without TxnTaxCodeRefUNSUPPORTED_BY_DESKTOP: Desktop cannot honor a computed tax total. Set TxnTaxDetail.TxnTaxCodeRef or per-line TaxCodeRef explicitly. See COMPATIBILITY.md.

Bill

Verdict: Full · Read: Full · Write: Full — Account vs. item expense lines map cleanly

QBO fieldSupportNotes
SalesTermRefFullDesktop TermsRef.
LineFullAccount-based and item-based expense lines; other line types return UNSUPPORTED_BY_DESKTOP. Sparse updates cannot modify lines/memo/tax yet. Both AccountBasedExpenseLineDetail.ClassRef and ItemBasedExpenseLineDetail.ClassRef are read/written, mapping to Desktop ExpenseLineAdd/ExpenseLineRet and ItemLineAdd/ItemLineRet ClassRef respectively — on ExpenseLineAdd, ClassRef sits in OSR position (AccountRef < Amount < Memo < CustomerRef < ClassRef).
TotalAmtFullRead-only, computed by Desktop as AmountDue.
BalanceFullRead-only, as in QBO.
CustomFieldPartialName/StringValue populated from Desktop custom fields (DataExt); DefinitionId not available from Desktop; read-only for now. Accepted and ignored on write.
CurrencyRefPartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
ExchangeRatePartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
LinkedTxnNoneUNSUPPORTED_BY_DESKTOP — QBO Bill has no paid-by LinkedTxn field. Desktop may return LinkedTxnRet when IncludeLinkedTxns is set, but there is no honest QBO home — not projected.

Everything else listed as full works unchanged.

Full fields
  • VendorRef
  • TxnDate
  • DueDate
  • DocNumber
  • PrivateNote

Query support

Standard SELECT * FROM Bill with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

BillPayment

Verdict: Partial · Read: Full · Write: Partial — Fans out to BillPaymentCheck / BillPaymentCreditCard by PayType

QBO fieldSupportNotes
PayTypeFullCheck → BillPaymentCheck*; CreditCard → BillPaymentCreditCard*. Updates: Check family only — qbXML has no BillPaymentCreditCardMod, so credit-card-family updates fail loud with UNSUPPORTED_BY_DESKTOP (#75); delete and re-create instead.
VendorRefFullMaps to Desktop PayeeEntityRef.
TotalAmtFullRead-only from Desktop Amount; write-ignored on create/update — neither BillPaymentCheckAdd nor BillPaymentCreditCardAdd has a top-level Amount element in the OSR, Desktop derives it from the summed AppliedToTxnAdd/PaymentAmount values instead.
CheckPaymentFullCheckPayment.BankAccountRef ⇄ BankAccountRef.
CreditCardPaymentFullCreditCardPayment.CCAccountRef ⇄ CreditCardAccountRef.
PrintStatusPartialCheck flavor only; ⇄ IsToBePrinted. BillPaymentCheckAdd requires IsToBePrinted OR RefNumber (Desktop OSR); when a create supplies neither PrintStatus nor DocNumber, TenkeyBridge synthesizes IsToBePrinted=false so the Add stays schema-valid.
LinePartialLinkedTxn bills → AppliedToTxnAdd; additional LinkedTxn VendorCredit → SetCredit. Sparse updates cannot modify lines yet.
CurrencyRefNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.
ExchangeRateNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.

Everything else listed as full works unchanged.

Full fields
  • TxnDate
  • DocNumber
  • PrivateNote

Query support

Standard SELECT * FROM BillPayment with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • PayType outside Check/CreditCardUNSUPPORTED_BY_DESKTOP: Only Check and CreditCard map to Desktop bill-payment families.

Purchase

Verdict: Partial · Read: Full · Write: Partial — Fans out to Check / CreditCardCharge / CreditCardCredit by PaymentType

QBO fieldSupportNotes
PaymentTypePartialCheck and CreditCard map to Desktop families; Cash is partial (maps to Check against the supplied bank/petty-cash AccountRef — Desktop has no separate cash purchase type).
CreditFulltrue + PaymentType CreditCard → CreditCardCredit*; false/omitted → CreditCardCharge*.
AccountRefFullBank account (Check/Cash) or credit-card account (CreditCard).
EntityRefFullMaps to Desktop PayeeEntityRef (Customer/Vendor/Employee).
PrintStatusPartialNeedToPrint/PrintComplete ⇄ IsToBePrinted (Check family).
LineFullAccountBasedExpenseLineDetail and ItemBasedExpenseLineDetail via shared Bill line machinery. Sparse updates cannot modify lines yet.
TotalAmtFullRead-only from Desktop Amount.
CurrencyRefNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.
ExchangeRateNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.

Everything else listed as full works unchanged.

Full fields
  • TxnDate
  • DocNumber
  • PrivateNote

Query support

  • List query STARTPOSITION > 1 across multi-type familiesUNSUPPORTED_QUERY: Deep iterator pagination uses the primary Check family only; page-1 and filtered queries merge Check + CreditCardCharge + CreditCardCredit (per-type order concatenated).

Not supported

  • PaymentType outside Check/Cash/CreditCardUNSUPPORTED_BY_DESKTOP: Only Check, Cash (→Check), and CreditCard map to Desktop purchase families.
  • List query STARTPOSITION > 1 across multi-type familiesUNSUPPORTED_QUERY: Deep iterator pagination uses the primary Check family only; page-1 and filtered queries merge Check + CreditCardCharge + CreditCardCredit (per-type order concatenated).

PurchaseOrder

Verdict: Partial · Read: Full · Write: Partial — Non-posting; item lines only — never touches the GL on either side

QBO fieldSupportNotes
LinePartialItemBasedExpenseLineDetail only (PurchaseOrderLineAdd). AccountBasedExpenseLineDetail returns UNSUPPORTED_BY_DESKTOP. ReceivedQty maps from ReceivedQuantity on read (read-only). Sparse updates cannot modify lines yet.
TotalAmtFullRead-only from Desktop TotalAmount.
POStatusPartialOpen/Closed map to Desktop IsManuallyClosed, a Mod-only element — PurchaseOrderAdd has no IsManuallyClosed at all. Create with POStatus Open (or omitted) works; POStatus Closed on create returns UNSUPPORTED_BY_DESKTOP (create the PO open, then close it via an update). Closing via sparse update is not wired yet — POStatus is effectively read-only through TenkeyBridge until that lands.
APAccountRefNoneUNSUPPORTED_BY_DESKTOP — Purchase orders are non-posting — there is no AP account on Desktop POs.
CurrencyRefNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.
ExchangeRateNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.

Everything else listed as full works unchanged.

Full fields
  • VendorRef
  • TxnDate
  • DocNumber
  • VendorAddr
  • ShipAddr
  • DueDate
  • ExpectedDate
  • ShipMethodRef
  • PrivateNote

Query support

Standard SELECT * FROM PurchaseOrder with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • AccountBasedExpenseLineDetail on a PurchaseOrder lineUNSUPPORTED_BY_DESKTOP: Desktop PO lines are item-only. Use ItemBasedExpenseLineDetail, or post a Bill/Purchase for account expenses.
  • POStatus Closed on createUNSUPPORTED_BY_DESKTOP: Desktop's PurchaseOrderAdd has no IsManuallyClosed element — a PO can't be created already closed. Create it open, then close it via an update.

Vendor

Verdict: Full · Read: Full · Write: Full — 1099 / tax-ID field naming only

QBO fieldSupportNotes
PrintOnCheckNameFullDesktop PrintAs.
TaxIdentifierFullMaps to Desktop VendorTaxIdent.
Vendor1099FullMaps to Desktop IsVendorEligibleFor1099.
BalanceFullRead-only, as in QBO.
CustomFieldPartialName/StringValue populated from Desktop custom fields (DataExt); DefinitionId not available from Desktop; read-only for now. Accepted and ignored on write.
CurrencyRefPartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
ExchangeRatePartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.

Everything else listed as full works unchanged.

Full fields
  • DisplayName
  • Active
  • CompanyName
  • Title
  • GivenName
  • MiddleName
  • FamilyName
  • BillAddr
  • PrimaryPhone
  • AlternatePhone
  • Fax
  • PrimaryEmailAddr
  • AcctNum

Query support

Standard SELECT * FROM Vendor with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

VendorCredit

Verdict: Partial · Read: Full · Write: Partial — Bill mirror image — expense and item lines

QBO fieldSupportNotes
LineFullAccountBasedExpenseLineDetail and ItemBasedExpenseLineDetail via shared Bill line machinery. Sparse updates cannot modify lines yet.
TotalAmtFullRead-only from Desktop CreditAmount.
BalanceFullRead-only remaining credit from Desktop CreditRemaining.
CurrencyRefNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.
ExchangeRateNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.

Everything else listed as full works unchanged.

Full fields
  • VendorRef
  • APAccountRef
  • TxnDate
  • DocNumber
  • PrivateNote

Query support

Standard SELECT * FROM VendorCredit with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Account

Verdict: Full · Read: Full · Write: Full — AccountType / AccountSubType enum mapping

QBO fieldSupportNotes
ParentRefFullBecomes a Desktop sub-account; FullName is colon-delimited.
AccountTypePartialMapped per the COMPATIBILITY.md appendix; unmapped values return 422 UNMAPPED_ACCOUNT_TYPE. Desktop-only Non-Posting appears on reads.
AccountSubTypePartialAccepted and ignored — Desktop has no account subtype; reads never return one.
FullyQualifiedNameFullRead-only, derived by Desktop.
SubAccountFullRead-only, derived from Desktop Sublevel.
CurrentBalanceFullRead-only, as in QBO.
CurrentBalanceWithSubAccountsFullRead-only; Desktop TotalBalance.
ClassificationPartialAccepted and ignored on writes; not returned on reads — derive it from AccountType client-side.
CustomFieldPartialName/StringValue populated from Desktop custom fields (DataExt); DefinitionId not available from Desktop; read-only for now. Accepted and ignored on write.
CurrencyRefPartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
ExchangeRatePartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
CashFlowClassificationNoneUNSUPPORTED_BY_DESKTOP — Desktop AccountRet.CashFlowClassification has no honest QBO Account field; omitted rather than guessed at.
SpecialAccountTypeNoneUNSUPPORTED_BY_DESKTOP — Desktop SpecialAccountType has no honest QBO Account field; omitted rather than guessed at.

Everything else listed as full works unchanged.

Full fields
  • Name
  • Active
  • AcctNum
  • Description

Query support

Standard SELECT * FROM Account with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Deposit

Verdict: Partial · Read: Full · Write: Partial — Undeposited Funds → bank via LinkedTxn or manual DepositLineDetail

QBO fieldSupportNotes
LinePartialLinkedTxn (PaymentTxnID path) for undeposited payments, or DepositLineDetail{Entity, AccountRef, PaymentMethodRef, CheckNum}. Sparse updates cannot modify lines yet.
CashBackFullMaps to Desktop CashBackInfo.
TotalAmtFullRead-only from Desktop DepositTotal.
CurrencyRefNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.
ExchangeRateNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.

Everything else listed as full works unchanged.

Full fields
  • DepositToAccountRef
  • TxnDate
  • PrivateNote

Query support

Standard SELECT * FROM Deposit with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

JournalEntry

Verdict: Partial · Read: Full · Write: Partial — Debit/Credit lines split across Desktop JournalDebitLine / JournalCreditLine

QBO fieldSupportNotes
PrivateNoteFullMaps to Desktop Memo when the company file/OSR returns a header Memo on JournalEntry.
AdjustmentFullMaps to Desktop IsAdjustment.
LinePartialJournalEntryLineDetail only. Write splits by PostingType into JournalDebitLine / JournalCreditLine; read interleaves debit then credit lists. Debits must equal credits or create fails UNSUPPORTED_BY_DESKTOP before the Desktop round-trip. Sparse updates cannot modify lines yet (Desktop JE Mod replaces the entire line table when lines are provided — same out-of-scope stance as Invoice lines / issue #55). JournalEntryLineDetail.Entity: only EntityRef is populated on read — Desktop's line-level EntityRef carries no entity-kind flag, so we don't stamp a Type (Vendor/Customer/Employee); a wrong guess is worse than omitting it. Set Type yourself on write if you know it; it's accepted and simply not echoed back.
TotalAmtFullRead-only aggregate when present; not independently computed.
CurrencyRefNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.
ExchangeRateNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.

Everything else listed as full works unchanged.

Full fields
  • TxnDate
  • DocNumber

Query support

Standard SELECT * FROM JournalEntry with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • Unbalanced journal entry (debits ≠ credits)UNSUPPORTED_BY_DESKTOP: Desktop rejects unbalanced JEs. Balance debits and credits before create.
  • Line DetailType other than JournalEntryLineDetailUNSUPPORTED_BY_DESKTOP: Only JournalEntryLineDetail maps to Desktop journal lines.

Transfer

Verdict: Full · Read: Full · Write: Full — Bank-to-bank transfer between two accounts

QBO fieldSupportNotes
FromAccountRefFullMaps to Desktop TransferFromAccountRef.
ToAccountRefFullMaps to Desktop TransferToAccountRef.
CurrencyRefNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.
ExchangeRateNoneUNSUPPORTED_BY_DESKTOP — Multicurrency not yet supported.

Everything else listed as full works unchanged.

Full fields
  • Amount
  • TxnDate
  • PrivateNote

Query support

Standard SELECT * FROM Transfer with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • DeleteUNSUPPORTED_BY_DESKTOP: "Transfer" is not a valid qbXML TxnDelType enum value, so delete is not wired for this entity.

Class

Verdict: Full · Read: Full · Write: Full — Hierarchical Class list; SubClass/FullyQualifiedName from Desktop Sublevel/FullName

QBO fieldSupportNotes
ParentRefFullBecomes a Desktop sub-class; FullName is colon-delimited (e.g. Services:West Coast).
FullyQualifiedNameFullRead-only, derived by Desktop from the parent chain.
SubClassFullRead-only, derived from Desktop Sublevel (true when Sublevel > 0).

Everything else listed as full works unchanged.

Full fields
  • Name
  • Active

Query support

Standard SELECT * FROM Class with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

CompanyCurrency

Verdict: Full (read-only) · Read: Full · Write: None — Desktop CurrencyQuery list; empty when multicurrency is off (statusCode 3250, confirmed live, and 3170 both normalized to [])

QBO fieldSupportNotes
CodeFullDesktop CurrencyCode.

Everything else listed as full works unchanged.

Full fields
  • Name
  • Active

Query support

Standard SELECT * FROM CompanyCurrency with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • Create, update, or deleteUNSUPPORTED_BY_DESKTOP: CompanyCurrency is read/query only — Desktop CurrencyAdd/Mod is out of scope for this stretch entity; QBO also treats company currency catalog as admin-managed.

CustomerType

Verdict: Full (read-only) · Read: Full · Write: None — Read/query only — QBO CustomerType is read-only via the API; Desktop hierarchy is not exposed

Every field works unchanged.

Full fields
  • Name
  • Active

Query support

Standard SELECT * FROM CustomerType with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • Create or updateUNSUPPORTED_BY_DESKTOP: QBO's CustomerType is read-only via the API. TenkeyBridge matches that parity even though Desktop allows CustomerTypeAdd. Desktop ParentRef/Sublevel/FullName have no QBO CustomerType fields and are not surfaced.

Employee

Verdict: Full (read-only) · Read: Full · Write: None — Read/query only — no Desktop write path this release; payroll aggregates out of scope

QBO fieldSupportNotes
PrintOnCheckNameFullDesktop PrintAs.
CustomFieldPartialName/StringValue populated from Desktop custom fields (DataExt); DefinitionId not available from Desktop; read-only.
TargetBonusNoneUNSUPPORTED_BY_DESKTOP — Desktop payroll aggregate; license-gated and out of scope.
AdditionalContactRefNoneUNSUPPORTED_BY_DESKTOP — Desktop AdditionalContactRef has no honest QBO Employee field; omitted rather than guessed at.

Everything else listed as full works unchanged.

Full fields
  • GivenName
  • MiddleName
  • FamilyName
  • Suffix
  • DisplayName
  • Active
  • PrimaryPhone
  • Mobile
  • PrimaryEmailAddr
  • PrimaryAddr
  • HiredDate
  • ReleasedDate
  • BirthDate
  • Gender

Query support

Standard SELECT * FROM Employee with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • Create or updateUNSUPPORTED_BY_DESKTOP: Employee is read/query only this release; TenkeyBridge doesn't expose a Desktop write path for it.

ExchangeRate

Verdict: Partial · Read: Partial · Write: None — Projected from CurrencyRet.ExchangeRate + AsOfDate; one row per currency that carries a rate; empty when multicurrency is off (statusCode 3250, confirmed live, and 3170 both normalized to [])

QBO fieldSupportNotes
SourceCurrencyCodeFullDesktop CurrencyCode on the same CurrencyRet.
RateFullDesktop ExchangeRate.
AsOfDateFullDesktop AsOfDate when present; omitted when Desktop has none.
TargetCurrencyCodeNoneUNSUPPORTED_BY_DESKTOP — CurrencyRet has no per-row target; home currency lives on Preferences.CurrencyPrefs.HomeCurrency — never invented here.

Everything else listed as full works unchanged.

Query support

Standard SELECT * FROM ExchangeRate with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • QBO-style keyed lookup GET /exchangerate?sourcecurrencycode=EUR[&asofdate=...]UNSUPPORTED_QUERY: Real QBO keys ExchangeRate by sourcecurrencycode/asofdate query params. TenkeyBridge exposes it as a conventional Id-keyed resource (Id = Desktop currency ListID) with SELECT * queries — filter by SourceCurrencyCode client-side.
  • Create, update, or deleteUNSUPPORTED_BY_DESKTOP: ExchangeRate is read/query only — projected from CurrencyQuery, not a writable Desktop list.
  • Currencies without ExchangeRate on CurrencyRetUNSUPPORTED_BY_DESKTOP: Projection skips CurrencyRets that do not carry ExchangeRate (home currency rows often omit it).

PaymentMethod

Verdict: Partial · Read: Full · Write: Partial — Create only — Desktop has no PaymentMethodMod; Type coarsens Desktop's fine enum to CREDIT_CARD | NON_CREDIT_CARD

QBO fieldSupportNotes
TypePartialDesktop PaymentMethodType (Visa, Cash, Check, …) coarsens to QBO CREDIT_CARD

Everything else listed as full works unchanged.

Full fields
  • Name
  • Active

Query support

Standard SELECT * FROM PaymentMethod with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • UpdateUNSUPPORTED_BY_DESKTOP: Desktop has no PaymentMethodMod. Create a new PaymentMethod instead; list entities are not deleted — deactivate is also unavailable without Mod.

TaxAgency

Verdict: Full (read-only) · Read: Full · Write: None — Read-only projection — Vendors referenced by any ItemSalesTax.TaxVendorRef (no native Desktop TaxAgency list)

QBO fieldSupportNotes
DisplayNameFullVendor Name.
TaxTrackedOnPurchasesNoneUNSUPPORTED_BY_DESKTOP — No Desktop equivalent on the Vendor projection.
TaxTrackedOnSalesNoneUNSUPPORTED_BY_DESKTOP — No Desktop equivalent on the Vendor projection.

Everything else listed as full works unchanged.

Full fields
  • Active

Query support

Standard SELECT * FROM TaxAgency with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • Create or updateUNSUPPORTED_BY_DESKTOP: TaxAgency is a read-only projection of tax-vendor Vendors. Manage the Vendor (and ItemSalesTax.TaxVendorRef) in Desktop.

TaxCode

Verdict: Full · Read: Full · Write: Full — Desktop SalesTaxCode list (TAX/NON); Name max 3 chars (fail-loud, never truncated); a plain taxable/non-taxable flag pair, not a rate container

QBO fieldSupportNotes
NameFullDesktop limits Name to 3 characters. Longer names return 400 — never truncated.
DescriptionFullDesktop Desc.
TaxableFullDesktop IsTaxable.
SalesTaxRateListNoneUNMAPPED_FIELD — Desktop's US edition (QBD) does not have ItemSalesTaxRef/ItemPurchaseTaxRef on SalesTaxCode — the OSR marks both 'not in QBD' (they exist only for QBCA/QBUK/QBAU). US Desktop SalesTaxCode is just the taxable/non-taxable flag pair; rate association lives on ItemSalesTax items. Read TaxRate for rate values/agency. Never returned on read; writing it faults UNMAPPED_FIELD.

Everything else listed as full works unchanged.

Full fields
  • Active

Query support

Standard SELECT * FROM TaxCode with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

TaxRate

Verdict: Full (read-only) · Read: Full · Write: None — Read-only (parity with QBO) — Desktop ItemSalesTaxQuery; each single rate item is a TaxRate; sales-tax groups are not projected as TaxRates

QBO fieldSupportNotes
RateValueFullDesktop TaxRate percentage.
DescriptionFullDesktop ItemDesc.
AgencyRefFullDesktop TaxVendorRef — the tax agency Vendor.

Everything else listed as full works unchanged.

Full fields
  • Name
  • Active

Query support

Standard SELECT * FROM TaxRate with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • Create or updateUNSUPPORTED_BY_DESKTOP: TaxRate is read-only in QBO; TenkeyBridge matches that parity. Desktop ItemSalesTax items are managed as Items in the company file.
  • ItemSalesTaxGroup as TaxRateUNSUPPORTED_BY_DESKTOP: Sales-tax groups are not projected as TaxRate rows. Group members are themselves ItemSalesTax list items and appear as individual TaxRates via ItemSalesTaxQuery.

Term

Verdict: Partial · Read: Full · Write: Partial — Merged StandardTerms + DateDrivenTerms; Type STANDARD | DATE_DRIVEN dispatches which Desktop list; create-only

QBO fieldSupportNotes
TypeFullSTANDARD ⇄ StandardTerms*; DATE_DRIVEN ⇄ DateDrivenTerms*. Fixed at create — the whole entity is create-only, so this can never change via update.
DueDaysFullSTANDARD only — Desktop StdDueDays.
DiscountDaysFullSTANDARD only — Desktop StdDiscountDays.
DiscountPercentFullBoth types — Desktop DiscountPct.
DayOfMonthDueFullDATE_DRIVEN only.
DueNextMonthDaysFullDATE_DRIVEN only.
DiscountDayOfMonthFullDATE_DRIVEN only.

Everything else listed as full works unchanged.

Full fields
  • Name
  • Active

Query support

Standard SELECT * FROM Term with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • Update any Term fieldUNSUPPORTED_BY_DESKTOP: qbXML has no StandardTermsMod or DateDrivenTermsMod — Desktop's OSR only defines Add and Query for both Terms lists. Term write support is create-only.
  • Deactivate a TermUNSUPPORTED_BY_DESKTOP: Deactivation is a Mod-only operation (IsActive via StandardTermsMod/DateDrivenTermsMod), which doesn't exist in qbXML. Impossible via the SDK, not just unimplemented here.

TimeActivity

Verdict: Partial · Read: Full · Write: Partial — Employee time only; Duration compiled from Hours/Minutes or a StartTime/EndTime span

QBO fieldSupportNotes
NameOfPartialOnly "Employee" is accepted (or omitted); "Vendor" is rejected — see Not supported.
EmployeeRefFullRequired; Desktop EntityRef. Missing value returns 2020.
ItemRefFullDesktop ItemServiceRef.
DescriptionFullDesktop Notes.
BillableStatusPartialBillable, NotBillable, HasBeenBilled; any other value returns 2010. Desktop is stricter than QBO here: "Billable" requires BOTH CustomerRef and ItemRef on the same entry, or QuickBooks rejects the save ("Billable activities must have a customer:job and service item"). Send both, or mark the entry NotBillable. Omitted on create → we emit NotBillable explicitly (QBO's omitted-default); Desktop would otherwise infer Billable from CustomerRef alone. A sparse update that never mentions BillableStatus carries the stored value forward instead — the default only applies to genuinely-absent-on-create.
HoursFullExplicit duration input; wins over StartTime/EndTime when both are present.
MinutesFullExplicit duration input; wins over StartTime/EndTime when both are present.
StartTimeFullAlternate duration input paired with EndTime; Desktop only stores the computed Duration, not the span itself.
EndTimeFullAlternate duration input paired with StartTime; must be after it, or 2010.
BreakHoursPartialOnly valid alongside StartTime/EndTime; supplying it with Hours/Minutes returns 2010.
BreakMinutesPartialOnly valid alongside StartTime/EndTime; supplying it with Hours/Minutes returns 2010.
HourlyRatePartialAccepted and ignored — Desktop time tracking has no pay-rate override at the API level.
CostRatePartialAccepted and ignored — Desktop time tracking has no pay-rate override at the API level.
TaxablePartialAccepted and ignored — Desktop time tracking has no taxable flag.
CustomFieldPartialDesktop TimeTrackingQueryRq has no OwnerID element (qbXML 13.0), so custom fields are never returned for time entries. Accepted and ignored on write.
CurrencyRefPartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
ExchangeRatePartialAccepted and ignored — Desktop manages this itself; multi-currency mapping lands later.
PayrollItemRefNoneUNSUPPORTED_BY_DESKTOP — Desktop PayrollItemWageRef has no QBO Accounting TimeActivity equivalent (QBO Payroll is a separate product).
TxnNumberNoneUNSUPPORTED_BY_DESKTOP — Desktop's internal auto-increment TxnNumber has no QBO equivalent and is not surfaced.

Everything else listed as full works unchanged.

Full fields
  • TxnDate
  • CustomerRef
  • ClassRef

Query support

Standard SELECT * FROM TimeActivity with the shared WHERE / STARTPOSITION / MAXRESULTS subset documented in IDs, SyncToken & sparse updates. Anything outside that subset returns UNSUPPORTED_QUERY.

Not supported

  • Vendor/contractor time (NameOf: "Vendor", or a VendorRef)UNSUPPORTED_BY_DESKTOP: Only employee time is supported this release; vendor/contractor time tracking lands in a later TenkeyBridge release.

CompanyInfo

Verdict: Full (read-only) · Read: Full · Write: None — Read-only; Id equals the realm ID, no Desktop write path

QBO fieldSupportNotes
LegalNameFullDesktop LegalCompanyName.
CompanyAddrFullDesktop Address.
CustomerCommunicationAddrFullDesktop CompanyAddressForCustomer — an independent address, not a copy of CompanyAddr; absent if Desktop has none on file.
LegalAddrFullDesktop LegalAddress.
PrimaryPhoneFullDesktop Phone.
FiscalYearStartMonthFullDesktop FirstMonthFiscalYear; both sides use English month names (live-verified "January").
CountryFullDesktop Address.Country, passed through as free text — no normalization, and often blank on US company files.
NameValueNoneUNSUPPORTED_BY_DESKTOP — No Desktop CompanyRet equivalent — omitted rather than guessed at; never returned.
CompanyStartDateNoneUNSUPPORTED_BY_DESKTOP — No Desktop CompanyRet equivalent — omitted rather than guessed at; never returned.
SupportedLanguagesNoneUNSUPPORTED_BY_DESKTOP — No Desktop CompanyRet equivalent — omitted rather than guessed at; never returned.
DefaultTimeZoneNoneUNSUPPORTED_BY_DESKTOP — No Desktop CompanyRet equivalent — omitted rather than guessed at; never returned.
WebAddrNoneUNSUPPORTED_BY_DESKTOP — CompanyRet has no URL field — omitted rather than guessed at; never returned.

Everything else listed as full works unchanged.

Full fields
  • CompanyName
  • Email

Query support

  • Any WHERE clause, or STARTPOSITION/MAXRESULTSUNSUPPORTED_QUERY: CompanyQueryRq takes no filters and always returns the single open company record. Use SELECT * FROM CompanyInfo.

Not supported

  • Create, update, or deleteUNSUPPORTED_BY_DESKTOP: CompanyInfo is read/query only — there is exactly one company record, and Desktop has no API to create or modify it.
  • Any WHERE clause, or STARTPOSITION/MAXRESULTSUNSUPPORTED_QUERY: CompanyQueryRq takes no filters and always returns the single open company record. Use SELECT * FROM CompanyInfo.

Preferences

Verdict: Partial · Read: Partial · Write: None — Read-only singleton (Id=1); honest subset of Desktop PreferencesQuery groups

QBO fieldSupportNotes
AccountingInfoPrefsPartialClassTrackingPerTxn/ClassTrackingPerTxnLine ← IsUsingClassTracking (same bool projected to both); TrackDepartments always false (no Desktop Locations).
CurrencyPrefsPartialMultiCurrencyEnabled ← IsMultiCurrencyOn; HomeCurrency ← HomeCurrencyRef.
TimeTrackingPrefsPartialWorkWeekStartDate ← FirstDayOfWeek only.
TaxPrefsPartialUsingSalesTax true when SalesTaxPreferences is present on PreferencesRet; no other TaxPrefs fields.
SalesFormsPrefsPartialDefaultShipMethodRef; AllowEstimates/UsingProgressInvoicing from JobsAndEstimatesPreferences. DefaultTerms never populated — Desktop SalesAndCustomersPreferences carries no DefaultTermsRef (qbXML 13.0). IsAutoApplyingPayments has no honest QBO SalesFormsPrefs twin — omitted.
VendorAndPurchasesPrefsPartialUsingInventory ← IsUsingInventory only. DaysBillsAreDue / auto-discount have no honest QBO twin.
ReportPrefsPartialReportBasis ← SummaryReportBasis when Cash or Accrual.
ProductAndServicesPrefsNoneUNSUPPORTED_BY_DESKTOP — No honest PreferencesRet projection — omitted rather than guessed.
EmailMessagesPrefsNoneUNSUPPORTED_BY_DESKTOP — No honest PreferencesRet projection — omitted rather than guessed.
OtherPrefsNoneUNSUPPORTED_BY_DESKTOP — No honest PreferencesRet projection — omitted rather than guessed.

Everything else listed as full works unchanged.

Query support

  • Any WHERE clause, or STARTPOSITION/MAXRESULTSUNSUPPORTED_QUERY: PreferencesQueryRq takes no filters and always returns the single open company PreferencesRet. Use SELECT * FROM Preferences.

Not supported

  • Create, update, or deleteUNSUPPORTED_BY_DESKTOP: Preferences is read/query only in QBO and Desktop — there is no PreferencesAdd/Mod.
  • Any WHERE clause, or STARTPOSITION/MAXRESULTSUNSUPPORTED_QUERY: PreferencesQueryRq takes no filters and always returns the single open company PreferencesRet. Use SELECT * FROM Preferences.

Budget

Verdict: Planned · Read: None · Write: None — qbXML has no Budget records, but budget figures are readable through BudgetSummaryReportQuery — a read-only Budget synthesized from that report is planned; budget writes stay in the Desktop UI forever.

Desktop has a real qbXML analog, but TenkeyBridge has not shipped this entity yet. Requests return UNSUPPORTED_BY_DESKTOP with a link back here until the implementation lands.

Tracking: #101

Query support

  • queryUNSUPPORTED_BY_DESKTOP: Not yet implemented. qbXML cannot enumerate budgets — BudgetSummaryReportQuery requires a FiscalYear — so the planned query path probes a bounded fiscal-year window and synthesizes deterministic Ids. See the tracking issue for the design.
    • Workaround: Until the read path ships, pull the budget-vs-actual reports from Desktop directly (or export), not via the Accounting API.

Not supported

  • readUNSUPPORTED_BY_DESKTOP: Not yet implemented. qbXML has no Budget record API (no BudgetQuery in the qbxmlops130 message set), but BudgetSummaryReportQuery returns budget amounts by account × period (optionally × class or × customer), which is the data QBO's read-only Budget carries. A synthesized read is planned — see the tracking issue.
    • Workaround: Until the read path ships, pull the budget-vs-actual reports from Desktop directly (or export), not via the Accounting API.
  • queryUNSUPPORTED_BY_DESKTOP: Not yet implemented. qbXML cannot enumerate budgets — BudgetSummaryReportQuery requires a FiscalYear — so the planned query path probes a bounded fiscal-year window and synthesizes deterministic Ids. See the tracking issue for the design.
    • Workaround: Until the read path ships, pull the budget-vs-actual reports from Desktop directly (or export), not via the Accounting API.
  • createUNSUPPORTED_BY_DESKTOP: Permanent: qbXML has no BudgetAdd. Budget setup stays in the Desktop UI — QBO's own Budget entity is read-only too, so no QBO-compatible client loses anything here.
  • updateUNSUPPORTED_BY_DESKTOP: Permanent: qbXML has no BudgetMod. Budget changes stay in the Desktop UI.
  • deleteUNSUPPORTED_BY_DESKTOP: Permanent: qbXML has no BudgetDel.

Attachable

Verdict: Never · Read: None · Write: None — QuickBooks Desktop's qbXML API has no attachments interface — the word 'Attachment' does not occur anywhere in the qbxmlops130 message set.

This entity has no honest QuickBooks Desktop equivalent. Every verb returns UNSUPPORTED_BY_DESKTOP — never a silent empty list.

Query support

  • queryUNSUPPORTED_BY_DESKTOP: Desktop has no attachments API over qbXML — Attachable queries always fail loud.

Not supported

  • readUNSUPPORTED_BY_DESKTOP: Re-audited 2026-07-29: zero occurrences of any attachment message (no AttachmentAdd/Query/Ref of any kind) across the full qbxmlops130 schema. Desktop's Attached Documents feature is UI-only; files attached in Desktop cannot be listed or fetched through TenkeyBridge.
    • Workaround: Store documents in your own system keyed by the TenkeyBridge entity Id — that is what QBD integrations have always had to do.
  • queryUNSUPPORTED_BY_DESKTOP: Desktop has no attachments API over qbXML — Attachable queries always fail loud.
  • createUNSUPPORTED_BY_DESKTOP: Desktop has no attachments API over qbXML — attachments cannot be uploaded through TenkeyBridge.
  • updateUNSUPPORTED_BY_DESKTOP: Desktop has no attachments API over qbXML — attachments cannot be modified through TenkeyBridge.
  • deleteUNSUPPORTED_BY_DESKTOP: Desktop has no attachments API over qbXML — attachments cannot be deleted through TenkeyBridge.

Department

Verdict: Never · Read: None · Write: None — QBO Departments (locations) have no Desktop equivalent — the only 'Department'/'Location' strings in qbXML are free-text fields on Employee, FixedAsset, and Lead, and Desktop's one real dimensional list (Class) is already exposed faithfully as Class.

This entity has no honest QuickBooks Desktop equivalent. Every verb returns UNSUPPORTED_BY_DESKTOP — never a silent empty list.

Query support

  • queryUNSUPPORTED_BY_DESKTOP: qbXML has no Department/Location list to query — confirmed absent from the qbxmlops130 message set.
    • Workaround: Query Class instead if you remap locations client-side; that remapping is your call, TenkeyBridge never reinterprets DepartmentRef silently.

Not supported

  • readUNSUPPORTED_BY_DESKTOP: Re-audited 2026-07-29 against the qbxmlops130 message set: qbXML has no Department or Location list — no Add/Mod/Query message pair exists. The tokens only appear as plain STRTYPE fields (Employee.Department, FixedAsset.Location, Lead.Location), which are annotations, not a queryable list.
    • Workaround: If your integration treats QBO locations as just another dimension, remap DepartmentRef onto Class in your own code — Class is live in TenkeyBridge. We decided against a built-in Department→Class alias, even opt-in: ClassRef already maps to Class, so aliasing would make two QBO fields silently write one Desktop list and collide when a client sends both.
  • queryUNSUPPORTED_BY_DESKTOP: qbXML has no Department/Location list to query — confirmed absent from the qbxmlops130 message set.
    • Workaround: Query Class instead if you remap locations client-side; that remapping is your call, TenkeyBridge never reinterprets DepartmentRef silently.
  • createUNSUPPORTED_BY_DESKTOP: Desktop has no Department create. Use Class if you need a dimensional axis on Desktop.
  • updateUNSUPPORTED_BY_DESKTOP: Desktop has no Department update.
  • deleteUNSUPPORTED_BY_DESKTOP: Desktop has no Department delete.

JournalCode

Verdict: Never · Read: None · Write: None — France-only QBO regulatory feature; not applicable to Desktop — 'JournalCode' occurs nowhere in the qbxmlops130 message set.

This entity has no honest QuickBooks Desktop equivalent. Every verb returns UNSUPPORTED_BY_DESKTOP — never a silent empty list.

Query support

  • queryUNSUPPORTED_BY_DESKTOP: JournalCode is a France-locale QBO regulatory concept with no Desktop counterpart.

Not supported

  • readUNSUPPORTED_BY_DESKTOP: Re-audited 2026-07-29: JournalCode is a France-locale QBO regulatory concept (mandatory journal coding for FEC compliance) with zero counterpart in qbXML — US Desktop has no such concept to map.
  • queryUNSUPPORTED_BY_DESKTOP: JournalCode is a France-locale QBO regulatory concept with no Desktop counterpart.
  • createUNSUPPORTED_BY_DESKTOP: JournalCode is a France-locale QBO regulatory concept with no Desktop counterpart.
  • updateUNSUPPORTED_BY_DESKTOP: JournalCode is a France-locale QBO regulatory concept with no Desktop counterpart.
  • deleteUNSUPPORTED_BY_DESKTOP: JournalCode is a France-locale QBO regulatory concept with no Desktop counterpart.

RecurringTransaction

Verdict: Never · Read: None · Write: None — Desktop's memorized transactions are not exposed by qbXML — there is no message to list, read, create, or execute them.

This entity has no honest QuickBooks Desktop equivalent. Every verb returns UNSUPPORTED_BY_DESKTOP — never a silent empty list.

Query support

  • queryUNSUPPORTED_BY_DESKTOP: Memorized transactions cannot be enumerated via qbXML — zero functional API surface.

Not supported

  • readUNSUPPORTED_BY_DESKTOP: Re-audited 2026-07-29: no MemorizedTxn message of any kind exists in the qbxmlops130 message set. The only trace of the concept in the entire schema is a cosmetic 'memorizedTxn' row label in generic report output — a taxonomy tag, not an access path to a memorized transaction's contents or schedule.
    • Workaround: Manage memorized transactions in the Desktop UI. Transactions they generate ARE visible through TenkeyBridge once QuickBooks posts them — they arrive as ordinary invoices/bills/etc.
  • queryUNSUPPORTED_BY_DESKTOP: Memorized transactions cannot be enumerated via qbXML — zero functional API surface.
  • createUNSUPPORTED_BY_DESKTOP: Memorized transactions cannot be created via qbXML; manage them in the Desktop UI.
  • updateUNSUPPORTED_BY_DESKTOP: Memorized transactions cannot be updated via qbXML; manage them in the Desktop UI.
  • deleteUNSUPPORTED_BY_DESKTOP: Memorized transactions cannot be deleted via qbXML; manage them in the Desktop UI.

ReimburseCharge

Verdict: Never · Read: None · Write: None — QBO's billable-charge object has no Desktop record behind it — in qbXML, billability is a status flag (BillableStatus) on the source expense/item/time lines, never a standalone charge you can query.

This entity has no honest QuickBooks Desktop equivalent. Every verb returns UNSUPPORTED_BY_DESKTOP — never a silent empty list.

Query support

  • queryUNSUPPORTED_BY_DESKTOP: No standalone billable-charge object exists in qbXML to query; billability is line-level state on source transactions.

Not supported

  • readUNSUPPORTED_BY_DESKTOP: Re-audited 2026-07-29: 'ReimburseCharge' occurs nowhere in the qbxmlops130 message set. Desktop models billability as a BillableStatus enum (Billable / NotBillable / HasBeenBilled) on expense and item lines of purchase transactions and on time entries — there is no separate queryable charge object to project one from.
    • Workaround: Read billable state where Desktop actually keeps it: TimeActivity exposes BillableStatus today, and billable purchase lines live on their source Bill/Purchase transactions.
  • queryUNSUPPORTED_BY_DESKTOP: No standalone billable-charge object exists in qbXML to query; billability is line-level state on source transactions.
  • createUNSUPPORTED_BY_DESKTOP: ReimburseCharge is a QBO cloud concept with no Desktop qbXML analog; mark source lines Billable instead.
  • updateUNSUPPORTED_BY_DESKTOP: ReimburseCharge is a QBO cloud concept with no Desktop qbXML analog.
  • deleteUNSUPPORTED_BY_DESKTOP: ReimburseCharge is a QBO cloud concept with no Desktop qbXML analog.

TaxClassification

Verdict: Never · Read: None · Write: None — Cloud automated-sales-tax concept with no Desktop counterpart — Desktop's tax model is explicit tax items and codes, all of which TenkeyBridge exposes.

This entity has no honest QuickBooks Desktop equivalent. Every verb returns UNSUPPORTED_BY_DESKTOP — never a silent empty list.

Query support

  • queryUNSUPPORTED_BY_DESKTOP: TaxClassification is part of QBO's automated sales tax stack; Desktop uses explicit tax items/codes instead.

Not supported

  • readUNSUPPORTED_BY_DESKTOP: Re-audited 2026-07-29: 'TaxClassification' occurs nowhere in the qbxmlops130 message set. Desktop's tax machinery is ItemSalesTax / ItemSalesTaxGroup / SalesTaxCode — explicit records, not AST classification codes — and those ARE available through TenkeyBridge as TaxRate, TaxCode, and TaxAgency.
    • Workaround: Use TaxCode/TaxRate/TaxAgency for Desktop's real tax model instead of AST classifications.
  • queryUNSUPPORTED_BY_DESKTOP: TaxClassification is part of QBO's automated sales tax stack; Desktop uses explicit tax items/codes instead.
  • createUNSUPPORTED_BY_DESKTOP: TaxClassification cannot be created on Desktop via qbXML.
  • updateUNSUPPORTED_BY_DESKTOP: TaxClassification cannot be updated on Desktop via qbXML.
  • deleteUNSUPPORTED_BY_DESKTOP: TaxClassification cannot be deleted on Desktop via qbXML.

TaxService

Verdict: Never · Read: None · Write: None — Cloud AST onboarding operation with no Desktop counterpart — 'TaxService' occurs nowhere in the qbxmlops130 message set.

This entity has no honest QuickBooks Desktop equivalent. Every verb returns UNSUPPORTED_BY_DESKTOP — never a silent empty list.

Query support

  • queryUNSUPPORTED_BY_DESKTOP: TaxService is a QBO automated-sales-tax onboarding op with no Desktop API.

Not supported

  • readUNSUPPORTED_BY_DESKTOP: Re-audited 2026-07-29: TaxService is QBO's automated-sales-tax onboarding endpoint; qbXML has zero AST surface. Desktop tax setup happens through ItemSalesTax/SalesTaxCode records, exposed by TenkeyBridge as TaxRate/TaxCode/TaxAgency.
    • Workaround: Create tax rates and codes through TaxRate/TaxCode instead of the AST TaxService flow.
  • queryUNSUPPORTED_BY_DESKTOP: TaxService is a QBO automated-sales-tax onboarding op with no Desktop API.
  • createUNSUPPORTED_BY_DESKTOP: TaxService is a QBO automated-sales-tax onboarding op with no Desktop API.
  • updateUNSUPPORTED_BY_DESKTOP: TaxService is a QBO automated-sales-tax onboarding op with no Desktop API.
  • deleteUNSUPPORTED_BY_DESKTOP: TaxService is a QBO automated-sales-tax onboarding op with no Desktop API.

Batch

Verdict: Full · Read: Full · Write: Full — Batch envelope — up to 30 create/update/delete/query operations in one request, executed sequentially with per-item faults.

This is a gateway-level platform endpoint — not an entity. It cannot be queried or CRUD'd through the entity routes.

http
POST /v3/company/{realmId}/batch
QBO fieldSupportNotes
bIdFullRequired and unique per request; echoed verbatim on each BatchItemResponse slot.
operation (createupdatedelete)
Query itemsFullFull /query parity: the shared WHERE subset, STARTPOSITION/MAXRESULTS, iterator-backed deep pages.
per-item faultsFullA failed item returns a Fault slot (with the tkb help block); the rest of the batch still runs.

Everything else listed as full works unchanged.

Not supported

  • more than 30 itemsBATCH_TOO_MANY_ITEMS: QBO's own per-request cap, cloned. Split into multiple batch calls.
  • optionsData (e.g. void)BATCH_UNSUPPORTED_OPTION: No wired TxnVoid path against Desktop yet — the item faults loud; the rest of the batch runs.
  • transactional rollbackUNSUPPORTED_BY_DESKTOP: Batch is not a transaction (QBO's isn't either): items succeed or fault independently; earlier writes are never rolled back by a later failure.
  • entity CRUD or /query on Batch itselfUNSUPPORTED_BY_DESKTOP: Batch is a platform endpoint, not an entity — POST /v3/company/{realmId}/batch.

CDC

Verdict: Full (read-only) · Read: Full · Write: None — Change Data Capture — one poll returns changed + deleted records across entities.

This is a gateway-level platform endpoint — not an entity. It cannot be queried or CRUD'd through the entity routes.

http
GET /v3/company/{realmId}/cdc?entities=Invoice,Customer&changedSince=2026-07-01
QBO fieldSupportNotes
entitiesFullComma-separated QBO entity names. Unsupported names return per-entity Fault slots; live entities in the same request still return data.
changedSinceFullISO 8601 timestamp or YYYY-MM-DD, at most 30 days back (QBO's own limit).
deleted-record stubsFullstatus:'Deleted' stubs via Desktop's TxnDeletedQuery/ListDeletedQuery, with TimeDeleted as MetaData.LastUpdatedTime.

Everything else listed as full works unchanged.

Not supported

  • changedSince older than 30 daysCDC_INVALID_CHANGED_SINCE: Hard limit, cloned from QBO. Use /query with a MetaData.LastUpdatedTime filter for older data.
  • more than 1,000 objects for one entityCDC_OVERFLOW: Loud per-entity fault, never silent truncation. Page through /query instead.
  • deactivated list records reported as deletionsUNSUPPORTED_BY_DESKTOP: Desktop only hard-deletes unused list records. Active:false is a change, not a deletion — it surfaces as a changed record.
  • deleted TaxAgency / ExchangeRate / Transfer detectionUNSUPPORTED_BY_DESKTOP: Tax agencies are vendors on Desktop (deletion indistinguishable); exchange rates ride the Currency list; 'Transfer' is not a valid TxnDelType.

Reports

Verdict: Partial · Read: Partial · Write: None — Five QBO-compatible reports translated live from Desktop's report engine.

This is a gateway-level platform endpoint — not an entity. It cannot be queried or CRUD'd through the entity routes.

http
GET /v3/company/{realmId}/reports/ProfitAndLoss?start_date=2026-01-01&end_date=2026-12-31
QBO fieldSupportNotes
ProfitAndLoss / BalanceSheet / TrialBalanceFullGeneralSummaryReportQueryRq (ProfitAndLossStandard / BalanceSheetStandard / TrialBalance). Values verbatim from Desktop — no recomputation.
AgedReceivables / AgedPayablesFullAgingReportQueryRq (ARAgingSummary / APAgingSummary). Desktop's file-configured aging buckets come back as columns, honestly.
start_date / end_date / date_macroFullISO dates or QBO date macros (fiscal-relative on both sides, so macros map 1:1). Omit them and you get fiscal year-to-date, matching QBO — Desktop's own bare default is month-to-date, so TenkeyBridge always sends an explicit period.
report_dateFullThe aging reports are as-of a single date. Omit it and QBO's default (today) is used.
accounting_methodPartialREPORT_UNSUPPORTED_OPTION — Cash/Accrual on the three summary reports. Aging reports reject it — qbXML has no ReportBasis there.
Column titlesPartialDesktop's own column titles pass through verbatim, so aging buckets read '> 90' where QBO says '91 and over', and a period column reads 'Jan - Dec 26' where QBO says 'Total'. QBO's MetaData.ColKey has no Desktop equivalent and is not invented.

Everything else listed as full works unchanged.

Not supported

  • columns / customer / vendor / item / class / department / qzurl / adjusted_gain_lossREPORT_UNSUPPORTED_OPTION: Column and filter customization is v2. Desktop returns its standard report layout.
  • aging_period / num_periods / aging_methodREPORT_UNSUPPORTED_OPTION: Desktop aging buckets are company-file configuration, not request parameters.
  • summarize_column_by other than TotalREPORT_UNSUPPORTED_OPTION: qbXML SummarizeColumnsBy exists — clean v2 upgrade path.
  • other QBO report names (CashFlow, detail/aging-detail variants, …)REPORT_UNKNOWN: Planned. The fault lists the five supported reports.

TenkeyBridge is an independent product, not affiliated with, endorsed by, or sponsored by Intuit Inc. QuickBooks, QuickBooks Online, and QuickBooks Desktop are trademarks of Intuit Inc., used only to describe compatibility.

TenkeyBridge is an independent product, not affiliated with, endorsed by, or sponsored by Intuit Inc. QuickBooks, QuickBooks Online, and QuickBooks Desktop are trademarks of Intuit Inc., used only to describe compatibility.