FlowParse
Feature September 2026 15 min read

COGS vs. OPEX tagging for 280E

Section 280E denies a cannabis business the ordinary business-expense deductions any other company takes for granted, leaving only cost of goods sold. Getting that split right, line by line, on every vendor invoice and bank transaction, is the single highest-stakes bookkeeping decision a dispensary makes.

FlowParse
flowparse.io
flowparse.iosound off is fine
0:00 / 0:00

One line, decided wrong, for a whole tax year

Every ordinary business gets to deduct rent, wages, marketing and general administrative cost against its taxable income. A cannabis business trafficking in a federally scheduled substance — which is still the legal classification even in states where it's fully licensed — doesn't get that. Section 280E of the tax code allows only the cost of goods sold, and nothing else, to reduce taxable income.

That makes one classification decision, repeated on every vendor invoice and every bank transaction, the single line item with the most tax consequence a dispensary's bookkeeping produces. This page describes the mechanic that draws that line consistently, spelled out on its own because it's worth understanding in detail before trusting it with a real filing.

FlowParse
flowparse.io

What 280E actually says, in plain terms

Section 280E was written in 1982, aimed originally at drug traffickers, and denies a business that deduction for any expense connected with trafficking in a Schedule I or Schedule II controlled substance. Cannabis has stayed on that federal schedule even as individual states legalized it, so a fully licensed, state-compliant dispensary is still, for federal tax purposes, subject to the same rule written for an entirely different kind of business four decades ago.

The one carve-out that survives is cost of goods sold — a concept that predates 280E and applies to every business, cannabis or not, as a reduction to gross receipts before gross profit is even calculated, rather than as a deduction from it. That distinction — COGS reduces the number 280E never touches, everything else is a deduction 280E specifically forbids — is why the split matters so much more here than it would for an ordinary retailer.

Why the COGS line is hard to draw correctly

No fixed, published list of what qualifies

COGS classification for cannabis draws on general inventory-costing principles applied to a specific business's own facts, not a fixed checklist — which leaves real room for a defensible position to still be wrong in the details.

A retail-only dispensary has a narrower COGS than a cultivator

A pure retailer's COGS is mostly the wholesale cost of inventory purchased for resale; a vertically integrated operator growing and processing its own product has a much wider, more complex set of direct production costs that can legitimately qualify.

Shared costs need allocation, not a binary tag

A facility that both cultivates and retails shares rent, utilities and some labor across activities that are treated completely differently under 280E — a cost that's fully COGS for the cultivation side can be entirely non-deductible for the retail side.

The stakes cut both ways

Overstating COGS understates tax owed and invites exactly the audit scrutiny cannabis businesses already draw disproportionately; understating it means paying tax on income that was never legally taxable in the first place.

What gets checked

FieldWhat it signals
Vendor nameCultivator, wholesale supplier and packaging vendors skew COGS; software, marketing and professional-services vendors skew operating expense.
Line-item description“Flower — bulk” or “packaging materials” read differently than “monthly POS subscription” or “general liability premium.”
Amount and unit contextA per-unit or per-pound cost pattern is more consistent with inventory purchase than a flat monthly fee.
Account or category, where already taggedAn existing chart-of-accounts category, when the source document or bookkeeping system provides one, is read as a strong signal rather than ignored.
FlowParse
flowparse.io

How classification works

Rather than guessing from the amount alone, classification checks a fixed sequence of signals, in order, for every line.

1

Vendor pattern

Is this vendor a recognized cultivator, wholesale product supplier or packaging vendor, versus a software, marketing, insurance or professional-services provider?

2

Description pattern

Does the line-item text describe inventory, raw material or direct production cost, versus overhead, administrative or selling cost?

3

Existing category, if present

Where the source document or your own chart of accounts already carries a classification, it's weighed as a strong signal rather than overridden silently.

4

Consistency with the rest of the document

A line that looks ambiguous in isolation is checked against the pattern of the rest of the invoice — a packaging line on an otherwise clearly COGS cultivator invoice reads differently than the same line on a general supplies order.

What typically counts as COGS, and what doesn't

Typically COGSTypically non-deductible OPEX
Wholesale product purchased for resaleRetail rent and store-front utilities
Cultivation labor, nutrients, growing suppliesGeneral marketing and advertising
Packaging directly tied to a specific productBudtender wages (retail-side labor)
Testing and compliance costs directly tied to a batchSecurity, insurance and professional/legal fees
Freight-in on inventory purchasesSoftware, POS and administrative subscriptions

This is a general pattern, not a ruling on any specific line — the correct classification always depends on your business's own facts, and a genuinely mixed-activity operator will see cases that don't sit cleanly on either side.

FlowParse
flowparse.io

Vertically integrated operators and mixed activity

A cultivator-retailer under one roof faces the hardest version of this problem: a single facility cost — rent, a shared utility bill, an operations manager's salary — genuinely serves both a COGS-eligible cultivation activity and a non-deductible retail activity, and has to be allocated between them on some reasonable basis rather than tagged wholesale to either side.

Lines that plausibly need this kind of allocation are flagged for review rather than tagged with false confidence to one side or the other — this is exactly the category of decision that benefits from a cannabis-experienced CPA's judgment, informed by a consistent, complete read of every vendor line rather than a spot-check of the largest ones.

Three confidence levels

