---
title: "eCommerce"
description: "Webbutik. Varje app är en modul i en gemensam datamodell."
canonical: "https://obop-platform.sliplane.app/sv/apps/ecommerce/"
lang: "sv"
---

# eCommerce

## Vad den är till för

Store the data of an online shop: listings, shipping methods, discount codes and web orders with a fulfilment flow. Refunds need a manager and an approval. A storefront or other client reads and writes this data through the API.

## Vad paketet gör och inte gör

An online shop: categories, product listings with translations, shipping methods, discount codes, web orders with lines and a fulfilment flow of pending, paid, shipped, delivered, cancelled and refunded. When the instance runs with the public site enabled, visitors browse the published listings and place orders without an account; the server prices every order from the published listing and never trusts the browser. There is no payment provider: an order starts as pending and the shop contacts the buyer. Refunds need a human approval from a manager; agents may only propose them. Customer name, email and addresses are personal data and are never public. Needs the Products package.

## Modeller

### `ecommerce_category`

A group of listings shown together in the shop

Läsgrupp: `ecommerce.user`. Skrivgrupp: `ecommerce.manager`.

| Fält | Typ | Dataklass | Personuppgift | Grupp | Agenter ser | Beskrivning |
|---|---|---|---|---|---|---|
| `name` | text | `none` | nej | `ecommerce.user` | i klartext | Category name shown in the shop |
| `slug` | text | `none` | nej | `ecommerce.user` | i klartext | URL part of the category, lowercase with dashes |
| `description` | text | `none` | nej | `ecommerce.user` | i klartext | Short text about the category |
| `sequence` | number | `none` | nej | `ecommerce.user` | i klartext | Order among categories, lowest first |
| `published` | bool | `none` | nej | `ecommerce.user` | i klartext | Whether the category is visible to shoppers |

### `ecommerce_listing`

A product as it appears in the online shop

Läsgrupp: `ecommerce.user`. Skrivgrupp: `ecommerce.manager`.

| Fält | Typ | Dataklass | Personuppgift | Grupp | Agenter ser | Beskrivning |
|---|---|---|---|---|---|---|
| `product_id` | ref → product | `none` | nej | `ecommerce.user` | i klartext | The product being sold online |
| `title` | text | `none` | nej | `ecommerce.user` | i klartext | Title shown in the shop |
| `slug` | text | `none` | nej | `ecommerce.user` | i klartext | URL part of the product page, lowercase with dashes |
| `summary` | text | `none` | nej | `ecommerce.user` | i klartext | One or two sentences shown on product cards |
| `description` | longtext | `none` | nej | `ecommerce.user` | i klartext | Description shown on the product page, in Markdown |
| `category_id` | ref → ecommerce_category | `none` | nej | `ecommerce.user` | i klartext | The category the listing is shown under |
| `price` | money | `none` | nej | `ecommerce.user` | i klartext | Shop price including tax (minor currency units, e.g. cents) |
| `compare_at_price` | money | `none` | nej | `ecommerce.user` | i klartext | Previous price shown crossed out (minor currency units) |
| `currency` | text | `none` | nej | `ecommerce.user` | i klartext | ISO 4217 currency code of the prices, for example EUR; empty means the shop currency from the instance settings |
| `sku` | text | `none` | nej | `ecommerce.user` | i klartext | Stock keeping unit shown on the product page |
| `stock_policy` | select (always_available, block_when_out, allow_backorder) | `none` | nej | `ecommerce.user` | i klartext | What happens when stock runs out: always_available, block_when_out, allow_backorder |
| `stock_quantity` | number | `none` | nej | `ecommerce.user` | i klartext | Units on hand, used with the stock policy. Orders do not reduce it: adjust it by hand |
| `published` | bool | `none` | nej | `ecommerce.user` | i klartext | Whether the listing is visible to shoppers |

### `ecommerce_listing_translation`

A listing translated into another language

Läsgrupp: `ecommerce.user`. Skrivgrupp: `ecommerce.manager`.

| Fält | Typ | Dataklass | Personuppgift | Grupp | Agenter ser | Beskrivning |
|---|---|---|---|---|---|---|
| `listing_id` | ref → ecommerce_listing | `none` | nej | `ecommerce.user` | i klartext | The listing this translates |
| `lang` | select (en, de, fr, pl, fi, sv, es) | `none` | nej | `ecommerce.user` | i klartext | Language of the translation: en, de, fr, pl, fi, sv or es |
| `title` | text | `none` | nej | `ecommerce.user` | i klartext | Translated title |
| `summary` | text | `none` | nej | `ecommerce.user` | i klartext | Translated card text |
| `description` | longtext | `none` | nej | `ecommerce.user` | i klartext | Translated description in Markdown |
| `published` | bool | `none` | nej | `ecommerce.user` | i klartext | Whether the translation is shown; it is only reachable while its listing is published |

