CARINAOS · Support
Support Guide · Web dashboard
CarinaOS Hub

Your cultivation operations dashboard — live METRC compliance and sensor data in one place, so you can watch your rooms, run compliance actions, plan cycles, and keep your records.

Platform Web Access any browser Data METRC + sensors Roles Owner · Admin · Viewer Golden rule Refresh → Dry Run → act
01 — Overview

What the Hub is

CarinaOS Hub is a cultivation operations dashboard that sits on top of your METRC compliance data and your environmental sensors. It gives you one place to watch your rooms, run compliance actions, plan cycles, and keep your required logs — all scoped to your own facility.

Where CarinaOS Go is the field app for METRC actions from the floor, the Hub is the full picture at the desk:

  • Live METRC data — plants, batches, harvests, packages, tags, and transfers.
  • Live sensor data — temperature, humidity, VPD, CO₂, light/DLI, substrate moisture, tanks, water flow, and pump health.
  • Compliance tooling — run METRC actions, keep digital log sheets, and prep for inspections.
  • Planning — cycle planner, task boards, and reusable playbook templates.
The one habit that matters

For every compliance action: Refresh → Dry Run → act. Refresh pulls current data, Dry Run validates without touching METRC, then you run it live. This rhythm prevents almost every avoidable error.

02 — Requirements

Before you start

Have these handy and setup takes about 20 minutes:

  • Your CarinaOS sign-in (email + password).
  • Your METRC API key — in METRC, click your name (top right) → API Keys → User Key.
  • Your license number.
  • Your sensor credentials, if you use them: Growlink (username, password, API subscriber key) and/or YoLink (UAID and secret).
03 — First day

Your first day with CarinaOS

From a fresh sign-in to a fully connected setup, in order.

Setup (about 20 minutes)

  1. Sign in. Go to your CarinaOS URL and sign in. A brand-new facility is guided straight into setup.
  2. Confirm your facility. Enter your facility name and license type.
  3. Connect METRC. Choose your state, paste your API key, then tap Find my facility — CarinaOS pulls your license automatically. This powers your plant counts, harvests, and packages.
  4. Connect sensors (optional but recommended). Turn on Growlink and/or YoLink and enter your credentials. Once you’re in the hub, open Settings → Sensor Setup to discover your sensors and assign each to a room. This lights up the Environment and Water tabs.
  5. Add your rooms. Add each room and its role — Flower, Veg, Propagation, Dry, Mother, Mixed Light, or Other. Finish setup and open the hub.

Take the tour (5 minutes)

Dashboard — your overview: plant counts, next harvest, active/finished harvests, and the Cycle Board timeline. Environment — each room's live conditions (green good, amber watch, red out of range). Water — tank levels and pump health. METRC tab — your compliance action center; note the Refresh button (data is cached ~10 minutes) and the 🧪 Dry Run button on every action.

Do these first

  • Set your cycle length — Settings → cycle configuration (default 63 days).
  • Map your room names — make your METRC location names match what you call your rooms.
  • Add your staff — Tasks → Staff, so you can assign work.
  • Load a playbook — Tasks → Templates → pick a sample (like an IPM calendar), tweak it, apply it to a room.
  • Do a test dry-run — open any METRC action, fill it in, hit 🧪 Dry Run, and get comfortable before running anything live.

Your daily rhythm

Morning: Dashboard (health check) → Environment (scan every room for red/amber) → Water (tank levels and flow). During the day: record the shift in the Daily Log, log IPM applications, and run compliance from the METRC tab — always Refresh → Dry Run → run live. As cycles progress: move plants Clone → Veg → Flower, package harvests, and Finish packages when empty.

Three rules that save headaches

1. Refresh before you act — METRC data is cached ~10 minutes. 2. Dry-run first — especially for big flips and any destruction. 3. Some actions are permanent — a veg→flower flip and waste/destruction can't be undone in the hub; finishing a package or harvest can be reversed with Unfinish.

04 — Access

Roles & access

The first person to sign up for a facility becomes its Owner. They can then create logins for everyone else.

Owner
Everything — including changing settings, connecting METRC, and deleting the facility. One owner per facility, and the owner always keeps METRC access.
Admin
Full read/write — run actions, edit settings, keep logs, and manage the team. Cannot delete the facility.
Staff
Works the floor. Completes tasks, writes log sheets, records IPM. Cannot change settings, integrations, billing or the team. This is the role for most of your crew.
Viewer
Read-only. Sees every dashboard but can't make changes or run actions.

Every account only ever sees its own facility's data — accounts are fully isolated from one another.

Why Staff exists

A Viewer can’t tick off a task or write a log, and an Admin can disconnect your METRC integration. Staff sits in between — it records the day’s work and leaves the setup alone.

05 — Your team

Your team

Settings → Team. Owners and Admins can see everyone with a login, invite new people, and decide what each of them may reach.

Invite someone

  1. Open Settings → Team and scroll to Invite someone.
  2. Enter their email and name.
  3. Choose their role — Staff for most of your crew.
  4. Choose their METRC access and, if you have the ERP add-on, their ERP access.
  5. Press Send invite.

They get an email naming you and your facility, with a link to set their own password. You never see or send their password — nobody at CarinaOS does either.

Tell them to check spam

A first email from a new sender often lands there. Ask them to mark it Not spam — it helps every invite you send afterwards.

METRC access, per person

This is the setting worth thinking about, because your Veg, Flower and Clones tabs show plant counts and carry Destroy buttons.

LevelWhat they see and can do
No accessNo METRC at all — no METRC tab, and no Veg, Flower, Clones or Scanner.
View onlyPlant counts, harvests and packages. Cannot flip, destroy, package or transfer. Right for most crew.
Can actThe full METRC action center, including actions that cannot be undone.

An Owner always has full METRC access, whatever else is set. A facility must never be able to lock itself out of the system it is legally required to file into.

ERP access, per person

Only appears if your facility has the ERP add-on. Operations covers purchasing, inventory and documents — what a grower needs. Full adds sales, costing, labor and reports, which is where margins and pay rates live.

Changing or removing access

Change anybody’s role or access from the same screen — it takes effect on their next request, not their next sign-in.

To remove somebody, press Disable. Their login stops working immediately and everywhere. It is a disable rather than a delete on purpose: their name stays attached to the tasks they completed, the logs they signed and the METRC actions they filed, which is the record you would need in an inspection. You can re-enable them later.

Three things CarinaOS will not let you do

Each of them locks a facility out permanently, so the screen refuses: removing the last person who can manage the facility; changing your own role or disabling your own login; demoting or disabling the Owner.

If somebody can’t see something

Almost always their access rather than a fault. Open Settings → Team and look at their row — it shows their role and each access level in plain words. A member who was invited and never signed in is flagged there too; the usual cause is the invite sitting in spam.

06 — Connect METRC

Connect METRC

This is the most important connection — it powers your plant counts, harvests, and packages.

  1. During onboarding (or later in Settings → Integrations), choose your state and paste your METRC API key. (Prefer to scan the QR code? That’s available in the CarinaOS Go mobile app.)
  2. Tap Find my facility — CarinaOS pulls your licensed facility and fills in your license number automatically.
  3. Continue. Your Dashboard, Veg, Flower, Clones, and Analytics tabs come alive with your real inventory.
Where the key lives

In METRC: click your name (top right) → API Keys → User Key. Treat it like a password.

07 — Sensors

Connect your sensors

Optional, but it's what lights up the Environment and Water tabs with live data.

  1. In onboarding, or in Settings → Integrations, turn on Growlink and/or YoLink and enter your credentials (Growlink has a Test connection check). Then open Settings → Sensor Setup — the dedicated screen where CarinaOS discovers your sensors and you assign each to a room. Sensor onboarding is in beta; running other hardware (AROYA, TrolMaster, Grodan…)? Reach out and we’ll onboard it with you.
  2. Tap Discover — CarinaOS scans and lists the sensors it finds.
  3. Assign each sensor to a room (e.g. Flower Zone 1, Veg, Feed tank, Flow meter).
A sensor isn't showing up?

