RxQuorum
Draft

RxQuorum manual

How the pharmacy workflow runs in RxQuorum, from dispensing to delivery.

Getting started

RxQuorum has three stations that share one record. Each has its own screen, and an order moves through them in turn.

  1. Dispensing. Staff enter the order and fill the prescription. Patient, prescription, and program details travel with it.
  2. Order Verification. The pharmacist reviews the dispense before it moves on. They can verify it, or reject it.
  3. Packing / Shipping. The verified order is packed, documented, and shipped or picked up.

A fill can be cancelled or rejected at any point before it ships. Administration (printers, programs, clinical assessments, integrations) is done in the web application.

Clinical assessments

Clinical assessments are questions staff answer when a fill is for certain drugs, for example the data a REMS program asks for. The same feature works for any program or protocol that needs clinical questions answered on each fill.

Answering an assessment

The Dispensing and Order Verification fill screens show an assessment panel for each fill that has one.

  1. Open the fill. Each assessment shows its questions and any answers saved so far.
  2. Answer the questions. Some are asked only when an earlier answer calls for them. Required questions must be answered.
  3. Save to keep your work, or complete the assessment once every asked and required question has an answer.

A completed assessment is locked. A pharmacist or administrator can reopen it and must enter a reason. The earlier values are kept in the history.

How an assessment holds a fill

Each assessment has a setting, Fill cannot go past:

SettingEffect
NoneAnswers are collected, and nothing is blocked.
DispenseThe fill cannot be marked Dispensed until the assessment is complete.
VerifyThe fill cannot be marked Verified until the assessment is complete.
ShipThe fill cannot be marked Shipped or Picked up until the assessment is complete.

An earlier gate also blocks every later step. Reopening a completed assessment blocks the fill again. Cancelling or rejecting a fill is never blocked.

A Ship-gated assessment is completed on the Dispensing or Order Verification screen. It cannot be completed from Packing / Shipping.

Setting up assessments (administrators)

Go to Administration > Clinical assessments.

  • NDC groups. A list of NDCs (11 digits; dashes are fine when typing). A group can be for one pharmacy or for every pharmacy. You can list a program's NDCs before the drugs are in the drug file.
  • Assessments. Each belongs to one NDC group and has a name, an optional program name, instructions, and the Fill cannot go past setting. An assessment applies to a fill when it is active, its group is active, it is for the fill's pharmacy, and the NDC dispensed is in the group.
  • Questions. Types are Text, Number, Date, Yes/No, and Choice. Each can be required, have limits (text length, number range), and be shown only when an earlier question has a given answer.

Questions are never deleted. Leaving one out when you save makes it inactive. Answers keep the question wording and type as it was asked, so records stay readable if the assessment is edited later.

A pharmacy administrator can add groups and assessments for their own pharmacy only. Items for every pharmacy need an administrator who is not tied to one pharmacy.

Good to know

  • Reports and exports of responses, and submission to a REMS administrator, are not available yet. Each response is stored with the patient, NDC, fill, and who completed it.
  • An answer cannot hold a fill on its own (for example "not eligible"). Today a gate is only complete or not complete.

Programs

Specialty and free-goods pharmacies work with manufacturer and patient-support programs. Programs are available for pharmacy types that have the feature turned on.

What you can set up

  • Programs. Each pharmacy keeps its own list, with a code, name, and description. A program covers the NDCs in an NDC group. Administrators manage them in Administration > Programs.
  • Dispense types. Quick Start, Bridge, PAP, and Replacement are provided. Administrators can add more or switch them off.
  • Enrollments. On the patient record, the Programs panel lets staff enroll a patient, change the hub patient ID and dates, or remove an enrollment. An empty end date means no end date. A patient cannot be enrolled in the same program for overlapping dates.

A program's NDC group cannot be changed once patients are enrolled.

On an order

The New order screen and the order's Delivery editor have a Program section.

  • At a program pharmacy, a dispense type is required. Other pharmacies take no dispense type, program, or hub order ID.
  • A program is optional. When you choose one, the patient must be enrolled on the order date, the program must be active at the pharmacy, and at least one prescription on the order must be for an NDC in the program's group.
  • The hub order / case ID is kept only when a program is set.
  • A program already on the order is not checked again later, so an enrollment that has since ended does not block editing the order.

Packing and shipping

Packing documents

On Packing / Shipping, each order has Print packing documents. One PDF is built and sent to the pharmacy's document printer, in this order:

  1. Packing slip. Pharmacy, ship-to, shipment details (carrier, tracking, dates), the program line (dispense type, program, hub order or case), COLD PACK and SIGNATURE REQUIRED flags, delivery instructions, and the contents.
  2. Medication literature cover page. A thank-you, the pharmacy and emergency phone lines, and the list of guides enclosed. Included only when at least one drug has a stored Medication Guide.
  3. Medication Guides. Each distinct guide once, even when several drugs share it.

If a drug needs a guide that is not stored, the screen warns the packer and names the drug.

Every set is stored exactly as printed and cannot be changed. The order card lists stored copies with View and Reprint, and a reprint is identical to the original. Shipped orders keep a Documents button for reprints. Orders for pickup, cancelled orders, and orders without a complete address cannot have documents printed.

Shipping with FedEx

