Skip to main content
RapidDev - Software Development Agency
v0-integrationsNext.js API Route

How to Integrate 2Checkout (Verifone) with V0

Integrate 2Checkout (now Verifone) global payments into V0-generated Next.js apps using the ConvertPlus inline checkout script for client-side payment UI and the 2Checkout REST API for server-side order management. Add your Merchant Code as a NEXT_PUBLIC_ environment variable and your Secret Key as a server-only Vercel environment variable. 2Checkout specializes in international payments with 45+ local payment methods and built-in global tax compliance.

What you'll learn

  • How to set up 2Checkout ConvertPlus inline checkout in a V0-generated Next.js page
  • How to generate HMAC-SHA256 payment signatures server-side in a Next.js API route
  • How to handle 2Checkout IPN (Instant Payment Notification) webhooks for order confirmation
  • How to store 2Checkout credentials correctly in Vercel environment variables
  • How to test 2Checkout payments using the sandbox environment
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate16 min read35 minutesPaymentMarch 2026RapidDev Engineering Team
TL;DR

Integrate 2Checkout (now Verifone) global payments into V0-generated Next.js apps using the ConvertPlus inline checkout script for client-side payment UI and the 2Checkout REST API for server-side order management. Add your Merchant Code as a NEXT_PUBLIC_ environment variable and your Secret Key as a server-only Vercel environment variable. 2Checkout specializes in international payments with 45+ local payment methods and built-in global tax compliance.

Integrating 2Checkout Global Payments into V0-Generated Next.js Applications

2Checkout, now operating under the Verifone brand, has been processing global digital commerce payments for over 20 years. Its primary differentiation from Stripe and other modern payment processors is its depth in international markets: 45+ local payment methods including SEPA, iDEAL, Boleto Bancário, Alipay, local Chinese cards, and regional wallet options across 200+ countries. 2Checkout also includes built-in global VAT/GST/sales tax calculation and collection as a Merchant of Record service — meaning 2Checkout handles tax compliance on your behalf, which is a significant advantage for digital goods companies selling internationally.

For V0-generated applications targeting international audiences or selling digital products globally, 2Checkout solves the compliance complexity that would otherwise require engaging separate tax services. Their ConvertPlus integration provides a battle-tested inline checkout experience that adapts to the buyer's country, showing appropriate local payment methods automatically.

ConvertPlus is 2Checkout's recommended integration approach for modern web applications. It uses a JavaScript SDK that creates an inline payment form within your page (not a redirect to an external page), handling card data collection in a PCI-compliant iframe, local payment method flows, and the redirect-based authentication flows for methods like 3D Secure and bank redirects. Your Next.js application provides a digitally signed payment request, ConvertPlus handles the payment UI, and your server receives order confirmation via IPN (Instant Payment Notification) webhooks.

Integration method

Next.js API Route

2Checkout integration uses ConvertPlus, their inline checkout JavaScript, loaded on the client with your Merchant Code (public). For order validation and management, a Next.js API route uses your Secret Key and HMAC-SHA256 signature generation to call the 2Checkout REST API. The Secret Key is stored as a server-only Vercel environment variable and never exposed to the browser.

Prerequisites

  • A 2Checkout merchant account — sign up at verifone.com or use the legacy 2checkout.com portal
  • Your 2Checkout Merchant Code (a numeric ID displayed in your merchant dashboard)
  • Your 2Checkout Secret Key from Account → Integrations → Webhooks & API
  • Understanding that 2Checkout has a sandbox test environment at sandbox.2checkout.com
  • A V0 account at v0.dev and a Vercel account with a deployed HTTPS URL (required for IPN webhooks)

Step-by-step guide

1

Generate the Checkout Page UI with V0

