Cannabis Tax & Compliance Cost Calculator

ANALife Services AuthorityNational Calculator Authority›Cannabis Tax & Compliance Cost Calculator

.calc-container { max-width: 640px; margin: 2rem 0; padding: 1.5rem; background: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); font-family: system-ui, -apple-system, sans-serif; } .calc-container h3 { font-family: Georgia, serif; font-size: 1.15rem; color: #1a1a1a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; } .calc-row label { min-width: 160px; font-size: 0.9rem; color: #333; font-weight: 500; } .calc-row input[type="number"], .calc-row select { flex: 1; min-width: 120px; max-width: 200px; padding: 0.5rem 0.6rem; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9rem; font-family: system-ui, sans-serif; color: #1a1a1a; background: #fafaf8; } .calc-row input:focus, .calc-row select:focus { outline: none; border-color: var(--ac, #3d5a80); box-shadow: 0 0 0 2px rgba(26,74,138,0.12); } .calc-row .unit { font-size: 0.82rem; color: #888; min-width: 30px; } .calc-btn { display: inline-block; margin-top: 0.5rem; padding: 0.55rem 1.5rem; background: var(--ac, #3d5a80); color: #fff; border: none; border-radius: 4px; font-size: 0.9rem; font-weight: 600; cursor: pointer; font-family: system-ui, sans-serif; } .calc-btn:hover { opacity: 0.9; } .calc-result { margin-top: 1.25rem; padding: 1rem 1.25rem; background: #f0f6fc; border-left: 3px solid var(--ac, #3d5a80); border-radius: 0 6px 6px 0; display: none; } .calc-result.visible { display: block; } .calc-result-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; margin-bottom: 0.25rem; } .calc-result-value { font-size: 1.6rem; font-weight: 700; color: var(--ac, #3d5a80); } .calc-result-detail { font-size: 0.85rem; color: #555; margin-top: 0.5rem; line-height: 1.5; } .calc-note { margin-top: 1rem; font-size: 0.8rem; color: #888; font-style: italic; } .calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .calc-grid-item { padding: 0.6rem 0.8rem; background: #f8f9fa; border-radius: 4px; border: 1px solid #eee; } .calc-grid-item .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; } .calc-grid-item .value { font-size: 1.1rem; font-weight: 600; color: #1a1a1a; } @media (max-width: 720px) { .calc-row { flex-direction: column; align-items: flex-start; gap: 0.3rem; } .calc-row label { min-width: auto; } .calc-row input[type="number"], .calc-row select { max-width: 100%; width: 100%; } .calc-grid { grid-template-columns: 1fr; } } .calc-chart { margin: 1rem 0; text-align: center; } .calc-chart svg { max-width: 100%; height: auto; } .calc-chart-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem 1.2rem; margin-top: 0.6rem; font-size: 0.8rem; color: #555; } .calc-chart-legend span { display: inline-flex; align-items: center; gap: 0.3rem; } .calc-chart-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; font-style: normal; } .calc-related { max-width: 640px; margin: 2rem 0 1rem; padding: 1.25rem 1.5rem; background: #f8f9fa; border: 1px solid #e8e8e8; border-radius: 8px; } .calc-related h3 { font-family: Georgia, serif; font-size: 1rem; color: #1a1a1a; margin: 0 0 0.75rem; padding-bottom: 0.4rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-related-list { list-style: none; padding: 0; margin: 0 0 0.75rem; display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.5rem; } .calc-related-list li a { font-size: 0.88rem; color: var(--ac, #3d5a80); text-decoration: none; } .calc-related-list li a:hover { text-decoration: underline; } .calc-browse-all { margin: 0.5rem 0 0; font-size: 0.9rem; font-weight: 600; } .calc-browse-all a { color: var(--ac, #3d5a80); text-decoration: none; } .calc-browse-all a:hover { text-decoration: underline; } @media (max-width: 720px) { .calc-related-list { grid-template-columns: 1fr; } }

Cannabis Tax & Compliance Cost Calculator

Estimate your total annual cannabis tax burden and compliance costs including excise taxes, cultivation taxes, sales taxes, licensing fees, and regulatory compliance expenses.

Business Type

Retailer / Dispensary Cultivator / Grower Manufacturer / Processor Distributor Vertically Integrated (All)

State / Jurisdiction

California Colorado Washington Oregon Illinois Michigan Nevada Arizona Massachusetts New Jersey New York Other / Custom

Annual Gross Revenue ($)

Cost of Goods Sold / COGS ($)

Canopy Size (sq ft)

Annual Harvest Weight (oz)

State Excise Tax Rate on Retail Sales (%)

Pre-filled based on state selection; adjust if needed.

State + Local Sales Tax Rate (%)

Combined state and local general sales tax rate.

Cultivation Tax Rate ($ per oz)

Per-ounce tax on harvested cannabis (where applicable).

Annual License & Permit Fees ($)

State + local licensing, renewal, and permit fees.

Compliance Staff Annual Cost ($)

Salaries/wages for compliance officers, track-and-trace staff, etc.

Annual Lab Testing Costs ($)

Mandatory potency, pesticide, and contaminant testing.

Track-and-Trace & Compliance Software ($)

METRC, BioTrackTHC, or similar seed-to-sale software annual cost.

Legal & Accounting Compliance Costs ($)

Cannabis-specialized legal counsel and CPA fees for compliance.

Security & Surveillance Compliance Costs ($)

Mandatory security systems, guards, and monitoring required by regulation.

Effective Federal Income Tax Rate (%) — 280E Impact

Federal corporate/individual rate. Under IRC 280E, cannabis businesses cannot deduct most expenses, dramatically increasing effective tax burden.

Calculate Total Tax & Compliance Cost

### Annual Tax & Compliance Cost Summary

// State tax data: [exciseRate%, salesTax%, cultivationTaxPerOz, licenseEstimate] const canStateTax = { CA: { excise: 15, sales: 10.25, cultOz: 10.08, license: 96000 }, CO: { excise: 15, sales: 8.81, cultOz: 0, license: 14000 }, WA: { excise: 37, sales: 10.1, cultOz: 0, license: 1500 }, OR: { excise: 17, sales: 0, cultOz: 0, license: 5000 }, IL: { excise: 10, sales: 6.25, cultOz: 0, license: 100000}, MI: { excise: 10, sales: 6, cultOz: 0, license: 66000 }, NV: { excise: 15, sales: 8.23, cultOz: 0, license: 30000 }, AZ: { excise: 16, sales: 5.6, cultOz: 0, license: 25000 }, MA: { excise: 10.75,sales: 6.25, cultOz: 0, license: 50000 }, NJ: { excise: 6.625,sales: 6.625, cultOz: 0, license: 10000 }, NY: { excise: 13, sales: 4, cultOz: 0, license: 200000}, other:{ excise: 15, sales: 8, cultOz: 0, license: 50000 } };

function canUpdateFields() { const btype = document.getElementById('can-business-type').value; const isCult = btype === 'cultivator' || btype === 'vertically-integrated'; const isMfg = btype === 'manufacturer' || btype === 'vertically-integrated';

document.getElementById('can-canopy-group').style.display = isCult ? '' : 'none'; document.getElementById('can-harvest-group').style.display = isCult ? '' : 'none'; document.getElementById('can-cultivation-tax-group').style.display = isCult ? '' : 'none';

// Pre-fill state values const st = document.getElementById('can-state').value; const data = canStateTax[st] || canStateTax['other']; if (!document.getElementById('can-custom-excise').value) document.getElementById('can-custom-excise').value = data.excise; if (!document.getElementById('can-sales-tax').value) document.getElementById('can-sales-tax').value = data.sales; if (isCult && !document.getElementById('can-cultivation-tax').value) document.getElementById('can-cultivation-tax').value = data.cultOz; if (!document.getElementById('can-license-fee').value) document.getElementById('can-license-fee').value = data.license; }

document.getElementById('can-state').addEventListener('change', function() { // Reset pre-filled fields on state change const st = this.value; const data = canStateTax[st] || canStateTax['other']; document.getElementById('can-custom-excise').value = data.excise; document.getElementById('can-sales-tax').value = data.sales; document.getElementById('can-cultivation-tax').value = data.cultOz; document.getElementById('can-license-fee').value = data.license; });

// Initialize on load canUpdateFields();

function canFmt(n) { return '$' + n.toLocaleString('en-US', {minimumFractionDigits:2, maximumFractionDigits:2}); }

function canPct(n) { return n.toFixed(2) + '%'; }

function canRow(label, value, bold) { const style = bold ? 'font-weight:bold;background:#f0f4f8;' : ''; return ${label} ${value}; }

function canCalc() { const errEl = document.getElementById('can-error'); const resEl = document.getElementById('can-result'); errEl.style.display = 'none'; resEl.style.display = 'none';

const btype = document.getElementById('can-business-type').value; const revenue = parseFloat(document.getElementById('can-gross-revenue').value); const cogs = parseFloat(document.getElementById('can-cogs').value) || 0; const exciseRate = parseFloat(document.getElementById('can-custom-excise').value) / 100; const salesRate = parseFloat(document.getElementById('can-sales-tax').value) / 100; const harvestOz = parseFloat(document.getElementById('can-harvest').value) || 0; const cultTaxOz = parseFloat(document.getElementById('can-cultivation-tax').value) || 0; const licenseFee = parseFloat(document.getElementById('can-license-fee').value) || 0; const staffCost = parseFloat(document.getElementById('can-compliance-staff').value) || 0; const testCost = parseFloat(document.getElementById('can-testing-cost').value) || 0; const softCost = parseFloat(document.getElementById('can-software-cost').value) || 0; const legalCost = parseFloat(document.getElementById('can-legal-cost').value) || 0; const secCost = parseFloat(document.getElementById('can-security-cost').value) || 0; const fedRate = parseFloat(document.getElementById('can-280e-rate').value) / 100;

// Validation if (isNaN(revenue) || revenue revenue) { errEl.textContent = 'COGS cannot exceed Gross Revenue.'; errEl.style.display = 'block'; return; } if (isNaN(exciseRate) || exciseRate 0.5) { errEl.textContent = 'Excise tax rate must be between 0% and 50%.'; errEl.style.display = 'block'; return; } if (isNaN(salesRate) || salesRate 0.2) { errEl.textContent = 'Sales tax rate must be between 0% and 20%.'; errEl.style.display = 'block'; return; } if (isNaN(fedRate) || fedRate 0.6) { errEl.textContent = 'Federal tax rate must be between 0% and 60%.'; errEl.style.display = 'block'; return; }

// ── TAX CALCULATIONS ──────────────────────────────────────────────────────

// 1. State Excise Tax // Excise Tax = Gross Revenue × Excise Rate // (Excise is typically applied to retail selling price) const exciseTax = revenue * exciseRate;

// 2. Sales Tax collected (pass-through but a compliance burden) // Sales Tax Collected = Gross Revenue × Sales Tax Rate // Note: Sales tax is collected from customers but represents compliance cost const salesTaxCollected = revenue * salesRate;

// 3. Cultivation Tax (per-ounce on harvest) // Cultivation Tax = Harvest (oz) × Rate per oz const cultivationTax = harvestOz * cultTaxOz;

// 4. Gross Profit (before 280E adjustment) // Gross Profit = Revenue - COGS const grossProfit = revenue - cogs;

// 5. IRC 280E Federal Tax Impact // Under 280E, cannabis businesses can ONLY deduct COGS (not operating expenses). // Taxable Income (280E) = Revenue - COGS (no other deductions allowed) // 280E Federal Tax = Taxable Income × Federal Rate // Normal Federal Tax = (Revenue - COGS - Operating Expenses) × Federal Rate // 280E Penalty = 280E Federal Tax - Normal Federal Tax // // We estimate operating expenses as: compliance costs + other overhead const totalComplianceCosts = licenseFee + staffCost + testCost + softCost + legalCost + secCost; const estimatedOpEx = totalComplianceCosts; // conservative: only known compliance costs const taxableIncome280E = Math.max(0, grossProfit); // 280E: only COGS deductible const taxableIncomeNormal = Math.max(0, grossProfit - estimatedOpEx); // Normal: all expenses deductible const federalTax280E = taxableIncome280E * fedRate; const federalTaxNormal = taxableIncomeNormal * fedRate; const penalty280E = Math.max(0, federalTax280E - federalTaxNormal); // Extra tax due to 280E

// 6. Total Tax Burden // Total Tax = Excise Tax + Cultivation Tax + Federal Tax (280E basis) // (Sales tax excluded as it is customer-collected pass-through) const totalTaxBurden = exciseTax + cultivationTax + federalTax280E;

// 7. Total Compliance Costs (non-tax regulatory costs) // Total Compliance = License + Staff + Testing + Software + Legal + Security const totalCompliance = totalComplianceCosts;

// 8. Grand Total Cost of Doing Business (Tax + Compliance) const grandTotal = totalTaxBurden + totalCompliance;

// 9. Effective Total Rate // Effective Rate = Grand Total / Gross Revenue const effectiveRate = grandTotal / revenue;

// 10. Net Revenue After All Taxes & Compliance const netRevenue = revenue - grandTotal;

// ── BUILD RESULTS TABLE ─────────────────────────────────────────────────── let rows = ''; rows += canRow('Gross Revenue', canFmt(revenue)); rows += canRow('Cost of Goods Sold (COGS)', canFmt(cogs)); rows += canRow('Gross Profit', canFmt(grossProfit)); rows += canRow('─── STATE & LOCAL TAXES ───', ''); rows += canRow(State Excise Tax (${canPct(exciseRate * 100)} × Revenue), canFmt(exciseTax)); rows += canRow(Sales Tax Collected (${canPct(salesRate * 100)} × Revenue), canFmt(salesTaxCollected) + ' *'); if (harvestOz > 0 && cultTaxOz > 0) { rows += canRow(Cultivation Tax (${harvestOz.toLocaleString()} oz × $${cultTaxOz}/oz), canFmt(cultivationTax)); } rows += canRow('─── FEDERAL TAX (IRC 280E) ───', ''); rows += canRow('Taxable Income Under 280E (Revenue − COGS only)', canFmt(taxableIncome280E)); rows += canRow(Federal Tax Under 280E (${canPct(fedRate * 100)}), canFmt(federalTax280E)); rows += canRow('Taxable Income (Normal — if deductions allowed)', canFmt(taxableIncomeNormal)); rows += canRow(Normal Federal Tax (${canPct(fedRate * 100)}), canFmt(federalTaxNormal)); rows += canRow('280E Tax Penalty (Extra Federal Tax)', canFmt(penalty280E)); rows += canRow('─── COMPLIANCE COSTS ───', ''); rows += canRow('Annual License & Permit Fees', canFmt(licenseFee)); rows += canRow('Compliance Staff Costs', canFmt(staffCost)); rows += canRow('Mandatory Lab Testing', canFmt(testCost)); rows += canRow('Track-and-Trace / Compliance Software', canFmt(softCost)); rows += canRow('Legal & Accounting (Compliance)', canFmt(legalCost)); rows += canRow('Security & Surveillance (Compliance)', canFmt(secCost)); rows += canRow('Total Compliance Costs', canFmt(totalCompliance), true); rows += canRow('─── TOTALS ───', ''); rows += canRow('Total Tax Burden (Excise + Cultivation + Federal 280E)', canFmt(totalTaxBurden), true); rows += canRow('Total Compliance Costs', canFmt(totalCompliance), true); rows += canRow('Grand Total (Tax + Compliance)', canFmt(grandTotal), true); rows += canRow('Effective Total Rate (Grand Total ÷ Revenue)', canPct(effectiveRate * 100), true); rows += canRow('Net Revenue After All Taxes & Compliance', canFmt(netRevenue), true);

document.getElementById('can-result-table').innerHTML = rows;

const summary = `

`; document.getElementById('can-result-summary').innerHTML = summary;

resEl.style.display = 'block'; }

#### Formulas Used

State Excise Tax = Gross Revenue × Excise Tax Rate

Sales Tax Collected = Gross Revenue × Sales Tax Rate  (pass-through; compliance obligation)

Cultivation Tax = Annual Harvest (oz) × Per-Ounce Tax Rate

Gross Profit = Gross Revenue − COGS

Taxable Income Under IRC 280E = Gross Revenue − COGS  (only COGS is deductible; no other business expenses allowed)

Federal Tax (280E) = Taxable Income (280E) × Federal Rate

280E Penalty = Federal Tax (280E) − Federal Tax (Normal, if all deductions allowed)

Total Compliance Costs = License Fees + Staff + Testing + Software + Legal + Security

Grand Total = Excise Tax + Cultivation Tax + Federal Tax (280E) + Total Compliance Costs

Effective Total Rate = Grand Total ÷ Gross Revenue

Net Revenue = Gross Revenue − Grand Total

#### Assumptions & References

More Calculators

Read Next

Study Time Planner Authority Network America › Life Services Authority › National Calculator Authority .calc-container { max-width: 640px;...

References