FedEx is the first supported carrier. When it is configured for your pharmacy, Ship order works like this:

  1. Pack the order. That creates the shipment.
  2. Enter each box: weight (lb) and size (in). Choose the signature level and ship date, then Get rates.
  3. Pick a service and Buy label. The tracking number, cost, and expected delivery appear.
  4. Print label sends it to the label printer. Download label saves the file. Void label cancels it with FedEx, and is available only while the shipment is still Packed.
  5. Ship moves the fills to Shipped, using the bought label's carrier and tracking number.

In the Shipped list, Tracking shows FedEx scans. RxQuorum also checks FedEx every 30 minutes for shipments shipped in the last 45 days and moves them to Delivered or Returned on its own.

If FedEx is not configured, or you choose Ship another way, you enter the carrier and tracking number by hand.

Rules RxQuorum applies

  • A shipment with a controlled substance, or one marked as requiring a signature, gets an Adult signature. A weaker choice is refused.
  • The label carries the order number as the customer reference. No patient information is sent as a reference.
  • The shipper is the pharmacy record, which needs a full address and a phone number with at least 10 digits.
  • The label is bought first, then everything is saved together. If saving fails, the label is voided.

Good to know: a downloaded PDF label cannot be printed from the server, only a ZPL label can. There is no FedEx address validation yet.

Administration

Printing

Go to Administration > Printing.

  • Label printers use ZPL over the network (port 9100). Choose the shipping label printer here.
  • Document printers print PDFs over IPP (port 631, default path /ipp/print). Most current network laser printers support this. If yours uses another path, set the IPP path. The printer must be reachable from the RxQuorum server.
  • Use Test page to check a printer. The Packing documents card sets the printer and number of copies.

For packing documents RxQuorum uses the printer you ask for, then the pharmacy's configured packing-documents printer, then its default active document printer. Label printers are never used for documents, and document printers are never used for labels. Every print is logged, whether it succeeded or failed.

Other settings

Programs and clinical assessments are set up under Administration > Programs and Administration > Clinical assessments, described in their chapters above. Webhooks are under Administration > Integrations.

Events and webhooks

RxQuorum records what happens in the pharmacy as events and can notify your partners' systems with signed webhooks. An event is saved in the same step as the change it describes, so it is never lost and never describes something that was rolled back.

Event types

TypeMeaning
prescription.received, prescription.status_changedA prescription arrived or changed status
fill.created, fill.dispensed, fill.verified, fill.packed, fill.shipped, fill.picked_up, fill.rejected, fill.cancelledA fill reached that step
order.created, order.status_changedAn order was created or changed status
shipment.created, .packed, .shipped, .delivered, .returnedA shipment reached that step
print.job_sent, print.job_failedA label or document print job
packing.documents_generatedPacking documents were made for an order
inventory.low_stock, inventory.lot_expiringStock needs attention

A webhook subscribes to everything (*), a group such as fill.*, or exact types separated by commas.

What is sent

RxQuorum sends an HTTPS POST with a CloudEvents 1.0 message (application/cloudevents+json). The data holds ids, numbers such as the Rx number, and statuses only: no patient names, addresses, or other direct identifiers. If a partner needs more, they call the API with the ids.

{
  "specversion": "1.0",
  "id": "6f0c3e0e-2d0b-4a75-9d57-0a1b2c3d4e5f",
  "type": "fill.verified",
  "source": "rxquorum",
  "subject": "Fill/5",
  "time": "2026-10-13T09:20:00Z",
  "datacontenttype": "application/json",
  "pharmacyid": 1,
  "data": { "fillId": 5, "rxNumber": "R1", "status": "Verified", "quantity": 30 }
}

Delivery is at least once, so treat the event id as the key and ignore one you have already handled.

Verifying the signature

Each request has these headers: X-RxQuorum-Event, X-RxQuorum-Event-Id, X-RxQuorum-Delivery, X-RxQuorum-Timestamp (Unix seconds), and X-RxQuorum-Signature. The signature is v1= followed by the hex HMAC-SHA256 of "{timestamp}.{raw body}", using the webhook's secret (shown once, when the webhook is created or its secret is renewed). Check it against the raw body, compare in constant time, and reject a timestamp more than five minutes old.

import hmac, hashlib, time

def verify(secret: str, timestamp: str, body: bytes, signature: str) -> bool:
    if abs(time.time() - int(timestamp)) > 300:
        return False
    expected = "v1=" + hmac.new(secret.encode(), timestamp.encode() + b"." + body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature)

Retries and safety

  • Answer with any 2xx within 10 seconds. Anything else counts as a failed attempt.
  • After a failure RxQuorum retries after 30 seconds, 2 minutes, 10 minutes, 1 hour, then 6 hours, for up to 6 attempts. A delivery that uses every attempt is given up and an administrator can send it again.
  • A webhook that gives up 10 deliveries in a row is switched off automatically. Switching it back on resets the count.
  • Addresses must be https://. Addresses on private or internal networks are refused, and redirects are not followed.
  • Secrets are stored encrypted and never shown again after creation.

Administrators manage webhooks, see deliveries, and send events again in Administration > Integrations. A pharmacy administrator manages their own pharmacy's webhooks. Only a global administrator can register one for every pharmacy.