Integrate with ValU BNPL (Buy Now Pay Later) for Egyptian installment payments. Use this skill when building checkout flows for Egypt, offering installment plans through payment aggregators like Paymob, PayTabs or OPay, implementing BNPL payment methods, handling installment eligibility checks, or managing customer financing options. Trigger on mentions of 'ValU', 'installments in Egypt', 'BNPL Egypt', 'interest-free payments', or Egyptian fintech solutions.
ValU is Egypt's leading Buy Now Pay Later (BNPL) platform, enabling customers to purchase now and pay in installments interest-free. With millions of active users, ValU is essential for e-commerce platforms serving the Egyptian market. ValU does not offer a direct merchant API; instead, it integrates through payment aggregators and gateways like Paymob, PayTabs, OPay, and Geidea.
You're building an e-commerce store, digital services platform, or marketplace in Egypt and want to offer customers flexible payment options through installments. ValU provides the financing and approval infrastructure; you integrate through a payment aggregator that handles the technical integration. ValU covers customer verification, credit evaluation, fraud detection, and installment scheduling — you manage the checkout flow.
ValU is not integrated directly but through payment service providers (aggregators):
Choose your aggregator based on your existing payment infrastructure. Most Egyptian e-commerce platforms use Paymob or PayTabs.
Paymob is the recommended integration path for most merchants. ValU is available as a BNPL payment method in Paymob's checkout.
PAYMOB_API_KEY=pk_live_xxxxx
PAYMOB_SECRET=sk_live_xxxxx
The typical BNPL checkout flow with Paymob:
1. Customer selects ValU at checkout
2. System calls Paymob API to get available installment plans
3. Customer selects installment plan
4. System initiates payment with Paymob
5. Customer completes KYC/OTP verification at ValU
6. Webhook confirms payment status
7. Fulfill order
Initialize Payment Order:
curl -X POST https://accept.paymob.com/api/ecommerce/orders \
-H "Content-Type: application/json" \
-d '{
"auth_token": "YOUR_AUTH_TOKEN",
"delivery_needed": false,
"currency": "EGP",
"amount_cents": 500000,
"merchant_order_id": "ORD-2025-12345",
"items": [
{
"name": "Laptop",
"amount_cents": 300000,
"quantity": 1,
"description": "Electronics"
},
{
"name": "Charger",
"amount_cents": 200000,
"quantity": 1,
"description": "Accessories"
}
],
"description": "Order for electronics and accessories",
"customer_phone": "+201234567890",
"customer_email": "[email protected]"
}'
Response:
{
"id": 123456789,
"pending": false,
"amount_cents": 500000,
"currency": "EGP",
"merchant_order_id": "ORD-2025-12345",
"status": "PENDING",
"items": [...],
"created_at": "2025-02-24T10:00:00Z"
}
Get Authentication Token:
curl -X POST https://accept.paymob.com/api/auth/tokens \
-H "Content-Type: application/json" \
-d '{
"username": "YOUR_MERCHANT_API_KEY",
"password": "YOUR_MERCHANT_PASSWORD"
}'
Create Payment Intent with ValU:
curl -X POST https://accept.paymob.com/api/ecommerce/integrations/123456/iframe \
-H "Content-Type: application/json" \
-d '{
"auth_token": "AUTH_TOKEN_FROM_PREVIOUS_CALL",
"amount_cents": 500000,
"order_id": 123456789,
"billing_data": {
"first_name": "Ahmed",
"last_name": "Hassan",
"email": "[email protected]",
"phone_number": "+201234567890",
"state": "Cairo",
"country": "EG",
"city": "Cairo",
"postal_code": "11511",
"street": "123 Main St"
},
"integrations": [INTEGRATION_ID_FOR_VALU]
}'
Paymob Flash Checkout (JavaScript):
// Mount ValU payment option in your checkout page
const paymobCheckout = new Paymob({
publicKey: 'pk_live_xxxxx',
onApprove: (data) => {
console.log('Payment approved:', data);
// Confirm order on server
},
onReject: (data) => {
console.log('Payment rejected:', data);
}
});
// Render ValU as payment method
paymobCheckout.renderPaymentMethod({
method: 'valu',
amount: 500000,
currency: 'EGP',
orderId: 'ORD-2025-12345',
customerEmail: '[email protected]',
containerSelector: '#payment-methods'
});
PayTabs offers ValU through hosted payment pages (HPP):
Step 1: Register with ValU via PayTabs Contact: [email protected] with your Merchant ID
Step 2: Create Payment Request
curl -X POST https://secure.paytabs.com/apiv2/create_pay_page \
-H "Content-Type: application/x-www-form-urlencoded" \
-d 'merchant_email=YOUR_EMAIL&merchant_password=YOUR_PASSWORD¤cy_code=EGP&amount=500000&title=Electronics%20Order&cc_first_name=Ahmed&cc_last_name=Hassan&cc_phone_number=+201234567890&[email protected]&reference_no=ORD-2025-12345&return_url=https://yoursite.com/checkout/success&cms_with_version=ValU&cms_module_version=2.0'
Step 3: Customer Flow at PayTabs
return_urlOPay provides a dedicated API for ValU installments:
Get Installment Plans:
curl -X POST https://api.opaycheckout.com/api/v1/payment/action/input-installment-month \
-H "Content-Type: application/json" \
-d '{
"amount": 5000,
"currency": "EGP",
"method": "VALU"
}'
Response:
{
"success": true,
"data": {
"plans": [
{
"months": 3,
"monthlyAmount": 1667,
"totalAmount": 5000,
"downPayment": 0
},
{
"months": 6,
"monthlyAmount": 834,
"totalAmount": 5000,
"downPayment": 0
},
{
"months": 12,
"monthlyAmount": 417,
"totalAmount": 5000,
"downPayment": 0
}
]
}
}
ValU offers flexible installment options. Typical configurations:
{
"planId": "plan_xxxxx",
"numberOfInstallments": 4,
"downPayment": 0,
"monthlyInstallment": 1250,
"totalAmount": 5000,
"currency": "EGP",
"interestRate": 0,
"firstDueDate": "2025-03-24",
"frequency": "MONTHLY",
"eligibilityRange": {
"minAmount": 500,
"maxAmount": 100000,
"maxTenure": 60
}
}
Key Details:
ValU evaluates customer eligibility based on:
Not all customers qualify for all plan amounts. If a customer is ineligible, they'll see limited or no plans. You cannot directly check eligibility via API; customers discover eligibility during checkout.
Payment aggregators send webhooks for transaction status updates:
Paymob Webhook Example:
{
"obj": {
"id": 123456789,
"pending": false,
"amount_cents": 500000,
"currency": "EGP",
"merchant_order_id": "ORD-2025-12345",
"status": "SUCCESS",
"transaction": {
"id": 987654321,
"pending": false,
"success": true,
"amount_cents": 500000,
"currency": "EGP",
"gateway_integration_id": 123456,
"method_integration_id": 123456,
"data": {
"message": "Approved",
"phone": "+201234567890",
"amount": "50.00"
}
}
}
}
Verify webhook signature:
const crypto = require('crypto');
const signature = crypto
.createHmac('sha256', YOUR_WEBHOOK_SECRET)
.update(JSON.stringify(webhookBody))
.digest('hex');
if (signature === req.headers['x-hmac-sha256']) {
// Valid webhook
}
Listen for these events:
success - Payment and installment plan confirmedfailure - Customer rejected or eligibility check failedpending - Transaction awaiting confirmation1. Customer adds items to cart
2. At checkout, show available payment methods (include ValU)
3. IF customer selects ValU:
a. Optionally fetch installment plans for display
b. Redirect to aggregator checkout (Paymob/PayTabs/OPay)
c. Customer completes KYC and plan selection
d. Webhook confirms order status
4. Fulfill order when status = "success" or "approved"
1. On product page, show price
2. Fetch installment plans from aggregator (optional)
3. Display "Pay EGP 1,250/month for 4 months" badge
4. Let customer add to cart and proceed to checkout
5. Real eligibility determined at checkout (depends on customer's ValU profile)
1. Aggregator sends webhook when installment is due
2. Display reminder to customer in your app
3. Link customer to ValU app to complete payment
4. Receive webhook when payment is made
5. If customer defaults, aggregator notifies you
6. Escalate if needed (suspend account, restrict future BNPL, etc.)
Common errors and how to handle them:
{
"error": true,
"message": "Customer not eligible for ValU",
"code": "VALU_INELIGIBLE"
}
Common Errors:
| Error Code | Meaning | Action |
|---|---|---|
VALU_INELIGIBLE | Customer doesn't qualify for ValU | Offer alternative payment methods |
INSUFFICIENT_CREDIT | Customer has hit credit limit | Reduce amount or suggest fewer installments |
INVALID_PHONE | Phone not registered with ValU | Ask customer to register first |
OTP_FAILED | Customer failed OTP verification | Allow retry |
TIMEOUT | Checkout session expired | Create new checkout session |
AMOUNT_BELOW_MIN | Amount < 500 EGP | Minimum is usually 500 EGP |
AMOUNT_EXCEEDS_MAX | Amount exceeds customer's limit | Suggest different amount |
HTTP Status Codes:
200 OK - Success400 Bad Request - Validation error401 Unauthorized - Invalid credentials404 Not Found - Order or plan not found422 Unprocessable Entity - Business logic error (ineligible, exceeded credit, etc.)500 Server Error - Retry with exponential backoffAmount units depend on the aggregator:
amount_cents). 1 EGP = 100 piasters. EGP 50 = 5000.Always check your chosen aggregator's documentation. Do not assume a single unit applies across all paths.
Direct API:
Authentication:
Customer Eligibility:
Installment Timing:
Minimum and Maximum Amounts:
Interest-Free Claims:
Egyptian Market Specifics:
+20 country codeAggregator Choice Matters:
Checkout Expiration:
Merchant Registration:
No Recurring Payments:
| Aggregator | Best For | API Type | Support |
|---|---|---|---|
| Paymob | Most Egyptian merchants, feature-rich | REST + Webhooks | Excellent |
| PayTabs | Hosted page preference, in-store payments | Hosted page + API | Good |
| OPay | Dedicated installment flows | REST with installment endpoints | Good |
| Geidea | Enterprise merchants | REST + Advanced | Enterprise support |
Start with Paymob if you're new to Egyptian BNPL integration.