Skip to content

Partner Payments

Management of partner commission payments: listing, approval workflow, document validation, mark as paid, and internal review. Integrates with Slack for notifications when payments are approved or paid.

Overview

The Partner Payments module allows administrators to view partner payment records, validate supporting documents (approve/reject), advance payments through statuses (e.g. send to internal review, mark as paid), and trigger Slack notifications for approved and paid commissions. It supports filtering by partner, date range, payment status, and reference.

Key Concepts

ConceptDescription
Partner paymentA payment record for a partner's commissions for a given period (month/year), with status and optional paid date
Payment statusLifecycle state: generated, payment_requested, documents_rejected, approved_for_payment, under_review, payment_rejected, paid, manually-paid
Document validationWorkflow to approve or reject documents attached to a payment before it can be paid
Internal reviewStatus used when a payment is sent for internal review; requires comments
Mark as paidManual recording of payment date when the commission was paid outside the system

Data Flow

Main Flow: List and Filter Partner Payments

Flow: Document Validation (Approve / Reject)

Flow: Mark as Paid / Send to Internal Review

Backend Structure

Route File

backend/routes/
└── partnerPayments.routes.js   # All partner payment endpoints

Controller and Library

  • Controller: backend/controllers/partnerPayments.controller.js — delegates to the partnerPayments util.
  • Library: backend/libraries/partnerPayments.util.js — business logic for listing, details, pay, document approve/reject, mark as paid, send to internal review. Uses Slack util for notifications.

Permissions

Permission nameUse
view-partner-paymentsList payments, view details, get documents, approve documents
pay-partners-paymentsReject documents, send to internal review
partners-payments-mark-as-a-paidMark payment as paid (with date)

Database

Tables (relevant to this module)

TablePurpose
partner_paymentsPayment headers: partner, period (month/year), status, payment_status, reference, paid_at, etc.
partner_payments_detailsLine items per payment (e.g. shipment-level details)
partnersPartner entity (user_id, locale_id, etc.)
usersUser data for partner
companiesCompany linked to partner user

Key Fields (partner_payments)

ColumnDescription
payment_statusOne of: generated, payment_requested, documents_rejected, approved_for_payment, under_review, payment_rejected, paid, manually-paid
paid_atWhen the payment was marked as paid (nullable)
referenceOptional reference identifier
partner_idFK to partners
month, yearBilling period

Key Decisions

DecisionReasoningAlternatives Considered
Centralized partnerPayments utilAll payment and document logic in one place; controller stays thin and testable.Logic in controller (harder to reuse and test)
Slack notifications on approve and paidKeeps finance/ops informed without polling.Email only (less real-time), no notification (manual tracking)
Separate permissions for view vs pay vs mark-as-paidFine-grained access: some roles can only view or approve documents; others can mark as paid.Single permission (less secure)
Document approve/reject via PATCH with path paramsRESTful and clear: payment and document IDs in path, optional body for reject reason.Single “update document” endpoint with action in body (more ambiguous)

Dependencies

  • Internal: Partners module (partner and user data), Auth (JWT, permissions), Slack util and templates for notifications.
  • External: Slack API for approval and “commissions paid” messages.

Envia Admin