/

to search

Introducing Setu Changelog Check it out ↗

#Customer Convenience Fee (CCF) Integration Guide

#1. Some Billers Charge Customer Convenience Fee (CCF)

Customer Convenience Fee (CCF) is an additional charge some billers impose on top of the bill amount—essentially a fee your users pay for the convenience of digital bill payment through BBPS.

You'll discover CCF when calling the List Billers API, where it appears in the biller's metadata. Every fee entry includes both interchangeFeeDetails (a single object) and interchangeFeeDetailsV2 (an array of objects with the same fields per element).

For CCF calculation, use interchangeFeeDetailsV2: find the slab where the bill amount in paise falls between tranAmtRangeMin and tranAmtRangeMax (inclusive), then use that slab's flatFee and percentFee. Legacy interchangeFeeDetails should be replaced with interchangeFeeDetailsV2 for multi slab support.

Here's what CCF looks like when a single flat fee applies across all amounts:

{
"id": "SOME00000NATRR",
"name": "Some Bank NCMC Pune Metro",
"interchangeFee": [
{
"feeCode": "CCF1",
"feeDesc": "Customer_Convenience_Fee",
"feeDirection": "C2B",
"interchangeFeeDetails": {
"effctvFrom": "2023-07-28",
"effctvTo": "",
"flatFee": 100, // ₹1.00 in paise
"percentFee": 0, // No percentage component
"tranAmtRangeMax": 999999999999,
"tranAmtRangeMin": 1
},
"interchangeFeeDetailsV2": [
{
"effctvFrom": "2023-07-28",
"effctvTo": "",
"flatFee": 100,
"percentFee": 0,
"tranAmtRangeMax": 999999999999,
"tranAmtRangeMin": 1
}
]
}
]
}

When tiered CCF applies, interchangeFeeDetailsV2 contains multiple ranges—example (values illustrative):

{
"feeCode": "CCF1",
"feeDesc": "Customer_Convenience_Fee",
"feeDirection": "C2B",
"interchangeFeeDetails": {
"effctvFrom": "2025-11-07",
"effctvTo": "",
"flatFee": 590,
"percentFee": 0,
"tranAmtRangeMax": 200000,
"tranAmtRangeMin": 1
},
"interchangeFeeDetailsV2": [
{
"effctvFrom": "2025-11-07",
"effctvTo": "",
"flatFee": 590,
"percentFee": 0,
"tranAmtRangeMax": 200000,
"tranAmtRangeMin": 1
},
{
"effctvFrom": "2025-11-07",
"effctvTo": "",
"flatFee": 1180,
"percentFee": 0,
"tranAmtRangeMax": 500000,
"tranAmtRangeMin": 200001
}
]
}

#2. What CCF Means for Your Users

When a biller charges CCF, your users pay more than just the bill amount. For example, if someone's metro card recharge is ₹500 and the CCF is ₹1, they'll be debited ₹501 total. Your application needs to clearly communicate this additional cost and handle it correctly in payment requests.

Key principle: CCF is always separate from the bill amount in your payment request—never add it to paymentDetails.amount, always include it as paymentDetails.custConvFee.

#3. Most Billers Have Zero CCF

Before diving into complex calculations, understand that most billers on the BBPS network charge zero CCF. Many billers will have CCF entries in their metadata with flatFee: 0 and percentFee: 0, which means no additional charge.

Zero CCF examples:

{
"feeCode": "CCF1",
"feeDirection": "C2B",
"interchangeFeeDetails": {
"flatFee": 0, // No flat fee
"percentFee": 0, // No percentage fee
"tranAmtRangeMax": 9999999999,
"tranAmtRangeMin": 1
},
"interchangeFeeDetailsV2": [
{
"flatFee": 0,
"percentFee": 0,
"tranAmtRangeMax": 9999999999,
"tranAmtRangeMin": 1
}
]
}

When CCF is zero, you can omit the custConvFee field entirely from your payment request.

#4. When CCF Actually Applies (Real Examples)

