Skip to main content

Pluxee Meal Voucher Billing

How to implement daily reimbursement notes, B2M transactions, and 4C commission billing using Billerang.

Business Model

Pluxee-style meal voucher platforms serve two sides:

Employer Side

ComponentDescription
Platform feeMonthly, tiered by employee count
Card issuanceOne-time per card
4C Commission4% of monthly face-value top-ups

Merchant Side

ComponentDescription
Daily reimbursementFace value of accepted meal transactions
Merchant service feeMonthly fixed fee

Catalog Structure

Step-by-Step Implementation

1. Employer Platform Fee (Tiered by Employee Count)

POST /api/rest/v2/chargeTemplate/RC_PLATFORM_FEE
{
"chargeType": "RECURRING",
"description": "Monthly platform fee by employee count",
"calendar": "MONTHLY",
"applyInAdvance": true,
"invoiceSubCategoryCode": "ISC_PLATFORM",
"taxClassCode": "TAX_SERVICES",
"pricing": {
"mode": "MATRIX",
"baseCurrency": "EUR",
"dimensions": [
{ "code": "EMPLOYEE_COUNT", "type": "Range_Numeric", "label": "Number of Employees" }
],
"rows": [
{
"priority": 1,
"description": "1-50 employees",
"values": [{ "dimensionCode": "EMPLOYEE_COUNT", "fromDoubleValue": 1, "toDoubleValue": 50 }],
"price": 2.50
},
{
"priority": 2,
"description": "51-200 employees",
"values": [{ "dimensionCode": "EMPLOYEE_COUNT", "fromDoubleValue": 51, "toDoubleValue": 200 }],
"price": 2.00
},
{
"priority": 3,
"description": "201+ employees",
"values": [{ "dimensionCode": "EMPLOYEE_COUNT", "fromDoubleValue": 201, "toDoubleValue": null }],
"price": 1.50
}
],
"autoPublish": true
}
}

2. Card Issuance One-Shot

POST /api/rest/v2/chargeTemplate/OS_CARD_ISSUANCE
{
"chargeType": "SUBSCRIPTION",
"description": "Card issuance fee per card",
"immediateInvoicing": true,
"invoiceSubCategoryCode": "ISC_SETUP",
"taxClassCode": "TAX_SERVICES",
"pricing": {
"mode": "FLAT",
"baseCurrency": "EUR",
"price": 5.00,
"autoPublish": true
}
}

3. 4C Commission (4% of Face Value)

POST /api/rest/v2/chargeTemplate/UC_4C_COMMISSION
{
"chargeType": "USAGE",
"description": "4% commission on face-value top-ups",
"invoiceSubCategoryCode": "ISC_COMMISSION",
"taxClassCode": "TAX_SERVICES",
"filterExpression": "#{edr.parameter1 == 'FACE_VALUE_TOPUP'}",
"pricing": {
"mode": "FORMULA",
"baseCurrency": "EUR",
"priceFormula": "#{walletOperation.quantity * 0.04}",
"autoPublish": true
}
}

4. Merchant Daily Reimbursement

The key feature is multi-instance matching -- each merchant has their own subscription, and CDRs are routed to the correct merchant via filterExpression:

POST /api/rest/v2/chargeTemplate/UC_REIMBURSEMENT
{
"chargeType": "USAGE",
"description": "Daily merchant reimbursement",
"invoiceSubCategoryCode": "ISC_REIMBURSEMENT",
"taxClassCode": "TAX_EXEMPT",
"filterExpression": "#{edr.parameter1 == serviceInstance.getCfValue('MERCHANT_ID')}",
"priority": 1,
"pricing": {
"mode": "PER_UNIT",
"baseCurrency": "EUR",
"price": 1.00,
"autoPublish": true
}
}