Open Settings → Sensor Setup, run discovery again, and confirm the sensor is assigned to a room. If it still doesn't appear, double-check your Growlink / YoLink credentials.

08 — Rooms

Rooms & cycle setup

Add each room and its role — Flower, Veg, Propagation, Dry, Mother, Mixed Light, or Other. Then set the basics that drive your schedules and projections:

  • Cycle length — Settings → cycle configuration (default 63 days), plus cycles/year and baseline oz/plant.
  • Room / location names — map your METRC location names to what you call your rooms, so actions land in the right place.
09 — Dashboard

Dashboard & Cycle Board

Your at-a-glance overview: stat tiles for flowering and veg plants, active flower cycles, next harvest date, and active/finished harvests with weights, alongside charts for canopy composition, active harvests, and strain breakdown.

Hub dashboard and cycle board
CarinaOS Hub · Dashboard & Cycle Board

The Cycle Board lays every room out on a shared ~63-day arc, color-coded by task type, with a progress marker at today and a click-to-expand week grid:

Cultivation IPM spray Harvest / critical Flush / compliance
10 — Environment

Environment

Live readings from every configured room — per-zone cards for temperature, humidity (RH), VPD, CO₂, and light, plus substrate temperature, moisture, and EC where those sensors exist. Everything is color-coded so you can spot problems fast:

Hub environment monitoring
CarinaOS Hub · Environment
In range Watch Out of range

For example, RH over 65% flags botrytis risk and CO₂ under 400 ppm flags low. DLI History charts your daily light integral against a 40–55 mol/m²/day target band, viewable over 30/60 days, all-time, or per flower cycle. A Refresh button and "last synced" timestamp sit on the tab.

Any sensor, one view

CarinaOS is hardware-agnostic — it reads from whatever sensors you already run. Growlink and YoLink data appear side by side in the same environment view, so you see your rooms in one place no matter where your hardware came from. Other systems can be onboarded with us; see Connect your sensors.

11 — Water

Water & irrigation

Everything about your water supply and delivery in one tab:

Hub water analytics
CarinaOS Hub · Water & irrigation
  • Tank levels — visual tanks with fill %, depth, trend, and low-level alerts.
  • Solution tank pH & EC gauges.
  • Well-pump fill rate & health — spot pump wear before it fails.
  • Water delivered per shot (flow meter), with a baseline and clog detection that flags emitters running ≥25% below baseline.
  • Supply depletion forecast, water-use breakdown (flower vs veg vs other), irrigation uniformity, and EC drift.
"Clogged emitter" warning

If a shot drops well below its expected baseline, the tab flags a likely clog so you can check that zone before it affects your canopy.

12 — Cultivation

Clones, Veg & Flower

Three live-from-METRC tabs follow plants through the grow.

Hub flower room detail
CarinaOS Hub · Flower room

Clones

Clone counts by strain, clone success rate and trend, and a full clone table. Click a strain to move a clone package forward.

Veg

Total veg plants, strains, active batches, and days-in-veg per batch, with Refresh and Destroy actions. This view can lag METRC by a few minutes — refresh before acting.

Flower

Flowering plant counts, strains, a harvest-ready count (day 50+), and estimated yield. A harvest timeline (red = harvest now, amber = approaching, green = in progress) and a canopy-by-strain chart sit alongside the Harvest Tracker (plants harvested, remaining, current wet weight, packaged weight). Click a strain or row to open the harvest prep workflow.

13 — METRC

METRC — compliance action center

This is where you run compliance actions. Every action has a 🧪 Dry Run that validates the request without touching METRC, and a banner reminds you to Refresh first, because METRC data is cached ~10 minutes.

Hub METRC compliance center
CarinaOS Hub · METRC action center

Available actions:

  • Create clone package — package immature clones and assign a tag.
  • Clone → Veg — move a clone package into veg as new plantings.
  • Veg → Flower — flip a veg batch to flowering and assign plant tags (large flips are split automatically into METRC-sized chunks).
  • Harvest → Package — move dried weight from a harvest into a new tagged package.
  • Finish / Unfinish Package — close out an empty package, or reopen it.
  • Adjust Package — change a package quantity with a reason and note.
  • Log Waste / Destroy — destroy plants (by tag) or immature batches (by weight) with reason, method, and witness note.
  • Move Batches / Move Plants — relocate plants or batches between rooms.
  • Log Additive — record a nutrient or IPM application to plants or a whole room.
  • Tag Inventory — see available plant and package tags with a burn-down trend and low-tag warnings.
Some actions are permanent

A Veg → Flower flip and waste / destruction can't be undone in METRC — always Dry Run those first. Finish Package / Harvest can be reversed with Unfinish.

14 — Harvest

Harvests & packaging

Handle a harvest end to end from the Flower tab or the Harvest action:

  1. Prepare the harvest — open the harvest prep for a strain/row on the Flower tab, record your wet weight, and file it to METRC. This is a live compliance write: Refresh → Dry Run → act (a Dry Run checkbox validates it first).
  2. Once dried, use Harvest → Package to move weight into tagged packages.
  3. Finish Harvest when everything is packaged.
Weight is required to package

A package can't exceed the available weight in its harvest, so the weight is required to create it. Leave it blank and the action won't submit.

15 — Tags

Tag scanner & inventory

The Tag Scanner looks up any METRC tag and returns strain, growth phase, location, quantity, and more — camera scanning on mobile, type-to-search on desktop. Tag Inventory shows your available plant and package tags with a burn-down trend and low-tag warnings.

Ordering tags

Tag orders are placed directly in the METRC portal, not in CarinaOS. The hub shows your available counts and warns you when they're running low.

16 — Planner

Cycle Planner

Pick a room and flip date, then tap Generate Schedule to produce a full cultivation, IPM, and harvest calendar. The Active Cycles table shows every cycle's plant count, flip date, projected harvest, current day, and stage.

17 — Tasks

Tasks & playbooks

  • Board — tasks per cycle, filtered by today / overdue / completed, assignable to staff.
  • Staff — manage your team roster.
  • Templates — load a sample playbook (e.g. an IPM calendar), edit it, save your own, and materialize it onto a room using the flip date as day 0.
  • Rooms & Tables — subdivide rooms into tables (T1…Tn).
18 — Analytics

Analytics

The reporting view across your operation: active and completed harvest batches (weights, oz/plant, projected dry), cannabis inventory by strain and category, and transfers out (manifest, recipient, weights) with date filters. It also covers pipeline overview, batch shrinkage, flower-phase distribution, a projected harvest calendar, and strain performance.

Hub cultivation analytics
CarinaOS Hub · Analytics
19 — Logs

Digital log sheets

Six cloud-backed log sheets, visible across every device signed into your facility:

  1. Daily Log — shift, room, environment, feed EC/pH, irrigations, observations.
  2. IPM Log — product, rate, spray window, result.
  3. METRC Log — a record of compliance changes.
  4. Harvest, Dry & Cure Log — pre-harvest checklist and wet / dry / cure weights.
  5. Sanitation / Turnover Log — room turnover phases.
  6. Clone / Propagation Log — mother health and rooting progress.

Everything saves to the cloud, so any device on your facility sees the same records.

20 — Inspections

DCC checklist & audit

Get inspection-ready without scrambling. Work through the DCC Checklist — tap items to check them off, watch the progress bar — then save an inspection record with the inspector, type, findings, and outcome. The Internal Audit tracks pass / fail / N-A items with a score, and findings save to the cloud.

Hub internal audit and DCC checklist
CarinaOS Hub · Internal audit
21 — Wallboard

TV Wallboard

A full-screen operations display built for a TV or monitor on your grow-room wall. It auto-rotates through six live pages so the whole crew can see the state of the facility at a glance — no login, no clicking.

TV Wallboard — Environment
Environment
TV Wallboard — Water
Water
TV Wallboard — Clones
Clones
TV Wallboard — Veg
Veg
TV Wallboard — Flower
Flower
TV Wallboard — Cycles
Cycles

The six pages

