Skip to main content
Affirm is a buy now, pay later (BNPL) payment method that allows eligible buyers to split purchases into installments. Affirm uses a redirect flow where the buyer approves the payment on the Affirm hosted page.

Setup

To sign up for an account visit the sign-up page and fill in the details.

Credentials

When setting up Affirm in the dashboard, configure the following credentials. Contact your Affirm representative to obtain these values.
  • Public key - Your Affirm public key for client-side authentication.
  • Private key - Your Affirm private key for server-side authentication.
  • Merchant name - Your merchant name as registered with Affirm.

Features

Affirm supports the following features:
  • Delayed capture - Authorize a payment and capture it at a later time
  • Partial capture - Capture a portion of the authorized amount
  • Partial refunds - Refund a portion of the captured amount
  • Refunds - Refund transactions in full
  • Void - Cancel an authorized transaction before capture
  • Transaction sync - Automatic synchronization of transaction status updates

Supported countries

Affirm supports transactions from buyers in US.

Supported currencies

Affirm supports processing payments in USD.

Limitations

The following features are not supported by this connector:
  • Payment method tokenization - Storing payment methods for future use is not supported
  • Zero auth - Zero-dollar verification transactions are not supported
  • Over capture - Capturing more than the authorized amount is not supported
  • Partial authorization - Accepting a partial amount when the full amount cannot be authorized is not supported
  • Network tokens - Network tokenization is not supported
  • 3-D Secure - 3DS authentication is not applicable

Required fields

Affirm requires cart items to be included with every transaction. Up to 249 cart items can be provided. Based on the account setup, Affirm might also require buyer billing and shipping details. When not provided, the Affirm transaction might fail with an invalid_request_parameters error code, more specifically with a raw missing_fields error from Affirm.

Integration

The default integration for Affirm uses a redirect to a hosted payments page. Start by creating a new transaction with the following required fields.
var transaction = await client.Transactions.CreateAsync(
  transactionCreate: new TransactionCreate()
  {
    Amount = 1299,
    Currency = "USD",
    Country = "US",
    PaymentMethod =
      TransactionCreatePaymentMethod.CreateCheckoutSessionWithUrlPaymentMethodCreate(
        new RedirectPaymentMethodCreate()
        {
          Method = "affirm",
          RedirectUrl = "https://example.com/callback",
        }
      ),
  }
);
After the transaction is created, the API response includes a payment_method.approval_url and the status is set to buyer_approval_pending. The approval URL expires after 30 minutes.
{
  "type": "transaction",
  "id": "ea1efdd0-20f9-44d9-9b0b-0a3d71e9b625",
  "payment_method": {
    "type": "payment-method",
    "approval_url": "https://cdn.gr4vy.com/connectors/..."
  },
  "method": "affirm"
}
Redirect the buyer to the approval_url (open in a browser or Webview), where they can complete the payment. Once the buyer approves, the transaction progresses to an authorization_succeeded or capture_succeeded state.

Connection options

Affirm supports the pass through of the following connection options when creating a request. These options allow you to include itinerary details and discount information.
var transaction = await client.Transactions.CreateAsync(
  transactionCreate: new TransactionCreate()
  {
    Amount = 1299,
    Currency = "USD",
    Country = "US",
    PaymentMethod =
      TransactionCreatePaymentMethod.CreateCheckoutSessionWithUrlPaymentMethodCreate(
        new RedirectPaymentMethodCreate()
        {
          Method = "affirm",
          RedirectUrl = "https://example.com/callback",
        }
      ),
    ConnectionOptions = new Dictionary<string, object>()
    {
      ["affirm-affirm"] = new Dictionary<string, object>()
      {
        ["itinerary"] = new Dictionary<string, string>()
        {
          ["type"] = "event",
          ["sku"] = "ABC123",
          ["display_name"] = "Bad Bunny at Petco Park",
          ["venue"] = "Petco Park",
          ["location"] = "100 Park Blvd, San Diego, CA 92101, US",
          ["date_start"] = "2022-12-06T03:00:00.000Z UTC"
        },
        ["discounts"] = new Dictionary<string, object>()
        {
          ["RETURN5"] = new Dictionary<string, object>()
          {
            ["discount_amount"] = 500,
            ["discount_display_name"] = "Returning customer 5% discount"
          },
          ["PRESDAY10"] = new Dictionary<string, object>()
          {
            ["discount_amount"] = 1000,
            ["discount_display_name"] = "President's Day 10% off"
          }
        }
      }
    }
  }
);