Skip to content
← All packages

Economic Nexus for Laravel

The US economic-nexus engine for Laravel. Accumulate a seller's sales per state, detect when a post-Wayfair threshold is crossed, and report where registration is required. It owns the decision, you bind the sales data.

After South Dakota v. Wayfair, a seller with no physical presence in a state can still owe sales tax there once its cumulative sales cross that state's threshold. Economic Nexus for Laravel tracks that: it takes the seller's activity per state, compares it against the threshold, and tells you where a registration obligation has appeared. It is engine primitives, not a finished application, and it is UI-free.

It never counts your sales for you

Economic nexus turns on cumulative totals over a measuring period, which a single invoice cannot carry. So the package refuses to infer nexus from one supply and never accumulates sales itself. You bind a SalesLedger that answers with the seller's totals per state, and the engine owns the decision on top of it.

Four states a state can be in

Every state resolves to one status, in precedence order. Registered comes first: the seller already holds a registration there, so the obligation is handled. Then triggered by physical presence, which establishes nexus on its own whatever the sales. Then triggered economically, when cumulative activity crosses the threshold. Then approaching, when activity is inside a configurable band, 80 percent by default, which is a watch signal rather than an obligation. Otherwise below. Only triggered reports that action is needed.

Each evaluation carries the threshold it was judged against, the activity behind it, a progress ratio toward crossing, whether physical presence applied, and a readable reason. A report buckets a set of states into triggered, approaching and registered, which is the shape a platform dashboard wants.

What It Models

Thresholds With Their Measurement

A threshold is more than a dollar figure. It carries the crossing test, sales-only, sales-or-transactions, sales-and-transactions, plus the window the state measures over and which sales count.

Measuring Periods

Previous calendar year, current, previous-or-current, or rolling twelve months. The engine uses the figures; the period tells you how to accumulate your ledger so it matches what the state actually measures.

Sales Basis

Gross, retail or taxable sales, and whether marketplace-facilitated sales count toward the seller's own threshold. Getting this wrong is how a seller registers a year late.

Physical Presence

An office, employees or inventory in a state triggers nexus regardless of sales volume. Host-asserted through its own contract, and it outranks the economic test.

Cited Threshold Data

Thresholds come from the us-tax-data dataset, a dated-window list so a pending change is carried until it takes effect. A state the dataset does not cover returns nothing rather than a guess.

Deny-By-Default Seams

The three host contracts are empty until you bind them. No sales ledger means no economic determination, rather than a confident answer built on nothing.

Where it sits next to the tax engine

Tax for Laravel answers whether a single supply is taxable and at what rate, and it asserts nexus from an explicit seller registration rather than inferring it. This package answers the other question: given everything the seller has sold into a state so far, should there be a registration at all. One is per-invoice, the other is cumulative, and keeping them apart is why neither has to guess at the other's job.