Skip to content

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:

  1. Create PO in Draft state
  2. Add line items (products + quantities)
  3. Select supplier and delivery warehouse
  4. Set expected delivery date
  5. Submit for approval (Draft → Pending)
  6. Manager reviews and approves (Pending → Approved)
  7. Send to supplier (Approved → Sent)
  8. 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:

  1. Create PO with "Urgent" priority flag
  2. Add critical stock items
  3. Use expedited approval process
  4. Send immediately upon approval
  5. 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:

  1. Inventory monitoring detects low stock (below reorder point)
  2. System generates PO automatically in Draft state
  3. Uses preferred supplier for that product
  4. Calculates quantities based on reorder quantity
  5. Routes to approver based on dollar amount
  6. 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:

  1. Create amendment record
  2. Log reason for change
  3. Notify affected parties
  4. 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)

  1. PO arrives at warehouse
  2. Receiving team scans/enters PO number
  3. Validate received quantities against PO
  4. Record receipt in system
  5. Status: Sent → Completed
  6. Inventory automatically updated

Partial Receipt (Multiple Deliveries)

  1. First shipment arrives
  2. Record partial quantities received
  3. Status: Sent → Partially Received
  4. Inventory updated for received items
  5. Outstanding items remain on backorder
  6. Repeat for subsequent shipments
  7. Final shipment: Partially Received → Completed

Quality Control Integration

  1. Goods received but held for QC
  2. Inventory marked as "Received - QC Pending"
  3. QC team inspects goods
  4. Pass: Release to available inventory
  5. 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

  1. Verify Inventory First: Check current stock before creating PO
  2. Batch Similar Items: Combine products from same supplier
  3. Consider Lead Times: Order before reaching reorder point
  4. Use Preferred Suppliers: Leverage established relationships
  5. Include Complete Info: Delivery instructions, contact details

Approval Process

  1. Set Clear Thresholds: Define approval limits by role
  2. Enable Notifications: Alert approvers promptly
  3. Track Approval Time: Monitor bottlenecks
  4. Document Rejections: Require reason for denied POs

Receiving Process

  1. Inspect Upon Arrival: Don't delay receiving process
  2. Record Discrepancies: Document quantity/quality issues immediately
  3. Partial Receives OK: Don't wait for complete order
  4. Update System Promptly: Real-time inventory accuracy

Supplier Management

  1. Track Performance: Use metrics to evaluate suppliers
  2. Communicate Changes: Notify suppliers of amendments promptly
  3. Build Relationships: Preferred suppliers get priority
  4. 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:

json
{
  "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):

json
{
  "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:

json
{
  "approval_notes": "Approved for Q4 procurement budget"
}

Response (200 OK):

json
{
  "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):

json
{
  "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:

json
{
  "send_email": true,
  "email_message": "Please confirm receipt and expected delivery date",
  "attach_pdf": true
}

Response (200 OK):

json
{
  "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:

json
{
  "notes": "Delivery received in good condition",
  "quality_check_passed": true
}

Response (200 OK):

json
{
  "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:

json
{
  "cancellation_reason": "Supplier cannot meet delivery date - sourcing alternative",
  "notify_supplier": true
}

Response (200 OK):

json
{
  "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):

json
{
  "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 supplier
  • from_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 notes
  • sort_by (string, optional): Sort field (order_date, total_amount, status)
  • sort_direction (string, optional): Sort direction (asc, desc)
  • page (integer, optional): Page number for pagination
  • per_page (integer, optional): Items per page (default: 15, max: 100)

Example Request:

bash
GET /api/v1/operations/purchase-orders?status=sent&supplier_id=12&per_page=20

Response (200 OK):

json
{
  "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):

json
{
  "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"
  }
}

Documentation for SynthesQ CRM/ERP Platform