Billing Overview
YeboLink uses a credit-based billing system. Purchase credits to send messages across all channels.
How Credits Work
Credits are the currency used to pay for messages on YeboLink. Different message channels consume different amounts of credits:
| Channel | Credits per Message/Unit |
|---|---|
| SMS | 1 credit per message (160 chars) |
| 0.5 credits per message | |
| 0.1 credits per email | |
| Voice | 2 credits per minute |
SMS MESSAGE SPLITTING
Long SMS messages are automatically split into segments:
- Standard SMS: 160 characters per segment
- Unicode SMS (with emojis): 70 characters per segment
- Each segment costs 1 credit
Credit Packages
YeboLink offers flexible credit packages to suit businesses of all sizes.
Endpoint
GET /api/v1/billing/packagesRequest
curl -X GET https://api.yebolink.com/api/v1/billing/packagesconst response = await fetch('https://api.yebolink.com/api/v1/billing/packages');
const data = await response.json();
console.log('Available packages:', data.data.packages);import requests
response = requests.get('https://api.yebolink.com/api/v1/billing/packages')
data = response.json()
for package in data['data']['packages']:
print(f"{package['credits']} credits: ${package['price']}")<?php
$response = file_get_contents('https://api.yebolink.com/api/v1/billing/packages');
$data = json_decode($response, true);
foreach ($data['data']['packages'] as $package) {
echo $package['credits'] . " credits: $" . $package['price'] . "\n";
}
?>Response
{
"success": true,
"data": {
"packages": [
{
"credits": 100,
"price": 10.00,
"price_per_credit": 0.10
},
{
"credits": 500,
"price": 45.00,
"price_per_credit": 0.09
},
{
"credits": 1000,
"price": 80.00,
"price_per_credit": 0.08
},
{
"credits": 5000,
"price": 350.00,
"price_per_credit": 0.07
},
{
"credits": 10000,
"price": 600.00,
"price_per_credit": 0.06
}
]
}
}VOLUME DISCOUNTS
Larger packages offer better value! The more credits you buy, the lower the per-credit cost.
Checking Your Balance
Your current credit balance is returned with every authenticated request and can be viewed in your dashboard.
Using the Account Endpoint
// Login returns your credit balance
const loginResponse = await fetch('https://api.yebolink.com/api/v1/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
email: 'john@company.com',
password: 'SecurePass123!'
})
});
const data = await loginResponse.json();
console.log('Credits balance:', data.data.workspace.credits_balance);Transaction Types
Credits can be affected by several transaction types:
| Type | Description | Effect on Balance |
|---|---|---|
| purchase | Credit package purchase | Increases balance |
| usage | Message sent | Decreases balance |
| refund | Failed message refund | Increases balance |
| adjustment | Manual adjustment by admin | Increases/decreases |
Low Credit Alerts
INSUFFICIENT CREDITS
When your credit balance is insufficient for an operation, you'll receive a 402 Payment Required error:
{
"success": false,
"error": "Insufficient credits. You need 100 credits but have 50."
}Handling Low Credits
async function sendMessageWithCreditCheck(messageData) {
try {
const response = await fetch('https://api.yebolink.com/api/v1/messages/send', {
method: 'POST',
headers: {
'X-API-Key': process.env.YEBOLINK_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(messageData)
});
const data = await response.json();
if (response.status === 402) {
// Insufficient credits - redirect to purchase
console.error('Insufficient credits:', data.error);
window.location.href = '/billing/purchase';
return;
}
return data;
} catch (error) {
console.error('Error sending message:', error);
}
}Credit Calculation Examples
SMS Examples
Single SMS (120 chars):
"Hello John, your appointment is confirmed for tomorrow at 10 AM. See you then!"
Credits: 1
Long SMS (250 chars - 2 segments):
"Hello John, your appointment is confirmed for tomorrow at 10 AM. Please arrive 10 minutes early to complete any necessary paperwork. If you need to reschedule, please call us at +1234567890. We look forward to seeing you!"
Credits: 2
SMS with Emojis (100 chars - 2 segments):
"🎉 Hi John! Your order #12345 has shipped! Track it here: https://tracking.com/12345 😊"
Credits: 2 (Unicode SMS uses 70 chars/segment)WhatsApp Examples
Single WhatsApp message:
"Hi John, your package has been delivered!"
Credits: 0.5
WhatsApp with media:
Message + Image attachment
Credits: 0.5Email Examples
Single email:
"Welcome to our newsletter!"
Credits: 0.1
Bulk email (100 recipients):
Same email to 100 people
Credits: 10 (0.1 × 100)Bulk Campaign Example
Campaign: Send SMS to 1,000 customers
Message: "Hi {{name}}, special 20% off for you! Use code SAVE20"
Length: 56 characters (1 segment per message)
Calculation:
1,000 recipients × 1 credit = 1,000 credits
Cost (with 1,000 credit package):
1,000 credits × $0.08 = $80.00Best Practices
1. Monitor Credit Usage
// Track credits used per campaign
async function sendCampaignWithTracking(recipients, message) {
// Get initial balance
const initialBalance = await getCurrentBalance();
// Send messages
const result = await sendBulkSMS({
recipients,
channel: 'sms',
content: { text: message }
});
// Get new balance
const newBalance = await getCurrentBalance();
// Calculate usage
const creditsUsed = initialBalance - newBalance;
console.log(`Campaign sent to ${recipients.length} recipients`);
console.log(`Credits used: ${creditsUsed}`);
console.log(`Remaining balance: ${newBalance}`);
return {
sent: result.data.queued,
creditsUsed,
remainingBalance: newBalance
};
}2. Optimize Message Length
// Keep SMS under 160 characters to use only 1 credit
function optimizeSMS(message) {
const limit = 160;
if (message.length > limit) {
console.warn(`⚠️ Message is ${message.length} chars (${Math.ceil(message.length / limit)} credits)`);
console.log('Consider shortening to save credits');
}
return message;
}
// Example
const message = optimizeSMS('Your appointment is tomorrow at 10 AM');
// ✅ 41 chars - 1 credit3. Set Up Low Credit Alerts
// Check balance before major campaigns
async function checkBalanceBeforeCampaign(recipientCount, creditsPerMessage = 1) {
const balance = await getCurrentBalance();
const required = recipientCount * creditsPerMessage;
if (balance < required) {
throw new Error(
`Insufficient credits. Need ${required}, have ${balance}. ` +
`Purchase ${required - balance} more credits.`
);
}
return true;
}
// Usage
try {
await checkBalanceBeforeCampaign(5000, 1); // 5000 SMS messages
await sendBulkCampaign(...);
} catch (error) {
console.error(error.message);
// Redirect to purchase credits
}4. Use the Right Channel
// Choose channel based on urgency and cost
function selectChannel(message, urgency) {
const channels = {
urgent: 'sms', // 1 credit - instant delivery
normal: 'whatsapp', // 0.5 credits - good delivery rates
low: 'email' // 0.1 credits - cheapest option
};
return channels[urgency] || 'sms';
}
// Example
const channel = selectChannel('Your OTP is 123456', 'urgent');
// Returns 'sms' for urgent messagesCredit Expiration
NO EXPIRATION
YeboLink credits never expire! Purchase credits and use them at your own pace.
Refund Policy
Automatic Refunds
Credits are automatically refunded for:
- Failed message deliveries
- Invalid phone numbers (detected before sending)
- Provider errors
{
"type": "refund",
"amount": 50,
"description": "Refund for failed messages",
"created_at": "2025-11-02T14:30:00Z"
}Manual Refunds
For billing issues or disputes:
- Contact support@yebolink.app
- Provide transaction ID
- Explain the issue
Refunds are processed within 5-7 business days.
Enterprise Plans
Need custom pricing or billing?
Enterprise features:
- Custom credit pricing
- Dedicated account manager
- Priority support
- Custom SLAs
- Volume discounts
- Invoice billing
Contact: enterprise@yebolink.app
Next Steps
- Purchase Credits - Buy credit packages
- Transaction History - View your transaction history
- Send Messages - Start sending messages
Need Help?
- Email: support@yebolink.app
- Dashboard: dashboard.yebolink.com