Receipts

Every number here is either measured or marked missing.

Most fleet tools compete on how much they show you. Fleconomy is built around 15 rules about what it is not allowed to show you — because a confident wrong number costs more than a blank one. Your tax write-off never becomes your car’s value. A loan payment is never charged against profit. When a figure is unknown, the field stays empty.

Anyone can write that paragraph. So each rule below names the automated assertions that enforce it in the code, and this page is generated by running them: 112 cited assertions across 20 test files, re-verified every time the page is built. If one of them is renamed, deleted or starts failing, the build stops and this page does not publish.

How to read a card

  1. The promise — what it means for your numbers, in plain language.
  2. The rule — quoted verbatim from our internal product doctrine. The build fails if the two ever disagree, so this is the same sentence our engineers work to.
  3. What the opposite costs you — every rule exists because the other way was tried, shipped, or nearly shipped. This is what it did.
  4. Enforced by — the test file, and the exact assertions inside it, that would have to pass for the version you are using to have shipped at all.

Your tax write-off is never used as your car’s value.

The rule Tax depreciation is not economic depreciation.

Bonus and §179 expense the whole car in year one. A car that wrote off $7,500 and is still worth $7,500 has lost nothing — but a tool that reaches for the tax figure reports it as a total loss. The error is worst for the hosts who took the most correct treatment, which is why it has to be structural rather than a setting.

Enforced by test/vehicle-verdict.test.js
  • tax depreciation is reported but NEVER enters economic profit
  • with no FMV, economic profit is null — the tax figure is never substituted
  • structuralBasis says whether the cost line was measured or modelled

3 of 22 passing assertions in this file are cited above.

Your loan payment is split. Only the interest is charged against profit.

The rule A loan payment is not an expense.

Principal is a balance-sheet transfer — you are moving your own money from cash into equity in the car. Charge the whole payment against profit and a financed car reads as unprofitable next to an identical cash car that earns exactly the same. Cash flow and operating profit are reported separately here, and the gap between them is the principal, to the dollar.

Enforced by test/vehicle-economic-model.test.js
  • operating profit subtracts INTEREST only; cash flow subtracts the full payment
  • ROI is computed on operating profit, so principal never double-counts
  • a cash car has no financing input and the two profits converge

3 of 19 passing assertions in this file are cited above.

When we don’t know, the field stays empty. We do not fill it in.

The rule Absent is not zero, and it is never fabricated.

A guessed number is indistinguishable from a measured one once it is on screen, and it is the guesses that get quoted, filed and acted on. A missing market value yields no answer rather than a plausible one; a record backfilled from old data gets an id but never an invented creation date, because a date stamped “now” would make imported history look like something we watched happen.

Enforced by test/record-provenance.test.js
  • backfill assigns an id but NEVER invents a createdAt
  • backfill marks provenance unknown, never guesses manual
  • coverage of nothing is null, not 0% and not 100%

3 of 23 passing assertions in this file are cited above.

Enforced by test/vehicle-verdict.test.js
  • no acquisition/listing date means refuse, not guess
  • a zero acquisition cost yields a null ROI, never a divide-by-zero

2 of 22 passing assertions in this file are cited above.

Enforced by test/telemetry-economics.test.js
  • leak: no tracker matched → null with no_device, never 0
  • leak: no drives in the window is null (no_telemetry_in_window), never 0 miles
  • leak: fee unset → extra miles shown, dollars null (fee_unset)
  • leak: billed overage is unknown, so unbilled dollars stay null when there are extra miles
  • cost per measured mile refuses below 1,000 miles
  • health: days down are null unless the host confirmed the dates

6 of 35 passing assertions in this file are cited above.

Every cost line is on screen, and the lines add up to the total.

The rule Every cost line is shown, and the parts reconcile to the whole.

The classic error is quietly dropping the platform fee — the single largest cost most hosts have. On the fixture this guard uses, a card that omits it lands roughly $2,900 too high on one car. A profit figure you cannot decompose is a figure you cannot check, so the fee is its own line and the lines are asserted to sum.

Enforced by test/vehicle-verdict.test.js
  • the cost lines sum to cash profit, and the platform fee is its own line
  • a naive card that drops the fee line lands ~2,900 too high
  • cash and economic profit are separate, each with its own ROI

