Purchase Order Workflow
Overview
Purchase Orders (POs) in SynthesQ follow a structured workflow from creation through completion, with approval gates and status tracking to ensure proper procurement controls.
PO Lifecycle States
Draft
Initial state when a PO is created:
- Can be edited freely
- Not visible to suppliers
- No inventory reservations
- Can be deleted without audit trail
Transitions: → Pending (when submitted for approval)
Pending
PO awaiting approval:
- Cannot be edited
- Visible to approvers
- Email notifications sent
- Awaiting manager/admin review
Transitions: → Approved or → Cancelled
Approved
PO approved and ready to send:
- Locked from editing
- Ready for supplier transmission
- Can generate PDF/email
- Inventory expectations recorded
Transitions: → Sent (when transmitted to supplier)
Sent
PO transmitted to supplier:
- Supplier has been notified
- Expected delivery dates active
- Receiving process can begin
- Cannot be cancelled without supplier coordination
Transitions: → Partially Received → Completed
Partially Received
Some items received, awaiting remainder:
- Partial inventory updates
- Outstanding quantity tracked
- Can receive additional shipments
- Monitors expected vs. actual
Transitions: → Completed (when all received)
Completed
All items received and validated:
- Inventory fully updated
- PO archived
- Performance metrics calculated
- Supplier rating updated
Transitions: Terminal state
Cancelled
PO cancelled before completion:
- Reason required for audit
- Cannot be reactivated
- Cancellation date recorded
- Historical record preserved
Transitions: Terminal state
Business Scenarios
Scenario 1: Standard Purchase Flow
Use Case: Routine purchase from established supplier
Workflow:
- Create PO in Draft state
- Add line items (products + quantities)
- Select supplier and delivery warehouse
- Set expected delivery date
- Submit for approval (Draft → Pending)
- Manager reviews and approves (Pending → Approved)
- Send to supplier (Approved → Sent)
- Receive goods as they arrive (Sent → Partially Received → Completed)
Key Checkpoints:
- Approval required for POs over threshold amount
- Expected delivery date drives reorder calculations
- Partial receiving allowed for split shipments
Scenario 2: Emergency Purchase (Expedited)
Use Case: Urgent stock replenishment
Workflow:
- Create PO with "Urgent" priority flag
- Add critical stock items
- Use expedited approval process
- Send immediately upon approval
- Expedite receiving process
Considerations:
- Higher urgency may bypass standard approval for authorized users
- Expedited shipping costs may apply
- Receiving team notified of urgent delivery
Scenario 3: Auto-Generated Reorder
Use Case: Automated stock replenishment
System Behavior:
- Inventory monitoring detects low stock (below reorder point)
- System generates PO automatically in Draft state
- Uses preferred supplier for that product
- Calculates quantities based on reorder quantity
- Routes to approver based on dollar amount
- Approved POs sent automatically (if configured)
Configuration Options:
- Automatic vs. manual approval thresholds
- Preferred supplier per product
- Reorder points and quantities per product/warehouse
- Auto-send upon approval (optional)
Scenario 4: PO Modification After Sending
Use Case: Supplier cannot fulfill original order
Allowed Changes:
- Expected delivery date (with reason)
- Quantity reductions (with supplier confirmation)
- Cancellation of specific line items
Not Allowed:
- Adding new products
- Increasing quantities
- Changing prices (requires new PO)
- Changing supplier
Process:
- Create amendment record
- Log reason for change
- Notify affected parties
- Update inventory expectations
Approval Workflows
Single-Level Approval
When: PO total below threshold (e.g., < $5,000)
Flow: Draft → Pending → Manager Approval → Approved
Multi-Level Approval
When: PO total above threshold (e.g., ≥ $5,000)
Flow: Draft → Pending → Manager Approval → Director Approval → Approved
Auto-Approval
When: Conditions met:
- Auto-generated reorder PO
- Total below auto-approval limit
- Preferred supplier
- Within budget
Flow: Draft → Auto-Approved → Sent
Receiving Process
Full Receipt (Single Delivery)
- PO arrives at warehouse
- Receiving team scans/enters PO number
- Validate received quantities against PO
- Record receipt in system
- Status: Sent → Completed
- Inventory automatically updated
Partial Receipt (Multiple Deliveries)
- First shipment arrives
- Record partial quantities received
- Status: Sent → Partially Received
- Inventory updated for received items
- Outstanding items remain on backorder
- Repeat for subsequent shipments
- Final shipment: Partially Received → Completed
Quality Control Integration
- Goods received but held for QC
- Inventory marked as "Received - QC Pending"
- QC team inspects goods
- Pass: Release to available inventory
- Fail: Reject items, notify supplier, update PO
Integration Points
With Inventory Module
- PO creation checks current stock levels
- Receiving updates inventory quantities
- Expected delivery dates affect available-to-promise
- Multi-warehouse support: PO specifies destination
With Supplier Module
- Supplier performance metrics updated
- On-time delivery tracking
- Quality ratings affected by QC results
- Preferred supplier designation
With Finance Module
- PO creates accounts payable expectation
- Receiving triggers invoice matching
- Budget tracking per department/project
- Accrual accounting for received goods
Performance Metrics
Supplier Performance
- On-time delivery rate
- Order accuracy (received vs. ordered)
- Quality acceptance rate
- Average lead time
- Responsiveness to amendments
Procurement Efficiency
- Time from creation to approval
- Time from approval to sending
- Time from sending to receipt
- PO cycle time (creation to completion)
- Emergency PO frequency
Best Practices
Creating Purchase Orders
- Verify Inventory First: Check current stock before creating PO
- Batch Similar Items: Combine products from same supplier
- Consider Lead Times: Order before reaching reorder point
- Use Preferred Suppliers: Leverage established relationships
- Include Complete Info: Delivery instructions, contact details
Approval Process
- Set Clear Thresholds: Define approval limits by role
- Enable Notifications: Alert approvers promptly
- Track Approval Time: Monitor bottlenecks
- Document Rejections: Require reason for denied POs
Receiving Process
- Inspect Upon Arrival: Don't delay receiving process
- Record Discrepancies: Document quantity/quality issues immediately
- Partial Receives OK: Don't wait for complete order
- Update System Promptly: Real-time inventory accuracy
Supplier Management
- Track Performance: Use metrics to evaluate suppliers
- Communicate Changes: Notify suppliers of amendments promptly
- Build Relationships: Preferred suppliers get priority
- Review Regularly: Assess supplier performance quarterly
Troubleshooting Common Issues
PO Stuck in Pending
Causes:
- Approver unavailable
- Awaiting budget approval
- Missing required information
Resolution:
- Escalate to backup approver
- Complete missing information
- Consider emergency approval process
Supplier Never Received PO
Causes:
- Incorrect email address
- Spam filter blocked
- System transmission error
Resolution:
- Verify supplier contact info
- Resend PO
- Follow up with phone call
- Check system email logs
Receiving Discrepancies
Causes:
- Supplier short-shipped
- Damaged goods
- Wrong items sent
Resolution:
- Document discrepancy with photos
- Contact supplier immediately
- Receive partial quantity if acceptable
- Create return/replacement process
API Endpoints
Create Purchase Order
Endpoint: POST /api/v1/operations/purchase-orders
Authentication: Required (Bearer token)
Request Body:
{
"supplier_id": 12,
"order_date": "2025-12-17",
"expected_delivery_date": "2025-12-24",
"status": "draft",
"internal_notes": "Q4 inventory replenishment",
"line_items": [
{
"product_id": 101,
"quantity_ordered": 200,
"unit_price": 15.50,
"warehouse_id": 1
},
{
"product_id": 102,
"quantity_ordered": 100,
"unit_price": 18.00,
"warehouse_id": 1
}
]
}Response (201 Created):
{
"message": "Purchase order created successfully",
"data": {
"id": 78,
"order_number": "PO-202512-00078",
"status": "draft",
"supplier": {
"id": 12,
"name": "Acme Supplies Inc",
"email": "orders@acmesupplies.com"
},
"order_date": "2025-12-17",
"expected_delivery_date": "2025-12-24",
"total_amount": 4900.00,
"currency": "USD",
"internal_notes": "Q4 inventory replenishment",
"line_items": [
{
"id": 234,
"product_id": 101,
"product_sku": "WIDGET-001",
"product_name": "Premium Widget",
"quantity_ordered": 200,
"quantity_received": 0,
"unit_price": 15.50,
"line_total": 3100.00,
"warehouse_id": 1
},
{
"id": 235,
"product_id": 102,
"product_sku": "GADGET-002",
"product_name": "Smart Gadget",
"quantity_ordered": 100,
"quantity_received": 0,
"unit_price": 18.00,
"line_total": 1800.00,
"warehouse_id": 1
}
],
"created_at": "2025-12-17T10:30:00Z",
"updated_at": "2025-12-17T10:30:00Z"
}
}Approve Purchase Order
Endpoint: POST /api/v1/operations/purchase-orders/{id}/approve
Authentication: Required (Bearer token)
Request Body:
{
"approval_notes": "Approved for Q4 procurement budget"
}Response (200 OK):
{
"message": "Purchase order approved successfully",
"data": {
"id": 78,
"order_number": "PO-202512-00078",
"status": "approved",
"approved_at": "2025-12-17T11:00:00Z",
"approved_by": {
"id": 5,
"name": "Jane Manager",
"email": "jane@example.com"
}
}
}Error Response (422 Unprocessable Entity):
{
"error": "Cannot approve purchase order",
"message": "Purchase order must be in pending status to approve. Current status: draft"
}Send to Supplier
Endpoint: POST /api/v1/operations/purchase-orders/{id}/send
Authentication: Required (Bearer token)
Request Body:
{
"send_email": true,
"email_message": "Please confirm receipt and expected delivery date",
"attach_pdf": true
}Response (200 OK):
{
"message": "Purchase order sent to supplier successfully",
"data": {
"id": 78,
"order_number": "PO-202512-00078",
"status": "sent",
"sent_at": "2025-12-17T11:30:00Z",
"sent_to": "orders@acmesupplies.com",
"email_sent": true
}
}Receive Goods
Endpoint: POST /api/v1/operations/purchase-orders/{id}/receive
Authentication: Required (Bearer token)
See Receiving Goods Guide for detailed receiving process documentation.
Simple Full Receipt:
{
"notes": "Delivery received in good condition",
"quality_check_passed": true
}Response (200 OK):
{
"message": "Purchase order marked as received successfully",
"data": {
"id": 78,
"order_number": "PO-202512-00078",
"status": "received",
"actual_delivery_date": "2025-12-24"
}
}Cancel Purchase Order
Endpoint: POST /api/v1/operations/purchase-orders/{id}/cancel
Authentication: Required (Bearer token)
Request Body:
{
"cancellation_reason": "Supplier cannot meet delivery date - sourcing alternative",
"notify_supplier": true
}Response (200 OK):
{
"message": "Purchase order cancelled successfully",
"data": {
"id": 78,
"order_number": "PO-202512-00078",
"status": "cancelled",
"cancelled_at": "2025-12-17T14:00:00Z",
"cancelled_by": {
"id": 5,
"name": "Jane Manager"
},
"cancellation_reason": "Supplier cannot meet delivery date - sourcing alternative"
}
}Error Response (422 Unprocessable Entity):
{
"error": "Cannot cancel purchase order",
"message": "Cannot cancel purchase order in status: received. Only draft, pending, or approved orders can be cancelled."
}List Purchase Orders
Endpoint: GET /api/v1/operations/purchase-orders
Authentication: Required (Bearer token)
Query Parameters:
status(string, optional): Filter by status (draft, pending, approved, sent, partially_received, received, cancelled)supplier_id(integer, optional): Filter by supplierfrom_date(date, optional): Filter by order date (Y-m-d format)to_date(date, optional): Filter by order date (Y-m-d format)search(string, optional): Search by order number or notessort_by(string, optional): Sort field (order_date, total_amount, status)sort_direction(string, optional): Sort direction (asc, desc)page(integer, optional): Page number for paginationper_page(integer, optional): Items per page (default: 15, max: 100)
Example Request:
GET /api/v1/operations/purchase-orders?status=sent&supplier_id=12&per_page=20Response (200 OK):
{
"data": [
{
"id": 78,
"order_number": "PO-202512-00078",
"status": "sent",
"supplier": {
"id": 12,
"name": "Acme Supplies Inc"
},
"order_date": "2025-12-17",
"expected_delivery_date": "2025-12-24",
"total_amount": 4900.00,
"currency": "USD"
}
],
"meta": {
"current_page": 1,
"per_page": 20,
"total": 1,
"last_page": 1
},
"links": {
"first": "/api/v1/operations/purchase-orders?page=1",
"last": "/api/v1/operations/purchase-orders?page=1",
"prev": null,
"next": null
}
}Get Purchase Order Details
Endpoint: GET /api/v1/operations/purchase-orders/{id}
Authentication: Required (Bearer token)
Response (200 OK):
{
"data": {
"id": 78,
"order_number": "PO-202512-00078",
"status": "sent",
"supplier": {
"id": 12,
"name": "Acme Supplies Inc",
"email": "orders@acmesupplies.com",
"phone": "+1-555-0100"
},
"order_date": "2025-12-17",
"expected_delivery_date": "2025-12-24",
"actual_delivery_date": null,
"total_amount": 4900.00,
"currency": "USD",
"internal_notes": "Q4 inventory replenishment",
"line_items": [
{
"id": 234,
"product_id": 101,
"product_sku": "WIDGET-001",
"product_name": "Premium Widget",
"quantity_ordered": 200,
"quantity_received": 0,
"unit_price": 15.50,
"line_total": 3100.00,
"warehouse_id": 1,
"warehouse_name": "Main Warehouse"
}
],
"created_at": "2025-12-17T10:30:00Z",
"updated_at": "2025-12-17T11:30:00Z",
"approved_at": "2025-12-17T11:00:00Z",
"sent_at": "2025-12-17T11:30:00Z"
}
}Related Guides
- Auto-Reordering - Automated PO generation
- Receiving Goods - Detailed receiving process
- Inventory Management - Stock level monitoring