Environment
Live room conditions — temperature, RH, VPD, CO₂, and light.
Water
Tank levels, pump health, and irrigation delivery.
Clones
Clone counts and propagation progress.
Veg
Veg plant counts and batches.
Flower
Flowering canopy and the harvest timeline.
Cycles & Assignments
Today's work by employee, plus per-room flower progress.

Cycles & Assignments

This page turns the wall screen into the crew's daily worklist. Along the top, a card per active cycle shows its day in flower (e.g. Day 38/63), days to harvest, and the next scheduled task. Below that, today's tasks are listed with the assigned staff member beside each one, followed by Tomorrow and a This week roll-up with a done count.

Because tasks and staff come from your Tasks & playbooks setup and cycles come from the Cycle Planner, the board stays current on its own — assign work at the desk and it appears on the wall.

Running it

  • Open the wallboard on any browser-connected screen and put it in fullscreen.
  • Pages rotate automatically; page dots show where you are in the loop.
  • Use pause / resume to hold on a page — handy during a crew huddle.
  • The footer shows your facility, a live METRC indicator, and the current time.
Tip

A cheap TV or tablet in the corridor is enough. Since the wallboard is read-only, it's safe to leave running where staff and visitors can see it.

22 — Settings

Settings & alerts

Settings

  • Facility — name, license number, state.
  • Cycle configuration — flower cycle length, cycles/year, baseline oz/plant, default flip date, cycle stage events.
  • Room / location names — map METRC locations to your dashboard names.
  • Sensor configuration — discover, assign, and manage your Growlink / YoLink sensors.
  • METRC environment — Production vs Sandbox and webhook registration (owner-level).
  • Account — delete facility (owner only).

Alerts

The hub surfaces conditions inline where they matter: harvest aging (a harvest sitting unpackaged too long), low tags, environmental (out-of-range temp / RH / CO₂ / VPD or substrate too wet/dry), and water (tank low, pump degradation, clogged emitter).

23 — Money

Buying & receiving

Part of the ERP add-on. Three steps, and the middle one is the one that matters: order → receive → bill. Receiving is what puts stock on the shelf and gives it a cost. An order on its own changes nothing, and a bill on its own only records what you owe.

Raising an order

ERP → Purchasing → New purchase order. Pick a supplier and everything you buy from them appears, already priced from what you last paid, with how much is on hand and how many days that lasts at your own rate. Anything out or low is ticked for you.

You type packs, not units. Put 1 against a 25 lb bag and you have ordered one bag. The system converts to pounds when it saves, because that is what the shelf counts — you never do that arithmetic. The line shows what your number resolves to underneath it.

The pack and the price are editable on the line. If the catalogue does not know that Milstop comes in a 5 lb tub, type 5 in Pack and carry on; you do not have to go and set the item up first. A size you type is remembered on the item afterwards — but only where the item had none, so a genuine one-off does not rewrite your catalogue.

Something bought in two sizes — a 1 gallon jug and a 2.5 gallon one — gets a picker. Choosing a size fills its price. Add sizes on the item, or just type one and it is kept.

Sending it to the supplier

Open the order and press Print / save as PDF. It prints as a one-page order grouped the way you walk a shelf, quantities in the supplier’s own packs, your licence in the header and a line to sign. A draft is marked as one, so nobody fulfils against a copy you have not approved.

Receiving

Open the order and press Receive. Quantities default to what is still outstanding. This is the step that creates stock, at the cost on the order — correct the cost here if the delivery came in at a different price.

An order you should not have raised

Open it and press Cancel order. It stays on file — nothing is deleted — and stops appearing in open orders and in the list offered when you match a supplier invoice. Say why if you want to; the reason is kept on the order. Reopen puts it back as a draft, because cancelled by mistake is as likely as raised by mistake.

An order with anything already received cannot be cancelled. Those goods are on a shelf at a cost, and the ledger entries for them point at this order’s lines — cancelling would leave stock whose origin says “cancelled order”. Receive the rest, or leave it open.

Matching the supplier’s invoice

Upload the invoice under ERP → Documents as usual. On the review screen, pick the purchase order it belongs to. Two things then happen:

  • It does not receive the stock again. Receiving already did that. Without naming the order, posting the invoice would put the goods in twice — your on-hand doubles and your cost per gram halves.
  • It checks the invoice against the order. Ordered, received and invoiced side by side, per item, flagging anything billed for more than arrived, priced above the order, or on the invoice but not on the order.

Quantities are compared in the same units on both sides, so a supplier billing 10 bags against an order for 250 lb reads as agreement, not a shortfall.

The invoice wins. Where the two disagree the bill records what the invoice says — it is what you owe. The order is a check, not an override, and the difference is shown in dollars so you have something to take up with the supplier.

One consequence worth knowing: receiving valued the stock at the order price, because that is the only price known when goods arrive. If the invoice charges more, your inventory is carrying the older figure and the screen tells you what that difference is worth. Whether it is written off or revalued into stock is your accountant’s call.

A bill keyed in the wrong unit

A receipt reading “Cal+Mic — 1 — 25 LB — $66.49” is one bag, not one pound. Keyed as a pound, the line claims a pound costs sixty-six dollars, and anything reading it back for a price repeats that.

The bill flags it — “$66.49 looks like a bag price” — and Recode fixes it. Correcting the unit moves no money: the total, the payment and the stock are untouched. It is the same route you use to change which account a line costs against, and it works on a paid bill for the same reason.

23 — Money

Stock, packs & counts

How something is bought vs how it is held

An item has a stocking unit — what the shelf counts, and what a recipe doses in — and optionally a pack, which is how the supplier sells it. FloraPro is held in pounds and bought in 25 lb bags. Grodan plugs are held individually and bought in boxes of 1,500.

Set them on the item, or on an order line the first time you buy it. Everything downstream follows: an order asks for packs, a bill converts to units, and a cost per gram divides by units.

Counting

ERP → Inventory → Record movement → Physical count. Type the number you actually counted — not the difference. CarinaOS works out the variance and records that, so the ledger stays append-only and you can always see why on-hand changed.

Counting zero is a count. An empty shelf is the commonest thing to record, and it is accepted.

When to reorder

The Reorder forecast on the Inventory tab shows what runs out next. Where you record issues it measures them. Where you do not — which is most facilities, most of the time — it reads your delivery history instead: you reorder when you are running low, so everything received between your first and latest delivery has been used by the time the latest lands.

Each row says which of the two it used, and how thin the history behind it is. Two deliveries is a rough rate; four is a good one. It predicts — it never posts, and it is not a stock count.

It also flags items where more has left the shelf than the ledger records going out. That is worth a count, and it is why a cost per gram can read low.

23 — Money

What a crop costs

Part of the ERP add-on. ERP → Grow costs. Three streams reach a crop, and they arrive by different routes:

  • Things it consumed — nutrients from the feed chart, media per plant. Bought into stock, then issued to the cohort.
  • Labor — approved hours tagged to a cycle, a batch or an area.
  • A share of overhead — rent, power, water. Never consumed; divided, which is the next section.

Media — pots, plugs and blocks

A feed chart doses per gallon of water, continuously. A pot is used once, per plant, so it cannot ride the chart. Set it on ERP → Inventory → Media cost per plant: how much one plant uses, and what one costs.

That is enough. The cost reaches every cycle from its own head count straight away — you do not have to wait for the stock to be received, because plants go into pots before anyone reconciles an invoice. Where you later issue the real stock, the posted figure replaces the estimate, item by item.

Feed

The chart’s own arithmetic — gallons times the recipe — is what the column shows until anything is posted. Post the modelled usage as real inventory issues from ERP → Grow costs and the posted figure takes over. The row always says which of the two you are looking at: an estimate and a measurement should never look like the same kind of number.

Cost per gram, twice

Two figures, differing only in the divisor:

  • $/g excluding trim — the whole cost over packaged flower only.
  • $/g including trim — the whole cost over everything packaged.

Both are shown because both are asked. A cultivator asking what their flower cost means trim carries none of it; the books usually carry the other end. The truth is between, and where exactly depends on a joint-cost basis your accountant picks — so both ends are shown and the choice is named rather than made for you.

