# Set Up the Pricing

❗️ Pricing has a strong dependency with the Application Distribution parameters🔗.

Each product and article of the catalog can be detailed with one (or several) price.
The **Pricing** tab in 3DCloud contains a table where prices can be specified, each row corresponding to one type of price.

A distinction must be made between component-products and product-assemblies that are both products in 3DCloud and in the catalog and that can both priced or not.
When pricing a product that is an assembly of other products, the final price of the product depends on the value of the application distribution parameter `priceTopAssembly`

of the `pricingOptions`

object 🔗.

- If the parameter is set to 'true' then, both the assembly and the sub-component products count in the final price.
- If the parameter is set to 'false' then, the final price is computed with the sub-component products and without the price of the top assembly.

For example in the case of a drawer and handle sub-assembly: If 'true', the calculation will be drawer price + handle price + sub-assembly price. If 'false, the calculation will be drawer price + handle price.

### Pricing Table

To set up a price, specify the table in the **Pricing** tab.

Column | Description |
---|---|

Type | Select one of the type described above. |

Price | Enter any number above 0, including decimal numbers. This is the price excluding taxes of the product. |

Currency | Select in the drop-down list the currency in which the price is expressed. |

Start date / End date | Enter or pick-up a date in the calendar to specify the period of validity of the price: ▪️ The start date can be the date of the day or a later date if you want to postpone the validity period. ▪️ The end date must be later than the start date, but can be empty. Outside this range, the price will not be applied. If both fields are empty, the date range will be infinite and the price always valid. |

📌 Dates are formatted according to the language defined in the application distribution. For every country, there is a language locale(s) 🔗. For example: en-GB is for Great Britain (English), FR-fr for France (French). The currency is inferred from the locales used in the application.

### Pricing Types

There are four types of pricing: "regular", "membership", "discounted", "reduced" or "ecoFee". These types are strings that you have to specify when adding a price (use camel case).

Pricing Type | Description |
---|---|

regular | This is the price of the product without any discount. |

membership | This is a variant of the regular price for a discount for members. |

discounted | This is a variant of the regular price for a discounted price for anyone. |

reduced | This is a variant of the regular price with a discount excluding membership. |

📌 Pricing types cannot be mished to create a new price: e.g. a membership discount canot be applied to a reduced price to create a specific price.

#### The Eco-Fee Price

The eco-fee is limited to the French market and is a fee that the customer must pay in consideration of waste recycling.

The eco-fee price is displayed next to to another price type (for example, regular price). The eco-fee exposed in the product card is not an additional amount but a part of it, as the other price type (for example regular price) already contains this amount.

There are two different types of eco- fee labels for the different waste recycling initiatives in France: DEEE and WEEE.

The Range Manager can define for each product which label should be shown in the card by adding either "DEEE" or "WEEE" as free tag. From this free tag, the platform will match the associated translation and show this on the product card.

#### Illustrations

The illustrations of a product card below shows:

- The difference between two translations depending on the free tags "DEEE" or "WEEE".
- Two different prices (regular and membership) and the part of the eco-fee.

### Pricing Parameters

For each row in the table, click **Add parameters** on the right to specify the parameters.

The entered text must be a valid JSON object (do not forget to add double-quotes around the attribute keys) written as a string.

Below are the supported pricing paramaters:

Key (Attribute) | Type | Possible values | Default values |
---|---|---|---|

`pricingMethod` | string | ▪️ regular ▪️ linearMeter ▪️ squareMeter ▪️ pack ▪️ packPerCabinet ▪️ linearFeet ▪️ squareFeet ▪️ linearPercentageByItem ▪️ regularWithPublications | regular |

`packAmount` | number | A number greater or equal to 2 | – |

`percentage` | number | A number up to two digits | – |

`directionParameter` | string | ▪️ width ▪️ height ▪️ depth | width |

`directionParameters` | Array of string | The array can contain any combination of the following parameters: ▪️ width ▪️ depth ▪️ height | [] |

`publicationParameters` | Array of object | A configuration array for the pricing method `regularWithPublications` | [] |

