Recherche avancée

Médias (1)

Mot : - Tags -/Rennes

Autres articles (80)

  • Personnaliser en ajoutant son logo, sa bannière ou son image de fond

    5 septembre 2013, par

    Certains thèmes prennent en compte trois éléments de personnalisation : l’ajout d’un logo ; l’ajout d’une bannière l’ajout d’une image de fond ;

  • Ecrire une actualité

    21 juin 2013, par

    Présentez les changements dans votre MédiaSPIP ou les actualités de vos projets sur votre MédiaSPIP grâce à la rubrique actualités.
    Dans le thème par défaut spipeo de MédiaSPIP, les actualités sont affichées en bas de la page principale sous les éditoriaux.
    Vous pouvez personnaliser le formulaire de création d’une actualité.
    Formulaire de création d’une actualité Dans le cas d’un document de type actualité, les champs proposés par défaut sont : Date de publication ( personnaliser la date de publication ) (...)

  • Le profil des utilisateurs

    12 avril 2011, par

    Chaque utilisateur dispose d’une page de profil lui permettant de modifier ses informations personnelle. Dans le menu de haut de page par défaut, un élément de menu est automatiquement créé à l’initialisation de MediaSPIP, visible uniquement si le visiteur est identifié sur le site.
    L’utilisateur a accès à la modification de profil depuis sa page auteur, un lien dans la navigation "Modifier votre profil" est (...)

Sur d’autres sites (9578)

  • Node.js readable maximize throughput/performance for compute intense readable - Writable doesn't pull data fast enough

    31 décembre 2022, par flohall

    General setup

    


    I developed an application using AWS Lambda node.js 14.
