What is Coupa?

Coupa is a cloud-based Business Spend Management (BSM) platform that helps organizations manage their entire spend lifecycle — from sourcing and procurement to invoicing, payments, and supplier management. It provides a unified platform to control costs, ensure compliance, and gain visibility into organizational spending.

Core Philosophy

Coupa follows a "Community-Driven" approach — leveraging data from 1000+ customers to provide benchmarks, recommendations, and best practices. Unlike legacy ERP procurement modules, Coupa is built as a best-of-breed solution that integrates with existing ERPs.

Why Developers Need This

As a developer moving into Coupa implementation, you need to understand both the functional business processes (how procurement works) and the technical architecture (APIs, data models, integrations). This training bridges both worlds.

Coupa Architecture Overview

ERP Systems

SAP, Oracle, NetSuite, Microsoft Dynamics

Coupa Platform

Requisitioning | PO | Invoicing | Sourcing | Contracts | Suppliers | Analytics

Supplier Network

Coupa Supplier Portal (CSP) | Punchout Catalogs | EDI | cXML

Complete Procurement Lifecycle

1

Need Identification

Employee identifies a need for goods/services

2

Requisition Creation

Create requisition via catalog or free-text

3

Approval Workflow

Routing based on amount, cost center, commodity

4

PO Generation

Approved requisition becomes Purchase Order

5

PO Transmission

PO sent to supplier via email/EDI/cXML

6

Goods Receipt

Receive goods/services against PO

7

Invoice Processing

2-way or 3-way match validation

8

Payment

Invoice exported to ERP for payment

How to Use This Training

The sidebar is organized into 5 logical groups — each designed to build your expertise from business understanding to technical mastery. Follow the recommended learning order below.

🏢

1. Business Processes

Start Here
📚
Course Overview

What Coupa is, why it matters, learning path

🎯
Real Business Scenarios

6 end-to-end scenarios with actual data — learn how enterprises actually use Coupa

💼
Client Requirements Playbook

Common client asks, Coupa vs Ariba comparison, glossary — talk to clients confidently

📋

2. Functional (P2P)

Core Knowledge
🏢
Coupa Fundamentals

Platform, org structure, roles, numbering

📝
Requisitioning & Catalogs

Req creation, catalogs, punchout, accounting

📦
PO Management

PO lifecycle, transmission, change orders, blanket POs

📦
Receiving & Inspections

Receipt types, tolerances, quality checks

💳
Invoicing (2-Way/3-Way)

Match types, exceptions, non-PO invoices

Approval Workflows

Rules, types, delegation, escalation

💰
Budget Management

Budget checking, consumption, overrides

🛠

3. Technical (Developer)

Build Skills
Conditions Framework

Rule engine, flex fields, sub-accounts, tags

🔌
API & Integrations

REST API, IF, webhooks, cXML, patterns

📐
Integration Field Mappings

SAP, Oracle, NetSuite field-by-field mappings

🗃
Data Model & Architecture

Table relationships, full transaction flow

🔍
Troubleshooting Guide

Debug integrations, approvals, budgets, performance

🚀

4. Advanced Modules

Go Deeper
🤝
Supplier Management

Onboarding, CSP, supplier types, lifecycle

📜
Contract Management

CLM lifecycle, contract-PO integration

📋
Sourcing & Auctions

RFx, bid analysis, auctions, awards

📊
Reporting & Analytics

Dashboards, BIRT, data export, KPIs

💻

5. Implementation & Labs

Practice
🚀
Implementation Methodology

6-phase process, data migration, testing

💻
Hands-On Labs

6 step-by-step labs: requisitions, approvals, integrations

Best Practices & Tips

Lessons learned, pitfalls, career path

Platform Architecture

Coupa is a multi-tenant SaaS platform built on Ruby on Rails with a MySQL database backend. Understanding the architecture helps you grasp how data flows, how integrations work, and where customizations fit.

Frontend

HTML5, CSS3, JavaScript (jQuery), HAML templates

Backend

Ruby on Rails (MVC pattern), RESTful APIs

Database

MySQL (relational, normalized schema)

Integration

REST API, XML/JSON, SFTP, cXML, EDI

Core Organizational Structure

Every Coupa implementation starts with configuring the organizational hierarchy. This is the backbone that drives approvals, reporting, and data segmentation.

Tenant (Company)

The root Coupa instance

Divisions

Top-level business units (optional)

Business Entities / Legal Entities

Separate companies with distinct tax/regulatory requirements

Departments / Cost Centers

Budget ownership and chargeback

Sub-Accounts / Locations

Physical or logical groupings

💡 Developer Insight

Each level in this hierarchy maps to database tables with foreign key relationships. When designing integrations, you'll need to understand which level each transaction belongs to. For example, a Purchase Order belongs to a Business Entity, which determines the ERP system it syncs to.

Key Configuration Objects

Object Purpose API Endpoint Key Fields
Account Types Define GL account structures for different spend categories /api/account_types name, active, segment_count
Cost Centers Budget tracking and chargeback organization /api/cost_centers name, code, parent_id, active
Commodities Classification of goods/services for reporting and approval routing /api/commodities name, code, type, parent_id
Currencies Multi-currency support with exchange rates /api/currencies code, rate, effective_date
UOMs Units of Measure for line items /api/uoms name, code, decimals
Tax Rates Tax calculation rules by jurisdiction /api/tax_rates name, rate, jurisdiction, effective_date
Payment Terms Standard terms for supplier payments /api/payment_terms name, days, discount_percent, discount_days

User Management & Roles

Coupa uses a role-based access control (RBAC) model. Understanding roles is critical for both functional configuration and API development.

Requester

Can create requisitions, view their own orders and invoices

Create Requisitions View My Orders Receive Goods

Approver

Can approve/reject requisitions and POs based on delegation rules

Approve/Reject Delegate View Team Requests

Procurement Manager

Manages catalogs, suppliers, and procurement policies

Manage Catalogs Supplier Admin PO Management

Admin

Full system configuration, user management, and integration setup

System Config API Access All Modules

💡 API Authentication

Coupa API uses API Keys for authentication. Each user has an API key that inherits their role permissions. When building integrations, always use a service account with minimum required permissions.

Headers:
X-COUPA-API-KEY: your_api_key_here
Content-Type: application/xml  (or application/json)

Example:
curl -X GET https://your-instance.coupahost.com/api/users \
  -H "X-COUPA-API-KEY: abc123" \
  -H "Content-Type: application/xml"

Numbering Schemes

Coupa auto-generates unique identifiers for all transactional objects. Understanding numbering is essential for integrations and reporting.

Requisition Numbers

Format: REQ-00001234 (configurable prefix and padding)

Purchase Order Numbers

Format: PO-00005678 (can be synced with ERP PO numbers)

Invoice Numbers

Format: INV-00009012 (supplier invoice numbers are separate)

Receipt Numbers

Format: REC-00003456

💡 Developer Note

Numbering schemes are configured in Setup > Numbering. When integrating, never assume number formats — always use the internal id field for API references. Display numbers (requisition-number, po-number) are for human readability only.

What is a Requisition?

A Requisition (often called a "req") is an internal request to purchase goods or services. It is NOT a purchase order — it's the precursor that goes through approval before becoming a PO.

Requisition

Internal request, pending approval

Status: New | In Approval | Approved | Rejected

↓ Approved

Purchase Order

External commitment to supplier

Status: New | Ordered | Received | Closed

Requisition Creation Methods

1. Catalog-Based

Users browse pre-configured catalogs (internal or punchout) and add items to cart.

When to Use:

  • Standard, frequently purchased items
  • Pre-negotiated pricing exists
  • Contract compliance required

Technical Flow:

  1. User searches catalog via UI
  2. Catalog items map to catalog_item table
  3. Price, UOM, commodity pre-populated
  4. Added to cart as cart_item
  5. Checkout creates requisition with line_items

2. Free-Text (Non-Catalog)

Users manually enter item details, description, price, and accounting.

When to Use:

  • One-time purchases
  • Services or intangible goods
  • Items not in any catalog

Technical Flow:

  1. User fills free-text form
  2. Description, quantity, price entered manually
  3. Commodity code must be selected
  4. Accounting distributions assigned
  5. Created as line_item with source_type: "non_catalog"

3. Punchout Catalogs

Users "punch out" to supplier's website, shop, and bring items back into Coupa.

When to Use:

  • Complex supplier catalogs (Grainger, CDW, etc.)
  • Real-time pricing and availability needed
  • Large, dynamic product catalogs

Technical Flow (cXML Punchout):

  1. User clicks punchout catalog in Coupa
  2. Coupa sends PunchOutSetupRequest to supplier
  3. Supplier returns URL with session token
  4. User shops on supplier site
  5. Supplier sends PunchOutOrderMessage with cart items
  6. Coupa parses cXML and populates cart
  7. User reviews and submits requisition

Requisition Data Model

Understanding the data model is critical for API development and troubleshooting.

requisition

  • id (primary key)
  • requisition_number
  • status
  • requester_id (FK -> users)
  • business_entity_id (FK)
  • created_at, updated_at
1 : N

line_items

  • id (primary key)
  • requisition_id (FK)
  • description
  • quantity
  • price
  • uom_id (FK)
  • commodity_id (FK)
  • account_type_id (FK)
1 : N

accountings

  • id (primary key)
  • line_id (FK)
  • cost_center_id (FK)
  • gl_code
  • quantity
  • amount
  • project_id (FK, optional)

💡 API Example: Create Requisition

POST /api/requisitions
Content-Type: application/xml