3 of 22 passing assertions in this file are cited above.

Enforced by test/ledger-core.test.js
  • a realized trip yields a Line 1 income entry and a Line 10 fee entry
  • summarizeByLine nets income against expense per line, and recoveries reduce expense

2 of 19 passing assertions in this file are cited above.

A host who joined two months ago cannot have a twelve-month result.

The rule Right-censoring is respected.

Without an explicit risk set, every retention and outcome curve bends upward for free: hosts who have not been here long enough to fail are counted as having not failed. That is how a product convinces itself its numbers are improving while nothing has changed. Too-new hosts are excluded from the denominator — and the guard below also proves real churn still moves the line, so the exclusion cannot be used to hide it.

Enforced by test/outcome-cohorts.test.js
  • a host too new to reach tenure N is EXCLUDED, never counted as churned
  • churn does lower activePct — the guard above must not mask real churn
  • rows with no tenure are dropped and counted, not guessed onto the axis
  • median is reported alongside mean because revenue is right-skewed

4 of 18 passing assertions in this file are cited above.

Enforced by test/telemetry-economics.test.js
  • year: a tracker connected mid-year is right-censored (device_connected_mid_year)
  • leak: before the tracker existed → before_device_coverage; connected mid-rental → caveat

2 of 35 passing assertions in this file are cited above.

No benchmark or aggregate is published until ten distinct accounts stand behind it, and no one account is more than 30% of it. (Numbers a member chooses to post in the Community are theirs to share, not an aggregate.)

The rule Nothing published below the k-anonymity floor.

A benchmark drawn from two hosts is not a benchmark, and in a small market it can identify them. The floor counts ACCOUNTS, not rows: one operator with twelve identical cars is one account and stays suppressed, which is the case a row-counting floor gets wrong in exactly the situation where privacy matters most. Ten is not enough if one account owns most of the cars, because the median is then that host’s own number with nine others standing nearby: a group where one account supplies more than 30% of its vehicles is withheld whole, not trimmed or reweighted, since trimming would publish an estimate of the figure we declined to measure. The ten is checked again by the database itself, which refuses to store a group of fewer. A suppressed group says it is withheld rather than reading as “no such car”, and is never replaced by an estimate.

Enforced by test/benchmark-cohorts.test.js
  • a cohort with fewer than 10 accounts returns nothing
  • the group publishes at exactly ten distinct accounts
  • one account with twelve cars is one account, not a cohort
  • the floor is counted per metric, so a field only some accounts share stays suppressed
  • no single account can contribute more than 30% of a cohort
  • exactly 30% is allowed, anything above is not
  • a dominated cohort is suppressed, not trimmed to an estimate

7 of 14 passing assertions in this file are cited above.

Enforced by test/benchmark-rls.test.js
  • the aggregate table refuses a cohort below ten accounts at the database level

1 of 6 passing assertions in this file are cited above.

Enforced by test/network-intelligence.test.js
  • one host with six identical cars is ONE host, and stays suppressed
  • the default floor is the one cohort floor, ten distinct accounts
  • a suppressed model explains itself instead of reading as "no such car"

3 of 25 passing assertions in this file are cited above.

You see benchmarks only if you share. If you do not, you see none.

The rule Benchmarks are opt-in, and only opted-in accounts see them.

A pool that anyone can read without contributing is a pool nobody has a reason to join, and a toggle that only the browser knows about cannot stop a stale or hostile client. The server keeps the record of when you agreed and to which version of the terms, refuses to store a contribution without it, and answers an account without it with the invitation and nothing else: no figure, no count.

Enforced by test/benchmark-routes.test.js
  • a non-opted-in account sees no benchmark data, only the opt-in prompt
  • a non-opted-in account's data never appears in any aggregate
  • opting in records a timestamp and the terms version, and logs an event
  • a backfilled consent with no recorded date is pending confirmation, not opted in
  • every cross-host read route sits behind the opt-in gate
  • contributing needs a live server-side opt-in, and the legacy unconsented routes are gone

6 of 21 passing assertions in this file are cited above.

Turn sharing off and your numbers leave the pool.

