# Minimum sipariş tutarı zorunluluğu

> Mağaza para biriminde belirlenen ve her pazar için çevrilen minimum sipariş tutarının altında checkout’u engelleyen Shopify doğrulama Function’ı.

Sayfa: https://lintelagency.com/tr/kaynaklar/shopify-functions/minimum-siparis-tutari

## Kısaca

Bu doğrulama Function’ı, sepet ara toplamı bir minimumun (varsayılan olarak mağaza para biriminde 500) altındaysa checkout’u engeller; minimum müşterinin para birimine çevrilir. Müşteriler sepeti serbestçe doldurabilir, kural checkout’tan itibaren uygulanır. Cart and Checkout Validation API’nin cart.validations.generate.run hedefini kullanır (2026-10); herkese açık uygulamada her planda çalışır.

## Bilgiler

- **Function API:** Cart and Checkout Validation
- **Hedef (target):** cart.validations.generate.run
- **Plan:** Herkese açık uygulamada her plan; özel uygulamada Shopify Plus
- **Uygulama yetkisi:** write_validations
- **API sürümü:** 2026-10
- **Son kontrol:** 2 Kasım 2026

## Nasıl kullanılır

1. Shopify CLI ile bir uygulama oluşturun ve uzantıyı ekleyin: shopify app generate extension --template cart_checkout_validation, dil olarak JavaScript.
2. Oluşturulan shopify.extension.toml dosyasını ve src/ içindeki iki dosyayı aşağıdakilerle değiştirin.
3. Testleri çalıştırın: shopify app function run --input tests/below-minimum-at-checkout.input.json.
4. shopify app deploy ile deploy edin ve doğrulamayı validationCreate ile etkinleştirin.
5. Minimumu ve mesajı doğrulamanın $app:function-configuration metafield’ına yazın; örneğin {"minimumAmount": 250}.

## Kod

### shopify.extension.toml

```toml
api_version = "2026-10"

[[extensions]]
name = "Minimum order value"
handle = "minimum-order-value"
type = "function"

  [[extensions.targeting]]
  target = "cart.validations.generate.run"
  input_query = "src/cart_validations_generate_run.graphql"
  export = "cart-validations-generate-run"

  [extensions.build]
  command = ""
  path = "dist/function.wasm"
```

### src/cart_validations_generate_run.graphql

```graphql
query CartValidationsGenerateRunInput {
  buyerJourney {
    step
  }
  cart {
    cost {
      subtotalAmount {
        amount
      }
    }
  }
  presentmentCurrencyRate
  validation {
    metafield(namespace: "$app", key: "function-configuration") {
      jsonValue
    }
  }
}
```

### src/cart_validations_generate_run.js

```js
// @ts-check

/**
 * @typedef {import("../generated/api").CartValidationsGenerateRunInput} CartValidationsGenerateRunInput
 * @typedef {import("../generated/api").CartValidationsGenerateRunResult} CartValidationsGenerateRunResult
 */

/** Settings stored as JSON in the validation's metafield. */
const DEFAULT_CONFIG = {
  // In the store's currency; converted to the customer's currency below.
  minimumAmount: 500,
  // {amount} is replaced with the converted minimum.
  message: "The minimum order value is {amount}. Add a few more items to check out.",
};

/** Errors about the cart as a whole show at the top of checkout and on the cart. */
const CART_TARGET = "$.cart";

/** @type {CartValidationsGenerateRunResult} */
const NO_ERRORS = { operations: [] };

/**
 * @param {CartValidationsGenerateRunInput} input
 * @returns {CartValidationsGenerateRunResult}
 */
export function cartValidationsGenerateRun(input) {
  // Let customers keep adding to the cart freely; enforce the rule from checkout on.
  if (input.buyerJourney.step === "CART_INTERACTION") return NO_ERRORS;

  const config = { ...DEFAULT_CONFIG, ...input.validation?.metafield?.jsonValue };
  // The cart is priced in the customer's currency; the minimum is set in the store's.
  const minimum = config.minimumAmount * Number(input.presentmentCurrencyRate);
  const subtotal = Number(input.cart.cost.subtotalAmount.amount);
  if (subtotal >= minimum) return NO_ERRORS;

  const message = config.message.replace("{amount}", minimum.toFixed(2));
  return { operations: [{ validationAdd: { errors: [{ message, target: CART_TARGET }] } }] };
}
```