<?xml version="1.0" encoding="UTF-8"?>
<requisition>
  <requester>
    <login>john.doe</login>
  </requester>
  <title>Office Supplies Q1</title>
  <description>Quarterly office supplies order</description>
  <line-items>
    <line-item>
      <description>Printer Paper A4</description>
      <quantity>50</quantity>
      <price>12.50</price>
      <uom>
        <code>EA</code>
      </uom>
      <accountings>
        <accounting>
          <cost-center>
            <code>CC-100</code>
          </cost-center>
          <quantity>50</quantity>
          <amount>625.00</amount>
        </accounting>
      </accountings>
    </line-item>
  </line-items>
</requisition>

Accounting Distributions

Every line item in a requisition must have accounting distributions — this tells Coupa which cost center, GL account, project, or dimension to charge.

Example: $1,000 Line Item Split Across 3 Cost Centers

Cost Center GL Account Quantity Amount %
Marketing 6000-100 30 $500 50%
Sales 6000-200 15 $300 30%
Operations 6000-300 5 $200 20%

💡 Developer Insight

Accountings are stored in the accountings table with foreign keys to line_items. The sum of all accounting amounts MUST equal the line total. Coupa validates this at the API and UI level. When building integrations, ensure your accounting distribution logic handles this validation.

Shopping Cart Flow

Browse/Search

User searches catalogs or enters free-text

Add to Cart

Items stored in session/cart table

Review Cart

Modify quantities, accounting, delivery details

Checkout

Cart converted to requisition

Submit

Requisition enters approval workflow

PO Lifecycle

A Purchase Order (PO) is a legally binding document sent to a supplier committing to purchase goods or services. In Coupa, POs are automatically generated from approved requisitions.

New

Created from approved requisition, not yet sent

Ordered

Transmitted to supplier, awaiting fulfillment

Received

Goods/services received (partial or full)

Closed

Fully received and invoiced

Cancelled

PO voided (requires admin action)

PO Transmission Methods

Once a PO is in "New" status, it must be transmitted to the supplier. Coupa supports multiple transmission methods:

Email

PO sent as PDF attachment to supplier email

Use Case:

Small suppliers, one-time vendors, low-volume POs

Configuration:

Supplier email address + PO template

cXML

Structured XML via HTTP POST to supplier endpoint

Use Case:

Electronic trading partners, automated processing

Configuration:

Supplier endpoint URL, shared secret, domain ID

EDI

Electronic Data Interchange (X12 850 for PO)

Use Case:

Large enterprises, retail, manufacturing

Configuration:

EDI translator, VAN or AS2 connection

Coupa Supplier Portal

Supplier logs into CSP to view and acknowledge POs

Use Case:

Suppliers onboarded to Coupa network

Configuration:

Supplier invitation + CSP access

PO Change Orders

When a PO needs modification after being sent to the supplier, Coupa creates a Change Order (revision). Understanding revisions is critical for integrations.

Original PO

Revision 0

PO-001000

→ Change Requested

Change Order

Revision 1

PO-001000-R1

→ Another Change

Change Order

Revision 2

PO-001000-R2

💡 Developer Note

Each revision creates a new record in the purchase_orders table with a revision_number field. The parent_id links back to the original PO. When syncing to ERP, you must handle revision logic — some ERPs require full PO replacement, others support incremental updates.

PO Data Model

purchase_order

  • id (PK)
  • po_number
  • revision_number
  • status
  • supplier_id (FK)
  • ship_to_address_id (FK)
  • bill_to_address_id (FK)
  • payment_term_id (FK)
  • currency_id (FK)
1 : N

po_lines

  • id (PK)
  • po_id (FK)
  • line_num
  • description
  • quantity
  • price
  • received_quantity
  • invoiced_quantity
1 : N

po_line_accountings

  • id (PK)
  • line_id (FK)
  • cost_center_id (FK)
  • gl_code
  • quantity
  • amount

Blanket POs

A Blanket PO (or Blanket Release PO) is a PO with a total quantity or amount that is released over time through multiple releases. Common for ongoing supply agreements.

Example: Annual IT Equipment Agreement

Field Value
Blanket PO Total $100,000
Release 1 (Jan) $15,000 (remaining: $85,000)
Release 2 (Mar) $25,000 (remaining: $60,000)
Release 3 (Jun) $30,000 (remaining: $30,000)
Release 4 (Sep) $30,000 (remaining: $0)

What is Receiving?

Receiving is the process of confirming that goods or services have been delivered against a PO. It's a critical step that triggers invoice matching and payment workflows.

Standard Receipt

User confirms quantity received against PO line

When:

  • Physical goods delivery
  • Partial deliveries allowed
  • Multiple shipments expected

Service Receipt

User confirms service completion or milestone

When:

  • Consulting services
  • Maintenance contracts
  • Subscription services

Auto-Receipt

System automatically creates receipt on invoice match

When:

  • Low-value items
  • Services where receipt is implicit
  • Configured at PO line level

Receiving Flow

1. PO in "Ordered" Status

Supplier has been notified

↓ Goods Arrive

2. User Creates Receipt

Enter quantity received, note any discrepancies

↓ Validation

3. System Updates PO

received_quantity incremented, status updated

↓ Complete

4. PO Line Status

"Received" or "Partially Received"

Receipt Tolerances

Coupa allows configuration of receipt tolerances — acceptable variance between ordered and received quantities.

Tolerance Type Configuration Example
Over Receipt Allow X% or X units over PO quantity PO: 100 units, Tolerance: 10%, Max receive: 110
Under Receipt Allow X% or X units under PO quantity PO: 100 units, Tolerance: 5%, Min receive: 95
Price Tolerance Allow X% variance on invoice price vs PO price PO: $10/unit, Tolerance: 5%, Max invoice: $10.50

💡 API: Create Receipt

POST /api/receipts
Content-Type: application/xml

<?xml version="1.0" encoding="UTF-8"?>
<receipt>
  <purchase-order>
    <po-number>PO-001000</po-number>
  </purchase-order>
  <receipt-lines>
    <receipt-line>
      <line-number>1</line-number>
      <quantity>50</quantity>
      <received-date>2024-01-15</received-date>
    </receipt-line>
  </receipt-lines>
</receipt>

Inspections

For quality-critical goods, Coupa supports inspection workflows where received items must pass quality checks before being accepted.

Goods Received

Initial receipt created

Inspection Required

Item flagged for quality check

Inspection Performed

Pass/Fail recorded with notes

Accept or Reject

Accepted items proceed, rejected items returned

Invoice Matching Concepts

Invoice matching is the process of validating that an invoice matches the corresponding PO and receipt before payment. This is the core control mechanism in procurement.

2-Way Match

Invoice
Purchase Order

Validates:

  • Price matches PO price
  • Quantity matches PO quantity
  • Supplier matches PO supplier

Use Case:

Services, subscriptions, intangible goods where receipt confirmation is not required

3-Way Match

Invoice
Purchase Order
Receipt

Validates:

  • Price matches PO price
  • Quantity matches PO quantity
  • Quantity matches received quantity
  • Supplier matches PO supplier

Use Case:

Physical goods where delivery must be confirmed before payment

Evaluation Match (4-Way)

Invoice
PO
Receipt
Inspection

Use Case:

Quality-critical goods requiring inspection approval

Invoice Sources

Invoices can enter Coupa through multiple channels:

Supplier Portal

Supplier logs into CSP and creates invoice against PO

Benefits:

  • Self-service, reduces AP workload
  • PO reference ensures accurate matching
  • Real-time status visibility

cXML Invoice

Supplier sends invoice electronically via cXML

Benefits:

  • Automated, no manual entry
  • Structured data for matching
  • High-volume processing

PDF/Scan (OCR)

Invoice scanned and processed via OCR

Benefits:

  • Handles paper invoices
  • AI-powered data extraction
  • Reduces manual data entry

Manual Entry

AP team manually enters invoice details

Benefits:

  • Fallback for all scenarios
  • Full control over data
  • Handles exceptions

Invoice Exception Handling

When an invoice doesn't match, it creates an exception that must be resolved before payment.

Exception Type Cause Resolution
Price Variance Invoice price differs from PO price beyond tolerance Approve variance, update PO, or reject invoice
Quantity Variance Invoice quantity differs from PO or receipt quantity Verify receipt, update PO, or request credit memo
Missing Receipt Invoice submitted but no receipt exists (3-way match) Create receipt or switch to 2-way match
Missing PO Invoice received without corresponding PO Create PO retroactively or process as non-PO invoice
Tax Variance Tax amount differs from calculated tax Verify tax calculation, approve variance

💡 Invoice Status Flow

Submitted → Matching → Matched → Approved → Exported to ERP → Paid
                     ↑
                     ← Exception (requires resolution)
                     ← Rejected (returned to supplier)

Non-PO Invoices

Not all invoices have a corresponding PO. Non-PO invoices (also called "expense invoices" or "utility invoices") are processed without PO matching.

Invoice Received

From supplier (no PO reference)

Coding Required

AP team assigns cost center, GL account, commodity

Approval Workflow

Routed based on amount, department, commodity

Approved & Exported

Sent to ERP for payment

Approval Architecture

Coupa's approval system is driven by Approval Rules that evaluate transaction attributes and route to the appropriate approvers. Understanding this is critical for both configuration and debugging.

Transaction Submitted

Requisition/PO/Invoice created and submitted

Approval Engine Evaluates Rules

Checks all active approval rules in priority order

Matching Rules Found

Rules whose conditions match the transaction

Approval Chain Built