### `ecommerce_shipping_method`

A way of delivering orders with its price

Läsgrupp: `ecommerce.user`. Skrivgrupp: `ecommerce.manager`.

| Fält | Typ | Dataklass | Personuppgift | Grupp | Agenter ser | Beskrivning |
|---|---|---|---|---|---|---|
| `name` | text | `none` | nej | `ecommerce.user` | i klartext | Name shown at checkout, for example Standard delivery |
| `carrier` | text | `none` | nej | `ecommerce.user` | i klartext | Carrier that delivers, for example DHL |
| `price` | money | `none` | nej | `ecommerce.user` | i klartext | Delivery price (minor currency units) |
| `free_over` | money | `none` | nej | `ecommerce.user` | i klartext | Order total above which delivery is free (minor currency units); empty means never |
| `delivery_days` | number | `none` | nej | `ecommerce.user` | i klartext | Usual number of days until delivery |
| `active` | bool | `none` | nej | `ecommerce.user` | i klartext | Whether shoppers can choose it |

### `ecommerce_discount_code`

A code a shopper enters at checkout for a reduction

Läsgrupp: `ecommerce.user`. Skrivgrupp: `ecommerce.manager`.

| Fält | Typ | Dataklass | Personuppgift | Grupp | Agenter ser | Beskrivning |
|---|---|---|---|---|---|---|
| `code` | text | `none` | nej | `ecommerce.user` | i klartext | The code shoppers type, for example SPRING10 |
| `kind` | select (percent, fixed) | `none` | nej | `ecommerce.user` | i klartext | Type of reduction: percent or fixed |
| `value` | number | `none` | nej | `ecommerce.user` | i klartext | Reduction: basis points for percent (1000 is 10.00 percent), minor currency units for fixed |
| `starts_on` | date | `none` | nej | `ecommerce.user` | i klartext | First day the code works (YYYY-MM-DD) |
| `ends_on` | date | `none` | nej | `ecommerce.user` | i klartext | Last day the code works (YYYY-MM-DD) |
| `max_uses` | number | `none` | nej | `ecommerce.user` | i klartext | How many times the code may be used in total; empty means unlimited |
| `used_count` | number | `none` | nej | `ecommerce.user` | i klartext | How many times it has been used (kept up to date by hand) |
| `minimum_order` | money | `none` | nej | `ecommerce.user` | i klartext | Smallest order total the code applies to (minor currency units) |
| `active` | bool | `none` | nej | `ecommerce.user` | i klartext | Whether the code can be used |

### `ecommerce_order`

An order placed online

Läsgrupp: `ecommerce.user`. Skrivgrupp: `ecommerce.user`.

| Fält | Typ | Dataklass | Personuppgift | Grupp | Agenter ser | Beskrivning |
|---|---|---|---|---|---|---|
| `number` | text | `none` | nej | `ecommerce.user` | i klartext | Order number shown to the shopper. Free text: packages cannot generate sequences; the public checkout makes a random one |
| `customer_email` | text | `internal` | ja | `ecommerce.user` | maskerad | Email address of the shopper |
| `customer_name` | text | `internal` | ja | `ecommerce.user` | maskerad | Name of the shopper |
| `customer_id` | ref → party | `none` | nej | `ecommerce.user` | i klartext | The matching contact, once the shopper is known |
| `shipping_address` | longtext | `internal` | ja | `ecommerce.user` | maskerad | Delivery address |
| `billing_address` | longtext | `internal` | ja | `ecommerce.user` | maskerad | Billing address when different from delivery |
| `shipping_method_id` | ref → ecommerce_shipping_method | `none` | nej | `ecommerce.user` | i klartext | The chosen way of delivery |
| `discount_code_id` | ref → ecommerce_discount_code | `none` | nej | `ecommerce.user` | i klartext | The discount code used, if any |
| `placed_on` | date | `none` | nej | `ecommerce.user` | i klartext | Day the order was placed (YYYY-MM-DD) |
| `currency` | text | `none` | nej | `ecommerce.user` | i klartext | ISO 4217 currency code, for example EUR |
| `subtotal` | money | `none` | nej | `ecommerce.user` | i klartext | Sum of the lines (minor currency units, entered not computed) |
| `discount_total` | money | `none` | nej | `ecommerce.user` | i klartext | Reduction from the discount code (minor currency units) |
| `shipping_total` | money | `none` | nej | `ecommerce.user` | i klartext | Delivery charge (minor currency units) |
| `tax_total` | money | `none` | nej | `ecommerce.user` | i klartext | Tax included in the total (minor currency units) |
| `total` | money | `none` | nej | `ecommerce.user` | i klartext | Amount the shopper pays (minor currency units) |
| `payment_reference` | text | `financial` | ja | `ecommerce.user` | undanhållen | Reference from the payment provider; never a card number |
| `tracking_reference` | text | `none` | nej | `ecommerce.user` | i klartext | Carrier tracking number |
| `access_token` | text | `secret` | nej | `ecommerce.user` | undanhållen | Secret link token that lets the shopper who placed a public order see its confirmation page. Nobody can read it back |
| `state` | select (pending, paid, shipped, delivered, cancelled, refunded) | `none` | nej | `ecommerce.user` | i klartext | Fulfilment status: pending, paid, shipped, delivered, cancelled, refunded |

