Docs
Discount Codes (Beta)

Discount Codes (Beta)

Two-way coupon code sync between WooCommerce and Square with shared usage limits, POS redemption, and QR codes.

Sync coupon codes both ways between WooCommerce and Square. A coupon created in WooCommerce becomes a real Square discount code that customers can redeem at Square POS and Square Online — and discount codes created in Square (via the API) become WooCommerce coupons. Usage limits are shared across channels, so a single-use code spent on your website can't be used again at the register.

Beta feature. Discount code sync is built on Square's Discount Codes API, which Square currently offers as a limited-access beta. Your Square account must be enabled for it (see Requirements below), and Square's own tooling around it is incomplete — read the Limitations section before enabling.

Important: synced codes do NOT appear in your Square Dashboard

This is the most common point of confusion, so it's worth stating first:

Codes synced by this feature will not show up anywhere in the Square Dashboard — not under Marketing, not under Coupons. This is a limitation of Square's beta API, which has no Dashboard or reporting screens yet. The codes are still live and redeemable at Square POS and on Square Online.

Use the Coupons page in the plugin (SWS Pro → Settings → Coupons) to see every synced code, check whether it's still redeemable, view its QR code, or expire it. That page talks directly to the Square API where the codes actually live.

You may notice auto-created entries named [SWS:…] under Items → Discounts in your Square Dashboard. These are the discount definitions that power your synced codes. Do not edit or delete them — Square does not apply changes to them retroactively, and the plugin manages their lifecycle for you. Editing them in the Dashboard will not change what customers pay; deleting them can break redemption.

Requirements

  • SquareSync for Woo Pro with an active licence.
  • Square account enrolled in the Discount Codes beta. Square gates this API per account. If your account isn't enabled, the plugin detects it automatically (the Discount Codes page shows a "not available" notice and syncing stays off). Contact Square support or your Square point of contact to request access.
  • A Square connection with discount-code permissions. Connections made recently include the required DISCOUNT_CODES_READ / DISCOUNT_CODES_WRITE permissions automatically. If you connected your Square account a while ago and syncing fails with permission errors, disconnect and reconnect Square from SWS Pro → Settings → Connection to pick up the new permissions.
  • Square POS 5.47+ (iOS) or 5.48+ (Android) if staff will type codes in manually at the register. Older versions can still redeem codes via QR scan with a 2D barcode scanner.

Enabling Discount Code Sync

  1. Go to SWS Pro → Settings → Coupons
  2. Toggle on Enable discount code sync
  3. Choose the directions and behaviours you want (below)
  4. Settings save automatically
SettingWhat it doesDefault
Enable discount code syncMaster switch for the whole featureOff
Sync WooCommerce coupons to SquareWooCommerce coupons become Square discount codesOff
Automatically sync new couponsNew eligible coupons queue for Square automatically; otherwise you sync each coupon with its Sync buttonOff
Import Square discount codes as couponsCodes created in Square become WooCommerce coupons (real-time via webhooks, plus a one-time backfill)Off
Record redemptions in SquareEach WooCommerce redemption of a synced code is registered in Square so shared usage limits count both channelsOn
Count Square POS redemptionsIn-store redemptions bump the coupon's WooCommerce usage countOn
Verify codes at checkoutLive-checks a synced code with Square before accepting it at WooCommerce checkout (blocks codes already fully redeemed elsewhere)Off

WooCommerce → Square

When an eligible coupon syncs, the plugin creates the backing discount objects in your Square catalog and issues a discount code with the same code text (Square stores codes in UPPERCASE — summer10 becomes SUMMER10; codes are matched case-insensitively everywhere).

What maps across:

WooCommerceSquare
Percentage discountFixed percentage discount
Fixed cart discountFixed amount discount
Usage limitMaximum redemptions (minus any uses already recorded in WooCommerce)
Usage limit per userMaximum redemptions per customer (not enforced on POS devices — see Limitations)
Expiry dateExpiry date
Product restrictionsItem-level targeting of the matching Square items
Category restrictionsCategory-level targeting (matched by category name)
Single email restrictionLinked to the matching synced Square customer, so the code appears on their POS customer profile

Coupon eligibility

Square's discount codes can express less than WooCommerce coupons can. Rather than silently syncing a code that would be more generous in-store than on your website, the plugin blocks coupons it can't represent faithfully and tells you why (the reason shows in the Discount Codes table):

Coupon featureResult
Percentage / fixed cart discountSyncs
Product or category restrictionsSyncs, with caveats (see below)
Fixed product discountBlocked — WooCommerce multiplies it per item, Square applies it once per order
Minimum / maximum spendBlocked by default — Square cannot enforce spend thresholds. A per-coupon Sync anyway override is available if you accept the code being unrestricted in-store
Excluded products / categories, "exclude sale items"Blocked by default (overridable) — Square cannot exclude items
Email restrictions (multiple emails, or no matching Square customer)Blocked by default (overridable)
Free-shipping-only couponsNot synced — no Square equivalent
"Individual use only", "limit usage to X items"Syncs with a warning — not enforced at POS
Both product AND category restrictionsBlocked — Square supports one or the other
Code longer than 32 characters, spaces, or non-ASCII charactersBlocked — Square rejects them

Restricted-coupon caveats: at Square POS the discount applies to one matching item per order (WooCommerce applies it to every matching item), and category-restricted codes are not redeemable on Square Online.

