Common Pitfalls and Solutions

Applies to: Checkout API | Orders API | Payments API

Link to section

Overview

This guide addresses the most common issues developers encounter when implementing the Checkout API, particularly around payment link behavior, Dashboard visibility, and order management.

Link to section

Critical Distinction: Dashboard vs API Payment Links

Important

Payment links created through the Square Dashboard and those created via the Checkout API behave very differently. Mixing up these two types is a common source of confusion.

Link to section

Quick identification guide

Creation MethodURL PatternReusabilityDashboard Visible
Square Dashboard/checkout/{CHECKOUT_ID}Multiple uses✅ Yes
Checkout API/order/{ORDER_ID}Single use only❌ No
Link to section

Why this matters

  • Customer confusion: Expecting API links to work multiple times leads to failed payments
  • Seller confusion: Sellers looking for API-generated links in Dashboard won't find them
  • Integration issues: Treating these as interchangeable breaks payment flows
Link to section

Common pitfall #1: Expecting reusable payment links

Link to section

The problem

API-generated payment links (CreatePaymentLink) are single-use only. After successful payment, the link shows a thank you page and cannot process another payment.

Link to section

The solution

  • Create a new payment link for each transaction
  • Never share the same API-generated link with multiple customers
  • If you need reusable links, direct sellers to create them via Square Dashboard
Link to section

Common pitfall #2: Looking for API links in dashboard

Link to section

The problem

Sellers expect to see all payment links in their Square Dashboard, but API-generated links are never visible there by design.

Link to section

The solution

Build your own management interface if sellers need to:

  • View active payment links
  • Track payment link usage
  • Cancel unused links
Link to section

Why Square does this

  • API links are meant for programmatic, one-time transactions
  • Showing thousands of single-use links would clutter the Dashboard
  • Dashboard links serve a different purpose (reusable, seller-managed)

Common pitfall #3: Orders stuck in OPEN status

Link to section

The problem

Orders with fulfillments created via payment links remain in OPEN status even after successful payment. They never automatically transition to COMPLETED.

Link to section

What happens

  1. Customer pays successfully → Payment status: COMPLETED
  2. Order status remains: OPEN ⚠️
  3. Fulfillment cannot be updated programmatically ❌
Link to section

The solution

Current Limitation: Orders must be manually completed in Square Dashboard's Orders Manager.

Workaround options:

  1. Educate sellers: Train them to manually complete orders in Orders Manager
  2. Track separately: Maintain order completion status in your own system

Note

This is a known limitation. Square currently doesn't support programmatic fulfillment updates for DIGITAL type fulfillments created through payment links.

Link to section

Common pitfall #4: Incorrect payment link deletion

Link to section

The problem

Deleting payment links has different effects depending on timing, which can lead to unintended data loss or orphaned orders.

Link to section

Payment link deletion behavior matrix

When DeletedPayment LinkOrder StatusPaymentUse Case
Before paymentDeletedCANCELEDNone existsAbandon cart cleanup
After paymentDeletedOPENCOMPLETEDClean up used links
Link to section

Common pitfall #5: Missing order references

Link to section

The problem

When orders created from payment links don't include customer_id, it's hard to associate orders with customers.

Link to section

The solution

  1. Check for customer ID on order
  2. If not on order, retrieve associated payment
  3. Read customer ID on payment
Link to section

Quick decision tree

Link to section

"Should I use Dashboard or API payment links?"

FeatureSquare DashboardCheckout API
Link Reusability✅ Multiple uses❌ Single use only
Creation MethodManual via UIProgrammatic via API
Dashboard Visibility✅ Fully visible❌ Never visible
Best ForReusable products, donationsDynamic orders, sessions
Fulfillment Updates✅ Supported⚠️ Manual only
Link to section

"My integration isn't working as expected"

If your integration isn't working as expected, follow these debugging steps to find the most likely cause:

  1. Check the URL pattern - Is it /checkout (Dashboard) or /order (API)?
  2. Verify single use - Has this payment link already been used?
  3. Check Dashboard expectations - Are you looking for API links in Dashboard?
  4. Review order status - Are you expecting automatic completion with fulfillments?
  5. Examine deletion timing - Are you deleting before or after payment?
Link to section

Best Practices Checklist

DO:

  • Create new payment links for each transaction
  • Build your own tracking system for API-generated links
  • Handle order completion manually or track separately
  • Delete payment links after successful payment (if desired)
  • Retrieve customer info from payments, not orders

DON'T:

  • Expect API payment links to be reusable
  • Look for API links in Square Dashboard
  • Expect orders with fulfillments to auto-complete
  • Assume Dashboard and API links work the same way

Warning

If you delete a payment link while a buyer is actively completing checkout, they will receive an error message and cannot complete their payment. The underlying order is automatically canceled.

Link to section

See Also