Sequential or parallel approval steps assembled

Notifications Sent

Email and in-app notifications to approvers

Approver Action

Approve, Reject, or Request More Info

Approval Rule Conditions

Approval rules can be based on multiple conditions. Rules are evaluated in priority order (lowest number = highest priority).

Amount-Based

  • Requisition total > $10,000
  • Single line item > $5,000
  • Cumulative amount for vendor > $50,000/year

Organizational

  • Requester's department
  • Cost center
  • Business entity / legal entity
  • Location

Category-Based

  • Commodity code
  • Account type
  • Specific item in catalog

Supplier-Based

  • Specific supplier
  • Supplier risk rating
  • New supplier (first-time PO)

Contract-Based

  • Has contract attached
  • Contract value threshold
  • Contract expiration proximity

Custom Fields

  • Custom header fields
  • Custom line fields
  • Flex field values

Approval Types

Sequential Approval

Approvers must approve in order — each approver waits for the previous one

Manager Director VP

Use Case:

High-value purchases requiring escalating authority

Parallel Approval

All approvers receive the request simultaneously — any one can approve

Finance IT Security

Use Case:

Cross-functional approvals where any department sign-off is sufficient

Unanimous Approval

All approvers must approve — any rejection blocks the transaction

Legal + Finance + Compliance

Use Case:

High-risk purchases requiring all stakeholders' agreement

Delegation & Substitution

Coupa supports approval delegation — temporarily or permanently assigning approval authority to another user.

Type Description Example
Temporary Delegation Delegate for a specific date range Manager on vacation, delegates to peer
Permanent Delegation Delegate until manually revoked Role change, responsibilities transferred
Approval Groups Multiple users can approve for a role Any member of "Finance Team" can approve
Escalation Auto-escalate if not approved within X hours Unapproved reqs escalate to manager's manager

💡 Developer Note: Approval API

Approvals can be managed via API for custom workflows or external approval systems:

POST /api/approval-actions
Content-Type: application/xml

<?xml version="1.0" encoding="UTF-8"?>
<approval-action>
  <action>approve</action>
  <comment>Approved - within budget</comment>
  <approval-id>12345</approval-id>
</approval-action>

Supplier Master Data

The supplier record is the foundation of all procurement transactions. Understanding supplier data structure is essential for integrations.

supplier

  • id (PK)
  • name
  • display_name
  • status (active, inactive, suspended)
  • supplier_type (managed, unmanaged)
  • number (unique identifier)
  • tax_id / VAT number
  • duns_number
  • website
  • primary_contact
1 : N

supplier_sites

  • id (PK)
  • supplier_id (FK)
  • site_name
  • address
  • ship_to / bill_to flags
  • payment_terms
  • currency
1 : N

supplier_contacts

  • id (PK)
  • supplier_id (FK)
  • name, email, phone
  • role (sales, support, accounts)

Supplier Types

Managed Suppliers

Full supplier records with complete data, contracts, and performance tracking

Characteristics:

  • Complete master data
  • Onboarded through formal process
  • Performance scorecards
  • Contract management
  • ERP-synced

Unmanaged Suppliers

Minimal data, typically for one-time or low-value purchases

Characteristics:

  • Basic info only (name, email)
  • Quick creation
  • Limited reporting
  • No contract linkage
  • Often converted to managed later

Supplier Onboarding Flow

1. Supplier Registration

Internal user or supplier initiates registration

2. Information Collection

Supplier provides company details, banking, certifications

3. Risk Assessment

Financial, compliance, and operational risk evaluation

4. Approval

Procurement team reviews and approves

5. Activation

Supplier activated, CSP access granted

Coupa Supplier Portal (CSP)

The Coupa Supplier Portal is a free, web-based portal that suppliers use to interact with your organization.

PO Management

View, acknowledge, and confirm POs

Invoice Submission

Create and submit invoices against POs

Order Status

Track order status and payment updates

Profile Management

Update company info, contacts, banking details

Catalog Management

Upload and maintain product catalogs

ASN (Advance Ship Notice)

Notify buyer of incoming shipments

💡 Developer Note

CSP interactions are tracked in the supplier_portal_activities table. When building integrations, you can query supplier activity logs to determine engagement levels and identify suppliers who may need training or support.

Contract Lifecycle

Coupa Contract Management (CLM) manages the entire contract lifecycle from creation through renewal or expiration.

1. Request

Business user requests new contract or amendment

2. Authoring

Legal creates contract using templates and clauses

3. Negotiation

Redlining, comments, version control with supplier

4. Approval

Internal approval workflow for legal, finance, business

5. Execution

E-signature, fully executed contract stored

6. Compliance

Monitor terms, pricing, obligations

7. Renewal/Expiry

Automated alerts for upcoming renewals

Contract-PO Integration

Contracts in Coupa are linked to POs to ensure contract compliance — users buy from contracted suppliers at contracted prices.

Contract Created

Terms, pricing, supplier defined

Catalog Items Linked

Contract prices flow to catalog

User Creates Requisition

Selects contracted items

Contract Price Applied

Auto-populates from contract terms

PO References Contract

Contract number on PO for audit trail

Spend Tracked Against Contract

Commitment and actuals tracked

Contract Data Model

contract

  • id (PK)
  • contract_number
  • name
  • supplier_id (FK)
  • status (draft, active, expired, terminated)
  • start_date, end_date
  • total_value
  • spent_amount
  • committed_amount
1 : N

contract_terms

  • id (PK)
  • contract_id (FK)
  • term_type (pricing, delivery, payment)
  • description
  • value
1 : N

contract_line_items

  • id (PK)
  • contract_id (FK)
  • description
  • unit_price
  • uom
  • catalog_item_id (FK)

What is the Conditions Framework?

The Conditions Framework is Coupa's rule engine that drives conditional behavior across the platform. It determines when approvals fire, what fields are visible, how transactions are routed, and what default values are applied. Think of it as the "IF-THEN-ELSE" brain of Coupa.

💡 Developer Insight

Conditions are stored in the conditions table with related condition_clauses (individual IF statements) and condition_actions (THEN results). Each clause has an operator (equals, contains, greater than, etc.), a left_operand (field reference), and a right_operand (value or field). Understanding this structure is critical when debugging why a rule did or didn't fire.

Condition Structure (IF-THEN-ELSE)

Every condition follows the same logical structure:

IF (Clauses)

One or more conditions that must be true. Clauses can be combined with AND/OR logic and grouped with parentheses.

IF (amount > 10000 AND department = "IT")
   OR (commodity = "Software" AND new_supplier = true)

THEN (Actions)

What happens when the IF evaluates to true. Actions can add approvers, set field values, show/hide fields, or route transactions.

THEN add_approver("IT Director")
     AND set_field("priority", "High")

ELSE (Optional)

Fallback behavior when the IF evaluates to false. Often used for default routing.

ELSE add_approver("Procurement Manager")

💡 Clause Operators

Coupa supports these operators: equals, not_equals, contains, starts_with, greater_than, less_than, between, is_empty, is_not_empty, in_list, matches_regex. Each operator has specific use cases and performance implications.

Types of Conditions

Approval Conditions

Control which approval rules fire based on transaction attributes.

Example:

IF total > $50,000 THEN route to CFO

Used In:

  • Requisition approvals
  • PO approvals
  • Invoice approvals
  • Contract approvals

Validation Conditions

Prevent submission when certain criteria are not met.

Example:

IF commodity = "IT Equipment" THEN require "Asset Tag" field

Used In:

  • Required field enforcement
  • Business rule validation
  • Policy compliance checks

Routing Conditions

Determine which team, buyer, or process handles a transaction.

Example:

IF commodity = "Marketing" THEN route to Marketing Procurement Team

Used In:

  • Buyer assignment
  • Team routing
  • Process selection

Field Visibility Conditions

Show or hide fields based on other field values.

Example:

IF line_type = "Service" THEN show "Milestone Schedule" field

Used In:

  • Dynamic form behavior
  • Contextual field display
  • Reducing form complexity

Default Value Conditions

Auto-populate fields based on conditions.

Example:

IF department = "IT" THEN default cost_center = "IT-CC-001"

Used In:

  • Auto-filling cost centers
  • Default payment terms
  • Pre-populating shipping addresses

Change Order Conditions

Control when PO changes require re-approval.

Example:

IF price_increase > 10% THEN require re-approval

Used In:

  • PO change order approvals
  • Contract amendment routing
  • Budget impact assessment

Condition Evaluation Order

When a transaction is submitted, Coupa evaluates conditions in a specific order. Understanding this order is critical for debugging unexpected behavior.

1

Validation Conditions

First, check if the transaction is valid. If validation fails, the transaction cannot proceed.

2

Default Value Conditions

Apply default values to fields that haven't been populated.

3

Field Visibility Conditions

Determine which fields should be shown or hidden based on current values.

4

Routing Conditions

Route the transaction to the appropriate team, buyer, or process.

5

Approval Conditions

Finally, evaluate approval rules to build the approval chain.

⚠ Critical: Order Matters

Because Validation runs BEFORE Default Values, a validation rule checking for a required field will fail if that field was supposed to be auto-populated by a default value condition. Always design your conditions with this evaluation order in mind.

Flex Fields Deep Dive

Flex Fields are Coupa's mechanism for adding custom fields to transactions at different levels. They are the most powerful extension mechanism in Coupa and are heavily used in conditions.

Header-Level Flex Fields

Applied to the requisition/PO/invoice header. Available across all lines.

Common Use Cases:

  • Project Code (applies to entire order)
  • Budget Owner
  • Business Justification
  • Contract Reference Number

