taxshift

Data methodology

Where the TaxShift data comes from.

TaxShift is a public-data walkthrough. It gathers parcel records, tax history, levy rates, and agency financial context, then turns those records into a plain-English property tax snapshot.

83,391 active parcels in the current assessor roll
2026 current roll tax year shown for most parcels
1992-2025 parcel tax-history years loaded
2016-2026 levy-rate composition years loaded

The short version

For each parcel, TaxShift starts with the Skagit County Assessor parcel roll. That gives us the parcel number, address, owner name, levy code, assessed value, taxable value, exemption codes, and current tax amount. We then join that parcel to levy-rate tables so we can estimate which agencies receive pieces of the bill. Finally, we add public financial context from the Washington State Auditor where an agency can be matched to a reporting ID.

Source 1: Current parcel roll

The current parcel facts come from the Skagit County Assessor data export and property search records. In the database this is the `skagit_parcels` table. TaxShift filters out inactive parcels, then uses the current parcel roll for the displayed bill amount, assessed value, taxable value, exemption fields, levy code, and property address.

Important wording: when a report says "tax year," it means the tax year value in the parcel roll. It should not be displayed as "payable in the next year" unless a separate source explicitly says that. The parcel detail page now avoids that unsupported year-plus-one wording.

Source 2: Parcel tax history

Historical parcel values and tax bills come from Skagit County's public property-search webservice. The loader requests the public history page for each parcel, parses the "Assessed Values" table, and stores tax year, value year, building value, land value, total value, and tax amount in `skagit_parcel_history`.

Current loaded history covers tax years 1992 through 2025 for 83,052 parcels. The history scrape in this database ran from June 16, 2026 to June 17, 2026.

Because the latest assessor roll can be newer than the scraped history table, the report merges the current roll into the history chart when needed. That keeps the headline bill and chart aligned with the current parcel record.

Source 3: Levy rates and agencies

Skagit County parcels contain a levy code. TaxShift joins that code to `skagit_levy_composition`, a table built from levy-code mapping data. Each levy line has a short code, public-facing name, category, tax year, and rate.

The agency name comes from a maintained crosswalk, `skagit_levy_crosswalk`, that maps levy short codes to agencies and Washington State Auditor MCAG IDs where possible. Some rows are marked "needs review" when the agency mapping is not certain enough to present as an independent public agency.

The current database has levy composition for 223 levy codes across 2016 through 2026.

How the agency dollar amounts are calculated

The agency breakdown is reconstructed. The app multiplies each levy rate by the parcel's assessed value, divides by 1,000, groups those levy lines by agency, and then compares the reconstructed total to the actual bill amount in the parcel roll.

If the reconstructed agency total and the displayed bill do not match exactly, TaxShift proportionally reconciles the agency rows to the displayed bill. That makes the pie chart add up to the bill the user sees, while still preserving the relative agency split from the levy-rate data.

This is why the report now says "reconstructed allocation" instead of implying that every agency row is a direct statement line copied from the county tax bill.

Source 4: Agency financial context

When an agency has a Washington State Auditor MCAG ID, TaxShift links to the Auditor's Financial Intelligence Tool and uses the local `2025schedule01.csv` data extract to summarize revenue, spending, and broad spending categories. Those categories are grouped for readability; they are not a formal audit classification.

The agency totals table currently contains 51 matched agency records.

How "why did it change?" is estimated

The year-over-year explanation compares the newest tax amount and assessed value with the prior year. It separates the change into two broad pieces: value effect and effective-rate effect. Value effect estimates how much changed because assessed value moved. Rate effect estimates how much changed because the effective tax rate moved.

This is an explanatory model, not an official tax calculation. It is especially approximate for parcels with exemptions, taxable-value adjustments, omitted taxes, special assessments, or unusual public-property treatment.

Accuracy checks and known limits

  • Displayed bill totals come from the parcel roll and are treated as the authority for the report total.
  • Agency rows are reconstructed from levy rates and then reconciled to the bill total when needed.
  • Exemptions can make assessed value, taxable value, and agency-rate math diverge. The report calls this out when an exemption or taxable-value gap is detected.
  • Some agency crosswalk rows are marked for review; those are grouped as "Other Local Districts" instead of being over-explained.
  • SAO spending categories are broad public-context labels, not a substitute for reading the full agency financial report.
  • Tax year, value year, and fetch/load dates are different fields. The report now avoids inventing a payable year from the tax year alone.