Industry guide · POS

Cannabis Dispensary Software: Fixing METRC, Limits, and the Reconciliation Tax

The short answer

If you run one to three stores in a single state with a plain flower and edibles menu, buy Dutchie, Flowhub, Treez or Cova and stop reading. If you run five or more locations, two or more states, deli-style weighing, or delivery, and you have people spending their Sundays reconciling METRC against your POS, build. In Digital Heroes delivery experience across 2,000+ projects, a focused first release runs $60k to $130k and ships in 12 to 16 weeks, and a full multi-location platform runs $150k to $400k phased over 6 to 12 months. The honest test: if reconciliation, oversells and limit violations cost you more than $150k a year in labor, write-offs and regulatory exposure, the build pays back inside two years.

Why dispensary software makes or breaks a multi-location operator

Every other retailer in America gets to treat their point of sale as plumbing. You do not. Your POS is the thing that talks to METRC, and METRC is the thing that decides whether your license survives the next inspection. A grocery chain that miscounts a case of soup writes off shrink and moves on. If your on-hand for package 1A4060300003B01000001234 says 112 grams and METRC says 118.7, that is a reportable variance and somebody has to explain it in writing.

So the stack ends up looking like this: Dutchie POS or Flowhub or Treez or BLAZE or Cova on the counter, Dutchie Ecommerce or Jane on the website, Weedmaps and Leafly pulling menus, Alpine IQ or springbig running loyalty and texts, LeafLink or Distru on the wholesale side, Onfleet or a spreadsheet for delivery, Aeropay or Dutchie Pay or CanPay for anything that is not cash, QuickBooks at the end of the month, and METRC underneath all of it refusing to be wrong. Six vendors, six sync jobs, six support queues, and not one system that holds the truth.

Here is the scene we walk into on almost every discovery call. Sunday, 11pm. The inventory manager has the METRC Active Packages export on one monitor and the POS on-hand report on the other, joined on tag number in Excel. Forty rows disagree. Most are deli jars: a gram here, 2.7 grams there, the accumulated tare drift of 400 hand-weighed eighths. Two rows are worse: sales receipts the POS believes it sent on Friday that METRC never accepted, because the API threw rate-limit errors during the after-work rush and the retry queue gave up without telling anyone. In our engagements, operators at this stage are typically burning 15 to 25 hours a week of skilled labor on reconciliation, per state, forever.

METRC sync is fire-and-forget, and the failures are silent

Off-the-shelf POS platforms post sales receipts to METRC in a background job. When the state API is slow, rate limits you, or rejects a receipt because a package was finished five minutes earlier at your other register, most of them log it and move on. You discover it three weeks later during a monthly true-up, when the fix requires a package adjustment with a reason code and a story you no longer remember.

The vendors cannot fix this for you, because their queue is shared across thousands of licensees and their support tier will not reprocess your specific Friday. A custom build treats METRC as an unreliable downstream system on purpose: a durable outbox with idempotency keys per receipt, exponential backoff, and a human-facing exception queue that a compliance manager works like an inbox, with the original cart, the budtender, the register and the timestamp attached to every failed row. On top of that, a nightly reconciliation job pulls Active Packages from METRC, diffs quantity by tag against your ledger, and emails a variance report ranked by dollar value, grouped by store, room and budtender, before anyone opens Excel. Operators who ship this stop reconciling and start reviewing. That is the whole difference.

Purchase limits break the moment a customer visits two of your stores

The limits are per person per day, not per transaction, in most markets, and they are expressed in equivalency, not units. California adult use is 28.5 grams of flower and 8 grams of concentrate. Illinois gives residents 30 grams of flower and 5 grams of concentrate and cuts that in half for non-residents. Colorado runs a one-ounce flower equivalency where an edible eats into the same bucket. Now: a customer buys 28 grams at your Michigan Ave store at noon and 14 more at your Wicker Park store at 6pm. Your POS enforced the cart, not the person, and not the day, and not across stores.