API Example:

<requisition>
  <flex-fields>
    <flex-field>
      <name>Project_Code</name>
      <value>PRJ-2024-001</value>
    </flex-field>
  </flex-fields>
</requisition>

Line-Level Flex Fields

Applied to individual line items. Each line can have different values.

Common Use Cases:

  • Asset Tag Number (per item)
  • Delivery Location (per line)
  • Warranty Period
  • Service Level Agreement

API Example:

<line-item>
  <flex-fields>
    <flex-field>
      <name>Asset_Tag</name>
      <value>AST-001234</value>
    </flex-field>
  </flex-fields>
</line-item>

Accounting-Level Flex Fields

Applied to individual accounting distributions. Most granular level.

Common Use Cases:

  • Grant Number (per charge)
  • Internal Order
  • WBS Element
  • Cost Object

API Example:

<accounting>
  <flex-fields>
    <flex-field>
      <name>Grant_Number</name>
      <value>GR-2024-0567</value>
    </flex-field>
  </flex-fields>
</accounting>

Sub-Accounts and Tags

Sub-Accounts provide an additional level of segmentation below cost centers, while Tags are free-form labels for categorization and reporting.

💡 Sub-Accounts

Sub-Accounts are hierarchical and validated against a predefined list. They are commonly used for:

  • Department-level budget tracking within a cost center
  • Program or initiative tracking
  • Multi-dimensional reporting

API: /api/sub_accounts — supports parent-child relationships

💡 Tags

Tags are flexible, non-hierarchical labels that can be applied to any transaction. They are commonly used for:

  • Ad-hoc categorization (e.g., "Q1-Priority", "COVID-Response")
  • Reporting groupings that don't fit the org hierarchy
  • Temporary campaign or project tracking

Tags can be used in condition clauses: IF tags contains "Priority" THEN route to expedited approval

Budget Checking Concept

Coupa's budget checking compares available budget against requested amount at the time of requisition submission. This prevents overspending before it happens.

Coupa as Budget System

Budgets are loaded directly into Coupa. Coupa performs all budget checks and tracks consumption internally.

When to Use:

  • ERP doesn't have robust budget checking
  • Need real-time budget visibility in Coupa
  • Want to block spending before ERP commitment

ERP as Budget System

Budget checking is delegated to the ERP. Coupa sends the transaction to ERP for budget validation.

When to Use:

  • ERP is the single source of truth for budgets
  • Complex budget structures already in ERP
  • Regulatory requirements mandate ERP budget control

Budget Checking Flow

1

Requisition Submitted

User submits requisition with accounting distributions

2

Budget Key Lookup

Coupa identifies the budget bucket (cost center + account + period)

3

Available Budget Calculation

Budget - Commitments - Actuals = Available

4

Comparison

Requested amount vs Available budget

5

Action Taken

Pass, Warning, Block, or Override based on configuration

Budget Check Actions

✅ Pass

Requested amount is within available budget. Transaction proceeds normally.

Configuration:

Available >= Requested

⚠️ Warning

Requested amount exceeds available budget, but user is warned and can proceed.

Configuration:

Available < Requested AND within warning threshold

🛑 Block

Requested amount exceeds available budget. Transaction cannot proceed without override.

Configuration:

Available < Requested AND exceeds warning threshold

🔑 Override

Authorized user can override the budget check and allow the transaction to proceed.

Configuration:

Override permission granted to specific roles/users

Budget Consumption Timeline

Budget is consumed at different stages of the procurement lifecycle. Understanding when budget is committed vs. spent is critical for accurate reporting.

Stage Budget Impact Commitment Actual Spend
Requisition Submitted Soft commitment (tentative) Yes (soft) No
Requisition Approved Hard commitment (reserved) Yes (hard) No
PO Created Commitment confirmed Yes (hard) No
Partial Receipt Partial actual, commitment reduced Reduced Partial
Invoice Approved Actual spend recorded Reduced Yes
Final Invoice Full actual, commitment released Released Full

💡 Budget Formula

Available Budget = Total Budget - Commitments - Actuals

Where:
  Commitments = Approved Reqs + Open POs - Invoiced Amounts
  Actuals = Approved Invoices (paid or unpaid)

Example:
  Total Budget: $100,000
  Commitments: $30,000 (approved reqs + open POs)
  Actuals: $25,000 (approved invoices)
  Available: $100,000 - $30,000 - $25,000 = $45,000

Budget Override Workflows

When a budget check fails, organizations need a controlled way to allow exceptions.

Budget Check Fails

Requested > Available

Override Requested

User or approver requests budget override

Override Approval

Budget owner or finance approves the override

Transaction Proceeds

Requisition continues through approval workflow

Budget Integration with ERP

Scenario A: Coupa Owns Budgets

Budgets Loaded to Coupa

From ERP or spreadsheet upload

Coupa Checks Budget

Real-time at requisition submission

Consumption Synced to ERP

Periodic sync of commitments and actuals

Scenario B: ERP Owns Budgets

Requisition Submitted

User creates req in Coupa

Coupa Calls ERP

Real-time API call for budget check

ERP Returns Result

Pass/Fail/Warning with available amount

What is Sourcing?

Sourcing is the strategic process of finding, evaluating, and selecting suppliers for goods and services. It happens before procurement — you source to find the right supplier, then procure to buy from them.

💡 Sourcing vs Procurement

Sourcing = Strategic (finding suppliers, negotiating prices, running events, awarding contracts). Procurement = Tactical (creating requisitions, issuing POs, receiving goods, paying invoices). Sourcing sets up the contracts and pricing that procurement then uses.

Sourcing Lifecycle

1

Request

Business need identified

2

Event Creation

RFI/RFP/RFQ/Auction created

3

Supplier Invitation

Suppliers invited to participate

4

Bid Collection

Suppliers submit responses

5

Bid Analysis

Evaluate and score bids

6

Negotiation

Negotiate terms and pricing

7

Award

Select winning supplier(s)

8

Contract

Execute contract, create catalog

Sourcing Event Types

RFI (Request for Information)

Used to gather information about supplier capabilities, not for pricing.

When to Use:

  • Market research
  • Supplier qualification
  • Understanding available solutions

Key Fields:

Company size, certifications, capabilities, references

RFP (Request for Proposal)

Used when you need detailed proposals including pricing, approach, and qualifications.

When to Use:

  • Complex services
  • Multi-criteria evaluation
  • When approach matters as much as price

Key Fields:

Pricing, methodology, timeline, team, case studies

RFQ (Request for Quotation)

Used when specifications are clear and you need competitive pricing.

When to Use:

  • Well-defined requirements
  • Price-driven decisions
  • Standard goods/services

Key Fields:

Unit price, volume discounts, delivery terms, payment terms

Reverse Auction

Live, real-time bidding where suppliers compete by lowering prices.

When to Use:

  • Commodity items
  • Price is the primary differentiator
  • Multiple qualified suppliers exist

Key Fields:

Starting price, bid decrement, auction duration, reserve price

Bid Analysis & Scoring

Coupa provides weighted scoring to evaluate bids across multiple criteria.

Example: IT Services RFP Scoring

Supplier Price (40%) Technical (30%) Experience (20%) References (10%) Total Score
Supplier A 85/100 90/100 80/100 95/100 86.5
Supplier B 95/100 75/100 70/100 80/100 82.5
Supplier C 70/100 95/100 90/100 85/100 83.5

Winner: Supplier A — Best overall score despite not having the lowest price.

Auction Types

Reverse Auction

Suppliers compete by lowering their prices. The lowest bid wins.

Best For:

Commodities, standard goods, price-sensitive categories

Key Settings:

Bid decrement, minimum bid, auction duration, extension rules

Forward Auction

Buyers compete by raising their offers. The highest bid wins.

Best For:

Selling surplus assets, liquidation, excess inventory

Key Settings:

Starting price, bid increment, reserve price

Multi-Lot Auction

Multiple items/lots auctioned simultaneously. Suppliers can bid on any combination.

Best For:

Bundled procurement, category-wide sourcing

Key Settings:

Lot definitions, bid rules per lot, award strategy

Sealed Bid

Suppliers submit bids without seeing competitors' prices. All bids revealed at closing.

Best For:

Government contracts, regulated industries, preventing collusion

Key Settings:

Submission deadline, reveal time, evaluation criteria

Sourcing Data Model

sourcing_event

  • id (PK)
  • event_number
  • event_type (RFI/RFP/RFQ/Auction)
  • status (draft, open, closed, awarded)
  • owner_id (FK -> users)
  • start_date, end_date
1 : N

sourcing_lines

  • id (PK)
  • event_id (FK)
  • description
  • quantity
  • uom
  • specifications
1 : N

sourcing_responses

  • id (PK)
  • event_id (FK)
  • supplier_id (FK)
  • status (submitted, withdrawn)
  • total_score
  • submitted_at

Scenario 1: IT Equipment Procurement ($500K)

A large organization needs to procure IT equipment for a new office opening. This is a high-value, multi-line procurement with complex approvals and budget considerations.

Background

Company: TechCorp Inc. | Budget: $500,000 | Timeline: 6 weeks | Supplier: Dell Technologies (contracted)

End-to-End Flow

Day 1: Requisition Created

Requester: John Smith (IT Manager)

Lines: 50 Laptops ($1,200 ea), 50 Monitors ($400 ea), 50 Docking Stations ($200 ea)

Total: $90,000

Day 1-2: Approval Chain

IT Director ($90K > $50K threshold)

