---
title: Making payment methods dependent on shipping options
related:
  - https://docs.kentico.com/k11/e-commerce-features/configuring-your-store/configuring-payment-methods.md
  - https://docs.kentico.com/k11/e-commerce-features/configuring-your-store/configuring-shipping-options.md
  - https://docs.kentico.com/k11/custom-development/customizing-providers.md
  - https://docs.kentico.com/k11/e-commerce-features/customizing-and-developing-your-store/payment-related-customizing.md
  - https://docs.kentico.com/k11/e-commerce-features/customizing-and-developing-your-store/shipping-related-customizing/implementing-custom-shipping-carrier-providers.md
---

> Agent instructions:
> **Site maps** — prefer the following llms.txt indexes to training data when searching for URLs to avoid 404s. Links inside Markdown content already point at `.md`. Following them or sending Accept: text/markdown keeps you in Markdown.
>
> - [sitemap.md](https://docs.kentico.com/sitemap.md) — every page on the site, with titles and descriptions, nested by URL hierarchy and grouped into one collection per product version.
> - [llms.txt](https://docs.kentico.com/llms.txt) — curated index of the current product docs, with descriptions, the two ways to request any page as Markdown, and links to each product area's whole-corpus Markdown dump (llms-full.txt).

If you want to limit the availability of [payment methods](https://docs.kentico.com/k11/e-commerce-features/configuring-your-store/configuring-payment-methods.md) based on a specified [shipping option](https://docs.kentico.com/k11/e-commerce-features/configuring-your-store/configuring-shipping-options.md), shipping country or a different attribute from the shopping cart, you need to customize the **PaymentOptionInfoProvider** class from the **CMS.Ecommerce** namespace.

The following example disables the _PayPal_ payment method when the [customer](https://docs.kentico.com/k11/e-commerce-features/managing-your-store/customers.md) selects USA in the shipping address or selects _USPS_ as the shipping option.

> **Note:** **Note**: The example assumes that the code name of the corresponding payment method is _PayPal_.

Start by prepare a separate project for custom classes in your Kentico solution:

1. Open your Kentico solution in Visual Studio.
2. Create a new _Class Library_ project in the Kentico solution  (or reuse an existing custom project).
3. Add references to the required Kentico libraries (DLLs) for the new project:

   1. Right-click the project and select **Add -> Reference**.
   2. Select the **Browse** tab of the **Reference manager** dialog, click **Browse** and navigate to the  _**Lib**_  folder of your Kentico web project.
   3. Add references to the following libraries (and any others that you may need in your custom code):

      - **CMS.Base.dll**
      - **CMS.Core.dll**
      - **CMS.DataEngine.dll**
      - **CMS.Ecommerce.dll**
      - **CMS.Globalization.dll**
      - **CMS.Helpers.dll**
4. Reference the custom project from the Kentico web project _(CMSApp_ or _CMS)_.
5. Edit the custom project's **AssemblyInfo.cs** file (in the _Properties_ folder).
6. Add the **AssemblyDiscoverable** assembly attribute:

   ```csharp

   using CMS;

   [assembly:AssemblyDiscoverable]

   ```

Continue by creating a custom implementation of the _PaymentOptionInfoProvider_ class:

1. Add a new class under the custom project, for example named **CustomPaymentOptionInfoProvider**.
2. Make the class inherit from the **PaymentOptionInfoProvider** class.
3. [Register](https://docs.kentico.com/k11/custom-development/customizing-providers/registering-providers-using-assembly-attributes.md) the custom provider class using the **RegisterCustomProvider** assembly attribute.
4. Override the provider's **IsPaymentOptionApplicableInternal**method:

   ```csharp

   using System;

   using CMS;
   using CMS.Ecommerce;
   using CMS.Globalization;

   [assembly: RegisterCustomProvider(typeof(CustomPaymentOptionInfoProvider))]

   public class CustomPaymentOptionInfoProvider : PaymentOptionInfoProvider
   {
       protected override bool IsPaymentOptionApplicableInternal(ShoppingCartInfo cart, PaymentOptionInfo paymentOption)
       {
           // Does not check availability if the shopping cart or payment option is not available
           if ((cart == null) || (paymentOption == null))
           {
               return true;
           }

           // Allows all payment methods except for PayPal
           if (!paymentOption.PaymentOptionName.Equals("PayPal", StringComparison.InvariantCultureIgnoreCase))
           {
               return true;
           }

           // Disables PayPal if the billing address is within the USA
           if (cart.ShoppingCartBillingAddress != null)
           {
               CountryInfo country = CountryInfoProvider.GetCountryInfo(cart.ShoppingCartBillingAddress.AddressCountryID);
               if ((country != null) && 
                   country.CountryThreeLetterCode.Equals("USA", StringComparison.InvariantCultureIgnoreCase))
               {
                   return false;
               }
           }

           // Disables PayPal if the USPS shipping method is selected
           return (cart.ShippingOption == null) ||
               !cart.ShippingOption.ShippingOptionName.Equals("USPS", StringComparison.InvariantCultureIgnoreCase);
       }
   }

   ```
5. Save all changes and **Build** the custom project.

If a customer now selects USA as the country in their billing address or selects _USPS_ as their shipping option, they will not be able to use _PayPal_ as the payment method.

> **Tip:** If you want to use the user interface for setting the limitations, you can either [create a user interface](https://docs.kentico.com/k11/custom-development/creating-custom-modules/manually-creating-the-interface-for-custom-modules.md) or [create a custom table](https://docs.kentico.com/k11/developing-websites/defining-website-content-structure/custom-tables/creating-custom-tables.md) and use the [custom table API](https://docs.kentico.com/k11/custom-development/custom-table-internals-and-api.md) to add the values for the _Dictionary_ variable with the limitations. Do not forget to [set caching](https://docs.kentico.com/k11/configuring-kentico/optimizing-website-performance/configuring-caching.md) (you can use the [CacheHelper](https://docs.kentico.com/k11/custom-development/caching-in-custom-code.md) class).