Dutchie and Flowhub check the cart in front of them. They do not run a cross-location identity ledger, because most of their customers are single-store and the feature would create liability. A custom build resolves identity at the door: the ID scan produces a hashed key (never the raw document, never in a URL), and every store writes to one rolling daily equivalency ledger. The budtender sees remaining headroom in grams-equivalent before the item hits the cart, medical cards carry their own limit profile with expiry dates, and the rules live in a versioned policy table with effective dates so an operations lead can change Illinois on the day the rule changes without a deploy. Every check is logged, so when the state asks how you enforce, you show them the ledger instead of a policy PDF.

Your menu lies, and the oversells land on the budtender

Dutchie Ecommerce, Jane, Weedmaps and Leafly all pull inventory on a schedule. Between syncs your last two Blue Dream carts sell in-store, and three online orders come in for them. Now the pickup counter tells three customers no, and one of them writes the review. The real culprit is that nobody reserves anything: on-hand is a number that gets pushed outward every few minutes instead of a balance with holds against it.

The custom answer is boring and it works: one inventory service, on-hand minus reserved equals available, reservations created at cart with a TTL, released on abandonment, and every channel reading the same available number over an event stream instead of a batch. Per-channel pricing and per-channel availability become configuration, not four separate content jobs. This is also where AI earns its place rather than decorating a slide: an after-hours SMS and web assistant that answers "do you have anything under $30 that is not a hybrid" against live availability and places a hold, and a demand forecast trained on your own sales by batch, weekday, weather and promo history that tells the purchasing manager on Monday which SKUs go out of stock by Thursday and which flower is about to age past the point where you can sell it at full price. Forecasting on flower is the highest dollar-per-line-of-code work in this category, because your product loses value on a clock.

Deli jars, batches, and the margin nobody can see

Hand-weighed flower is where the money quietly leaves. An NTEP-certified scale, a tare that drifts, a budtender rounding in the customer's favor at the end of a shift, and a jar that was already 3 grams light when it arrived from the distributor. Generic POS inventory has no concept of the weigh event, so the variance is invisible until the jar closes out.

A custom build captures the weigh itself: scale integration writes gross, tare and net per transaction, tied to the register, the budtender and the jar's tag. Variance per jar per shift becomes a report, and a 4% overpour pattern on one employee shows up in week one instead of quarter three. Receiving gets the same treatment. Vendor manifests and certificates of analysis arrive as PDFs, and document extraction is genuinely good at this now: parse the COA into batch, potency, terpene profile and test date, parse the invoice into line items and unit costs, and match both against the METRC incoming transfer before anyone types a number. That matters beyond convenience, because under 280E your cost of goods sold is the only deduction you get, so line-level costing accuracy is not accounting hygiene, it is your tax bill.

Cash, PIN debit, and a tax stack the incumbents get wrong

You take cash, PIN debit, ACH through Aeropay or Dutchie Pay, and sometimes CanPay, and you round to the dollar because nobody wants to count coins. Then the tax stack: state excise, local cannabis gross receipts, local sales tax, and a discount that has to apply before or after excise depending on the jurisdiction. Multi-jurisdiction operators find out their POS applies the promo in the wrong order only when the city auditor recalculates a quarter.

Off-the-shelf tax engines in this category are configuration screens with a handful of toggles. A custom tax engine is a rules table with jurisdiction, effective date, base, ordering and rounding, plus a recalculation harness that replays last quarter's receipts against a proposed rule change so you know the exposure before you flip it. On the cash side, drawer events (open, drop, count, close) get their own audit trail with variance by till and shift, tied to shift boundaries, so a $400 short traces to a person and a 12-minute window instead of a shrug.

What this costs and how long it takes

Digital Heroes delivery experience across 2,000+ projects: a focused first release, meaning one state, POS plus METRC integration with the outbox and reconciliation, purchase limits, and inventory as the source of truth, lands at $60k to $130k and ships in 12 to 16 weeks. A full platform with ecommerce, delivery manifests, purchasing and receiving, loyalty, payments and BI (Business Intelligence) runs $150k to $400k phased over 6 to 12 months.

