Skip to main content

How we model accounting

Two worked examples for accounting AI vendor diligence. Both have honest answers below.

Recent accounting-technology coverage has converged on a useful vendor test: ask the AI to “show me how you handle depreciation and debt-like items.” Both look simple from the outside and require real accounting judgment underneath. Here is exactly what SynthGL handles today, with links to the code, and what is explicitly scope-bound for V1.5 and V2.

Worked example #1

Depreciation: four presentation styles, one taxonomy, honest scope lines.

Depreciation looks like one number and behaves like four. SynthGL classifies three of the four presentation styles today and flags the fourth for override. Everything a reviewer needs to verify the number traces back to a specific file path or an explicit V1.5 / V2 scope line.

Presentation styles we classify

The financial-statement line-item (FSLI) taxonomy in src/synthgl/app/data/taxonomy/v1.yaml defines separate nodes for gross PPE, accumulated depreciation, net PPE, and D&A opex. The EBITDA bridge template at src/synthgl/app/data/templates/ebitda_bridge.yaml drives the add-back filter.

Separate line in opex

Shipped

Auto-classified under is.opex.depreciation in the taxonomy; feeds the EBITDA D&A add-back rule in ebitda_bridge.yaml.

Split across functional lines (R&D, S&M, G&A)

Shipped

Each allocation is classified individually against the opex subtree and rolls up to total D&A through mapping rules. Provenance retained per cell.

Embedded in COGS

V1.5 scope

Detected today via user override on the COGS account; the depreciation portion flows to the D&A add-back once flagged. Automatic detection is a V1.5 candidate.

Manufacturing absorption (capitalized into inventory)

V2 scope

Surfaced as an override today. Absorption reversal against inventory roll-forward requires the capex + production-volume inputs scoped for V2.

Roll-forward

The ingredients are shipped. The automatic break-detection is V1.5.

Every node in the walk below exists in the taxonomy and resolves to a specific account on the verified balance sheet. Deterministic per-asset depreciation events are generated in packages/synthgl-core events/fixed_assets.py.

  1. Gross PPE, beginning

    bs.assets.noncurrent.ppe_gross, prior period close

  2. + Capex (additions)

    From the fixed-asset schedule; reconciled against cash-flow investing section.

  3. − Disposals (gross)

    Pulled from the disposal register where available; manual entry where not.

  4. = Gross PPE, ending

    bs.assets.noncurrent.ppe_gross, current period close

  5. Accumulated depreciation, beginning

    bs.assets.noncurrent.accumulated_depreciation, prior period close

  6. + Period depreciation

    Straight-line per-asset, per-period events. See packages/synthgl-core events/fixed_assets.py.

  7. − Disposals (accumulated)

    Proportional to gross disposal. Mid-period disposals are a V2 scope item.

  8. = Accumulated depreciation, ending

    bs.assets.noncurrent.accumulated_depreciation, current period close

  9. Net PPE, ending

    Gross − Accumulated. Sanity-tied to bs.assets.noncurrent.ppe_net on the published balance sheet.

V1.5 scope: automatic beg + depr − disp = end reconciliation. Today the ingredients are surfaced with provenance; the deterministic break-detection rule is queued as a GitHub issue against the cross-reference engine.

EBITDA bridge

Depreciation lands in the Reported EBITDA stage.

Filter is deterministic: the D&A add-back row uses a mapping.primary_fsli in [pnl.opex.depreciation, pnl.opex.amortization] rule. No LLM between the source cell and the bridge line.

Net Incomepnl.net_income prefix
+ Tax Provisionpnl.tax_expense prefix
+ Interest Expense (net)pnl.interest prefix
+ Depreciation & Amortizationpnl.opex.depreciation, pnl.opex.amortization
= Reported EBITDASum, feeds downstream Quality of Earnings adjustment waterfall

Source: ebitda_bridge.yaml lines 77-99. Every figure clicks through to the originating cell on the source document.

Book vs tax

SynthGL models book depreciation today. Tax is V2.

The depreciation events generated by the core engine are straight-line, per-asset, per-period book depreciation. Tax depreciation (MACRS, §179 expensing, bonus depreciation) requires the capex schedule and tax basis inputs that SynthGL does not yet ingest. That is queued as a V2 scope item tied to the Form 4562 / depreciation schedule ingestion pathway. The page will not pretend the two are the same number.

Worked example #2

Debt-like: nine trade-coverage categories, three Quality-of-Earnings practice adds, four treatments.

Debt-like classification is where a generic LLM fails loudly. It will confidently mis-treat an operating-lease liability or a pension obligation. SynthGL ships a deterministic classifier with explicit default rules, a live API for the enterprise-value bridge, and an override surface for deal-specific judgment.

The 12 categories SynthGL classifies by default

Nine come from accounting trade coverage on AI vendor diligence. Three are additions drawn from Quality of Earnings practice where a generic LLM gets the treatment wrong more often than right. Default financial-statement line-item prefixes live in src/synthgl/app/services/data_room_nwc.py.

Operating lease liability (current)

Accounting Today

bs.liabilities.current.operating_lease_liability_current

DEBT_LIKE

Operating lease liability (non-current)

Accounting Today

bs.liabilities.noncurrent.operating_lease_liability_noncurrent

DEBT_LIKE

Finance lease liability (current)

Accounting Today

bs.liabilities.current.finance_lease_liability_current

DEBT_LIKE

Finance lease liability (non-current)

Accounting Today

bs.liabilities.noncurrent.finance_lease_liability_noncurrent

DEBT_LIKE