This matters more than it sounds. On a harvest where 359 of 361 lb packaged was shake, a single blended figure reads far too low for flower.

Cost per pound

The same figure in the unit the floor actually uses. $/lb excluding trim is the whole cost of the batch over the flower it packaged. It excludes trim on purpose: it is what a pound of flower cost to produce.

When a cost per pound is withheld

A dash where you expected a figure is deliberate. CarinaOS checks the packages it holds for a harvest against METRC’s own record of what that harvest packaged — a number that survives a transfer when the package itself does not. Where the packages on file weigh less than METRC says was packaged, some of that weight left before lineage capture began, and it is almost always flower.

Dividing a batch’s whole cost by the flower that happens to remain would not give you a smaller answer, it would give you a wrong one — too high, under the label you price against. So the rate is withheld and the reason is on hover. The Flower and Trim columns still show everything on file; it is only the rate that waits.

A cohort in the cycle table follows the same rule, and is stricter for a good reason: it is several batches, and one of them being short is enough to understate the whole cohort’s flower. So a cycle shows a per-pound figure only when every batch in it reconciles.

Where flower and trim come from

From the packages themselves, not from a running total. CarinaOS records every METRC package the first time it sees it — its tag, the harvest it came off, what it was called, what it weighed — and keeps that record after the package leaves.

That last part is the whole point. A package disappears from METRC the moment it transfers. Read live, a harvest that sold 40 lb and kept 2 shows 2, and the 40 you invoiced is nowhere on the screen. Because the link is stored while the package is visible, shipped weight still counts toward the harvest that grew it.

Each package is sorted at read time, from what METRC calls it: flower covers packaged flower, bud and pre-rolls; trim covers trim, shake and biomass. Nothing is stored as one or the other, so if that judgement ever changes it applies to your whole history without re-syncing anything.

Weight is counted as packaged, not as remaining. Selling stock does not shrink the crop it came off.

These figures start the day lineage capture starts. A package that shipped before CarinaOS began recording packages is gone from METRC and cannot be recovered — its tag no longer resolves, and nothing else ever recorded which harvest it came off. Weight like that is deliberately not counted here, even where your own invoices still name the strain and the pounds, because a yield figure assembled from documents is a different claim from one assembled from packages we actually saw. Expect the Flower column to be sparse until crops packaged after that date come down.

Log biomass per strain when you package it. METRC gives some packages no source harvest — a pooled biomass bag off several strains is the usual one. That weight cannot be split afterwards and is never spread across your harvests, because that would hand each of them yield it did not grow. It is listed under the table instead, with the strains in it, so the columns still reconcile to the crop. Packaging biomass per strain is what puts it back on a batch.

Hovering a Flower or Trim figure breaks it down by strain wherever more than one contributed.

A total with a pool missing is a floor, not a figure. Where feed, labor, overhead or a packaged weight is absent the row says so, and the cost per gram is marked at least. It is the number somebody prices against, so it says when it is incomplete.

23 — Money

Operating costs into crops

ERP → Operating costs catches everything the facility spends. Grow costs is the part of it that reached a crop. Getting from one to the other is two decisions, and you make them once.

Does this reach the crop?

Tick it on the account, in Operating costs. Rent on the flower room does; the accountant’s fee does not; the power bill does in part. Ticking says only that some of this belongs to growing — not how much, and not that all of it does.

How is it divided?

An allocation rule says which account’s spend to divide and by what. Plant count is the usual answer: every cohort takes a share proportional to its plants, for the days it was actually alive in the period. A hundred plants for sixty-three days takes more than a hundred plants for fourteen.

Other drivers exist — labor hours, metered gallons, square-foot-days, or flat. A flat rule divides evenly regardless of size, which is what you want for something like a licence fee and not what you want for power.

A crop absorbs overhead from the day it flips, not from the day it is harvested. A cohort still in flower is carrying rent right now, and it takes its share while it grows rather than when it comes down.

A cohort is only counted once. While it is growing it takes its share directly; once it is harvested its batches take it instead. Never both, or the same rent would be divided between a crop and its own harvest.

A cycle with no head count takes nothing rather than a guessed share. If a cycle shows no overhead, check its plant count first.

Reading it

The Operating costs tab shows the pool, what each cohort absorbed, and what is left over. Anything unallocated is money nobody has divided — usually an account with no rule, or a rule whose driver has nothing to weigh. A cost per gram built on a partly-allocated pool is a floor, and it says so.

23 — Money & QuickBooks

Bills, invoices & QuickBooks

Part of the ERP add-on. CarinaOS holds the operational side of your money — what you bought, what you used, what a batch cost, what you sold it for — and pushes bills, invoices and customer payments into QuickBooks so nobody keys them twice.

It is not a replacement for QuickBooks and does not copy your ledger across. Payroll, tax filing, bank feeds and reconciliation stay where they are. Nothing posts silently: every document is computed and shown to you first.

STEP 1 STEP 2 STEP 3 STEP 4 STEP 5 Connect Map accounts Match vendors Dry run Go live Sandbox or real Six roles, by type …and customers Read what it would send One document first Nothing here can reach QuickBooks Writes to your books Do not go live on your first connection. Steps 1–4 cost nothing to repeat; step 5 leaves an entry with a date on it.
The order is the safety property
Cannabis and 280E

Under IRC 280E, cost of goods sold is deductible and operating expenses are not. That makes the COGS account mapping below the single most consequential setting on this screen.

These are suggestions, and your CPA has the final say. CarinaOS ships a chart of accounts with each account pre-flagged for 280E, following the mainstream treatment for a cultivator: growing costs are inventoriable and reach the return through COGS; selling and administrative costs do not. Where the treatment is genuinely contested we flag it as not deductible, because claiming a deduction by default is the expensive direction to be wrong in.

CarinaOS does not choose for you, and does not wait for anyone. Each account shows both treatments and what each one means, so you can set the mapping the day you install it. What the software will not do is tell you which one applies: that depends on things it cannot see — whether you are a producer or a reseller, how you have applied §471, your accounting method, and what your advisers have already filed.

The choice is recorded against your account, with who made it and when. Whether you take advice before making it is your call; a tax return is your business, not the software's.

Before you start

  • The ERP tab is enabled for your facility — it is an add-on.
  • A QuickBooks Online account you can sign into as an admin.
  • Full access in CarinaOS. Ops can look; only Full can connect, map or post.
  • Ten minutes with your chart of accounts open, or your bookkeeper on the phone.

Practise first, or go straight to your real books? Intuit gives every developer a free sandbox company, so you can post real documents and watch where they land with nothing at stake. If you would rather not, connect your real company and stay in Dry run — just as safe, and shorter. Either way, do not go live on your first connection.

Step 1 — Connect

  1. Open ERP → QuickBooks.
  2. Choose Sandbox to practise or Production for your real books.
  3. Press Connect. Production asks you to confirm — read it, because the two are not interchangeable.
  4. Sign in at Intuit and authorise CarinaOS. You land back on the QuickBooks tab, in Dry run.

Step 2 — Map your accounts

CarinaOS needs to know which of your accounts each kind of money belongs to. Press Load accounts, then set each role. The picker only offers accounts of the right type.

RoleWhat goes thereRequired type
IncomeWhat you sellIncome
COGSWhat the goods cost to produceCost of Goods Sold
Inventory AssetStock you are holdingOther Current Asset
Accounts PayableWhat you owe suppliersAccounts Payable
Accounts ReceivableWhat customers owe youAccounts Receivable
Deposit toWhere customer payments landBank / Other Current Asset
The one that catches people

QuickBooks has both a Cost of Goods Sold account type and an ordinary Expense type — and an account can be named like cost of sales while being typed as an expense. “Materials & supplies” is the classic. Post through an expense-typed account and those dollars land outside COGS, which under 280E means they are not deductible. The name tells you nothing; the type decides. CarinaOS refuses a COGS role pointed at an Expense account, and re-checks every time you open the tab.

Deposit to decides where a payment rests. Left unset, QuickBooks parks receipts in Undeposited Funds — “received, not yet banked” — which grows quietly if nobody clears it. Point it at the account the money actually reaches.

