Pharmacy Fulfillment Guide

This guide explains how pharmacy fulfillment works from a Customer Support and clinic operations point of view. It covers Beluga pharmacy updates, Belmar/LifeFile, DispensePro, product routing, when pharmacy submission should happen, what patients may see, and when CS should escalate.

What Pharmacy Fulfillment Means

Pharmacy fulfillment is the step after medical review where a prescription/order is sent to the correct pharmacy or fulfillment partner.

In this app, fulfillment is separate from:

  • checkout payment
  • invoice payment
  • intake submission
  • intake approval
  • Beluga visit creation
  • subscription cycle billing
  • refill payment

For medication orders, the safest operational rule is:

Do not treat an order as ready for pharmacy fulfillment until prescription confirmation exists.

In the Beluga flow, that confirmation is usually the RX_WRITTEN webhook.

Pharmacy Types

Pharmacies are configured in:

  • Admin -> Settings -> Pharmacies

Common pharmacy types:

  • BELUGA: pharmacy in Beluga's network
  • OWN: clinic-owned or partner pharmacy that can send fulfillment webhooks
  • DISPENSE_PRO: DispensePro / MDScripts pharmacy route
  • BELMAR_LIFEFILE: Belmar / LifeFile pharmacy route

The pharmacy type controls how the app routes fulfillment and which integration data is required.

Product Routing

Products are routed to pharmacies through:

  • CRM -> Store -> Products -> Default Pharmacy

The product default pharmacy is the main routing signal.

Examples:

  • product default pharmacy type is DISPENSE_PRO: app can route that product to DispensePro
  • product default pharmacy type is BELMAR_LIFEFILE: app can route that product to Belmar/LifeFile
  • product default pharmacy type is BELUGA: Beluga visit submission can include the Beluga pharmacy id
  • product default pharmacy type is OWN: direct/partner pharmacy webhooks can update shipping status

CS note: if the wrong pharmacy is receiving an order, check the product's Default Pharmacy first.

Order-Level Pharmacy

Orders can also have an assigned pharmacy.

Where to check:

  • EMR -> Orders -> order detail -> Pharmacy

For Beluga visit submission, pharmacy priority is:

  1. order assigned pharmacy
  2. product default pharmacy
  3. legacy Beluga pharmacy id on the order, if present

For DispensePro and Belmar/LifeFile routing, the submitter checks the product's Default Pharmacy type for each order item.

Prescription Boundary

Medication pharmacy submission should wait until the prescription is written.

In the Beluga workflow:

  1. order is paid or created
  2. required intake is completed
  3. order is submitted to Beluga
  4. Beluga provider reviews the visit
  5. Beluga sends RX_WRITTEN
  6. app creates local prescription records
  7. app attempts pharmacy submission for routed products

Do not submit pharmacy fulfillment only because:

  • checkout succeeded
  • invoice payment succeeded
  • intake was submitted
  • intake was approved
  • Beluga visit was created
  • refill order was paid
  • subscription renewal charged successfully

Those events may move the order forward, but they do not prove a prescription was written.

Beluga Pharmacy Flow

For BELUGA pharmacies:

  • pharmacy id is sent during Beluga visit submission
  • Beluga handles medical review and may send pharmacy/shipping updates back
  • app receives Beluga pharmacy webhooks

Beluga pharmacy webhook examples:

  • PHARMACY_ORDER_CREATED
  • PHARMACY_ORDER_IN_FULFILLMENT
  • PHARMACY_ORDER_SHIPPED
  • PHARMACY_ORDER_DELIVERED

When Beluga sends shipping events, the app can update shipping status, carrier, and tracking information.

DispensePro Flow

DispensePro is a pharmacy fulfillment integration.

Configuration locations:

  • Admin -> Settings -> Medical Integrations -> DispensePro
  • Admin -> Settings -> Pharmacies -> DispensePro pharmacy record
  • CRM -> Store -> Products -> Default Pharmacy
  • EMR -> Drugs -> DispensePro Rx Configuration

Automatic submission:

  • after Beluga RX_WRITTEN, the app checks the order items
  • items whose product Default Pharmacy is DISPENSE_PRO are submitted to DispensePro
  • submission state is stored on the order in dispensePro

Manual actions may exist through EMR/API for:

  • submit
  • get status
  • refill
  • void

DispensePro status values may include:

  • authorized
  • submitted
  • filled
  • shipped
  • delivered
  • voided
  • failed

If DispensePro sends a shipped/delivered webhook, the app can update tracking and notify the patient.

Belmar / LifeFile Flow

Belmar uses LifeFile as the pharmacy/order backend.

Configuration locations:

  • Admin -> Settings -> Pharmacies -> Belmar / LifeFile pharmacy record
  • CRM -> Store -> Products -> Default Pharmacy
  • EMR -> Drugs -> LifeFile Rx Mapping

Automatic submission:

  • after Beluga RX_WRITTEN, the app checks the order items
  • items whose product Default Pharmacy is BELMAR_LIFEFILE are submitted to LifeFile
  • submission state is stored on the order in lifeFile

LifeFile requirements include:

  • pharmacy API URL and credentials
  • vendor/location/network ids
  • test or production status id
  • practice id
  • drug LifeFile Product ID
  • patient shipping/address data
  • prescription/prescriber data

Current limitation:

  • outbound LifeFile submission is wired
  • tracking webhook processing for Belmar/LifeFile is still not fully wired
  • generated signed hardcopy PDF attachment is still pending