Finance Director ($90K > $75K threshold)

CFO ($90K > $100K threshold — not triggered)

Day 3: Budget Check

IT Cost Center Budget: $500,000

Existing Commitments: $200,000

Available: $300,000

Result: PASS (Request $90K < Available $300K)

Day 4: PO Generated

PO-005678 sent to Dell via cXML

Contract price applied from existing agreement

Delivery: 3 weeks

Day 25: Goods Received

Partial receipt: 30 laptops, 30 monitors, 30 docks

Remaining: 20 of each (backordered)

Day 26: Invoice Matched

3-way match: Invoice $54,000 vs PO $54,000 vs Receipt $54,000

Match: PASS

Day 30: Remaining Received

Final 20 units received and receipt created

Second invoice for $36,000 matched and approved

Scenario 2: Marketing Agency Services (Non-Catalog)

Marketing department needs to engage a creative agency for a campaign. This is a services procurement with no catalog, milestone-based billing, and custom fields.

Key Characteristics

  • Type: Services (non-catalog, free-text requisition)
  • Supplier: CreativeWorks Agency (new supplier, requires onboarding)
  • Amount: $75,000
  • Duration: 6-month engagement
  • Flex Fields: Campaign Name, Agency Contact, SOW Reference

Special Considerations

  • Supplier onboarding triggered automatically (new supplier > $10K)
  • Legal approval required (services contract > $50K)
  • 2-way match (no receipt required for services)
  • Milestone-based invoicing: $25K kickoff, $25K mid-point, $25K completion

Scenario 3: Emergency Procurement (Break-Fix)

A critical server has failed and needs immediate replacement. Standard procurement timelines don't apply.

Key Characteristics

  • Urgency: Critical — production system down
  • Amount: $35,000 (server replacement)
  • Supplier: Pre-approved emergency vendor list
  • Approval: Expedited (single approver: IT VP)

Emergency Workflow

Hour 0: Incident Reported

Server down, production impacted

Hour 1: Emergency Requisition

Flagged as "Emergency" via flex field

Standard approval rules bypassed

Hour 1: Expedited Approval

Routed to IT VP only (emergency rule)

Budget check: Warning (not block)

Hour 2: PO Issued

PO sent via email (fastest method)

Supplier confirms same-day delivery

Hour 8: Server Installed

Receipt created, production restored

Scenario 4: Multi-Currency Global Procurement

A multinational company procures equipment across multiple countries with different currencies and tax regimes.

Key Characteristics

Line Description Supplier Currency Amount USD Equivalent
1 Manufacturing Equipment Siemens AG (Germany) EUR €150,000 $163,500
2 Raw Materials Tata Steel (India) INR ₹5,000,000 $60,240
3 Software Licenses Microsoft (USA) USD $45,000 $45,000
Total $268,740

Key Considerations

  • Exchange rates locked at PO creation date
  • Each line may have different tax treatment (VAT, GST, Sales Tax)
  • PO may be split by business entity for ERP sync
  • Invoice matching uses PO currency, not functional currency

Scenario 5: Contract Compliance & Maverick Spend

Analysis reveals that 30% of IT spend is going to non-contracted suppliers (maverick spend). The organization wants to enforce contract compliance.

Problem

Users are creating free-text requisitions for laptops from Amazon instead of using the contracted Dell catalog. This results in 15-20% higher prices and loss of volume discounts.

Solution

Step 1: Identify Maverick Spend

Report: Spend by supplier for "IT Equipment" commodity

Result: 30% non-contracted, 70% contracted

Step 2: Configure Conditions

IF commodity = "IT Equipment" AND supplier != contracted THEN require VP approval

Step 3: Catalog Promotion

Make Dell catalog the default search result for IT Equipment

Hide non-catalog option for contracted categories

Step 4: Monitor & Report

Monthly maverick spend dashboard

Target: Reduce from 30% to <5% in 6 months

Scenario 6: Blanket PO with Multiple Releases

An organization has an annual agreement with an office supplies supplier and uses a blanket PO to manage releases throughout the year.

Blanket PO Setup

Field Value
PO NumberPO-BLK-002345
SupplierOfficeMax Business Solutions
Total Amount$250,000
Valid FromJanuary 1, 2024
Valid ToDecember 31, 2024
Release TypeAmount-based

Release History

Release Date Amount Remaining Description
R1Jan 15$35,000$215,000Q1 office supplies
R2Mar 1$42,000$173,000Furniture for new floor
R3May 15$28,000$145,000Printer toner bulk order
R4Jul 1$55,000$90,000Back-to-school supplies
R5Sep 15$45,000$45,000Q4 supplies
R6Nov 1$45,000$0Year-end supplies

Integration Architecture

Coupa is designed to integrate with existing ERP systems. The typical pattern is Coupa as the procurement front-end, ERP as the financial system of record.

ERP Integration

ERP → Coupa (Master Data)

  • Employees/Users
  • Cost Centers / GL Accounts
  • Suppliers
  • Commodities
  • Currencies / Exchange Rates
  • Projects / WBS Elements

Coupa → ERP (Transactions)

  • Purchase Orders
  • Receipts
  • Invoices
  • Requisition approvals
  • Supplier updates

Integration Methods

REST API

Real-time, request-response pattern

Best For:

  • Real-time lookups
  • On-demand data sync
  • Custom integrations
  • Low-volume transactions

Format:

XML (primary) and JSON

Rate Limits:

Configurable per instance

Integration Framework (IF)

Batch processing via SFTP

Best For:

  • Bulk data loads
  • Scheduled syncs
  • Large master data updates
  • High-volume transactions

Format:

XML files dropped to SFTP

Schedule:

Configurable (hourly, daily, etc.)

Webhooks

Event-driven push notifications

Best For:

  • Real-time event notifications
  • Triggering external workflows
  • Async processing

Events:

PO created, Invoice approved, etc.

Format:

JSON payload to callback URL

cXML

Industry standard for B2B procurement

Best For:

  • Punchout catalogs
  • PO transmission
  • Invoice exchange
  • Supplier integration

Format:

cXML 1.2.042+

Transport:

HTTP POST with shared secret auth

Key API Endpoints

Resource GET POST PUT DELETE
/api/users List users Create user Update user Deactivate
/api/requisitions List reqs Create req Update req Cancel req
/api/purchase_orders List POs Create PO Update PO Cancel PO
/api/invoices List invoices Create invoice Update invoice Void invoice
/api/suppliers List suppliers Create supplier Update supplier Deactivate
/api/receipts List receipts Create receipt Update receipt
/api/contracts List contracts Create contract Update contract Terminate
/api/cost_centers List cost centers Create cost center Update cost center Deactivate

Integration Patterns

Pattern 1: Master Data Sync

ERP
Middleware
Coupa API

Implementation:

  1. ERP exports master data to staging table
  2. Middleware transforms to Coupa XML format
  3. API POST/PUT to Coupa endpoints
  4. Handle response, log errors
  5. Schedule: Daily or real-time on change

Pattern 2: PO Export to ERP

Coupa
Webhook/IF
ERP

Implementation:

  1. PO approved in Coupa
  2. Webhook triggers or IF picks up new PO
  3. Transform to ERP format (IDoc, BAPI, etc.)
  4. Send to ERP, capture PO number
  5. Update Coupa PO with ERP reference

Pattern 3: Invoice Export

Coupa
IF (SFTP)
ERP

Implementation:

  1. Invoice approved in Coupa
  2. IF exports invoice XML to SFTP
  3. ERP picks up file, creates vendor invoice
  4. ERP processes payment
  5. Payment status synced back to Coupa (optional)

Error Handling & Retry Logic

Robust integration requires proper error handling. Coupa APIs return standard HTTP status codes.

Status Code Meaning Action
200 OK Success Process response
201 Created Resource created Capture new resource ID
400 Bad Request Invalid XML/JSON or missing required fields Fix payload, don't retry
401 Unauthorized Invalid API key Check credentials
404 Not Found Resource doesn't exist Check ID, don't retry
422 Unprocessable Validation error (business rules) Review error details, fix data
429 Too Many Requests Rate limit exceeded Implement backoff, retry later
500 Server Error Internal server error Retry with exponential backoff

SAP to Coupa Mappings

When integrating with SAP, understanding which SAP tables map to which Coupa objects is critical for building accurate integrations.

Users/Employees

Coupa Field SAP Table SAP Field Notes
loginPA0001 (HR Master)PERNR (Personnel Number)Primary key for user sync
firstnamePA0002 (Personal Data)VORNA (First Name)
lastnamePA0002NACHN (Last Name)
emailPA0105 (Communications)USRID_LONG (Email)Subtype 0010
employee_numberPA0001PERNRExternal ID reference
manager.loginPA0001STELL (Position) → PA0001-ORGEHResolve via org structure

Cost Centers

Coupa Field SAP Table SAP Field Notes
codeCSKS (Cost Center Master)KOSTL (Cost Center)Primary key
nameCSKT (Cost Center Text)LTEXT (Long Text)Language-dependent
activeCSKSXLOEK (Deletion Flag)X = inactive
parent.codeCSKSKHINR (Cost Center Group)Hierarchy parent

Purchase Orders

Coupa Field SAP Table SAP Field Notes
po_numberEKKO (PO Header)EBELN (PO Number)Primary key
supplier.numberEKKOLIFNR (Vendor)Links to LFA1
lines.descriptionEKPO (PO Items)TXZ01 (Short Text)
lines.quantityEKPOMENGE (Quantity)
lines.priceEKPONETPR (Net Price)In PO currency
lines.accountings.cost_centerEKKN (Account Assignment)KOSTL (Cost Center)
lines.accountings.gl_codeEKKNSAKTO (G/L Account)
lines.accountings.wbsEKKNPS_PSP_PNR (WBS Element)