Step 3 — Match your vendors and customers

A bill needs a vendor and an invoice needs a customer, and both must exist on both sides. Open Find customers and vendors: CarinaOS matches by licence number first and name second — licences are unique and stable, names are neither. Anything unmatched, you can create from here.

Two different problems

A bill with no vendor cannot post, and neither can one whose vendor exists here but not in QuickBooks. The tab lists both and says which is which.

Step 4 — Dry run, and read it

Dry run computes exactly what would be sent, and sends nothing.

  1. Confirm the mode reads Dry run.
  2. Press Queue these for a period, or wait for the next sync.
  3. Open a computed document and read it: the counterparty, the account each line is coded to, the totals.

Does each line land where you would have put it by hand? Is the COGS side going to COGS? This is the cheapest moment to find out — a wrong answer here costs a click; the same answer after go-live costs a journal entry.

Step 5 — Go live, one document at a time

  1. Press Go live.
  2. Post one invoice. Not the queue — one.
  3. Open it in QuickBooks and check the balance (not the status column), the account coding, and the customer.
  4. Only when that one is right, release the rest.
Status is not balance

A status can read “sent” on an invoice nobody has paid. Status describes what you did with the document; balance describes what is owed.

Payments follow their invoice. A customer payment cannot post until the invoice it settles exists in QuickBooks. CarinaOS holds it and sends it the moment the invoice lands — you do not need to come back and press anything.

Where revenue lands — the item, not the amount

This is the step that catches people, because it is not obvious and QuickBooks does not explain it: QuickBooks takes the income account from the item on the line, not from anything CarinaOS sends. An invoice line without an item is not a line QuickBooks will accept.

So an invoice can be perfectly correct here — right customer, right amount, right category — and still be refused, or post to the wrong revenue account, purely because of which item it went as.

A line resolves its item in this order, first match wins:

  1. The line's own item, if it came from a purchase order or an item you keep. Most lines raised from a METRC manifest have none — they are packages, not stock items.
  2. The category mappingRevenue by category on the QuickBooks tab. This is how flower revenue and trim revenue reach different accounts.
  3. The default sales item — one item, used for anything the first two did not answer.
You may need to create an item in QuickBooks first

If every item in the list points at the same income account — a fresh QuickBooks company usually has one, called Services — then there is nothing to map to, and no setting here can put revenue where you want it. In QuickBooks: Sales → Products & services → New → Service, name it, and set its Income account to the one you want (wholesale sales, for instance). Then come back, press Load accounts, and it will appear.

Each option in both pickers shows the income account it posts to, so you can see the consequence before you choose it. If none of them looks like sales revenue, the card says so.

Mapping by category. Open Revenue by category and press Load. It lists the categories your invoices actually carry, largest by revenue first — not METRC's full vocabulary — with the money each represents. Set the item each should post as. Anything left on use the default falls back to the default sales item.

Money sitting on lines with no category at all is called out separately, because no category mapping can reach it. Open that invoice and use Change categories.

Changing a category later

A category can be changed on an invoice at any status except void — it is a reporting label, not a figure, and it alters no total, no tax and nothing the customer was sent. Open the invoice, press Change categories, save. Then press Re-check so anything already blocked is worked out again.

Reading “What QuickBooks refused”

That card is a record of the last attempt, not a live check. A row stays exactly as it was until something re-evaluates it — so fixing the mapping a row complains about changes nothing on screen until you press Re-check.

Re-check re-reads every document in the period and works out again what would happen. It never sends anything to QuickBooks; the queue does that on its own schedule. Pressing it after any mapping change is the right habit.

What the common refusals mean, and where each is fixed:

What it saysWhat it meansWhere to fix it
No QuickBooks item for this line, and no default sales item is setThe line could not resolve an item by any of the three routes above.Account mapping → Default sales item, or Revenue by category
Nothing maps the category “…” to a QuickBooks itemThe line has a category, and that category has no item mapped.Revenue by category
No Accounts Payable account is mappedA bill has nowhere to land.Account mapping → Accounts Payable
Invoice … has not reached QuickBooks yetNot a problem to fix. A payment cannot attach to an invoice that is not there.Nothing — it clears when the invoice posts
String length … Min:0 Max:21 supportedQuickBooks caps a document number at 21 characters and refuses the whole document over it. CarinaOS now shortens it rather than failing, so this should not recur.Nothing, unless you want the reference to match exactly — then shorten it here
Order matters

Fix invoices before chasing their payments. Several payments blocked with “invoice not posted yet” usually mean one unmapped item on the invoices — clear that and the payments follow without you touching them.

When a manifest shows “—” for counterparty

METRC does not put the recipient on the transfer list. It lives on the delivery, one lookup per transfer, so a manifest can arrive knowing what shipped without yet knowing who to. CarinaOS now reads it as each new manifest is synced, and reads it again on demand the moment you press Create invoice — so in normal use you will not meet this.

If you do see a dash on an older manifest, press Fill in counterparties on the Transfers tab. It fills everything already on file in one pass.

Two messages, opposite meanings

These read alike and mean opposite things. “No customer matches …” names a business, and the fix is to create it — Find customers and vendors does that. “METRC has not said who received this manifest yet” means the recipient is genuinely not on the record; usually it appears once the receiving facility accepts the transfer. Creating a customer will not help, because there is no name to match against. Invoice from Sales and link the manifest by hand if you cannot wait.

A shipment that will never be invoiced

Not every transfer is revenue. A manifest rejected and reshipped to another buyer, product moved between two licences you hold yourself, lab samples, a return — none of those is a sale, and each one used to sit on the Transfers tab offering Create invoice for good.

Press Not a sale on the row and say why. The manifest stays exactly where it is — nothing is hidden or deleted, and it is still the METRC record a regulator would ask about — but it stops counting as unbilled and the reason shows on the row. Undo puts it back.

Why a reason and not a checkbox

A tick would clear the queue and record nothing, and in six months a reversal would look exactly like a mis-click. The reason is the point: write “reversed, reshipped to LEON SNOW on 0011444547” and the row explains itself to whoever reads it next. It is kept in the audit log with your name and the time.

If the manifest still has a live invoice or bill attached, CarinaOS refuses and names it — void or detach that first, or the books would show a sale against a shipment marked as not a sale. A document already voided does not block anything, since that is the settled state.

Why this matters more than it looks

The Shipped, unbilled tile is only useful if it can reach zero. One manifest that can never be cleared keeps it at 1 forever, you stop reading it, and the next genuinely unbilled shipment sits in that same number unnoticed.

A payment or an invoice went in with the wrong date

Both are fixable, and they are fixed differently — because one is a document somebody else holds and the other is money that has been applied.

The order matters, and CarinaOS enforces it: an invoice with money against it refuses to void. So the payment comes off first.

  1. Sales & invoices → Payments received → Reverse. Give a reason; it is kept on the record rather than deleted. What that receipt settled is un-applied, so the invoice goes back to owing and the ageing corrects itself straight away.
  2. Void the invoice — now that nothing is applied to it, it will let you.
  3. Raise it again with the correct date.
  4. Record the payment again with the correct date.
Why a sent invoice cannot simply be re-dated

A draft can be edited freely. A sent invoice is a document your customer already has, and quietly changing its date would leave your copy and theirs disagreeing with nothing to show it happened. Voiding and re-raising leaves both — the original, marked void, and the correction.

Why a payment is reversed rather than edited

Money that has been applied is never corrected in place. Reversing and re-entering is what leaves a trail somebody can follow a year later, when the question is not "what does it say now" but "what happened".

A date is not cosmetic

The payment date drives Collected and Net cash on the trend chart, which ageing bucket the receivable falls into, and your average days to pay. One receipt dated a month early quietly moves all four — which is why it is worth correcting rather than living with.

If the Reverse button is not there

A receipt that came from QuickBooks shows from QuickBooks where the button would be. Reverse it in QuickBooks instead and it comes back on the next sync — reversing only our copy would leave the two ledgers disagreeing, with no way to tell which is right.

A transfer was reversed and the packages went to someone else

