> For the complete documentation index, see [llms.txt](https://docs.flowretail.com/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.flowretail.com/docs/developers/api-documentation/extensions/update-tenant-extension-details.md).

# Update tenant extension details

Update details for a tenant extension. A save that leaves the SERVICE\_WORKSHOP extension active creates the tenant's SERVICE number series when it has none. The tenant's service sale products are linked by the platform, one for each VAT code of the tenant's country and each kind: the goods product of a VAT code carries the line of that VAT code's items whose product is of type STOCK, and the work-and-other product the line of its other items. A link is to a product, not to a SKU: a linked product's SKU and name are the tenant's own and may be anything, and the platform may link a tenant's own product in place of one it creates. No endpoint serves the links, and none sets one but the save set out below. A save that leaves the SERVICE\_WORKSHOP extension active fills every link that is missing, for each VAT code of the tenant's country and each kind. It links the product standing under the link's default SKU: SERVICE-PARTS-{rate} for the goods link and SERVICE-WORK-{rate} for the work-and-other link, {rate} being the VAT code's rate in percent at the save that fills the link — SERVICE-PARTS-25 for 25%, SERVICE-PARTS-25.5 for 25.5% — and a later VAT code of the country with the same rate taking -2, -3 after it, as in SERVICE-PARTS-0-2. A SKU is not renamed when its VAT code's rate changes. When no product stands under the default SKU, the save creates one there and links it: of type NO\_STOCK with allowOrderSpecificCost true and carrying that VAT code, in a brand and a product group named for the service module, the group created with the SERVICE scope. The two products the platform creates for a VAT code are named "Goods" and "Work and other" in the tenant's language whatever the rate. A link that exists is kept as it is. A linked product that is deleted loses its link, and the next such save fills it again, as it fills the links of a VAT code the country gains later. A save that switches the extension off neither links nor creates anything. The service sale is booked on the linked products (see post-serviceorders-orders). The save is refused with a 400, changing nothing, when a linked product, or the product standing under the default SKU of a link that is missing, is not of type NO\_STOCK with allowOrderSpecificCost true or carries a VAT code other than the link's, and when the product standing under the default SKU of a link that is missing is already linked for another VAT code or kind. A save that leaves the SERVICE\_WORKSHOP extension active also creates the ready service message texts of every type below that the tenant holds no template of in any language, each in all seven template languages (en, nb, nn, sv, da, de, fi): the registration message (SMS\_SERVICE\_ORDER\_CREATED and EMAIL\_SERVICE\_ORDER\_CREATED), the ready-for-pickup message (SMS\_SERVICE\_READY\_FOR\_PICKUP and EMAIL\_SERVICE\_READY\_FOR\_PICKUP), the message staff write to the customer (SMS\_SERVICE\_ORDER\_UPDATED and EMAIL\_SERVICE\_ORDER\_UPDATED), the new portal link (SMS\_SERVICE\_PORTAL\_LINK\_CHANGED and EMAIL\_SERVICE\_PORTAL\_LINK\_CHANGED), the quote (SMS\_SERVICE\_QUOTE\_SENT and EMAIL\_SERVICE\_QUOTE\_SENT) and the e-mailed paper (EMAIL\_SERVICE\_DOCUMENT\_SENT). The registration and ready-for-pickup types are tenant-created service types and carry a name in the tenant's language. The texts are a starting point the tenant edits like any other. A type the tenant holds a template of, in any language, is left as it is, so a later save creates nothing for it; a type whose every template the tenant deletes gets its ready texts again on the next such save. No status message rule is created: the tenant adds the rules that send the texts. A save that leaves the SERVICE\_WORKSHOP extension active also gives every service state that has no service status a status of its own, carrying the state's default color and a name in the tenant's language: the state's own name, except Received for the NOT\_STARTED state and Released to customer for the COMPLETE state; the tenant renames them like any other status. A phased-out status counts as the state's status, so a state the tenant has phased out gets none. A state is skipped when another status of the tenant already carries the name its status would get, so no two statuses share a name. A deleted status is created again by the next such save when its state is left without a status. The tenant's default start status is not changed. The SERVICE\_WORKSHOP extension's SERVICE\_PORTAL\_BASE\_URL parameter is the tenant's own address for the service portal: every service portal link Flow sends this tenant's customers starts with it, in the messages status rules send and in those a person sends from a service order alike, and with the Flow Service web app's own address while it is empty. It is an https origin, such as <https://service.example.com>: the scheme https, a host, and nothing after it but an optional trailing slash. Surrounding spaces are trimmed, and it is stored in lowercase without the slash. A value that differs from the one stored is checked before it is saved: its host must resolve to at least one IP address the Flow Service web app's own host resolves to. So its domain is pointed directly at that host, never through a proxy of the tenant's own, and a certificate for the domain is installed there before the value is saved. A value that is not an https origin, or fails the check, is refused with a 400 and nothing is saved. Links already sent keep the address they were sent with.

Required permissions: EXTENSION

```json
{"openapi":"3.0.2","info":{"title":"Flow Retail API version 2","version":"2.0.0"},"tags":[{"name":"Extensions","description":"Extensions"}],"servers":[{"description":"Flow Retail Production","url":"https://api.flowretail.com/v2"},{"description":"Flow Retail Stage","url":"https://api.stage.flowretail.com/v2"}],"security":[{"authToken":[]}],"components":{"securitySchemes":{"authToken":{"description":"Token received from the auth service","scheme":"bearer","type":"http"}},"requestBodies":{"TenantExtensionUpdateRequest":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantExtensionUpdateRequestSchema"}}}}},"schemas":{"TenantExtensionUpdateRequestSchema":{"title":"TenantExtensionUpdateRequestSchema","type":"object","properties":{"name":{"type":"string"},"active":{"type":"boolean"},"tenantParameters":{"type":"array","items":{"$ref":"#/components/schemas/GeneralParameterRequestSchema"}}},"required":["active"]},"GeneralParameterRequestSchema":{"description":"GeneralParameterRequestSchema","title":"GeneralParameterRequestSchema","type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"]},"TenantExtensionResponseSchema":{"title":"TenantExtensionResponseSchema","type":"object","description":"TenantExtensionResponseSchema","required":["tenantExtensionUid","name","active","extensionCode","hasStoreExtensionSettings","tenantParameters","statusMessages","availableTenantParameters","availableStoreParameters"],"properties":{"tenantExtensionUid":{"$ref":"#/components/schemas/UID"},"name":{"type":"string"},"active":{"type":"boolean"},"extensionCode":{"$ref":"#/components/schemas/ExtensionCodeENUM"},"hasStoreExtensionSettings":{"type":"boolean","description":"Indicate if the extension needs to be activated and configured pr store"},"tenantParameters":{"type":"array","items":{"$ref":"#/components/schemas/GeneralParameterResponseSchema"}},"statusMessages":{"type":"array","items":{"type":"string"}},"availableTenantParameters":{"type":"array","deprecated":true,"items":{"$ref":"#/components/schemas/AvailableExtensionParameterSchema"}},"availableStoreParameters":{"type":"array","items":{"$ref":"#/components/schemas/GeneralParameterResponseSchema"}}}},"UID":{"title":"UID","type":"string","pattern":"^[A-Za-z0-9-_]+"},"ExtensionCodeENUM":{"description":"`PAYEX_POS` is discontinued: a tenant that has it keeps it, but it cannot be switched on.","enum":["FLOWGIFTCARD","PAYEX_GIFTCARD","ADYEN_POS","PAYEX_POS","VIPPS","EXTERNAL_CUSTOMER_SEARCH","STORE_CREDIT","SMS","STRIPE","NETS","VERIFONE","SERVICE_WORKSHOP","TWO_INVOICE","OMNIUM","DILLER","ARTS","CAMPAIGN","B2B","PEOPLE_COUNTER_KUNDETELLING","COMPENSATION","SWISH","DINTERO","KID","EHF","MYPOWER","BRITANNIA","SOFTPAY","CENTRAL_WAREHOUSE","PROFRAKT","LOYALTY_POINTS","SUBSCRIPTION","POWER_DIRECT","POSTER","PAYMENT_GATEWAY","KLAVIYO","COMPANY_REGISTRY","DIGITAL_PRODUCT","INTER_STORE_TRADE","FISCAL","EXTERNAL_ORDER_SEARCH","ORDER_DEVIATION"],"title":"ExtensionCodeENUM","type":"string"},"GeneralParameterResponseSchema":{"title":"GeneralParameterResponseSchema","type":"object","required":["key","value","type","allowedValues","validationRegex","name","required"],"properties":{"key":{"type":"string"},"value":{"type":"string"},"type":{"$ref":"#/components/schemas/GeneralParameterTypeENUM"},"allowedValues":{"type":"array","items":{"type":"string"}},"validationRegex":{"type":"string"},"name":{"type":"string"},"required":{"type":"boolean"}}},"GeneralParameterTypeENUM":{"title":"GeneralSettingTypeENUM","type":"string","enum":["STRING","PASSWORD","INTEGER","DECIMAL","BOOL","ENUM"],"description":"| Type | Description |\n|--|--|\n|BOOL | Booleans will be the string `true` or `false` |\n|DECIMAL | Descimal numbers can only have two decimals and is represented as an integer multiplied by 100. Example: 1.2 is will be 120 and 5 will be 500 |\n|ENUM| The enum value should be one of the values listed in `allowedValues` |\n|PASSWORD | Treated the same way as STRING, but indicates to clients that this field should be hidden or masked. Used for tokens and passwords |"},"AvailableExtensionParameterSchema":{"title":"AvailableExtensionParameterSchema","type":"object","required":["key","type","required"],"properties":{"key":{"type":"string"},"type":{"$ref":"#/components/schemas/ExtensionParameterDataTypeENUM"},"required":{"type":"boolean"}}},"ExtensionParameterDataTypeENUM":{"type":"string","title":"ExtensionParameterDataTypeENUM","enum":["STRING","INTEGER","DECIMAL","BOOLEAN","JSON_STRING_ARRAY"],"description":"JSON_STRING_ARRAY must represent a valid json string array."}},"responses":{"TenantExtensionResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantExtensionResponseSchema"}}},"description":"Example response"}}},"paths":{"/tenants/{tenantUid}/extensions/{tenantExtensionUid}":{"put":{"description":"Update details for a tenant extension.\nA save that leaves the SERVICE_WORKSHOP extension active creates the tenant's SERVICE number series when it has none.\nThe tenant's service sale products are linked by the platform, one for each VAT code of the tenant's country and each kind: the goods product of a VAT code carries the line of that VAT code's items whose product is of type STOCK, and the work-and-other product the line of its other items. A link is to a product, not to a SKU: a linked product's SKU and name are the tenant's own and may be anything, and the platform may link a tenant's own product in place of one it creates. No endpoint serves the links, and none sets one but the save set out below.\nA save that leaves the SERVICE_WORKSHOP extension active fills every link that is missing, for each VAT code of the tenant's country and each kind. It links the product standing under the link's default SKU: SERVICE-PARTS-{rate} for the goods link and SERVICE-WORK-{rate} for the work-and-other link, {rate} being the VAT code's rate in percent at the save that fills the link — SERVICE-PARTS-25 for 25%, SERVICE-PARTS-25.5 for 25.5% — and a later VAT code of the country with the same rate taking -2, -3 after it, as in SERVICE-PARTS-0-2. A SKU is not renamed when its VAT code's rate changes. When no product stands under the default SKU, the save creates one there and links it: of type NO_STOCK with allowOrderSpecificCost true and carrying that VAT code, in a brand and a product group named for the service module, the group created with the SERVICE scope. The two products the platform creates for a VAT code are named \"Goods\" and \"Work and other\" in the tenant's language whatever the rate. A link that exists is kept as it is. A linked product that is deleted loses its link, and the next such save fills it again, as it fills the links of a VAT code the country gains later. A save that switches the extension off neither links nor creates anything. The service sale is booked on the linked products (see post-serviceorders-orders).\nThe save is refused with a 400, changing nothing, when a linked product, or the product standing under the default SKU of a link that is missing, is not of type NO_STOCK with allowOrderSpecificCost true or carries a VAT code other than the link's, and when the product standing under the default SKU of a link that is missing is already linked for another VAT code or kind.\nA save that leaves the SERVICE_WORKSHOP extension active also creates the ready service message texts of every type below that the tenant holds no template of in any language, each in all seven template languages (en, nb, nn, sv, da, de, fi): the registration message (SMS_SERVICE_ORDER_CREATED and EMAIL_SERVICE_ORDER_CREATED), the ready-for-pickup message (SMS_SERVICE_READY_FOR_PICKUP and EMAIL_SERVICE_READY_FOR_PICKUP), the message staff write to the customer (SMS_SERVICE_ORDER_UPDATED and EMAIL_SERVICE_ORDER_UPDATED), the new portal link (SMS_SERVICE_PORTAL_LINK_CHANGED and EMAIL_SERVICE_PORTAL_LINK_CHANGED), the quote (SMS_SERVICE_QUOTE_SENT and EMAIL_SERVICE_QUOTE_SENT) and the e-mailed paper (EMAIL_SERVICE_DOCUMENT_SENT). The registration and ready-for-pickup types are tenant-created service types and carry a name in the tenant's language. The texts are a starting point the tenant edits like any other. A type the tenant holds a template of, in any language, is left as it is, so a later save creates nothing for it; a type whose every template the tenant deletes gets its ready texts again on the next such save. No status message rule is created: the tenant adds the rules that send the texts.\nA save that leaves the SERVICE_WORKSHOP extension active also gives every service state that has no service status a status of its own, carrying the state's default color and a name in the tenant's language: the state's own name, except Received for the NOT_STARTED state and Released to customer for the COMPLETE state; the tenant renames them like any other status. A phased-out status counts as the state's status, so a state the tenant has phased out gets none. A state is skipped when another status of the tenant already carries the name its status would get, so no two statuses share a name. A deleted status is created again by the next such save when its state is left without a status. The tenant's default start status is not changed.\nThe SERVICE_WORKSHOP extension's SERVICE_PORTAL_BASE_URL parameter is the tenant's own address for the service portal: every service portal link Flow sends this tenant's customers starts with it, in the messages status rules send and in those a person sends from a service order alike, and with the Flow Service web app's own address while it is empty. It is an https origin, such as https://service.example.com: the scheme https, a host, and nothing after it but an optional trailing slash. Surrounding spaces are trimmed, and it is stored in lowercase without the slash. A value that differs from the one stored is checked before it is saved: its host must resolve to at least one IP address the Flow Service web app's own host resolves to. So its domain is pointed directly at that host, never through a proxy of the tenant's own, and a certificate for the domain is installed there before the value is saved. A value that is not an https origin, or fails the check, is refused with a 400 and nothing is saved. Links already sent keep the address they were sent with.\n\nRequired permissions: EXTENSION","operationId":"put-tenants-extensions-details","requestBody":{"$ref":"#/components/requestBodies/TenantExtensionUpdateRequest"},"responses":{"200":{"$ref":"#/components/responses/TenantExtensionResponse"},"400":{"description":"Bad Request. Among the reasons: the SERVICE_WORKSHOP extension is saved active while a product linked as a service sale product, or the product under the default SKU a missing link is filled from, is not of type NO_STOCK with allowOrderSpecificCost true or carries a VAT code other than the link's, while the product under such a SKU is already linked for another VAT code or kind, while the root product group of the service module's name holds sub-groups, or while the tenant's country has no VAT codes; or its SERVICE_PORTAL_BASE_URL parameter is neither empty nor an https origin, or names a host that resolves to no IP address the Flow Service web app's own host resolves to. A refused save changes nothing."}},"summary":"Update tenant extension details","tags":["Extensions"]}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.flowretail.com/docs/developers/api-documentation/extensions/update-tenant-extension-details.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