Oracle EBS to Coupa Mappings

Suppliers

Coupa Field Oracle Table Oracle Field Notes
nameAP_SUPPLIERSVENDOR_NAMEPrimary supplier name
numberAP_SUPPLIERSSEGMENT1Supplier number
tax_idAP_SUPPLIERSTAXPAYER_ID
sites.addressAP_SUPPLIER_SITES_ALLADDRESS_LINE1-4Site-level addresses
sites.payment_termsAP_SUPPLIER_SITES_ALLTERMS_IDLinks to AP_TERMS

Invoices

Coupa Field Oracle Table Oracle Field Notes
invoice_numberAP_INVOICES_ALLINVOICE_NUMSupplier invoice number
invoice_dateAP_INVOICES_ALLINVOICE_DATE
total_amountAP_INVOICES_ALLINVOICE_AMOUNT
lines.amountAP_INVOICE_LINES_ALLAMOUNT
lines.accounting.gl_codeAP_INVOICE_DISTRIBUTIONS_ALLDIST_CODE_COMBINATION_IDLinks to GL_CODE_COMBINATIONS

NetSuite to Coupa Mappings

Coupa Object NetSuite Record Key Fields Integration Method
UsersEmployeeentityId, email, supervisorRESTlet / SuiteTalk
Cost CentersDepartmentname, externalid, parentRESTlet
SuppliersVendorentityId, companyname, termsSuiteTalk
POsPurchaseOrdertranId, entity, item sublistSuiteTalk
InvoicesVendorBilltranId, entity, amountRESTlet

Integration Best Practices

💡 Field Mapping Strategy

  • Always use external IDs for cross-referencing between systems
  • Map at the field level first, then build transformation logic
  • Document all mappings in a shared spreadsheet with version control
  • Test with real data from production (anonymized) before go-live
  • Handle null values — ERP fields may be empty, Coupa may require them

💡 Common Pitfalls

  • Date formats: SAP uses YYYYMMDD, Coupa uses ISO 8601 (YYYY-MM-DD)
  • Decimal separators: Some ERPs use comma (1.000,00), Coupa uses dot (1,000.00)
  • Character encoding: Ensure UTF-8 throughout the pipeline
  • Truncation: Coupa field lengths may differ from ERP field lengths
  • Code vs Description: Always sync both code AND description fields

Implementation Phases

Coupa implementations follow a structured methodology. Understanding each phase helps you plan, execute, and deliver successful projects.

1

Discover

Weeks 1-2

Activities:

  • Business process workshops
  • Current state assessment
  • Requirements gathering
  • Integration discovery
  • Stakeholder alignment

Deliverables:

  • Business requirements document
  • Integration requirements
  • Project plan
2

Design

Weeks 3-4

Activities:

  • Solution design workshops
  • Approval workflow design
  • Integration architecture
  • Data migration strategy
  • Configuration workbook

Deliverables:

  • Solution design document
  • Configuration workbook
  • Integration design
3

Configure

Weeks 5-8

Activities:

  • System configuration
  • Integration development
  • Catalog setup
  • Approval rule configuration
  • Unit testing

Deliverables:

  • Configured Coupa instance
  • Working integrations
  • Unit test results
4

Test

Weeks 9-10

Activities:

  • System integration testing (SIT)
  • User acceptance testing (UAT)
  • Performance testing
  • Security testing
  • Defect resolution

Deliverables:

  • Test scripts and results
  • UAT sign-off
  • Defect log
5

Deploy

Weeks 11-12

Activities:

  • Production setup
  • Data migration
  • End-user training
  • Cutover planning
  • Go-live support

Deliverables:

  • Production instance
  • Training materials
  • Cutover plan
6

Optimize

Ongoing

Activities:

  • Hypercare support
  • Performance monitoring
  • Continuous improvement
  • Additional rollouts
  • Enhancement requests

Deliverables:

  • Hypercare report
  • Optimization recommendations
  • Roadmap for phase 2

Configuration Workbook

The Configuration Workbook is the single source of truth for all Coupa configuration decisions. As a developer, you'll reference this constantly.

Organizational Setup

  • Business entities and hierarchy
  • Departments and cost centers
  • Locations and addresses
  • Currencies and exchange rates

Procurement Settings

  • Requisitioning preferences
  • PO templates and formats
  • Receipt requirements
  • Invoice matching rules

Approval Rules

  • Rule conditions and priorities
  • Approval hierarchies
  • Delegation rules
  • Escalation policies

Integration Specifications

  • Master data sync mappings
  • Transaction export formats
  • Error handling procedures
  • Schedule and frequency

Data Migration Strategy

Data migration is one of the most critical aspects of implementation. Poor data migration leads to go-live failures.

1. Data Extraction

Extract from legacy system (ERP, spreadsheets)

2. Data Cleansing

Remove duplicates, fix formatting, validate data

3. Data Mapping

Map legacy fields to Coupa fields

4. Data Transformation

Convert to Coupa XML/CSV format

5. Data Load

Load into Coupa via API or IF

6. Data Validation

Verify counts, spot-check records

Migration Order (Critical!):

  1. Account Types
  2. Cost Centers
  3. Commodities
  4. Users
  5. Suppliers
  6. Catalogs
  7. Contracts
  8. Open POs
  9. Open Invoices

Testing Strategy

Unit Testing

Individual configuration items tested in isolation

Examples:

  • Create requisition with catalog item
  • Create free-text requisition
  • Verify approval routing

Integration Testing

End-to-end flows across systems

Examples:

  • ERP → Coupa user sync
  • Coupa PO → ERP
  • Coupa Invoice → ERP

UAT

Business users validate real-world scenarios

Examples:

  • Full procure-to-pay cycle
  • Exception scenarios
  • Approval delegation

Core Transaction Flow

Understanding how data flows through Coupa's tables is essential for debugging, reporting, and integration development.

users

Requester, approver, supplier contacts

↓ creates

requisitions

Header: status, requester, business entity

↓ contains

line_items

Description, quantity, price, commodity

↓ has

accountings

Cost center, GL account, project, amount

↓ approved becomes

purchase_orders

Header: supplier, ship-to, payment terms

↓ contains

po_lines

Line details, received_qty, invoiced_qty

↓ received creates

receipts

Receipt header and line details

↓ invoiced creates

invoices

Invoice header, matching status

↓ exported to

ERP

Financial system of record

Key Table Relationships

Requisition Relationships

requisitions
  ├── requester_id → users.id
  ├── business_entity_id → business_entities.id
  ├── department_id → departments.id
  └── line_items
        ├── commodity_id → commodities.id
        ├── uom_id → uoms.id
        ├── account_type_id → account_types.id
        └── accountings
              ├── cost_center_id → cost_centers.id
              ├── project_id → projects.id
              └── gl_account → string

PO Relationships

purchase_orders
  ├── supplier_id → suppliers.id
  ├── ship_to_address_id → addresses.id
  ├── bill_to_address_id → addresses.id
  ├── payment_term_id → payment_terms.id
  ├── currency_id → currencies.id
  └── po_lines
        ├── commodity_id → commodities.id
        ├── uom_id → uoms.id
        └── po_line_accountings
              ├── cost_center_id → cost_centers.id
              └── project_id → projects.id

Invoice Relationships

invoices
  ├── supplier_id → suppliers.id
  ├── purchase_order_id → purchase_orders.id
  ├── payment_term_id → payment_terms.id
  ├── currency_id → currencies.id
  └── invoice_lines
        ├── po_line_id → po_lines.id
        ├── receipt_line_id → receipt_lines.id
        └── invoice_line_accountings
              ├── cost_center_id → cost_centers.id
              └── gl_account → string

Custom Fields & Flex Fields

Coupa supports custom fields on most objects. These are stored in a flexible schema pattern.

How Custom Fields Work:

  1. Admin creates custom field in UI (e.g., "Project Code")
  2. Field is stored in custom_fields table with metadata
  3. Values stored in custom_field_values linked to parent object
  4. API exposes custom fields as nested XML/JSON

💡 API Example with Custom Fields

<requisition>
  <title>Office Supplies</title>
  <custom-fields>
    <custom-field>
      <name>Project Code</name>
      <value>PRJ-2024-001</value>
    </custom-field>
    <custom-field>
      <name>Budget Owner</name>
      <value>Jane Smith</value>
    </custom-field>
  </custom-fields>
</requisition>

Coupa Analytics

Coupa provides built-in analytics dashboards for spend visibility, compliance tracking, and operational metrics.

Spend Analysis

  • Spend by supplier
  • Spend by category
  • Spend by department
  • Spend trends over time
  • Maverick spend identification

Procurement Operations

  • Requisition cycle time
  • Approval cycle time
  • PO processing time
  • Invoice processing time
  • Exception rates

Compliance

  • PO compliance rate
  • Contract utilization
  • Catalog adoption rate
  • Supplier onboarding status
  • Approval policy compliance

Supplier Performance

  • On-time delivery rate
  • Quality metrics
  • Invoice accuracy
  • Response times
  • Scorecard ratings

BIRT Report Builder

Coupa includes a BIRT (Business Intelligence and Reporting Tools) report builder for custom reports.

Report Types:

  • Tabular Reports: Standard table with filters and sorting
  • Summary Reports: Aggregated data with groupings
  • Chart Reports: Visual representations (bar, pie, line)
  • Custom SQL Reports: Advanced reports using direct SQL queries

