Summary

  • Per federal guidelines, state grocery taxes cannot be collected on items purchased with SNAP funds. However, SNAP-eligible items paid for with another form of tender are taxable.
  • In states where groceries are taxable, Fully Hosted Checkout integrations must allow Forage to calculate taxes for all items in the basket.
  • Custom Checkout integrations or merchants who do not operate in states where groceries are taxable should calculate their own taxes and always pass an empty product_list when creating checkout sessions.
  • You can find the taxes calculated by Forage Checkout in the sales_tax_applied of the Order receipt.
  • You can find a breakdown of taxes applied to individual items by inspecting the taxes_charged fields on the product_list of the Order after it has been successfully processed.

Regulation

The FNS stipulates that no sales tax be applied to SNAP purchases. Therefore, if a customer pays for the full price of their cart with SNAP, no sales taxes can be charged on the items bought. However, if a customer would like to checkout with a split-tender transaction, sales tax is applied to the portion of the transaction bought with credit/debit or EBT Cash. For example, assume a customer is checking out with $100 worth of products and plans on paying for $25 with SNAP and $75 with credit. The sales tax applied in this scenario would be $75 x tax rate. If the example were changed to be $25 with credit and $75 with SNAP, the sales tax applied would be $25 x tax rate.

In states where only some food is taxable, then the taxable items would be the first ones covered by the SNAP benefit. Only if the total of all taxable food exceeds the SNAP payment should tax be charged.

New Jersey is an exception to the above generalities. According to their tax regulations, if a customer uses SNAP to purchase any items in the basket, then all SNAP-eligible items are non-taxable.

If a customer checks out with a manufacturer coupon or other discount coupons, sales tax can be charged on the portion of the total paid for with the coupon.

States with No Grocery Tax

Even if you have chosen a Fully Hosted Checkout integration, there is no requirement to use Forage Checkout’s tax calculations if your store exclusively operates in states where groceries are not taxed.

In states without grocery taxes, there would be no tax applied to SNAP-eligible items by Forage Checkout, even if the customer chose to pay with a credit card. Therefore, integrations which meet these conditions are free to calculate their own taxes for SNAP-ineligible items and include them in the totals passed to the create session request.

Disabling Forage Checkout Tax Calculations

To disable tax calculations, simply pass an empty list [] in the product_list field of the session creation request. If the product_list is empty, then the following will hold,

  • The total amount captured by Forage will equal the sum of the snap_total, ebt_cash_total, and remaining_total values provided in the session creation request.
  • The sales_tax_applied field on the Order receipt will also be 0.

Forage Checkout

To integrate with Forage Checkout, merchants will need to pass product-level information to the Forage API, so that Forage Checkout can calculate sales tax. Forage Checkout calculates the tax that should be charged based on how much the customer chooses to spend with various payment methods (remember, SNAP funds are not taxable).

If there are sales taxes applied to any items in a cart, the merchant must pass a list of product information to the Forage API through the product_list field on the sessions endpoint. The list will look something like this:

[
  {
    "name": "Apples",
    "upc": "100000001",
    "unit_price": 2.00,
    "tax_rate": 0.05,
    "quantity": 3,
    "eligibility": "snap"
  },
  {
    "name": "Frozen Meal",
    "upc": "100022001",
    "unit_price": 19.99,
    "tax_rate": 0.0125,
    "quantity": 1,
    "eligibility": "snap"
  },
  {
    "name": "T-Shirt",
    "upc": "123456677",
    "unit_price": 35.00,
    "tax_rate": 0.08,
    "quantity": 1,
    "eligibility": "ebt_cash"
  }
]

When a customer inputs the amount of SNAP they would like to charge to their card for an Order in Forage Checkout, we calculate the applicable sales tax for the SNAP eligible items that are not covered by the amount of SNAP applied. Using the example above, if the customer wants to put $22 of their SNAP benefit towards the Order, we would apply that to the entirety of the apples and $16 worth of the frozen meal. The remaining $3.99 of the frozen meal that is being covered with credit/debit/EBT Cash would be charged sales tax. Thus, the total sales tax that would be applied to this Order at checkout would be ($3.99 x 0.0125) + ($35.00 x 0.08) = $2.85.

In order to properly calculate taxes for items that are taxed by multiple entities, we also support passing in a tax_rate_list. In that case, the product_list would look something like this:

[
  {
    "name": "Apples",
    "upc": "100000001",
    "unit_price": 2.00,
    "tax_rate_list": [
      {
        "imposed_by": "LA County Tax",
        "tax_rate": 0.02
      },
      {
        "imposed_by": "California State Tax",
        "tax_rate": 0.03
      },
    ],
    "quantity": 3,
    "eligibility": "snap"
  },
  {
    "name": "Frozen Meal",
    "upc": "100022001",
    "unit_price": 19.99,
    "tax_rate_list": [
      {
        "imposed_by": "LA County Tax",
        "tax_rate": 0.005
      },
      {
        "imposed_by": "California State Tax",
        "tax_rate": 0.0075
      },
    ],
    "quantity": 1,
    "eligibility": "snap"
  },
  {
    "name": "T-Shirt",
    "upc": "123456677",
    "unit_price": 35.00,
    "tax_rate_list": [
      {
        "imposed_by": "LA County Tax",
        "tax_rate": 0.03
      },
      {
        "imposed_by": "California State Tax",
        "tax_rate": 0.05
      },
    ],
    "quantity": 1,
    "eligibility": "ebt_cash"
  }
]

