Recherche avancée

Médias (91)

Autres articles (84)

  • L’espace de configuration de MediaSPIP

    29 novembre 2010, par

    L’espace de configuration de MediaSPIP est réservé aux administrateurs. Un lien de menu "administrer" est généralement affiché en haut de la page [1].
    Il permet de configurer finement votre site.
    La navigation de cet espace de configuration est divisé en trois parties : la configuration générale du site qui permet notamment de modifier : les informations principales concernant le site (...)

  • HTML5 audio and video support

    13 avril 2011, par

    MediaSPIP uses HTML5 video and audio tags to play multimedia files, taking advantage of the latest W3C innovations supported by modern browsers.
    The MediaSPIP player used has been created specifically for MediaSPIP and can be easily adapted to fit in with a specific theme.
    For older browsers the Flowplayer flash fallback is used.
    MediaSPIP allows for media playback on major mobile platforms with the above (...)

  • Support audio et vidéo HTML5

    10 avril 2011

    MediaSPIP utilise les balises HTML5 video et audio pour la lecture de documents multimedia en profitant des dernières innovations du W3C supportées par les navigateurs modernes.
    Pour les navigateurs plus anciens, le lecteur flash Flowplayer est utilisé.
    Le lecteur HTML5 utilisé a été spécifiquement créé pour MediaSPIP : il est complètement modifiable graphiquement pour correspondre à un thème choisi.
    Ces technologies permettent de distribuer vidéo et son à la fois sur des ordinateurs conventionnels (...)