Start by generating your checkout page layout in V0 with mock data. The key architectural decision is where the ConvertPlus payment form container sits within your page — it will be a `<div>` that the ConvertPlus JavaScript renders into, so it needs appropriate height and width in your layout. In V0's chat, describe the checkout layout you want. For digital products, a clean two-column layout works well: product summary and pricing on the left, and the payment form container on the right or below. For subscription services, the checkout flows naturally from the pricing table — clicking a plan button scrolls to or navigates to the checkout with the selected plan pre-loaded. Ask V0 to generate the post-payment pages as well: a success/thank you page at `/checkout/success` that shows the order number and product download link (or account activation instructions), and a failed payment page at `/checkout/failure` with a 'Try again' button. 2Checkout redirects to your configured return URLs after payment completion, and these pages receive order data in query parameters. For the checkout container specifically, ask V0 to generate it as a client component with a `useEffect` that loads the ConvertPlus script dynamically after component mount. The ConvertPlus script from `https://secure.2checkout.com/checkout/client/twoCoInlineCart.js` needs to load before the payment form can be initialized.

V0 Prompt

Build a product checkout page with a left column showing: product image placeholder, product name 'Pro License — Annual', feature list with 5 checkpoints, original price crossed out ($129/year), sale price highlighted ($99/year), and a savings badge '24% off'. Right column shows: a 'Complete Your Purchase' heading, email and full name inputs, a div with id='two-co-checkout' and min-height 300px with a subtle gray background as placeholder, a 'Secured by Verifone/2Checkout' badge with padlock icon, and accepted payment method icons.

Paste this in V0 chat

Pro tip: Ask V0 to generate the ConvertPlus container as a fixed-height div (min-height: 400px) with a loading spinner overlay that hides once the ConvertPlus script fires its 'loaded' callback. This prevents layout shift when the payment form initializes.

Expected result: A complete checkout page UI renders in V0's sandbox with the product summary, buyer info fields, ConvertPlus container placeholder, and security badges. The layout is ready for ConvertPlus JavaScript integration.

2

Create the Payment Signature API Route

2Checkout requires a cryptographic signature for the payment parameters to prevent tampering. This signature is an HMAC-SHA256 hash of specific order parameters using your Secret Key. Because the Secret Key must never be in client code, the signature generation must happen in a Next.js API route. Create `app/api/2checkout/signature/route.ts` that accepts the payment parameters from the client (order reference, product details, amount, currency), generates the required signature, and returns it. The client then uses this signature when initializing the ConvertPlus checkout. The 2Checkout signature generation follows a specific algorithm: concatenate the parameter values in a specific order (seller ID, order total, currency, merchant order ID), then compute HMAC-SHA256 of this string using your Secret Key as the HMAC key, and return the hex-encoded result. For the ConvertPlus integration specifically, the signature parameters that need signing are: `CURRENCY`, `MERCHANT`, `ORDER_HASH` (your unique order reference), `PRICE`, `PROD[0]`, `QTY[0]`, `RETURL_URL`, `RETURL_URL_CANCEL`, `RETURN_METHOD`, and `BACK_REF`. The exact parameter list and order varies by 2Checkout API version — always reference the official 2Checkout ConvertPlus documentation for the current parameter signing order. Also create an order verification route at `app/api/2checkout/verify/route.ts` that checks order status using the 2Checkout API after a payment completes — this provides a second-layer confirmation beyond the IPN webhook.

V0 Prompt

Add a loading state to the checkout page that shows when signature is being fetched from the API: display a spinning ring in the ConvertPlus container with text 'Initializing secure payment...' while the API call is in progress.

Paste this in V0 chat

