Built to keep customers
transacting

Built to keep customers
transacting

Built to keep customers
transacting

Built to keep customers
transacting

More than a token vault—Basis Theory routes, tokenizes, and optimizes your payments to drive conversion, resilience, and retention.

More than a token vault—Basis Theory routes, tokenizes, and optimizes your payments to drive conversion, resilience, and retention.

More than a token vault—Basis Theory routes, tokenizes, and optimizes your payments to drive conversion, resilience, and retention.

Boost authorization rates

Boost authorization rates

Boost authorization rates

Reduce churn

Reduce churn

Reduce churn

Route to any PSP

Route to any PSP

Route to any PSP

Routing

CARD

****1302

Routing

CARD

****1302

Routing

CARD

****1302

Innovative merchants work with

the Basis Theory Payment Vault

Innovative merchants work with

the Basis Theory Payment Vault

Innovative merchants work with the Basis Theory Payment Vault

Never miss a payment

An agnostic payment vault can slide into any payment stack without disrupting business.

An agnostic payment vault can slide into any payment stack without disrupting business.

Whether a customer is renewing a subscription with a credit card or paying with Apple Pay or Google Pay, you can tokenize the data to make it secure and usable—while staying compliant with PCI, SOC 2 Type II, ISO 27001, and HIPAA regulations.

Whether a customer is renewing a subscription with a credit card or paying with Apple Pay or Google Pay, you can tokenize the data to make it secure and usable—while staying compliant with PCI, SOC 2 Type II, ISO 27001, and HIPAA regulations.

Increase basket size and brand loyalty by combining omnichannel data into a single point of view.

Increase basket size and brand loyalty by combining omnichannel data into a single point of view.

Improve the customer experience

Improve the customer experience

Improve the customer experience

Condense the tech stack while adding redundancy

Condense the tech stack while adding redundancy

Condense the tech stack while adding redundancy

Consolidate data from multiple brands or data sources

Consolidate data from multiple brands or data sources

Consolidate data from multiple brands or data sources

import { basistheory } from '@basis-theory/web-elements';

let bt;
let cardNumberElement;
let cardExpirationDateElement;
let cardVerificationCodeElement;

async function init() {
  bt = await basistheory('<API_KEY>');

  // Creates Elements instances
  cardNumberElement = bt.createElement('cardNumber', {
    targetId: 'myCardNumber' // (custom) used for tracking validation errors
  });
  cardExpirationDateElement = bt.createElement('cardExpirationDate', {
    targetId: 'myCardExpiration'
  });
  cardVerificationCodeElement = bt.createElement('cardVerificationCode', {
    targetId: 'myCardVerification'
  });

  // Mounts Elements in the DOM in parallel
  await Promise.all([
    cardNumberElement.mount('#cardNumber'),
    cardExpirationDateElement.mount('#cardExpirationDate'),
    cardVerificationCodeElement.mount('#cardVerificationCode'),
  ]);

  // Binds card brand to verification code element
  cardNumberElement.on('change', ({ cardBrand }) => {
    cardVerificationCodeElement.update({ cardBrand });
  });
}

import { basistheory } from '@basis-theory/web-elements';

let bt;
let cardNumberElement;
let cardExpirationDateElement;
let cardVerificationCodeElement;

async function init() {
  bt = await basistheory('<API_KEY>');

  // Creates Elements instances
  cardNumberElement = bt.createElement('cardNumber', {
    targetId: 'myCardNumber' // (custom) used for tracking validation errors
  });
  cardExpirationDateElement = bt.createElement('cardExpirationDate', {
    targetId: 'myCardExpiration'
  });
  cardVerificationCodeElement = bt.createElement('cardVerificationCode', {
    targetId: 'myCardVerification'
  });

  // Mounts Elements in the DOM in parallel
  await Promise.all([
    cardNumberElement.mount('#cardNumber'),
    cardExpirationDateElement.mount('#cardExpirationDate'),
    cardVerificationCodeElement.mount('#cardVerificationCode'),
  ]);

  // Binds card brand to verification code element
  cardNumberElement.on('change', ({ cardBrand }) => {
    cardVerificationCodeElement.update({ cardBrand });
  });
}

import { basistheory } from '@basis-theory/web-elements';

let bt;
let cardNumberElement;
let cardExpirationDateElement;
let cardVerificationCodeElement;

