HubSpot + Authorize.net integration
Authorize.net takes the card payment, keeps the customer profile and runs the recurring billing. What a HubSpot sync can carry from it, and what stays put.
Connects by API , iPaaSScope this integration Book a scoping call Estimate the cost
Authorize.net HubSpot - Into HubSpot
Is there an official Authorize.net + HubSpot integration?
No. Authorize.net has no app in the HubSpot App Marketplace as of September 2026, just fuzzy matches for its name, and HubSpot's own payments tool runs on Stripe. We recommend a custom API integration: signed Authorize.net webhooks, checked nightly against the reporting API, at 70 to 150 build hours. On every route, card numbers stay with Authorize.net; only ids, amounts, dates, statuses and the card brand reach HubSpot.
- Recommended route
- Custom API integration
- Build effort
- 70 to 150 hours
- In the HubSpot App Marketplace?
- No listed app
- Typical elapsed time
- 4 to 8 weeks
Marketplace checked September 2026.
Why teams connect Authorize.net to HubSpot
Authorize.net is a payment gateway, so it sits behind something else: a website checkout, a donation form, a membership renewal, a phone order keyed into its Virtual Terminal. The charge succeeds or fails inside the gateway, the customer profile and the recurring schedule live there too, and only people with a Merchant Interface login can look at any of it. Whoever owns the customer relationship is working in HubSpot, where none of it shows.
Renewals are where that hurts first. Automated Recurring Billing suspends a subscription when its first payment is declined, and terminates it if nobody fixes the problem before the next run date, after which it cannot be reactivated. Authorize.net can email the merchant when that happens, and an email to an accounts inbox is not a task on anybody’s list. An account manager who could have called about an expired card hears about it after the customer has gone. The same blindness runs the other way, with sellers chasing invoices that a customer paid by card days ago.
One rule shapes every design on this page: card data never goes into HubSpot. HubSpot’s own Product and Services Catalog excludes full card numbers and card security codes even from its Enterprise Sensitive Data feature, and it lists even the last four digits as Sensitive Data. Authorize.net makes the rule easy to keep, because its customer profiles hold the card on its own servers and its responses return the number masked. So the integration moves references and outcomes: profile ids, transaction ids, amounts, dates and statuses, with the card brand as the only card detail.
What syncs
Five rows cover it, and every one flows into HubSpot only. Customer profiles become contacts, or companies where the payment profile is marked business, and each payment profile adds its card brand and nothing else: the masked number and the expiry stay behind, and we never ask for the expiry unmasked. Each charge, refund, void and decline becomes a HubSpot payment, each Automated Recurring Billing subscription a record with its status, amount, interval and next billing date, and each decline or suspension a task for the record’s owner.
Each row matches on its Authorize.net id, which a custom HubSpot property holds. An email address is never the key, because Authorize.net refuses a duplicate profile only when the merchant customer id, description and email all match, so two profiles can share one inbox. To tie a payment to a deal, the checkout puts the HubSpot deal id in the invoice number, which Authorize.net stores and returns in its reports. User fields look tempting, but Authorize.net echoes them back without storing them.
Payments go to HubSpot’s payments object, whose API takes payments made outside HubSpot on every tier from free up and cannot process one. Its documented statuses have no value for a void or a held charge, so Authorize.net’s own status rides in a custom property. Only subscriptions want a custom object, which needs Enterprise; below it, their status and next billing date become deal properties.
| | | Direction | Match key | Notes |
|---|---|---|---|---|
| Customer profile | Contact | Into HubSpot | Authorize.net customer profile id in a custom HubSpot property | A profile whose payment profile is marked business attaches to the company instead. |
| Customer payment profile | Contact | Into HubSpot | Payment profile id, under its customer profile id | Card brand only, since the masked number and the expiry stay at Authorize.net. |
| Transaction | Payment | Into HubSpot | Transaction id in a custom payment property, with the invoice number carrying the deal id | Charges, refunds, voids and declines alike, with amount, date and Authorize.net's own status beside HubSpot's. |
| Automated Recurring Billing subscription | Custom object | Into HubSpot | Subscription id | A custom object needs Enterprise, so smaller portals carry the status and next billing date on the deal. |
| Declined charge or suspended subscription | Engagement | Into HubSpot | Transaction id or subscription id, one task per failure | The task goes to the owner of the contact or deal, so a failed renewal reaches a person. |
Architecture
Events arrive first and a nightly pass settles the account. An endpoint recomputes the HMAC-SHA512 hash of each notification body with the Signature Key, compares it with the X-ANET-Signature header, answers 200 and queues the event.
A notification carries ids and a few fields, so the consumer reads the full record. Authorize.net says its API is not based on REST: each call posts a JSON or XML body naming the operation to a single endpoint, and JSON is translated into XML, so elements go in the reference’s order. The consumer keeps allowlisted fields only, never free text or the masked card number, upserts on the Authorize.net id, then links each record to its contact and deal.
Each night a sweep reads the previous day’s settled batches and their transactions, up to 1,000 a page, and repairs what the stream missed. Customer profiles and subscriptions have no changed-since filter, so it compares them by id and status. A watermark per settlement date makes a replay rewrite the same records. Authorize.net publishes no request rate limit, so the sweep paces itself and backs off on errors.
The service never handles a full card number: Accept Hosted or Accept.js sends it from the browser straight to Authorize.net, at SAQ A, or SAQ A-EP for Accept.js on your own form.
What the API allows
- API style
- JSON or XML over HTTPS
- Authentication
- API key
- Webhooks
- Yes
- Changed-since filter
- Partial
- Sandbox
- Yes
- Rate limit
- Not documented
Developer documentation developer.authorize.net
Three ways to connect
The choice here turns on what the business wants to see. Receipts copied into HubSpot are a small job. The state of each customer’s billing, with subscriptions, declines and a reconciliation that proves nothing went missing, needs a service that remembers what it has already written.
A custom API integration does both. An iPaaS is a fair smaller step where one already runs: Celigo documents a prebuilt Authorize.net connector that signs in with the API Login ID and Transaction Key, while Zapier lists Authorize.net as not yet supported. HubSpot’s own payments tool is the route people ask about most, and it runs on Stripe infrastructure, so choosing it means changing processor rather than connecting the one you have, with the stored profiles and recurring schedules that live in it.
-
Custom API integration
RecommendedSigned webhooks carry each event and a nightly pass over settled batches catches what they miss, all keyed on Authorize.net ids behind a field allowlist that lets no card detail through except the brand.
-
iPaaS
PossibleCeligo documents a prebuilt Authorize.net connector that signs in with the API Login ID and Transaction Key, which suits a team already running Celigo that wants settled payments copied on a schedule. Zapier lists Authorize.net as not yet supported.
-
Marketplace app
AvoidNothing in the HubSpot App Marketplace carries Authorize.net's name, and HubSpot's own payments tool runs on Stripe, so adopting it means changing processor rather than connecting this one.
What breaks and how we prevent it
A card number in a description
A description on a profile or an order is typed by a person, and nothing in the API stops a card number landing there. We copy no free text by default, and a check on every write drops anything shaped like a card number and logs the record id.
Webhooks switched to inactive
After ten failed retries over about nine days, Authorize.net marks the webhook inactive and stops sending, and it warns that holding the 200 back for processing invites exactly that. We answer before any processing, check the webhook’s status daily through the Webhooks API, and let the nightly sweep fill the gap.
Keys rotated for another cart
The API Login ID and its keys can serve every website and cart on the account, so a new Signature Key or Transaction Key made for another integration retires ours within 24 hours, or at once. We treat a run of signature failures as a likely key change: hold the events, alert, and re-verify them under the new key.
Active subscriptions that stopped paying
Authorize.net defines active as scheduled to be charged, which does not necessarily mean payments succeed, and its own reference shows an active subscription whose latest charge says the card has expired. We judge subscriptions by their latest transactions and the failed subscription event, and task the owner on every failed renewal.
Settlement dates read as local time
The settled batch call reads dates in the merchant’s time zone, or Mountain Time where none is set, unless the time ends in Z. A watermark copied from a batch’s UTC settlement time and sent back without the Z skips the batches in between. Ranges also stop at 31 days and at January 1 of the year before last, so a backfill runs in monthly slices and says where history ends.
Our approach
- Scope. We trace where cards are captured today, which other websites and carts share the account’s keys, and which failures each owner wants to hear about.
- Architect. We fix the field allowlist, the Authorize.net ids as keys, the invoice number convention that carries the deal id, and whether subscriptions get a custom object or deal properties.
- Build. Signature-checked ingest, the queue, the consumer and the nightly batch sweep, written against Authorize.net’s sandbox and a HubSpot test portal; an allowlist of portal ids refuses anything unlisted.
- Validate. The sandbox runs in Live Mode, because test mode stores nothing and returns a transaction id of zero. We push approvals, declines and held charges through it, compare counts per settled batch, and scan every written property for card-shaped values.
- Operate. We watch webhook status, signature failures and what the sweep repairs, and rotate keys by a runbook agreed with the account’s owner.
Common questions
Is there an Authorize.net app for HubSpot?
No. The HubSpot App Marketplace turns up fuzzy matches for Authorize.net and nothing named for it, though some form and payment apps mention it in their descriptions. Authorize.net's own site search and partner directory list no HubSpot integration either, so connecting the two starts with a build rather than an install, and with deciding which records HubSpot actually needs.
Can Authorize.net card numbers be stored in HubSpot?
No. HubSpot's Product and Services Catalog excludes full card numbers and card security codes even from its Enterprise Sensitive Data feature, and it lists the last four digits as a Sensitive Data type, so this sync leaves those out too. Authorize.net returns the number masked, and the expiry too unless a request asks otherwise. The card brand is the only card detail that crosses, beside ids, amounts, dates and statuses.
Does HubSpot payments work with Authorize.net?
No. HubSpot's knowledge base says HubSpot payments uses Stripe infrastructure to process payments, and the other processing option it describes is connecting a Stripe account. Neither routes a charge through Authorize.net. A business that stays on Authorize.net keeps its customer profiles and recurring schedules there and syncs the results into HubSpot, rather than changing processor to use HubSpot's checkout.
How soon does an Authorize.net payment appear in HubSpot?
The charge lands when its webhook does, with the status Authorize.net reported at that moment. The settled status follows within a day: Authorize.net groups transactions into a batch every 24 hours and settles after the account's cut-off time, 4 pm Pacific unless changed. Recurring charges run at about 2 a.m. Pacific on their scheduled date, so a renewal shows up early that morning.
What happens when an Authorize.net webhook is missed or arrives twice?
A duplicate is harmless: the second copy updates the record the first one wrote, since each record is matched on its Authorize.net id. A failed delivery is retried three times at three-minute intervals, three more at eight hours and four at 48 hours. Anything still missing is recovered by the nightly pass over settled batches and by the notification history, which lists failed deliveries and returns each one with its payload.
How is an Authorize.net webhook signature checked?
Authorize.net hashes each notification body with HMAC-SHA512, keyed on the account's Signature Key, and sends the result in the X-ANET-Signature header. The receiver repeats the hash and rejects a mismatch. The Merchant Interface shows the key as 128 hexadecimal characters that have to be converted to binary before hashing, and no notification is sent until a Signature Key exists.
Can HubSpot show when an Authorize.net subscription renews next?
Yes, as a computed date. Authorize.net returns each subscription's start date, its interval in days or months and its total and past occurrences, with no next billing date among the fields, so the sync works it out. It follows Authorize.net's own rule that a monthly subscription starting on the 31st bills on the last day of every shorter month.
What does an Authorize.net and HubSpot integration take in hours?
Plan on 10 to 20 hours of discovery and 70 to 150 hours of build covering customer profiles, payments, subscriptions and the decline tasks, with signature checks, the nightly batch sweep and a cutover rehearsed in the sandbox first. Most discovery hours go to two questions: where cards are captured today, and which other websites and carts share the account's keys.
Also in Payments and billing
Related reading
Partnerships and accreditations
HubSpot accreditations
Industry specializations
Partnerships
Trust and compliance
We design integrations to support the security and privacy rules your business works under, and we build them on independently audited platforms.
-
SOC 2
We build to support SOC 2 security controls, on platforms that hold SOC 2 reports of their own.
-
ISO/IEC 27001:2022
We build to support your information security program under ISO/IEC 27001:2022.
-
HIPAA
We scope BAA needs in discovery, then design builds around them for covered entities and their business associates.
-
GDPR
We scope data-processing needs in discovery and design builds to support your GDPR duties.
About the GDPR at the European Commission (opens in a new tab)
-
PIPEDA
We design builds to support your accountability for personal information as it moves between systems.
-
CASL
We can build consent capture and sync that support your CASL consent records.
Our builds run on
How we build
- Sandbox first. We build and test in a sandbox before anything reaches production.
- Fail-closed allowlists. An integration runs only against the HubSpot accounts it is approved for.
- Least-privilege access. Each integration gets only the API scopes it needs.
- Secrets in a vault. Keys and tokens live in a secrets vault, never in plain text.
- Sensitive data scoped early. Discovery covers sensitive data, access controls and any BAA or data-processing needs.
- A compliance package for regulated industries: audit logging, field-level encryption and sensitive-data handling.
Scope a Authorize.net integration
Send the systems, the direction and the record volume. We reply with a scope and an effort band within one business day.
Thanks, we will reply within one business day
Prash or Sean reads every one of these and comes back with a scope, or with the one question we need answered first.
Sources
- Authorize.net API Documentation developer.authorize.net
- Authorize.net API Documentation - Webhooks developer.authorize.net
- Authorize.net API Documentation - Customer Profiles developer.authorize.net
- Authorize.net API Documentation - Recurring Billing developer.authorize.net
- Authorize.net API Documentation - Transaction Reporting developer.authorize.net
- Authorize.net API Documentation - Authorize.net Accept developer.authorize.net
- Testing guide | Authorize.net Developer Center developer.authorize.net
- Common setup questions | Authorize.net Developer Center developer.authorize.net
- What are API Credentials and Keys and how to manage them in the Merchant Interface? - New Experience (2.0) support.authorize.net
- About us | Authorize.net authorize.net
- HubSpot Product & Services Catalog legal.hubspot.com
- Set up HubSpot payments knowledge.hubspot.com
- Payments API developers.hubspot.com
- Create a payment developers.hubspot.com
- Create and edit custom objects knowledge.hubspot.com
- Set up a connection to Authorize.net docs.celigo.com
- Authorize.net Integrations | Connect Your Apps with Zapier zapier.com