The rule Opting out removes your contribution from the next aggregate.

If “off” only meant “stop sending more”, your last snapshot would sit in the pool for good, and the toggle would be a one-way door. Turning it off deletes what you contributed immediately, the next daily aggregate is computed without it, and deleting your account removes your consent record too. Monthly snapshots already published are not rewritten; they hold at least ten accounts and name none, and the terms say so.

Enforced by test/benchmark-routes.test.js
  • opting out removes the contribution from the next aggregate
  • opting out keeps a consent opt-out even if a stale client pushes again
  • account deletion purges the consent record and its events

3 of 21 passing assertions in this file are cited above.

No host, and no browser key, can read another host’s rows.

The rule No account can read another account's rows.

Isolation that depends on every route remembering to filter is isolation until the first route that forgets. Here the tables are default-deny at the database (row-level security on, no policies, public roles revoked), every query that touches a per-account table is scoped to the caller’s own key, and the only cross-host table has no account column to read. The one deliberate exception is the Community: profiles, posts, comments and likes are visible to other members by design, and never expose a licence key or email.

Enforced by test/benchmark-routes.test.js
  • no account can read another account's rows via any API route
  • the benchmark routes never query another account by any other means (source scan)

2 of 21 passing assertions in this file are cited above.

Enforced by test/benchmark-rls.test.js
  • every benchmark table has RLS enabled
  • no benchmark table defines a policy (zero policies = default deny)

2 of 6 passing assertions in this file are cited above.

A group figure never carries a plate, a VIN, an address or a name.

The rule Aggregates carry no identifiers.

An aggregate that keeps even one identifying field is a list with extra steps. A published group holds a market, a vehicle class, a metric and counts, and nothing else: a hostile payload carrying a VIN, plate, address, guest or trip date leaves no trace in what is published, and the table that stores it has no column that could hold one.

Enforced by test/benchmark-cohorts.test.js
  • aggregates contain no plate, VIN or address fields
  • an unknown or malformed metro / class / bucket is excluded, never zero-filled

2 of 14 passing assertions in this file are cited above.

Enforced by test/benchmark-rls.test.js
  • the aggregate table cannot hold an account identifier

1 of 6 passing assertions in this file are cited above.

The detail you pay for is gated on our server, not in your browser.

The rule Benchmark detail follows the plan, enforced on the server.

A gate that lives in the page is a suggestion: anyone can call the route directly. The basic comparison is open to any opted-in account and carries only the median and the group size; percentile bands, the class breakdown and the trend answer 402 unless the account holds the Exit & Investor Suite, through the same entitlement map as every other add-on.

Enforced by test/benchmark-routes.test.js
  • basic vs. full benchmark detail is enforced server-side by entitlement
  • Solo cannot hold the Exit & Investor Suite, so Solo gets the basic comparison only

2 of 21 passing assertions in this file are cited above.

Selling a car does not erase what it earned.

The rule A host's economic history is never destroyed.

Most fleet tools treat a sold car as a row to remove, which quietly deletes the only complete record you will ever have of that car: the one that runs from purchase to sale. Disposal is a status here, not a delete. A gone car is marked and kept — in the roster, in the pickers, in the year it actually traded — rather than dropped from the surfaces that are about it. The same holds for a tracker: disconnecting one stops new data arriving, and keeps every trip it already recorded.

Enforced by test/vehicle-disposition.test.js
  • source guard: the Fleet card marks a gone vehicle instead of dropping it
  • source guard: vehicle pickers keep gone cars and label them
  • source guard: the fleet schedule partitions before it renders or counts
  • the rule keeps a disposed car that actually traded that year

4 of 27 passing assertions in this file are cited above.

Enforced by test/telemetry-routes.test.js
  • disconnect keeps history: tokens are dropped, trips, devices and events stay

1 of 97 passing assertions in this file are cited above.

You will not be shown a forecast wearing the clothes of a measurement.

The rule A predictive model over network data.

The network only sees the cars hosts KEPT. Survivorship biases it upward, and biases it worst for the models that disappoint most — so a confident “this model returns X” would be most wrong exactly where it would cost you most. That model is a standing refusal, with a written condition for revisiting it. What does ship is labelled: a projection refuses to run on thin history, returns a range from observed variance rather than a point, and travels with its survivorship caveat attached to the payload.