In the scenario that an item is SNAP eligible, but has a surcharge or tax applied to it that is not SNAP eligible (ex. Bottle Deposit Fees), the separate fee must be added to the product_list as a separate line item. If we added a bottle of Orange Juice to the example above that had a $2.00 bottle deposit fee, we would append both items to the list as separate objects:

[
  {
    "name": "Orange Juice",
    "upc": "100000004",
    "unit_price": 5.00,
    "tax_rate": 0,
    "quantity": 1,
    "eligibility": "snap"
  },
  {
    "name": "Bottle Deposit Fee",
    "upc": "999999999",
    "unit_price": 2.00,
    "tax_rate": 0,
    "quantity": 1,
    "eligibility": "non_ebt"
  }
]

When an Order has been successfully processed, Forage updates the product_list to include taxes_charged and taxes_exempted fields. The taxes_charged fields give a more granular breakdown of how each item was taxed and the taxes_exempted fields represent the amount of taxes that would have been charged had the item not been paid for with SNAP. Using the example above that includes the tax_rate_list field and checking out with $12.37 of SNAP would return:

[
  {
    "name": "T-Shirt",
    "upc": "123456677",
    "unit_price": "35.00",
    "quantity": 1,
    "tax_rate_list": [
      {
        "imposed_by": "LA County Tax",
        "tax_rate": "0.030000",
        "taxes_charged": "1.05",
        "taxes_exempted": "0.00"
      },
      {
        "imposed_by": "California State Tax",
        "tax_rate": "0.050000",
        "taxes_charged": "1.75",
        "taxes_exempted": "0.00"
      }
    ],
    "taxes_charged": "2.80",
    "taxes_exempted": "0.00",
    "eligibility": "ebt_cash"
    },
  {
    "name": "Apples",
    "upc": "100000001",
    "unit_price": "2.00",
    "quantity": 3,
    "tax_rate_list": [
      {
        "imposed_by": "LA County Tax",
        "tax_rate": "0.020000",
        "taxes_charged": "0.00",
        "taxes_exempted": "0.12"
      },
      {
        "imposed_by": "California State Tax",
        "tax_rate": "0.030000",
        "taxes_charged": "0.00",
        "taxes_exempted": "0.18"
      }
    ],
    "taxes_charged": "0.00",
    "taxes_exempted": "0.30",
    "eligibility": "snap"
  },
  {
    "name": "Frozen Meal",
    "upc": "100022001",
    "unit_price": "19.99",
    "quantity": 1,
    "tax_rate_list": [
      {
        "imposed_by": "LA County Tax",
        "tax_rate": "0.005000",
        "taxes_charged": "0.07",
        "taxes_exempted": "0.03"
      },
      {
        "imposed_by": "California State Tax",
        "tax_rate": "0.007500",
        "taxes_charged": "0.10",
        "taxes_exempted": "0.05"
      }
    ],
    "taxes_charged": "0.17",
    "taxes_exempted": "0.08",
    "eligibility": "snap"
  }
]

Custom Checkout

Merchants that would like to implement a custom checkout will need to handle tax calculations correctly in their own systems. With this integration, Forage is just the railway system to securely capture the PIN and process payments.

The algorithm for properly calculating taxes is prescribed by regulation:

  1. Sort your list of SNAP eligible products by their tax rate in descending order.
  2. Starting with the item with the highest tax rate, use SNAP to cover the items in your list.
  3. Once the total amount of SNAP allocated has been used, charge sales tax on the rest of the items. If all the available SNAP is consumed while in the middle of an item (Ex. $1.00 item with $0.75 of SNAP left), charge sales tax on the remaining portion of the item (Ex. Charge sales tax on the remaining $0.25).

Interpreting the Receipt

All completed Orders can be queried for through the Forage API and will have a receipt object attached to them. The receipt includes the fields snap_amount, ebt_cash_amount, and other_amount. These fields tell you the amount of the Order that the customer paid for with SNAP, EBT Cash, and credit/debit. Also, the receipt has the sales_tax_applied field that is set to the taxes that were charged for the Order. Using these receipt fields and the original 3 Order eligibility fields snap_total, ebt_cash_total, and remaining_total, every valid rder will satisfy this equation:

snap_amount + ebt_cash_amount + other_amount = sales_tax_applied + snap_total + ebt_cash_total + remaining_total

You can access a summary of this information, including taxes collected, using the Order report request.


What’s Next