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

# Harga Terlokalisasi

> Tetapkan harga tetap Anda sendiri untuk setiap mata uang atau negara alih-alih membiarkan kurs menentukan. Kenakan harga bulat yang disesuaikan dengan pasar dan jalankan promosi per negara.

## Apa itu Harga Terlokalisasi?

Setiap produk memiliki harga dasar dalam mata uang dasar. Harga Terlokalisasi memungkinkan Anda menimpa dasar tersebut dengan **harga tetap yang Anda tentukan per mata uang atau per negara**. Aktifkan dengan mengatur `pricing_mode` pada produk, lalu lampirkan satu aturan per pasar.

Ini adalah salah satu dari tiga pengendali independen untuk harga internasional, masing-masing menyelesaikan masalah yang berbeda:

| Mekanisme                                            | Apa yang dilakukannya                                              | Angka yang dilihat pelanggan                   |
| :--------------------------------------------------- | :----------------------------------------------------------------- | :--------------------------------------------- |
| **Harga Lokal**                                      | Harga tetap yang Anda tetapkan per mata uang atau negara           | Tepat jumlah yang Anda tetapkan                |
| [**Mata Uang Adaptif**](/features/adaptive-currency) | Secara otomatis mengonversi harga dasar Anda pada kurs FX langsung | Harga dasar yang dikonversi pada kurs saat ini |
| [**Kode Diskon**](/features/discount-codes)          | Pengurangan persentase dari harga dasar                            | Harga dasar dikurangi diskon                   |

<Info>
  Harga Terlokalisasi dan Mata Uang Adaptif bekerja sama. Ketika tidak ada aturan terlokalisasi yang cocok, produk akan kembali ke harga dasarnya — dikenakan secara langsung jika pelanggan sudah menggunakan mata uang dasar Anda, atau diubah melalui Mata Uang Adaptif jika tidak.
</Info>

***

## Kasus Penggunaan

<CardGroup cols={2}>
  <Card title="Purchasing Power Parity (PPP)" icon="earth-asia" href="/features/purchasing-power-parity">
    Kenakan harga lebih rendah di pasar yang sensitif terhadap harga tanpa memberikan diskon di pasar dalam negeri Anda. Aturan `by_country` memungkinkan produk dengan harga dasar \$20 dijual seharga **₹999 di India** — disesuaikan dengan daya beli lokal, bukan konversi FX langsung. Cara yang direkomendasikan, asli, untuk menjalankan PPP.
  </Card>

  <Card title="Charm Pricing" icon="tag">
    Konversi FX langsung dari \$19.99 mendarat pada angka aneh seperti €18.43. Aturan `by_currency` menetapkan harga yang bersih dan disetel secara psikologis seperti yang diharapkan pelanggan — **€9.99**, **¥1000**, **₹499** — persis seperti yang diketik.
  </Card>

  <Card title="Reversible Market-Entry Promotions" icon="rocket">
    Meluncurkan di negara baru? Tambahkan aturan `by_country` dengan harga perkenalan, lalu **arsipkan** saat promosi berakhir untuk kembali ke harga dasar/adaptif. Aturan diarsipkan, tidak pernah dihapus, jadi Anda tetap memiliki catatan bersih tentang apa yang sedang berlaku dan kapan.
  </Card>

  <Card title="Competitive Price-Matching" icon="bullseye">
    Tetapkan satu pasar untuk menyesuaikan dengan pesaing lokal. Aturan `by_country` untuk **£9.00 di Inggris Raya** menjaga harga tersebut terlepas dari bagaimana pergerakan nilai tukar GBP/USD.
  </Card>
</CardGroup>

***

## Konsep Inti

* **Mode harga** — Sebuah produk memiliki satu mode pada satu waktu, ditentukan oleh `pricing_mode`:
  * `by_currency`: satu harga per mata uang, terlepas dari negara. Setiap orang yang membayar dalam EUR melihat €9.99.
  * `by_country`: harga khusus untuk negara (₹999 di India), bahkan ketika beberapa negara berbagi mata uang yang sama.