## Test girdisi ve beklenen çıktı

### tests/below-minimum-at-checkout.input.json

```json
{
  "buyerJourney": { "step": "CHECKOUT_COMPLETION" },
  "cart": { "cost": { "subtotalAmount": { "amount": "420.0" } } },
  "presentmentCurrencyRate": "1.0",
  "validation": { "metafield": null }
}
```

### tests/below-minimum-at-checkout.output.json

```json
{
  "operations": [
    {
      "validationAdd": {
        "errors": [
          { "message": "The minimum order value is 500.00. Add a few more items to check out.", "target": "$.cart" }
        ]
      }
    }
  ]
}
```

### tests/below-minimum-in-cart.input.json

```json
{
  "buyerJourney": { "step": "CART_INTERACTION" },
  "cart": { "cost": { "subtotalAmount": { "amount": "420.0" } } },
  "presentmentCurrencyRate": "1.0",
  "validation": { "metafield": null }
}
```

### tests/below-minimum-in-cart.output.json

```json
{ "operations": [] }
```

### tests/converted-minimum-met.input.json

```json
{
  "buyerJourney": { "step": "CHECKOUT_INTERACTION" },
  "cart": { "cost": { "subtotalAmount": { "amount": "95.0" } } },
  "presentmentCurrencyRate": "0.031",
  "validation": { "metafield": { "jsonValue": { "minimumAmount": 3000 } } }
}
```

### tests/converted-minimum-met.output.json

```json
{ "operations": [] }
```

## Sınırlar ve özel durumlar

- Ara toplam, Shopify’ın cart.cost.subtotalAmount tanımına göre vergiler ve sepet düzeyindeki indirimler öncesi tutardır.
- Minimum presentmentCurrencyRate ile çevrilir; pazar başına sabit yerel fiyat kullanıyorsanız çevrilen tutar yuvarlak bir sayı olmayabilir.
- Alıcı yolculuğu adımı (buyer journey step) CART_INTERACTION iken hata döndürülmez; checkout etkileşiminde ve tamamlamada döndürülür.

## Sorular

### Shopify’da minimum sipariş tutarı nasıl belirlenir?

Bu örnekteki gibi, ara toplamı minimumunuzla karşılaştırıp altında checkout’u engelleyen bir sepet ve ödeme doğrulama Function’ı kullanın.

### Müşteriler mesajı sepet sayfasında görür mü?

Bu kodla görmez; sepet kullanılabilir kalsın diye checkout’a kadar bekler. Mesajın sepette de çıkmasını istiyorsanız CART_INTERACTION kontrolünü kaldırın.

### Toptan müşteriler için farklı bir minimum olabilir mi?

Evet. Input sorgusuna cart.buyerIdentity.purchasingCompany ya da bir müşteri etiketi kontrolü ekleyin ve onlar için ikinci bir tutar kullanın.

## Shopify belgeleri

- [Cart and Checkout Validation Function API](https://shopify.dev/docs/api/functions/latest/cart-and-checkout-validation)

## İlgili içerikler

- [Teslimat, ödeme ya da doğrulama Function’ını etkinleştirme](https://lintelagency.com/tr/kaynaklar/graphql/function-ozellestirmesini-etkinlestirme)
- [Kurallarınıza uymayan Shopify siparişlerini Cart and Checkout Validation ile durdurun](https://lintelagency.com/tr/blog/shopify-odeme-dogrulama)
- [Tek bir Shopify mağazasından birçok para biriminde satış](https://lintelagency.com/tr/blog/shopify-markets-ile-coklu-para-birimi)
- [Ürün başına minimum ve maksimum adet](https://lintelagency.com/tr/kaynaklar/shopify-functions/urun-basina-minimum-ve-maksimum-adet)

Lisans: MIT. Kendi mağazanızda da müşteri işlerinizde de ücretsiz kullanabilirsiniz.
