Systems Architecture · Behind the Scenes

How a PetMeds order actually works.

Every order you place moves through seven systems before it reaches your door — and a retention loop that keeps it coming back month after month. Here's the full pipeline: OMS, Ordergroove, PIM, Middleware, Vet Portal, Iterable, and Salesforce Service Cloud.

OMS Ordergroove PIM Middleware Vet Portal Iterable SFSC
0 Systems in Pipeline
0 Stages of Lifecycle
0 Rx Verified
Signature Interactive

How does an order flow through the pipeline?

Orders move through five stages: Order Placed, Pharmacy Review, Packed, Shipped, and Delivered. Each stage is owned by a different system, and every state change fires an event to the systems that need to know. Click any stage to see the data flow behind it.

The Order Lifecycle

Click any stage to see what happens behind the scenes — which system owns it, what data moves, and what the customer sees.

Stage 01 of 05

Order Placed

The customer selects a product, chooses quantity, and checks out. The cart posts to the OMS with a unique order ID. Inventory is soft-reserved, the payment method is authorized, and a confirmation event is fired to the retention layer.

AutoShip orders skip this stage entirely — they're generated on schedule by Ordergroove, which fires an event to the OMS that creates the order automatically.

Owning system
OMS · Order Management
Data written
order_idcustomer_idline_items[]totalautoShip
Customer sees
Confirmation email. Order number. Link to tracking page.
Downstream event
order.placed → SFSC case + Iterable trigger
Systems Map

What systems power a PetMeds order?

Seven systems power every PetMeds order. The OMS is the hub every order routes through. Ordergroove manages AutoShip subscriptions. PIM supplies product data. Middleware routes events between systems. The Vet Portal verifies every prescription. Iterable fires retention messages. Salesforce Service Cloud handles customer service interactions.

Hub · Central System

OMS — Order Management

The central system. Every order passes through it, every event gets logged there, and every downstream system reads from it. Single source of truth for the entire pipeline.

  • Order creation & state machine
  • Inventory reservation
  • Event log for every stage
  • AutoShip order generation
Retention Engine

Ordergroove

Subscription engine. Owns every AutoShip loop — cadence, skip/delay logic, cancel-save offers, and subscription state. When a ship date arrives, it fires an event to the OMS.

  • Subscription lifecycle
  • Cadence & skip/delay logic
  • Cancel-save flows
  • Auto-renewal scheduling
Data Layer

PIM — Product Information

Product Information Management. Owns every product detail — descriptions, images, dosage charts, warnings, allergen info, and variant mapping. Feeds the site, packing slips, and every customer view.

  • Product catalog source of truth
  • Feeds site + packing slips
  • Dosage & warnings data
  • Image CDN integration
Routing Layer

Middleware

The plumbing between systems. Translates API calls, batches events, handles retries, and routes data between the OMS, PIM, fulfillment, and carriers. Nothing gets lost in transit.

  • API translation
  • Event routing & retries
  • Carrier label generation
  • Data transformation
Compliance Layer

Vet Portal

Prescription verification. Licensed PharmDs review every Rx before it ships, coordinate with prescribing vets when needed, and enforce HIPAA and pharmacy regulations.

  • Rx verification queue
  • Vet communication
  • HIPAA compliance
  • Prescription holds & releases
Messaging Layer

Iterable

Retention messaging engine. Fires every transactional email, shipment confirmation, AutoShip reminder, review request, and lifecycle campaign — triggered by OMS events.

  • Transactional email
  • AutoShip reminders
  • Review & reorder prompts
  • Lifecycle campaigns
Service Layer

Salesforce Service Cloud

Every customer interaction, order inquiry, and support case lives here. When a customer calls or chats, the agent has full order history and status at a glance — instantly.

  • Support ticket tracking
  • Full order history view
  • Case → order linkage
  • Agent-facing data sync
Data Flow

What data moves between systems?

Every stage of the order lifecycle pushes specific data downstream. Cart posts orders to the OMS. The OMS routes prescriptions to the Vet Portal. Middleware pushes orders to fulfillment and pulls PIM data. Carriers return tracking numbers. SFSC and Iterable receive every event for service and messaging.

Cart → OMS

The storefront posts the order to the OMS with the customer's cart contents. The OMS generates a unique order ID, soft-reserves inventory, and authorizes payment.

POST /orders { customer_id, line_items[], total, autoShip }

OMS → Vet Portal

If the order contains a prescription, the OMS routes it to the Vet Portal for pharmacist review. The pharmacist verifies the Rx against the order and either approves or holds it.

GET /prescriptions/{id} POST /prescriptions/{id}/approve

OMS → Middleware → Fulfillment

The OMS hands the approved order to middleware, which routes it to the fulfillment center. Product data is pulled from the PIM at this stage to guarantee packing slip accuracy.

POST /fulfillment/pick GET /pim/products/{sku}

Fulfillment → Carrier → OMS

Once packed, the fulfillment center requests a shipping label from the carrier API. The tracking number comes back through middleware and gets written to the OMS.

POST /carriers/label PATCH /orders/{id}/tracking

OMS → SFSC + Iterable

Every order event fires to Salesforce Service Cloud (so agents have the full picture) and to Iterable (so the customer gets the right message at the right time).

POST /sfsc/cases/update POST /iterable/events

