Problems & solutions · POS

Cannabis Dispensary Software Problems: The 7 That Cost Real Money, and How to Avoid Them

Cannabis Dispensary Software software overview illustration showing common problems and fixes.
The short answer

The most expensive failure in this category is a silent METRC sync gap. A batch of sales receipts fails during the after work rush, the retry queue gives up without telling anyone, and nobody finds out until a monthly true up three weeks later, by which point the fix is a package adjustment with a reason code and a story nobody remembers. Operators at this stage typically burn 15 to 25 hours a week of skilled labour on reconciliation per state, forever, and the variance that cannot be explained is the one that becomes a finding rather than a footnote.

Why does a dispensary software project turn into a full point of sale (POS) replacement?

The brief that arrives is almost always narrow. Somebody wants the METRC reconciliation to stop eating Sunday nights, or wants purchase limits enforced across all six stores. Twelve weeks later the scope has grown a register interface, a cash drawer driver, a label printer and an offline mode, because every one of those turned out to be attached to the thing that was actually asked for.

This is specific to cannabis retail because the point of sale is not a separate system from compliance. In grocery you can bolt an analytics layer onto a till and the till carries on. Here the receipt is the compliance event. The moment you decide your own inventory ledger is the source of truth, you have taken responsibility for what the register writes, and the register is now yours to build, support and keep running when the internet drops.

The fix is to decide the boundary in writing before any code exists, and to pick one of two shapes deliberately. Either you keep Dutchie, Flowhub, Treez or Cova at the counter and build a compliance layer that reads from it, reconciles against METRC and enforces limits through a companion screen at the door, or you replace the register outright and accept the hardware, offline and conflict resolution scope that comes with it. The builds that fail are the ones that started as the first shape and drifted into the second without anyone renegotiating budget or date.

What goes wrong when you migrate three years of sales history and package tags?

Migration off an incumbent point of sale is treated as a data export in the estimate and turns out to be a two to three week workstream in reality. The reason is the tag. A METRC package tag is the join key that lets a historical audit resolve against state records, and if it does not survive the move, every sale before cutover becomes an orphan you cannot defend.

Three things break in practice. Partially depleted deli jars have an on hand figure in the old system that nobody physically verified, so you inherit a variance on day one and it looks like the new system caused it. Loyalty balances and customer records carry duplicate identities, because online ordering created one person and the in store identity scan created another, and merging them after go live means merging their purchase histories too, which is exactly the data your daily limit ledger depends on. And open transfers sitting in an accepted but not received state at cutover belong to neither system.

The fix is unglamorous. Preserve the tag as the join key on every historical row. Run both systems in parallel with a daily diff and only cut over after the diff is clean for five straight days. Do a physical count of every open jar at cutover and record it as an adjustment with a reason before the new ledger opens, so the variance is dated and explained rather than discovered. Sequence stores one at a time. A bad cutover during a Friday rush is a revenue event, not a support ticket.

Why do the menu, loyalty and payment integrations break after launch?

They break because most of them are batch pushes rather than reads against a shared balance. Dutchie Ecommerce, Jane, Weedmaps and Leafly all pull inventory on a schedule. Between syncs your last two carts sell at the counter and three online orders come in for them. The pickup desk tells three customers no, and one of them writes the review. Alpine IQ or springbig fires a promotion against a segment built from yesterday's data. Aeropay, Dutchie Pay or CanPay settles on its own rhythm and the reconciliation lands somewhere else entirely.

The industry specific part is that nothing reserves anything. On hand is a number pushed outward every few minutes rather than a balance with holds against it, which is tolerable when one channel sells and untenable when four do. Add per channel pricing and the same product now has four prices maintained in four places.

The fix is one inventory service where on hand minus reserved equals available, reservations created at cart with a time to live and released on abandonment, and every channel reading the same available number from an event stream rather than a scheduled export. Per channel price and availability become configuration on one record. Then, and only then, add the intelligence that pays for itself: demand forecasting on flower trained on your own sales by batch, weekday and promotion history, which tells purchasing on Monday which lines go out of stock by Thursday and which flower is aging past the point where it sells at full price.