What drives the number up in this category specifically: every additional traceability system beyond METRC (BioTrack in some markets, Leaf Data Systems in Washington) is effectively a new integration, not a config flag. Offline mode at the register, which you need if your stores lose internet and cannot legally stop selling, adds meaningful engineering because conflict resolution against a state ledger is genuinely hard. Delivery adds manifests, drivers, vehicles and route state. Payments adds a processor per rail. Hardware adds label printers, scales and cash drawers, each with its own driver. And migrating three years of sales history off Dutchie or Flowhub, with the tags intact so historical audits still resolve, is usually a two to three week workstream by itself.

Build versus buy, and I will take a position

Buy the off-the-shelf tool if you run one to three stores in one state, sell packaged product and prepackaged eighths, do no delivery, and your revenue is under roughly $6M. Dutchie, Flowhub, Treez and Cova are real products built by people who understand this industry, and at that size the per-store SaaS fee is cheaper than an engineer. Anyone who tells you to build at three stores is selling you something.

Build when these signals stack up: five or more locations or a second state, more than one full-time person on reconciliation, deli-style weighing at volume, a delivery operation, or vertical integration where cultivation and manufacturing and retail all touch the same packages and the seams are where your inventory dies. The clearest signal is roadmap: you have asked your vendor for cross-store limit enforcement or a real exception queue, they said it is on the roadmap, and it has been on the roadmap for four quarters. At that point you are paying a subscription to wait.

How to choose a developer for cannabis dispensary software

Four things to test, and they will separate the field fast.

  • Make them draw the data model on the call. Ask how packages, items, batches, lots and SKUs relate, and where the tag lives. If they conflate a METRC package with a SKU, they have never shipped this. That single mistake costs a rebuild.
  • Ask what they do when METRC returns an error at 6pm on a Friday. The right answer includes idempotency keys, an outbox, backoff and a human exception queue. The wrong answer is "we retry."
  • Ask which integrations they have actually shipped, not which they have read the docs for. METRC, BioTrack, Jane, Weedmaps, Alpine IQ, Aeropay, LeafLink. Ask for the specific state and the specific year, because these APIs change.
  • Ask who owns the code and where the rules live. You should own the repository outright, and jurisdiction rules, limits and tax should sit in versioned data your compliance lead can edit, not in a developer's if-statement. If a rule change requires a sprint, you bought a liability.

The operator who wins this decision is the one who stops asking "which POS is best" and starts asking "which parts of my operation can nobody else's software ever know about." Those parts are your build. Everything else, keep buying.

Research & sources

The evidence behind this guide

Independent findings on why this investment pays off. Every link goes to the primary source.

  1. Item-level RFID tagging enabled 99.9% order accuracy in the retail supply chain, versus a baseline where 69% of orders shipped between brands and retailers contained data errors - showing how RFID-at-POS integration reduces inventory inaccuracy. Source: Auburn University RFID Lab & GS1 US (2018) →
  2. The NRF discontinued its long-running annual shrink report, stating that a broad study of retail shrink 'is no longer sufficient for capturing the key challenges and needs of the industry' - important context that qualifies how POS/shrink benchmarks should be cited going forward. Source: Retail Dive (2024) →
  3. In a McKinsey global survey of 1,259 respondents, only about 20% said their organizations excel at decision making, and just 37% said their organizations' decisions were both high quality and high in velocity. Source: McKinsey & Company (2019) →
  4. This World Bank report argues that digital technology adoption raises SME competitiveness, productivity and resilience, while documenting that smaller firms consistently lag larger ones in digital adoption - a gap that constrains their growth and market reach. Source: World Bank (2022) →
Rohan Malhotra · Enterprise Software Consultant

Rohan advises mid-market and enterprise teams on ERP, CRM and custom software, and has led delivery on dozens of business-software builds.

Writes for Digital Heroes, shipping business software for 2,000+ brands across 55+ countries since 2017.

FAQ

Frequently asked questions