app/api/2checkout/signature/route.ts
1// app/api/2checkout/signature/route.ts
2import { NextRequest, NextResponse } from 'next/server'
3import crypto from 'crypto'
4
5function generateHmacSignature(params: Record<string, string>, secretKey: string): string {
6 // 2Checkout signature: concatenate values by specific rules, then HMAC-SHA256
7 // Parameter order depends on your 2Checkout API version and product type
8 // Refer to 2Checkout docs for exact parameter list and order
9 const paramValues = Object.values(params).join('')
10 return crypto
11 .createHmac('sha256', secretKey)
12 .update(paramValues)
13 .digest('hex')
14 .toUpperCase()
15}
16
17export async function POST(request: NextRequest) {
18 try {
19 const body = await request.json()
20 const {
21 orderReference,
22 productName,
23 price,
24 currency = 'USD',
25 quantity = 1,
26 } = body
27
28 const merchantCode = process.env.NEXT_PUBLIC_2CO_MERCHANT_CODE!
29 const secretKey = process.env.TWO_CO_SECRET_KEY!
30
31 // Build order parameters
32 const timestamp = Math.floor(Date.now() / 1000).toString()
33 const params = {
34 CURRENCY: currency,
35 MERCHANT: merchantCode,
36 ORDER_HASH: orderReference,
37 PRICE: price.toString(),
38 PROD: productName,
39 QTY: quantity.toString(),
40 TIMESTAMP: timestamp,
41 }
42
43 const signature = generateHmacSignature(params, secretKey)
44
45 return NextResponse.json({
46 signature,
47 timestamp,
48 merchantCode,
49 params,
50 })
51 } catch (error) {
52 return NextResponse.json({ error: 'Signature generation failed' }, { status: 500 })
53 }
54}
55
56// app/api/2checkout/ipn/route.ts — IPN webhook handler
57export async function POST(request: NextRequest) {
58 try {
59 const body = await request.text()
60 const params = new URLSearchParams(body)
61
62 const orderRefno = params.get('REFNOEXT') || ''
63 const orderStatus = params.get('ORDERSTATUS') || ''
64 const hash = params.get('HASH') || ''
65
66 // Verify IPN hash using secret key
67 // Refer to 2Checkout IPN verification documentation for exact algorithm
68 const secretKey = process.env.TWO_CO_SECRET_KEY!
69 const expectedHash = crypto
70 .createHmac('sha256', secretKey)
71 .update(Array.from(params.entries()).filter(([k]) => k !== 'HASH').map(([k, v]) => `${v.length}${v}`).join(''))
72 .digest('hex')
73 .toUpperCase()
74
75 if (hash !== expectedHash) {
76 console.error('IPN hash mismatch')
77 return new Response('FAIL', { status: 200 })
78 }
79
80 if (orderStatus === 'COMPLETE') {
81 // Process completed order: activate license, send email, update DB
82 console.log('Order completed:', orderRefno)
83 }
84
85 // 2Checkout requires specific response format
86 return new Response(`<EPAYMENT>${new Date().toISOString()}|${expectedHash}</EPAYMENT>`, {
87 status: 200,
88 headers: { 'Content-Type': 'text/plain' },
89 })
90 } catch (error) {
91 return new Response('FAIL', { status: 200 })
92 }
93}

Pro tip: 2Checkout's IPN signature verification algorithm is more complex than a simple HMAC — it uses length-prefixed parameter values. Always reference the official 2Checkout IPN documentation at knowledgebase.2checkout.com for the exact verification algorithm, as it differs from their order signature algorithm.

Expected result: The /api/2checkout/signature route returns a valid signature and merchant code for payment initialization. The IPN webhook handler receives and verifies order notifications from 2Checkout's sandbox.

3

Initialize ConvertPlus on the Checkout Page