Ordergroove → OMS (AutoShip loop)

For AutoShip orders, Ordergroove runs the loop. On the ship date, it fires an event to the OMS, which creates a new order automatically and routes it back to Stage 01 of the pipeline.

POST /oms/orders { subscription_id, cadence, items[] }
Live Event Log

What does the OMS event log look like in production?

Every state change fires an event to every system that needs to know. The OMS event log captures each transition in real time — from order placement through pharmacy review, packing, shipment, and delivery. This is what real-time visibility into the pipeline looks like.

Live Event Stream · Order PM-847291 13 events
09:14:08 OMS order.placed · PM-847291 · 2 items · $118.39 · autoShip:true
09:14:09 Ordergroove subscription.registered · OG-SUB-48210-01 · cadence:30d
09:14:11 SFSC case.created · case:PM-CASE-9231 · linked to order PM-847291
09:14:12 Iterable email.queued · template:order-confirmation · customer_id:C-48210
11:32:41 Vet Portal rx.received · order PM-847291 · vet:Dr.Reynolds · awaiting review
11:32:58 Vet Portal rx.approved · rx_id:RX-20381 · verified_by:PharmD-J.Nguyen
11:33:02 OMS order.status_changed · stage_02_pharmacy_review → stage_03_packed
14:02:17 PIM catalog.lookup · sku:NEXGARD-3MO-60-121 · data_returned
14:02:22 Middleware carrier.label_generated · carrier:USPS · tracking:9400 1000 0000 0000 0000
16:48:31 Iterable email.sent · template:shipping-confirmation · tracking_link:active
16:48:33 SFSC case.updated · case:PM-CASE-9231 · status:shipped
16:48:35 Ordergroove subscription.next_scheduled · OG-SUB-48210-01 · next_ship:Nov-5-2026
18:22:04 Iterable email.queued · template:review-request · trigger:delivered+3d
Integration Patterns

How do the customer-facing views connect to a real OMS?

The customer-facing views already assume a schema that mirrors any standard OMS. Cart handles order creation. Track Order renders the state machine. Account displays order history. Returns evaluates eligibility. Every view is already built — the only change to go live is swapping the data source from localStorage to real API endpoints.

What's already built

The Cart page handles order creation. Track Order renders the full state machine. Account displays order history. Returns evaluates eligibility per order status. All four pages assume the same schema:

orders · order_items · order_events · status · tracking_number · auto_ship_schedule

That schema is the schema. Any OMS uses the same fundamental structure. The views are already correct.

What happens when credentials arrive

Cart posts to POST /orders instead of localStorage. Track Order reads from GET /orders/:id instead of a static object. Account lists from GET /orders?customer_id=X. Returns evaluates against POST /returns/check.

Every view is already built. The only change is swapping the data source. Give us the schema and the credentials — the customer-facing layer is done.

White-Label Scale

Does the same OMS power PetMeds white-label partners?

Yes. The PetMeds OMS is the same pipeline that powers every white-label partner deployment. Rural King is the first sub-node running on the same trunk. Every future partner plugs into the same architecture — same seven systems, same five stages, same retention loop, different brand skin. The OMS scales horizontally without adding headcount.

Sub-Node · Rural King

The first live white-label partner. Same seven systems. Same five stages. Different brand — Powered by PetMeds.

View the Rural King sub-node →

Every Future Partner

Adding a partner does not mean adding a pipeline. The same OMS that runs PetMeds runs Rural King — and every white-label partner next. New partner, new brand skin, same trunk.

See the Rural King OMS page →

Common Questions

What questions do PetMeds customers ask most?

The questions customers ask most about the OMS are: what is an OMS, how does an order flow through the pipeline, where does pharmacy review fit, how do AutoShip orders re-enter the pipeline, and what systems connect to it. Each is answered below.

An OMS is the central system that tracks every order from placement to delivery. It captures orders, reserves inventory, coordinates fulfillment, handles payment authorization, logs every state change, and fires downstream events to every system that needs to know.

Five stages. Order Placed writes to the OMS. Pharmacy Review verifies the prescription through the Vet Portal. Packed routes through Middleware to fulfillment and pulls product data from the PIM. Shipped hands off to the carrier and fires tracking events to Iterable. Delivered closes the order but triggers the retention loop — review requests, reorder prompts, and AutoShip scheduling through Ordergroove.

Between order placement and fulfillment. Every prescription is verified by a licensed pharmacist through the Vet Portal before the order moves forward. If the prescription is unclear or needs coordination with the prescribing vet, the order is held — it doesn't ship until approval. This is where the licensing and HIPAA layer does its work.

AutoShip orders are generated by Ordergroove on a recurring schedule — typically every 30, 60, or 90 days. When the schedule fires, Ordergroove sends an event to the OMS, which creates a new order automatically and routes it through the same five-stage pipeline. The customer doesn't have to do anything. That's the retention engine.

Seven systems. The OMS is the hub — every order routes through it. Ordergroove manages AutoShip subscriptions. PIM supplies product data. Middleware routes events between systems. Vet Portal verifies every prescription. Iterable fires every customer-facing message. Salesforce Service Cloud handles every customer interaction.

See the Customer Side

Every view in the demo — cart, tracking, account, returns — is a live window into the OMS. Start with any one and follow the pipeline.