Some categories of billers do charge meaningful CCF. Here are some examples from the BBPS network: Note: The values are for illustration purposes only.

#4.1 National Pension System (₹0.50 CCF)

{
"id": "SOME00000NATC3",
"name": "National Pension System",
"interchangeFee": [
{
"feeCode": "CCF1",
"feeDesc": "Customer_Convenience_Fee",
"feeDirection": "C2B",
"interchangeFeeDetails": {
"effctvFrom": "2024-08-05",
"effctvTo": "",
"flatFee": 50, // ₹0.50 in paise
"percentFee": 0, // No percentage component
"tranAmtRangeMax": 999999999999,
"tranAmtRangeMin": 1
},
"interchangeFeeDetailsV2": [
{
"effctvFrom": "2024-08-05",
"effctvTo": "",
"flatFee": 50,
"percentFee": 0,
"tranAmtRangeMax": 999999999999,
"tranAmtRangeMin": 1
}
]
}
]
}

#4.2 HDFC NCMC Pune Metro (₹1.00 CCF)

{
"id": "SOME00000NATRR",
"name": "HDFC Bank NCMC Pune Metro",
"interchangeFee": [
{
"feeCode": "CCF1",
"feeDesc": "Customer_Convenience_Fee",
"feeDirection": "C2B",
"interchangeFeeDetails": {
"effctvFrom": "2023-07-28",
"effctvTo": "",
"flatFee": 100, // ₹1.00 in paise
"percentFee": 0, // No percentage component
"tranAmtRangeMax": 999999999999,
"tranAmtRangeMin": 1
},
"interchangeFeeDetailsV2": [
{
"effctvFrom": "2023-07-28",
"effctvTo": "",
"flatFee": 100,
"percentFee": 0,
"tranAmtRangeMax": 999999999999,
"tranAmtRangeMin": 1
}
]
}
]
}

#4.3 Airtel Payments Bank NCMC (Zero CCF)

{
"id": "AIRT00000NATCL",
"name": "Airtel Payments Bank RuPay NCMC",
"interchangeFee": [
{
"feeCode": "CCF1",
"feeDesc": "Customer_Convenience_Fee",
"feeDirection": "C2B",
"interchangeFeeDetails": {
"effctvFrom": "2024-01-01",
"effctvTo": "",
"flatFee": 0, // No CCF charged
"percentFee": 0, // No percentage component
"tranAmtRangeMax": 9999999999,
"tranAmtRangeMin": 1
},
"interchangeFeeDetailsV2": [
{
"effctvFrom": "2024-01-01",
"effctvTo": "",
"flatFee": 0,
"percentFee": 0,
"tranAmtRangeMax": 9999999999,
"tranAmtRangeMin": 1
}
]
}
]
}

#5. How to Calculate and Implement CCF

#5.1 Detection Logic

Look for CCF1 + C2B entries in the interchangeFee array. For the matching entry, interchangeFeeDetailsV2 is present: find the object whose range contains the bill amount in paise (tranAmtRangeMin ≤ billAmount ≤ tranAmtRangeMax) and use that slab's flatFee and percentFee for CCF (not the legacy interchangeFeeDetails object alone).

Zero CCF has two forms, check for both:

  1. Missing - No CCF1/C2B entry at all → Zero CCF
  2. Present but inactive - After resolving the slab as above, flatFee: 0 AND percentFee: 0 → Zero CCF

If either is true, you may omit custConvFee from your payment request. If a CCF1/C2B entry exists with any non-zero fee for the resolved slab, calculate the CCF using the formula in section 5.2.

#5.2 CCF Calculation Formula

When CCF applies, use this formula to calculate the fee in paise:

Formula: ccf = (flatFee + (billAmount × percentFee/100)) × (1 + GST/100)

Note: Currently, GST is 18% on CCF in the BBPS network.

#5.3 Real Calculation Examples

