Prompt
How do I set up a wholesale pricing engine for contract pricing, approval routing, and multi-currency quotes?
Latest observation
To set up a wholesale pricing engine that supports contract pricing, approval routing, and multi-currency quotes, you want to design it as a small pricing platform rather than a single pricing table. The key is to separate base pricing, customer-specific contract terms, approval logic, and currency conversion/quote generation.
1) Define the core pricing model
Start with these pricing layers, applied in order:
-
List price / base price
- Your default sell price by SKU, category, region, or price book.
-
Contract price
- Customer-specific negotiated prices.
- Can be fixed price, discount %, margin-based, or formula-based.
-
Promotions / special overrides
- Temporary or campaign-specific pricing.
- Usually lower priority than contract pricing unless explicitly allowed.
-
Approval-controlled exceptions
- Any price below floor, above ceiling, or outside contract terms triggers approval.
-
Currency conversion
- Convert the final net price into the quote currency using a controlled FX source and effective date.
A typical order of evaluation is:
Base price → contract adjustment → exception checks → approval routing → currency conversion → quote output
2) Design the pricing data model
You’ll usually need these objects:
Master data
- Customer
- Product / SKU
- Price book
- Currency
- Region / market
- Sales rep / account owner
Pricing objects
-
BasePrice
- SKU
- price
- currency
- valid_from / valid_to
- region / channel
-
Contract
- customer_id
- start_date / end_date
- status
- terms_type
- approved_by
-
ContractLine
- contract_id
- sku or category
- pricing_method: fixed / discount / markup / formula
- value
- min_qty
- max_qty
- currency
- tiering rules
-
PriceRule
- conditions
- priority
- action
- effective dates
-
ApprovalRule
- threshold type
- threshold value
- approver role / queue
- escalation path
-
FXRate
- base_currency
- quote_currency
- rate
- source
- effective_datetime
-
Quote
- customer
- items
- currency
- fx_rate
- pricing status
- approval status
-
QuoteLine
- sku
- qty
- unit_price
- extended_price
- discount
- approval_required flag
3) Set up contract pricing logic
Contract pricing should be computed by matching the most specific applicable rule:
Rule precedence example
- Customer + SKU + quantity tier
- Customer + SKU
- Customer + category
- Customer-wide discount
- Standard price book
Common contract pricing methods
- Fixed price
- SKU X = $12.50 for Customer A
- Percent discount
- 15% off list
- Markup/margin
- Cost + 20%
- Tiered pricing
- 1–99 units = $10, 100–499 = $9.50, 500+ = $9.00
- Formula-based
- Base price + freight + surcharge − negotiated discount
Important controls
- Validity dates
- Minimum order quantity
- Channel restrictions
- Region restrictions
- Product substitutions
- Price floors/ceilings
- Contract versioning
You should also make contracts versioned and auditable so you can see:
- who changed the price
- when it changed
- what approval was used
- what quote used which contract version
4) Build approval routing rules
Approval routing should trigger when pricing falls outside acceptable bounds.
Common approval triggers
- Discount exceeds threshold
- Margin drops below minimum
- Quote value exceeds salesperson limit
- Customer-specific exception to contract
- Manual override by rep
- Foreign currency quote exceeds risk threshold
- Deal is strategic / special project
Example approval workflow
- Sales rep creates quote
- Engine calculates price
- System checks:
- contract compliance
- margin floor
- discount cap
- credit status
- currency exposure
- If no exception → auto-approve quote
- If exception → route to approver based on rule:
- Sales manager
- Pricing analyst
- Finance
- Regional director
- Approver can:
- approve as-is
- reject
- revise price
- request more info
- Final approval is stored with timestamp and comments
Recommended routing design
Use a rules engine or workflow engine with:
- condition evaluation
- approver mapping
- escalation timer
- delegated approval
- audit trail
Example rule:
- If discount > 20%, route to Pricing Manager
- If margin < 10%, route to Finance
- If deal value > $100k, route to Director
- If cross-border quote, route to Finance + FX review
5) Implement multi-currency pricing
Multi-currency quoting needs consistency and auditability.
Key principles
- Store the base price in a single functional currency where possible
- Keep the original pricing currency
- Convert using a defined FX rate source
- Capture the rate used at quote time
- Avoid live FX changes altering already-issued quotes
FX rules to define
- Rate source: Reuters, ECB, Oanda, internal treasury feed
- Rate type:
- spot
- daily average
- month-end
- budget rate
- Rate date:
- quote date
- contract date
- shipment date
- Spread / buffer:
- optionally add FX margin to protect against volatility
- Rounding rules:
- per line or at total level
- Currency-specific precision:
- JPY no decimals, USD 2 decimals, etc.
Suggested flow
- Determine pricing in source currency
- Apply contract logic in source or functional currency
- Pull FX rate valid at quote timestamp
- Convert unit price and/or totals
- Round according to currency rules
- Lock FX rate into the quote
Important choice
Decide whether pricing is:
- native-currency contract pricing
Contract is stored in the customer’s currency - functional-currency pricing with conversion
Pricing stored in one currency and converted at quote time
For most wholesale businesses, the safest approach is:
- maintain contract terms in one currency per contract
- convert to quote currency at quote generation time
- store both the original and converted amounts
6) Create the pricing calculation engine
Your engine should be deterministic and rule-based.
Inputs
- customer
- SKUs
- quantities
- ship-to region
- quote currency
- date/time
- contract ID
- salesperson
- channel
Output
- unit price
- extended price
- discount details
- approval flags
- FX rate used
- final quote totals
Pseudologic
for each quote line:
base = get_base_price(sku, region, date)
contract = find_applicable_contract(customer, sku, qty, date)
price = apply_contract(base, contract)
if price violates floor/margin/discount rules:
flag approval_required
route_approval(rule_set)
converted_price = convert_currency(price, quote_currency, fx_rate_date)
round converted_price by currency rule
sum totals
generate audit log
Best practice
Make the engine:
- rule-driven, not hardcoded
- versioned
- testable with pricing scenarios
- fully auditable
7) Add governance and auditability
This is critical for wholesale pricing.
Track:
- original base price
- all rule hits
- contract version
- approval chain
- FX rate source and timestamp
- manual overrides
- final net price
- quote and order linkage
Also implement:
- role-based access control
- approval delegation
- quote lock after approval
- periodic contract expiry reminders
- pricing exception reporting
8) Integration points
Your pricing engine will usually integrate with:
- CRM for customer and opportunity data
- ERP for product, cost, inventory, and order creation
- CPQ for guided quoting
- Treasury/FX service for exchange rates
- Workflow tool for approvals
- Data warehouse/BI for reporting
9) Recommended technical architecture
A practical setup:
Front end
- Quote creation UI
- Pricing explanation panel
- Approval status dashboard
Backend services
- Pricing service
- Contract service
- Approval workflow service
- FX rate service
- Audit/logging service
Storage
- Relational DB for contracts, quotes, rules
- Immutable audit log
- Cache for frequently used prices and FX rates
Rule engine options
- Custom rules service
- Drools
- Camunda
- Temporal for workflow orchestration
10) Example business rules
Here are example rules you can start with:
- Customer contract price overrides list price
- Any discount > 15% requires manager approval
- Any margin below 12% requires finance approval
- Quotes above $50,000 require director approval
- FX rates are locked at quote creation time
- Quotes expire after 30 days
- Contract prices override promotions unless campaign flag = true
- Manual price override must include reason code
11) Rollout plan
A phased rollout works best:
Phase 1
- Base price books
- Contract price lookup
- Quote generation in one currency
Phase 2
- Approval rules
- Manual overrides
- Audit trail
Phase 3
- Multi-currency support
- FX integration
- Rate locking
Phase 4
- Advanced tiering
- Margin optimization
- Analytics and price recommendations
12) A good starting blueprint
If you want a simple but robust first version, implement these modules:
- Pricing rules engine
- Contract repository
- Approval workflow
- FX conversion service
- Quote auditor
- Admin UI for pricing managers
If you want, I can also provide:
- a sample database schema
- a pricing rules pseudocode implementation
- a workflow diagram
- or a CPQ-style architecture for Salesforce, NetSuite, or SAP
Observation history
Unlock observation history
Create a free Obsurfable account to unlock historical responses, model comparisons, and deeper brand intelligence.
How did Obsurfable measure this prompt?
Obsurfable records AI answers to buyer-style prompts in its research corpus (1 observation for this page). Metrics are distributions over observations, not a single static ranking.
Which AI systems does Obsurfable collect answers from?
OpenAI, ChatGPT, Google, Gemini, Google AI Mode, Anthropic, Claude, Perplexity, Grok, DeepSeek, Mistral, Copilot, and Meta AI.