← Commission Plans /
Multi-Level Company Plan — Edit
Company Type
Commission Calculation Formula — IV Value Based payment-based trigger
① Payment Received
$3,600.00
payment_amount on invoice line
② Exclude Tax
$3,272.73
÷ (1 + tax%) e.g. ÷1.10
×
③ Product IV% (pv)
20%
product.pv set per product
=
④ IV Value (pv_value)
$654.55
net_payment × pv / 100
×
⑤ Agent % (per company)
5% / 2.5% / 1%
percent1 / percent2 / percent3
=
⑥ Commission Earned
$32.73 / $16.36 / $6.55
L1 / L2 / L3 per agent level
// Step-by-step formula
net_payment   = payment_amount / (1 + tax_rate)
pv_value      = net_payment × product.pv / 100
commission_L1 = pv_value × company.percent1 / 100
commission_L2 = pv_value × company.percent2 / 100  // agent.new_parent_id
commission_L3 = pv_value × company.percent3 / 100  // agent.new_parent_id.new_parent_id
Plan Settings
Per-Company Commission Rates
commission_plan_company table
Acme Corp (HQ)
Acme Europe
Acme MENA
Acme Asia
Agent Level Partner Field Line Type Description Acme Corp (HQ)
USD · Default company
IV Calc Preview
1
Level 1
Direct Agent
agent.commission_id type = 'one' Planner assigned directly to customer. Always required.
%
percent1
$32.73
on $654.55 IV
2
Level 2
Parent Agent (Upline)
agent.new_parent_id type = 'double' Direct upline of the assigned planner. Earns simultaneously.
%
percent2
$16.36
on $654.55 IV
3
Level 3
Grandparent Agent
agent.new_parent_id
.new_parent_id
type = 'triple' Upline's upline. Earns simultaneously from same payment.
%
percent3
$6.55
on $654.55 IV
Total Commission (all 3 levels simultaneously) 8.50%
of IV value
$55.64
total payout
All Companies — Rate Comparison
Company L1 % (percent1) L2 % (percent2) L3 % (percent3) Total % Currency Actions
Acme Corp (HQ)
Default · Active
5.00% 2.50% 1.00% 8.50% USD
Acme Europe
EU region
6.00% 3.00% 1.50% 10.50% EUR
Acme MENA
Middle East & Africa
7.00% 3.50% 2.00% 12.50% MAD
Acme Asia
APAC region
4.50% 2.00% 0.80% 7.30% SGD
+ Add Company Rate
Product IV% Configuration (product.pv)
Drives pv_value calculation
💡
IV% (pv) is set per product. Commission is calculated as: net_payment × product.pv / 100 = pv_value. Products with commission_free = True are excluded from all commission calculations.
Product Category IV% (pv) Commission Free Sale Price IV on $1,000 payment
Enterprise License
Annual SaaS subscription
Software
%
$10,000 $227.27
net $909.09 × 25%
Consulting Services
Professional hours
Services
%
$5,200 $181.82
net $909.09 × 20%
Support Package
Annual premium support
Support
%
$2,500 $136.36
net $909.09 × 15%
Shipping / Delivery Fee
Logistics cost pass-through
Other
%
$0 $0.00
commission_free = True
🧮 Live Commission Simulator — Test your rates
Company
Product IV% (pv)
%
Payment Amount ($)
Tax Rate (%)
%
Commission Free?
net = $3,600 ÷ 1.10 = $3,272.73
pv_value = $3,272.73 × 20% = $654.55
L1 = $654.55 × 5.00% = $32.73
L2 = $654.55 × 2.50% = $16.36
L3 = $654.55 × 1.00% = $6.55
① Payment Amount $3,600.00
② Net (excl. tax) $3,272.73
③ Product IV% applied 20%
④ IV Value (pv_value) $654.55
L1 Commission (percent1) $32.73
L2 Commission (percent2) $16.36
L3 Commission (percent3) $6.55
TOTAL PAYOUT (all 3 levels) $55.64
As % of gross payment 1.55%
Same amount across all companies
Company L1 L2 L3 Total
Business Rules & Validation
Max 1 agent per customer: _check_agent_ids_limit() raises ValidationError if more than 1 planner assigned to a customer partner.
Simultaneous all-level payout: All 3 levels earn commission from the same invoice payment at the same time — no sequential dependency.
Commission-free products: If product.commission_free = True, _get_commission_amount() returns 0 regardless of agent or plan.
Company isolation: Each company's rates are independent. An agent working across companies earns different amounts per company using the same plan.
Payment-based trigger: When invoice_state = 'paid', commission lines are only created after action_register_payment() — not on posting.
Net amount base: Tax is excluded before IV% is applied: net = payment / (1 + tax_rate)pv_value = net × product.pv / 100.
Settlement cancellation guard: Invoices cannot be cancelled if any agent line has already been settled (account.move.button_cancel() blocked).