# COD form apps vs checkout rules: the trade-offs

> A COD form app takes the order in its own form and creates it in Shopify through the API, so the shopper skips Shopify's checkout. Checkout rules keep the checkout and hide or rename COD there. Shopify doesn't run payment customizations on API-created orders, so the two don't overlap.

URL: https://khaleejicod.com/guides/cod-form-apps-vs-checkout-rules/  
Updated: 2026-10-26  
Publisher: Trifid Media LLC

There are two places to control cash on delivery on Shopify. A **COD form app** puts its own
order form on your product or cart page. The shopper types a name, phone number and address, and
the app creates the order in Shopify without the shopper ever opening Shopify's checkout.
**Checkout rules** leave Shopify's checkout as it is and change the payment step, for example by
hiding COD on big carts or showing an Arabic name. The two don't overlap: Shopify lists the Create
Order API and draft orders handled in the admin among the places where payment customizations
don't run, so checkout rules never see orders that a form app creates that way.

## How does a COD form app work?

The app adds a short form, often in a pop-up or on the product page itself. It asks for what a
COD order needs: name, phone, city and address, and sometimes a one-time code (OTP) sent to the
phone. When the shopper submits the form, the app creates the order in your Shopify admin.

It does this through Shopify's Admin API, usually in one of two ways:

- **It creates the order directly.** Shopify describes its `orderCreate` API as the way to create
  orders that don't come through the standard checkout.
- **It creates a draft order and completes it.** Completing a draft turns it into a regular order
  on your **Orders** page, and Shopify says it commits the stock for the items at that point.

Either way, the order shows up in your admin with a payment method name the app chooses. Ask the
app which method it uses, because that decides which Shopify features still apply to the order.

One reason stores use a form at all: adding your own fields or steps inside Shopify's information,
shipping and payment pages uses checkout UI extensions, and Shopify makes those available only to
stores on Shopify Plus. A form on the product page doesn't depend on your plan.

## How do checkout rules work?

Checkout rules use a Shopify **payment customization**: a Shopify Function, added by an app, that
runs while the shopper is at checkout. It can hide, rename or move payment methods. The app's
rules decide when, using what the checkout knows: the cart total, the customer's tags and number
of previous orders, the products and the delivery address.

The shopper goes through Shopify's normal checkout and sees every payment method you offer, minus
any a rule hides. A store can have up to 25 active payment customizations. Checkout rules can't
add a field or a step, and they can't check a phone number. They only decide which payment methods
appear. For the full picture, see
[Shopify payment customizations explained](/guides/payment-customizations-explained/).

## Where don't checkout rules run?

Shopify's documentation for payment customizations lists where they run. The parts that matter
when you compare the two approaches:

| Where the order comes from | Do payment customizations run? |
|---|---|
| Shopify's online checkout | Yes |
| The checkout link of a draft order | Yes |
| The Create Order API | No |
| A draft order handled in the admin | No |
| Shopify admin, POS, order editing | No |

A form app that creates and completes a draft order never opens that draft's checkout link, so
there is no payment step for a rule to act on.

In practice, if you run a form app and a checkout rules app side by side, the rules only cover
shoppers who use the normal checkout. A big cart, a large first order or a customer you tagged
`cod-refused` can still order with COD through the form, unless the form app has limits of its
own. If you use both, set the same limits inside the form app, or the form becomes a way around
your rules.

## What changes for the shopper?

A form is short, so a COD order takes fewer taps. That cuts both ways: it's quicker for a real
shopper and for someone placing a prank order. Some form apps add a phone code (OTP) for that
reason. The form also only speaks the languages the app supports, so check its Arabic before you
switch it on.

With checkout rules, every shopper goes through the same Shopify checkout, in the languages you
have set it up in. Low-risk shoppers see COD as usual. A risky checkout shows only your online methods, with no extra
step.

The two approaches also fix different problems. A phone code catches fake numbers but can't stop
a real shopper changing their mind. Hiding COD stops the riskiest orders from being placed with
cash, but doesn't check the phone. [Hide COD, COD fee, partial COD or OTP](/guides/hide-cod-vs-fee-vs-partial-vs-otp/)
compares them in detail.

## What changes in your data and reports?

An order created outside the checkout misses some things Shopify's checkout does on its own.
Check these with the form app before you rely on it:

- **Discounts.** Shopify's documentation for `orderCreate` says automatic discounts aren't
  applied unless the app copies their logic, and only one discount code can be set per order. If
  you run sales, check that a form order gets the same price as a checkout order.
- **Abandoned checkouts.** Shopify counts a checkout as abandoned when it stays incomplete for
  more than ten minutes after the shopper has entered their email, and lists it under **Orders > Abandoned checkouts**, where you can send
  recovery emails. A form that a shopper starts and leaves isn't a Shopify checkout, so it won't
  be on that list unless the app tracks it itself.
- **Ad tracking.** Shopify's standard purchase event for pixels, `checkout_completed`, fires once
  for each checkout, usually on the Thank you page. An order created through the API has no
  Shopify checkout behind it, so that event doesn't fire for it. Ask the form app how it sends
  purchases to Meta, Google, TikTok or Snapchat, and how it avoids counting one sale twice.
- **Shipping and tax.** The app, not Shopify's checkout, decides what goes on the order. Place a
  test order through the form and one through the checkout with the same cart and address, then
  compare the two.

With checkout rules, none of this changes. The order goes through Shopify's checkout as usual,
and the rule only decides which payment methods the shopper sees.

## Side by side

| Question | COD form app | Checkout rules |
|---|---|---|
| Where is the order placed? | The app's form | Shopify's checkout |
| Do payment customizations apply? | No, for API orders and completed drafts | Yes |
| Can it check the phone number? | Some apps add OTP | No |
| Can it stop risky COD orders? | Only with its own limits | Yes, by cart, customer, product or area |
| Shopify abandoned checkouts and pixel events | Not for form orders | Yes |
| Shopify plan | Any | Any, with a public app |

## Which should you choose?

- **A form app** fits if your main problem is fake numbers and prank orders, and you're happy to
  manage COD limits inside the form, since checkout rules won't cover form orders.
- **Checkout rules** fit if your main problem is refused parcels from big carts, first orders or
  repeat refusers, and you want one checkout for every payment method, with Shopify's discounts,
  abandoned checkouts and pixel events working as usual.
- **Both together** work only if the form has the same limits as your checkout rules. Test both
  paths: one order through the form, and one through a draft order's checkout link (see
  [how to test checkout payment rules with draft orders](/guides/test-payment-rules-draft-orders/)).

Khaleeji COD is a checkout rules app: it hides or renames COD inside Shopify's checkout and doesn't
add an order form. Whichever kind of app you look at, go through the
[questions to ask before installing any COD app](/guides/questions-before-cod-app/) first.

## Sources

- [Shopify.dev: Payment customization Function API](https://shopify.dev/docs/api/functions/latest/payment-customization)
- [Shopify.dev: orderCreate mutation (Admin GraphQL API)](https://shopify.dev/docs/api/admin-graphql/latest/mutations/orderCreate)
- [Shopify.dev: draftOrderComplete mutation (Admin GraphQL API)](https://shopify.dev/docs/api/admin-graphql/latest/mutations/draftOrderComplete)
- [Shopify.dev: Checkout UI extensions](https://shopify.dev/docs/api/checkout-ui-extensions)
- [Shopify Help Center: Abandoned checkouts](https://help.shopify.com/en/manual/orders/abandoned-checkouts)
- [Shopify.dev: Web Pixels API, checkout_completed event](https://shopify.dev/docs/api/web-pixels-api/standard-events/checkout_completed)