async function init() {
  bt = await basistheory('<API_KEY>');

  // Creates Elements instances
  cardNumberElement = bt.createElement('cardNumber', {
    targetId: 'myCardNumber' // (custom) used for tracking validation errors
  });
  cardExpirationDateElement = bt.createElement('cardExpirationDate', {
    targetId: 'myCardExpiration'
  });
  cardVerificationCodeElement = bt.createElement('cardVerificationCode', {
    targetId: 'myCardVerification'
  });

  // Mounts Elements in the DOM in parallel
  await Promise.all([
    cardNumberElement.mount('#cardNumber'),
    cardExpirationDateElement.mount('#cardExpirationDate'),
    cardVerificationCodeElement.mount('#cardVerificationCode'),
  ]);

  // Binds card brand to verification code element
  cardNumberElement.on('change', ({ cardBrand }) => {
    cardVerificationCodeElement.update({ cardBrand });
  });
}

import { basistheory } from '@basis-theory/web-elements';

let bt;
let cardNumberElement;
let cardExpirationDateElement;
let cardVerificationCodeElement;

async function init() {
  bt = await basistheory('<API_KEY>');

  // Creates Elements instances
  cardNumberElement = bt.createElement('cardNumber', {
    targetId: 'myCardNumber' // (custom) used for tracking validation errors
  });
  cardExpirationDateElement = bt.createElement('cardExpirationDate', {
    targetId: 'myCardExpiration'
  });
  cardVerificationCodeElement = bt.createElement('cardVerificationCode', {
    targetId: 'myCardVerification'
  });

  // Mounts Elements in the DOM in parallel
  await Promise.all([
    cardNumberElement.mount('#cardNumber'),
    cardExpirationDateElement.mount('#cardExpirationDate'),
    cardVerificationCodeElement.mount('#cardVerificationCode'),
  ]);

  // Binds card brand to verification code element
  cardNumberElement.on('change', ({ cardBrand }) => {
    cardVerificationCodeElement.update({ cardBrand });
  });
}

Keep recurring revenue flowing with smart retries, token updates, and backup routing.

Keep recurring revenue flowing with smart retries, token updates, and backup routing.

Increase revenue by improving conversion and authorization rates.

Increase revenue by improving conversion and authorization rates.

Increase revenue by improving conversion and authorization rates.

Smart routing to reduce churn through backup PSP.

Smart routing to reduce churn through backup PSP.

Smart routing to reduce churn through backup PSP.

Tie billing to individual PSP.

Tie billing to individual PSP.

Tie billing to individual PSP.

Future-proof your platform.
Let merchants bring their own PSPs—or become one yourself.

Future-proof your platform.
Let merchants bring their own PSPs—or become one yourself.

Create more revenue without acquiring new customers.

Create more revenue without acquiring new customers.

Create more revenue without acquiring new customers.

Enable a merchant to bring their own PSP.

Enable a merchant to bring their own PSP.

Enable a merchant to bring their own PSP.

Become a Payfac.

Become a Payfac.

Become a Payfac.

import { basistheory } from '@basis-theory/web-elements';

let bt;
let cardNumberElement;
let cardExpirationDateElement;
let cardVerificationCodeElement;

async function init() {
  bt = await basistheory('<API_KEY>');

  // Creates Elements instances
  cardNumberElement = bt.createElement('cardNumber', {
    targetId: 'myCardNumber' // (custom) used for tracking validation errors
  });
  cardExpirationDateElement = bt.createElement('cardExpirationDate', {
    targetId: 'myCardExpiration'
  });
  cardVerificationCodeElement = bt.createElement('cardVerificationCode', {
    targetId: 'myCardVerification'
  });

  // Mounts Elements in the DOM in parallel
  await Promise.all([
    cardNumberElement.mount('#cardNumber'),
    cardExpirationDateElement.mount('#cardExpirationDate'),
    cardVerificationCodeElement.mount('#cardVerificationCode'),
  ]);

  // Binds card brand to verification code element
  cardNumberElement.on('change', ({ cardBrand }) => {
    cardVerificationCodeElement.update({ cardBrand });
  });
}

import { basistheory } from '@basis-theory/web-elements';

let bt;
let cardNumberElement;
let cardExpirationDateElement;
let cardVerificationCodeElement;

async function init() {
  bt = await basistheory('<API_KEY>');

  // Creates Elements instances
  cardNumberElement = bt.createElement('cardNumber', {
    targetId: 'myCardNumber' // (custom) used for tracking validation errors
  });
  cardExpirationDateElement = bt.createElement('cardExpirationDate', {
    targetId: 'myCardExpiration'
  });
  cardVerificationCodeElement = bt.createElement('cardVerificationCode', {
    targetId: 'myCardVerification'
  });

  // Mounts Elements in the DOM in parallel
  await Promise.all([
    cardNumberElement.mount('#cardNumber'),
    cardExpirationDateElement.mount('#cardExpirationDate'),
    cardVerificationCodeElement.mount('#cardVerificationCode'),
  ]);

  // Binds card brand to verification code element
  cardNumberElement.on('change', ({ cardBrand }) => {
    cardVerificationCodeElement.update({ cardBrand });
  });
}