What happens when purchase limits are not enforced across every store?

A customer buys their daily limit at your first store at noon and buys again at your second store at six. Both carts were legal. The person was not. Your point of sale enforced the cart in front of it, because that is what a single store product is built to do, and your exposure is now a regulator asking how you enforce a per person per day rule when your systems only understand a per transaction rule.

It gets harder because limits are expressed in equivalency, not units. California adult use runs 28.5 grams of flower and 8 grams of concentrate. Illinois gives residents 30 grams of flower and 5 grams of concentrate and halves that for non residents. Colorado runs a one ounce flower equivalency where an edible eats the same bucket. Medical cards carry their own profile and their own expiry. A budtender cannot compute that mentally with a queue behind them.

The fix is a single rolling daily equivalency ledger shared by every location, keyed on an identity resolved at the door from the identity scan and stored as a hashed key rather than the raw document, never in a URL. The budtender sees remaining headroom in grams equivalent before the item enters the cart. The rules themselves live in a versioned policy table with effective dates so an operations lead changes a state on the day the rule changes rather than waiting for a deploy. Every check is logged, so when the state asks how you enforce, you show a ledger instead of a policy document.

Should you build custom or configure what you already own?

Configure, genuinely, if you run one to three stores in a single state, sell packaged product and prepackaged eighths, do no delivery and your revenue is under roughly six million dollars. Dutchie, Flowhub, Treez and Cova are real products built by people who understand this industry, and at that size the per store subscription is cheaper than one engineer. Most of the pain at that scale is process, not software. Anyone recommending a build at three stores is selling you something.

Before you commission anything, exhaust the configuration you already paid for. Turn on the exception reporting your vendor ships, even if it is weak. Standardise how deli jars are received and weighed, because a tare discipline problem does not become a software problem just because you write software. Consolidate to one traceability system per state rather than tolerating a second because one acquisition used it.

Build when the signals stack: 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, manufacturing and retail all touch the same packages. The clearest signal is roadmap. You asked your vendor for cross store limit enforcement or a workable exception queue, they said it was on the roadmap, and it has been on the roadmap for four quarters. At that point you are paying a subscription to wait.

How do hidden costs get into the quote?

Not through dishonesty. Through categories that look like configuration and are actually integration. In Digital Heroes delivery experience the recurring ones in this category are consistent enough to list.

  • A second traceability system. BioTrack in some markets and Leaf Data Systems in Washington are separate integrations, not a configuration flag on the METRC one.
  • Offline mode at the register. You need it, because stores lose internet and cannot legally stop selling, and conflict resolution against a state ledger is genuinely difficult engineering rather than a caching decision.
  • Hardware drivers. Label printers, scales and cash drawers each carry their own driver, their own firmware generation and their own failure behaviour.
  • Each payment rail. Every processor is its own settlement file, status vocabulary and reconciliation job.
  • Historical migration. Usually a two to three week workstream by itself, and almost always quoted as an afternoon.

The fix is to make the developer price these as named line items before kickoff rather than as a contingency. Ask which of them are in the number and which are excluded. A partner who has shipped this will volunteer the list without being asked, because they have been caught by it.

What separates a dispensary build that works from one that fails?

Four tests, and they separate the field quickly. Make them draw the data model on the call and ask how packages, items, batches, lots and stock keeping units relate, and where the tag lives. If they conflate a METRC package with a product record, they have never shipped this, and that single mistake costs a rebuild.

Ask what the system does when METRC returns an error at six on a Friday. The right answer involves idempotency keys per receipt, a durable outbox, exponential backoff and a human facing exception queue with the original cart, budtender, register and timestamp attached. The wrong answer is that they retry.