`roundingMethod` | string | ▪️ ceil ▪️ round ▪️ floor | ceil |

`notPricedOnFrontEdge` | boolean | ▪️ true ▪️ false | false |

📌 There can be a regular type with a regular method.

`pricingMethod`

Attribute

The This attribute will be taken into account only for linear products such as worktops, wall-panels, plinths, etc.

For **precut** linears, this attribute will NOT be taken into account as precut linears are always priced with the `regular`

method.

For **pack** products, only the regular price value is taken into account. If you want to have a pack with a different amount or define the product price by a different method, you need to make another product.

Possible values | Description |
---|---|

`regular` | The normal pricing of 1 product unit. For every product sold by unit, including precut linears. |

`linearMeter` | The price for 1 linear meter, for custom linear products only. |

`squareMeter` | The price for 1 square meter (m2). |

`pack` | The price for 1 product pack, independently of the number of units in the pack. When this method is chosen, it is mandatory to also define the `packAmount` attribute.This means that the products priced by pack will be at the level of the entire project. |

`packPerCabinet` | The pricing in pack for 1 complete cabinet. When this method is chosen, it is mandatory to also define the `packAmount` attribute. This means that the product priced by pack will be at the level of the furniture. |

`linearFeet` | The pricing for 1 linear feet, for custom linear products only. |

`squareFeet` | The price for 1 square feet (ft2). |

`linearPercentageByItem` | The sum of the continuous total length of the product in the project, with a percentage applied. This percentage MUST be provided in the additional attribute `percentage` on the pricing object.The dimension of products summed can be precised with `directionParameter` . This calculation method is reserved for products that can be considered as linears. e.g. Plinth, Fixation Rail. |

`regularWithPublications` | This corresponds to a regular pricing (price of 1 product unit) to which are added the prices of each defined publications. Publications must be defined with the additional attribute `publicationParameters` . This can be useful if you don't want to have each publication as a specific sub-product in the BMA of your product. |

`linearPercentageByItem`

Value

Calculation of the To compute the **total length** of the product used in the project, the calculation will take into account the `width`

parameter of every top-assembly on which this product is present and then, **sum them up**.
In the case of a corner cabinet, the length of the sides touching the wall are considered.
The total length includes the cover panels that are in the project.

❗️ If the

`width`

parameter is not available for the product holding this pricing method then, its`length`

parameter will be considered.

Total length is... | Calculation |
---|---|

≤ `width` of one product | Add one piece of the specified item to the item list. |

> `width` of one product | 1. Add the percentage value (see below) defined by the Range Manager in the pricing method to the total length computed.2. Divide the new total length by the `width` of the product.3. Round up the final value to the next equal catalog item `width` , i.e. 2 * 1 catalog item width, 3 * 1 catalog item width, etc. which results in the quantity of items to add to the item list.The final result is then added to the "linears" section of the Bill of Material (BOM). |

❗️ Note that if a product holding this pricing method is present in the root product assembly (i.e. is part of the 3D resource) then, the corresponding item in the BOM will be removed from the "products" section because such items are priced separately in the "linears" section of the BOM. This will prevent the item from being billed several times.

`regularWithPublications`

Value

Calculation of the The price of a product with the `regularWithPublications`

pricing method is computed as follows:

```
product price = self price + publication1 price + publication2 price + ...
```

The price of a publication is computed as follows:

```
publication price = price of the publication product * dimension1/1000 * dimension2/1000 * ...
```

Note: the dimension parameter values must be expressed in millimeter like every dimensions in the ByMe platform. They are each divided by 1000 to represent a value in meters. The publication price must be expressed in meter dimensions (linear meter, square meter, etc.).

See the `publicationParameters`

configuration attribute 🔗 for more details.

`percentage`

Attribute

The The `percentage`

attribute is an optional parameter, that can be defined as an additional value of the pricing method `linearPercentageByItem`

.

This value is a number greater than or equal to 0 and lower than 100.
The value is added to the total width of the linear product to perform both the pricing and the calculation of the quantity of products.