With the API routes ready, implement the ConvertPlus initialization in your checkout page client component. ConvertPlus uses a JavaScript SDK that loads from 2Checkout's CDN and creates the payment form within your designated container element. The initialization flow in your React component is: when the component mounts, call your `/api/2checkout/signature` route to get the payment signature, load the ConvertPlus script from `https://secure.2checkout.com/checkout/client/twoCoInlineCart.js`, configure the cart with your product parameters and the signature, and call the initialization function to render the payment form in your container. ConvertPlus configuration uses 2Checkout's `TwoCoInlineCart` JavaScript object. You set the merchant code, configure the cart with product details, set the billing information if you have collected name and email from the buyer, and call `TwoCoInlineCart.cart.checkout()` to render the payment form. For sandbox testing, use 2Checkout's sandbox environment. In your 2Checkout merchant dashboard, navigate to the sandbox settings and get your sandbox merchant code. Set the ConvertPlus environment to 'sandbox' by loading from `https://secure.2checkout.com/checkout/client/twoCoInlineCart.js` and configuring with sandbox credentials. After payment completion, 2Checkout redirects to your `BACK_REF` URL with order parameters. Your success page reads these parameters and displays the order confirmation. Simultaneously, the IPN webhook fires to your server with the same order data for reliable server-side processing — the IPN is more reliable than the redirect because users may close their browser before the redirect completes.

V0 Prompt

Add a payment completion state to the checkout page. After ConvertPlus fires its payment success callback, show a full-screen overlay with a green checkmark animation, 'Payment Successful!' heading, order reference number, and 'Download Your Product' button. If payment fails, show a red X with 'Payment Failed' and the specific error message from 2Checkout.

Paste this in V0 chat

app/checkout/page.tsx
1// app/checkout/page.tsx — Client component with ConvertPlus integration
2'use client'
3import { useEffect, useRef, useState } from 'react'
4
5declare global {
6 interface Window {
7 TwoCoInlineCart: any
8 }
9}
10
11export function TwoCheckoutPayment({
12 productName,
13 price,
14 currency = 'USD',
15 buyerEmail,
16 buyerName,
17}: {
18 productName: string
19 price: number
20 currency?: string
21 buyerEmail: string
22 buyerName: string
23}) {
24 const [loading, setLoading] = useState(true)
25 const [error, setError] = useState<string | null>(null)
26 const containerRef = useRef<HTMLDivElement>(null)
27
28 useEffect(() => {
29 const orderReference = `ORDER-${Date.now()}`
30
31 async function initConvertPlus() {
32 try {
33 // 1. Get signature from server
34 const sigResponse = await fetch('/api/2checkout/signature', {
35 method: 'POST',
36 headers: { 'Content-Type': 'application/json' },
37 body: JSON.stringify({ orderReference, productName, price, currency }),
38 })
39
40 if (!sigResponse.ok) throw new Error('Failed to initialize payment')
41 const { merchantCode } = await sigResponse.json()
42
43 // 2. Load ConvertPlus script
44 const script = document.createElement('script')
45 script.src = 'https://secure.2checkout.com/checkout/client/twoCoInlineCart.js'
46 script.onload = () => {
47 // 3. Configure ConvertPlus
48 const cart = window.TwoCoInlineCart
49
50 cart.setup.setMerchant(merchantCode)
51 cart.setup.setMode('PURCHASE') // or AUTHORIZENET
52
53 // Add product to cart
54 cart.cart.setReset(true)
55 cart.cart.setLanguage('en')
56 cart.cart.setCurrency(currency)
57
58 cart.products.removeAll()
59 cart.products.add({
60 code: productName.replace(/\s+/g, '-').toLowerCase(),
61 quantity: 1,
62 price,
63 name: productName,
64 type: 'DIGITAL',
65 tangible: 'N',
66 })
67
68 // Pre-fill buyer info
69 cart.billing.setEmail(buyerEmail)
70 cart.billing.setFirstName(buyerName.split(' ')[0] || '')
71 cart.billing.setLastName(buyerName.split(' ').slice(1).join(' ') || '')
72
73 cart.order.setExternalRef(orderReference)
74 cart.order.setReturnUrl(`${window.location.origin}/checkout/success`)
75 cart.order.setCancelUrl(`${window.location.origin}/checkout/cancel`)
76
77 // Render in container
78 if (containerRef.current) {
79 cart.cart.checkout()
80 }
81 setLoading(false)
82 }
83 script.onerror = () => setError('Failed to load payment system')
84 document.head.appendChild(script)
85 } catch (err) {
86 setError(err instanceof Error ? err.message : 'Payment setup failed')
87 setLoading(false)
88 }
89 }
90
91 initConvertPlus()
92 }, [productName, price, currency, buyerEmail, buyerName])
93
94 return (
95 <div>
96 {loading && (
97 <div className="flex items-center justify-center h-48 bg-gray-50 rounded-lg">
98 <div className="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600" />
99 <span className="ml-3 text-gray-500">Initializing secure payment...</span>
100 </div>
101 )}
102 {error && (
103 <div className="p-4 bg-red-50 border border-red-200 rounded-lg text-red-700">
104 {error}
105 </div>
106 )}
107 <div ref={containerRef} className={loading || error ? 'hidden' : ''} />
108 </div>
109 )
110}