Example 1: National Pension System (₹2000 contribution)

  • Bill amount: ₹2000 (200000 paise)
  • CCF: flatFee = 50, percentFee = 0
  • Calculation: (50 + (200000 × 0/100)) × (1 + 18/100) = 50 × 1.18 = 59 paise
  • Total debit: ₹2000.59

Example 2: HDFC NCMC (₹500 recharge)

  • Bill amount: ₹500 (50000 paise)
  • CCF: flatFee = 100, percentFee = 0
  • Calculation: (100 + (50000 × 0/100)) × (1 + 18/100) = 100 × 1.18 = 118 paise
  • Total debit: ₹501.18

Example 3: Zero CCF biller (₹1500 bill)

  • Bill amount: ₹1500 (150000 paise)
  • CCF: flatFee = 0, percentFee = 0
  • Calculation: CCF = 0
  • Total debit: ₹1500 (omit custConvFee field)

Example 4: Tiered CCF (interchangeFeeDetailsV2)

  • Bill amount: ₹2500 (250000 paise)
  • From interchangeFeeDetailsV2, the slab where tranAmtRangeMin ≤ 250000 ≤ tranAmtRangeMax applies (for example 200001–500000 paise when that tier exists)
  • CCF base: flatFee = 1180, percentFee = 0
  • Calculation: (1180 + (250000 × 0/100)) × (1 + 18/100) = 1392.41392 paise after rounding (₹13.92)
  • Total debit: 250000 + 1392 = 251392 paise

#6. Building Your Payment Request

#6.1 Payment Request with CCF

When CCF applies, include it as a separate custConvFee field:

{
"refId": "FETCH_REF_123",
"paymentDetails": {
"amount": 200000, // Bill amount: ₹2000 in paise
"custConvFee": 59, // CCF: ₹0.59 in paise (separate field)
"mode": "UPI",
"paymentRefId": "PAY_REF_456",
"timestamp": "2024-06-04T14:30:00+05:30",
"accountInfo": "user@ybl"
},
"remitter": { "name": "John Doe" }
}

Total debit from user: paymentDetails.amount + paymentDetails.custConvFee = 200059 paise (₹2000.59)

#6.2 Payment Request without CCF

When CCF is zero, omit the custConvFee field entirely:

{
"refId": "FETCH_REF_123",
"paymentDetails": {
"amount": 150000, // Bill amount: ₹1500 in paise
// No custConvFee field when CCF is zero
"mode": "UPI",
"paymentRefId": "PAY_REF_789",
"timestamp": "2024-06-04T14:30:00+05:30",
"accountInfo": "user@ybl"
},
"remitter": { "name": "John Doe" }
}

Total debit from user: paymentDetails.amount = 150000 paise (₹1500)

#7. Edge Cases and Important Rules

#7.1 What to Ignore

Ignore EBF and PBF fees: Only handle CCF1 with C2B direction. Electronic Biller Fee (EBF) and Physical Biller Fee (PBF) with B2C direction are not customer charges.

#7.2 Zero CCF Handling

When calculated CCF is zero, you can omit the custConvFee field from your payment request.

#7.3 CCF with Payment Options

When using payment options (alternative amounts), calculate CCF on the final selected amount (paymentDetails.amount), not the base bill amount.

#8. Complete Implementation Checklist

  • Detect CCF: Look for CCF1 entries with C2B direction in biller metadata; resolve CCF from interchangeFeeDetailsV2 slabs
  • Calculate properly: Use the complete formula including 18% GST
  • Handle zero CCF: Omit custConvFee field when CCF is zero or rounds to zero
  • Separate from bill amount: Never add CCF to paymentDetails.amount
  • Calculate on final amount: For payment options, use selected amount not base amount
  • Ignore irrelevant fees: Skip EBF/PBF entries (they're biller fees, not customer fees)
  • Communicate clearly: Show users the total debit amount (bill + CCF) upfront

#9. User Experience Considerations

Transparency: Always show users the CCF amount separately before payment:

  • "Bill Amount: ₹500.00"
  • "Convenience Fee: ₹1.18"
  • "Total: ₹501.18"

Was this page helpful?