---
title: "Configuration"
manual: "Opinion"
version: "main"
permalink: "https://docs.typo3.org/permalink/vkemeter/opinion:configuration@main"
source: "Configuration/Index.rst"
rendered: "2026-10-23T14:21:05+00:00"
---

# Configuration {#configuration}

## Extension configuration {#configuration-extension}

**Admin Tools > Settings > Extension Configuration > opinion**

-   **recipients**

    -   *Type:* string
    -   *Default:* (empty)

    Comma-separated email addresses that receive the feedback. Invalid
    addresses are ignored. Without a valid recipient the feedback is still
    stored, its delivery status is "failed".

-   **subjectPrefix**

    -   *Type:* string
    -   *Default:* `[Opinion]`

    Prefix of the email subject. The subject continues with category,
    severity and the beginning of the message, for example
    `[Opinion] [bug/high] The teaser image is cropped`.

-   **redeliverMaxAttempts**

    -   *Type:* int
    -   *Default:* 5

    Delivery attempts, counting the first one, after which
    [opinion:redeliver](https://docs.typo3.org/permalink/vkemeter/opinion:administration-redeliver@main) gives up on a
    feedback. `0` retries without limit. **Deliver again** in the
    admin module is always possible.

-   **rateLimit**

    -   *Type:* int
    -   *Default:* 10

    Feedback a backend user may send per hour, administrators included. Only
    valid submissions count. Above the limit the dialog shows a notice and the
    endpoint answers `429` with a `Retry-After` header. `0` switches the limit
    off.

-   **retentionDays**

    -   *Type:* int
    -   *Default:* 180

    Age in days after which [opinion:cleanup](https://docs.typo3.org/permalink/vkemeter/opinion:administration-cleanup@main)
    deletes feedback records and their screenshots.

-   **enabled**

    -   *Type:* boolean
    -   *Default:* 1

    `0` hides the feedback triggers for everybody and rejects submissions.

### Email sender {#configuration-email}

The email is sent from
`$GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress']`. The backend
user who sent the feedback becomes reply-to, so the team can answer directly.

## Collected details {#configuration-collected-details}

The tab **Collected details** of the extension configuration has a
switch for every detail that is attached to the feedback. All are on by
default. A switched-off detail is not collected by the browser and is removed
on the server, even if a request sends it.

The sender (name, username, email address) is always kept, the team needs it
to answer.

### Browser {#configuration-collected-details-browser}

Collected by the browser. Cookies, `localStorage` and `sessionStorage` are
never read.

| Setting | Detail |
| --- | --- |
| `collect_client_url` | Page URL |
| `collect_client_title` | Page title |
| `collect_client_userAgent` | User agent |
| `collect_client_userAgentData` | Browser brands, platform, mobile (User-Agent Client Hints) |
| `collect_client_language` | Browser language |
| `collect_client_languages` | Preferred languages |
| `collect_client_timezone` | Time zone |
| `collect_client_screen` | Screen size and color depth |
| `collect_client_viewport` | Viewport size |
| `collect_client_devicePixelRatio` | Device pixel ratio |
| `collect_client_colorScheme` | Color scheme (light/dark) |
| `collect_client_reducedMotion` | Reduced motion preference |
| `collect_client_online` | Online state |
| `collect_client_timestamp` | Time in the browser |

### Server {#configuration-collected-details-server}

Determined on the server, never taken from the request body.

| Setting | Detail |
| --- | --- |
| `collect_system_typo3Version` | TYPO3 version |
| `collect_system_applicationContext` | Application context |
| `collect_system_phpVersion` | PHP version |
| `collect_system_ipAddress` | IP address (anonymised) |
| `collect_system_requestUserAgent` | User agent sent to the server |

### Page and module {#configuration-collected-details-context}

Sent by the entry point and validated on the server. Entries marked
"admin panel" come from the admin panel tab **Info > General**; images
and document size are only known when the page was rendered without cache,
like in the admin panel itself.

| Setting | Detail |
| --- | --- |
| `collect_context_page` | Page uid and title |
| `collect_context_site` | Site (frontend) |
| `collect_context_language` | Language (frontend) |
| `collect_context_workspace` | Workspace (frontend) |
| `collect_context_module` | Module (backend) |
| `collect_context_url` | Module URL (backend) |
| `collect_context_pageType` | Page type (admin panel) |
| `collect_context_cacheState` | Cache state and reasons (admin panel) |
| `collect_context_uncachedElements` | Number of uncached elements (admin panel) |
| `collect_context_parseTime` | Parse time (admin panel) |
| `collect_context_documentSize` | Document size (admin panel) |
| `collect_context_frontendUser` | Simulated frontend user and groups (admin panel) |
| `collect_context_imagesOnPage` | Images on the page (admin panel) |

### URLs {#configuration-collected-details-url}

-   **deniedUrlParameters**

    -   *Type:* string
    -   *Default:* `ADMCMD_*,logintype,user,pass,redirect_url,tx_felogin_login`

    Query parameters that are removed from the page URL (browser) and the
    module URL (backend) before the feedback is stored and sent, so preview,
    login or session parameters do not end up in the email. Comma-separated
    and case-insensitive; a trailing `*` matches a prefix, `ADMCMD_*` covers
    all preview parameters. For an array parameter like
    `tx_felogin_login[hash]` the base name `tx_felogin_login` is matched. All
    other parameters and the fragment are kept as sent.

    The request token of backend URLs (`token`) is always removed. An empty
    value removes nothing else.

## Who may send feedback {#configuration-access}

Administrators always may. Other backend users need the option
`options.opinion.enable` in their user or group TSconfig. It shows the feedback
triggers to the user and accepts their submissions:

**User or group TSconfig**

```typoscript
options.opinion.enable = 1
```

Sending feedback also needs a valid email address in the user account, so the
team can answer. Users without one still see the trigger, but get a note with
a link to their user settings instead of the form; the endpoint rejects their
submissions as well.