How much does it cost to build custom dispensary POS software for a 6-store operation?
In Digital Heroes delivery experience across 2,000+ projects, a focused first release for a six-store single-state operator runs $60k to $130k over 12 to 16 weeks, covering POS, METRC integration with a reconciliation and exception queue, purchase limits, and inventory as the single source of truth. A full platform adding ecommerce, delivery manifests, purchasing, receiving and BI runs $150k to $400k phased over 6 to 12 months. Price climbs with each additional state traceability system, offline register mode, payment rail and hardware driver. Migrating historical sales off your current POS with tags intact is usually a separate two to three week workstream.
Is custom dispensary software actually better than Dutchie POS or Flowhub?
Not at one to three stores in a single state, where Dutchie or Flowhub is cheaper and faster than anything you would build. Custom wins when you need behavior they will not build for a mass market: cross-location daily purchase limit ledgers, a human-workable METRC exception queue, weigh-event capture on deli jars, or multi-jurisdiction tax ordering. The honest comparison is not features, it is whether you are paying people to compensate for software every week.
Can custom software integrate directly with METRC, or do we need an approved vendor?
You integrate directly using the METRC API with a vendor API key plus a user API key per facility, and states maintain a list of registered integrators that your developer or your operation registers under. The technical work is not the endpoints, it is handling failure: rate limiting, rejected receipts, package adjustments and reconciliation. Build an outbox with idempotency keys and a nightly diff of METRC Active Packages against your ledger, and the integration stops being the risky part.
How long does it take to build and roll out a custom dispensary POS across multiple stores?
A first release ships in 12 to 16 weeks, and rollout is a separate calendar. Pilot at one store for two to four weeks running parallel with your existing POS on read-only reconciliation, then convert store by store rather than all at once, because a bad cutover during a weekend rush is a revenue event. Full multi-store conversion for a six to ten location operator typically spans another six to ten weeks.
How do we migrate off Dutchie or Flowhub without losing sales history or breaking METRC compliance?
Export sales history, package tags, customer records and loyalty balances, and load them into the new system with the METRC tag preserved as the join key, so historical audits still resolve against state records. Run both systems in parallel for at least two weeks with a daily diff, and only cut over when the diff is clean for five straight days. The riskiest data is not sales, it is open packages and partially depleted deli jars, which need a physical count at cutover.
Do we own the code if we hire an agency to build our dispensary software?
You should own the repository, the infrastructure accounts and the data outright, in writing, before work starts. Anything less means your compliance system is hostage to a vendor relationship, which is the exact problem you left the off-the-shelf tool to escape. Ask for the ownership clause and the handover plan in the proposal, not the contract's final draft.
How do you enforce cannabis purchase limits across multiple stores in the same state?
Resolve the customer identity at the door from the ID scan, store a hashed key rather than the raw document, and write every sale to one rolling daily equivalency ledger shared by all locations. The budtender then sees remaining headroom in grams-equivalent before the item enters the cart, including concentrate and edible conversions. Off-the-shelf POS platforms enforce the cart in front of them, which is why a customer can legally clear a limit twice in one day across two of your stores.
Can AI actually help a dispensary, or is it hype in this category?
Three uses pay for themselves and the rest is decoration. Demand forecasting on flower, trained on your own sales by batch, weekday and promo history, tells purchasing which SKUs go out of stock by Thursday and which flower is aging past full price. Document extraction turns vendor certificates of analysis and invoices into batch, potency and unit-cost records matched against the METRC incoming transfer, and an after-hours SMS or web assistant answers availability questions and places holds against live inventory.
What happens at a state audit if our custom system shows a discrepancy?
The same thing that happens with any POS: you explain the variance, provide the adjustment reason and show your process. The advantage of a custom build is that you can show the process instead of describing it, because every limit check, weigh event, drawer event and failed METRC receipt has a timestamp, a register and a person attached. Auditors respond to traceable variance far better than to an unexplained one, and most operators' exposure comes from discrepancies they could not account for rather than discrepancies that existed.
What should I have ready before I contact an agency about building a POS?
Bring three things: a written list of your 10 to 15 must-have workflows (returns, split payments, voids, shift close), your last three months of processing statements, and every system the POS must talk to, such as QuickBooks, your loyalty program, or a kitchen display. Agencies quote against unknowns, and this preparation tightens estimates by 20 to 30 percent in Digital Heroes scoping calls. You do not need wireframes or a technical spec; producing those is the agency's job.
How do I calculate whether custom software will pay for itself?
Divide the build cost by the monthly benefit, where benefit is hours saved times loaded hourly cost, plus subscription fees replaced, plus any revenue the software unlocks. Three staff saving 10 hours a week each at a $40 loaded rate is about $62,000 a year, which pays back a $60,000 build in roughly 12 months. Across Digital Heroes internal-tool projects, 12 to 24 months is the normal payback range, and anything projecting under 6 months usually means the spreadsheet is hiding costs.
How long does it take to develop a custom POS system?
Plan on 12 to 16 weeks for a working first version with checkout, catalog, payments, and reporting, and 6 to 9 months for a full multi-location rollout. In Digital Heroes projects the schedule risk is rarely the software, it is hardware certification and payment processor onboarding, which can add 3 to 6 weeks if started late. Kick off the merchant account and terminal applications in week one, not at the end.
Should I use a freelancer or an agency to build my POS system?
A POS build needs backend, client app, payments integration, and hardware testing skills running at the same time, which is more surface area than one freelancer reliably covers. Freelancers make sense for narrow additions, like a reporting module on an existing system, at typical rates of $30 to $90 per hour. For a ground-up build, an agency with a dedicated QA function is the safer choice because a register failure stops your revenue at the counter in real time.
If an agency builds my POS, who actually owns the source code?
You should own it outright, and the contract must say so through a full IP assignment clause that transfers copyright on payment, not a license to use it. Also require the code to live in a repository under your own account from day one, so ownership is a fact rather than a promise. Walk away from any agency that keeps the code and charges you to stay on their platform; that is a more expensive version of the vendor lock-in you were trying to escape.
What does it cost to keep custom software running after launch?
Budget 15-20% of the original build cost per year, which on a $100,000 system means $15,000 to $20,000 for security patches, dependency updates, bug fixes, and small improvements as real usage reveals what the spec missed. Cloud hosting for a typical business application adds $50 to $300 a month on top. Skipping maintenance does not save the money; in Digital Heroes rescue work, unmaintained systems typically need a far more expensive rebuild within about three years.
We run multiple restaurant locations on Toast. Would switching to a custom POS actually save money?
Usually only at 8 or more locations, where per-terminal software fees, add-on modules like online ordering and loyalty, and processing markup commonly total $8,000 to $20,000 per location per year in the statements Digital Heroes reviews for restaurant groups. A custom system converts that into a one-time build of $100,000 to $250,000 plus maintenance, which models out to 18 to 30 month payback for most groups. Under five locations, stay on Toast and put the money into operations.
Can I build my product on a no-code tool like Bubble instead of hiring developers?
For testing whether anyone wants the product, yes, and Bubble's paid plans start at $29 a month, which is the cheapest validation you will ever buy. The ceiling arrives with complex data relationships, heavy integrations, performance at a few thousand users, and the fact that you cannot export a Bubble app to servers you control. A path many Digital Heroes clients take: prove demand on no-code, then rebuild custom once revenue justifies it, treating the no-code version as a paid prototype rather than a foundation.
Can a custom POS beat Square's 2.6% plus 10 cents processing rate?
Yes, because a custom POS lets you choose interchange-plus processing instead of flat-rate pricing, which in the client migrations Digital Heroes has run commonly lands near 2 percent all-in on card-present volume for established businesses. On $1.5 million of annual card volume, each half point saved is worth $7,500 a year before you count software fees. Below about $250,000 in annual card volume the savings rarely justify the build, so run the math on your processing statements first.
How long does it take to build a custom web or mobile app from scratch?
Plan on 8 to 16 weeks for a focused first version and 4 to 9 months for a larger platform, which is the typical spread across Digital Heroes builds. The first 2 to 3 weeks go to discovery and design before any production code ships. The two things that stretch timelines most are integrations with legacy systems and slow feedback from your side, not developer speed.
Keep reading
let's build

Build something worth launching.

A plan, a team, a timeline, within 24 hours. No decks, no discovery calls. Tell us what you're building and we'll come back with a real scope and a real number.

message us directly · we reply within one business day

mission briefing

Monthly dispatch

Playbooks, real build costs, and what we're shipping. One email a month. No fluff.

visit us

New York HQ

1140 Broadway, Suite 704 · New York, NY 10001

Get directions
Online now

Hey there 👋 How can we help you today?