VibeFox Xendit for WooCommerce — Help
Requirements
WordPress: 6.0 or later.
WooCommerce: 8.0 or later, installed and active. The plugin refuses to activate without it.
PHP: 8.0 or later.
Store currency: IDR, PHP, VND, THB, MYR, USD or SGD. For other currencies the payment method is not shown. Which payment channels and currencies are really available depends on your Xendit account.
Xendit account: you need a secret API key with write permission for Money-in (invoices) for test mode and another one for live mode, and the webhook verification token of each mode (see Configuration). Only the secret keys and the verification tokens are used. No public key is needed, because the customer pays on the Xendit hosted invoice page.
VibeFox license key: bought on vibefox.net. One key works on one domain.
Installation
1. In WordPress go to Plugins > Add New > Upload Plugin, choose the plugin ZIP file and click Install Now. You can also upload the wcp_xendit_payment_gateway folder to /wp-content/plugins/ by FTP.
2. Click Activate.
3. Open the settings: WooCommerce > Settings > Payments > Xendit > Manage, or click Settings under the plugin name on the Plugins page.
4. Enter your VibeFox license key in the license block at the top of the page and click Activate.
5. Paste your Xendit secret keys, set the webhook URL in the Xendit Dashboard and paste the verification tokens (see Configuration).
6. Turn on Enable/Disable. Place a test order in test mode, then untick Test Mode to take real payments.
Configuration
All settings are on one page: WooCommerce > Settings > Payments > Xendit. Above the fields a banner shows the active mode: TEST MODE (invoices are created with the Test secret key and no real money is charged) or LIVE MODE (invoices are created with the Live secret key and customers are charged). The banner warns you when the secret key of the active mode is missing or has the wrong prefix (the payment method is then hidden at checkout), and when the webhook verification token of the active mode is empty (Xendit notifications are rejected, so orders are only updated when the customer returns to your store). In the list of payment methods, Xendit is marked as needing setup until the active mode has a valid secret key.
General
Enable/Disable: Enable Xendit turns the payment method on or off. Default: off.
Title: the payment method name customers see at checkout. Default: Xendit.
Description: the text shown under the payment method at checkout. Default: Pay with virtual accounts, e-wallets, QR codes, retail outlets or cards via Xendit.
API keys
Create a secret API key with write permission for Money-in (invoices) in Xendit Dashboard > Settings > Developers > API keys, once in Test mode and once in Live mode. The key decides where the invoice is created. When you save, a key that does not start with the prefix of its field is not saved, and the page shows, for example, Test secret key was not saved: it must start with xnd_development_. The other settings are saved.
Test Mode: Enable test mode creates invoices with the Test secret key, so no real money is charged. Default: on. Untick it to accept real payments with the Live secret key.
Test Secret Key: the secret key of the Xendit Test mode. It starts with xnd_development_.
Live Secret Key: the secret key of the Xendit Live mode. It starts with xnd_production_.
Webhooks
The webhook tells your store that an invoice has been paid. In Xendit Dashboard > Settings > Developers > Webhooks set the URL shown in this section of the settings for Invoices > Invoice paid, in Test mode and in Live mode. Optionally set it for Invoice expired too. The URL looks like https://your-site/wc-api/xendit_p_callback/. Copy it exactly as the settings show it.
Then copy the Webhook verification token of each mode from the Xendit Dashboard into the matching field. Xendit sends it in the x-callback-token header. Notifications without the token of the mode the invoice was created in are rejected. The token only proves that the notification comes from Xendit: the invoice status, amount and currency are always read again from the Xendit API with the secret key of that mode. Without the webhook, an order is confirmed only when the customer comes back to the store after paying.
Test Webhook Verification Token: the webhook verification token of the Xendit Test mode.
Live Webhook Verification Token: the webhook verification token of the Xendit Live mode.
Payment
Invoice Description: the description shown on the Xendit invoice. You can use the placeholders {order_id}, {order_number} and {site_name}. HTML is removed and the text is cut to 255 characters. Default: Order #{order_id}.
Order Status After Payment: the order status set after Xendit confirms the payment. The status is set at once, in a single status change.
Advanced
Debug Log: Log API requests and webhooks writes requests, webhooks and status changes to WooCommerce > Status > Logs, source wcp_xendit_payment_gateway. Errors and warnings are always logged, even when this is off. API keys, tokens and customer data are not logged. Default: off.
Delete Data on Uninstall: Delete the plugin settings and logs when the plugin is deleted. Deactivating the plugin never deletes anything. Order data (invoice IDs in orders) is always kept. Default: off.
Checkout
The payment method is shown when the store currency is IDR, PHP, VND, THB, MYR, USD or SGD. On the Pay for order page the order currency counts. The customer chooses the payment method (by default Xendit) and places the order. The plugin creates a Xendit invoice for the order total in the order currency and sends the customer to the Xendit invoice page. IDR and VND amounts are rounded to whole numbers, because Xendit does not accept decimals for them. The customer's billing e-mail is passed to Xendit. On the invoice page the customer pays with one of the payment channels activated in your Xendit account for this currency, for example a virtual account, an e-wallet, a QR code, a retail outlet or a card.
After paying, the customer returns to the order received page of your store. The order is marked paid only after Xendit confirms it: by the webhook, or by a server-side request to the Xendit API when the customer lands on that page. Until then the order stays Pending payment.
If the invoice fails or expires, Xendit sends the customer back. An order placed at checkout is then cancelled the standard WooCommerce way, and its invoice is expired. An order paid from the Pay for order page (for example an order you created for the customer) returns to its payment page with the message The Xendit payment was not completed. You can try again or choose another payment method. and stays payable.
A customer can pay an unpaid order again. If the order total, currency and mode are unchanged and the open invoice is still valid, the customer is sent to the same invoice. Otherwise the old invoice is expired first and a new one is created, so there are never two open invoices for one order. If the old invoice was already paid, the order is completed instead of a new payment.
If Xendit cannot start the payment, the customer sees a short message and can choose another payment method, for example Xendit is temporarily unavailable. Please try again in a few minutes or choose another payment method., a message that the currency is not accepted for your account or that the order total is outside the Xendit amount limits. The technical reason is written to the log. An order with a zero total cannot be paid with Xendit.
The payment method works on the classic checkout, on the Checkout block and on the Pay for order page. In test mode the Checkout block shows Test mode: no real money is charged. under the payment method. It is compatible with WooCommerce High-Performance Order Storage (HPOS).
The payment always happens on the Xendit page. The plugin has no refunds from WooCommerce, no saved cards, subscriptions or recurring payments, no card or e-wallet fields on the checkout page, no separate authorize and capture, and no xenPlatform sub-accounts, custom invoice expiry or payment fees.
Orders
Order statuses
Pending payment: the invoice was created and the customer has not paid yet, or Xendit has not confirmed the payment yet. The order note shows the invoice ID, amount, currency and mode.
Processing or Completed: the payment was confirmed. The status follows Order Status After Payment. The order note shows the invoice ID, the paid amount, the payment channel and the mode. The transaction ID is the Xendit invoice ID.
On hold: the paid invoice did not match the order total or currency, or less than the total was paid (for example, the order was edited after the invoice was created). The order note explains it, also when the order was already on hold. Check the payment in the Xendit Dashboard, then fulfil the order or refund the payment.
Failed: the current invoice expired without payment. The customer can pay the order again.
Cancelled: the customer came back from a failed or expired invoice, or the order was cancelled by you or by the WooCommerce timeout for unpaid orders. The open invoice is expired, so it can no longer be paid. If Xendit does not accept this, a note asks you to expire the invoice in the Xendit Dashboard.
If an invoice is paid for an order that is already paid, cancelled or refunded, the order is not changed. A note asks you to refund the payment in the Xendit Dashboard or restore the order manually.
Refunds
Refunds are not sent to Xendit from WooCommerce. Refund the payment in the Xendit Dashboard (the order note and the transaction ID contain the invoice ID) and record the refund in WooCommerce manually.
License key
The plugin works with a VibeFox license key from vibefox.net. The license block is at the top of WooCommerce > Settings > Payments > Xendit. Paste the key into License key and click Activate. The block shows the status, for example the date the license is active until and your domain. Use Check now to check the status again, Change key to enter another key and Remove key to remove it from this site. The link Manage licenses and domains in your account opens your vibefox.net account.
One key works on one domain. Removing the key from a site does not free its domain slot. Free the slot in your vibefox.net account.
Without an active key, Xendit is not shown to customers at checkout. If a payment is started anyway, the customer sees This payment method is not available. Please choose another one. Logged-in store managers still see the payment method, marked (unlicensed — visible to admins only), so you can set up and test the plugin before you buy a key. A reminder appears on the Plugins page and on WooCommerce pages. Existing orders are not affected: payments already started are still confirmed.
When a license expires, the plugin keeps working, but updates and support need a renewal. The status is checked again automatically in the background.
Troubleshooting
Xendit does not appear at checkout: check that the license is active, Enable/Disable is on, the active mode has a secret key with the right prefix (Test Secret Key with xnd_development_ in test mode, Live Secret Key with xnd_production_ in live mode) and the store currency is IDR, PHP, VND, THB, MYR, USD or SGD. The settings banner shows a warning when the key is missing or wrong.
The payment went through, but the order stays Pending payment: the webhook is not working. In the Xendit Dashboard of the mode you use (test or live) check that the URL shown in the settings is set for Invoice paid, and that the verification token of that mode is saved in the matching field. The Xendit Dashboard shows the answer of your store for each webhook. The order is also confirmed when the customer returns to the order received page.
Webhook answers Webhook verification token is not configured: neither verification token is set. Paste the token into the settings.
Webhook answers Unauthorized: the token sent by Xendit does not match any token in the settings. Copy the token of the right mode again.
Webhook answers Token does not match the mode of this invoice: the invoice was created in the other mode. A test notification never confirms a live order and the other way round. Set up the webhook and token in the mode the order was paid in.
Webhook answers Ignored: not an invoice of this store: the invoice was not created by this store, for example by another integration on the same Xendit account. The Test button of the Xendit Dashboard also gets this answer, which confirms that the URL and the token work.
Webhook answers Temporary error: the Xendit API could not be reached to check the invoice, the secret key of the invoice's mode is missing, or the order was being updated by another request at the same moment. Xendit retries the webhook. Check that both secret keys are set if you have orders from both modes.
A key is not saved: the value does not start with the prefix of its field. Test keys start with xnd_development_, live keys with xnd_production_.
The customer sees This payment method is temporarily unavailable: Xendit rejected the request, for example because the secret key is wrong or lacks write permission for Money-in (invoices). Turn on Debug Log if needed and look at WooCommerce > Status > Logs, source wcp_xendit_payment_gateway. A message about the billing details means that Xendit did not accept the request data, for example the e-mail.
The customer sees A payment for this order was already received by Xendit and is being reviewed: an earlier invoice of this order was paid, but it did not match the order, so the order is on hold. Check the payment in the Xendit Dashboard.
Order is On hold after payment: read the order note. The paid amount or currency differed from the order. Fulfil the order or refund the payment in the Xendit Dashboard.
The license block shows an error: follow the message in the block. For example, if the key is already used on another domain, free a slot in your vibefox.net account and click Check now. If the site address changed, click Check now to activate the key for the new domain. If the license server cannot be reached, the plugin keeps working on the last known status.
Uninstall
Deactivating the plugin keeps all data. To remove it, deactivate and delete it on the Plugins page. The license key and license status of this plugin are always removed. The gateway settings, the plugin's other options and temporary data and its logs (log files including rotated ones, database log entries and the log folder of version 1.0) are removed only if Delete Data on Uninstall was on. Otherwise they stay for a later re-install. Existing orders keep their payment notes, invoice IDs and transaction IDs.
Xendit is a trademark of its respective owner. This plugin is not affiliated with or endorsed by Xendit.