I use a custom Readable implementation FrameCreationStream that uses node-canvas to draw images, svgs and more on a canvas. This result is then extracted as a raw image buffer in BGRA. A single image buffer contains 1920 * 1080 * 4 Bytes = 8294400 Bytes 8 MB.
This is then piped to stdin of a child_process running ffmpeg.
The highWaterMark of my Readable in objectMode:true is set to 25 so that the internal buffer can use up to 8 MB * 25 = 200 MB.

    


    All this works fine and also doesn't contain too much RAM. But I noticed after some time, that the performance is not ideally.

    


    Performance not optimal

    


    I have an example input that generates a video of 315 frames. If I set highWaterMark to a value above 25 the performance increases to the point, when I set to a value of 315 or above.

    


    For some reason ffmpeg doesn't start to pull any data until highWaterMark is reached. Obviously thats not what I want. ffmpeg should always consume data if minimum 1 frame is cached in the Readable and if it has finished processing the frame before. And the Readable should produce more frames as long highWaterMark isn't reached or the last frame has been reached. So ideally the Readable and the Writeable are busy all the time.

    


    I found another way to improve the speed. If I add a timeout in the _read() method of the Readable after let's say every tenth frame for 100 ms. Then the ffmpeg-Writable will use this timeout to write some frames to ffmpeg.

    


    It seems like frames aren't passed to ffmpeg during frame creation because some node.js main thread is busy ?

    


    The fastest result I have if I increase highWaterMark above the amount of frames - which doesn't work for longer videos as this would make the AWS Lambda RAM explode. And this makes the whole streaming idea useless. Using timeouts always gives me stomach pain. Also depending on the execution on different environments a good fitting timeout might differ. Any ideas ?

    


    FrameCreationStream

    


    import canvas from &#x27;canvas&#x27;;&#xA;import {Readable} from &#x27;stream&#x27;;&#xA;import {IMAGE_STREAM_BUFFER_SIZE, PerformanceUtil, RenderingLibraryError, VideoRendererInput} from &#x27;vm-rendering-backend-commons&#x27;;&#xA;import {AnimationAssets, BufferType, DrawingService, FullAnimationData} from &#x27;vm-rendering-library&#x27;;&#xA;&#xA;/**&#xA; * This is a proper back pressure compatible implementation of readable for a having a stream to read single frames from.&#xA; * Whenever read() is called a new frame is created and added to the stream.&#xA; * read() will be called internally until options.highWaterMark has been reached.&#xA; * then calling read will be paused until one frame is read from the stream.&#xA; */&#xA;export class FrameCreationStream extends Readable {&#xA;&#xA;    drawingService: DrawingService;&#xA;    endFrameIndex: number;&#xA;    currentFrameIndex: number = 0;&#xA;    startFrameIndex: number;&#xA;    frameTimer: [number, number];&#xA;    readTimer: [number, number];&#xA;    fullAnimationData: FullAnimationData;&#xA;&#xA;    constructor(animationAssets: AnimationAssets, fullAnimationData: FullAnimationData, videoRenderingInput: VideoRendererInput, frameTimer: [number, number]) {&#xA;        super({highWaterMark: IMAGE_STREAM_BUFFER_SIZE, objectMode: true});&#xA;&#xA;        this.frameTimer = frameTimer;&#xA;        this.readTimer = PerformanceUtil.startTimer();&#xA;&#xA;        this.fullAnimationData = fullAnimationData;&#xA;&#xA;        this.startFrameIndex = Math.floor(videoRenderingInput.startFrameId);&#xA;        this.currentFrameIndex = this.startFrameIndex;&#xA;        this.endFrameIndex = Math.floor(videoRenderingInput.endFrameId);&#xA;&#xA;        this.drawingService = new DrawingService(animationAssets, fullAnimationData, videoRenderingInput, canvas);&#xA;        console.time("read");&#xA;    }&#xA;&#xA;    /**&#xA;     * this method is only overwritten for debugging&#xA;     * @param size&#xA;     */&#xA;    read(size?: number): string | Buffer {&#xA;&#xA;        console.log("read("&#x2B;size&#x2B;")");&#xA;        const buffer = super.read(size);&#xA;        console.log(buffer);&#xA;        console.log(buffer?.length);&#xA;        if(buffer) {&#xA;            console.timeLog("read");&#xA;        }&#xA;        return buffer;&#xA;    }&#xA;&#xA;    // _read() will be called when the stream wants to pull more data in.&#xA;    // _read() will be called again after each call to this.push(dataChunk) once the stream is ready to accept more data. https://nodejs.org/api/stream.html#readable_readsize&#xA;    // this way it is ensured, that even though this.createImageBuffer() is async, only one frame is created at a time and the order is kept&#xA;    _read(): void {&#xA;        // as frame numbers are consecutive and unique, we have to draw each frame number (also the first and the last one)&#xA;        if (this.currentFrameIndex &lt;= this.endFrameIndex) {&#xA;            PerformanceUtil.logTimer(this.readTimer, &#x27;WAIT   -> READ\t&#x27;);&#xA;            this.createImageBuffer()&#xA;                 .then(buffer => this.optionalTimeout(buffer))&#xA;                // push means adding a buffered raw frame to the stream&#xA;                .then((buffer: Buffer) => {&#xA;                    this.readTimer = PerformanceUtil.startTimer();&#xA;                    // the following two frame numbers start with 1 as first value&#xA;                    const processedFrameNumberOfScene = 1 &#x2B; this.currentFrameIndex - this.startFrameIndex;&#xA;                    const totalFrameNumberOfScene = 1 &#x2B; this.endFrameIndex - this.startFrameIndex;&#xA;                    // the overall frameId or frameIndex starts with frameId 0&#xA;                    const processedFrameIndex = this.currentFrameIndex;&#xA;                    this.currentFrameIndex&#x2B;&#x2B;;&#xA;                    this.push(buffer); // nothing besides logging should happen after calling this.push(buffer)&#xA;                    console.log(processedFrameNumberOfScene &#x2B; &#x27; of &#x27; &#x2B; totalFrameNumberOfScene &#x2B; &#x27; processed - full video frameId: &#x27; &#x2B; processedFrameIndex &#x2B; &#x27; - buffered frames: &#x27; &#x2B; this.readableLength);&#xA;                })&#xA;                .catch(err => {&#xA;                    // errors will be finally handled, when subscribing to frameCreation stream in ffmpeg service&#xA;                    // this log is just generated for tracing errors and if for some reason the handling in ffmpeg service doesn&#x27;t work&#xA;                    console.log("createImageBuffer: ", err);&#xA;                    this.emit("error", err);&#xA;                });&#xA;        } else {&#xA;            // push(null) makes clear that this stream has ended&#xA;            this.push(null);&#xA;            PerformanceUtil.logTimer(this.frameTimer, &#x27;FRAME_STREAM&#x27;);&#xA;        }&#xA;    }&#xA;&#xA;    private optionalTimeout(buffer: Buffer): Promise<buffer> {&#xA;        if(this.currentFrameIndex % 10 === 0) {&#xA;            return new Promise(resolve => setTimeout(() => resolve(buffer), 140));&#xA;        }&#xA;        return Promise.resolve(buffer);&#xA;    }&#xA;&#xA;    // prevent memory leaks - without this lambda memory will increase with every call&#xA;    _destroy(): void {&#xA;        this.drawingService.destroyStage();&#xA;    }&#xA;&#xA;    /**&#xA;     * This creates a raw pixel buffer that contains a single frame of the video drawn by the rendering library&#xA;     *&#xA;     */&#xA;    public async createImageBuffer(): Promise<buffer> {&#xA;&#xA;        const drawTimer = PerformanceUtil.startTimer();&#xA;        try {&#xA;            await this.drawingService.drawForFrame(this.currentFrameIndex);&#xA;        } catch (err: any) {&#xA;            throw new RenderingLibraryError(err);&#xA;        }&#xA;&#xA;        PerformanceUtil.logTimer(drawTimer, &#x27;DRAW   -> FRAME\t&#x27;);&#xA;&#xA;        const bufferTimer = PerformanceUtil.startTimer();&#xA;        // Creates a raw pixel buffer, containing simple binary data&#xA;        // the exact same information (BGRA/screen ratio) has to be provided to ffmpeg, because ffmpeg cannot detect format for raw input&#xA;        const buffer = await this.drawingService.toBuffer(BufferType.RAW);&#xA;        PerformanceUtil.logTimer(bufferTimer, &#x27;CANVAS -> BUFFER&#x27;);&#xA;&#xA;        return buffer;&#xA;    }&#xA;}&#xA;</buffer></buffer>

    &#xA;

    FfmpegService

    &#xA;

    import {ChildProcess, execFile} from &#x27;child_process&#x27;;&#xA;import {Readable} from &#x27;stream&#x27;;&#xA;import {FPS, StageSize} from &#x27;vm-rendering-library&#x27;;&#xA;import {&#xA;    FfmpegError,&#xA;    LOCAL_MERGE_VIDEOS_TEXT_FILE, LOCAL_SOUND_FILE_PATH,&#xA;    LOCAL_VIDEO_FILE_PATH,&#xA;    LOCAL_VIDEO_SOUNDLESS_MERGE_FILE_PATH&#xA;} from "vm-rendering-backend-commons";&#xA;&#xA;/**&#xA; * This class bundles all ffmpeg usages for rendering one scene.&#xA; * FFmpeg is a console program which can transcode nearly all types of sounds, images and videos from one to another.&#xA; */&#xA;export class FfmpegService {&#xA;&#xA;    ffmpegPath: string = null;&#xA;&#xA;&#xA;    constructor(ffmpegPath: string) {&#xA;        this.ffmpegPath = ffmpegPath;&#xA;    }&#xA;&#xA;    /**&#xA;     * Convert a stream of raw images into an .mp4 video using the command line program ffmpeg.&#xA;     *&#xA;     * @param inputStream an input stream containing images in raw format BGRA&#xA;     * @param stageSize the size of a single frame in pixels (minimum is 2*2)&#xA;     * @param outputPath the filepath to write the resulting video to&#xA;     */&#xA;    public imageToVideo(inputStream: Readable, stageSize: StageSize, outputPath: string): Promise<void> {&#xA;        const args: string[] = [&#xA;            &#x27;-f&#x27;,&#xA;            &#x27;rawvideo&#x27;,&#xA;            &#x27;-r&#x27;,&#xA;            `${FPS}`,&#xA;            &#x27;-pix_fmt&#x27;,&#xA;            &#x27;bgra&#x27;,&#xA;            &#x27;-s&#x27;,&#xA;            `${stageSize.width}x${stageSize.height}`,&#xA;            &#x27;-i&#x27;,&#xA;            // input "-" means input will be passed via pipe (streamed)&#xA;            &#x27;-&#x27;,&#xA;            // codec that also QuickTime player can understand&#xA;            &#x27;-vcodec&#x27;,&#xA;            &#x27;libx264&#x27;,&#xA;            &#x27;-pix_fmt&#x27;,&#xA;            &#x27;yuv420p&#x27;,&#xA;            /*&#xA;                * "-movflags faststart":&#xA;                * metadata at beginning of file&#xA;                * needs more RAM&#xA;                * file will be broken, if not finished properly&#xA;                * higher application compatibility&#xA;                * better for browser streaming&#xA;            */&#xA;            &#x27;-movflags&#x27;,&#xA;            &#x27;faststart&#x27;,&#xA;            // "-preset ultrafast", //use this to speed up compression, but quality/compression ratio gets worse&#xA;            // don&#x27;t overwrite an existing file here,&#xA;            // but delete file in the beginning of execution index.ts&#xA;            // (this is better for local testing believe me)&#xA;            outputPath&#xA;        ];&#xA;&#xA;        return this.execFfmpegPromise(args, inputStream);&#xA;    }&#xA;&#xA;    private execFfmpegPromise(args: string[], inputStream?: Readable): Promise<void> {&#xA;        const ffmpegServiceSelf = this;&#xA;        return new Promise(function (resolve, reject) {&#xA;            const executionProcess: ChildProcess = execFile(ffmpegServiceSelf.ffmpegPath, args, (err) => {&#xA;                if (err) {&#xA;                    reject(new FfmpegError(err));&#xA;                } else {&#xA;                    console.log(&#x27;ffmpeg finished&#x27;);&#xA;                    resolve();&#xA;                }&#xA;            });&#xA;            if (inputStream) {&#xA;                // it&#x27;s important to listen on errors of input stream before piping it into the write stream&#xA;                // if we don&#x27;t do this here, we get an unhandled promise exception for every issue in the input stream&#xA;                inputStream.on("error", err => {&#xA;                    reject(err);&#xA;                });&#xA;                // don&#x27;t reject promise here as the error will also be thrown inside execFile and will contain more debugging info&#xA;                // this log is just generated for tracing errors and if for some reason the handling in execFile doesn&#x27;t work&#xA;                inputStream.pipe(executionProcess.stdin).on("error", err => console.log("pipe stream: " , err));&#xA;            }&#xA;        });&#xA;    }&#xA;}&#xA;</void></void>

    &#xA;

  • 9 Ways to Customise Your Matomo Like a Pro

    5 octobre 2022, par Erin

    Matomo is a feature-rich web analytics platform. As such, it has many layers of depth — core features, extra plug-ins, custom dimensions, reports, extensions and integrations. 

    Most of the product elements you see can be personalised and customised to your needs with minimal restrictions. However, this breadth of choice can be overlooked by new users. 

    In this post, we explain how to get the most out of Matomo with custom reports, dashboards, dimensions and even app design. 

    How to customise your Matomo web analytics

    To make major changes to Matomo (e.g., create custom dashboards or install new plugins), you’ll have to be a Matomo Super User (a.k.a. The Admin). Super Users can also grant administrator permissions to others so that more people could customise your Matomo deployment. 

    Most feature-related customisations (e.g. configuring a custom report, adding custom goal tracking, etc.) can be done by all users. 

    With the above in mind, here’s how you can tweak Matomo to better serve your website analytics needs : 

    1. Custom dashboards

    Matomo Customisable Dashboard and Widgets

    Dashboards provide a panorama view of all the collected website statistics. We display different categories of stats and KPIs as separate widgets — a standalone module you can also customise. 

    On your dashboard, you can change the type, position and number of widgets on display. This is an easy way to create separate dashboard views for different projects, clients or team members. Rather than a one-size-fits-all dashboard, a custom dashboard designed for a specific role or business unit will increase data-driven decision-making and efficiency across the business.

    You can create a new dashboard view in a few clicks. Then select a preferred layout — a split-page view or multi columns. Next, populate the new dashboard area with preferred widgets showing :

    Or code a custom widget area to pull specific website stats or other reporting data you need. Once you are done, arrange everything with our drag-and-drop functionality. 

    Matomo Widgets

    Popular feature use cases

    • Personalised website statistics layout for convenient viewing 
    • Simplified analytics dashboards for the line of business leaders/stakeholders 
    • Project- or client-specific dashboards for easy report sharing 

    Read more about customising Matomo dashboards and widget areas

    2. Custom reports

    Matomo Custom Reports

    As the name implies, Custom Reports widget allows you to mesh any of the dimensions and metrics collected by Matomo into a custom website traffic analysis. Custom reports save users time by providing specific data needed in one view so there is no need to jump back and forth between multiple reports or toggle through a report to find data.

    For each custom report, you can select up to three dimensions and then apply additional quantitative measurements (metrics) to drill down into the data.

    For example, if you want to closely observe mobile conversion rates in one market, you can create the following custom report :

    • Dimensions : User Type (registered), Device type (mobile), Location (France)
    • Metrics : Visits, Conversion Rate, Revenue, Avg. Generation Time.

    Custom Report widget is available within Matomo Cloud and as a plugin for Matomo On-Premise.

    &lt;script type=&quot;text/javascript&quot;&gt;<br />
           if ('function' === typeof window.playMatomoVideo){<br />
           window.playMatomoVideo(&quot;custom_reports&quot;, &quot;#custom_reports&quot;)<br />
           } else {<br />
           document.addEventListener(&quot;DOMContentLoaded&quot;, function() { window.playMatomoVideo(&quot;custom_reports&quot;, &quot;#custom_reports&quot;); });<br />
           }<br />
      &lt;/script&gt;

    Popular feature use cases

    • Campaign-specific reporting to better understand the impact of different promo strategies 
    • Advanced event tracking for conversion optimization 
    • Market segmentation reports to analyse different audience cohorts 

    Read more about creating and analysing Custom Reports.

    3. Custom widgets

    Matomo Customisable Widgets

    We realise that our users have different degrees of analytics knowledge. Some love in-depth reporting dimensions and multi-row reporting tables. Others just want to see essential stats. 

    To delight both the pros and the novice users, we’ve created widgets — reporting sub-modules you can add, delete or rearrange in a few clicks. Essentially, a widget is a slice of a dashboard area you can populate with extra information. 

    You can add pre-made custom widgets to Matomo or develop your own widget to display custom reports or even external data (e.g., offline sales volume). At the same time, you can also embed Matomo widgets into other applications (e.g., a website CMS or corporate portal).

    Popular feature use cases

    • Display main goals (e.g., new trial sign-ups) on the main dashboard for greater visibility 
    • Highlight cost-per-conversion reporting by combining goals and conversion data to keep your budgets in check 
    • Run omnichannel eCommerce analytics (with embedded offline sales data) to get a 360-degree view into your operations 

    Read more about creating widgets in Matomo (beginner’s guide)

    4. Custom dimensions 

    Matomo Custom Dimensions

    Dimensions describe the characteristics of reported data. Think of them as “filters” — a means to organise website analytics data by a certain parameter such as “Browser”, “Country”, “Device Type”, “User Type” and many more. 

    Custom Dimensions come in handy for all sorts of segmentation reports. For example, comparing conversion rates between registered and guest users. Or tracking revenue by device type and location. 

    For convenience, we’ve grouped Custom Dimensions in two categories :

    Visit dimensions. These associate metadata about a user with Visitor profiles — a summary of different knowledge you have about your audience. Reports for Visit scoped custom dimensions are available in the Visitors section of your dashboard. 

    Action dimensions. These segment users by specific actions tracked by Matomo such as pageviews, events completion, downloads, form clicks, etc. When configuring Custom Dimensions, you can select among pre-defined action types or code extra action dimensions. Action scoped custom dimensions are available in the Behaviours section of Matomo. 

    Depending on your Matomo version, you can apply 5 – 15 custom dimensions to reports. 

    Important : Since you can’t delete dimensions (only deactivate them), think about your use case first. Custom Dimensions each have their own dedicated reports page on your Matomo dashboard. 

    Popular custom dimension use cases among users :

    • Segmenting reports by users’ screen resolution size to understand how your website performs on different devices
    • Monitor conversion rates for different page types to determine your best-performing assets 

    Read more about creating, tracking and managing Custom Dimensions

    5. Custom scheduled reports

    Manually sending reports can be time consuming, especially if you have multiple clients or provide reports to numerous stakeholders. Custom scheduled reports remove this manual process to improve efficiency and ensure timely distribution of data to relevant users.

    Any report in Matomo (default or custom) can be shared with others by email as a PDF file, HTML content or as an attached CSV document. 

    You can customise which data you want to send to different people — your colleagues, upper management, clients or other company divisions. Then set up the frequency of email dispatches and Matomo will do the rest. 

    Auto-scheduling an email report is easy. Name your report, select a Segment (aka custom or standard report), pick time, file format and sender. 

    Matomo Schedule Reports

    You can also share links to Matomo reports as text messages, if you are using ASPSMS or Clockwork SMS

    Popular feature use cases

    • Convenient stakeholder reporting on key website KPIs 
    • Automated client updates to keep clients informed and reduce workload 
    • Easy data downloads for doing custom analysis with business intelligence tools 

    Read more about email reporting features in Matomo

    6. Custom alerts

    Matomo Custom Alerts

    Custom Alerts is a Matomo plugin for keeping you updated on the most important analytics events. Unlike Custom Reports, which provide a complete or segmented analytics snapshot, alerts are better suited for tracking individual events. For example, significant traffic increases from a specific channel, new 404 pages or major goal achievement (e.g., hitting 1,000 sales in a week). 

    Custom Alerts are a convenient way to keep your finger on the pulse of your site so you can quickly remedy an issue or get updated on reaching a crucial KPI promptly. You can receive custom alerts via email or text message in a matter of minutes.

    To avoid flooding your inbox with alerts, we recommend reserving Custom Alerts for a select few use cases (3 to 5) and schedule custom Email Reports to receive general web page analytics. 

    Popular custom alerts use cases among users :

    • Monitor sudden drops in revenue to investigate the cause behind them and solve any issues promptly 
    • Get notified of traffic spikes or sudden dips to better manage your website’s technical performance 

    Read more about creating and managing Custom Alerts

    7. Goals

    Matomo Customisable Goal Funnels

    Goals feature helps you better understand how your website performs on certain business objectives such as lead generation, online sales or content discovery. A goal is a quantifiable action you want to measure (e.g., a specific page visit, form submission or a file download). 

    When combined together, Goals make up your sales funnel — a series of specific actions you expect users to complete in order to convert. 

    Goals-setting and Funnel Analytics are a powerful, customisable combo for understanding how people navigate your website ; what makes them take action or, on the contrary, lose interest and bounce off. 

    On Matomo, you can simultaneously track multiple goals, monitor multiple conversions per one visit (e.g., when one user requests two content downloads) and assign revenue targets to specific goals.

    &lt;script type=&quot;text/javascript&quot;&gt;<br />
           if ('function' === typeof window.playMatomoVideo){<br />
           window.playMatomoVideo(&quot;goals&quot;, &quot;#goals&quot;)<br />
           } else {<br />
           document.addEventListener(&quot;DOMContentLoaded&quot;, function() { window.playMatomoVideo(&quot;goals&quot;, &quot;#goals&quot;); });<br />
           }<br />
      &lt;/script&gt;

    Separately, Matomo Cloud users also get access to a premium Funnels feature and Multi Channel Conversion Attribution. On-Premises Matomo users can get both as paid plugins via our Marketplace.

    Popular goal tracking use cases among users :

    • Tracking newsletter subscription to maximise subscriber growth 
    • Conversion tracking for gated content (e.g., eBooks) to understand how each asset performs 
    • Analysing the volume of job applications per post to better interpret your HR marketing performance 

    Read more about creating and managing Goals in Matomo.

    8. Themes

    Matomo On-Premise Customisable Themes

    Want to give your Matomo app a distinctive visual flair ? Pick a new free theme for your On-Premises installation. Minimalistic, dark or classic — our community created six different looks that other Matomo users can download and install in a few clicks. 

    If you have some HTML/CSS/JS knowledge, you can also design your own Matomo theme. Since Matomo is an open-source project, we don’t restrict interface customisation and always welcome creativity from our users.

    Read more about designing your own Matomo theme (developer documentation).

    9. White labelling

    Matomo white label options

    Matomo is one of the few website analytics tools to support white labelling. White labelling means that you can distribute our product to others under your brand. 

    For example, as a web design agency, you can delight customers with pre-installed GDPR-friendly website analytics. Marketing services providers, in turn, can present their clients with embedded reporting widgets, robust funnel analytics and 100% unsampled data. 

    Apart from selecting a custom theme, you can also align Matomo with your brand by :

    • Customising product name
    • Using custom header/font colours 
    • Change your tracking endpoint
    • Remove links to Matomo.org

    To streamline Matomo customisation and set-up, we developed a White Label plug-in. It provides a convenient set of controls for changing your Matomo deployment and distributing access rights to other users or sharing embedded Matomo widgets). 

    Read more about white labelling Matomo

    Learning more about Matomo 

    Matomo has an ever-growing list of features, ranging from standard website tracking controls to unique conversion rate optimisation tools (heatmaps, media analytics, user cohorts and more).

    To learn more about Matomo features you can check our free video web analytics training series where we cover the basics. For feature-specific tips, tricks and configurations, browse our video content or written guides

  • WordPress Analytics plugin WP-Piwik reaches version 1.0.0 (and 50,000 active users)

    29 mai 2015, par André Bräkling — Plugins

    After six years of development, we are proud to announce the 1.0.0 release of our WP-Piwik WordPress plugin !

    Started as a simple plugin to show a selection of statistics within the WordPress dashboard, WP-Piwik has become a full Piwik integration plugin. The plugin automatically adds the Piwik tracking code to your WordPress sites. The plugin displays your analytics reports directly within the WordPress admin panel. WordPress networks (“multisite”), CDN URLs and the Piwik proxy script are also supported.

    According to WordPress.org the plugin is being used by more than 50,000 WordPress sites !

    This article explains how to install WP-Piwik and how to configure it to work with your Piwik instance.

    Install WP-Piwik

    You can get WP-Piwik using WordPress’ plugin management. Login to your WordPress admin dashboard and go to « Plugins » → « Add New ». Enter « WP-Piwik » into the search field at the top right, press enter and next to WP-Piwik choose « Install Now ».

    If you want to use WP-Piwik in your simple WordPress blog you can just click « Activate Plugin » and WP-Piwik will ask you to configure your Piwik connection.

    Running a WordPress network/multisite you can choose to « Network Activate » the plugin after the installation process. In this case, WP-Piwik will be a fully automated feature of your WordPress network automatically tracking your sites in the same Piwik instance in separate Websites.

    Alternatively you can download WP-Piwik manually from the WordPress website and upload all files to your `wp-content/plugins` directory.

    Configure your Piwik connection

    WP-Piwik lets you choose between three connection modes :

    • Self-hosted (HTTP API) : This is the default option for a self-hosted Piwik and should work for most configurations. You just have to know your Piwik URL, which is the URL you enter to access Piwik, and your auth token (see below). WP-Piwik will connect to Piwik using http(s)-requests.
    • Self-hosted (PHP API) : Choose this, if your self-hosted Piwik and WordPress are running on the same machine and you know the full server path to your Piwik instance. Beside the full server path, you also need to know your auth token (see below).
    • Cloud-hosted (Piwik Pro) : If you are using a cloud-hosted Piwik by Piwik Pro, you just need to know your user name and your auth token (see below).

    Setting up WP-Piwik

    To configure WP-Piwik you will need to specify your Authentication token.

    • If the site you want to track in Piwik is already configured in your Piwik, you only need to specify a token_auth for a user with `view` permission.
    • If you want WP-Piwik to create the website in Piwik (or if you use WP-Piwik in network mode which requires to be able to configure your sites), you should specify a token_auth which has Super User access (after the setting up phase is completed you can set the authentication token back to the token of a `view` user).

    To find your token_auth in Piwik, click on your user name in the right right corner of your Piwik dashboard, then click the « API » in the left menu. The API page displays your auth token in a colored box, just behind the “&token_auth=” string. The screenshot below shows the token_auth anonymous, but your real one will be an alpha numerous random string like a1ec31524a8eabc7a546d71d68b28d17.

    That’s it. After you entered your connection data and submitted the form, WP-Piwik will welcome you with some information :

    You can now start to configure WP-Piwik and enable the tracking code. Learn about any setting by clicking on the small question mark sign. If you have any problem configuring or using WP-Piwik feel free to use the WordPress support forum related to WP-Piwik.

    Translating WP-Piwik

    We invite you to join our translation community at Transifex and help to translate WP-Piwik in more languages !

    Happy WordPress Analytics !