Get started
Integrations
Install Caravel Pay on your billing or shop platform: upload the module, paste your Polygon wallet and save. Every module creates its API keys for you, sends buyers to the hosted checkout, and marks invoices paid only after confirming the payment with the API.
Choose your platform#
| Platform | Requires | Download Available at launch |
|---|---|---|
| WooCommerce | WordPress + WooCommerce, HTTPS | caravel-pay-woocommerce.zip |
| WHMCS | WHMCS 8, HTTPS System URL | caravel-pay-whmcs.zip |
| Easy Digital Downloads | EDD 3.x, WordPress 6.2+, store currency USD | caravel-pay-edd.zip |
| FOSSBilling | FOSSBilling 0.7.2+, invoices in USD | caravel-pay-fossbilling.zip |
| Paymenter | Paymenter 1.x, invoices in USD | caravel-pay-paymenter.zip |
| PrestaShop | PrestaShop 1.7.7 to 8.x, PHP 7.4+, store currency USD | caravel-pay-prestashop.zip |
| OpenCart | OpenCart 4.0.2+, customer currency USD | caravelpay.ocmod.zip |
| Magento 2 | Magento / Adobe Commerce 2.4.4+ or Mage-OS, Luma checkout, cron, orders in USD | caravel-pay-magento2.zip |
| Laravel | Laravel 10 to 12, PHP 8.1+ | caravel-pay-laravel.zip |
| Blesta | Blesta 5, invoices in USD | caravel-pay-blesta.zip |
| HostBill | HostBill, invoices in USD | caravel-pay-hostbill.zip |
| Clientexec | Clientexec 7.3+, invoices in USD | caravel-pay-clientexec.zip |
| Your own PHP code | PHP 7.4+ | caravel-php-1.0.0.zip |
| Your own Node.js code | Node 18.17+ | caravel-pay-1.0.0.tgz |
| No website | A Polygon wallet | Nothing to install |
Available at launch. The downloads on this page open when Caravel Pay launches.
How every module works#
- No account, no keys to copy. When you save your wallet (or, on platforms without a save hook, at the first payment), the module calls POST /v1/connect and stores the merchant id and secret on your server.
- Invoice → checkout → redirect. The checkout is created when the buyer clicks pay, not when an invoice is viewed or emailed. A second click reuses the open checkout.
- Paid means confirmed. Webhooks are verified, then the module re-reads the checkout with a signed GET /v1/checkouts/{id}. Only a confirmed
paidrecords the payment, with the payout transaction hash as its id. - Short payments are never "paid".
underpaidandreviewleave the invoice unpaid and add a note. There is no tolerance setting to get wrong. See Checkout statuses. - Changing your wallet creates new keys. Checkouts already started finish on the old wallet, and their webhooks keep verifying for 7 days.
- US dollars. Checkouts are priced in USD. WHMCS can convert other currencies for you; the other platforms need USD invoices.
There is no test mode. Check your setup with a small real payment, such as a $1.00 invoice. The payout arrives in your wallet minus the 2% Caravel fee.
WHMCS#
A gateway module named caravelpay for WHMCS 8. The Caravel Pay PHP SDK is bundled, so there's no Composer step.
Install#
Download and unzip
caravel-pay-whmcs.zip.Upload its
modules/folder into your WHMCS root, merging with the existing one. It addsmodules/gateways/caravelpay.php,modules/gateways/caravelpay/andmodules/gateways/callback/caravelpay.php.Activate under Setup › Payments › Payment Gateways › All Payment Gateways › Caravel Pay.
Paste your payout wallet (and optionally a contact email) and click Save Changes. The settings page shows Connected as mch_….
Your System URL must be https://. For clients in other currencies, set Convert To For Processing to USD: the USD amount is charged and the invoice is credited in its own currency. The webhook endpoint /modules/gateways/callback/caravelpay.php must accept POST from the internet.
How invoices update#
| Checkout status | WHMCS |
|---|---|
| paid | addInvoicePayment() with the payout tx hash, the invoice amount and the 2% Caravel fee. Gateway Log: Successful |
| underpaid | Not paid. Gateway Log Underpaid and an invoice note with the amount that arrived |
| review | Not paid. Gateway Log Review and an invoice note |
| expired | Not paid. Gateway Log Expired. The client can click Pay Now again |
Every webhook outcome, including rejected signatures, is listed under Billing › Gateway Log. Renewal invoices are paid from the invoice like any other: there are no automatic charges.
Switching from PayGate#
The PayGate modules (paygatedottohosted, paygatedottocustom) can stay active while you switch. If one is configured, the Caravel Pay settings page shows the wallet it pays out to, so you can paste the same one. Nothing is copied automatically. Make Caravel Pay the default gateway. When you later deactivate PayGate, WHMCS asks which gateway its clients and invoices move to.
Easy Digital Downloads#
A WordPress plugin that adds Caravel Pay as an EDD 3.x payment gateway.
Install#
Download
caravel-pay-edd.zip.Upload and activate under Plugins › Add New Plugin › Upload Plugin.
Paste your payout wallet under Downloads › Settings › Payments › Caravel Pay and save. A notice confirms Caravel Pay is connected.
Turn it on under Downloads › Settings › Payments › General › Active Gateways.
How orders update#
| Checkout status | EDD order |
|---|---|
| paid | Complete. The transaction id is the payout tx hash, and a note gives the payout |
| underpaid review | On Hold (Pending if your EDD has no On Hold status), with a note |
| expired | Failed, with a note. A payment found later still completes the order |
The purchase confirmation page also checks a pending order with one signed request, so buyers usually see Complete straight away. Allow POST to /wp-json/caravel-pay-edd/v1/webhook in your security plugin or firewall.
Switching from PayGate#
If PayGate's EDD gateway is configured, the Caravel Pay settings show the wallet it pays out to, so you can paste the same one. Both gateways can stay active while you test. Then untick PayGate under Active Gateways.
FOSSBilling#
A payment adapter for FOSSBilling 0.7.2 and later.
Install#
Download and unzip
caravel-pay-fossbilling.zipin your FOSSBilling root. It addslibrary/Payment/Adapter/CaravelPay/.Install the gateway: in the admin area, open Payment gateways, choose the New payment gateway tab and install CaravelPay.
Paste your payout wallet, tick Enabled and save. The adapter connects to Caravel Pay at the first payment.
How invoices update#
On paid, the amount is added to the client's balance and the invoice is paid with credits, the way FOSSBilling's own gateways do it. The transaction gets the payout tx hash as its id. underpaid and review add an invoice note and leave the invoice unpaid. FOSSBilling's ipn.php normally answers 200 even when an adapter fails, so this adapter sets the HTTP status itself, which makes Caravel Pay retry failed deliveries.
Switching from PayGate#
Install Caravel Pay next to PayGate's adapter, paste the same Polygon wallet, and disable PayGate once its open invoices are settled.
Paymenter#
A gateway extension for Paymenter 1.x.
Install#
Download
caravel-pay-paymenter.zip. It contains one folder,CaravelPay/.Put the folder in
extensions/Gateways/, givingextensions/Gateways/CaravelPay/CaravelPay.php. Or upload the zip, if your Paymenter version can upload extensions from the admin area.Add a gateway in the admin area, choose Caravel Pay, paste your payout wallet and save. Saving connects to Caravel Pay.
How invoices update#
Caravel Pay is offered for USD invoices only. On paid, the module calls ExtensionHelper::addPayment() with the remaining amount, the 2% Caravel fee and the payout tx hash; a repeat with the same tx hash updates that transaction instead of adding one. underpaid and review leave the invoice unpaid and are logged as warnings in the Laravel log. APP_URL must be your public HTTPS address, and POST /extensions/caravelpay/webhook must be reachable.
Switching from PayGate#
Add the Caravel Pay gateway with the same Polygon wallet you used with PayGate, then disable PayGate once its open invoices are settled.
PrestaShop#
A payment module named caravelpay for PrestaShop 1.7.7 to 8.x. The Caravel Pay PHP SDK is bundled, so there's no Composer step. It needs PHP 7.4 or later; PrestaShop 1.7.7 itself stops at PHP 7.3, so 1.7.8 is the practical minimum.
Install#
Upload
caravel-pay-prestashop.zipunder Modules › Module Manager › Upload a module.Configure the module: paste your payout wallet and click Save. The status panel shows Connected with your merchant id.
Enable it for US dollar (and your carriers, groups and countries) under Payment › Preferences.
The webhook URL is /module/caravelpay/webhook (or index.php?fc=module&module=caravelpay&controller=webhook without friendly URLs). It must accept POST from the internet, so keep maintenance mode off.
How orders update#
Placing the order creates it in Awaiting Caravel Pay payment and sends the buyer to the hosted checkout.
| Checkout status | PrestaShop order |
|---|---|
| awaiting_payment confirming | Awaiting Caravel Pay payment |
| paid | Payment accepted. The payment is recorded with the payout tx hash as its transaction id, and a private note shows the payout. |
| underpaid review | Caravel Pay: on hold, with a private note |
| expired | Canceled if still awaiting. A late paid still moves it to Payment accepted. |
While an order is unpaid, the confirmation page and the customer's order page show a Pay now button.
Switching from PayGate#
Install Caravel Pay next to the PayGate module (instantpayment_gateway) and copy your wallet across; nothing is imported automatically. PayGate's Awaiting card payment corresponds to Awaiting Caravel Pay payment, and its below-tolerance Payment error to Caravel Pay: on hold. There is no fees-tolerance setting. Disable PayGate under Payment › Preferences once its open orders are settled.
OpenCart#
An OpenCart 4 payment extension (4.0.2.0 or later). OpenCart 3 isn't supported. Keep the file name caravelpay.ocmod.zip, because OpenCart 4 names the extension after it.
Install#
Upload
caravelpay.ocmod.zipunder Extensions › Installer and click Install next to it.Install the payment method under Extensions › Extensions › Payments, then edit it.
Paste your payout wallet, switch Status on and save. The Connection panel shows Connected.
Caravel Pay shows at checkout only when the customer's currency is USD. The webhook URL is index.php?route=extension/caravelpay/payment/caravelpay.callback.
How orders update#
| Checkout status | OpenCart order (statuses are configurable) |
|---|---|
| awaiting_payment confirming | Pending |
| paid | Processing. The customer is notified, and the history comment shows the payout and its transaction link. |
| underpaid review | On Hold (created at install), with a comment |
| expired | Canceled if still pending. A late paid still moves it to Processing. |
Switching from PayGate#
Install Caravel Pay next to the PayGate extension (paygatedotto) and copy your wallet across. PayGate's paid-order status maps to Paid status; there is no Fees Tolerance or API Domain setting. Switch PayGate off once its open orders are settled.
Magento 2#
A module named Caravel_Pay for Magento Open Source and Adobe Commerce 2.4.4 or later, and Mage-OS. It supports the Luma checkout; Hyvä Checkout needs its own renderer, which isn't included. Magento cron must run.
Install#
Add the module: either install
caravel-pay-magento2-composer.zipas a Composer artifact (composer config repositories.caravelpay artifact ./artifacts, thencomposer require caravelpay/module-caravel-pay:1.0.0), or unzipcaravel-pay-magento2.zipin the Magento root (it createsapp/code/Caravel/Pay).Run
bin/magento module:enable Caravel_Payandbin/magento setup:upgrade. In production mode, also runsetup:di:compileandsetup:static-content:deploy.Configure under Stores › Configuration › Sales › Payment Methods › Caravel Pay: enable it, paste your payout wallet and save. The Connection line shows Connected.
How orders update#
Place Order creates the order as Pending Payment with the status Awaiting Caravel Pay payment. Magento's own "Pending Payment Order Lifetime" cleanup doesn't cancel orders in this status.
| Checkout status | Magento order |
|---|---|
| awaiting_payment confirming | Awaiting Caravel Pay payment |
| paid | Invoiced (transaction id = payout tx hash), then Processing. The order email is sent now. |
| underpaid review | On Hold, with a comment |
| expired | A comment. Cron cancels the order after Cancel unpaid orders after (hours) (default 24), once it has re-checked that the checkout is still expired. |
Cancellation waits because Magento can't invoice a cancelled order, and a payment sent just before expiry can still confirm after it. If a payment arrives after the order was cancelled, the order stays cancelled and gets a comment with the payout, so you can fulfil a replacement or refund from your wallet.
Switching from PayGate#
Install Caravel Pay next to the PayGate module and copy your wallet across. PayGate's hosted method corresponds to Caravel Pay; its single-provider method has no equivalent. PayGate's own order status and its 24-hour cron cancellation correspond to Awaiting Caravel Pay payment and Cancel unpaid orders after (hours). A short payment goes On Hold in both. Disable PayGate once its open orders are settled.
Laravel#
A package for Laravel 10, 11 and 12 (PHP 8.1+): the Caravel facade, a signed webhook route with the caravel.webhook middleware, and events for the checkout's re-fetched status.
Install#
Require it from the zip as a Composer artifact: put
caravel-pay-laravel.zipin anartifacts/folder in your project, runcomposer config repositories.caravelpay artifact ./artifacts, thencomposer require caravelpay/caravel-laravel:1.0.0.Get your keys:
php artisan caravel:connect 0xYourWallet --site=https://shop.exampleprintsCARAVEL_MERCHANT_IDandCARAVEL_SECRETfor.env. The secret is shown only once.Create checkouts with
Caravel::createCheckout([...])andcallback_urlset toroute('caravel.webhook').
How orders update#
The route verifies the signature, answers duplicates with 200, re-reads the checkout and dispatches CheckoutPaid, CheckoutUnderpaid, CheckoutExpired or CheckoutReview for its current status. Your listeners update the order. If a listener throws, the route answers 503 and Caravel Pay retries. To rotate keys, run caravel:connect --force and keep the printed CARAVEL_PREVIOUS_CREDENTIALS line for a day.
Switching from PayGate#
The caravel.webhook middleware takes the place of PayGate's paygate.callback. The callback is a signed POST with a fixed amount, so there's no order token or tolerance to check. Both packages can run side by side while open PayGate payments finish.
Blesta#
A non-merchant gateway for Blesta 5.
Install#
Unzip
caravel-pay-blesta.zipin the Blesta root. It addscomponents/gateways/nonmerchant/caravel_pay/.Install Caravel Pay under Settings › Company › Payment Gateways › Available.
Paste your payout wallet and click Update Settings. Saving connects; if connecting fails, the reason is shown and nothing is saved.
How invoices update#
On paid, an Approved transaction is applied to the invoices that were paid. Its transaction id is the checkout id and its reference id the payout tx hash. underpaid, review and confirming record a Pending transaction that isn't applied; the same transaction becomes Approved if the checkout is paid later. expired records nothing.
Switching from PayGate#
PayGate has no Blesta gateway, so there's nothing to migrate: install Caravel Pay and enable it.
HostBill#
A payment module for HostBill. HostBill is the one exception to "no keys to copy": its module settings can't connect by themselves, so you get the merchant id and secret once with the bundled helper.
Install#
Unzip
caravel-pay-hostbill.zipin the HostBill root. It addsincludes/modules/Payment/caravelpay/.Get your keys on the server:
php includes/modules/Payment/caravelpay/lib/caravel-connector/connect-cli.php --wallet=0x… --site=https://billing.example --platform=hostbill. The secret is shown only once.Activate Caravel Pay under Settings › Modules › Payment Modules and paste the Merchant ID and Secret.
How invoices update#
The invoice page links to a signed start URL, so the amount can't be changed. On paid, a transaction for the checkout amount is added to the invoice once, with the checkout id as its transaction id and the payout link in its description. Every other status is only written to the gateway log. When you replace the keys, list the old pair under Previous credentials for a day.
Switching from PayGate#
PayGate has no HostBill module. HostBill's built-in "Paygate" gateway appears to belong to an unrelated provider, so there's nothing to migrate.
Clientexec#
An offsite gateway plugin for Clientexec 7.3 or later.
Install#
Upload the
caravelpayfolder fromcaravel-pay-clientexec.zipintoplugins/gateways/.Open Settings › Plugins › Gateways › Caravel Pay, paste your payout wallet and turn on One-Time Payments.
The plugin connects at the first payment and keeps its keys in its own table, with the secret encrypted. To get new keys for the same wallet, change Reconnect Code.
How invoices update#
On paid, the plugin records Payment accepted for the checkout amount, once. The transaction id is the checkout id, and the description carries the payout link; Clientexec handles partial payments and overpayments as usual. underpaid and review record Payment pending with the amount that arrived. expired logs a rejected attempt without changing the invoice.
Switching from PayGate#
PayGate has no Clientexec gateway, so there's nothing to migrate.
Postman and AI agents#
Two files for developers. caravel-pay-api.postman_collection.json holds every API request. Its pre-request script signs each one for you, and a "signed test webhook" request lets you test your own handler. caravel-pay-api-llm.md is a single reference for AI coding agents: the rules an integration must follow, the signing code in Node.js, PHP, Python and curl, every endpoint and error, and the test vectors.
Your own code#
Building on another platform? The PHP SDK and Node.js SDK do the signing, webhook verification and response checks for you. Each module above is built on the PHP SDK. Or call the API directly.