Enforced by test/vehicle-economic-model.test.js
  • the forecast refuses below six months of history
  • the forecast returns a range from observed variance, not a point estimate
  • the forecast is labelled an extrapolation and disclaims a confidence interval
  • the score states that its weights are editorial, not fitted

4 of 19 passing assertions in this file are cited above.

Enforced by test/network-intelligence.test.js
  • survivorship and the not-a-prediction caveat travel on every payload
  • every distribution states that its values are midpoints, not measurements
  • your own car is placed in a quartile band, never a fake percentile

3 of 25 passing assertions in this file are cited above.

We identify ourselves. Nothing here is scraped in disguise.

The rule Authorized data only.

The data behind your numbers arrives through official APIs, imports you authorize, CSVs you export and emails you forward. The one place this product reaches a third party’s server unprompted — the monthly fetch of Turo’s public terms, kept current so the in-app reference is not stale — sends a User-Agent naming the product, its purpose and a contact address. It previously impersonated Chrome; when an honest agent is declined the supported answer is saved HTML, not a better disguise.

Enforced by test/tos-fetcher-identity.test.js
  • the agent names the product, so the operator is identifiable
  • the agent carries a contact route back to us
  • NO transport impersonates a browser
  • a refusal is answered with saved HTML, never with escalation

4 of 9 passing assertions in this file are cited above.

The complaints, answered

The rules above say what a number here is not allowed to do. These are the other half: problems Turo hosts describe again and again when they talk publicly about running a fleet, paraphrased in their terms, each with the part of Fleconomy IQ that answers it. Same standard — every answer names the rule it obeys and the assertions that prove it, and this page does not build if one of them stops passing.

The complaint, paraphrased

My write-off says the car is worth nothing. It obviously isn’t.

Answered in Valuation and the per-vehicle verdict

Tax book value and market value are two numbers, kept apart. Bonus or §179 can take book value to zero in year one; the car’s value comes from the market, and what it gained or lost is measured against that — above book or below it, and blank when there is no market figure to measure against.

Obeys the rule Tax depreciation is not economic depreciation.

Enforced by test/valuation-core.test.js
  • bookValueAsOf: integrates with the real FKCalc engine
  • fmvDelta: positive (worth more than book), negative, and null guards

2 of 18 passing assertions in this file are cited above.

Enforced by test/vehicle-verdict.test.js
  • tax depreciation is reported but NEVER enters economic profit
  • with no FMV, economic profit is null — the tax figure is never substituted

2 of 22 passing assertions in this file are cited above.

The complaint, paraphrased

Nobody warned me about self-employment tax until the bill came.

Answered in Reconcile (Schedule C flow)

Self-employment tax is its own line under net profit — 15.3% on 92.35% of it — with the deductible half shown beside it instead of quietly netted in. It stops at the Social Security wage base when you also earn W-2 wages, charges nothing below the $400 floor where none is owed, and does not appear at all if you report on Schedule E.

Obeys the rule Every cost line is shown, and the parts reconcile to the whole.

Enforced by test/calcs.test.js
  • computeSeTax(50000, 0, 2024).seTax ≈ $7,064.78
  • computeSeTax(50000, 150000, 2024).seTax ≈ $3,645.48
  • computeSeTax half-SE deduction excludes the 0.9% surtax
  • computeSeTax(300) = $0 — net SE earnings $277 are under the $400 floor

4 of 95 passing assertions in this file are cited above.

Enforced by test/reconcile-1099k.test.js
  • self-employment tax is its own line on Schedule C, with the ½ deduction beside it
  • net after SE tax reconciles from the lines above it
  • Schedule E (passive rental) shows no SE tax line at all

3 of 8 passing assertions in this file are cited above.

The complaint, paraphrased

My 1099-K is bigger than the money I actually got.

Answered in Reconcile

It is supposed to be. The 1099-K reports gross; your bank received that gross minus the platform fee. The tab shows the gross, the deposit and the gap as three lines that add up, puts the full gross on Schedule C Line 1 — never the deposit — and deducts the fee as its own expense line.