Pro tip: 2Checkout sandbox test credentials: use any test Visa card number (4111 1111 1111 1111) with any future expiry and CVV 123. For the test environment, use your sandbox merchant code (a separate code from your live merchant code, found in 2Checkout sandbox dashboard).

Expected result: The ConvertPlus inline checkout renders in your designated container showing a card payment form and available local payment methods. Submitting with test card data in sandbox mode completes a test payment and redirects to your success page.

4

Configure Vercel Environment Variables and Set Up IPN

Add your 2Checkout credentials to Vercel. Go to Vercel Dashboard → your project → Settings → Environment Variables. Add `NEXT_PUBLIC_2CO_MERCHANT_CODE` with your 2Checkout Merchant Code (the numeric ID). This needs the `NEXT_PUBLIC_` prefix because it is used in the ConvertPlus JavaScript client initialization. Add `TWO_CO_SECRET_KEY` WITHOUT any `NEXT_PUBLIC_` prefix — this is your API Secret Key used for signature generation and must never reach the browser. Add `NEXT_PUBLIC_APP_URL` with your Vercel deployment URL for order return URLs. Configure the IPN (Instant Payment Notification) URL in your 2Checkout merchant dashboard. Navigate to Account → Integrations → Webhooks & API → IPN tab. Add your webhook URL: `https://your-app.vercel.app/api/2checkout/ipn`. Select the order statuses to trigger IPN notifications: COMPLETE, REFUND, CANCEL. 2Checkout sends IPN notifications for each status change, allowing your server to update order records and trigger fulfillment. For 2Checkout's return URL (where buyers land after payment), configure this in Account → Integrations → Return URL (or per-product). Set the return URL to `https://your-app.vercel.app/checkout/success` and optionally a cancel URL for declined payments. Test the complete sandbox flow: enter test buyer details on your checkout page, use the sandbox test card number (4111 1111 1111 1111), complete the payment, and verify the IPN fires to your webhook endpoint. Check your Vercel function logs to confirm IPN receipt and processing.

V0 Prompt

Create the order confirmation page at /checkout/success that shows an animated green success icon, 'Thank You for Your Purchase!' heading, the order reference from URL params, instructions to check email for license delivery, and three next-step cards: Download Product (primary button), Access Account (outline button), Contact Support (link). Include a 2Checkout order ID prominently for customer reference.

Paste this in V0 chat

.env.local
1// Vercel Dashboard → Settings → Environment Variables:
2// NEXT_PUBLIC_2CO_MERCHANT_CODE = your_numeric_merchant_code
3// TWO_CO_SECRET_KEY = your_secret_key_from_2checkout_dashboard
4// NEXT_PUBLIC_APP_URL = https://your-app.vercel.app
5
6// 2Checkout test card numbers for sandbox:
7// Visa: 4111 1111 1111 1111, Exp: any future, CVV: 123
8// Mastercard: 5500 0000 0000 0004
9// Test successful payment, then check Vercel function logs for IPN receipt
10
11// 2Checkout Dashboard IPN Configuration:
12// Account → Integrations → Webhooks & API → IPN settings
13// Add URL: https://your-app.vercel.app/api/2checkout/ipn
14// Select triggers: ORDER_STATUS_COMPLETE, REFUND, etc.
15
16// Return URL Configuration:
17// Account → Integrations → Return URL
18// Return URL: https://your-app.vercel.app/checkout/success
19// Cancel/Failure URL: https://your-app.vercel.app/checkout/cancel

