Learn how to configure and use the Utah Inventory Control System (ICS) integration in Dutchie POS, covering products, inventory, transfers, patient lookups, sales, and deliveries.
Overview
The Utah Inventory Control System (ICS) is the state's traceability system for medical cannabis. When the integration is enabled, Dutchie POS sends the following to Utah ICS:
- Products
- Rooms and buildings
- Inventory movements
- Sales
- Deliveries
Dutchie POS also reads the following from Utah ICS:
- Incoming transfers
- Lab results
- Patient eligibility
- Remaining patient allotments
Every action described in this guide happens in Dutchie POS as normal. The integration communicates with ICS in the background. If ICS rejects an action, the error appears in Dutchie POS and the action does not complete, or it is flagged for retry. Dutchie syncs inventory from ICS roughly every 15 minutes in the background.
Before you begin
Review and and update your staff's user permissions. Inventory managers and/or admins should have the following permissions:
- View Utah ICS Integration Configuration
- Edit Utah ICS Integration Configuration
- Destroy Inventory
Before you start, gather the following from Utah ICS:
- Your Source System code
- A Client ID and Client Secret for API access
- The correct Environment, either testing or production.
Familiarize yourself with these terms:
| Term | Meaning |
|---|---|
| ICS Package ID | Utah's ID for a package. Dutchie POS stores it as the External package ID |
| Source System | The code Utah assigns to your facility. It is sent with every request. |
| Waste package | A separate ICS package that holds product waiting to be destroyed. |
Configure the Utah ICS integration
Enable the integration
- Go to Settings > Integrations > Utah ICS. Contact Dutchie Support if you do not see Utah ICS here.
- On the Settings tab, turn on Enabled.
- Choose the Environment: PROD (production).
- Enter Source System, Client Id, and Client Secret you obtained from Utah ICS. All three fields are required.
- Click Save.
Set a building for every room
Utah ICS identifies a location by building and room.
- Go to Settings > Rooms.
- Open each room and make sure the Building name field is filled in.
- Save.
When you save a room, Dutchie finds or creates the matching building and room in ICS. A building or room name that doesn't match ICS exactly causes a "Location details are invalid" error when receiving a transfer.
Create and manage products
- Go to Products and create or open a product.
- For a cannabis product, set Cannabis product to Yes.
-
Fill in the following fields:
Field Options External category - Bulk Concentrate
- Cartridge
- Concentrated Inhalation Form
- Finished Flower
- Flower Byproduct
- Harvested Flower
- Oral Preparation
- Plant
- Topical Preparation
- Suppository
External subcategory Examples include:
- Finished Flower
- Gummies
- Distillate
- Tincture
- Capsules/Pills
- Lotion
- Trim
Unit of measure - each
- mg
- g
- kg
- oz
- lb
- mL
- L
- fl oz
- gal
- pt
- qt
- tsp
- tbsp
Strain Enter the strain name, if applicable. - Save.
Both External category and External subcategory fields are required for cannabis products. If you don't see these fields, go to Products > Configure > Fields and make sure they are set to Required if Cannabis.
Non-cannabis products are not sent to ICS.
What happens when you save a product
- If ICS has no product with that name, Dutchie creates one.
- If ICS already has a product with that name, Dutchie links to it.
- If the existing ICS product has a different category, sub category, or unit, Dutchie shows an error and does not link the product. Rename the product, or correct the category or unit so they match ICS.
- The ICS record ID is saved on the product.
The product name is the key Dutchie uses to match to ICS. Renaming a product after it's linked creates a new product in ICS.
Manage inventory
Package (sublot) inventory
Use packaging to split a parent package into smaller, sellable packages.
- Open the package in Products > Inventory and choose Packaging.
- Choose the package sizes and quantities. Allowed sizes come from ICS.
- Complete packaging.
Dutchie starts and completes packaging in ICS. ICS returns new package IDs, and Dutchie then creates the new packages and takes the used amount from the parent. If packaging was already started in ICS, Dutchie continues rather than failing.
Harvest and cultivation packaging flows also report to ICS.
Adjust inventory
- Open the package and choose Adjust.
- Choose an adjustment reason and add a note.
The adjustment reasons sent to ICS are Lost/Stolen, Recall, Allocate Waste, Drying Loss, Other, Testing, R&D, Reconciliation, Storing, Selling, and Moving. Dutchie sends ICS the new total quantity for the package.
Destroy inventory
Utah ICS handles destruction in two steps, and you can destroy part of a package.
Step 1: Schedule the destruction
- Open the package and choose Destroy.
- Enter the Quantity to destroy. It cannot exceed the quantity available.
- Choose an Adjustment reason.
- Enter a Destruction reason. This is required.
- Confirm.
Dutchie creates a waste package in ICS marked Ready for destruction, and reduces the parent package by the same amount.
Step 2: Confirm the destruction
- Go to Settings > Integrations > Utah ICS > Inventory Destructions.
- Find the pending item. The columns show the product, waste package, the package it was destroyed from, quantity, adjustment reason, and destruction reason.
- Click Mark destroyed once the product has been physically destroyed.
ICS then shows the waste package as Destroyed. Marking an item as destroyed again has no effect.
If a destruction is pending but has no ICS waste package ID, Dutchie can't mark it destroyed. Contact Dutchie Support in that case.
Lab results
Lab results for received packages, including THC, THCA, CBD, CBN, CBG, CBC, COA link, and test date, are pulled from ICS when a transfer is received, and saved to the batch. If a package has no lab data, the lab result import for that package is skipped and an error is recorded.
Transfers: approve and receive inventory from another facility
Incoming transfers are created in ICS by the sending facility. A transfer must be approved by the receiver before it goes out for delivery.
Approve the transfer
- Go to Products > Inventory > Receive.
- Set Source to Transfer awaiting approval.
- Choose the transfer. It was sent in ICS with the status Ready for Review.
- Review the items and packages.
- Click Approve Transfer.
Dutchie creates a purchase order in ICS, and the sender can then send the transfer.
Every product on the transfer must already exist in your Product Catalog. If one doesn't, Dutchie lists the missing product names. Create those products (see "Create and manage products" above), then try again.
Receive the transfer
- Go to Products > Inventory > Receive.
- Choose the pending transfer. The transfers shown are those with the status Out for Delivery addressed to your Source System. This list refreshes roughly every two minutes.
- Match each item to a Dutchie product. Dutchie suggests a match based on the product name.
- Choose the room (and building) for each package. They must match a room set up in ICS.
- Click Receive.
Dutchie receives each package in ICS and imports lab results. If receiving stops partway through, run Receive again. Packages that were already received are skipped.
Possible transfer errors
| Message | Fix |
|---|---|
| Location details are invalid | The building or room name doesn't match ICS. Fix it in Settings > Rooms. |
| A batch with this ID already exists | A batch with that ID already exists in the ICS Portal. Check ICS. |
| No Package ID of the inventory items matches | The selected items aren't on that ICS transfer. |
Look up a patient
The lookup runs automatically for Medical customers when you check them in or load their cart.
Before you start, the customer needs their State ID (MMJ card number) and date of birth in their profile. A caregiver needs a state registration number and a date of birth.
What Dutchie checks in ICS
- The patient is 18 or older.
- The medical card is Active.
- The card is in effect today and has not expired.
- For a caregiver sale, the caregiver is on the patient's approved caregiver list in ICS. The caregiver must also be 18 or older, with an active card that is in effect.
If any check fails, Dutchie shows the reason and blocks the sale. Examples include "medical card expired on …" and "caregiver could not be matched."
What staff see
A prescription panel shows:
- Prescriber name
- Card expiration
- Directions of use
- Total flower and composite dosage in grams
- Whether substitution is allowed
- Whether limits can be overridden
- Any restricted dosage forms
Allotments
Dutchie shows the patient's remaining Flower and Composite allotment in grams, and how much is currently in the cart.
- Flower is counted by weight.
- Composite products are counted by THC content. Where ICS has a medicated net weight, that value is used; otherwise, the batch lab data is used.
- If a product has no batch or lab data, an allotment error appears and the item can't be checked out.
- At checkout, a cart that exceeds the total, flower, or composite limit is blocked. The message shows by how many grams the cart is over.
Patient data is saved for the transaction and reused for an hour, so repeated cart changes don't call ICS every time.
Complete a sale (in-store or pickup)
- Check in the patient and build the cart with ICS-tracked packages.
- Resolve any allotment warnings.
- Check out and take payment as usual.
When the sale completes, Dutchie creates a Completed sales order in ICS, including:
- Patient number and caregiver number, if any
- Date
- Each package with quantity, price, and room/building
- Payment records
Fulfillment is sent as Store, Pickup, or Delivery. Prices sent are after discounts, and after tax if tax-inclusive pricing is on. Several lines for the same package are combined into one.
Payment types: ICS accepts Cash, Check, Credit, and Debit. Dutchie maps gift, manual, electronic, and prepayment tenders to Cash so totals still match. The register is reported as "Safe," and the cashier's login email is included.
If posting fails, the sale is recorded as Failed for ICS and retried in the background.
Returns and voids
Returns of cannabis items:
- If you process a return and choose to return the item to inventory when prompted, Dutchie creates a purchase order against the original ICS sales order. Returned inventory should then be destroyed.
- If you choose not to return the item to inventory (i.e., you refund a customer even though they have not brought the item back), the return is not reported to ICS.
- See Process returns and exchanges in Dutchie POS for more information.
Void or cancel a sale: the ICS sales order is set to Cancelled.
Complete a delivery
Deliveries use an ICS sales order plus an ICS transfer. The transfer moves through Open > Out for Delivery > Completed.
Before you begin
For each delivery, make sure the following are filled in:
- Driver license number
- Vehicle license plate
- Route details (directions)
- Departure and arrival times
- The patient's State ID
If any of these are missing, Dutchie lists what's missing and doesn't continue.
Steps
- Create the delivery order in the register with the patient and products.
- Mark the order ready for delivery. Dutchie creates an In Progress sales order and an Open transfer in ICS, and the order is locked.
- Start the route (depart). Dutchie updates each order's transfer to Out for Delivery. If an order has no ICS delivery record, an error appears for that order, but the rest still go out.
- Complete the delivery once the patient has received it. Dutchie updates the transfer to Completed. If this fails, "Error marking delivery completed" appears. Retry the action.
- Cancel if the delivery doesn't happen. The transfer and linked sales order are cancelled in ICS.
Troubleshooting
| Symptom | Likely cause |
|---|---|
| Utah ICS page is missing | Integration is not enabled for the location (contact Dutchie Support to enable), or missing permission (check the user's permissions under Settings > Users) |
| Cannot save a cannabis product | Missing External Category or Subcategory |
| "already exists in Utah ICS with a different category…" | Product name matches an ICS product with different settings |
| Cannot save room | Building name missing |
| Patient blocked at check-in | Card not active, not yet in effect, expired, or birth date missing |
| Allotment error on an item | Item has no ICS package data, batch, or lab data |
| Receive fails with location error | Building/room names don't match ICS |
| Transfer not listed | Not yet approved, not Out for Delivery, or addressed to a different Source System |
| Delivery cannot start | Missing driver, plate, route, times, or State ID |
For anything else, contact Dutchie Support with the transaction ID or package ID and the exact message shown.