HomeGuidesReference
Log In
Guides

Summary

  • According to federal guidelines, state grocery taxes cannot be collected on items purchased with SNAP funds. However, SNAP-eligible items paid for using a different form of payment are taxable.
  • In states where groceries are taxable, Fully Hosted Checkout integrations must enable Forage to calculate taxes on all items in the basket.
  • Custom Checkout integrations or merchants that 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 the 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 USDA’s Food and Nutrition Service (FNS) mandates that no sales tax be imposed on purchases made with SNAP benefits. This means that if a customer pays for their entire cart using SNAP, none of the items can be taxed. However, when a customer uses a combination of payment methods (called a split-tender transaction), sales tax applies only to the portion of the order paid with credit, debit, or EBT Cash.

For instance, if a customer buys $100 worth of products and chooses to pay $25 with SNAP and $75 with a credit card, the sales tax would be calculated on the $75 portion. If the payment breakdown is reversed—$75 with SNAP and $25 with credit—then only the $25 would be taxed.

In states where only certain food items are taxable, the system assumes that SNAP benefits are applied first to those taxable items. Consequently, tax is only charged if the total value of all taxable items exceeds the amount covered by SNAP.

New Jersey has a special rule. Under state tax law, if a customer uses SNAP for any portion of their purchase, then all items in the order that qualify for SNAP are automatically exempt from sales tax.

If a customer uses a manufacturer’s coupon or other types of discounts, sales tax may still apply to the portion of the total covered by the coupon.

States with No Grocery Tax

If your store uses a Fully Hosted Checkout integration and operates only in states where groceries are not taxed, you do not need to use Forage Checkout’s built-in tax calculation feature.

In these states, Forage Checkout will not apply any tax to SNAP-eligible items, even if the customer pays with a credit card instead of SNAP. Consequently, if your store meets these conditions, you are free to calculate taxes on your own for items that are not eligible for SNAP and include those amounts in the totals when you send the request to create a checkout session.

Disabling Forage Checkout Tax Calculations

To turn off tax calculations, you need to pass an empty list ([]) in the product_list field when you create a checkout session. When product_list is empty, two things happen:

  • First, the total amount that Forage charges will exactly match the sum of the snap_total, ebt_cash_total, and remaining_total values that you provide in the session request.
  • Second, the sales_tax_applied field on the order receipt will show a value of 0, meaning no sales tax was applied.

Forage Checkout

To use Forage Checkout, merchants must send detailed information about each product in the cart to the Forage API. This lets Forage Checkout calculate sales tax accurately based on how the customer splits their payment between different methods. It’s important to remember that any portion paid with SNAP is not taxed.

If any items in the cart are subject to sales tax, the merchant is required to include a list of those products in the product_list field when creating a checkout session. This list contains product-level data and would look something like the following:

[
  {
    "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 customers enter the amount of SNAP benefits they want to use in Forage Checkout, Forage calculates the sales tax based on SNAP-eligible items that are not fully paid for with SNAP.

For example, if the customer applies $22 in SNAP benefits to their order, this amount would cover all of the apples and $16 of a frozen meal. The remaining $3.99 of the frozen meal—because it's not covered by SNAP and is instead paid with a credit card, debit card, or EBT Cash—would be subject to sales tax.

Sales tax also applies to any items that are not eligible for SNAP, such as a taxable cookware set. Therefore, if the cookware costs $35 and is taxed at 8%, while the unpaid $3.99 portion of the frozen meal is taxed at 1.25%, the total tax would be:

($3.99 × 0.0125) + ($35.00 × 0.08) = $2.85

To correctly calculate taxes for items that are taxed by more than one tax authority (like city, county, or state), we support using a tax_rate_list. When doing this, the product_list would be structured 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 two new fields: taxes_charged and taxes_exempted.

  • The taxes_charged field gives a detailed breakdown of how each item in the order was taxed.
  • The taxes_exempted field shows how much tax would have been charged for each item if it hadn't been paid for using SNAP benefits.

Using the earlier example with a tax_rate_list included, and checking out with $12.37 in SNAP benefits, the returned result would look like this:

[
  {
    "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 who want to build their custom checkout system must correctly handle tax calculations in their own software. Forage is the secure platform in this setup to collect the customer’s PIN and process the payments.

The correct way to calculate taxes is defined by law. Here is the required process:

  1. Sort all SNAP-eligible products by their tax rate, starting with the highest tax rate.
  2. Go down the list and apply the customer's SNAP benefits to the items, starting with the one that has the highest tax rate.
  3. When all the SNAP benefits have been used, sales tax will be charged on the remaining items.
    • If a SNAP benefit runs out while partially paying for an item (for example, a $1.00 item with only $0.75 of SNAP benefits left), then charge sales tax on the unpaid portion (in this case, $0.25).

Interpreting the Receipt

The Forage API allows access to all completed orders. Each Order includes a receipt object containing key payment and tax details.

The receipt includes these fields:

  • snap_amount: the amount of the order paid with SNAP benefits.
  • ebt_cash_amount: the amount paid using EBT Cash.
  • other_amount: the amount paid with a credit or debit card.
  • sales_tax_applied: the total tax that was charged on the order.

When combined with the original three Order eligibility fields:

  • snap_total: the total cost of SNAP-eligible items.
  • ebt_cash_total: the total cost of items eligible for EBT Cash.
  • remaining_total: the cost of all other items,

Every valid Order will follow this equation:

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

You can also get a summary of this information, including taxes collected, by using the Order report function.


What’s Next