Pro tip: 2Checkout processes payments asynchronously — the IPN webhook may arrive before or after the browser redirect completes. Always use the IPN for order fulfillment logic rather than the redirect, as users may close their browser before the redirect fires.

Expected result: The 2Checkout payment flow works end-to-end in sandbox: ConvertPlus renders the payment form, sandbox test payment completes successfully, buyer redirects to your success page, and the IPN webhook arrives at your server confirming the order.

Common use cases

Digital Product Global Checkout

A software company sells licenses globally through a V0-generated website. 2Checkout handles payment collection in 30 currencies with automatic VAT calculation for EU customers, showing local payment methods to buyers in each country without requiring the developer to implement tax logic.

V0 Prompt

Build a digital product checkout page for a software license purchase. Show the product details card on the left (product name 'Pro License', description, features list, price $99/year). On the right, show a checkout form with buyer name and email fields at the top, then a container div with id='2checkout-container' where the ConvertPlus payment form will load, and below it a 'Secured by 2Checkout' badge with SSL lock icon.

Copy this prompt to try it in V0

SaaS Subscription Checkout

A SaaS application uses 2Checkout's subscription billing to charge customers monthly or annually. The V0-generated pricing page shows plan options, and the checkout flow handles recurring billing setup with 2Checkout managing dunning, retries, and tax calculation.

V0 Prompt

Create a pricing page with three plan cards (Basic $9/mo, Pro $29/mo, Business $79/mo) in a responsive grid. Each card shows plan name, price with billing period toggle (monthly/annual with 20% discount), feature list with checkmarks, and a 'Choose Plan' button. The selected plan card should highlight with a primary color border and a 'Most Popular' badge on the Pro plan. Clicking a button scrolls to the checkout section.

Copy this prompt to try it in V0

International Software Reseller Checkout

A software vendor with resellers in multiple countries needs local payment methods for each market. 2Checkout's country-adaptive checkout automatically shows iDEAL for Dutch customers, SEPA for German customers, and credit cards for US customers — all from the same integration.

V0 Prompt

Build a reseller checkout page with a country selector dropdown at the top that shows the country flag and name, a price display that adjusts to show local currency equivalent, a payment methods section showing 'Available payment methods in [Country]' with logos of accepted methods for that country, and the ConvertPlus checkout container.

Copy this prompt to try it in V0

Troubleshooting

ConvertPlus fails to initialize or shows an error about invalid merchant code

Cause: The NEXT_PUBLIC_2CO_MERCHANT_CODE is incorrect or the sandbox vs live environment is mismatched. Sandbox and live environments have different merchant codes in 2Checkout.

Solution: Log in to your 2Checkout account and verify your merchant code from the main dashboard page. If testing, use your sandbox merchant code from sandbox.2checkout.com (a separate portal from your live account). Ensure the ConvertPlus script URL and merchant code match the same environment.

IPN webhook is not being received despite payment completing

Cause: The IPN URL is not configured in 2Checkout dashboard, the URL is wrong, or 2Checkout cannot reach your Vercel deployment URL. IPN also requires your return URL to be configured.

Solution: In 2Checkout dashboard → Account → Integrations → Webhooks & API → IPN, verify your IPN URL is set to your Vercel production URL. Use 2Checkout's IPN testing tool to send a test notification to verify connectivity. Check Vercel function logs for incoming requests.

Signature mismatch error when initializing ConvertPlus payment

Cause: The HMAC-SHA256 signature is computed over the wrong parameter set, in the wrong order, or using the wrong key. The exact parameters and their order for signature generation varies by 2Checkout product type and API version.

