IATA-এর কেন্দ্রীয় সেটেলমেন্ট। HOT ফাইল প্রকার: BFH01 (header), BKT49 (ticket), BKS46 (summary), BMP78 (memo), BMP47 (refund), BKS50, BFT99 (trailer)। ম্যাচিং বাকেট: MATCH_OK, COMMISSION_VARIANCE, AMOUNT_VARIANCE। অ্যাকাউন্ট: 5045/7045।
Chapter 11.3 — BSP / ARC Import
1. Purpose
The BSP (Billing and Settlement Plan, operated by IATA outside the US) and ARC (Airlines Reporting Corporation, US) are the clearing houses that settle airline-issued tickets between agents and airlines. This chapter defines how travoBooks ingests BSP/ARC files, matches them to internal ticket and memo records, identifies and resolves variances, computes the agent's settlement obligation, and produces the reconciliation report that the partner pays against.
2. Why it matters
The BSP/ARC file is the authoritative settlement record. If travoBooks' books disagree with BSP, the partner pays what BSP says — disputes are filed retrospectively. The wire to BSP is non-negotiable in timing; missed wires trigger penalties and possibly loss of accreditation. A robust BSP import is therefore a financial-survival capability, not just a data-engineering task.
3. Industry relevance
- BSP is structured per country (BSP-BD, BSP-IN, BSP-AE, BSP-UK, etc.) with semi-monthly billing periods (H1: 1–15, H2: 16–end-of-month) and a country-specific remittance deadline.
- ARC is for US-based agents; weekly Wednesday cycle.
- Both produce files in IATA-standardised formats: HOT (Header / Detail / Trailer), AGTDATA, plus newer DISH record types.
- Memos (ADM/ACM, Chapter 4.6) come as part of or separate from the main billing analysis.
4. Compliance considerations
- IATA Resolution 818g (2026 revision) defines the billing-and-settlement process; travoBooks implementation aligned.
- Dispute window typically 30–60 days from receipt depending on local BSP rules.
- Cash retention — some BSPs require collateral / bank guarantee; tracking but not travoBooks' posting concern.
- Audit — BSP files form part of the audit pack each period.
5. Business logic
5.1 File structure (HOT format, simplified)
A BSP billing-analysis file has multiple record types identified by leading characters:
| Record | Purpose |
|---|---|
BFH01 |
File header — period, BSP country, agent code |
BKT49 |
Ticket record — ticket number, fare, taxes, commission |
BKS46 |
EMD record |
BMP78 |
Refund record |
BMP47 |
ADM/ACM record |
BKS50 |
Adjustment records |
BFT99 |
File trailer — totals, control counts |
Each record has fixed positions per IATA spec; the parser maps them to a normalised internal model.
5.2 Internal model
bsp_import_files (one row per file)
└── bsp_import_lines (one row per record, normalised)
├── type = TICKET → bsp_tickets
├── type = EMD → bsp_emds
├── type = REFUND → bsp_refunds
├── type = MEMO → memos
└── type = ADJUSTMENT → bsp_adjustments
5.3 Import flow
- File acquisition — daily SFTP poll from BSPlink, or manual upload by BSP-ops.
- Checksum + duplicate check —
idempotencytable. - Persist file metadata + S3 archive of raw.
- Parse — produce
bsp_import_linesand typed child tables (staging). - Schema validation — header/trailer totals reconcile; record counts match.
- Matching — each ticket/EMD/refund/memo matched to internal record by:
- Primary:
ticket_numberexact match. - Secondary:
(airline_code, ticket_number_partial)if partial number. - Tertiary:
(passenger_name, segments, issue_date_range)for likely match — manual confirmation needed. - Variance computation — per record: amount, commission, taxes, refund_amount — internal vs file.
- Commit:
- Linked records: post settlement JEs.
- Memo records: insert into
memos(Chapter 4.6 lifecycle). - Variance records: open dispute case or post variance JE.
- Orphan records: queue for manual investigation.
- BSP settlement total computed from file trailer: this is what the partner wires.
- Reconciliation report generated; circulated to controller.
- Import run marked complete.
5.4 The settlement JE
For a typical BSP-BD H1 file with totals: - Gross ticket sales (issued): BDT 12,800,000 - Refunds: BDT 1,200,000 - Commission (base + override): BDT 700,000 - Taxes (pass-through): BDT 1,500,000 (already inside gross) - ADMs: BDT 30,000 - ACMs: BDT 8,000 - Net to BSP: BDT 11,322,000
The BSP wire JE (when paid):
Debit 2011 BSP Payable BD 11,322,000
Credit 1013 Bank — BSP Settlement 11,322,000
The 2011 balance prior to this wire was built up over the period through individual ticket-issuance JEs. The file matches what we accrued (within tolerance). Variances are addressed per §5.6.
5.5 Per-ticket matching details
For each bsp_tickets row, the matching engine computes:
| Field | Source A (travoBooks) | Source B (BSP file) | Compare |
|---|---|---|---|
| Ticket number | booking_tickets.ticket_number |
BKT49 ticket no. |
Exact |
| Issue date | booking_tickets.issued_at |
BKT49 issue date |
Exact (day) |
| Base fare | booking_tickets.base_fare |
BKT49 fare |
Exact |
| YQ/YR | booking_tax_breakdown |
BKT49 carrier surcharge |
Exact |
| Government taxes | booking_tax_breakdown |
BKT49 per-XT lines |
Per-XT exact |
| Commission % | commission_accruals.rate |
BKT49 commission rate |
Exact |
| Commission amount | commission_accruals.amount |
BKT49 commission amount |
Exact |
| Net to BSP | derived | BKT49 net |
Exact |
Mismatches go into variance buckets:
- MATCH_OK — exact alignment, settled.
- COMMISSION_VARIANCE — different commission rate/amount.
- TAX_VARIANCE — XT breakdown differs.
- FARE_VARIANCE — base fare differs (rare; usually data error).
- MISSING_TICKET — in our books, not in BSP file (re-check next file; if still missing, escalate).
- PHANTOM_TICKET — in BSP file, not in our books (operational gap; investigate root cause).
5.6 Variance handling
| Variance | Default treatment |
|---|---|
| Commission variance (we expected more) | Provision difference as receivable variance; file dispute |
| Commission variance (we expected less) | Take the windfall (rare); JE adjustment |
| Tax variance | Reclassify tax bucket; reissue tax invoice line if material |
| Fare variance | Investigate; usually data error our side |
| Missing ticket | Wait one cycle, then escalate to ops + airline |
| Phantom ticket | Operations researches PNR; book a corrective entry if confirmed |
All variance JEs use a current-period date even if the original ticket is older. Variance accounts:
- 5045 — BSP Variance Expense
- 7045 — BSP Variance Income
5.7 Memo handling
ADM/ACM records in the file are routed to the memos module (Chapter 4.6). They are not posted as part of the BSP settlement JE directly; the memo lifecycle (dispute window etc.) governs their final posting.
However, the net wire amount to BSP already includes accepted/uncontested memos — the partner cannot delay wire because of a disputed memo. The disputed-memo provisioning is a parallel accounting concern.
5.8 Wire execution
Once the file is reconciled:
1. Treasury initiates wire to BSP clearing bank for the file-stated net.
2. Wire confirmation recorded against 2011 BSP Payable BD.
3. Bank reconciliation matches the outgoing wire to the BSP file reference.
4. Period reconciliation closed for that BSP cycle.
5.9 ARC variant
ARC files follow IAR (Interactive Agent Reporting) format with weekly cycles. The internal model is the same; parser differs; settlement JEs identical conceptually with US-jurisdiction account codes.
6. Inputs → processing → outputs
Already covered in §5.3.
7. Module dependencies
| Direction | Module |
|---|---|
| Depends on | Booking, Ticketing, Commission Accruals, JE Engine, Reconciliation |
| Depended on by | Period Close, Memos, Disputes, Reporting |
8. Security & permissions
| Permission | Allows |
|---|---|
bsp.file.upload.partner |
Upload BSP file |
bsp.file.commit.partner |
Commit after validation |
bsp.variance.dispute.partner |
File variance dispute |
bsp.variance.writeoff.partner |
Write off variance (threshold-gated) |
bsp.wire.initiate.partner |
Initiate settlement wire (Treasury role) |
bsp.wire.approve.partner |
Approve wire |
9. Validation rules
| Code | Condition |
|---|---|
BSP_FILE_HEADER_INVALID |
Header malformed |
BSP_FILE_PERIOD_MISMATCH |
File period ≠ expected next period |
BSP_FILE_DUPLICATE |
Same checksum imported |
BSP_FILE_AGENT_CODE_MISMATCH |
Agent code ≠ partner's accredited code |
BSP_FILE_TOTAL_MISMATCH |
Trailer total ≠ sum of records |
BSP_VARIANCE_EXCEEDS_THRESHOLD |
Aggregate variance > partner-config limit |
BSP_ORPHAN_RATE_HIGH |
Orphan tickets > 1% — operational concern |
10. Error handling
A failed parse leaves the file in bsp_import_files with state = FAILED_PARSE; BSP-ops re-investigates. Re-importing the same file after fixing the parser uses the same idempotency key — safe.
A successful import with orphans does not block settlement; orphans are tracked separately.
11. Real-world examples
A — Clean cycle
BSP-BD H1 (May 1–15) file arrives May 18: - 4,200 ticket records, 180 refund records, 22 ADM/ACM. - 99.8% match rate; 8 orphans (1 phantom, 7 missing). - Commission variance: BDT 0 (rules in sync). - Net to BSP: BDT 11.32M. - Wire executed May 22 (BSP deadline May 25).
B — Commission variance
H2 cycle: aggregate commission variance BDT 78,000 short of expected.
- Drill-down: EK route DAC-DXB returns 4% rather than expected 6% on 30 tickets.
- Root cause: EK changed override structure effective May 12, partner config not updated until May 20.
- Treatment:
- File dispute for BDT 78,000.
- Provision write-down BDT 78,000 to 5045 BSP Variance Expense.
- Update commission rules with corrected valid_from.
- Dispute resolution next cycle.
C — Phantom ticket
File contains a ticket BDT 25,000 against our agent code; not in our books. - Investigation: PNR was created on a sub-agency code that mistakenly used our agent code (BSP data quality). - Action: dispute filed; ticket excluded from our books; net wire still includes it (file is authoritative). - Provision: pending dispute outcome.
12. Step-by-step workflow
13. Database tables touched
| Table | Role |
|---|---|
bsp_import_files |
File-level metadata |
bsp_import_lines |
Raw normalised lines |
bsp_tickets |
Ticket records from file |
bsp_emds |
EMD records |
bsp_refunds |
Refund records |
bsp_adjustments |
Other adjustments |
memos |
ADM/ACM records (Chapter 4.6) |
bsp_match_results |
Per-record match outcome |
bsp_variance_disputes |
Open disputes |
journal_entries / _lines |
Postings |
bank_accounts |
Wire records |
14. Future scalability
- BSPlink API direct integration — replace SFTP polling with API push.
- Real-time per-ticket pre-validation — check fare/commission against expected at issue-time, not at settlement.
- ML-based variance root-cause — propose likely causes (rule lag, supplier behaviour change).
- Predictive net-wire — give Treasury 24h forecast of next BSP wire amount.
15. Common pitfalls
- ⚠️ Treating internal books as authoritative for settlement. They are for accounting; BSP file is for paying. Use file's net.
- ⚠️ Posting memos within the settlement JE. Memos have their own lifecycle.
- ⚠️ Missing BSP wire deadline. Penalty + accreditation risk.
- ⚠️ Stale agent code. If a partner changes IATA accreditation, the agent code in BSP file changes — config must follow.
- ⚠️ Ignoring small variances. Small consistently in one direction = systemic config error.
- 🔒 BSP credentials in
supplier_credentialsare highly sensitive — encrypted, accessed only by the import job's service account.