Skip to main content

Override Price Selection Strategy

In this document, you’ll learn how to override Medusa’s price selection strategy to create a custom pricing strategy.

If you’re interested in learning what a price selection strategy is and how it works, check out this documentation instead.

1. Create Class

Create a TypeScript or JavaScript file in

Copy to Clipboard
of your Medusa server project with a class that extends the
Copy to Clipboard
class:

Report Incorrect Code
Report Incorrect CodeReport Incorrect Code
Copy to Clipboard
import { AbstractPriceSelectionStrategy, IPriceSelectionStrategy, PriceSelectionContext, PriceSelectionResult } from "@medusajs/medusa";

import { EntityManager } from "typeorm";

export default class MyPriceListStrategy extends AbstractPriceSelectionStrategy {

withTransaction(manager: EntityManager): IPriceSelectionStrategy {
if (!manager) {
return this
}

return new MyPriceListStrategy()
}

async calculateVariantPrice(
variant_id: string,
context: PriceSelectionContext
): Promise<PriceSelectionResult> {
//TODO
}
}
Copy to Clipboard

You can use services or repositories in the strategy by adding them to the constructor and updating the parameters passed to the

Copy to Clipboard
constructor in
Copy to Clipboard
. For example:

Report Incorrect Code
Report Incorrect CodeReport Incorrect Code
Copy to Clipboard
export default class MyPriceListStrategy extends AbstractPriceSelectionStrategy {
private productsService: ProductService

constructor({
productsService
}) {
super()
this.productsService = productsService
}

withTransaction(manager: EntityManager): IPriceSelectionStrategy {
if (!manager) {
return this
}

return new MyPriceListStrategy({
productsService: this.productsService
})
}
//...
}
Copy to Clipboard

2. Implement calculateVariantPrice

Implement the price selection strategy you want inside the

Copy to Clipboard
method.

This method accepts the variant ID as a first parameter and the context object as a second parameter.

This method must return an object having the following fields:

{
originalPrice, //number | null
calculatedPrice, //number | null
prices // MoneyAmount[]
}
Copy to Clipboard

You can learn more about optional properties and the meaning behind every property here.


3. Run Build Command

In your terminal, run the build command to transpile the files in the

Copy to Clipboard
directory into the
Copy to Clipboard
directory:

Report Incorrect Code
Report Incorrect CodeReport Incorrect Code
Copy to Clipboard
npm run build
Copy to Clipboard

Test it Out

Run your server to test it out:

Report Incorrect Code
Report Incorrect CodeReport Incorrect Code
Copy to Clipboard
npm run start
Copy to Clipboard

Then, try out your strategy using any of the Products or Carts endpoints which include retrieving product variants and line items respectively. You should then see the prices in the response based on your implemented strategy.


What’s Next