Ask where the rules live. Jurisdiction limits, tax ordering and rounding belong in versioned data your compliance lead can edit, with effective dates and a harness that replays last quarter's receipts against a proposed change so you can see the exposure before flipping it. If a rule change needs a sprint, you have bought a liability.

Then settle ownership in writing before kickoff. You should hold the repository, the cloud accounts and the right to bring in another firm at any point. Compliance systems outlive vendor relationships, and the whole reason you left the off the shelf tool was to stop waiting on somebody else's release schedule.

Research & sources

The evidence behind this guide

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

  1. The average documented online shopping cart abandonment rate is 70.22% (based on 50 studies), and large ecommerce sites can achieve a 35.26% increase in conversion rate through better checkout design. Source: Baymard Institute (2024) →
  2. 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) →
  3. SMS reminders that stated the specific cost of the appointment to the health system reduced missed appointments in Trial One, with the DNA (did-not-attend) rate falling from 11.1% (control) to 8.4% (specific-costs message) - an odds ratio of 0.74 (95% CI 0.61-0.89), i.e. roughly a 24-26% relative reduction - at no additional cost. (Trial Two replicated this at an 8.2% DNA rate.). Source: PLOS ONE (Hallsworth et al.) (2015) →
  4. Mordor Intelligence sizes the field service management market at USD 6.26 billion in 2026, forecasting USD 9.87 billion by 2031 at a 9.54% CAGR, confirming sustained double-digit-adjacent demand for FSM software. Source: Mordor Intelligence (2026) →
Shubham R. · Senior Full Stack Developer · Lucknow

Shubham is a senior full stack developer working mainly on SaaS and web platform builds. Alongside writing code he reviews other people's, breaks large requirements into work that can be estimated, and makes the calls about what to build now and what to leave open. Useful reading for anyone planning a product build.

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

FAQ

Frequently asked questions