It happens: a manifest is rejected or voided in METRC, and the same packages ship to a different buyer on a new manifest. Nothing is wrong, but three records now disagree unless one of them is corrected.

Do this, in this order:

  1. Reverse or void the transfer in METRC, as you already would.
  2. Void the invoice that first manifest raised. This is the step that matters, and the only one CarinaOS cannot do for you — it does not know a reversal was deliberate rather than an error.
  3. Let the new manifest raise its own invoice for the new buyer. It carries the same package tags, and that is correct: the packages really did go there.
If you skip step 2

Two live invoices will cite the same package tags, and the reconcile run reports Sold twice — correctly. The books would be billing the same product to two customers. Voiding the first invoice clears it on the next run.

What you will see while it is unresolved. Two findings, which are one situation:

FindingWhat it is telling you
On the manifest, not in METRCThe state no longer has this transfer. Expected after a reversal — this one is a fact, not a fault.
Transfer gone — its invoice still standsThe instruction. The transfer is gone and its invoice has not been voided, so the books still bill a shipment the state says did not happen.

The second appears once per manifest, not once per package — the tags are the evidence, the instruction is singular. It disappears on the next run after you void the invoice.

A voided invoice does not count against you

Once voided, that invoice is excluded from the sold-twice check, from invoiced revenue, and from what you are owed. It stays visible as history — voiding is not deleting — but it stops being treated as a sale.

Packages, not just paperwork. Nothing in CarinaOS blocks the second invoice, and nothing needs unlocking. If the new buyer is not yet a customer here, the new manifest offers to create them the same way it always does.

Moving from practice to your real books

Switching companies is a bigger change than it looks, because QuickBooks ids are per-company. Account 63, invoice 145 and customer 12 all exist in both companies and mean entirely different things. An id carried across does not error — it quietly points at the wrong record.

CarinaOS handles this, and it helps to know what it does. Cleared automatically when the company changes: all six account mappings, vendor and customer matches, item mappings, the deposit and payment-method accounts, and the link between documents here and documents there.

What you must do afterwards:

  1. Load accounts and map all six roles again, against the new chart of accounts.
  2. Run Find customers and vendors again.
  3. Return to Dry run and read one document before going live.
What does not transfer

Anything posted to the old company stays there — nothing is copied, moved or deleted. A sandbox is disposable, so leave it. If you posted to a real company by mistake, void those documents in QuickBooks: clearing the link here does not remove them from there.

Troubleshooting

“Blocked — needs a mapping.” Something the document refers to has no QuickBooks equivalent: an account role, a vendor, a customer or an item. The tab names which. Fix it and re-queue.

“Computed for a different QuickBooks company.” That document was worked out while another company was connected, so its accounts and counterparties belong to that one. It is parked rather than sent — correct, because sending it would aim at ids that mean something else here. Re-queue it and it is rebuilt against the company you are on now.

A document sits at “Computed” and never posts. Computed means dry run did its job. Nothing posts until the mode is Live.

An invoice posted but the payment did not. Payments wait for their invoice. If the invoice has posted and the payment has not, check the payment has a Deposit to account — a payment with nowhere to land is held rather than guessed at.

“X of bills are coded to stock items but no matching goods reached the inventory ledger.” Either the receipt was never recorded, or the line is a service — delivery, a fee, a labour charge — that should not be coded to an inventory item. The first understates your stock; the second overstates it.

A mapping warning appears that was not there yesterday. CarinaOS re-checks the mapping against your live chart of accounts every time the tab opens. Somebody has re-typed, deactivated or deleted an account in QuickBooks; the warning names the role and the account.

24 — Money & QuickBooks

Cultivation labor into QuickBooks

Part of the ERP add-on. Most facilities do not need this. Sending hours and handing your accountant the labor report covers it — they make whatever entry your books need, and no tax position is taken by software. Turn the journal on only if your accountant has told you to; doing so asks you to confirm they did, every time it changes.

What it does: approved hours become a journal entry that moves wages out of the account your payroll posts to and into cost of goods sold. It does not add cost. If you run payroll in QuickBooks those wages are already expensed — this moves them above the gross profit line, where Reg. 1.471-11(b)(2) puts cultivation labor. Your total expenses do not change; which side of gross profit they sit on does.

This is not payroll. Nothing here pays anyone, calculates withholding or files anything. CarinaOS sends hours — QuickBooks Payroll works out the pay from its own rates, taxes and burden. No wage figure ever leaves CarinaOS, because the rate we hold exists to cost a crop, not to pay a person.

Sending hours: check your QuickBooks plan first

Hours to QuickBooks pushes each approved entry as a time entry, per person per day, with the crop and the task on it. Every approved hour goes, including work that is not on a crop, because payroll pays for all of it.

This needs QuickBooks Online Essentials or higher. Simple Start does not include time tracking, and QuickBooks refuses every time entry with “Feature Not Supported”. CarinaOS detects that, switches the option off rather than retrying, and lets you clear the failed entries — none of them reached your books, so nothing is removed from them.

On Simple Start you still have two routes that work: hand your accountant the labor report from the Labor tab, or use the journal below with one line per entry. Journal entries are supported on every QuickBooks plan.

If you upgrade later, press I have upgraded — try again on that warning. It clears the failed entries and switches the option back on. The refusal is worked out from those failures, so clearing them is what lifts it — there is no separate setting to hunt for.

Before it can send anything, each person must be matched to a QuickBooks employee on the Employees card. Exact name matches are suggested; nothing is linked until you save. CarinaOS will not create employees for you — add them in QuickBooks under All apps → Payroll → Employees, which works even without a payroll subscription.

What the tab is laid out as

The QuickBooks tab reads top to bottom as three jobs. Set up · once — the account mappings, then your vendors, customers and employees. Every month — what we would post, the hours, and what QuickBooks has that we do not. Optional — the cultivation-labor journal, last, because most facilities never turn it on.

Setting it up

Map two accounts on the QuickBooks card. Cultivation labor (COGS) is where cost moves to, and must be a Cost of Goods Sold account. Where payroll posts is where it moves from — the expense account your payroll already lands in. Never a liability account: crediting one books the same wages twice and leaves a balance nobody clears.

Elect the treatment. Whether cultivation wages are capitalized into the crop is a 280E decision that turns on facts CarinaOS cannot see. Setting it requires confirming your accountant has told you to; turning it off asks nothing. Who chose, and when, is recorded — and it is asked again on every change, because a one-time sign-off would not record what was decided when.

Choose how the entry splits. One line per crop or area, one line per person per crop, or one line per entry with the date, person and task — that last one reconciles against a timesheet and needs nobody set up in QuickBooks Payroll. The same money moves either way; only the number of lines changes.

Posting a month

Open ERP → QuickBooks → Cultivation labor and press Show a month. It opens on the last completed month — a month still running is not a month you can book. You see every cycle and area with its hours and cost, the total, and anything blocking the post.

In dry run the entry is computed and stored so you can read it, and nothing reaches QuickBooks. In live it is sent, appearing as CL-YYYY-MM dated the last day of that month, with a note saying it reclassifies cost already expensed by payroll. Posting the same month twice cannot duplicate it.

Nothing posts on a schedule. Automatic monthly posting was removed — an unattended entry into live books, on a tax position, is not something CarinaOS should do on your behalf. Every entry is a deliberate press.

When hours are approved after a month posts

This happens constantly, and there are two defensible answers. You choose; neither is recommended.

Post an adjusting entry. The original stands and a second entry for the difference is posted, dated to the same month (CL-2026-08-A1, then A2). Always legal, including once a period is closed or reviewed — nothing already in the books changes underneath anyone. The cost is more entries.

Correct the original. The entry in QuickBooks is updated so the month carries one right number. Cleaner ledger, but it changes something already booked — and if a closing date is set, QuickBooks refuses the change and tells you.

A correction posts only the difference, never the whole month again. If hours are rejected after approval the difference is negative and the entry reverses — debiting payroll, crediting COGS — because QuickBooks has no negative amounts.

What is deliberately left out

