Skip to main content

Loop Exchanges Journal Entry

The Loop Exchanges Journal Entry captures accounting activity for exchanges processed through Loop Returns. Layers on top of Orders and Revenue Recognition JEs to prevent duplicate revenue, unreconciled sales tax, or unknown clearing balances.

Written by Na Koo
Updated this week

Overview

The Loop Exchanges Journal Entry captures the accounting activity for exchanges processed through Loop Returns. Its job is to layer on top of your Orders and Revenue Recognition journal entries so that exchanges don't create duplicate revenue, unreconciled sales tax, or unknown clearing balances — and so that the full lifecycle of an exchange nets to a zero impact on your books.

Loop exchanges are complex because they involve multiple journal entries firing across multiple days, and data flowing from both Shopify and Loop. This article walks through the full lifecycle to show how the pieces fit together.

What This Journal Entry Captures

The Loop Exchanges JE specifically records:

  • Exchange credits created when a customer initiates a Loop exchange

  • Loop exchange clearing account activity — the balance held while waiting for exchange fulfillment

  • Sales tax netting entries that offset Shopify's duplicate tax accrual on the exchange order

  • Revenue offsets at exchange fulfillment to prevent double-counting gross revenue

  • Exchange refunds and exchange-of-exchange activity when a customer refunds or exchanges the exchange

Activity that does not live in this JE:

  • The original order (lives in the Orders and Revenue Recognition JEs)

  • The original cash settlement (lives in the Cash Receipt JE)

  • Standard refunds not routed through Loop (live in the Orders JE)

The Loop Exchange Lifecycle

Phase 1: Original Order

Nothing Loop-specific yet. The original order flows through your standard journal entries:

  • Orders JE: records deferred revenue, discounts, sales tax payable, and gross AR expected

  • Revenue Recognition JE (at fulfillment): removes deferred revenue and recognizes revenue net of discounts

  • Cash Receipt JE (at settlement): records cash, merchant fees, and relieves the clearing account

Phase 2: Exchange Initiated

When a customer initiates a Loop exchange, two things happen in Shopify on the same day:

A return of the original product. Shopify processes this on the back end to update inventory. On the financial side, Shopify records a zero-dollar adjustment — but the raw entries look wrong: it credits refund expense (the opposite of a normal refund) and reduces sales tax payable (also backwards). This is because no cash is actually changing hands — the customer is exchanging, not getting refunded.

Blue Onion enriches this with data from Loop. We net these entries so the return shows as a zero-dollar journal entry with no impact on refund expense or sales tax payable. You'll see this as a "no data found" or zero-value entry, which is the correct result.

An exchange transaction. Loop creates a new order for the exchanged product. Blue Onion records:

  • Deferred revenue for the exchange product (liability to fulfill)

  • A sales tax offset against sales tax payable. Shopify accrues new sales tax on the exchange order, but you already remitted tax on the original order — so the offset prevents double-counting your sales tax liability.

  • A Loop Exchange Clearing Account entry to hold the value of the exchange until fulfillment

Phase 3: Exchange Fulfilled

When the exchange ships, two things fire:

The Revenue Recognition JE behaves normally — reducing deferred revenue and recognizing revenue for the exchange product.

The Loop Exchanges JE adds a critical offset: a debit to gross revenue and a credit to the Loop Exchange Clearing Account. Without this offset, you'd be recording revenue twice — once for the original order and once for the exchange. The offset keeps gross revenue flat and clears the Loop clearing account balance.

Net result across the full lifecycle: zero impact. You're in the same financial position as if the original order had never been exchanged, but the customer has been taken care of.

Special Cases

Exchange of an Exchange

Customers can refund an exchange and start a new exchange — sometimes repeatedly. Loop indicates this with "exchange-1-1" notation (and "exchange-1-2", etc., for further iterations).

When this happens:

  • The refund of the original exchange generates refund expense and refunded sales tax entries. Blue Onion nets these against the same accounts so the net impact is zero — because Loop is facilitating, not actually refunding cash to the customer.

  • The new exchange restarts the full lifecycle above: new deferred revenue, new sales tax offset, new Loop clearing account entry, and at fulfillment, the same revenue offset pattern.

This can chain indefinitely, and Blue Onion handles each iteration the same way.

Upsells Through Stripe

If a customer pays an upcharge during their exchange (e.g., exchanging a $50 item for a $75 item and paying the $25 difference), the upsell settles through Stripe. Blue Onion captures the additional amount and only offsets the portion of sales tax that relates to the exchanged value — so the net increase in your sales tax liability correctly reflects only the upsell portion.

Key Accounts to Configure

When setting up your Chart of Accounts mappings for the Loop Exchanges JE, you'll typically need:

  • Loop Exchange Clearing Account — a new clearing/holding account that carries the exchange value between initiation and fulfillment

  • Gross Revenue / Sales — the account credited in Revenue Recognition and debited in the exchange offset

  • Sales Tax Payable — offset here to prevent double-accrual from Shopify's exchange tax calculation

  • Refund Expense and Sales Tax Payable – Refunded — for netting exchange refunds


While we are a team of former accountants, we are not in the business of providing professional services. The information presented is for informational purposes only and is not intended to be a substitute for professional accounting, tax, or legal advice.

Did this answer your question?