Processing a Sale

Overview

Processing an ACH SALE creates a new transaction that is batched for settlement with a bank.

As previously mentioned, to generate the PayConex™ token needed to process your transactions, use the Checkout Component with the PCI-compliant environment provided by Bluefin. For more details, see PayConex™ and ShieldConex®.

After tokenizing account data, we are set to make a simple ACH sale transaction.


🚧

Real-time ACH Account Verification required by NACHA

The National ACH Association (NACHA) has introduced a new rule that states payment originators must perform account validation for ACH transactions the first time an account number is used to make a WEB debit transaction.

Bluefin has worked to provide a flexible toolset that developers and merchants can utilize to meet or exceed these new requirements.

To learn more, please see our guide titled, Real-Time ACH Account Verification


Test ACH Processing

For ACH testing account/routing numbers for your certification, please refer to Test Accounts, Cards, and Cases | Test ACH Processing.

Also see: Getting Started | Integration Steps.



📘

Did you know?

You can request a transactionId value prior to processing a transaction by simply initializing a transaction. This option can help with mitigating communication errors and other potential complications. For more information, see our guide Initializing a Transaction.


Request

POST /api/v4/accounts/{accountId}/ach/sale

{
  "bfTokenReference": "PAYCONEX_TOKEN",
  "amounts": {
    "total": "10.00",
    "currency": "USD"
  }
}

*Required Scopes: pcx:payments:*, pcx:payments:ach:*, pcx:payments:ach:sale


Transaction Processing: Token Retrieval

With savePaymentOption set to true, it is important to note that, in response, the token gets vaulted so that we can use it to reissue transactions. For example, if a developer wants to save a customer's payment details to charge their account later (for recurring billing or delayed charges), they can use the same token to reference the original payment information and process subsequent transactions without needing the account details again.

Also see Customer and Merchant Initiated Transactions and Storing a Card on File.

For example, if we set savePaymentOption to true, the CIT sale/store/authorization transaction response includes bfTokenReference and shieldConexToken. Otherwise, they are stripped out.

🚧

Transaction Metadata

Both bfTokenReference and shieldConexToken are stripped out from the transaction metadata at all times for security purposes.

{
  "transactionId": "000000101366",
  "status": "PENDING",
  "timestamp": "2026-08-11T12:35:15.000000Z",
  "bfTokenReference": "bft_d145...",
  "customer": {
    "name": "Alice",
    "billingAddress": {
      "address1": "address1",
      "address2": "address2",
      "city": "My City",
      "state": "MO",
      "zip": "90210",
      "country": "USA",
      "company": "Acme Inc."
    }
  },
  "shippingAddress": {
    "address1": "address1",
    "address2": "address2",
    "city": "My City",
    "state": "MO",
    "zip": "90210",
    "country": "USA",
    "company": "Acme Inc.",
    "recipient": "Alice Smith"
  },
  "trace": {
    "source": "PCX V4",
    "history": [
      {
        "action": "transaction",
        "requestId": "f8e20c58-94dc-4ffe-8fdb-f6167db70145",
        "correlationId": "8eddc8b7-5e85-41c1-964a-c751d5824307",
        "timestamp": "2026-08-11T07:35:15-05:00"
      }
    ]
  },
  "amounts": {
    "currency": "USD",
    "approved": "10.00"
  },
  "ach": {
    "verified": false,
    "verificationPassed": false,
    "accountType": "Checking",
    "name": "Alice"
  },
  "shieldConexToken": {
    "bfid": "djI6MTIw...",
    "bankAccountNumber": "9924766996600301",
    "bankRoutingNumber": "214028335"
  }
}

From this point on, even if we process another transaction with the same PayConex token, the bfTokenReference and shieldConexToken are not included since it is then an MIT transaction.


More Complex Sale Transaction Request

{
  "description": "Invoice #INV-45821 – Consulting services",
  "bfTokenReference": "PAYCONEX_TOKEN",
  "amounts": {
    "total": "10.00",
    "currency": "USD"
  },
  "customer": {
    "name": "Alice",
    "billingAddress": {
      "address1": "address1",
      "address2": "address2",
      "city": "Kansas City",
      "state": "MO",
      "zip": "90210",
      "country": "USA",
      "company": "Acme Inc."
    }
  },
  "shippingAddress": {
    "address1": "address1",
    "address2": "address2",
    "city": "Kansas City",
    "state": "MO",
    "zip": "90210",
    "country": "USA",
    "company": "Acme Inc.",
    "recipient": "Alice Smith"
  },
  "items": [
    {
      "commodityCode": "09.02.10",
      "description": "#INV-45821 Consulting services",
      "productCode": "ABC123",
      "quantity": "1",
      "unitOfMeasure": "units",
      "unitCost": "10.00"
    }
  ],
  "trace": {
    "customId": "asdf123",
    "cashier": "A920:0820617507",
    "clientIp": "100.33.36.118",
    "gpsLocation": {
      "latitude": "",
      "longitude": ""
    },
    "source": "PayConex V4",
    "timestamp": "2026-10-24T13:32:08.603Z",
    "tags": [
      "ACX42342"
    ]
  }
}
📘

Note

In the case of personal information such as customer and shippingAddress, these get re-tokenized and overwritten as they can be included in the PayConex™ token generated via the Checkout Component or vaulted via reissuing payment.