Hours not tagged to a crop or area. An approved shift with no cost object is time somebody worked and nobody said what for. It might be cultivation, which is inventoriable, or admin, which is not — and claiming it either way is not ours to decide. It stays out of the entry and is shown on the screen with its total. Tag it on the Labor tab and the next post includes it.

Hours awaiting approval. An unreviewed guess has no business in a ledger.

Anything costed at zero. A $0.00/h pay rate produces real hours at no cost. On a dashboard that is a warning you can re-run; in a ledger it is a line asserting labor was free.

Common questions

The total is lower than my payroll for that month. Expected, and usually right. Only approved, tagged, non-zero cultivation hours post — admin and untagged time is not cultivation labor, and the screen shows how much was excluded.

Will this double my expenses? No. It debits COGS and credits the account payroll already posted to, so the total is unchanged. If expenses ever rise, the payroll account is mapped to a liability rather than the expense account — fix the mapping.

Can I see it before it posts? Yes. The preview shows the whole entry, and dry run stores it without sending. The entry moves a tax position; you should not have to look in QuickBooks to find out what it did.

25 — 280E

280E: which costs count as cost of goods sold

Read this first

This is not tax advice, and CarinaOS is not your tax adviser. It is a starting point written to make the conversation with your CPA shorter, not to replace it. Every treatment below has to be approved by the person who signs your return.

The reason is not caution for its own sake. Under 280E the boundary between cost of goods sold and operating expense is the tax position, and it turns on facts the software cannot see: whether you are a producer or a reseller, how you have applied §471, your accounting method, how your facility is actually used, and what your advisers have already filed. Two facilities with identical charts of accounts can correctly reach different answers.

The law here is unsettled and moving. Items marked contested are positions on which reasonable practitioners disagree and on which the IRS has taken a contrary view. Confirm current status before relying on anything here.

Why cost of goods sold survives at all

Section 280E denies deductions and credits to a business trafficking in Schedule I or II controlled substances. It does not deny cost of goods sold, and constitutionally could not: COGS is not a deduction, it is subtracted in arriving at gross income in the first place.

So the whole of cannabis cost accounting comes down to this: a dollar recorded as an inventoriable production cost reduces taxable income; the same dollar recorded as an operating expense does not. Nothing else in your books carries that leverage.

The rule of thumb — if the cost was incurred to produce the goods it is a candidate for inventory; if it was incurred to sell them or run the company it is not — gets you most of the way. The regulations decide the rest.

The question that decides everything

A producer (grower or manufacturer) inventories under the full-absorption rules: direct materials, direct labour and indirect production costs. That last category is broad and it is where the money is — utilities, rent, repairs and indirect labour on the production facility all become candidates. Treas. Reg. §1.471-11

A reseller (a dispensary buying finished goods) gets a much narrower answer: what was paid for the goods, less discounts, plus transportation and the necessary charges of acquiring them. Overheads do not come in, and attempts to use the producer rules have been rejected in the Tax Court. Treas. Reg. §1.471-3(b)

A vertically integrated business is both and must account for them separately. The guidance CarinaOS shows is written for a producer, because that is what a cultivation facility is.

What we suggest, account by account

Shown beside each account on the QuickBooks tab, with the regulation it rests on.

AccountWe suggestRests on
5100 Nutrients & consumablesInventoriable§1.471-11(b)(2) direct material
5300 Cultivation labourInventoriable§1.471-11(b)(2) direct labour
5400 Cultivation utilitiesRequired§1.471-11(c)(2)(i)(c) Category 1 — mandatory inclusion
5500 Cultivation rentRequired§1.471-11(c)(2)(i)(d) Category 1 — mandatory inclusion
5600 Testing & complianceInventoriable§1.471-11(c)(2)(i) quality control
6810 Rent — cultivationRequired§1.471-11(c)(2)(i)(d) — mandatory; attach an allocation rule if part of the building is not production space
6850 Waste disposalRequired§1.471-11(c)(2)(i)(f) indirect materials
6860 Repairs & maintenanceRequired§1.471-11(c)(2)(i)(a)-(b) Category 1 — mandatory
6820 Electricity · 6830 Water · 6840 GasRequired§1.471-11(c)(2)(i)(c) — mandatory for the production share; sub-meter if you can
5200 PackagingUnsettled§1.471-11(c)(2)(i) vs (ii) — packaging that IS the product is production; shipping cartons are selling
6200 Administrative salariesUnsettled§1.471-11(c)(2)(ii) and (iii) — supervisory time on production may qualify, but only with records
6600 InsuranceUnsettled§1.471-11(c)(2)(iii) Category 3 — follows your financial statements; decided once, then stay consistent
6500 Licences & permitsNo authority§1.471-11 does not mention licences in any category, and no case or ruling addresses cannabis licence fees. Open in both directions
6000 Selling & marketingNot deductible§1.471-11(c)(2)(ii) Category 2
6100 Distribution & freight outNot deductible§1.471-11(c)(2)(ii)
6300 Office & generalNot deductible§1.471-11(c)(2)(ii)
6400 Professional feesNot deductible§1.471-11(c)(2)(ii)
6700 Bank & merchant feesNot deductible§1.471-11(c)(2)(ii)

Two that catch people. Freight in is inventoriable; freight out is not — the direction decides it, and both land in the same account by accident easily. And testing a batch must pass to be sold is production inspection, while general regulatory compliance is not.

Some of these are not optional

§1.471-11(c)(2)(i) lists eight indirect production costs that must be inventoried “regardless of their treatment by a taxpayer in his financial reports”: repairs, maintenance, utilities, rent, indirect labor and production supervisory wages, indirect materials and supplies, uncapitalized tools, and quality control.

For those, inclusion is not a position you may decline to take out of caution — leaving them out is itself a departure from the regulation. The only open question is the production share. CarinaOS marks these Required rather than suggested.

Where “unsettled” really is the answer

Packaging, administrative salaries, insurance and licences are genuinely unsettled, and CarinaOS says so rather than picking for you. For those — Category 2 and Category 3 items — claiming a deduction by default is the expensive direction to be wrong. Being wrong conservatively costs a deduction you were entitled to; being wrong aggressively costs tax, interest and penalties on a position you could not support, years later, with the burden of proof on you.

Changing a treatment may need permission first

Moving a cost from deducted to inventoried can be a change of accounting method, which may require the Commissioner’s consent on Form 3115 before the change is made.

A cannabis taxpayer that reclassified expenses into indirect COGS between two years without one lost its penalty defense — even though the parties had stipulated it substantiated every figure. The court treated the unauthorised method change as evidence the taxpayer knew the deductions were barred. Ask your CPA whether a reflagging needs a Form 3115, and get the answer before you change anything.

Allocation is the whole game

For a producer most overheads are candidates. What decides how much is not whether — it is how you allocate and whether you can evidence it. Strongest basis first:

  1. Measured — sub-metered power, a flow meter on irrigation. CarinaOS already records these.
  2. Square footage — production area against total, from a plan you can produce.
  3. Plant-days or canopy — sound for costs that scale with what is growing.
  4. A percentage somebody chose — weakest, and the first thing an examiner asks about.

The allocation rules on the Overheads tab attach a driver to an account, so the split is computed rather than asserted.

You may have two rent accounts

The seeded chart contains 5500 Cultivation rent flagged inventoriable and 6810 Rent — cultivation flagged not inventoriable. Same economic cost, opposite treatment. Pick one: use 6810 with an allocation rule if part of the building is not production space (better for most facilities), or 5500 directly if the whole premises is production. Do not use both — retire the other so nobody books to it later.

Setting the flag, and who owns it

On the QuickBooks tab each expense account shows what we suggest, why, and whether your current setting differs from it. Changing a 280E flag asks you to confirm you have reviewed the treatment with your CPA, and records who did and when.

You are asked only when a flag actually changes — renaming an account or re-saving the same value asks nothing. It is required each time rather than once, so an account cannot be acknowledged conservatively and quietly re-flagged afterwards.

What could change everything

280E applies to Schedule I and Schedule II substances, so anything moved below that falls outside it. In April 2026 marijuana was partially rescheduled: marijuana subject to a state medical licence moved to Schedule III, while adult-use marijuana did not and remains Schedule I.