Deferred consideration / holdback

Accounting Today

bs.liabilities.noncurrent.deferred_consideration

DEBT_LIKE

Earnout liability (contingent consideration)

Accounting Today

bs.liabilities.noncurrent.earnout_liability

DEBT_LIKE

Pension / OPEB obligation

Accounting Today

bs.liabilities.noncurrent.pension_obligation

DEBT_LIKE

Seller note

Accounting Today

bs.liabilities.noncurrent.seller_note

DEBT_LIKE

Environmental / asset-retirement obligation

Accounting Today

bs.liabilities.noncurrent.environmental_liability

DEBT_LIKE

Factored receivables (off-balance-sheet financing)

Quality of Earnings practice

Flagged via user override; surfaced from AR aging.

DEBT_LIKE

Uncleared checks (book cash vs bank cash)

Quality of Earnings practice

Proof-of-cash reconciliation surfaces the variance; reclassified on override.

CASH_LIKE reduction

Deferred revenue (context-dependent)

Quality of Earnings practice

bs.liabilities.current.deferred_revenue / bs.liabilities.noncurrent.deferred_revenue_lt

Override; default OPERATING

The treatment taxonomy

Four treatments, each with a defined effect on net working capital and the enterprise-value (EV) bridge. Enum lives in src/synthgl/app/domain/fdd/enums.py. Default-rule ordering (most-specific first) in _DEFAULT_TREATMENT_RULES.

DEBT_LIKE

Economic debt that a buyer will assume or refinance at close, even if not labeled as debt on the face of the balance sheet.

Effect: Subtracted from equity value in the enterprise-value (EV) bridge; excluded from net working capital (NWC).

CASH_LIKE

Liquid assets that reduce the price a buyer pays at close.

Effect: Added to equity value in the enterprise-value bridge; excluded from net working capital.

OPERATING

Working-capital items tied to the ordinary operating cycle of the business.

Effect: Included in the net-working-capital calculation; neither debt-like nor cash-like in the EV bridge.

EXCLUDED

Items outside both net working capital and the EV bridge (e.g., deferred tax liability in most Quality of Earnings methodologies).

Effect: Neither in net working capital nor in the EV bridge; flagged in the account-treatment view for reviewer awareness.

Live API

The enterprise-value bridge is a shipped endpoint, not a slide.

Design partners get a walkthrough on their own engagement. The call is:

GET /room/engagements/{engagementId}/datasets/{datasetId}/nwc/ev-bridge

→ {
    "debt_like_items":   [ ... ],
    "cash_like_items":   [ ... ],
    "total_debt_like":   { "FY2024": <amount> },
    "total_cash_like":   { "FY2024": <amount> },
    "period_labels":     [ "FY2024" ]
  }

Override persistence via PUT /nwc/treatments. Re-calling the bridge after an override shows the new classification live - the ordering rule in _DEFAULT_TREATMENT_RULES puts explicit overrides ahead of defaults.

Cross-reference

Debt schedule ties back to the balance sheet. Deterministically.

Rule XREF_09_01 in the cross-reference engine reconciles the debt schedule total against the bs.liabilities debt aggregate. Tolerance is 100 minor units (1 unit of reporting currency) by default; priority is high, meaning a break surfaces on the reviewer dashboard, not buried in a log.

This is a frozen dataclass rule, not an LLM judgment call. Same debt schedule in, same reconciliation result out, every run.

Source: src/synthgl/app/domain/fdd/cross_ref_rules.py lines 300-314. Full rule catalog in Plans/data-room/plans/cross-document-reconciliation-master-taxonomy.md.

Industry-specific patterns

O&G, healthcare, and auto carry their own debt-like quirks.

Asset-retirement obligations in oil & gas, chargeback liabilities in pharma, and dealer-floor-plan financing in auto each need industry-specific rule sets on top of the 12 defaults above. Those are catalogued in the cross-document reconciliation master taxonomy and land as rule additions during an engagement that touches them. Today they are override territory; tomorrow they ship as default rules.

Vendor diligence mapping

How this page answers accounting AI vendor diligence questions.

Accounting trade coverage and advisory-firm procurement forms keep circling the same practical criteria: domain expertise, data governance, shipped capability, human enablement, and clear pricing. Here is where each one is answered and what is still in flight.

1. Industry expertise + data governance

How do you handle depreciation and debt-like items?

Covered on this page. Data-governance half of the criterion is at /trust.

2. Execution track record

What have you actually shipped?

Every capability on this page links to a specific file in the monorepo or an API endpoint. Pilot charter lays out three binary success criteria per engagement and an exit clause - request it by email.

3. Enablement vs replacement

Does this augment our associates or try to replace them?

The deterministic rules (cross-references, EBITDA bridge, enterprise-value bridge) surface ingredients with full provenance. Associates review, override, and carry judgment forward. The page on /trust covers the memory model that accumulates those judgments per engagement.

4. Pricing transparency

What does a pilot cost and what is the path after?

Pilot charter includes a fixed pilot fee, scope, exit clause, and production-pricing ladder. Sent with the DPA before any data touches the system.

Source context: Accounting Today coverage on AI vendor diligence for accounting and advisory firms.

What to do next

If a specific engagement pattern is not covered above, send us the pattern.

The treatment taxonomy and cross-reference rule library grow as engagements arrive. If you are running a deal with a non-obvious debt-like item (mandatorily redeemable preferred, put options, contingent vendor liabilities, structured earnouts) and want to see how SynthGL models it, email hello@synthgl.com. A pilot charter and DPA are available under NDA before any data touches the system.