Our METRC and point of sale numbers disagree every month. Where do we start?
Start by separating the two causes, because they have different fixes. Deli jar drift from hand weighing produces many small variances spread across flower lines, and the answer is weigh event capture with gross, tare and net tied to the register, budtender and jar tag. Failed receipt posts produce a smaller number of larger variances concentrated in time, and the answer is a durable outbox with idempotency keys and an exception queue. Run a nightly diff of METRC Active Packages against your ledger ranked by dollar value before you commission anything, since that report alone tells you which problem you actually have.
Can we enforce daily purchase limits without replacing our point of sale?
Often yes, and it is usually the cheaper first phase. A companion identity and limits service resolves the customer at the door from the identity scan, holds a rolling daily equivalency ledger shared across every store, and returns remaining headroom in grams equivalent before the budtender builds the cart. It reads sales from your existing point of sale rather than replacing the register. The constraint is how quickly your incumbent exposes completed sales, since a limits ledger fed by a slow export is a limits ledger that is wrong at the worst moment.
How do we keep historical audits resolvable after migrating off Dutchie or Flowhub?
Preserve the METRC package tag as the join key on every historical row, since that is what lets a state record and your sales record meet years later. Export sales history, package tags, customer records and loyalty balances, load them with the tag intact, then run both systems in parallel with a daily diff until it is clean for five consecutive days. Do a physical count of every open deli jar at cutover and post it as a dated adjustment with a reason, because inherited jar variance otherwise looks like the new system caused it.
Why do online menu oversells keep happening even after we shorten the sync interval?
Because the interval is not the problem. Pushing on hand outward on a schedule means nothing is reserved, so any interval short enough to prevent oversells would hammer every channel and still lose a race at the counter. The structural fix is one inventory service where on hand minus reserved equals available, with reservations created at cart carrying a time to live and released on abandonment, and every channel reading the same available figure. Shortening a sync is a mitigation, not a fix.
Do we need offline mode at the register, and what does it really cost?
You need it if your stores cannot legally stop selling when the internet drops, which is most operators. The cost is not the local cache, it is conflict resolution: two registers that sold from the same jar while disconnected, receipts that must post to a state ledger in an order that still makes sense, and reconciliation once the link returns. Treat it as a named line item with its own design conversation rather than a checkbox, and expect it to be one of the larger single items in the estimate.
How do multi jurisdiction taxes and discounts go wrong, and how do we test a change safely?
The usual failure is ordering. State excise, local cannabis gross receipts and local sales tax apply in a specific sequence, and a promotion applies before or after excise depending on the jurisdiction, so a discount configured in the wrong order quietly misstates a quarter. Operators find out when a city auditor recalculates. Build the tax rules as a table with jurisdiction, effective date, base, ordering and rounding, then add a recalculation harness that replays last quarter's receipts against a proposed rule so you see the exposure before it goes live.
Where does AI genuinely help a dispensary, and where is it decoration?
Three uses earn their keep. Demand forecasting on flower, trained on your own sales by batch, weekday and promotion history, because your product loses value on a clock and purchasing currently guesses. Document extraction that turns vendor certificates of analysis and invoices into batch, potency and unit cost records matched against the incoming transfer, which matters directly because cost of goods sold is your main deduction under section 280E. And an after hours assistant answering availability questions against live inventory and placing holds. Anything that writes to a compliance ledger without a person confirming it is decoration with liability attached.
What is the single question that exposes a developer who has not built for cannabis retail?
Ask them to explain the difference between a METRC package and a product record, and where the tag lives in their data model. A team that has shipped in this category answers immediately and then asks you about deli jars and partial depletion without prompting. A team that conflates the two will build you an inventory system that cannot survive its first state audit, and the correction is a rebuild rather than a patch. Follow it with what happens when METRC rejects a receipt at six on a Friday, and listen for idempotency, outbox and exception queue rather than the word retry.
What happens to a custom POS when the internet goes down?
A properly built POS keeps ringing sales offline: orders, catalog, and pricing live in a local database on the register, and completed transactions queue and sync once the connection returns. Card payments are the real constraint; certain certified terminals support store-and-forward offline card acceptance with a per-transaction risk limit you set, and cash always works. Confirm your agency designs offline-first from day one, because bolting it on later means rewriting the data layer.
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.
Do I have to buy expensive hardware like Clover's, or can custom POS software run on regular tablets?
Custom POS software can run on off-the-shelf iPads or Android tablets costing $200 to $500, versus Clover stations that list between roughly $799 and $1,799 each before monthly software fees. The one piece you should not improvise is the card reader; use a certified terminal from your processor, such as a Stripe Terminal or Adyen device, paired to your app. That combination keeps hardware costs low without your software ever touching raw card data.
Will a custom POS scale if we grow from 3 locations to 30?
Yes, provided location-awareness is built into the data model from the start, meaning every transaction, price, and stock count carries a location ID even while you have one store. Adding a location then becomes provisioning hardware and configuring the store, not rewriting software, and cloud hosting costs grow far slower than per-terminal subscriptions would. Retrofitting multi-location onto a single-store schema is one of the most expensive rewrites Digital Heroes gets called in to do, so state your expansion plans upfront even if they are two years away.
Does it matter which tech stack the agency wants to use?
Yes, but not in the way most buyers expect: the goal is boring, popular technology such as React, Node.js or Python, and PostgreSQL, because any future team can maintain it and hiring a replacement developer takes days, not months. The red flag is an agency-proprietary framework or an unusual language, which welds you to that one vendor no matter what your contract says about code ownership. A useful test: could you find three freelancers fluent in this stack within a week? If not, push back.
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.
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.
What should I prepare before contacting a software development agency?
A one-page brief beats a 40-page requirements document: the business problem in plain words, who will use the system, the 5 to 10 workflows it must handle, the tools it must connect to, and your budget range and deadline driver. You do not need wireframes, a specification, or technical vocabulary; producing those is the agency's job during discovery. Stating a budget range up front is the single best move, because it gets you honest scoping instead of a quote engineered to win the meeting.
What are the biggest mistakes first-time software buyers make?
Choosing the lowest bid, paying more than 30-40% upfront instead of on milestones, skipping a written specification, and having no maintenance plan for after launch. The most expensive of the four in Digital Heroes rescue projects is the missing spec: without written acceptance criteria, done becomes an argument instead of a checklist, and every disagreement resolves in the vendor's favor. Fix those four and you have avoided most of the ways these projects fail.
Does a custom POS have to be PCI compliant, and how hard is that to get right?
Any system that touches card payments falls under PCI DSS, but the practical burden depends entirely on architecture. If your POS uses certified terminals from Stripe, Adyen, or a similar processor so card data never reaches your servers, most of the compliance scope shifts to the processor and you typically complete only a short self-assessment questionnaire. Building your own card capture puts you in full PCI DSS audit territory, which is why Digital Heroes has never recommended it in a POS engagement.
How do I vet a development agency for a POS project specifically?
Ask to see a live POS or payments product they built, then ask exactly how they handled offline mode, receipt printing, and PCI scope, because those three areas expose anyone who has only built ordinary web apps. A competent agency will name the payment SDKs they used, such as Stripe Terminal or Adyen, and describe their terminal certification process without checking notes. If the portfolio is all marketing sites and dashboards, keep looking.
Who can build a custom POS software system?