How multi-instance matching works:

  • Each merchant subscription has a custom field MERCHANT_ID
  • When a CDR arrives with parameter1 = "MERCHANT_12345", the filter expression matches it to the subscription where MERCHANT_ID = "MERCHANT_12345"
  • See Multi-Instance Matching for details

5. Merchant Monthly Service Fee

POST /api/rest/v2/chargeTemplate/RC_MERCHANT_FEE
{
"chargeType": "RECURRING",
"description": "Monthly merchant service fee",
"calendar": "MONTHLY",
"applyInAdvance": true,
"invoiceSubCategoryCode": "ISC_SERVICE",
"pricing": {
"mode": "FLAT",
"baseCurrency": "EUR",
"price": 15.00,
"autoPublish": true
}
}

6. Create Products and Offers

# Employer products
POST /api/rest/catalog/products
{ "code": "EMPLOYER_PLATFORM", "description": "Employer platform access" }
POST /api/rest/catalog/products/EMPLOYER_PLATFORM/addCharges
{ "productCharges": [
{ "chargeTemplateCode": "RC_PLATFORM_FEE" },
{ "chargeTemplateCode": "OS_CARD_ISSUANCE" }
]}

POST /api/rest/catalog/products
{ "code": "FACE_VALUE_COMMISSION", "description": "Face value commission tracking" }
POST /api/rest/catalog/products/FACE_VALUE_COMMISSION/addCharges
{ "productCharges": [{ "chargeTemplateCode": "UC_4C_COMMISSION" }] }

# Employer offer
POST /api/rest/catalog/offerTemplate/createOrUpdate
{
"code": "PLUXEE_EMPLOYER",
"description": "Pluxee Employer Package",
"offerProductTemplates": [
{ "productTemplate": { "code": "EMPLOYER_PLATFORM" }, "mandatory": true },
{ "productTemplate": { "code": "FACE_VALUE_COMMISSION" }, "mandatory": true }
]
}

# Merchant products
POST /api/rest/catalog/products
{ "code": "DAILY_REIMBURSEMENT", "description": "Daily reimbursement processing" }
POST /api/rest/catalog/products/DAILY_REIMBURSEMENT/addCharges
{ "productCharges": [{ "chargeTemplateCode": "UC_REIMBURSEMENT" }] }

POST /api/rest/catalog/products
{ "code": "MERCHANT_SERVICE", "description": "Merchant service package" }
POST /api/rest/catalog/products/MERCHANT_SERVICE/addCharges
{ "productCharges": [{ "chargeTemplateCode": "RC_MERCHANT_FEE" }] }

# Merchant offer
POST /api/rest/catalog/offerTemplate/createOrUpdate
{
"code": "PLUXEE_MERCHANT",
"description": "Pluxee Merchant Package",
"offerProductTemplates": [
{ "productTemplate": { "code": "DAILY_REIMBURSEMENT" }, "mandatory": true },
{ "productTemplate": { "code": "MERCHANT_SERVICE" }, "mandatory": true }
]
}

Daily B2M Processing Flow

Monthly Employer Invoice

Invoice: Employer ACME Corp (200 employees)
Date: 2026-04-01

Platform Fee (200 employees * EUR 2.00): EUR 400.00
Card Issuance (15 new cards * EUR 5.00): EUR 75.00
4C Commission (EUR 100,000 face value * 4%): EUR 4,000.00
────────────────────────────────────────────
Subtotal: EUR 4,475.00
VAT (20%): EUR 895.00
Total: EUR 5,370.00

Key Billerang Features Used

FeaturePurpose
Multi-instance matchingRoute CDRs to correct merchant subscription
filterExpressionEL-based CDR routing via MERCHANT_ID custom field
Formula pricing4% commission calculated dynamically
Matrix pricingTiered platform fee by employee count
One-shot chargeCard issuance fee
Daily billing runGenerate merchant reimbursement notes
Monthly billing runEmployer invoicing on 1st of month
Custom fieldsMERCHANT_ID on ServiceInstance