Each view of a TYPO3 page is tracked by default. Requests can be ignored by configuring a rule that has to match the current request.

All configuration happens via Dependency injection inside of Services.yaml of your Sitepackage.


Screenshot of list view of created "pageview" records.


Screenshot of edit form view of created "pageview" records.

Saved record

Whenever a pageview is tracked, a new record is created. The record can be viewed via TYPO3 list module. That way all collected information can be checked.

Configure tracking

Let us examine an concrete example:

    autowire: true
    autoconfigure: true
    public: false

    public: true
      $rule: >
          not (context.getAspect("backend.user").isLoggedIn())
          and not (context.getAspect("frontend.preview").isPreview())
          and traverse(request.getHeader("User-Agent"), '0')
          and not (request.getHeader("User-Agent")[0] matches "/^TYPO3|TYPO3 linkvalidator/")
          and not (request.getHeader("User-Agent")[0] matches "/^Codeception Testing/")
          and not (request.getHeader("User-Agent")[0] matches "/Wget|curl|Go-http-client/")
          and not (request.getHeader("User-Agent")[0] matches "/bot|spider|Slurp|Sogou|NextCloud-News|Feedly|XING FeedReader|SEOkicks|Seekport Crawler|ia_archiver|TrendsmapResolver|Nuzzel/")
          and not (request.getHeader("User-Agent")[0] matches "/mattermost|Slackbot|WhatsApp/")

The first paragraph will not be explained, check out Configuration instead.

The second paragraph is where the tracking is configured. The PHP class DanielSiepmann\Tracking\Middleware\Pageview is registered as PHP middleware and will actually track the request. Therefore this class is configured. The only interesting argument to configure is $rule, which is a Symfony Expression. The same is used by TYPO3 for TypoScript conditions and is not explained here.

This rule is evaluated to either true or false, where true means that the current request should be tracked.

The current request is available as Psr\Http\Message\ServerRequestInterface via request, while TYPO3\CMS\Core\Context\Context is available via context. That way it is possible to check all kind of information like frontend user, backend user or cookies and parameters, as well as request header.

Check PSR-7: HTTP message interfaces as well as Context API and Aspects.

The above example blocks tracking for requests with logged in backend user, as well as specific user agents like bots, TYPO3 itself and other systems.


The extension does not provide any widgets, but providers for widgets of EXT:dashboard. That way widgets of EXT:dashboard can be combined with all providers of this extension.

The concepts are not documented here, check t3dashboard:start instead.