💡 Developer Note

BIRT reports can be scheduled and exported via API. The report output can be consumed by external BI tools or data warehouses. Report definitions are stored in the reports table and can be managed via the /api/reports endpoint.

Data Export Options

CSV Export

Manual export from any list view

Use Case:

Ad-hoc analysis, Excel reporting

Scheduled Reports

Automated report delivery via email

Use Case:

Regular stakeholder updates

API Data Pull

Programmatic access to all data

Use Case:

Data warehouse, custom dashboards

Coupa Intelligence

Advanced analytics with benchmarking

Use Case:

Strategic insights, peer comparison

Common Integration Issues

API Authentication Failures

Symptoms:

  • 401 Unauthorized responses
  • API key rejected

Root Causes:

  • Expired or revoked API key
  • Wrong API key format in header
  • IP whitelist blocking requests

Resolution:

  1. Verify API key in Coupa (Setup > API Keys)
  2. Check header: X-COUPA-API-KEY
  3. Verify IP is whitelisted
  4. Regenerate key if compromised

Data Sync Failures

Symptoms:

  • Records not appearing in Coupa
  • Stale data in reports

Root Causes:

  • Integration job failed silently
  • XML/JSON parsing errors
  • Required field missing in payload

Resolution:

  1. Check Integration Framework logs
  2. Validate payload against schema
  3. Re-run failed job manually
  4. Set up alerting for job failures

Timeout Issues

Symptoms:

  • API requests timing out after 30s
  • Integration jobs hanging

Root Causes:

  • Large payload (> 10MB)
  • Network latency
  • Coupa platform slowdown

Resolution:

  1. Implement pagination (max 100 per page)
  2. Use Integration Framework for bulk loads
  3. Add retry logic with exponential backoff
  4. Check Coupa status page for outages

Approval Debugging

Rules Not Firing

Checklist:

  1. Is the rule active? (check status)
  2. Is the priority lower than competing rules?
  3. Do the condition clauses match the transaction data?
  4. Are flex field values populated before rule evaluation?
  5. Check the rule evaluation log in Coupa admin

Wrong Approver

Checklist:

  1. Verify the approver's manager chain in user profile
  2. Check for active delegations
  3. Review approval group membership
  4. Confirm the rule is routing to the correct attribute
  5. Check if substitute approver is configured

Delegation Issues

Checklist:

  1. Is the delegation date range active?
  2. Does the delegatee have required permissions?
  3. Is there a conflicting delegation?
  4. Check delegation scope (all approvals vs specific types)

Budget Issues

Budget Not Checking

Checklist:

  1. Is budget checking enabled for this business entity?
  2. Are budgets loaded for the correct period?
  3. Does the accounting distribution match a budget bucket?
  4. Check budget hierarchy configuration

Incorrect Budget Consumption

Checklist:

  1. Verify commitment vs actual tracking
  2. Check for duplicate POs consuming budget
  3. Review cancelled POs — are commitments released?
  4. Verify exchange rate used for multi-currency

Override Problems

Checklist:

  1. Does the user have override permission?
  2. Is the override workflow configured?
  3. Check override approval chain
  4. Review audit log for override history

Invoice Matching Problems

Match Failures

Common Causes:

  • Invoice price differs from PO price (beyond tolerance)
  • Invoice quantity > received quantity
  • Wrong PO referenced on invoice
  • Missing receipt for 3-way match

Resolution:

  1. Compare invoice line to PO line details
  2. Check receipt quantities match
  3. Review tolerance settings
  4. Create missing receipt if applicable

Exception Handling

Resolution Flow:

  1. Identify exception type (price, quantity, missing)
  2. Determine root cause (supplier error, system error)
  3. Choose resolution: approve variance, update PO, reject
  4. Document resolution for audit trail
  5. Notify supplier if correction needed

Tolerance Issues

Checklist:

  1. Review tolerance configuration (Setup > Tolerances)
  2. Check line-level vs header-level tolerances
  3. Verify currency conversion is correct
  4. Consider if tolerances are too strict

Performance Troubleshooting

Slow Pages

Causes:

  • Large data sets in list views
  • Complex custom reports
  • Browser cache issues

Fixes:

  • Add filters to narrow result sets
  • Use saved searches instead of ad-hoc queries
  • Clear browser cache

API Latency

Causes:

  • Large payloads without pagination
  • Too many concurrent requests
  • Network issues

Fixes:

  • Implement pagination (page=1&per_page=100)
  • Use field filtering (?fields=id,number,status)
  • Implement connection pooling

Report Timeouts

Causes:

  • Query spans too much data
  • Complex joins in BIRT report
  • Peak usage hours

Fixes:

  • Add date range filters
  • Schedule reports for off-peak hours
  • Use data extracts instead of live queries

Debug Checklist

Follow this step-by-step process when troubleshooting any Coupa issue:

Step 1: Reproduce the Issue

Can you consistently reproduce the problem?

Step 2: Check Logs

Review Integration Framework logs, API logs, and audit trails

Step 3: Isolate the Component

Is it UI, API, integration, or data issue?

Step 4: Check Configuration

Review relevant settings, rules, and mappings

Step 5: Test in Sandbox

Reproduce in non-production environment

Step 6: Apply Fix

Implement solution, test, and deploy

Step 7: Document

Record root cause, fix, and prevention steps

Lab 1: Create Your First Requisition

Objective

Create a requisition using both the UI and the API, then verify it appears in the system.

Step 1: UI Creation

  1. Log into your Coupa sandbox instance
  2. Click "Create Requisition" from the home page
  3. Select a catalog item or enter free-text
  4. Add accounting: select a cost center and GL account
  5. Submit the requisition
  6. Verify the requisition number is generated

Step 2: API Creation

curl -X POST https://your-instance.coupahost.com/api/requisitions \
  -H "X-COUPA-API-KEY: your_key" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0" encoding="UTF-8"?>
<requisition>
  <requester>
    <login>lab.user</login>
  </requester>
  <title>Lab Test Requisition</title>
  <line-items>
    <line-item>
      <description>Lab Test Item</description>
      <quantity>1</quantity>
      <price>100.00</price>
      <uom><code>EA</code></uom>
      <accountings>
        <accounting>
          <cost-center><code>CC-LAB</code></cost-center>
          <quantity>1</quantity>
          <amount>100.00</amount>
        </accounting>
      </accountings>
    </line-item>
  </line-items>
</requisition>'

Step 3: Verification

curl -X GET https://your-instance.coupahost.com/api/requisitions?title=Lab+Test \
  -H "X-COUPA-API-KEY: your_key"

Verify the response contains your requisition with correct details.

Lab 2: Configure Approval Rules

Objective

Set up approval rules using the Conditions Framework and test them with sample transactions.

Step 1: Create Approval Rule

  1. Navigate to Setup > Approval Rules
  2. Create a new rule: "IT Equipment Approval"
  3. Set condition: IF commodity = "IT Equipment" AND amount > 5000
  4. Set action: Add approver = "IT Director"
  5. Set priority: 10
  6. Activate the rule

Step 2: Test with Low-Value Req

Create a requisition for IT Equipment at $3,000. Verify the IT Director is NOT added as approver (condition not met).

Step 3: Test with High-Value Req

Create a requisition for IT Equipment at $8,000. Verify the IT Director IS added as approver (condition met).

Step 4: Verify via API

curl -X GET https://your-instance.coupahost.com/api/approval-rules \
  -H "X-COUPA-API-KEY: your_key"

Lab 3: Build an Integration

Objective

Build a simple REST API integration that syncs cost centers from a CSV file to Coupa.

Step 1: Prepare Data

code,name,active,parent_code
CC-100,Marketing,true,
CC-200,Sales,true,
CC-300,Engineering,true,CC-100

Step 2: Write Integration Script

import requests
import csv

COUPA_URL = "https://your-instance.coupahost.com"
API_KEY = "your_api_key"
headers = {
    "X-COUPA-API-KEY": API_KEY,
    "Content-Type": "application/xml"
}

with open("cost_centers.csv") as f:
    reader = csv.DictReader(f)
    for row in reader:
        xml = """<cost-center>
  <code>""" + row['code'] + """</code>
  <name>""" + row['name'] + """</name>
  <active>""" + row['active'] + """</active>
</cost-center>"""
        
        response = requests.post(
            COUPA_URL + "/api/cost_centers",
            headers=headers,
            data=xml
        )
        print(row['code'] + ": " + str(response.status_code))

Step 3: Run and Verify

python sync_cost_centers.py
# Expected output:
# CC-100: 201
# CC-200: 201
# CC-300: 201

Lab 4: Test Invoice Matching

Objective

Test both 2-way and 3-way matching scenarios and observe exception handling.

Scenario A: 3-Way Match (Success)

  1. Create PO for 10 units at $100 each
  2. Create receipt for 10 units
  3. Create invoice for 10 units at $100 each
  4. Verify: Match PASS, invoice auto-approved

Scenario B: 3-Way Match (Quantity Variance)

  1. Create PO for 10 units at $100 each
  2. Create receipt for 8 units
  3. Create invoice for 10 units at $100 each
  4. Verify: Match FAIL (invoice qty 10 > receipt qty 8)
  5. Resolve: Approve variance or create additional receipt

Scenario C: 2-Way Match (Services)

  1. Create PO for consulting services ($5,000)
  2. Do NOT create receipt (2-way match)
  3. Create invoice for $5,000
  4. Verify: Match PASS (no receipt required)