LevelWhen
HighA recognized inventory or direct-production vendor and description pattern, or a recognized overhead vendor and description pattern, with no conflicting signal.
Medium — needs reviewA plausible pattern on either side, but with a mixed-activity, shared-cost, or ambiguous description signal present.
UnclassifiedNo pattern resolves confidently — left for manual classification rather than guessed at.
FlowParse
flowparse.io

When a line genuinely can't be classified automatically

Some lines are always going to need a person's judgment — a shared facility cost on a vertically integrated operation, a new vendor with no established pattern, a one-off cost that doesn't resemble anything routine. Those stay visible in their own review group rather than being folded into whichever side of the ledger happens to look more favorable.

In practice, this group is where a cannabis-experienced bookkeeper or CPA spends their actual judgment time — reviewing a focused list of genuinely ambiguous lines instead of re-checking every invoice a business generated that month.

How it works

1

Upload vendor invoices and bank statements

Whatever the dispensary already has — supplier invoices, checking and merchant-processor statements.

2

Every line is read

Vendor, description, amount and existing category where present, kept linked to its source document.

3

Classified against the pattern hierarchy

Vendor, then description, then existing category, then document-wide consistency.

4

Export

Excel, CSV or JSON, with high-confidence, review-needed and unclassified lines kept as separate groups.

FlowParse
flowparse.io

One month's vendor invoices, classified

A single-location dispensary's vendor activity for a typical month, read and classified.

ResultLines
Classified COGS, high confidence112
Classified OPEX, high confidence84
Needs review — mixed or ambiguous17
Unclassified3

196 of 216 lines resolve without a person touching them. The 20 that don't are exactly where a bookkeeper's time belongs — a handful of shared facility costs and two new vendors with no established pattern yet, rather than a full re-read of every invoice the business generated that month.

FlowParse
flowparse.io

Why COGS is where cannabis audits focus

Because COGS is the only deduction 280E leaves standing, it's also the line an IRS examiner scrutinizes most closely on a cannabis return — an overstated COGS figure is the most direct way a business's effective tax rate could look artificially low relative to its actual gross receipts. Consistent, well-documented, line-level classification is what makes that figure defensible if it's ever examined, rather than a single aggregated number with no visible trail back to the invoices that built it.

FlowParse
flowparse.io

What accuracy actually looks like

A retail-only dispensary with a small, stable set of wholesale suppliers sees most vendor activity classify at high confidence quickly, since the vendor patterns repeat month after month. A vertically integrated operator with cultivation, processing and retail under one structure sees a meaningfully larger review queue — not because the classification is working poorly, but because genuine mixed-activity allocation is a harder question that deserves a person's attention.

That distinction is worth holding onto: a larger review queue for a complex operator is an honest reflection of how much genuine judgment the business's own structure requires, not a sign something's broken.

Improving classification consistency over time

The fastest way to shrink the review queue is consistent vendor and description discipline on the source documents themselves — a supplier invoice that itemizes flower, packaging and delivery separately classifies far more cleanly than one lumped into a single line labeled “product order.” Asking regular vendors for that level of itemization, once, tends to pay off on every subsequent invoice from them.

What you get back

One row per classified line

Vendor, description, amount, classification and confidence level, each in its own column.

Review queue kept separate

Ambiguous and mixed-activity lines visible as their own group, not folded into a total either way.

Traceable to source

Every classified line linked back to the exact invoice or statement it came from.

Who this is for

Any licensed cannabis business filing a federal return under 280E — single-location retail dispensaries, vertically integrated cultivator-retailers, and the cannabis-specialized bookkeepers and CPAs who classify this activity for several clients at once and need a consistent starting point across all of them.

Handling seasonal and end-of-harvest inventory costs

A cultivator's costs don't arrive evenly across the year — nutrients, labor and utilities accumulate through a grow cycle, and a large share of what's genuinely COGS for a given batch is incurred well before that batch is ever sold. Classifying each cost as it's paid, tagged to the batch or cycle it belongs to where that information is available, produces a far more accurate picture than classifying by calendar month alone.

This matters specifically at year-end, when a batch still in cultivation carries real, already- incurred COGS-eligible cost that hasn't yet become a completed sale. Consistent, transaction-level classification throughout the year is what makes that year-end inventory valuation possible at all — a business that only classifies in a year-end batch has no real way to separate what's tied to inventory still on hand from what's tied to product already sold.

What happens when a classification needs to change later

A first-pass classification is sometimes revised — a vendor initially tagged as a general supplier turns out to be a cultivation-specific one once more invoices establish the pattern, or a CPA's review during filing prep reclassifies a handful of lines after a closer look. That's a normal, expected part of the process, not a sign the original classification was careless.

What matters is that a revision is itself documented — when it happened, why, and by whom — rather than silently overwriting the original tag with no trail. A classification history that shows “originally tagged OPEX, revised to COGS on review, because” is more defensible under examination than a final number with no visible history at all, even when the final number is identical either way.

Where this stops

This classifies vendor and bank transaction lines against typical COGS and OPEX patterns — it doesn't file a tax return, compute a final tax liability, or substitute for a cannabis-experienced CPA's sign-off on your business's specific 280E position, especially anywhere mixed-activity allocation is involved. What it does is make that CPA's review faster and more consistent, by arriving with every line already sorted and the genuinely hard cases already flagged.

For the reasoning behind why this classification matters as much as it does, see why 280E makes cannabis bookkeeping different.

Frequently asked questions

See how your own vendor activity classifies

Upload a vendor invoice or bank statement — no signup — and see how the COGS/OPEX split behaves against your own business.

Keep reading