> ## Documentation Index
> Fetch the complete documentation index at: https://docs-test.rye.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Test Products

> Test products and edge-case scenarios for stress-testing checkout flows.

All test products below are on **`rye-test-store.myshopify.com`**. Use [Stripe test cards](https://docs.stripe.com/testing) for payment.

> [!NOTE]
>
> `rye-protocol.myshopify.com` is also available for production test orders. It uses a **live payment gateway** — payments are not captured and funds are automatically returned to the card after \~1 week.

## Shipping & Delivery

> [accordion] Standard Product (Baseline)
>
> Use as a **baseline** for comparison against edge-case products.
>
> `https://rye-test-store.myshopify.com/products/product-published-to-rye-channel`
> Copy URL

> [accordion] 3PL Product (Carrier-Calculated Shipping)
>
> A product fulfilled via **third-party logistics (3PL)**. Shipping rates are calculated dynamically by the carrier based on the buyer's shipping address, rather than being flat rates set by the merchant.
>
> `https://rye-test-store.myshopify.com/products/test-product-3pl`
> Copy URL
>
> **Expected behavior:**
>
> * Shipping rates vary based on the buyer's address
> * Applying a discount code may cause the available shipping options to change (e.g., if the discounted total drops below a free shipping threshold)

> [accordion] Digital Product
>
> A digital product (e.g., an ebook or software license) that does not require physical shipping.
>
> `https://rye-test-store.myshopify.com/products/digital-product`
> Copy URL
>
> | Field | Value |
> | - | - |
> | **Price** | `$9.99` |
>
> **Expected behavior:**
>
> * A free shipping method is returned on the checkout intent
> * Shipping cost is \$0

> [accordion] Heavyweight / Oversized Product
>
> A product with a **very high weight** (100 lbs). Tests weight-based shipping rate calculations.
>
> `https://rye-test-store.myshopify.com/products/heavyweight-product`
> Copy URL
>
> | Field | Value |
> | - | - |
> | **Price** | `$199.99` |
>
> **Expected behavior:**
>
> * Shipping rates significantly higher than standard products

> [accordion] Delayed Shipping Product
>
> Use with the shipment advance test helper to simulate a delayed shipment.
>
> `https://rye-test-store.myshopify.com/products/delayed-shipping-product`
> Copy URL
>
> **Expected behavior:**
>
> * The shipment advance helper follows `ordered -> shipped -> out_for_delivery -> delayed -> delivered`

> [accordion] Canceled Shipping Product
>
> Use with the shipment advance test helper to simulate a canceled shipment.
>
> `https://rye-test-store.myshopify.com/products/canceled-shipping-product`
> Copy URL
>
> **Expected behavior:**
>
> * The shipment advance helper follows `ordered -> canceled`

## Inventory & Availability

> [accordion] Sold Out Product
>
> A product with **0 inventory** that cannot be purchased.
>
> `https://rye-test-store.myshopify.com/products/sold-out-product`
> Copy URL
>
> **Expected behavior:**
>
> * Checkout intent fails with `product_out_of_stock`

> [accordion] Partially Out-of-Stock Variants
>
> A product where **some variants are in stock and others are sold out**.
>
> `https://rye-test-store.myshopify.com/products/partial-stock-variants`
> Copy URL
>
> | Field | Value |
> | - | - |
> | **Price** | `$40.00` |
> | **Variants** | Size: S (in stock), M (in stock), L (sold out), XL (sold out) |
>
> **Expected behavior:**
>
> * Selecting an in-stock variant (S or M) succeeds
> * Selecting a sold-out variant (L or XL) fails with `product_out_of_stock`

> [accordion] Unpublished / Draft Product
>
> A product that is **not published to any sales channel** (draft or hidden).
>
> `https://rye-test-store.myshopify.com/products/unpublished-draft`
> Copy URL
>
> | Field | Value |
> | - | - |
> | **Price** | `$25.00` |
>
> **Expected behavior:**
>
> * Product URL returns 404
> * Checkout intent fails with `offer_retrieval_failed`

## Variants & Options

> [accordion] Different Variant Prices
>
> A product where **each variant has a different price point**.
>
> `https://rye-test-store.myshopify.com/products/test-product-with-different-variant-prices`
> Copy URL
>
> **Expected behavior:**
>
> * Offer returns the correct price for the selected variant
> * Switching variants updates the price, shipping, and tax accordingly

> [accordion] Many Variants (25+)
>
> A product with **many variant combinations** (5 colors x 5 sizes = 25 variants) with different prices per variant.
>
> `https://rye-test-store.myshopify.com/products/many-variants`
> Copy URL
>
> | Field | Value |
> | - | - |
> | **Price** | `$35.00 to $55.00` (varies by variant) |
>
> **Expected behavior:**
>
> * All 25 variants available for selection
> * Offer reflects the correct price for the selected variant

## Pricing & Tax

> [accordion] High-Value Product (\$9,999.99)
>
> A product at a very high price point.
>
> `https://rye-test-store.myshopify.com/products/high-value-product`
> Copy URL
>
> | Field | Value |
> | - | - |
> | **Price** | `$9,999.99` |
>
> **Expected behavior:**
>
> * Offer returns `cost.subtotal.amountSubunits` = `999999`
> * Checkout completes successfully

> [accordion] Sale / Compare-at Price
>
> A product with a **compare-at (original) price** showing a discount on the storefront.
>
> `https://rye-test-store.myshopify.com/products/on-sale-compare-at`
> Copy URL
>
> | Field | Value |
> | - | - |
> | **Price** | `$19.99` (compare-at `$39.99`) |
>
> **Expected behavior:**
>
> * Offer returns the selling price (\$19.99), not the compare-at price

> [accordion] Tax-Exempt Product
>
> A product that is not subject to sales tax.
>
> `https://rye-test-store.myshopify.com/products/tax-exempt-product`
> Copy URL
>
> | Field | Value |
> | - | - |
> | **Price** | `$25.00` |
>
> **Expected behavior:**
>
> * `cost.tax.amountSubunits` = `0`
> * Total = subtotal + shipping (no tax component)

> [accordion] Gift Card
>
> A gift card product with no shipping required and no tax applied.
>
> `https://rye-test-store.myshopify.com/products/test-gift-card`
> Copy URL
>
> | Field | Value |
> | - | - |
> | **Denominations** | `$25`, `$50`, `$100` |
>
> **Expected behavior:**
>
> * A free shipping method is returned
> * No tax applied
> * Fulfillment is digital (email delivery)

## Product Data Edge Cases

> [accordion] No Images
>
> A product with **no product images uploaded**.
>
> `https://rye-test-store.myshopify.com/products/no-images-product`
> Copy URL
>
> | Field | Value |
> | - | - |
> | **Price** | `$10.00` |
>
> **Expected behavior:**
>
> * Offer returns empty images array
> * Checkout completes without errors

> [accordion] Long Title & Special Characters
>
> A product with a **255-character title** containing unicode, accented characters, and special symbols.
>
> `https://rye-test-store.myshopify.com/products/long-title-special-chars`
> Copy URL
>
> | Field | Value |
> | - | - |
> | **Price** | `$15.00` |
>
> **Expected behavior:**
>
> * Product title returned without truncation or encoding issues
> * Checkout completes without errors

## Discounts & Promo Codes

> [accordion] Manual Discount Code
>
> A product with a discount code that can be passed via the `promoCodes` field.
>
> `https://rye-test-store.myshopify.com/products/discount-test-product`
> Copy URL
>
> | Field | Value |
> | - | - |
> | **Price** | `$50.00` |
> | **Discount Code** | `TESTDISCOUNT` (20% off) |
>
> **Expected behavior:**
>
> * Pass `promoCodes: ["TESTDISCOUNT"]` when creating the checkout intent
> * Offer `cost.discount.amountSubunits` reflects 20% off
> * Only one discount code per order

> [accordion] Discount That Crosses Free Shipping Threshold
>
> A product priced **just above the free shipping threshold**, with a discount code that drops the subtotal below it.
>
> `https://rye-test-store.myshopify.com/products/free-shipping-threshold`
> Copy URL
>
> | Field | Value |
> | - | - |
> | **Price** | `$52.00` |
> | **Discount Code** | `SAVE10` |
>
> **Expected behavior:**
>
> * Without discount: free shipping applies
>
> * With `SAVE10`: subtotal drops to \$42, free shipping no longer available, shipping cost increases
>
> > [!WARNING]
> >
> > Applying a discount can change the available shipping methods if the discounted subtotal crosses a free shipping threshold.

## Commissions

Commissions are configured at the **store level**, not per product. Any product on the test stores earns a commission when the order completes:

| Store | Commission Rate |
| - | - |
| `rye-test-store.myshopify.com` | 15% of subtotal |
| `rye-protocol.myshopify.com` | 25% of subtotal |

> [accordion] Commission Test Order
>
> Use any product on either store. For a cheap end-to-end test:
>
> `https://rye-protocol.myshopify.com/products/rye-sticker`
> Copy URL
>
> | Field | Value |
> | - | - |
> | **Price** | `$2.25` |
> | **Commission** | 25% of subtotal |
>
> **Expected behavior:**
>
> * When the intent reaches `awaiting_confirmation`, the offer includes a projected `commission` field with the amount you would earn (`{ amount, estimate: true }`)
> * After the order completes, the commission is recorded and returned by `GET /api/v1/commissions?checkoutIntentId=<id>`

> [!NOTE]
>
> Commissions must be enabled on your developer account. If `offer.commission` is missing on these stores, or no commission appears after checkout, reach out to us to enable it.

## Checkout Failures

> [accordion] Always Fails During Checkout
>
> A product that always **fails during checkout submission** at the merchant. Useful for exercising post-payment failure handling.
>
> `https://rye-test-store.myshopify.com/products/fails-during-checkout`
> Copy URL
>
> **Expected behavior:**
>
> * Offer retrieval and checkout intent creation succeed
> * Checkout intent fails with reason `order_placement_failed`

***

## Simulating Payment Failures

No special product needed — use [Stripe's test card numbers](https://docs.stripe.com/testing#declined-payments) to simulate different payment outcomes with any product above.

### Card Decline Scenarios

| Card Number | Behavior | Failure Reason |
| - | - | - |
| `4242 4242 4242 4242` | Payment **succeeds** | — |
| `4000 0000 0000 0002` | **Generic decline** | `payment_failed` |
| `4000 0000 0000 9995` | **Insufficient funds** | `payment_failed` |
| `4000 0000 0000 9987` | **Lost card** | `payment_failed` |
| `4000 0000 0000 0069` | **Expired card** | `payment_failed` |
| `4000 0000 0000 0127` | **Incorrect CVC** | `payment_failed` |

Use any future expiration date and any 3-digit CVC.

### 3D Secure / Authentication Challenges

| Card Number | Behavior |
| - | - |
| `4000 0027 6000 3184` | Requires 3D Secure authentication |

> [!WARNING]
>
> 3D Secure authentication is **not currently supported**. If 3DS is triggered by the store, the checkout intent will fail with `payment_failed`.

***

## Malformed Input & Validation Errors

Rye returns **synchronous 400 errors** for invalid buyer data. No special product needed — just send bad inputs.

### Address Validation

| Input | Example | Expected |
| - | - | - |
| Invalid state/province | `province: "XX"` | 400 error |
| Invalid postal code | `postalCode: "ZZZZZ"` | 400 error |
| Wrong ZIP for state | `postalCode: "90210"` with `province: "NY"` | 400 error |
| Invalid country code | `country: "ZZ"` | 400 error |
| Missing required field | Omit `address1` or `city` | 400 error |
| Emojis in address | `address1: "123 Main St 🏠"` | 400 error |

### Buyer Identity Validation

| Input | Example | Expected |
| - | - | - |
| Invalid email | `email: "not-an-email"` | 400 error |
| Missing email | Omit `email` field | 400 error |
| Invalid phone | `phone: "abc"` | 400 error |

***

## Failure Reason Reference

When a checkout intent fails, the response includes a `failureReason` with a `code` and `message`. Here are the most common failure codes you may encounter during testing:

| Failure Code | Meaning |
| - | - |
| `product_out_of_stock` | Product or selected variant has no available inventory |
| `offer_retrieval_failed` | Could not fetch pricing/shipping from merchant (product not found, unsupported, store issue) |
| `payment_failed` | Payment was declined or could not be processed |
| `missing_shipping_method` | No valid shipping method available for the buyer's address |
| `checkout_intent_expired` | Intent was not confirmed within 45 minutes of creation |
| `order_placement_failed` | Payment succeeded but order could not be placed at the merchant |
| `variant_selections_invalid` | The variant selections provided don't match the product's available options |
| `variant_selections_required` | Product has variants but no `variantSelections` were provided |
| `constraint_total_price_exceeded` | Order total exceeded the `maxTotalPrice` constraint |
| `constraint_shipping_cost_exceeded` | Shipping cost exceeded the `maxShippingPrice` constraint |
| `form_validation_error` | Buyer information was rejected by the merchant's checkout form |
| `unsupported_store_no_guest_checkout` | Merchant requires customer login — guest checkout is not available |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.