Cannabis Tax & Compliance Cost Calculator
ANA›Life Services Authority›National 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 = `
- Sales tax is collected from customers and remitted to the state — it is a compliance obligation but not a direct cost to the business unless absorbed. The 280E penalty of ${canFmt(penalty280E)} represents the additional federal tax paid because cannabis businesses cannot deduct ordinary business expenses under IRC 280E. This is one of the most significant financial burdens unique to the cannabis industry.
`; 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
- Well Pump Cycle Rate Calculator
- Window Rough Opening Size Calculator
- Replacement Window Fit and Clearance Calculator
- Leak Detection Pressure Drop Calculator
- Attrition Rate Calculator
- Window Installation Cost Estimator
- Time to Fill Calculator
- Tennessee Climate Zone Heat Load Calculator
- Humidity and Dew Point Calculator
- HVAC Equipment Lifespan and Replacement Cost Calculator
- HVAC Equipment Sizing Calculator
- Texas Climate Zone Heat Load Calculator
Read Next
Study Time Planner Authority Network America › Life Services Authority › National Calculator Authority .calc-container { max-width: 640px;...