* **Jumlah tetap, dalam unit terkecil** — `amount` dari sebuah aturan adalah integer dalam unit terkecil mata uang, sama seperti di API lainnya: `99900` adalah ₹999.00, `999` adalah €9.99. Itu adalah harga yang Anda tetapkan, bukan nilai konversi.
* **Ketika tidak ada aturan yang cocok** — Produk mempertahankan perilaku saat ini: pelanggan dalam mata uang dasar Anda membayar harga dasar secara langsung; semua orang mendapatkannya dikonversi melalui [Mata Uang Adaptif](/features/adaptive-currency).
* **Biaya termasuk ketika aturan cocok** — Pelanggan membayar **tepat** jumlah yang Anda tetapkan. Biaya FX [Mata Uang Adaptif](/features/adaptive-currency#choose-who-bears-the-fee) diserap oleh Anda (diperlakukan sebagai biaya termasuk untuk transaksi tersebut) daripada ditambahkan di atasnya, jadi harga lokal yang Anda nyatakan selalu menjadi harga yang dikenakan.

***

## Persiapan di Dasbor

<Steps>
  <Step title="Open the product form">
    Di Dasbor Merchant Anda, masuk ke **Products** dan buat produk (atau buka yang sudah ada untuk diedit). Atur **Harga** dasar dan mata uang seperti biasa.
  </Step>

  <Step title="Enable Localized Pricing and choose a mode">
    Di bagian **Pricing**, centang **Localized Pricing**, lalu pilih **By Country** atau **By Currency**.

    <Frame>
      <img src="https://mintcdn.com/dodopayments/hpHKp5MybOFgIhM2/images/localized-pricing/pricing-section.png?fit=max&auto=format&n=hpHKp5MybOFgIhM2&q=85&s=933fc68155db9639d36d624c0f84dfee" alt="Localized Pricing enabled on the product form with By Country selected" style={{ maxHeight: '450px', width: 'auto' }} width="850" height="580" data-path="images/localized-pricing/pricing-section.png" />
    </Frame>
  </Step>

  <Step title="Add a price for each market">
    Klik **Add Country Price** atau **Add Currency Price**, isi panel **Localized pricing**, dan klik **Add**. Setiap pasar yang Anda tambahkan muncul dalam tabel override, di mana Anda dapat mengedit atau menghapusnya kemudian.

    <Tabs>
      <Tab title="By Country">
        Pilih negara, pilih mata uang, dan masukkan jumlah (misalnya ₹999 untuk India), lalu klik **Add**.

        <Frame>
          <img src="https://mintcdn.com/dodopayments/hpHKp5MybOFgIhM2/images/localized-pricing/add-country-override.png?fit=max&auto=format&n=hpHKp5MybOFgIhM2&q=85&s=62ae6975abd9c023655126a02fab611d" alt="Adding a 999 INR override for India" style={{ maxHeight: '360px', width: 'auto' }} width="1052" height="660" data-path="images/localized-pricing/add-country-override.png" />
        </Frame>

        Negara tersebut sekarang muncul di tabel **Country overrides**, di mana Anda dapat mengedit atau menghapusnya.

        <Frame>
          <img src="https://mintcdn.com/dodopayments/hpHKp5MybOFgIhM2/images/localized-pricing/country-overrides-table.png?fit=max&auto=format&n=hpHKp5MybOFgIhM2&q=85&s=1ef8ef7f6368448896015febccd11b58" alt="Country overrides table showing India at 999 INR" style={{ maxHeight: '360px', width: 'auto' }} width="526" height="430" data-path="images/localized-pricing/country-overrides-table.png" />
        </Frame>
      </Tab>

      <Tab title="By Currency">
        Pilih mata uang dan masukkan jumlah (misalnya €9.99 untuk EUR), lalu klik **Add**.

        <Frame>
          <img src="https://mintcdn.com/dodopayments/hpHKp5MybOFgIhM2/images/localized-pricing/add-currency-override.png?fit=max&auto=format&n=hpHKp5MybOFgIhM2&q=85&s=8f4b14e3c0ba37b2162cc45fc7b199eb" alt="Adding a 9.99 EUR override" style={{ maxHeight: '360px', width: 'auto' }} width="1052" height="640" data-path="images/localized-pricing/add-currency-override.png" />
        </Frame>

        Mata uang tersebut sekarang muncul di tabel **Currency overrides**, di mana Anda dapat mengedit atau menghapusnya.

        <Frame>
          <img src="https://mintcdn.com/dodopayments/hpHKp5MybOFgIhM2/images/localized-pricing/currency-overrides-table.png?fit=max&auto=format&n=hpHKp5MybOFgIhM2&q=85&s=ed713ac592444f1685f2fa75de2e8b3f" alt="Currency overrides table showing EUR at 9.99" style={{ maxHeight: '360px', width: 'auto' }} width="1052" height="860" data-path="images/localized-pricing/currency-overrides-table.png" />
        </Frame>
      </Tab>
    </Tabs>
  </Step>

  <Step title="Save the product">
    Simpan dengan **Add product**. Harga terlokalisasi berlaku untuk checkout mendatang segera.

    <Check>
      Lakukan uji coba checkout dengan negara tagihan yang memiliki aturan, dan konfirmasi jumlah terlokalisasi muncul.
    </Check>
  </Step>
</Steps>

***

## Kelola melalui API

Harga Terlokalisasi sepenuhnya tersedia melalui API. Pertama, atur mode harga produk, lalu lampirkan aturan.

### Atur mode harga

Atur `pricing_mode` saat Anda membuat produk (atau memperbarui yang sudah ada). `null` berarti hanya-dasar, perilaku yang sudah ada.

<CodeGroup>
  ```typescript theme={null} theme={null}
  import DodoPayments from 'dodopayments';

  const client = new DodoPayments({
    bearerToken: process.env.DODO_PAYMENTS_API_KEY,
    environment: 'test_mode',
  });

  const product = await client.products.update('pdt_premium_plan', {
    pricing_mode: 'by_country',
  });
  ```

  ```python theme={null} theme={null}
  import os
  from dodopayments import DodoPayments

  client = DodoPayments(
      bearer_token=os.environ.get("DODO_PAYMENTS_API_KEY"),
      environment="test_mode",
  )

  product = client.products.update(
      "pdt_premium_plan",
      pricing_mode="by_country",
  )
  ```

  ```go theme={null} theme={null}
  package main

  import (
  	"context"
  	"os"

  	"github.com/dodopayments/dodopayments-go"
  	"github.com/dodopayments/dodopayments-go/option"
  )

  func main() {
  	client := dodopayments.NewClient(
  		option.WithBearerToken(os.Getenv("DODO_PAYMENTS_API_KEY")),
  	)

  	_, err := client.Products.Update(
  		context.TODO(),
  		"pdt_premium_plan",
  		dodopayments.ProductUpdateParams{
  			PricingMode: dodopayments.F(dodopayments.PricingModeByCountry),
  		},
  	)
  	if err != nil {
  		panic(err)
  	}
  }
  ```
</CodeGroup>

### Tambahkan harga terlokalisasi

Lampirkan aturan pada produk. Dalam mode `by_country` `country_code` diperlukan; dalam mode `by_currency` harus dihilangkan.

<CodeGroup>
  ```typescript theme={null} theme={null}
  // ₹999.00 for customers in India
  const localizedPrice = await client.products.localizedPrices.create('pdt_premium_plan', {
    currency: 'INR',
    country_code: 'IN',
    amount: 99900,
  });
  ```

  ```python theme={null} theme={null}
  # ₹999.00 for customers in India
  localized_price = client.products.localized_prices.create(
      "pdt_premium_plan",
      currency="INR",
      country_code="IN",
      amount=99900,
  )
  ```

  ```go theme={null} theme={null}
  // ₹999.00 for customers in India
  localizedPrice, err := client.Products.LocalizedPrices.New(
  	context.TODO(),
  	"pdt_premium_plan",
  	dodopayments.ProductLocalizedPriceNewParams{
  		Currency:    dodopayments.F(dodopayments.CurrencyInr),
  		CountryCode: dodopayments.F(dodopayments.CountryCodeIn),
  		Amount:      dodopayments.F(int64(99900)),
  	},
  )
  ```
</CodeGroup>

Untuk produk `by_currency`, hilangkan `country_code`. Misalnya, `€9.99` datar untuk semua orang yang membayar dalam EUR (`currency: 'EUR'`, `amount: 999`).

### Daftar, perbarui, dan arsipkan

Anda hanya dapat memperbarui `amount` dari aturan; mata uang dan negara tetap saat dibuat. Arsipkan adalah penghapusan idempoten lembut, sehingga aturan berhenti cocok tetapi tetap dalam sejarah Anda.

<CodeGroup>
  ```typescript theme={null} theme={null}
  // List all active rules on a product
  const rules = await client.products.localizedPrices.list('pdt_premium_plan');

  // Change the amount (e.g. end a promo)
  await client.products.localizedPrices.update('lcp_india_price', {
    product_id: 'pdt_premium_plan',
    amount: 119900,
  });

  // Archive a rule
  await client.products.localizedPrices.archive('lcp_india_price', {
    product_id: 'pdt_premium_plan',
  });
  ```

  ```python theme={null} theme={null}
  # List all active rules on a product
  rules = client.products.localized_prices.list("pdt_premium_plan")

  # Change the amount (e.g. end a promo)
  client.products.localized_prices.update(
      "lcp_india_price",
      product_id="pdt_premium_plan",
      amount=119900,
  )

  # Archive a rule
  client.products.localized_prices.archive(
      "lcp_india_price",
      product_id="pdt_premium_plan",
  )
  ```

  ```go theme={null} theme={null}
  // List all active rules on a product
  rules, err := client.Products.LocalizedPrices.List(context.TODO(), "pdt_premium_plan")

  // Change the amount (e.g. end a promo)
  _, err = client.Products.LocalizedPrices.Update(
  	context.TODO(),
  	"pdt_premium_plan",
  	"lcp_india_price",
  	dodopayments.ProductLocalizedPriceUpdateParams{
  		Amount: dodopayments.F(int64(119900)),
  	},
  )

  // Archive a rule
  err = client.Products.LocalizedPrices.Archive(
  	context.TODO(),
  	"pdt_premium_plan",
  	"lcp_india_price",
  )
  ```
</CodeGroup>

<Card title="API Reference" icon="code" href="/api-reference/products/post-products-localized-prices">
  Lihat endpoint Harga Terlokalisasi Produk lengkap: buat, daftar, ambil, perbarui, dan arsipkan.
</Card>

***

## Bagaimana Itu Berlaku saat Checkout

Harga terlokalisasi diselesaikan per baris keranjang, dan hanya untuk produk yang memiliki `pricing_mode` ditetapkan. Dodo Payments membaca dua sinyal dari permintaan: **negara penagihan** pelanggan, dan **`billing_currency`** opsional (jika dihilangkan, mata uang diturunkan dari negara penagihan).

* **By Country**: mencari aturan yang cocok dengan negara penagihan. Jika ada, pelanggan dikenakan biaya sesuai dengan jumlah aturan dalam mata uang aturan tersebut.
* **By Currency**: mencari aturan yang cocok dengan mata uang pelanggan (`billing_currency`, atau mata uang yang diturunkan dari negara mereka). Jika ada, pelanggan dikenakan biaya sesuai dengan jumlah aturan dalam mata uang tersebut.
* **Tidak cocok, atau tidak ada `pricing_mode`**: harga dasar berlaku, dikenakan secara langsung ketika mata uang pelanggan sama dengan mata uang dasar, jika tidak, dikonversi melalui [Mata Uang Adaptif](/features/adaptive-currency).

Setiap baris keranjang diselesaikan secara mandiri, sehingga Anda dapat melokalkan satu produk dan meninggalkan yang lain pada harga dasar dalam checkout yang sama. Jika ada baris yang cocok dengan aturan terlokalisasi, seluruh transaksi ditegakkan termasuk biaya (lihat [Konsep Inti](#core-concepts)).

***

## Perilaku Penting

| Perilaku                                        | Rincian                                                                                                                                                                                                                                                |
| :---------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Jumlah sebelum pajak**                        | Jumlah terlokalisasi adalah harga *sebelum* pajak. Untuk produk yang pajaknya terpisah, pajak ditambahkan di atasnya saat checkout, sehingga jumlah terlokalisasi bukanlah total akhir. Lihat [Harga Termasuk Pajak](/features/tax-inclusive-pricing). |
| **Tidak untuk Bayar Sesuai Yang Anda Inginkan** | Aturan terlokalisasi tidak pernah berlaku untuk produk [Bayar Sesuai Yang Anda Inginkan](/features/pay-what-you-want), di mana pelanggan memilih jumlahnya.                                                                                            |
| **Menurut mata uang berbeda dari dasar**        | Aturan `by_currency` harus menggunakan mata uang yang berbeda dari mata uang dasar produk.                                                                                                                                                             |
| **Satu aturan per pasar**                       | Produk dapat memiliki maksimal satu aturan aktif per mata uang (berdasarkan mata uang) atau per negara (berdasarkan negara).                                                                                                                           |
| **Semua jenis produk**                          | Berlaku untuk produk sekali pakai, berlangganan, dan berbasis penggunaan.                                                                                                                                                                              |

<Info>
  Perubahan aturan terlokalisasi tidak mengeluarkan webhook mereka sendiri. Jumlah yang diselesaikan muncul pada pembayaran atau langganan yang dihasilkan persis seperti harga lainnya.
</Info>

***

## Praktik Terbaik

* **Pertahankan harga dasar yang wajar.** Itu adalah pilihan kembali untuk setiap pasar tanpa aturan, dikonversi melalui Mata Uang Adaptif.
* **Bulankan ke harga charm lokal.** Tujuan dari jumlah tetap adalah angka bersih seperti ₹999, €9.99, atau ¥1000, bukan hasil FX.
* **Pilih mode untuk pekerjaan.** Gunakan `by_country` untuk harga daya beli; gunakan `by_currency` saat satu harga per zona mata uang sudah cukup.
* **Arsipk, jangan buat ulang, untuk promosi.** Mengarsipkan aturan mengembalikan pasar ke dasar/adaptif sambil mempertahankan sejarah; buat ulang atau tentukan harga ulang nanti sesuai kebutuhan.
* **Perhatikan garis pajak sebelum mengiklankan total.** Untuk produk yang pajaknya terpisah, pelanggan membayar jumlah terlokalisasi *ditambah* pajak, jadi jangan mengutipnya sebagai harga akhir dalam iklan.

***

## Terkait

<CardGroup cols={2}>
  <Card title="Purchasing Power Parity" icon="money-bill-trend-up" href="/features/purchasing-power-parity">
    Penetapan harga terlokalisasi asli vs. kode diskon berbasis lokasi untuk PPP.
  </Card>

  <Card title="Adaptive Currency" icon="money-bill-transfer" href="/features/adaptive-currency">
    Konversi FX otomatis dan penanganan biaya yang menjadi dasar harga terlokalisasi.
  </Card>

  <Card title="Tax-Inclusive Pricing" icon="receipt" href="/features/tax-inclusive-pricing">
    Kontrol apakah harga Anda termasuk pajak.
  </Card>

  <Card title="Pay What You Want" icon="hand-holding-dollar" href="/features/pay-what-you-want">
    Biarkan pelanggan memilih jumlah. Aturan terlokalisasi tidak berlaku di sana.
  </Card>
</CardGroup>