Editing a synced coupon

Square discount codes are immutable — only the expiry date can change after creation. When you edit anything else on a synced coupon (amount, restrictions, usage limit), the plugin expires the old Square code and issues a replacement with the same code text. The code is unusable in-store for roughly 2–3 minutes during the swap. Expiry-date-only changes update in place with no gap.

Trashing or deleting a synced coupon expires its Square code. Restoring it from trash issues a fresh code.

Square → WooCommerce

With importing enabled, discount codes created in Square (by another integration, or another site connected to the same Square account) become WooCommerce coupons automatically via webhooks.

For codes that existed before you enabled the feature, run the one-time Import existing Square codes backfill from the settings page. Progress (found / imported / skipped) shows inline.

Import behaviour:

  • Imported coupons are marked as Square-owned: their terms are managed in Square, and the plugin only pushes expiry-date changes back.
  • If a code's product or category targeting can't be matched to your WooCommerce catalog, the coupon is imported as a draft (unredeemable) rather than imported without its restrictions — check the reason in the table and publish it once resolved.
  • A code whose text collides with an existing unlinked WooCommerce coupon is skipped with a warning.
  • Codes in a different currency than your store are skipped.
  • Codes created through Square Online cannot be imported — Square's API cannot see them at all.
  • Historical redemption counts aren't available from Square, so imported coupons start at zero usage. Enable Verify codes at checkout if over-redemption of imported codes is a concern.

Shared usage limits

With the redemption settings on (recommended):

  • Website redemptions count in Square. When an order using a synced code is placed, the plugin registers the redemption with Square at payment time, so the code's remaining uses shrink for POS too. If payment fails or the order is cancelled or refunded before completion, the redemption is released.
  • POS redemptions count in WooCommerce. In-store redemptions arrive via webhook and bump the coupon's WooCommerce usage count. When a coupon reaches its usage limit through in-store use, the plugin also expires the Square code so it can't be over-redeemed during any webhook delay.

QR codes

Every synced code has a QR button in the Discount Codes table. It generates Square's official QR image for the code — scanning it at Square POS (with a 2D-capable barcode scanner, e.g. Socket, Zebra, or Honeywell models) applies the discount without typing anything. Download the PNG for use in marketing emails, flyers, or in-store signage. The same code also works typed manually at POS and at your WooCommerce checkout.

Code statuses

StatusMeaning
SyncedLive in Square and redeemable
Not synced / PendingNot yet sent to Square (use Sync)
CreatingSync in progress
IneligibleBlocked by an eligibility rule — the reason is shown
ConflictA different code with the same text already exists in Square. Choose Adopt (link to the existing Square code, Square keeps ownership of its terms) or Skip
ReissuingOld code expired, replacement being created (the brief edit gap)
ExpiredExpired in Square (coupon trashed, expiry passed, or manually expired)
ErrorSync failed — the error is shown; fix and Sync again

Limitations

  • No Square Dashboard visibility. Synced codes don't appear anywhere in the Square Dashboard (see the notice at the top). Manage them from the plugin.
  • Codes can't be edited in Square, only expired. All term changes flow from WooCommerce via expire-and-reissue, with a short in-store gap.
  • [SWS:…] catalog entries must not be touched. Editing or deleting the auto-created entries under Items → Discounts in Square breaks the linked codes.
  • Per-customer limits are not enforced on Square POS devices (Square limitation). The overall usage limit still applies.
  • Square Online gaps: category-restricted codes and percentage codes with a maximum discount amount are not redeemable on Square Online (they still work at POS and on your WooCommerce site).
  • Square Online-created codes are invisible to the API and can't be imported.
  • Usage counting across channels is near-real-time, not instantaneous. A code redeemed at POS moments before being used online (or vice versa) can briefly over-redeem within webhook latency. Enable Verify codes at checkout to close this window on the website side.
  • Refunds don't restore Square-side uses. WooCommerce restores a coupon's usage count when an order is refunded, but a completed Square redemption cannot be un-redeemed.
  • Sandbox: in Square sandbox, only API-created codes exist — codes from Square Marketing/Feedback can't be tested there.

Troubleshooting

A code shows "Synced" but I can't find it in Square

That's expected — see the notice at the top. The Square Dashboard has no screen for these codes yet. Use the code's status check in the Discount Codes table to confirm it's live, or simply redeem it at POS.

"Discount Codes API not available" notice

Your Square account isn't enrolled in Square's Discount Codes beta. Request access from Square, then hit Re-check.

Sync fails with a permission error

Your Square connection predates the discount-code permissions. Disconnect and reconnect Square from Settings → Connection, then sync again.

Backfill finishes with "found 0"

  • The Square account has no API-visible discount codes (codes made in Square Online don't count — the API can't see them).
  • Codes created by Square Marketing/Feedback exist per-customer; make sure the account actually has active codes.

Coupon shows "Conflict"

A code with the same text already exists in Square (created by another tool or another site). Adopt links your coupon to it (Square keeps ownership of the terms), or Skip and rename your WooCommerce coupon to sync it as a new code.

POS won't accept a typed code

Manual code entry needs Square POS 5.47+ on iOS or 5.48+ on Android. On older versions, scan the code's QR instead.

Customer says the code stopped working mid-day

If the coupon was edited that day, the code was expired and reissued — there's a short gap during the swap, and if the reissue failed (see the Error/Reissuing status) the code stays dead until you press Sync.