সরবরাহকারী মাস্টার: এয়ারলাইন, হোটেল, বেডব্যাঙ্ক, ট্যুর অপারেটর। GDS/NDC ক্রেডেনশিয়াল (এনক্রিপ্টেড), কমিশন রুল, পেমেন্ট সেটেলমেন্ট পদ্ধতি। ভেন্ডর-ফ্রড সুরক্ষা: ব্যাঙ্ক বিবরণ পরিবর্তনের জন্য বাধ্যতামূলক maker-checker অনুমোদন এবং ৩০ মিনিটের পেআউট হোল্ড।
Chapter 3.2 — Suppliers
1. Purpose
This chapter defines the Supplier entity — the parties from whom the partner sources travel inventory: airlines (via GDS or NDC), low-cost-carrier aggregators, hotel wholesalers, ground-transport providers, insurance underwriters, and the BSP itself as a settlement counterparty. Suppliers are the right side of the platform's accounts-payable picture; every operational booking creates a payable obligation that the supplier model must track precisely.
2. Why it matters in modern travel accounting
Supplier accounting in travel is fundamentally different from generic AP: - An airline ticket triggers a BSP weekly settlement, not a per-invoice payment. - A hotel booking on a "pay-at-property" model creates no AP at all (commission-only revenue). - A direct-connect (NDC) supplier may invoice per-booking with diverse payment terms. - Commission and override structures change supplier net amounts after the fact. - ADM (Agency Debit Memos) and ACM (credits) re-open closed periods.
A clean supplier master and well-modelled supplier-type behaviour is the foundation of accurate AP, BSP reconciliation, and commission accounting.
3. Industry relevance
The platform models supplier diversity through supplier types and settlement modes rather than per-supplier custom code, allowing partners to onboard new suppliers without engineering changes.
4. Compliance considerations
- IATA accreditation — airline suppliers transacted through BSP require IATA membership; agent code captured per partner.
- IFRS 15 — Principal vs Agent — supplier model holds the flag that determines whether the partner is principal (gross revenue) or agent (net commission revenue). This is the single most impactful classification in travel accounting.
- Withholding tax — for non-resident suppliers in certain jurisdictions, withholding may apply at payout.
- Sanctions screening — suppliers screened at onboarding and re-screened.
5. Business logic
5.1 Supplier types
| Type | Code | Examples | Settlement |
|---|---|---|---|
| Airline — BSP | AIR_BSP |
Emirates, Biman, Qatar | Weekly via BSP |
| Airline — Direct (NDC) | AIR_NDC |
Direct NDC offers | Per-booking, per-supplier terms |
| Low-Cost Carrier | AIR_LCC |
Air Asia, Indigo, Flydubai | Card-on-file at booking; no AR |
| Hotel — Prepaid | HOTEL_PREPAID |
Hotelbeds, Expedia EAN | Net invoice from wholesaler |
| Hotel — Pay at Property | HOTEL_PAP |
Direct contracts | Commission-only; no AP |
| Ground Transport | GROUND |
Transfer suppliers | Variable |
| Insurance | INSURANCE |
Allianz, AXA | Per-policy invoice |
| Cruise / Tour | TOUR |
Tour operators | Net invoice |
| BSP | BSP_CLEARING |
Synthetic "supplier" for BSP itself | Weekly clearing |
| Internal | INTERNAL |
For inter-branch transfers | Per partner config |
5.2 Supplier record structure
| Field | Type | Notes |
|---|---|---|
supplier_id |
BIGINT PK | |
partner_id |
BIGINT FK | Tenant scope |
supplier_code |
VARCHAR(32) | Unique per partner |
supplier_type |
ENUM | Above |
legal_name |
VARCHAR(255) | |
display_name |
VARCHAR(255) | |
iata_code |
CHAR(3) NULL | For airlines |
tax_id |
VARCHAR(64) NULL | |
tax_jurisdiction_code |
CHAR(2) | |
default_currency |
CHAR(3) | Invoice currency |
settlement_mode |
ENUM(bsp_weekly, per_invoice, card_on_file, commission_only, prepaid) |
|
payment_terms_days |
SMALLINT NULL | NET-N |
principal_or_agent |
ENUM(principal, agent) |
IFRS 15 critical |
default_commission_rate |
DECIMAL(8,4) NULL | Percentage |
override_commission_rules_id |
BIGINT FK NULL | Tiered/volume |
vat_handling |
ENUM(inclusive, exclusive, none) |
|
bank_details_id |
BIGINT FK NULL | For wire payouts |
bsp_country_code |
CHAR(2) NULL | For BSP-settled airlines |
is_active |
BOOLEAN | |
sanctions_status |
ENUM | |
| Audit columns |
5.3 Principal vs Agent
Under IFRS 15, the partner is the principal when it controls the service before transfer to the customer (it bears inventory risk, sets the price, takes credit risk). It is the agent when it merely arranges supply (commission seller).
The classification flag is per-supplier-relationship, not platform-wide, because the same partner may be principal on one supplier and agent on another:
| Scenario | Principal/Agent | Revenue recognition |
|---|---|---|
| Sells GDS ticket for Emirates | Agent | Commission only as revenue; ticket price is pass-through |
| Sells NDC ticket with private fare | Agent or Principal depending on contract | Determined by control test |
| Sells own tour package | Principal | Gross revenue, gross cost |
| Re-sells Hotelbeds room at marked-up rate | Principal for the markup; Agent for any commission | Carefully split; usually principal in practice |
The JE engine reads principal_or_agent at booking-issuance to choose revenue recognition pattern (Ch 5.8 commission vs Ch 5.1 main revenue).
5.4 Commission model
Suppliers may offer: - Base commission — flat % on ticket base fare - Tiered commission — based on volume thresholds - Override commission — quarterly/annual back-end paid as ACM - Net rates — supplier sells at net; partner marks up - Incentive schemes — segment-count, route-specific
Commission rules attached to a supplier are evaluated at issuance, accrued to a receivable account (1109 — Commission Receivable from Supplier), and cleared when BSP settles or an explicit commission invoice posts.
See Chapter 5.8 — Commission Accounting for full mechanics.
5.5 BSP settlement linkage
For supplier_type = AIR_BSP, the supplier record is not the direct counterparty for settlement — the BSP itself is. Operational ticket issuance creates a payable to "BSP Payable" (control account 2011) sub-coded by:
- BSP country (bsp_country_code)
- Billing period (BSP semi-monthly billing periods)
Per-airline AP-style detail is preserved via journal_entry_lines.supplier_id for reporting, but cash settlement is one wire to BSP, not per-airline.
See Chapter 4.6 — ADM/ACM and Chapter 11.3 — BSP/ARC Import for full treatment.
5.6 Supplier payout (non-BSP)
For non-BSP suppliers, payout workflow:
1. Open AP balance per supplier visible on supplier_balances.
2. Accountant initiates a payout run selecting one or many open supplier invoices.
3. System validates total, currency, bank details.
4. Maker submits payout; checker approves (above threshold).
5. Payment file generated (bank-format-specific) or gateway call made.
6. Once cleared, AP is relieved with a JE.
6. Inputs → processing → outputs
Create supplier
Input: form / API payload.
Processing:
1. Validate (partner_id, supplier_code) uniqueness.
2. If supplier_type = AIR_BSP, require iata_code and bsp_country_code.
3. If principal_or_agent = principal, mark requires-VAT-config.
4. Insert; queue sanctions screening.
5. Emit supplier.created event.
Output: supplier_id.
7. Module dependencies
| Direction | Module |
|---|---|
| Depends on | Multi-Tenancy, Tax Configuration, Bank Details |
| Depended on by | Bookings (all types), Ticketing, BSP Import, Commission Accounting, AP Aging, Webhooks |
8. Security & permissions
| Permission | Allows |
|---|---|
suppliers.read.partner |
View |
suppliers.create.partner |
Create |
suppliers.update.partner |
Edit non-financial |
suppliers.financial.update.partner |
Edit commission, settlement, bank details |
suppliers.payout.create.partner |
Initiate payout |
suppliers.payout.approve.partner |
Approve payout (checker) |
Bank details are particularly sensitive — every read of supplier_bank_details is audit-logged with the reading user/principal.
9. Validation rules
| Code | Condition |
|---|---|
SUPPLIER_CODE_DUPLICATE |
Code already used in partner |
SUPPLIER_IATA_REQUIRED |
Air supplier missing IATA code |
SUPPLIER_BSP_COUNTRY_REQUIRED |
BSP-settled airline missing country |
SUPPLIER_PRINCIPAL_VAT_CONFIG_MISSING |
Principal supplier needs VAT setup |
SUPPLIER_BANK_DETAILS_INVALID |
IBAN/SWIFT/routing format invalid |
SUPPLIER_SANCTIONS_BLOCKED |
Sanctions hit |
SUPPLIER_INACTIVE |
Trying to book against inactive supplier |
SUPPLIER_COMMISSION_RATE_INVALID |
Negative or >100% |
SUPPLIER_PAYOUT_INSUFFICIENT_BALANCE |
Payout requested exceeds open AP |
10. Error handling
Same envelope as customers. Bank-detail edits trigger mandatory MFA re-prompt and 30-minute payment hold to mitigate vendor-fraud attacks (a common attack vector).
11. Real-world examples
Example A — Emirates as BSP airline
supplier_code = EKsupplier_type = AIR_BSPiata_code = EKbsp_country_code = BD(Bangladesh BSP)principal_or_agent = agentdefault_commission_rate = 0.0000(zero base for most LCCs nowadays; overrides handled separately)default_currency = USD(billing currency in BD BSP for international tickets)
Issuance of an EK ticket creates AP to "BSP Payable BD" not directly to Emirates. Per-supplier reporting still distinguishes the EK obligation.
Example B — Hotelbeds net-rate supplier
supplier_code = HBDsupplier_type = HOTEL_PREPAIDprincipal_or_agent = principal(partner takes inventory risk and marks up)settlement_mode = per_invoicepayment_terms_days = 21default_currency = EUR
A booking creates AP directly to Hotelbeds in EUR; FX translates to BDT functional at booking date; commission/markup recognised as gross revenue minus COGS.
Example C — Vendor-fraud attempt
Attacker compromises a procurement email account and emails the accountant requesting a bank-detail change for a major hotel supplier. Accountant edits the bank details in travoBooks. The system:
1. Prompts MFA re-confirmation.
2. Sends out-of-band notification to partner_admin.
3. Places 30-minute hold on all payouts to this supplier.
4. Logs the change in supplier_bank_history.
Partner_admin sees the alert, contacts the supplier through known-good channel, discovers the fraud, reverses the change before any payout occurs.
12. Step-by-step workflow
13. Database tables touched
| Table | Role |
|---|---|
suppliers |
Master record |
supplier_addresses |
|
supplier_contacts |
|
supplier_bank_details |
Payout destinations |
supplier_bank_history |
Every change to bank details |
supplier_commission_rules |
Tiered/override schedules |
supplier_balances |
Real-time AP balance |
supplier_credentials |
Encrypted API/SOAP credentials for direct-connect |
supplier_sanctions_screenings |
|
audit_logs |
14. Future scalability
- Supplier portal — suppliers log in to view their payouts, dispute discrepancies, upload invoices.
- Auto-reconciliation for direct-connect — match supplier-pushed invoice file against booking events.
- Commission-recovery engine — automatically open dispute when expected commission not received.
- Supplier scoring — quality metrics (issue rate, ADM rate, support responsiveness) feeding offer-ranking.
15. Common pitfalls
- ⚠️ Don't post AP directly to airline suppliers when settlement is via BSP. The right counterparty for the payable is the BSP control account. Per-airline detail lives in dimensions, not in the account code.
- ⚠️ Principal/agent flag is sticky. Once a booking is issued, changing the supplier's classification does not retroactively change recognised revenue.
- 🔒 Bank-detail edits are high-risk. Mandatory MFA + 30-minute payout hold is non-negotiable.
- ⚠️ Commission rates with no end date can outlive their negotiation. Always capture
valid_fromandvalid_to.