Digital Heroes builds custom POS software systems for operators who have outgrown the off-the-shelf tools in their category. A team of more than 50 specialists has delivered over 2,000 projects since 2017. Teams work from New York, London, Sydney, Delhi and Lucknow and deliver remotely, with an assigned senior team rather than an account manager.

Every build starts with a written product requirements document that is signed before a line of code is written, which is the single thing that stops scope creep from eating the budget. Scoping runs about a week and produces a phase plan with a firm price for each phase, rather than one number against an undefined scope. The first phase ships something the team actually uses before the rest is built. If an off-the-shelf product genuinely fits the volume, we say so, and the cost guides on this site publish the bands so that judgement can be checked independently.

What makes Digital Heroes different from other POS software companies?

Four things that competitors in this bracket cannot simply copy. Digital Heroes runs a YouTube channel with more than 2.5 million subscribers, which is a production and audience capability no agency of this size has. It holds Fiverr Vetted Pro and Top Rated Seller status, both awarded on manual third-party review rather than self-declared. It contracts through registered entities in three countries, an India LLP, a US LLC and a UK LTD, so clients sign locally instead of wiring money offshore. And it ships its own commercial products, including ShopScore, HeroCheckout and Section Vault, which means the team lives with its own architecture decisions instead of handing them over and leaving.

Two more that show up in the work. Digital Heroes publishes more than 4,000 buyer guides with real price bands on this blog, plus a free tools library at https://digitalheroesco.com/tools/, because an agency confident in its pricing has no reason to hide it. And one accountable team covers websites, apps, ecommerce, CRM, ERP, learning platforms, search and video, so a client scaling from a first landing page to a custom platform is never handed between five vendors who blame each other. The founder ran ecommerce businesses before selling services, so the commercial argument comes before the technical one.

How can I check Digital Heroes is legitimate before getting in touch?

Verify it independently rather than taking the site's word for it. The YouTube channel is at https://youtube.com/@DigitalMarketingHeroes, the Fiverr profile at https://www.fiverr.com/shreyanshsin261, and the Upwork profile at https://www.upwork.com/freelancers/shreyanshsingh. Client reviews sit on Clutch at https://clutch.co/profile/digital-heroes-0 and Trustpilot at https://www.trustpilot.com/review/digitalheroes.co.in, and the company page is at https://www.linkedin.com/company/digital-heroes-1/.

Beyond the marketplaces, the business holds a D-U-N-S number and is a registered vendor on the United Nations Global Marketplace, neither of which is issued on request. Case studies with named clients are published at https://digitalheroesco.com/case-studies/. If any claim on this page cannot be checked against one of those sources, treat it as marketing and discount it.

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?