Sur d’autres sites (10260)

  • How can use ffmpeg in AWS Lambda to clip hls trasnsimision to .mp4

    15 novembre 2024, par Bruno Munné

    The ffmpeg input is through the public url of the bucket, I want to save the output in a tmp.mp4 file and I want to upload this file to the bucket. Locally the ffmpeg command works perfectly, lasting no more than 3 seconds and the output file weighs less than 1MB

    


    export const handler = async (event) => {
    try {
        const { m3u8, offset, duration, signedURL } = event;

        const clipKey = `clip_output.mp4`;
        const clipFilePath = path.join('/tmp', clipKey);

        execSync(`/opt/ffmpeglib/ffmpeg -i ${process.env.URL_CLOUDFLARE}/${m3u8} -ss ${offset} -t ${duration} -c copy -f mp4 ${clipFilePath}`)

        const fileContent = fs.readFileSync(clipFilePath);
        const resSign = await fetch(signedURL, {
            method: "PUT",
            headers: {
                "Content-Type": "application/octet-stream",
            },
            body: fileContent,
        });

        if (!resSign.ok) throw new Error(`Failed to upload file to S3: ${resSign.statusText}`);

        fs.unlinkSync(clipFilePath);

        return {
            statusCode: 200,
            body: JSON.stringify({
                message: 'Clip procesado y subido correctamente',
                clipKey: path.basename(clipFilePath)
            }),
        };
    } catch (error) {
        console.error("Error al procesar el clip:", error);
        return {
            statusCode: 500,
            body: JSON.stringify({ error: error.message }),
        };
    }
};


    


    The error it shows me is the following

    


     at genericNodeError (node:internal/errors:984:15)&#xA;    at wrappedFn (node:internal/errors:538:14)&#xA;    at checkExecSyncError (node:child_process:891:11)&#xA;    at execSync (node:child_process:963:15)&#xA;    at Runtime.handler (file:///var/task/index.js:16:3)&#xA;    at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1173:29) {&#xA;  status: null,&#xA;  signal: &#x27;SIGSEGV&#x27;,&#xA;  output: [&#xA;    null,&#xA;    <buffer>,&#xA;    <buffer 66="66" 6d="6d" 70="70" 65="65" 67="67" 20="20" 76="76" 72="72" 73="73" 69="69" 6f="6f" 6e="6e" 4e="4e" 2d="2d" 37="37" 31="31" 30="30" 36="36" 34="34" 64="64" 35="35" 33="33" 63="63" 74="74" 61="61" 68="68" 3a="3a" 2f="2f" 1194="1194" more="more" bytes="bytes">&#xA;  ],&#xA;  pid: 13,&#xA;  stdout: <buffer>,&#xA;  stderr: <buffer 66="66" 6d="6d" 70="70" 65="65" 67="67" 20="20" 76="76" 72="72" 73="73" 69="69" 6f="6f" 6e="6e" 4e="4e" 2d="2d" 37="37" 31="31" 30="30" 36="36" 34="34" 64="64" 35="35" 33="33" 63="63" 74="74" 61="61" 68="68" 3a="3a" 2f="2f" 1194="1194" more="more" bytes="bytes">&#xA;}&#xA;ffmpeg version N-71064-gd5e603ddc0-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2024 the FFmpeg developers&#xA;built with gcc 8 (Debian 8.3.0-6)&#xA;configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg&#xA;libavutil      59. 27.100 / 59. 27.100&#xA;libavcodec     61.  9.100 / 61.  9.100&#xA;libavformat    61.  4.100 / 61.  4.100&#xA;libavdevice    61.  2.100 / 61.  2.100&#xA;libavfilter    10.  2.102 / 10.  2.102&#xA;libswscale      8.  2.100 /  8.  2.100&#xA;libswresample   5.  2.100 /  5.  2.100&#xA;libpostproc    58.  2.100 / 58.  2.100&#xA;END RequestId: 2fc8c51e-66c6-4c74-aa9c-fa10c11207a0&#xA;REPORT RequestId: 2fc8c51e-66c6-4c74-aa9c-fa10c11207a0  Duration: 164.82 ms Billed Duration: 165 ms Memory Size: 2048 MB    Max Memory Used: 88 MB  Init Duration: 185.19 ms&#xA;</buffer></buffer></buffer></buffer>

    &#xA;

    Help to resolve it please

    &#xA;

  • Error : Output format mp4 is not available

    12 avril 2024, par alpaca pwaa

    I'm using fluent-ffmpeg in my nextjs application, I'm trying to process the video and specified a format to stream on my s3 bucket but it keeps on failing. My terminal keeps on throwing "Error : Error : Output format mp4 is not available". I already verify my ffmpeg format "ffmpeg -format" and confirm that it supports encoding and decoding mp4 files. I've already tried solutions from other forums but it's not working for me.

    &#xA;

    createVideo: privateProcedure&#xA;    .input(&#xA;      z.object({&#xA;        fileId: z.string(),&#xA;      })&#xA;    )&#xA;    .mutation(async ({ ctx, input }) => {&#xA;      const { getUser } = getKindeServerSession();&#xA;      const user = await getUser();&#xA;&#xA;      if (!user || !user.id || !user.email) {&#xA;        throw new TRPCError({ code: "UNAUTHORIZED" });&#xA;      }&#xA;&#xA;      const dbUser = await db.user.findFirst({&#xA;        where: {&#xA;          id: user.id,&#xA;        },&#xA;      });&#xA;&#xA;      if (!dbUser) {&#xA;        throw new TRPCError({&#xA;          code: "UNAUTHORIZED",&#xA;          message: "User not found in the database.",&#xA;        });&#xA;      }&#xA;&#xA;      const putObjectCommand = new PutObjectCommand({&#xA;        Bucket: process.env.AWS_BUCKET_NAME!,&#xA;        Key: generateFileName(),&#xA;      });&#xA;&#xA;      const s3 = new S3Client({&#xA;        region: process.env.AWS_BUCKET_REGION!,&#xA;        credentials: {&#xA;          accessKeyId: process.env.AWS_ACCESS_KEY!,&#xA;          secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,&#xA;        },&#xA;      });&#xA;&#xA;      const singedURL = await getSignedUrl(s3, putObjectCommand, {&#xA;        expiresIn: 60,&#xA;      });&#xA;&#xA;      const ffmpeg = require("fluent-ffmpeg");&#xA;      const passthroughStream = new PassThrough();&#xA;&#xA;      ffmpeg({ source: "./template1.mp4" })&#xA;        .on("end", async () => {&#xA;          console.log("Job done");&#xA;          await uploadToS3(passthroughStream);&#xA;        })&#xA;        .on("error", (error: string) => {&#xA;          console.error("Error:", error);&#xA;          throw new Error("Error processing video");&#xA;        })&#xA;        .videoFilter({&#xA;          filter: "drawtext",&#xA;          options: {&#xA;            text: "hi",&#xA;            fontsize: 24,&#xA;            fontcolor: "white",&#xA;            x: "(w-text_w)/2",&#xA;            y: "(h-text_h)/2",&#xA;            box: 1,&#xA;            boxcolor: "black@0.5",&#xA;            boxborderw: 5,&#xA;            fontfile: "/Windows/fonts/calibri.ttf",&#xA;          },&#xA;        })&#xA;        .videoCodec("libx264")&#xA;        .outputFormat("mp4")&#xA;        .outputOptions(["-movflags frag_keyframe&#x2B;empty_moov"])&#xA;        .pipe(passthroughStream, { end: true });&#xA;&#xA;      const uploadToS3 = async (stream: PassThrough) => {&#xA;        const upload = new Upload({&#xA;          client: s3,&#xA;          params: {&#xA;            Bucket: process.env.AWS_BUCKET_NAME!,&#xA;            Key: generateFileName(),&#xA;            Body: stream,&#xA;          },&#xA;        });&#xA;        await upload.done();&#xA;      };&#xA;&#xA;      await new Promise((resolve, reject) => {&#xA;        passthroughStream.on("end", resolve);&#xA;        passthroughStream.on("error", reject);&#xA;      });&#xA;&#xA;      const createdVideo = await db.video.create({&#xA;        data: {&#xA;          name: "Test Name",&#xA;          url: singedURL.split("?")[0],&#xA;          key: singedURL,&#xA;          fileId: input.fileId,&#xA;        },&#xA;      });&#xA;&#xA;      return createdVideo;&#xA;    }),&#xA;

    &#xA;

    Here's the ffmpeg log.

    &#xA;

    ffmpeg started on 2024-04-11 at 20:58:56&#xA;Report written to "ffmpeg-20240411-205856.log"&#xA;Log level: 48&#xA;Command line:&#xA;"C:\\ProgramData\\chocolatey\\lib\\ffmpeg-full\\tools\\ffmpeg\\bin\\ffmpeg.exe" -i ./template1.mp4 -filter:v "drawtext=text=hi:fontsize=24:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:box=1:boxcolor=black@0.5:boxborderw=5:fontfile=/Windows/fonts/calibri.ttf" -report pipe:1&#xA;ffmpeg version 7.0-full_build-www.gyan.dev Copyright (c) 2000-2024 the FFmpeg developers&#xA;  built with gcc 13.2.0 (Rev5, Built by MSYS2 project)&#xA;  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libxevd --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxeve --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2 --enable-d3d11va --enable-d3d12va --enable-f  libavutil      59.  8.100 / 59.  8.100&#xA;  libavcodec     61.  3.100 / 61.  3.100&#xA;  libavformat    61.  1.100 / 61.  1.100&#xA;  libavdevice    61.  1.100 / 61.  1.100&#xA;  libavfilter    10.  1.100 / 10.  1.100&#xA;  libswscale      8.  1.100 /  8.  1.100&#xA;  libswresample   5.  1.100 /  5.  1.100&#xA;  libpostproc    58.  1.100 / 58.  1.100&#xA;Splitting the commandline.&#xA;Reading option &#x27;-i&#x27; ... matched as input url with argument &#x27;./template1.mp4&#x27;.&#xA;Reading option &#x27;-filter:v&#x27; ... matched as option &#x27;filter&#x27; (apply specified filters to audio/video) with argument &#x27;drawtext=text=hi:fontsize=24:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:box=1:boxcolor=black@0.5:boxborderw=5:fontfile=/Windows/fonts/calibri.ttf&#x27;.&#xA;Reading option &#x27;-report&#x27; ... matched as option &#x27;report&#x27; (generate a report) with argument &#x27;1&#x27;.&#xA;Reading option &#x27;pipe:1&#x27; ... matched as output url.&#xA;Finished splitting the commandline.&#xA;Parsing a group of options: global .&#xA;Applying option report (generate a report) with argument 1.&#xA;Successfully parsed a group of options.&#xA;Parsing a group of options: input url ./template1.mp4.&#xA;Successfully parsed a group of options.&#xA;Opening an input file: ./template1.mp4.&#xA;[AVFormatContext @ 00000262cd0888c0] Opening &#x27;./template1.mp4&#x27; for reading&#xA;[file @ 00000262cd0a94c0] Setting default whitelist &#x27;file,crypto,data&#x27;&#xA;[mov,mp4,m4a,3gp,3g2,mj2 @ 00000262cd0888c0] Format mov,mp4,m4a,3gp,3g2,mj2 probed with size=2048 and score=100&#xA;[mov,mp4,m4a,3gp,3g2,mj2 @ 00000262cd0888c0] ISO: File Type Major Brand: isom&#xA;[mov,mp4,m4a,3gp,3g2,mj2 @ 00000262cd0888c0] Unknown dref type 0x206c7275 size 12&#xA;[mov,mp4,m4a,3gp,3g2,mj2 @ 00000262cd0888c0] Processing st: 0, edit list 0 - media time: 1024, duration: 126981&#xA;[mov,mp4,m4a,3gp,3g2,mj2 @ 00000262cd0888c0] Offset DTS by 1024 to make first pts zero.&#xA;[mov,mp4,m4a,3gp,3g2,mj2 @ 00000262cd0888c0] Setting codecpar->delay to 2 for stream st: 0&#xA;[mov,mp4,m4a,3gp,3g2,mj2 @ 00000262cd0888c0] Before avformat_find_stream_info() pos: 6965 bytes read:32768 seeks:0 nb_streams:1&#xA;[h264 @ 00000262cd0bb140] nal_unit_type: 7(SPS), nal_ref_idc: 3&#xA;[h264 @ 00000262cd0bb140] Decoding VUI&#xA;[h264 @ 00000262cd0bb140] nal_unit_type: 8(PPS), nal_ref_idc: 3&#xA;[h264 @ 00000262cd0bb140] nal_unit_type: 7(SPS), nal_ref_idc: 3&#xA;[h264 @ 00000262cd0bb140] Decoding VUI&#xA;[h264 @ 00000262cd0bb140] nal_unit_type: 8(PPS), nal_ref_idc: 3&#xA;[h264 @ 00000262cd0bb140] Decoding VUI&#xA;[h264 @ 00000262cd0bb140] nal_unit_type: 6(SEI), nal_ref_idc: 0&#xA;[h264 @ 00000262cd0bb140] nal_unit_type: 7(SPS), nal_ref_idc: 3&#xA;[h264 @ 00000262cd0bb140] nal_unit_type: 8(PPS), nal_ref_idc: 3&#xA;[h264 @ 00000262cd0bb140] nal_unit_type: 5(IDR), nal_ref_idc: 3&#xA;[h264 @ 00000262cd0bb140] Decoding VUI&#xA;[h264 @ 00000262cd0bb140] Format yuv420p chosen by get_format().&#xA;[h264 @ 00000262cd0bb140] Reinit context to 1088x1920, pix_fmt: yuv420p&#xA;[h264 @ 00000262cd0bb140] no picture &#xA;[mov,mp4,m4a,3gp,3g2,mj2 @ 00000262cd0888c0] All info found&#xA;[mov,mp4,m4a,3gp,3g2,mj2 @ 00000262cd0888c0] After avformat_find_stream_info() pos: 82242 bytes read:82242 seeks:0 frames:1&#xA;Input #0, mov,mp4,m4a,3gp,3g2,mj2, from &#x27;./template1.mp4&#x27;:&#xA;  Metadata:&#xA;    major_brand     : isom&#xA;    minor_version   : 512&#xA;    compatible_brands: isomiso2avc1mp41&#xA;    encoder         : Lavf58.76.100&#xA;  Duration: 00:00:08.27, start: 0.000000, bitrate: 3720 kb/s&#xA;  Stream #0:0[0x1](und), 1, 1/15360: Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1080x1920, 3714 kb/s, 30 fps, 30 tbr, 15360 tbn (default)&#xA;      Metadata:&#xA;        handler_name    : VideoHandler&#xA;        vendor_id       : [0][0][0][0]&#xA;Successfully opened the file.&#xA;Parsing a group of options: output url pipe:1.&#xA;Applying option filter:v (apply specified filters to audio/video) with argument drawtext=text=hi:fontsize=24:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:box=1:boxcolor=black@0.5:boxborderw=5:fontfile=/Windows/fonts/calibri.ttf.&#xA;Successfully parsed a group of options.&#xA;Opening an output file: pipe:1.&#xA;[AVFormatContext @ 00000262cd0b2240] Unable to choose an output format for &#x27;pipe:1&#x27;; use a standard extension for the filename or specify the format manually.&#xA;[out#0 @ 00000262cd0bb300] Error initializing the muxer for pipe:1: Invalid argument&#xA;Error opening output file pipe:1.&#xA;Error opening output files: Invalid argument&#xA;[AVIOContext @ 00000262cd0a9580] Statistics: 82242 bytes read, 0 seeks&#xA;

    &#xA;

    I should be able to stream the processed video to my s3, but it keeps on throwing "Error : Error : Output format mp4 is not available"

    &#xA;

  • CRO Testing : The 6-Steps for Maximising Conversion Rates

    10 mars 2024, par Erin

    It’s a nightmare every marketing manager faces. Traffic is soaring after you’ve launched new digital marketing campaigns, but conversions have barely moved.

    Sound familiar ?

    The good news is you’re not alone — loads of marketing managers struggle to get potential customers to purchase. The better news is that you can test dozens of strategies to turn around your site’s fortunes. 

    Conversion rate optimisation testing (CRO testing for short) is the name for this kind of experimentation — and it can send conversion rates and revenue soaring.

    In this article, we’ll explain CRO testing and how you can start doing it today using Matomo. 

    What is CRO Testing ? 

    CRO testing is optimising your site’s conversion funnel using a series of experiments designed to improve conversion rates.

    A CRO test can take several forms, but it usually involves changing one or more elements of your landing page. It looks something like this :

    1. You hypothesise what you expect to happen.
    2. You then run an A/B test using a dedicated CRO platform or tool.
    3. This tool will divide your site’s traffic, sending one segment to one variation and the other segment to another.
    4. The CRO tool will measure conversions, track statistical significance, and declare one variation the winner. 

    A CRO tool isn’t the only software you can use to gather data when running tests. There are several other valuable data sources, including :

    • A web analytics platform : to identify issues with your website
    • User surveys : to find out what your target audience thinks about your site
    • Heatmaps : to learn where users focus their attention
    • Session recordings : to discover how visitors browse your site

    Use as many of these features, tools, and methods as you can when brainstorming hypotheses and measuring results. After all, your CRO test is only as good as your data.

    On that note, we need to mention the importance of data accuracy when researching issues with your website and running CRO tests. If you trust a platform like Google Analytics that uses data sampling (where only a subset of data is analysed), then there’s a risk you make business decisions based on inaccurate reports.

    In practice, that could see you overestimate the effectiveness of a landing page, potentially wasting thousands in ad spend on poorly converting pages. 

    That’s why over a million websites rely on Matomo as their web analytics solution—it doesn’t sample data, providing 100% accurate website traffic insights you can trust to make informed decisions.

    Try Matomo for Free

    Get the web insights you need, without compromising data accuracy.

    No credit card required

    Types of CRO Testing 

    There are three core types of CRO tests :

    A/B testing

    A/B testing, or split testing, is when you test two versions of the same page against each other. Usually, the two pages have only one difference, such as a new headline or a different CTA. 

    An A/B test setup in Matomo

    In the test above, for example, we test what happens if we remove one of the affiliate links from a page. We hypothesise that conversions won’t change because these links aren’t effective.

    A/B/n testing

    A/B/n testing is when you test multiple variations of the same element on the same page. 

    Rather than just testing one headline against another, for example, you test multiple different headlines at once.

    A screenshot of A/B test results run using Matomo

    In the test above in Matomo, we’re testing a website’s original header against a wider and smaller version. It turns out the wider header converts significantly better. 

    Multivariate testing

    In a multivariate CRO test, you test multiple different elements at the same time. That could mean testing combining a different headline, CTA button, and image. 

    Multivariate testing can save time because you test multiple elements at once and find the best combination of elements. But you’ll usually need a lot of traffic to find a statistically significant result.

    Why is CRO testing important ?

    Who doesn’t want more conversions, right ? Improving your conversion rate is the core benefit of running a CRO test, but there are a couple of other reasons you should do it, too :

    Why Is CRO Testing Important?

    Improve conversion rates

    How well does your website convert visitors ? The average conversion rate of a typical website is 2.35%, but better-performing websites have significantly higher conversion rates. The top 25% of websites across all industries convert at a rate of 5.31% or higher.

    CRO testing is the best way to improve your site’s conversion rate by tweaking elements of your website and implementing the best results. And because it’s based on data, not your intuition, you’re likely to identify changes that move the needle. 

    Optimise the user experience

    CRO tests are also a great way to improve your site’s user experience. The process of CRO testing forces you to understand how users navigate your website using heatmaps and session recordings and fix the issues they face. 

    You could simplify your form fields to make them easier to fill in, for example, or make your pages easier to navigate. In both cases, your actions will also increase conversion rates.

    Decrease acquisition costs

    Improving your conversion rate using CRO testing will usually mean a decrease in customer acquisition costs and other conversion metrics

    After all, if the cost of your PPC ads stays the same but you convert more traffic, then each new customer will cost less to acquire.

    How to do CRO testing in 6 steps 

    Ready to get your hands dirty ? Follow these six steps to set up your first CRO test :

    Have a clear goal

    Don’t jump straight into testing. You need to be clear about what you want to achieve ; otherwise, you risk wasting time on irrelevant experiments. 

    If you’re unsure what to focus on, look back through your web analytics data and other tools like heatmaps, form analytics, and session recordings to get a feel for some of your site’s biggest conversion roadblocks. 

    Maybe there’s a page with a much lower conversion rate, for example — or a form that most users fail to complete. 

    If it’s the former, then your goal could be to increase the conversion rate of this specific landing page by 25%, bringing it in line with your site’s average. 

    The Goals dashboard in Matomo

    Make sure your new conversion goal is set up properly in your website analytics platform, too. This will ensure you’re tracking conversions accurately. 

    Set a hypothesis

    Now you’ve got a goal, it’s time to create a hypothesis. Based on your available research, a hypothesis is an assumption you make about your conversion rate optimisation test.

    A heatmap of your poorly converting landing page may show that users aren’t focusing on your CTA button because it’s hidden below the fold. 

    You could hypothesise that by placing the CTA button directly under your headline above the fold, your conversion rate should increase. 

    Whatever your goal, you can use the following template to write a hypothesis :

    If we [make this specific change], then [this specific outcome] will occur because [reason].

    Design your test elements

    Most marketing managers won’t be able to run CRO tests independently. A team of talented experts must create the assets you need for a successful experimentation. This includes designers, copywriters, and web developers. 

    Don’t just have them create one new element at a time. Accelerate the process by having your team create dozens of designs simultaneously. That way, you can run a new CRO test as soon as your current test has finished. 

    Create and launch the test

    It’s time to launch your test. Use a CRO tool to automate building your test and tracking results. 

    With Matomo’s A/B Testing feature, it’s as easy as giving your test a name, writing a hypothesis and description, and uploading the URLs of your page variants.

    How to create a new A/B test in Matomo

    Matomo handles everything else, giving you a detailed breakdown at the end of the test with the winning variant. 

    Try Matomo for Free

    Get the web insights you need, without compromising data accuracy.

    No credit card required

    Analyse the results

    You can only review the results of your CRO test once it has reached statistical significance — which means the observed outcome isn’t the result of chance.

    In the same way you wouldn’t say a die is unbiased after three rolls, you need thousands of visitors to see your landing pages and take action before deciding which is better. 

    Luckily, most CRO testing platforms, including Matomo, will highlight when a test reaches statistical significance. That means you only need to look at the result to see if your hypothesis is correct. 

    Implement and repeat

    Was your test a success ? Great, you can implement the results and test a new element. 

    Yep, that’s right. There’s no time to rest on your laurels. Continuous CRO testing is necessary to squeeze every conversion possible from your website. Just like fashion trends, website effectiveness changes over time. What works today might not work tomorrow, making ongoing CRO testing beneficial and necessary.

    That’s why it’s a good idea to choose a CRO testing platform like Matomo with no data limits.

    Try Matomo for Free

    Get the web insights you need, without compromising data accuracy.

    No credit card required

    CRO testing examples you can run today 

    There’s no shortage of CRO tests you can run. Here are some experiments to get started with :

    Change your CTA design and copy

    Calls to action (CTAs) are the best elements to optimise during your first CRO test. You can change many things about them ; even the smallest optimisation can have a huge impact. 

    Just take a look at the image below to see how diverse your CTAs could be :

    A range of different CTA buttons

    Changing your CTA’s copy is a great place to start, especially if you have generic instructions like “Apply Now.”

    Try a more specific instruction like “Download your free trial” or “Buy now to get 30% off.” Or test benefit-led instructions like “Reduce your ad spend today” or “Take back control of your data.”

    Changing the colour of your CTAs can also yield more conversions. Bright colours are always a good bet. Just make sure your button stands out from the rest of your page. 

    Move the CTA button placement

    The placement of your CTA can be just as important as its copy or colour. If it’s down at the bottom of your page, there’s a good chance most of your visitors will miss it. 

    Try moving it above the fold to see if that makes a difference. Then, test multiple CTA buttons as opposed to just one. 

    Heatmaps and session recordings can identify whether this test is worthwhile. If users rarely focus on your CTA or just don’t scroll far enough to find it, then it’s a good bet you could see an uptick in conversions by moving it. 

    Try different headlines

    Your website’s headlines are another great place to start CRO testing. These are usually the first (and sometimes only) things visitors read, so optimising them as much as possible makes sense. 

    There are entire books written about creating persuasive headlines, but start with one of the following tactics :

    • Include a benefit
      • “Achieve radiant skin—discover the secret !”
    • Add numbers
      • “3 foolproof methods for saving money on your next vacation”
    • Using negative words instead of positive ones
      • “Avoid these 7 mistakes to unlock your potential for personal growth”
    • Shortening or lengthening your headline
      • Shortened : “Crush your fitness goals : Expert tips for success”
      • Lengthened : “Embark on your fitness journey : Learn from experts with proven tips to crush your wellness goals”

    Add more trust signals

    Adding trust signals to your website, such as brand logos, customer reviews, and security badges, can increase your conversion rate.

    We use it at Matomo by adding the logos of well-known clients like the United Nations and Amnesty International underneath our CTAs.

    Trust signals on the Matomo website

    It’s incredibly effective, too. Research by Edelman finds that trust is among the top three most important buying decision factors, above brand likeability.

    Start CRO testing with Matomo

    CRO testing is a data-backed method to improve your site’s conversion rate, making it more user-friendly and decreasing customer acquisition costs. Even a small improvement will be worth the cost of the tools and your time. 

    Fortunately, there’s no need to allocate hundreds of dollars monthly for multiple specialised testing tools. With Matomo, you get a comprehensive platform offering web analytics, user behaviour insights, and CRO testing – all conveniently bundled into one solution. Matomo’s pricing starts from just $19 per month, making it accessible to businesses of all sizes.

    Plus, rest assured knowing that you are GDPR compliant and the data provided is 100% accurate, ethically empowering you to make informed decisions with confidence.

    Take the first step on your CRO testing journey by trying Matomo free for 21 days ; no credit card required.