For example, for plinths 🔗 that are a linear product, a percentage of 15 is added to the total length of plinths around the combination of cabinets in the project.

```
{
"pricingMethod":"linearPercentageByItem",
"percentage":15
}
```

`directionParameter`

Attribute

The ❗️ The

`directionParameter`

attribute is always used with pricing method`linearPercentageByItem`

for total quantity and price calculation.

If`directionParameter`

attribute is not present for pricing and quantity calculation, the default value used is`width`

.

The `directionParameter`

can either be:

**"width"**: Performs pricing and quantity calculation based on the width of product.

Example:

```
{
"pricingMethod": "linearPercentageByItem",
"percentage": 0,
"directionParameter": "width"
}
```

**"height"**: Performs pricing and quantity calculation based on height of product.

Example:

```
{
"pricingMethod": "linearPercentageByItem",
"percentage": 0,
"directionParameter": "height"
}
```

**"depth"**: Performs pricing and quantity calculation based on the depth of product.

Example:

```
{
"pricingMethod": "linearPercentageByItem",
"percentage": 0,
"directionParameter": "depth"
}
```

`directionParameters`

Attribute

The ❗️ The

`directionParameters`

attribute is always used with the`priceBestBoard`

parameter (see priceBestBoard).`priceBestBoard`

is a product parameter to define on the parent generic product, where`directionParameters`

is a pricing attribute to define on the children priced boards. It indicates what dimensions are used to compute the board size.

The `directionParameters`

is an array of parameter names. Supported parameters are:

**"width"**: calculate board size based on the width of product.**"depth"**: calculate board size based on the depth of product.**"height"**: calculate board size based on the height of product.

It can be a combination of 2 of the above parameters as well, if you are pricing the board with the `squareMeter`

or `squareFeet`

pricing method.

The following table indicates how many parameters are expected in the `directionParameters`

depending on the `pricingMethod`

set on the board product.

`pricingMethod` | number of parameters expected in `directionParameters` |
---|---|

`regular` | 0 (`directionParameters` can be ommited in this case) |

`linearMeter` | 1 |

`squareMeter` | 2 |

`linearFeet` | 1 |

`squareFeet` | 2 |

Example:

```
{
"pricingMethod": "squareMeter",
"directionParameters": [ "width", "height" ]
}
```

`publicationParameters`

Attribute

The ❗️ The

`publicationParameters`

attribute is always used with the`regularWithPublications`

pricing method.

The `publicationParameters`

is an array of object, each object representing a publication to add to the product price.

The following table indicates the expected attributes of each publication objects in this array:

key | type | status | description |
---|---|---|---|

`product` | string | mandatory | The name of the publication parameter. Your product must have a parameter of type "product" with this name. |

`dimensions` | array of strings | optional | A list of dimension parameter names for the publication. Your product must have a parameter of type "real" or "integer" for each of these dimension names. |

`meshArea` | boolean | optional | The boolean indicates whether the area of the publication will be calculated based on mesh 3D. If the value is true, the surface of the publication will be based on 3D instead of using the parameters defined `dimensions` . |

Example 1:

```
{
"pricingMethod": "regularWithPublications",
"publicationParameters": [
{
"product": "seatPublication",
"dimensions": [ "width", "depth" ]
},
{
"product": "cushionPublication",
"dimensions": [ "cushionWidth", "cushionDepth" ]
}
]
}
```

In the above example, the total price of the product will be:

```
total price = self product price + (price of the seatPublication product * width/1000 * depth/1000) + (price of the cushionPublication product * cushionWidth/1000 * cushionDepth/1000)
```

Example 2:

```
{
"pricingMethod": "regularWithPublications",
"publicationParameters": [
{
"product": "seatPublication",
"meshArea": true
},
{
"product": "cushionPublication",
"meshArea": true
}
]
}
```

In the above example, the total price of the product will be:

```
total price = self product price + (price of the seatPublication product * area of the seatPublication product) + (price of the cushionPublication product * area of the cushionPublication product)
```

`packAmount`

Attribute