Solution: Refer to the official 2Checkout ConvertPlus documentation at knowledgebase.2checkout.com for your specific API version's signature generation specification. Log all parameters before signing to verify the concatenation order matches the documentation exactly.

typescript
1// Debug signature generation by logging each step:
2const paramValues = Object.values(params).join('')
3console.log('Parameters for signing:', params)
4console.log('Concatenated string:', paramValues)
5console.log('Generated signature:', signature)
6// Compare against 2Checkout's signature calculator tool in their docs

Best practices

  • Store TWO_CO_SECRET_KEY as a server-only Vercel environment variable (no NEXT_PUBLIC_ prefix) — this key signs payment requests and verifies IPN webhooks and must never reach browser code.
  • Always process order fulfillment from the IPN webhook, not from the redirect return URL — IPN is more reliable because it fires server-to-server regardless of browser behavior.
  • Verify the IPN signature on every webhook notification before processing the order — this prevents fraudulent order notifications from triggering product fulfillment.
  • Use unique order references for each purchase attempt — if a payment fails and the user retries, a new order reference prevents duplicate order processing.
  • Test with 2Checkout's sandbox environment before going live — sandbox provides full payment flow testing without real charges.
  • Configure your 2Checkout account's tax settings correctly for your products (digital goods vs physical) to ensure automatic VAT/GST calculation applies correctly by country.
  • Implement idempotent IPN processing — 2Checkout may send the same IPN multiple times for the same order status. Check whether you have already processed each order reference before executing fulfillment actions.

Alternatives

Frequently asked questions

What is the difference between 2Checkout and Verifone?

2Checkout was acquired by Verifone (a payment hardware and services company) in 2020. The 2Checkout platform was rebranded as part of Verifone's portfolio, though many developers still know it as 2Checkout. The API, merchant dashboard, and ConvertPlus integration remain largely the same. Documentation may reference either brand name.

How does 2Checkout handle international VAT for digital goods?

2Checkout operates as a Merchant of Record for digital goods, which means they handle global VAT/GST compliance on your behalf. When a buyer from the EU purchases your digital product, 2Checkout collects the appropriate VAT rate for their country, remits it to tax authorities, and sends you the net amount. This removes the complexity of EU VAT OSS registration and compliance from your operations — a significant advantage for small software companies selling globally.

Can I use 2Checkout for subscription/recurring billing?

Yes. 2Checkout's billing engine supports monthly and annual subscriptions with automatic renewal, failed payment retry logic (dunning), upgrade/downgrade between plans, and proration. Configure subscription products in your 2Checkout merchant dashboard with billing intervals, trial periods, and renewal prices. The ConvertPlus checkout handles both one-time and recurring payment flows with the same integration.

What is an IPN and why should I use it over the redirect return URL?

IPN (Instant Payment Notification) is a server-to-server notification that 2Checkout sends directly to your API route when an order changes status. Unlike the redirect return URL (which depends on the buyer's browser completing the redirect), IPN fires regardless of what the buyer does after payment — even if they close the browser immediately. Use IPN for all critical order processing like activating licenses, sending confirmation emails, and updating your database.

How do I test 2Checkout payments without real money?

2Checkout provides a sandbox environment at sandbox.2checkout.com with separate credentials from your live account. Log in to your 2Checkout account and request sandbox access from the developer settings. Use test card numbers (Visa: 4111 1111 1111 1111) in the sandbox to simulate successful and failed payments without any real charges. Sandbox IPN notifications can be triggered manually from the sandbox dashboard.

What payment methods does 2Checkout support globally?

2Checkout supports 45+ payment methods across 200+ countries including: Visa, Mastercard, American Express, Discover, PayPal, SEPA Direct Debit, iDEAL (Netherlands), Boleto Bancário (Brazil), Alipay (China), UnionPay, and dozens of local bank transfer and wallet options. The ConvertPlus checkout automatically shows payment methods available in the buyer's detected country, reducing friction for international purchases.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.