Skip to content

Sales Commissions (عمولات المبيعات)

Sales commissions allow you to automatically calculate and track commissions for salespeople when invoices are posted. The system supports flexible rule-based calculation with priority ordering.

Commission Rules

Rules define how commissions are calculated. Each rule can target a specific salesperson, product category, or product, with priority-based matching.

Rule Attributes

FieldTypeDescription
idintegerAuto-generated
salesperson_idinteger?Target specific salesperson (null = all)
product_category_idinteger?Target specific category (null = all)
product_idinteger?Target specific product (null = all)
commission_typeenumpercentage, fixed_per_unit, fixed_per_invoice
ratedecimal(15,3)Commission rate
min_invoice_amountdecimal(15,3)?Minimum invoice total to qualify
is_activebooleanWhether this rule is active
priorityintegerHigher priority = matched first

Commission Types

TypeCalculation
percentageline_total × rate / 100
fixed_per_unitquantity × rate
fixed_per_invoicerate / line_count (distributed across items)

Commission Records

When a sales invoice is posted and commission is enabled, the system creates a commission record.

Commission Attributes

FieldTypeDescription
idintegerAuto-generated
salesperson_idintegerThe salesperson
invoice_idintegerSource invoice
invoice_numberstringInvoice number
invoice_datedateInvoice date
partner_idinteger?Customer
invoice_totaldecimal(15,3)Invoice total amount
commission_basedecimal(15,3)Base amount for commission
commission_ratedecimal(8,4)Effective commission rate
commission_amountdecimal(15,3)Calculated commission amount
statusenumpending, approved, paid, cancelled
paid_datedate?When commission was paid
paid_viastring?Payment method
notestext?Optional notes

Commission Workflow

Rule Matching Logic

When calculating commission for an invoice line item, the service finds the best matching rule:

  1. Priority-based: Higher priority rules are checked first
  2. Specificity fallback: Product-specific > Category-specific > Salesperson-specific > Company default
  3. Settings fallback: If no rule matches, uses sales.default_commission_rate setting

API Endpoints

Commission Rules

MethodEndpointDescription
GET/api/sales/commission-rulesList rules (ordered by priority)
POST/api/sales/commission-rulesCreate rule
PUT/api/sales/commission-rules/{id}Update rule
DELETE/api/sales/commission-rules/{id}Soft-delete rule

Commissions

MethodEndpointDescription
GET/api/sales/commissionsList commissions
GET/api/sales/commissions/summarySummary by salesperson
POST/api/sales/commissions/{id}/approveApprove commission
POST/api/sales/commissions/{id}/mark-paidMark as paid
POST/api/sales/commissions/bulk-approveBulk approve
POST/api/sales/commissions/bulk-mark-paidBulk mark paid

Query Parameters (List Commissions)

ParameterTypeDescription
salesperson_idintegerFilter by salesperson
partner_idintegerFilter by customer
statusstringFilter by status
date_fromdateFilter from date
date_todateFilter to date

Examples

Create a Commission Rule

bash
curl -X POST "$BASE_URL/api/sales/commission-rules" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "commission_type": "percentage",
    "rate": 5.000,
    "priority": 10,
    "is_active": true
  }'
dart
final response = await dio.post(
  '/api/sales/commission-rules',
  data: {
    'commission_type': 'percentage',
    'rate': 5.000,
    'priority': 10,
    'is_active': true,
  },
);

Approve a Commission

bash
curl -X POST "$BASE_URL/api/sales/commissions/1/approve" \
  -H "Authorization: Bearer $TOKEN"
dart
final response = await dio.post('/api/sales/commissions/1/approve');

Bulk Mark as Paid

bash
curl -X POST "$BASE_URL/api/sales/commissions/bulk-mark-paid" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "ids": [1, 2, 3],
    "paid_date": "2026-03-01",
    "paid_via": "bank_transfer"
  }'
dart
final response = await dio.post(
  '/api/sales/commissions/bulk-mark-paid',
  data: {
    'ids': [1, 2, 3],
    'paid_date': '2026-03-01',
    'paid_via': 'bank_transfer',
  },
);

Settings

Commission behavior is controlled by two settings:

Setting KeyTypeDescription
sales.commission_enabledbooleanEnable/disable commission calculation
sales.default_commission_ratedecimalFallback rate when no rule matches

Permissions

PermissionDescription
sales.commissions.viewView commissions and rules
sales.commissions.manageCreate/update/delete rules, approve/pay commissions

Moon ERP API Documentation