The The value of the `packAmount`

attribute represents how many product items are in one pack. It will be taken into account for legs, handles and shelves.
The value is a number greater than or equal to 2 with no upper limit.

##### Example 1

A product have a `pricingMethod`

equal to `pack`

and a `packAmount`

of `4`

and this product is used 9 times in the entire project.
The rounding method is `ceil`

.

```
{"pricingMethod":"pack","packAmount":4,"roundingMethod":"ceil"}
```

Because 9/4 = 2.25 and Math.ceil(9/4) = 3 then, 3 packs will be priced.

##### Example 2

A shelf has a `pricingMethod`

equal to `packPerCabinet`

and a `packAmount`

of `2`

. The rounding method is `ceil`

.

There are 9 shelves for three cabinets in the projects, each one having a different number of shelves. The shelf will be priced in different pack associated to the furniture.

```
{"pricingMethod":"packPerCabinet","packAmount":2,"roundingMethod":"ceil"}
```

For cabinet 1 with 2 shelves: `Math.ceil(2/2) = 1;`

For cabinet 2 with 3 shelves: `Math.ceil(3/2) = 2;`

For cabinet 3 with 4 shelves: `Math.ceil(4/2) = 2;`

❗️ The rounding method for quantities is always the first superior rounding integer when the

`packAmount`

attribute is used.

`roundingMethod`

Attribute

The ❗️ The kitchen planner only checks the rounding method in the prices of type "regular". So the

`roundingMethod`

attribute must be added to the parameters of the regular price of a product. Rounding method on discounted prices is always ignored.

The rounding method can either be:

**"ceil"**: Rounds the price/measurement to the smallest number with two decimals that is greater than or equal to the real number.**"round"**: Rounds the price/measurement to the number with two decimals that is the closest number (up or down) to the real number.**"floor"**: Rounds the price/measurement to the largest number with two decimals that is less than or equal to the real number.

Below is a table with three different prices to illustrate the rounding methods:

Price | "ceil" | "round" | "floor" |
---|---|---|---|

4.561 | 4.57 | 4.56 | 4.56 |

4.565 | 4.57 | 4.57 | 4.56 |

4.569 | 4.57 | 4.57 | 4.56 |

`notPricedOnFrontEdge`

Attribute

The ❗️ The kitchen planner only checks the

`notPricedOnFrontEdge`

in the prices of type "regular". So the`notPricedOnFrontEdge`

attribute must be added to the parameters of the regular price of a product.

The `notPricedOnFrontEdge`

attribute represents whether a front edge of the worktop will be priced or not.
The default value is "false", which indicates by default a front edge product is priced. It takes into accounts only for the front edge of the worktop, not other type of edge.

There is another value in the application distribution parameters called isFrontEdgePriced🔗 which defines whether the front edge of the worktop should be priced. This parameter indicates globally for all front edges in project to be priced or not, while `notPricedOnFrontEdge`

defines on a specific front edge product.

The table below shows the combination result of setting both the value of `isFrontEdgePriced`

and `notPricedOnFrontEdge`

.

isFrontEdgePriced = true | isFrontEdgePriced = false | |
---|---|---|

notPricedOnFrontEdge = true | front edge NOT priced | front edge NOT priced |

notPricedOnFrontEdge = false | front edge priced | front edge NOT priced |

For example, if both `isFrontEdgePriced`

and `notPricedOnFrontEdge`

are set to true, the front edge product will not be priced.

`priceBestBoard`

parameter

The ❗️ This parameter is

nota price attribute. It should not be added in the pricing parameters like the above attributes, but rather as a product parameter of type boolean. The reason is that this parameter affects generic products, and this kind of products don't have prices.

The `priceBestBoard`

product parameter tells whether the board algorithm should be used to price the product. If set to true, the board algorithm is used, and if set to false (or if the parameter is not present), the board algorithm is not used. See the board algorithm documentation for more information.

Parameter Name | Parameter Type | Status | Default Value | Possible Values | Function |
---|---|---|---|---|---|

