Sell Through Dodo Payments as Merchant of Record
Selling digital products to buyers in India, Europe and the US means charging GST, VAT and US sales tax, each with its own rules and filings. Most small stores either skip whole countries or lose hours to tax paperwork.
Dodo Payments is a merchant of record: it sells to the buyer, works out the tax and remits it. With the Dodo Payments module, buyers pay on Dodo’s hosted checkout by card, UPI, Apple Pay, Google Pay or a local method, and orders, renewals, refunds and cancellations stay in step through signed webhooks.
Turn On the Gateway
- Switch on the Dodo Payments module under Stackless → Dashboard.
- Go to WooCommerce → Settings → Payments → Dodo Payments.
- Tick Enable (Accept payments with Dodo Payments).
Stackless → Settings → Dodo Payments only shows a link to that screen and your webhook URL. Dodo stays off the checkout until the current mode has an API key.
Add Your API Keys
In the Dodo Payments dashboard, open Settings → API Keys and create a key with Write access. For the test key, switch the dashboard to Test Mode first. Then fill in:
- Test mode: on by default. No real money moves.
- Live API key and Live webhook secret
- Test API key and Test webhook secret
When you save, Stackless checks each new key with Dodo and shows “Connected to [business].” A live key in the test field gets an error saying the key must be created in Test Mode. Switching a mode to another Dodo business clears the products remembered for that mode.
You can also set these as wp-config.php constants, which win over saved settings and hide their fields: STACKLESS_DODO_LIVE_API_KEY, STACKLESS_DODO_LIVE_WEBHOOK_SECRET, STACKLESS_DODO_TEST_API_KEY and STACKLESS_DODO_TEST_WEBHOOK_SECRET.
Connect the Webhook
In Dodo Payments, open Developer → Webhooks, choose Add endpoint and paste https://yoursite.com/wp-json/stackless/v1/dodo/webhook. The gateway settings show your exact URL. Add it once in live mode and once in Test Mode, and select these events:
payment.succeeded
refund.succeeded
refund.failed
subscription.active
subscription.updated
subscription.renewed
subscription.on_hold
subscription.paused
subscription.cancelled
subscription.failed
subscription.expired
dispute.opened
dispute.lost
Copy the signing secret from the endpoint’s Overview tab into the webhook secret field for the same mode. Webhooks confirm payments if the buyer closes the tab before coming back, and bring renewals, refunds, cancellations and disputes into WooCommerce. Each delivery is signature-checked and applied once.
Set How Tax Works
- Prices and tax: Add tax on top of my prices (Dodo default), which is the default, or My prices already include tax.
- Tax category: Digital products (default), Software as a service, E-books, or Education and courses. Dodo uses it to pick each country’s rate.
Turn off WooCommerce tax for products you sell through Dodo, or buyers get taxed twice. With tax on top, the order total stays your price, and the order note shows what Dodo charged with tax. Changing either setting starts fresh Dodo products.
What Buyers See
At checkout, Dodo shows with its default title, “Card, UPI, Apple Pay or Google Pay (Dodo Payments)”. Test mode adds “Test mode: no real payment will be taken.” It works on both checkouts and the order payment page, so invoices and renewal links can be paid through Dodo too.
- Placing the order sends the buyer to Dodo’s checkout with their email, name and address filled in. Dodo discount codes and currency switching are off, so Dodo charges the order total in the order’s currency, plus any tax it adds on top.
- After paying, they come back to the order received page. A failed or cancelled payment sends them to the order payment page to try again.
- If Dodo reports a payment in a different currency or for a different amount, the order goes on hold with a note to check it.
Products in Your Dodo Catalog
Stackless creates Dodo products on first use and remembers them for each mode, so there’s nothing to set on your WooCommerce products.
- One-time sales use a pay-what-you-want product per product or variation and currency, so price changes, coupons and Pay What You Like amounts need no new product.
- Carts with several items share one product named “[Store name] order”.
- Subscriptions use one product per product or variation, schedule, recurring amount and currency. A price change creates a new product for new sales.
- A product archived or deleted in Dodo is created again on the next checkout.
Subscriptions on Dodo
Dodo runs the renewal schedule for subscriptions it bills:
- Daily, weekly, monthly and yearly plans work, including schedules such as every 3 months.
- Free trials work. Dodo saves the card without charging, and the subscription shows as Trial until Dodo’s first billing date.
- Each renewal Dodo charges becomes one paid WooCommerce renewal order. The next payment date follows Dodo’s.
- Dodo’s on hold, past due and paused show as On hold, cancelled as Cancelled, failed and expired as Expired, and a cancellation set for the next billing date as Pending cancellation.
- After the last payment of a fixed-length plan, Stackless tells Dodo to stop at the next billing date.
Cancelling from WooCommerce or My Account cancels at Dodo too, at the next billing date or straight away. If Dodo doesn’t confirm, the cancellation is refused.
A plan set to Manual only isn’t billed by Dodo. Its first order and each renewal invoice are paid through Dodo as one-time payments.
Refunds and Disputes
- Refunds from the WooCommerce order screen are made in Dodo. A partial refund is sent in the order’s own terms, and Dodo adds the matching tax when it charged tax on top.
- Refunds made in the Dodo dashboard are recorded on the order once, scaled back to the pre-tax amount when Dodo added tax on top. Items aren’t restocked.
- Failed refunds, and disputes opened or lost in Dodo, add an order note.
Currencies
Dodo is offered for 138 currencies, including USD, EUR, GBP and INR, and only when the cart’s currency is one of them. Three-decimal currencies such as KWD and OMR are left out. It works with Multi-Currency Checkout, and Currency-Aware Payment Gateways knows its list.
More Than One Dodo Business
Dodo Payments can be duplicated for a second Dodo business, each copy with its own keys, products, orders and webhook URL ending in /webhook/copy2 and so on. See Duplicate a Payment Gateway.
Limits
- Dodo takes one subscription per checkout, with no other items in the cart, and isn’t offered for carts it can’t take. One-time carts can be any size.
- Dodo bills the same amount every cycle, so a subscription with a signup fee or a different first payment is refused at checkout.
- Dodo doesn’t save cards in WooCommerce. Customers can’t renew early, resume a pending cancellation, toggle auto-renew or change the payment method from My Account, and you can’t change the next payment date.
- Turn on Debug log to write Dodo activity to WooCommerce → Status → Logs (
stackless-dodo_gateway). Keys are never logged. - When Dodo is the only payment method, the Hosted-only payment setting in Extra Enhancements hides the payment section, so Place order goes straight to Dodo.