Lab 5: Create a Sourcing Event

Objective

Run a complete RFI to Award flow for office supplies.

Step 1: Create RFI

  1. Navigate to Sourcing > Create Event
  2. Select RFI type
  3. Add line items: Paper, Pens, Toner
  4. Invite 3 suppliers
  5. Publish event

Step 2: Collect Responses

Simulate supplier responses with different capabilities and pricing.

Step 3: Analyze and Award

  1. Compare responses side by side
  2. Score each supplier
  3. Award to best supplier
  4. Create contract from award

Lab 6: Debug a Broken Integration

Objective

Given a failing integration, identify and fix the root cause.

Scenario: User Sync Failing

Your integration that syncs users from the ERP to Coupa has started failing. Follow the debug checklist:

  1. Reproduce: Run the integration manually. Error: 422 Unprocessable Entity
  2. Check Logs: Error detail: "Validation failed: Email has already been taken"
  3. Isolate: The issue is with specific user records, not the entire sync
  4. Investigate: ERP has duplicate email addresses for 3 users
  5. Fix: Update ERP data to use unique emails, re-run sync
  6. Prevent: Add email uniqueness validation in the integration layer

Scenario: PO Not Syncing to ERP

  1. Reproduce: Approved PO in Coupa not appearing in ERP
  2. Check Logs: IF job shows "Success" but ERP shows no record
  3. Isolate: The XML is being generated but ERP is rejecting it silently
  4. Investigate: ERP expects a different date format (YYYYMMDD vs ISO 8601)
  5. Fix: Update transformation logic to convert date format
  6. Prevent: Add ERP response validation in the middleware

Common Client Requirements

Below are the most frequently requested requirements from clients during Coupa implementations, along with recommended solutions.

Requirement 1: Multi-level Approval

Client asks: "We need 5 levels of approval based on amount thresholds."

Solution: Create 5 approval rules with amount-based conditions. Set priorities 1-5. Use sequential approval type.

Requirement 2: Budget Integration

Client asks: "We need real-time budget checking against our ERP."

Solution: Implement real-time API call from Coupa to ERP during requisition submission. Return pass/fail/warning response.

Requirement 3: Custom Fields

Client asks: "We need 20 custom fields on requisitions."

Solution: Use Flex Fields at header, line, and accounting levels. Group related fields. Use conditions for visibility.

Requirement 4: Supplier Onboarding

Client asks: "Suppliers should register themselves."

Solution: Enable CSP self-registration. Configure required fields. Set up approval workflow for new supplier activation.

Requirement 5: Catalog Management

Client asks: "We have 50,000 catalog items from 10 suppliers."

Solution: Use punchout for large catalogs, hosted catalogs for smaller ones. Implement catalog search optimization.

Requirement 6: Reporting

Client asks: "We need custom dashboards for each department."

Solution: Use Coupa Analytics with role-based dashboards. Create BIRT reports for complex requirements.

Requirement 7: Multi-entity

Client asks: "We have 5 legal entities with different approval rules."

Solution: Configure business entities in Coupa. Create entity-specific approval rules and integration mappings.

Requirement 8: Change Management

Client asks: "How do we train 5,000 users?"

Solution: Develop role-based training materials. Use sandbox for hands-on practice. Create quick reference guides.

Coupa vs Ariba vs Jaggaer

Understanding the competitive landscape helps you position Coupa effectively during implementations.

Feature Coupa SAP Ariba Jaggaer
Deployment Cloud-native SaaS Cloud (with on-prem options) Cloud and on-premise
User Experience Consumer-grade, intuitive Enterprise-focused, complex Moderate complexity
Implementation Time 8-16 weeks 16-32 weeks 12-24 weeks
Integration Open API, flexible Best with SAP, limited others Good API support
Community 1000+ customers, benchmarks Large network (Ariba Network) Smaller community
Pricing Subscription-based Higher TCO Mid-range
Sourcing Full suite (RFI/RFP/Auction) Strong sourcing capabilities Strong sourcing focus
Best For Mid-market to enterprise Large SAP-centric enterprises Manufacturing, indirect spend

Glossary of Coupa Terminology

BSM

Business Spend Management — Coupa's overarching platform category

PO

Purchase Order — External commitment to a supplier

Req

Requisition — Internal request to purchase goods/services

CSP

Coupa Supplier Portal — Free portal for supplier interactions

cXML

Commerce XML — Standard protocol for B2B procurement

Punchout

Browsing a supplier's catalog from within Coupa

3-Way Match

Matching Invoice + PO + Receipt before payment

Maverick Spend

Spending outside of contracted suppliers or approved channels

Flex Fields

Custom fields at header, line, or accounting level

IF

Integration Framework — Batch processing via SFTP

Blanket PO

PO with total amount/quantity released over multiple orders

Commodity

Classification code for goods/services (like UNSPSC)

Change Order

Revision to an existing PO after it's been sent

ASN

Advance Ship Notice — Supplier notification of incoming shipment

EDI

Electronic Data Interchange — Standard B2B document format

GL Account

General Ledger Account — Financial account for chargeback

Quick Reference Cards

Approval Quick Ref

  • Sequential: Approvers in order
  • Parallel: Any approver can approve
  • Unanimous: All must approve
  • Priority: Lower number = higher priority
  • Delegation: Temporary or permanent

Integration Quick Ref

  • REST API: Real-time, XML/JSON
  • IF (SFTP): Batch, XML files
  • Webhooks: Event-driven, JSON
  • cXML: Supplier integration
  • Auth: X-COUPA-API-KEY header

Data Model Quick Ref

  • ReqPOReceiptInvoice
  • Each has header + lines + accountings
  • Foreign keys link to users, suppliers, cost centers
  • Flex fields at 3 levels (header/line/accounting)

Implementation Best Practices

Start Simple

Don't over-engineer the first release. Start with core procurement (req → PO → receipt → invoice) and add complexity in phases.

Common Mistake:

Trying to replicate every legacy process in Coupa. Instead, adopt Coupa best practices and adapt processes.

Master Data First

Get cost centers, commodities, and account types right before go-live. Bad master data causes 80% of post-go-live issues.

Tip:

Run data validation scripts before loading. Check for duplicates, missing parents, and inactive records.

Approval Simplicity

Keep approval rules simple. Complex approval chains cause delays and user frustration.

Rule of Thumb:

Maximum 3 approval levels. Use amount thresholds and department-based routing.

Integration Testing

Test integrations early and often. Don't wait until UAT to discover integration issues.

Approach:

Build integration test harness that can replay scenarios. Test error handling, not just happy paths.

Change Management

Technical success means nothing without user adoption. Invest in training and communication.

Key Activities:

Executive sponsorship, user champions, hands-on training, quick reference guides.

Performance Monitoring

Monitor API response times, integration job durations, and system performance from day one.

Metrics to Track:

API latency, integration success rate, approval cycle time, exception rate.

Developer Tips

1. Always Use XML for API

While Coupa supports JSON, XML is the primary format and has better documentation. Use XML for production integrations.

2. Handle Pagination

API responses are paginated (default 20 records). Always handle pagination in your integration code.

# Pagination parameters
?page=1&per_page=100
# Max per_page is 100

3. Use External IDs

Store Coupa IDs in your system and use external IDs for cross-referencing. This simplifies troubleshooting.

4. Log Everything

Log all API requests and responses. When things break (and they will), logs are your best friend.

5. Test in Sandbox

Never develop or test against production. Use Coupa's sandbox environment for all development.

6. Understand Timezones

Coupa stores all dates in UTC. Convert to local timezone for display. This causes many integration bugs.

7. Handle Null Values

API responses may contain null values. Your integration code must handle null gracefully.

8. Use Webhooks for Events

Instead of polling, use webhooks for real-time event notifications. More efficient and reliable.

Common Pitfalls to Avoid

⚠ Pitfall 1: Over-Customization

Customizing Coupa beyond its standard capabilities creates upgrade challenges and technical debt.

Solution:

Use configuration over customization. Leverage custom fields, business rules, and workflows before considering code changes.

⚠ Pitfall 2: Ignoring Data Quality

Garbage in, garbage out. Poor master data leads to failed integrations and incorrect reporting.

Solution:

Implement data governance from day one. Validate, cleanse, and deduplicate before loading.

⚠ Pitfall 3: Inadequate Testing

Testing only happy paths means exceptions will break in production.

Solution:

Test edge cases: null values, large payloads, concurrent requests, network failures, and error scenarios.

⚠ Pitfall 4: Poor Error Handling

Integrations that fail silently cause data loss and reconciliation nightmares.

Solution:

Implement retry logic, error logging, alerting, and reconciliation reports. Monitor integration health daily.

Career Path: Developer to Techno-Functional Consultant

Month 1-3: Learn the Platform

  • Complete Coupa Learning Center courses
  • Get hands-on with sandbox environment
  • Understand procurement business processes
  • Learn Coupa UI and navigation

Month 3-6: Build Technical Skills

  • Master Coupa API (REST, XML, JSON)
  • Build sample integrations
  • Understand data model and relationships
  • Learn Integration Framework

Month 6-12: Implementation Experience

  • Join an implementation team
  • Work on configuration and testing
  • Develop integrations for real projects
  • Understand implementation methodology

Year 1-2: Techno-Functional Lead

  • Lead technical workstreams
  • Design integration architectures
  • Mentor junior developers
  • Contribute to solution design

Year 2+: Senior Consultant / Architect

  • Lead full implementations
  • Advise clients on best practices
  • Design complex integration patterns
  • Contribute to Coupa community