`priceBestBoard` | boolean | optional | false | [true, false] | Defines whether the board algorithm should be used to price this product. |

When using the `priceBestBoard`

on the parent generic product, the following pricing attributes become available to set on the children board products:

`pricingMethod`

(optional), with the the following supported values :**regular**,**linearMeter**,**squareMeter**,**linearFeet**and**squareFeet**`directionParameters`

(mandatory if`pricingMethod`

is not**regular**)

### Display the Price in the Planner

These pricing methods are used to display prices at different times to the customer:

- The price of each catalog item
- The price of the project during the planning
- The price of the whole project in the final card

#### Catalog Browser

The price displayed on product cards in the catalog correspond to the price set on the product in 3DCloud.

For assembly products, the price displayed is the price set on the top-assembly only.

📌 It is possible to disable the price display in the catalog browser for assembly products by using the Application Distribution parameter

`hideAssemblyProductCardPrice`

🔗. Other price displays cannot be disabled.

#### Project Price

The project price is the sum of all priced products inserted in the current project: any single product, assembly products, articles (e.g dampers), linears, etc.

Assembly products are priced by summing up the prices of every sub-products that are a component of the assembly.

The project price is displayed at several different places in the planner and is updated to reflect your current step in the application.

#### Currency and Taxes Display

The price display in the planner is defined by setting the current currency.

The current currency is inferred from the `locale`

defined in the Application Distribution parameters🔗 or by the `locale url`

parameter if provided.

You can set the currency setting by calling locale currency web services. Otherwise, you will inherit the default ones defined by the ByMe platform.

➡️ Refer to the API 🔗 and is reference documentation for detailed information.

A route exists to have a preview of your settings (/preview).

Do not hesitate to use this route after changing some parameters. Among them, the parameter named `vatString`

. The string value of this parameter is displayed in a block next to the price in the **Finalize** step, to indicate if the price includes taxes or not.

In the example below, `vatString`

has been set to "VAT included":

### Pricing Rules

A product should **NOT** have a reduced and a membership price available at the same time in a given currency.

If this situation still happens, the planner will use the lowest of the candidate prices and the other(s) will be ignored. Thus, the styling will depend on the lowest of discounted prices.

No validation is performed to check that the discounted price is lower than the regular price. If the discounted price happens to be greater than the discounted price, then the planner will show the low value as the former price and the big value as the current price.

Regular price and Membership price will also show the product price start date and end date.

Eco-Fee is shown separately next to the price although the amount of the eco-fee is de facto part of the price amount displayed.

### Pricing Default Styling

The planner comes with a default styling for prices.

➡️ See Customize Brand Settings for detailed information on how Brands override the default pricing styling.

#### Product Price

**Standard Price**

Displayed when no products of the projects have a discounted price.

**Reduced Price**

Displayed when at least one product has a reduced price and when no product has a discounted or membership price.

**Discounted Price**

Displayed when at least one product has a discounted price AND when no product has a membership price.

**Membership Price**

Displayed when at least one product has a membership price.

**Ecofee Price**

Eco-fee is added to every pricing.

#### Total Project Price

**Standard price**

Displayed when no products of the projects have a discounted price.

**Reduced Price**

Displayed when at least one product has a reduced price AND when no product has a discounted or membership price.

**Discounted Price**

Displayed when at least one product has a discounted price AND when no product has a membership price.

**Membership Price**

Displayed when at least one product has a membership price.

📌 If there is a mix of membership priced and reduced priced products, the membership styling will be applied, and the lowest price will be the sum of all reduced and membership prices.

In the price of the total project, from-date is the earliest start date and end-date is the earliest end date. It is calculated on the basis of all product date and the earliest of start and end date of product is shown.

### Visibility of Products in 2D Plans

The main purpose of 2D plans is to help the installer of the kitchen. Showing accessories makes reading the plans difficult, especially in top view. So accessories should be hidden in all 2D plan views.

If freetag on the product is set as "RemoveFromPlans" then it will not be visible in any 2D plan.

📌 Products with free tag "RemoveFromPlans" will not have any price.