Authorize.Net
Veteran US/Canada payment gateway for merchants who already have (or want to bring) their own merchant account
Pick Authorize.Net when you already have a favourable merchant-account relationship and need a battle-tested gateway with ARB and CIM — skip it if you want Stripe-tier developer experience or native 3DS2.
◆◆ Moderate
US & Canada (merchant location)
$25/mo + 2.9% + 30¢ (All-in-One)
Authorize.Net is one of the oldest payment gateways in the industry, founded in 1996 and now a wholly-owned subsidiary of Visa (via CyberSource). It serves merchants based in the US and Canada primarily, offering a gateway-plus-merchant-account bundle (All-in-One) or gateway-only integration with an existing acquirer, and supports cards, eChecks (ACH), Apple Pay, Google Pay, and PayPal.
Last full audit: April 15, 2026
Trust Score Breakdown
Account Stability
74/100Because the merchant account is separate from the gateway, Authorize.Net itself doesn't freeze funds the way aggregator-style processors do. Stability depends on the underlying MSP. Onboarding via partners like Zen Payments has drawn complaints in 2026 reviews, but post-approval accounts are generally stable.
Developer Experience
55/100API is dated (XML-first with JSON translated to XML internally; strict element ordering required), documentation is functional but nowhere near Stripe-tier, and Authorize.Net does not natively support 3DS2 — merchants needing SCA must integrate a third-party like Cardinal Commerce. Webhooks v1 is being decommissioned in April 2026 (move to v2 required).
Payout Reliability
75/100Payouts are handled by the underlying merchant account (CyberSource or partner acquirer), not Authorize.Net itself. With Visa as parent company and decades of uptime, funding is reliable when the acquirer is in good standing. Timing depends on the MSP rather than the gateway.
Support Quality
50/100Trustpilot and G2 reviews repeatedly cite poor support: 'no tech staff there', long resolution times on integration errors, and difficulty getting answers on merchant-account-level questions that get deflected to the partner MSP. 24x7 live support is advertised but users report it is phone-first and slow to escalate developer issues.
Track Record
92/100Founded in 1996, Authorize.Net is one of the oldest payment gateways in operation and is owned by Visa via CyberSource. Processes card and ACH for a large installed base of small/medium merchants with strong uptime (status.authorize.net shows only minor incidents). Continues to ship updates (webhooks v2, Accept.js, Accept Hosted).
Transparency
55/100Published plan prices are clear ($25/month + 2.9% + 30¢ for All-in-One), but the Gateway-Only path layers gateway fees on top of an external merchant account's interchange-plus (or tiered) pricing. The CyberSource Internet Merchant Account fee schedule (monthly fee, authorization fee, qualified/non-qualified surcharges, chargeback, batch, network assessments) is only visible in a linked PDF — total effective rate is harder to calculate than with Stripe.
Availability Matrix
| Region | Countries | Currencies | Payout Timing |
|---|---|---|---|
| North America (merchant location) | United States, Canada | USD, CAD (processor-dependent; each Authorize.Net account is set to a single currency — a second currency requires a second account) | Set by the underlying merchant account / acquirer (typically T+1 to T+3 business days) |
| UK, Europe, Australia (via CyberSource) | United Kingdom, Australia, and 33 European countries — accepted only via the CyberSource onboarding path, not direct Authorize.Net signup | USD, CAD, EUR, GBP, AUD and others depending on the CyberSource processor | Set by CyberSource and the local acquirer |
| NOT available for direct signup | All countries outside the US and Canada — Authorize.Net itself directs non-US/Canada merchants to contact CyberSource instead | N/A | N/A |
Feature Snapshot
One-time Card Payments
Accepts Visa, Mastercard, Discover, American Express, JCB, and Diners Club via the Authorize.Net API, Accept.js, Accept Hosted, or Accept Customer flows.
Subscriptions / Recurring Billing (ARB)
Automated Recurring Billing (ARB) schedules recurring card or eCheck charges with trial periods. Runs batches daily around 08:30 GMT. Creating an ARB subscription also creates a CIM profile automatically when CIM is active.
Tokenization / Stored Cards (CIM)
Customer Information Manager (CIM) stores cards and bank accounts on Authorize.Net servers and issues profile IDs used in place of raw card data — reduces PCI scope and enables one-click repeat purchases.
Hosted Payment Page (Accept Hosted)
Accept Hosted is an iframe-based mobile-optimized payment form served from Authorize.Net — the most PCI-friendly option (SAQ A).
Custom Payment Form (Accept.js)
Accept.js is a JavaScript library that tokenizes card data client-side and returns a single-use payment nonce (valid 15 minutes) — keeps you at SAQ A-EP with your own UI.
Webhooks
Webhooks REST API covers transaction, customer profile, subscription, and fraud-filter events with HTTP Basic Auth. Webhooks v1 is being decommissioned in April 2026 — integrations must migrate to v2.
3D Secure 2 (SCA)
Authorize.Net does not natively support 3DS/3DS2 payer authentication. Merchants needing PSD2 SCA must pass through a third-party authentication provider such as Cardinal Commerce.
Apple Pay
Supported via the Authorize.Net Accept Mobile SDKs and the web Payment Request API. No separate fee.
Google Pay
Supported for American Express, Discover, JCB, Mastercard, and Visa. Available via web and the Accept Mobile SDKs.
PayPal
PayPal Express Checkout can be enabled as an additional payment method on an Authorize.Net account.
eCheck / ACH (eCheck.Net)
Accepts ACH bank-account debits at 0.75% per transaction with no fixed per-transaction fee. Returned-item fee applies via the merchant account.
Advanced Fraud Detection Suite (AFDS)
13 rules-based filters including hourly/daily velocity, amount thresholds, AVS handling, suspicious-transaction detection, and IP blocking. Free to enable.
Invoicing
Digital invoicing is bundled in both All-in-One and Gateway-Only plans.
Virtual Terminal
Merchant Interface includes a virtual terminal for MOTO / keyed-in transactions.
In-Person / POS
Authorize.Net supports card-present transactions through partner POS integrations; it is primarily positioned as a card-not-present gateway.
Marketplace / Split Payments
No native marketplace / connected-account splitting equivalent to Stripe Connect. Multi-party flows require custom merchant-account arrangements.
Multi-Currency on One Account
Each Authorize.Net account is locked to a single currency. Accepting a second currency requires creating a second Authorize.Net account.
Pricing Breakdown
Security & Compliance
Integration Prompt
✂
Copy & use this 6275-char integration prompt
Production-ready prompt for Claude / GPT / Cursor — handles setup, security, webhooks & gotchas
Copy & use this 6275-char integration prompt
Production-ready prompt for Claude / GPT / Cursor — handles setup, security, webhooks & gotchas
You are integrating Authorize.Net as a payment gateway into a [Django / Next.js / etc.] application.
## Setup
1. Create an Authorize.Net sandbox account at https://developer.authorize.net/hello-world/sandbox/ and a production merchant account (All-in-One) or a Gateway-Only account bonded to an existing merchant account.
2. From the Merchant Interface, collect three credentials and store them in environment variables — never hardcode:
- `AUTHNET_API_LOGIN_ID` (Account → Settings → Security Settings → API Credentials & Keys)
- `AUTHNET_TRANSACTION_KEY` (same screen — generate a new one and save it immediately, it cannot be retrieved later)
- `AUTHNET_PUBLIC_CLIENT_KEY` (Account → Security Settings → Manage Public Client Key — this is the one used by Accept.js in the browser)
3. Add `AUTHNET_ENVIRONMENT` = `sandbox` or `production` and switch endpoints accordingly:
- Sandbox: `https://apitest.authorize.net/xml/v1/request.api`
- Production: `https://api.authorize.net/xml/v1/request.api`
4. Install the official SDK (e.g., `pip install authorizenet` for Python, `npm install authorizenet` for Node.js). Use the SDK rather than hand-rolling XML/JSON — Authorize.Net's API requires strict XML element ordering even when you send JSON.
## Recommended Integration: Accept.js (SAQ A-EP) or Accept Hosted (SAQ A)
For the lowest PCI scope and a modern flow, use Accept Hosted (iframe served from Authorize.Net) or Accept.js (your own form, client-side tokenization). Never submit raw PAN/CVV to your server.
### Accept.js flow
1. Load `https://jstest.authorize.net/v1/Accept.js` (sandbox) or `https://js.authorize.net/v1/Accept.js` (production) in your checkout page.
2. Build your card-entry form with `data-accept` attributes. Mark card fields so they are stripped before submission to your server.
3. On submit, call `Accept.dispatchData({ authData: { apiLoginID, clientKey }, cardData })`. Authorize.Net returns a single-use `opaqueData` payment nonce valid for 15 minutes.
4. Post the nonce (not the card data) to your server, then use the SDK to call `createTransactionRequest` with `payment.opaqueData` populated from the nonce.
### Server-side (Python example)
```python
from authorizenet import apicontractsv1
from authorizenet.apicontrollers import createTransactionController
merchant = apicontractsv1.merchantAuthenticationType(
name=os.environ['AUTHNET_API_LOGIN_ID'],
transactionKey=os.environ['AUTHNET_TRANSACTION_KEY'],
)
opaque = apicontractsv1.opaqueDataType(
dataDescriptor='COMMON.ACCEPT.INAPP.PAYMENT',
dataValue=nonce_from_client,
)
payment = apicontractsv1.paymentType(opaqueData=opaque)
tx = apicontractsv1.transactionRequestType(
transactionType='authCaptureTransaction',
amount=Decimal('20.00'),
payment=payment,
refId=internal_order_id, # stamped into the transaction
)
request = apicontractsv1.createTransactionRequest(
merchantAuthentication=merchant, transactionRequest=tx,
)
controller = createTransactionController(request)
controller.setenvironment(settings.AUTHNET_URL)
controller.execute()
response = controller.getresponse()
```
## Webhooks (migrate to v2 — v1 is decommissioned April 2026)
1. Create an endpoint on your server and register it under Account → Settings → Webhooks with the events you care about: `net.authorize.payment.authcapture.created`, `net.authorize.customer.subscription.cancelled`, `net.authorize.payment.refund.created`, etc.
2. Authorize.Net authenticates webhook delivery with HTTP Basic Auth (your API Login ID : Transaction Key, Base64-encoded) — validate this header on every request.
3. Verify the payload signature using the X-ANET-Signature header (HMAC-SHA512 of the body with your webhook signature key) — required on v2.
4. Return a 2xx quickly, then process asynchronously. Retry behaviour: Authorize.Net retries on 5xx.
5. Note the known 2026 issue: some webhook payloads have been missing the response code, amount, or transaction ID — always re-fetch the transaction by ID from the API to confirm final state rather than trusting the webhook body blindly.
## Recurring billing: ARB + CIM
- Use CIM (`createCustomerProfileRequest`) to store the card, then reference the customer/payment profile IDs in your app.
- Use ARB (`ARBCreateSubscriptionRequest`) to schedule recurring charges with interval, start date, total occurrences, trial period and trial amount. ARB batches run daily around 08:30 GMT.
- Listen for `net.authorize.customer.subscription.expiring`, `.suspended`, and `.cancelled` webhooks to keep your internal subscription state in sync.
## Security best practices specific to Authorize.Net
- Never ship the Transaction Key to the browser — only the Public Client Key is safe for client-side use.
- For UK/EU customers subject to PSD2 SCA, integrate Cardinal Commerce (or another payer-auth provider) in front of the gateway — Authorize.Net does not natively support 3DS1 or 3DS2.
- Enable Advanced Fraud Detection Suite (AFDS) filters: at minimum, hourly velocity, suspicious transaction, enhanced AVS handling, and IP blocking.
- Set a `refId` on every transaction equal to your internal order/invoice ID — this is the only reliable way to idempotently reconcile when a retry occurs.
- If you use Gateway-Only, request the full fee schedule from your MSP before going live — non-qualified surcharges and network assessments can push effective rates well above the headline number.
## Testing
- Use sandbox credentials and the sandbox endpoint. Test card numbers: `4111 1111 1111 1111` (Visa success), `4222 2222 2222 2222` (decline test), `6011 0000 0000 0012` (Discover).
- Test ARB behaviour by creating subscriptions with short (daily) intervals in the sandbox.
- Simulate webhook delivery using the AuthorizeNet/webhooks-postman-collection repo on GitHub.
## Common gotchas
- JSON elements must appear in the order documented in the API Reference — the server translates JSON to XML internally.
- Each Authorize.Net account is locked to a single currency. Multi-currency checkout requires multiple accounts routed by country.
- Authorize.Net does not natively split payments across multiple merchants — there is no Connect-style marketplace flow.
- The `refId` field is your idempotency lifeline. Use it.
Replace [Django / Next.js / etc.] with your stack. Follows PCI DSS best practices and handles common edge cases.
Common Pitfalls
7 itemsNo native 3D Secure 2 — SCA requires a third party
Authorize.Net does not support 3DS1 or 3DS2 natively. If you sell to customers in the UK/EU or anywhere PSD2 SCA applies, you must integrate a payer-authentication provider such as Cardinal Commerce on top of the gateway. This is the single most common surprise for merchants comparing Authorize.Net to Stripe or Adyen.
Webhooks v1 decommissioning in April 2026
Webhooks version 1 is being shut down in April 2026; existing endpoints must be migrated to Webhooks v2 via the Developer Center. If your integration is silently using v1 events, events will stop arriving — confirm the Merchant Interface shows v2 subscriptions and update handler payloads.
XML-first API with strict element ordering
Although the Authorize.Net API accepts JSON, it is internally translated to XML and requires the elements to be in the exact order shown in the API Reference. Sending valid JSON in the wrong key order produces confusing validation errors. Mitigation: use the official SDK for your language rather than hand-rolling requests.
Fee stacking on Gateway-Only and CyberSource-backed accounts
Published pricing is $25/mo + per-transaction, but the merchant account layer adds its own monthly fee, authorization fee, non-qualified surcharges (1.45% on rewards/business cards), batch fees, and network assessments (0.40–0.55% international). Effective rate on an international rewards card can exceed 5%. Mitigation: request a full fee schedule from your MSP before committing.
Merchants outside US/Canada get routed through CyberSource
Authorize.Net direct signup only accepts US- and Canada-based merchant accounts. UK, EU, and Australian merchants are routed to CyberSource — different contract, different fee schedule, different support queue. Onboarding through partner MSPs (e.g., Zen Payments) has drawn repeated complaints in 2026 reviews.
One currency per account
Each Authorize.Net account is configured for exactly one settlement currency. Merchants needing multi-currency settlement must open a separate Authorize.Net account per currency — there is no Stripe-style multi-currency toggle.
Support quality gap on developer issues
Trustpilot, G2, and Capterra reviews in 2025–2026 consistently cite slow, phone-first support and deflection to the partner MSP for merchant-account questions. Integration-level questions are answered in the community forum, but response times can be days. Mitigation: use the official SDKs and the Postman collections, and treat community.developer.cybersource.com as the primary support channel for code problems.
Community Pulse
Community sentiment in 2025–2026 is mixed and skews negative on developer experience and support. Long-time merchants praise reliability and the separation of gateway from merchant account (accounts rarely get frozen the way aggregator accounts do), and small/medium businesses value the mature ARB/CIM subscription plumbing. Frustrations cluster around the dated XML-first API, documentation that doesn't match Stripe's clarity, the absence of native 3DS2, opaque fee stacking when bundled with a CyberSource merchant account, and slow support (particularly on onboarding through partners like Zen Payments). Authorize.Net remains recommended primarily when an existing merchant-account relationship or a legacy integration makes switching uneconomical.
Sentiment last updated: April 2026 · We summarize — never copy — community content. Links go to original threads.
Changelog
-
logo
Added brand logo — rendered 400×53 transparent PNG via resvg_py from the Wikimedia Commons Authorize.Net wordmark SVG (depicted text is ineligible for copyright). Brightness 0 (pure black wordmark) → no logo_bg needed, default cream card applies.
-
pricing
Initial pricing verified: $25/mo All-in-One at 2.9%+30¢; Gateway-Only at $25/mo + 10¢/tx + 10¢ batch; eCheck at 0.75%. Added full CyberSource Internet Merchant Account fee schedule (monthly $9.95, auth $0.25, qualified 2.19%, non-qualified +1.45%, chargeback $19, ACH return $20, minimum $25, network assessments).
-
availability
Initial availability verified: direct signup US+Canada only; UK/EU/AU routed through CyberSource; each account locked to one currency.
-
features
Initial feature matrix populated (17 items) — ARB, CIM, Accept.js, Accept Hosted, webhooks (v1 decommissioning Apr 2026), Apple Pay, Google Pay, PayPal, eCheck, AFDS, invoicing, virtual terminal. 3DS2, marketplace splits, and multi-currency on one account marked 'no'.
-
security
Initial security record: PCI DSS annual renewal as service provider, SOC 1/SSAE-18 audited, Accept Hosted = SAQ A, Accept.js = SAQ A-EP, no native 3DS/3DS2.
-
pitfalls
Initial pitfalls list (7 items) — no 3DS2, webhooks v1 decommission, XML element ordering, fee stacking, US/CA direct-signup only, one currency per account, support quality.
-
community
Initial community pulse synthesized from Trustpilot, G2, CardPaymentOptions, CyberSource developer community, and 2026 comparison coverage.
-
trust_score
Initial trust score: overall 67. Strong track_record (92) and payout_reliability (75); weakness on developer_experience (55), transparency (55), and support_quality (50).
-
integration_prompt
Initial integration prompt authored — Accept.js / Accept Hosted preferred for lowest PCI scope; Webhooks v2 migration called out; Cardinal Commerce noted as 3DS2 fallback.
-
all
Initial gateway entry created end-to-end via /add-payment-gateway.
LearnWithHasan.com · Payment Gateway Index · No affiliate links · Builder-first