Service Add-ons
Service add-ons (also called extras) let buyers customize orders with additional features beyond base packages. Add-ons are stored in the wpssserviceaddons database table and increase average order value.
Add-on Limits
| Version | Maximum Add-ons |
|---|---|
| Free | 3 add-ons per service |
| [PRO] | Unlimited (filter: wpssservicemax_extras returns -1) |
Add-on Field Types

Four field types are supported by ServiceAddonService:
1. Checkbox
Simple yes/no toggle for binary options.
Constant: ServiceAddonService::TYPE_CHECKBOX
Use Cases:
- Rush delivery
- Source files
- Commercial license
- Priority support
Example:
'field_type' => 'checkbox',
'title' => 'Express Delivery',
'price' => 25.00,
'price_type' => 'flat'
Buyer Interface: Single checkbox ()
2. Quantity
Select number of units with min/max range.
Constant: ServiceAddonService::TYPE_QUANTITY
Use Cases:
- Extra revisions (1-10)
- Additional pages
- Extra hours
- Product count
Fields:
min_quantity– Minimum units (default: 1)max_quantity– Maximum units (default: 10)
Example:
'field_type' => 'quantity',
'title' => 'Additional Revisions',
'price' => 10.00,
'price_type' => 'quantity_based',
'min_quantity' => 1,
'max_quantity' => 5
Buyer Interface: Number input or quantity selector
Price Calculation:
$total = $addon->price * $quantity;
// Example: $10 × 3 revisions = $30
3. Dropdown
Choose one option from a list.
Constant: ServiceAddonService::TYPE_DROPDOWN
Use Cases:
- Resolution selection (720p, 1080p, 4K)
- Format choice
- Delivery speed tiers
Options Structure:
{
"options": [
{"label": "HD 720p", "value": "720p", "price": 0},
{"label": "Full HD 1080p", "value": "1080p", "price": 10},
{"label": "4K UHD", "value": "4k", "price": 25}
]
}
Buyer Interface: dropdown
4. Text
Custom text input from buyer.
Constant: ServiceAddonService::TYPE_TEXT
Use Cases:
- Business name
- Custom domain
- Personalization text
- Special instructions
Validation:
- Maximum 500 characters
- Free-form text input
- Fixed price (not variable by content)
Example:
'field_type' => 'text',
'title' => 'Business Name for Logo',
'price' => 0, // No additional charge, just info gathering
'is_required' => false
Note: Text inputs do NOT support variable pricing based on content length.
Field Types That Do NOT Exist
The following types mentioned in old docs are fabricated:
- Radio buttons – Not a separate type (use dropdown instead)
- Multi-select – Not implemented (only single-select dropdown)
Pricing Types
Three pricing models defined in ServiceAddonService:
Flat Rate
Fixed price added to order.
Constant: ServiceAddonService::PRICE_FLAT
Calculation:
$addon_cost = $addon->price; // Always fixed amount
Example:
Source Files: $30 (flat)
→ Any package + source files = +$30
Percentage
Percentage of package price.
Constant: ServiceAddonService::PRICE_PERCENTAGE
Calculation:
$addon_cost = ($package_price * $addon->price) / 100;
Example:
Commercial License: 25% of package price
→ Basic ($100) + license = $100 + $25 = $125
→ Premium ($500) + license = $500 + $125 = $625
Note: Percentage pricing is a [PRO] feature.
Quantity-Based
Price multiplied by quantity selected.
Constant: ServiceAddonService::PRICE_QUANTITY
Calculation:
$addon_cost = $addon->price * $quantity;
Example:
Extra Pages: $20 per page
→ 3 pages selected = $20 × 3 = $60
Note: Quantity-based pricing is a [PRO] feature.