Obeys the rule Every cost line is shown, and the parts reconcile to the whole.

Enforced by test/reconcile-1099k.test.js
  • the 1099-K gross and the bank deposit are two separate lines
  • gross minus deposit equals the platform-fee line, to the dollar
  • Schedule C Line 1 is the FULL gross plus delivery, never the deposit
  • every deduction is its own line and the lines sum to the total
  • Line 1 minus total deductions is Line 28 net profit

5 of 8 passing assertions in this file are cited above.

The complaint, paraphrased

Same car, same trip, different paycheck — and I can’t tell which protection plan pays me more.

Answered in Insurance Plan

Each plan’s host share is weighted by your own booking lead-time mix, not read off the top of its range. Each is then charged its own damage responsibility per claim and your own insurance, so plans are compared on what you keep. Until you enter a claim size and how often you claim, no plan is recommended — with no damage input the plan that makes you cover the most damage always looks best.

Obeys the rule Absent is not zero, and it is never fabricated.

Enforced by test/insurance-plan.test.js
  • the effective host share is the lead-time mix weighted across the four tiers
  • each plan is charged its own damage responsibility, capped at the claim size
  • true annual net = payout − damage exposure − own insurance, per plan
  • with frequent large claims the low-deductible plan can win — the headline share does not decide
  • with no claim size or frequency, no plan is recommended

5 of 5 passing assertions in this file are cited above.

The complaint, paraphrased

What is the whole thing even worth?

Answered in Valuation

Each car is valued from live market listings, or from your own figure if you enter one — yours outranks the estimate and is labelled as yours. With no usable market price there is no estimate at all, rather than a placeholder that reads like one.

Obeys the rule Absent is not zero, and it is never fabricated.

Enforced by test/valuation-core.test.js
  • extractPriceStats returns null with no usable price
  • marketcheckQueryFor returns null without year+make+model

2 of 18 passing assertions in this file are cited above.

Enforced by test/valuation-manual-value.test.js
  • manual value outranks market FMV
  • label credits the host, not the estimator
  • clearing drops the stored value

3 of 20 passing assertions in this file are cited above.

The complaint, paraphrased

Will buying another car actually pay off, or am I just growing the fleet?

Answered in Freedom Planner

The return shown for a car you are planning is that car’s own after-tax return on its own purchase price. Income from the fleet you already run is never divided into the new car’s cost to flatter it, and a planned car with no price yet is left out of both sides instead of counted as free.

Obeys the rule Every cost line is shown, and the parts reconcile to the whole.

Enforced by test/freedom-planner-roi.test.js
  • per car: trueY1Return === afterTaxOperating + taxSavedY1
  • the defect: existing fleet income over planned-car capital inflates the tile
  • a planned car with no purchase price is on NEITHER side
  • the card ROI is a capital-weighted mean, so it lies between the per-car ROIs

4 of 11 passing assertions in this file are cited above.

The complaint, paraphrased

Is my car doing well, or is everyone else doing better with the same model?

Answered in Benchmarks

Your car is compared with similar cars on other hosts’ fleets only once ten distinct accounts stand behind the number. You are placed in a quartile band, not given a precise-looking percentile, and a model with too few hosts says it is withheld rather than looking like no one owns it.

Obeys the rule Nothing published below the k-anonymity floor.

Enforced by test/network-intelligence.test.js
  • one host with six identical cars is ONE host, and stays suppressed
  • the group publishes once distinct hosts reach the floor
  • your own car is placed in a quartile band, never a fake percentile
  • a suppressed model explains itself instead of reading as "no such car"

4 of 25 passing assertions in this file are cited above.

What this page is not

This is our own test suite, not a third-party audit. It proves each rule is enforced in code — not that the code is free of bugs, and not that any number is right for your situation. Nothing here is tax, legal or financial advice.

It also is not a claim about anyone else’s software. Other tools may handle these cases well; we can only show you our own work. Fleconomy is not affiliated with, endorsed by, or partnered with Turo — Turo is one supported data source.

Found a number in Fleconomy IQ you think one of these rules should have caught? That is a bug and we want it: [email protected].

Start free — no card Score one car, free

Free forever for one vehicle. Estimates only. Not tax, legal, or financial advice.