import { basistheory } from '@basis-theory/web-elements';

let bt;
let cardNumberElement;
let cardExpirationDateElement;
let cardVerificationCodeElement;

async function init() {
  bt = await basistheory('<API_KEY>');

  // Creates Elements instances
  cardNumberElement = bt.createElement('cardNumber', {
    targetId: 'myCardNumber' // (custom) used for tracking validation errors
  });
  cardExpirationDateElement = bt.createElement('cardExpirationDate', {
    targetId: 'myCardExpiration'
  });
  cardVerificationCodeElement = bt.createElement('cardVerificationCode', {
    targetId: 'myCardVerification'
  });

  // Mounts Elements in the DOM in parallel
  await Promise.all([
    cardNumberElement.mount('#cardNumber'),
    cardExpirationDateElement.mount('#cardExpirationDate'),
    cardVerificationCodeElement.mount('#cardVerificationCode'),
  ]);

  // Binds card brand to verification code element
  cardNumberElement.on('change', ({ cardBrand }) => {
    cardVerificationCodeElement.update({ cardBrand });
  });
}

import { basistheory } from '@basis-theory/web-elements';

let bt;
let cardNumberElement;
let cardExpirationDateElement;
let cardVerificationCodeElement;

async function init() {
  bt = await basistheory('<API_KEY>');

  // Creates Elements instances
  cardNumberElement = bt.createElement('cardNumber', {
    targetId: 'myCardNumber' // (custom) used for tracking validation errors
  });
  cardExpirationDateElement = bt.createElement('cardExpirationDate', {
    targetId: 'myCardExpiration'
  });
  cardVerificationCodeElement = bt.createElement('cardVerificationCode', {
    targetId: 'myCardVerification'
  });

  // Mounts Elements in the DOM in parallel
  await Promise.all([
    cardNumberElement.mount('#cardNumber'),
    cardExpirationDateElement.mount('#cardExpirationDate'),
    cardVerificationCodeElement.mount('#cardVerificationCode'),
  ]);

  // Binds card brand to verification code element
  cardNumberElement.on('change', ({ cardBrand }) => {
    cardVerificationCodeElement.update({ cardBrand });
  });
}

Add redundancy to protect against being shut down by a single PSP.

Add redundancy to protect against being shut down by a single PSP.

Never miss a payment.

Never miss a payment.

Never miss a payment.

Keep conversion rates high.

Keep conversion rates high.

Keep conversion rates high.

Use customer data without the burden of protection.

Use customer data without the burden of protection.

Use customer data without the burden of protection.

“We needed a solution that we could implement quickly and was not super operationally heavy. It was clear to me that Basis Theory was what we needed and I’d be hard-pressed to think there’s something more relevant to what we were trying to solve—which was to maintain PCI compliance.”

“We needed a solution that we could implement quickly and was not super operationally heavy. It was clear to me that Basis Theory was what we needed and I’d be hard-pressed to think there’s something more relevant to what we were trying to solve—which was to maintain PCI compliance.”

Matt Donofrio

Matt Donofrio

Head of Revenue @ Marble

Head of Revenue @ Marble

Built for developers, loved by security teams.

Built for developers, loved by security teams.

Security and privacy are built into our DNA

Our platform is engineered with a security-first mindset, ensuring that every transaction is fortified with the highest level of data protection.

Our platform is engineered with a security-first mindset, ensuring that every transaction is fortified with the highest level of data protection.

PCI

LEVEL 1

PCI

LEVEL 1

PCI

LEVEL 1

PCI

LEVEL 1

SOC 2

type II

SOC 2

type II

SOC 2

type II

SOC 2

type II

HIPAA

compliant

HIPAA

compliant

HIPAA

compliant

HIPAA

compliant

ISO

27001

ISO

27001

ISO

27001

ISO

27001

Safely collect card data.

Jump out to an early lead. Explore, iterate, and scale regulated products faster than the competition.

Safely collect card data.

Jump out to an early lead. Explore, iterate, and scale regulated products faster than the competition.

Safely collect card data.

Jump out to an early lead. Explore, iterate, and scale regulated products faster than the competition.

Safely collect card data.

Jump out to an early lead. Explore, iterate, and scale regulated products faster than the competition.