Your federal answer therefore turns on something no chart of accounts records — whether your cultivation licences are M-designated, A-designated, or both. Dual operators will have to apportion between the two, and the cost allocation described above is the machinery that apportionment runs on either way.

Prior years are not cleared. The order is prospective, and the IRS notice stating that 280E refund claims on amended returns are not valid has not been withdrawn. Ask your CPA about protective refund claims for open years — those have limitation periods that do not wait for the position to settle. The order is also under challenge in the D.C. Circuit; have them confirm its status before relying on Schedule III treatment.

State tax is separate. Several states, California among them, decouple from 280E. California’s personal income tax decoupling was extended to tax years beginning before 2030, and its corporation tax never conformed to 280E at all.

That has a practical consequence for the books: keep the 280E disallowance as a reconciling schedule rather than as journal entries in the ledger. If the disallowance is baked into the GL, the state figure cannot be rebuilt without reversing entries. CarinaOS reports the federal position only.

25 — FAQ

Frequently asked questions

Why does my plant count look a few minutes out of date?

METRC data is cached for about 10 minutes to stay within METRC's usage limits. Hit Refresh on any tab to pull the latest live sync.

I'm about to run a METRC action — what should I do first?

Always Refresh first so you're acting on current counts, tags, and cycles. Then use 🧪 Dry Run to validate before committing.

What is Dry Run?

It checks your action for errors and shows exactly what would be sent to METRC — without actually sending it. Use it before every live action, especially large flips or destructions.

Can I undo an action?

Some, not all. Finish Package / Harvest can be reversed with Unfinish. A Veg → Flower flip and waste / destruction are permanent in METRC — dry-run those first.

I need to flip a couple hundred plants at once — is that a problem?

No. METRC limits how many plants can be flipped per request, so the hub automatically splits a large Veg → Flower flip into the right-sized batches for you.

How do I order more tags?

Tag orders are placed directly in the METRC portal, not in CarinaOS. The hub shows your available counts and warns you when they're low.

Why does package creation ask for a weight?

A package can't exceed the available weight in its harvest, so the weight is required. Leave it blank and the action won't submit.

What are the user roles?

Owner — full access including settings, METRC, and facility deletion (one per facility). Admin — full read/write plus team management, no facility deletion. Staff — completes tasks and writes logs, but cannot change settings, integrations or billing. Viewer — read-only.

How do I create logins for my crew?

Settings → Team → Invite someone. You choose their role and, per person, how much METRC and ERP they can reach. They receive an email with a link to set their own password; you never handle it.

Can I stop someone using METRC without hiding their plant counts?

Yes — set their METRC access to View only. They see plants, harvests and packages, and cannot flip, destroy, package or transfer.

Someone left. How do I remove them?

Settings → Team → Disable. Their login stops working immediately. It is a disable rather than a delete so their name stays on the tasks, logs and METRC actions they filed — the record you would want in an inspection.

My new hire never got the invite.

Check Settings → Team: anyone invited who has not signed in is flagged there. The usual cause is the email in their spam folder. Ask them to mark it Not spam, or send the invite again.

Can other facilities see my data?

No. Every account only ever sees its own facility's data.

A METRC action was rejected.

Almost always stale data. Refresh first, then Dry Run to see the exact error, fix the input (tag, weight, reason), and try again.

My data looks wrong or missing.

Hit Refresh on that tab to force a live sync. If a whole area is empty, confirm your METRC key and license are set in Settings → Integrations.

How do I get ready for a DCC inspection?

Work through the Checklist (built around the California DCC requirements), review the Audit items and your log sheets, then save an inspection record with the inspector's details and outcome. Operating in another state? The audit items still help — just confirm your own regulator's specifics.

26 — Glossary

Glossary

Cultivation lifecycle

Clone
A cutting from a mother plant that roots into a genetically identical new plant. The start of the cycle.
Mother
A healthy plant kept specifically to take clones from.
Veg (vegetative)
The stage where plants build stems and leaves under long light hours, before flowering.
Flip (Veg → Flower)
Switching a veg plant into flowering. In CarinaOS this also assigns METRC plant tags, and can't be undone in the hub.
Flower
The stage where plants produce buds — typically ~56–63 days to harvest.
Flip date
The day a room/cycle entered flower. Day 0 for all cycle scheduling and harvest projections.
Cycle
One full flowering run of a room, from flip date to harvest — shown as a ~63-day arc.
Cohort
A group of plants that flipped around the same time and move through flower together.
Harvest
Cutting down flowering plants and recording their wet weight.
Dry-down / cure
Drying and curing harvested flower before packaging; wet weight becomes a smaller dry weight.

Environment & sensors

DLI
Daily Light Integral — total light per day (mol/m²/day). CarinaOS targets ~40–55 for flower.
PPFD
Instantaneous grow-light intensity on the canopy (µmol/m²/s). DLI is PPFD added up over the day.
VPD
Vapor Pressure Deficit — a combined temp/humidity measure of how hard plants are transpiring. A key climate target.
RH
Relative Humidity — moisture in the air, as a percentage.
Substrate
The growing medium (coco, rockwool). CarinaOS tracks its moisture (VWC), EC, and temperature.
VWC
Volumetric Water Content — how wet the substrate is, as a percentage.
EC
Electrical Conductivity — nutrient concentration in water or substrate (mS/cm).
Growlink / YoLink
Supported sensor/hardware systems CarinaOS reads from (climate, irrigation, tanks, flow, temp/humidity).
Flow meter
Measures water passing through an irrigation line; used to detect clogs and track usage.

Irrigation & water

Shot
A single scheduled irrigation event.
Fertigation
Delivering nutrients through irrigation water.
Runoff
Excess solution that drains out of the substrate after irrigation, as a percentage.
Crop steering
Using irrigation and climate to push plants toward vegetative or generative growth.

METRC & compliance

METRC
The state's seed-to-sale cannabis tracking system. CarinaOS reads from and writes to it.
Tag
A unique METRC identifier on a plant or package. Ordered from the state portal.
Plant batch / immature batch
A group of clones or seedlings tracked together before they're individually tagged.
Package
A tagged, weighed unit of product (flower, trim, etc.) in METRC.
Adjust (package)
Changing a package's recorded quantity, with a reason and note.
Finish / Unfinish
Closing an empty package or harvest (Finish), or reopening it (Unfinish).
Waste / destruction
Recording plants or product destroyed, with weight, reason, and method. Permanent in METRC.
Additive
A nutrient or IPM product application logged to plants or a room.
Manifest
A METRC transfer record documenting product moving between licenses.
DCC
California's Department of Cannabis Control (the regulator). The DCC Checklist helps you prep for inspections.
IPM
Integrated Pest Management — your pest/disease prevention program and spray schedule.

CarinaOS terms

Hub
The full web dashboard — as opposed to the CarinaOS Go mobile app.
CarinaOS Go
The companion mobile app; a lighter, field-focused version with offline support.
Dry Run (🧪)
A safe test that validates a compliance action and shows what would be sent to METRC, without sending it.
Refresh
Pulls the latest live data from METRC. Because data is cached ~10 minutes, refresh before acting.
Cycle Board
The dashboard's visual timeline of every room across its flower cycle, color-coded by task type.
Playbook
A reusable schedule of cultivation / IPM tasks you can apply to a room.
Log sheets
The six cloud-backed digital forms (Daily, IPM, METRC, Harvest, Sanitation, Clone) that make up your records.
Role
Your permission level: Owner, Admin, Staff (records work, cannot change setup), or Viewer (read-only).
METRC access
Set per person: no access, view only, or can act. Separate from your role.
Disabled
A login that has been switched off. The person’s history stays on the records they created.
Tenant / facility
Your isolated account. You only ever see your own facility's data.
27 — Help

Get help

Stuck? Contact CarinaOS support with your facility name and a description of what you were doing when the issue happened — and any error text METRC returned. That's usually enough to sort it fast.

Email support: hello@carinaos.com

Online: carinaos.com

On the floor instead?

For METRC actions from the grow floor on your phone, see the CarinaOS Go guide.