CS note: if Belmar requires a signed hardcopy PDF and the order is blocked because of it, escalate to admin/development.

OWN Pharmacy Webhooks

For OWN pharmacies, partner pharmacies can send fulfillment events back to the app.

Webhook endpoint pattern:

  • /api/webhooks/pharmacy/[pharmacyId]

Common events:

  • order.shipped
  • order.fulfilled
  • order.out_for_delivery
  • order.delivered
  • order.cancelled

How the app handles them:

  • shipped/fulfilled/out for delivery can mark order SHIPPED
  • delivered can mark order COMPLETED
  • canceled can mark order CANCELLED
  • shipped/delivered events can notify patient by email/SMS/in-app notification
  • activity is added to the patient timeline

Security note:

  • a pharmacy webhook secret should be configured in production
  • if no secret is configured, incoming webhook requests may be accepted

What Patients May See

Patients may see:

  • order status updates
  • shipped status
  • tracking number
  • carrier
  • delivered status
  • email/SMS/in-app shipment notifications

Patients usually do not see:

  • pharmacy API credentials
  • integration submit errors
  • internal pharmacy routing configuration
  • drug mapping details
  • LifeFile or DispensePro raw response payloads

What CS Should Check Before Advising a Patient

Check:

  • order status
  • invoice/payment status
  • intake status
  • Beluga submit status
  • whether RX_WRITTEN was received
  • local prescription record exists
  • product Default Pharmacy
  • order assigned pharmacy
  • pharmacy type
  • drug mapping for that pharmacy
  • tracking number/carrier
  • integration status JSON, if visible
  • patient shipping address

Common Patient Questions

My order is paid. Why has it not shipped?

Payment is only one step. Medication orders may still need intake, medical review, prescription confirmation, and pharmacy processing before shipping.

My intake was approved. Does that mean pharmacy has it?

Not necessarily. Intake approval allows medical review to continue. Pharmacy fulfillment usually waits until the prescription is written.

Beluga says my prescription was written. What happens next?

The app should create local prescription records and route the order to the correct pharmacy integration based on the product's Default Pharmacy.

Why do I not have tracking yet?

The pharmacy may not have shipped the order yet, or the tracking webhook/update may not have been received. CS should check fulfillment status and pharmacy integration state.

Which pharmacy is handling my order?

Check the order pharmacy and product Default Pharmacy. If they differ, escalate if routing looks unclear.

Troubleshooting

Order should not have gone to fulfillment

Check:

  • was RX_WRITTEN received?
  • does a local prescription record exist?
  • did someone manually submit early?
  • was a workflow configured to submit pharmacy too early?
  • product Default Pharmacy route

Escalate if fulfillment started before prescription confirmation.

Order has RX_WRITTEN but did not submit to pharmacy

Check:

  • product Default Pharmacy
  • pharmacy type
  • drug mapping exists
  • drug has DispensePro or LifeFile configuration
  • patient shipping address
  • integration credentials
  • order integration status/error

Wrong pharmacy received the order

Check:

  • product Default Pharmacy
  • order assigned pharmacy
  • product-to-drug mapping
  • whether the order has mixed products routed to different pharmacies

For Belmar/LifeFile, mixed Belmar pharmacies may require splitting the order before submission.

DispensePro submission failed

Check:

  • DispensePro integration is enabled/configured
  • product Default Pharmacy is DISPENSE_PRO
  • drug has DispensePro Rx Configuration
  • patient DOB/address/phone is complete
  • prescriber NPI exists
  • order dispensePro.submitError

Fix the issue, then retry if an appropriate retry action is available.

Belmar / LifeFile submission failed

Check:

  • product Default Pharmacy is BELMAR_LIFEFILE
  • pharmacy LifeFile credentials are configured
  • pharmacy environment is correct: TEST or PRODUCTION
  • drug has LifeFile Product ID
  • patient address/shipping address is complete
  • prescription/prescriber data exists
  • order lifeFile.submitError

Escalate if the failure references missing hardcopy PDF or unsupported LifeFile payload requirements.

Tracking is missing

Check:

  • order shipping status
  • carrier/tracking fields
  • Beluga pharmacy webhook events
  • DispensePro webhook status
  • OWN pharmacy webhook activity
  • whether Belmar/LifeFile tracking webhook is currently available for this account/app setup

Patient says delivered but app still says shipped

Check:

  • pharmacy portal/status outside the app, if available
  • whether delivered webhook was received
  • tracking carrier status
  • integration webhook errors

Escalate if external pharmacy status and app status disagree.

CS Escalation Checklist

Escalate to admin/development, fulfillment, or medical operations when:

  • pharmacy submission happened before RX_WRITTEN
  • order has RX_WRITTEN but no pharmacy submission occurred
  • wrong pharmacy route was used
  • product Default Pharmacy is missing or incorrect
  • drug mapping is missing or unclear
  • DispensePro or LifeFile submission failed
  • Belmar/LifeFile requires a PDF/hardcopy not generated by the app
  • tracking webhook is missing or appears broken
  • order status does not match pharmacy status
  • patient was notified of shipment incorrectly

Include these details when escalating:

  • patient name/email
  • order number
  • product name
  • current order status
  • invoice/payment status
  • Beluga submit/visit status
  • whether RX_WRITTEN was received
  • prescription id, if visible
  • product Default Pharmacy
  • order assigned pharmacy
  • pharmacy type
  • DispensePro or LifeFile status/error
  • tracking number/carrier, if any
  • screenshot or exact patient/staff-facing message