### `ecommerce_order_line`

One product line of a web order

Läsgrupp: `ecommerce.user`. Skrivgrupp: `ecommerce.user`.

| Fält | Typ | Dataklass | Personuppgift | Grupp | Agenter ser | Beskrivning |
|---|---|---|---|---|---|---|
| `order_id` | ref → ecommerce_order | `none` | nej | `ecommerce.user` | i klartext | The order the line belongs to |
| `product_id` | ref → product | `none` | nej | `ecommerce.user` | i klartext | The product ordered |
| `listing_id` | ref → ecommerce_listing | `none` | nej | `ecommerce.user` | i klartext | The shop listing the line was ordered from |
| `description` | text | `none` | nej | `ecommerce.user` | i klartext | Product text as it was when ordered |
| `quantity` | number | `none` | nej | `ecommerce.user` | i klartext | Units ordered |
| `unit_price` | money | `none` | nej | `ecommerce.user` | i klartext | Price per unit including tax (minor currency units) |
| `subtotal` | money | `none` | nej | `ecommerce.user` | i klartext | Line total (minor currency units, entered not computed) |

## Arbetsflöden

### `ecommerce_order`

| Åtgärd | Flyttar | Vem får köra den | Godkännande |
|---|---|---|---|
| `ecommerce_order.mark_paid` | state: pending → paid | `ecommerce.user` | nej |
| `ecommerce_order.ship` | state: paid → shipped | `ecommerce.user` | nej |
| `ecommerce_order.deliver` | state: shipped → delivered | `ecommerce.user` | nej |
| `ecommerce_order.cancel` | state: pending → cancelled | `ecommerce.user` | nej |
| `ecommerce_order.refund` | state: paid → refunded | `ecommerce.manager` | ja |
| `ecommerce_order.refund_delivered` | state: delivered → refunded | `ecommerce.manager` | ja |

## Behörighetsgrupper

Grupper som den här appen använder:

- `ecommerce.manager`
- `ecommerce.user`

## Steg som kräver godkännande

Steg som en agent bara kan föreslå:

- `ecommerce_order.refund`
- `ecommerce_order.refund_delivered`

## Vad agenter kan och inte kan göra

En agent kan läsa, söka, skapa och uppdatera poster i den här appen, och köra de åtgärder som inte kräver godkännande, inom behörighetsgrupperna för sin token.

Den kan bara föreslå de här stegen, och en person måste godkänna dem: `ecommerce_order.refund`, `ecommerce_order.refund_delivered`, `ecommerce_category.delete`, `ecommerce_listing.delete`, `ecommerce_listing_translation.delete`, `ecommerce_shipping_method.delete`, `ecommerce_discount_code.delete`, `ecommerce_order.delete`, `ecommerce_order_line.delete`.

Personuppgifter maskeras som platshållare: `ecommerce_order.customer_email`, `ecommerce_order.customer_name`, `ecommerce_order.shipping_address`, `ecommerce_order.billing_address`.

De här fälten undanhålls helt från agenter: `ecommerce_order.payment_reference`, `ecommerce_order.access_token`.

## Beroenden

- `base`
- `product`

## Installera

Installera den från appen Customize (Marknadsplats), eller från kommandoraden:

```bash
obop modules install-from ecommerce
```

Kräver en databas och administratörsbehörighet.

## Bygg din egen

[Modulguiden visar hur appar som den här skrivs](/sv/docs/reference/module-manifest/)
