[{"data":1,"prerenderedAt":232},["ShallowReactive",2],{"seo-verification":3,"blog-black-friday-2026-online-store-handling-the-load-en":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-black-friday-2026-online-store-handling-the-load-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":29,"intro":32,"sections":33,"ctaTitle":173,"ctaBody":174,"ctaButton":175,"ctaUrl":176,"relatedPosts":177},554,"black-friday-2026-online-store-handling-the-load",{"fr":12,"en":10,"ar":13,"es":14},"black-friday-2026-boutique-en-ligne-tenir-la-charge","بلاك-فرايداي-2026-متجر-إلكتروني-تحمل-الضغط","black-friday-2026-tienda-online-aguantar-la-carga","Black Friday 2026: keeping your online store up under load","Change freeze, a k6 load test, cache, database and a fallback plan: the dated checklist to reach the late-November peak knowing your store's real limit.",13,0,false,"2026-11-01T00:00:00+00:00","2026-11-01T14:14:31+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},3,"Deployment","deploiement","bg-success\u002F10 text-success",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fblack-friday-2026-boutique-en-ligne-tenir-la-charge-poster.svg","A store that goes down during Black Friday loses sales that no follow-up email wins back, at the moment visitors are most numerous. A server cannot be guessed: it is measured on a copy, with free tools, by reading the peak and not the average. This article gives a four-week calendar, a repeatable load test with k6, the cache and database settings to check, and a fallback plan to write before the peak. No capacity is promised: your own measurement gives your store's limit.",[34,38,48,51,83,111,114,145,148,151,155,158,161,170],{"type":35,"title":36,"body":37},"h2","The peak is a date, and so is the preparation","Black Friday falls the day after Thanksgiving, which US federal law sets on the fourth Thursday of November. In 2026 that gives Thursday 26 November for Thanksgiving, Friday 27 November for Black Friday and Monday 30 November for Cyber Monday. These dates are calculated from that rule: cross-check them with your market's retail calendar, which may start or extend its own promotions.\n\nFour weeks remain at the date of this article. That is enough to freeze, measure and fix, not enough to rebuild everything. The goal is therefore not the biggest possible server, but to learn your server's limit before traffic finds it for you, then to decide in advance what you do if it is reached.",{"type":39,"title":40,"items":41},"ul","What takes a store down during the peak",[42,43,44,45,46,47],"**A cache that only serves anonymous visitors** — as soon as a cart or session cookie is present, the page is rebuilt by PHP and the database on every request.","**SQL queries that are tolerable at low traffic** — a slow query bothers nobody with five visitors. With two hundred at once, it holds connections and makes every following request wait.","**Too many PHP processes for the available memory** — each process uses RAM.","**A last-minute change** — an extension, a theme or a badly configured promo code pushed the day before. It is the most avoidable cause, and the freeze removes it.","**A third-party service called on every page view** — a shipping, review or loyalty module queried synchronously. If it slows down, the store slows with it, though your server is not at fault.","**No written instructions** — nobody knows who decides to switch a feature off, at what threshold, or who informs the client. People improvise during the outage, which lengthens the outage.",{"type":35,"title":49,"body":50},"Freeze changes: four weeks, one cut-off date","The freeze is the least costly and most effective measure: as long as code and configuration do not move, what you measured stays true. Pick a cut-off date, for example Friday 20 November, one week before the peak. After it, no CMS update, no new extension, no theme change. Only critical bug fixes get through, tested on the copy and then logged.\n\nThe freeze does not cover automatic updates: turn them off for the period. The table below can be replayed every year by shifting the dates.\n\nTake a full backup just before the freeze (files, database, server configuration), then restore it once on the copy and time the operation: that duration is an input to the fallback plan. The difference between a snapshot and a backup is explained in \u003Ca href=\"\u002Fen\u002Fblog\u002Fvps-snapshot-vs-backup-what-differs-and-how-restore-works\">VPS snapshot or backup\u003C\u002Fa>.",{"type":52,"title":53,"headers":54,"rows":58},"comparison","Preparation calendar to replay every year",[55,56,57],"Period","What gets done","Expected evidence",[59,63,67,71,75,79],[60,61,62],"By 6 November","Inventory: CMS version, extensions, third-party services, scheduled tasks, hosting plan","A dated table, with one person responsible per line",[64,65,66],"9 to 13 November","Copy of the store and a baseline load test","Result kept with the exact command and scenario",[68,69,70],"16 to 19 November","Cache, database and PHP settings, then a new test","Same scenario, same parameters, results compared",[72,73,74],"Friday 20 November","Change freeze, full backup","Restore tested, not just the backup taken",[76,77,78],"21 to 26 November","Critical fixes only, after a trial on the copy","Change log kept up to date",[80,81,82],"27 to 30 November","Peak monitoring, fallback plan ready to use","Alerts active and an on-call person named",{"type":84,"title":85,"steps":86},"steps","Measure on a copy with k6 and ab",[87,90,93,96,99,102,105,108],{"title":88,"body":89},"Prepare a copy of the store","Never test the live store: a load test can bring it down, pollute your statistics and create fake orders. Restore a backup onto a test VPS or hosting account of the same kind as production, with the same PHP version and the same database. Anonymise customers, turn off outgoing email and put payment modules in test mode.",{"title":91,"body":92},"Write the scenario before choosing the tool","List a buyer's journey: home page, category page, product page, add to cart, cart page, then the start of checkout. Decide the weight of each step, for example many product pages and few payments. A scenario limited to the home page measures the cache, not the store.",{"title":94,"body":95},"Install k6","k6 is Grafana's open-source load-testing tool, a single binary. Follow the installation steps in \u003Ca href=\"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fk6\u002Flatest\u002F\">the official k6 documentation\u003C\u002Fa> on the machine that generates the load, never on the server under test, then check with `k6 version`.",{"title":97,"body":98},"Write the script around a gradual ramp","In a file named `charge.js`, import `http` from `k6\u002Fhttp` and `check` from `k6`. Declare a scenario with `executor: 'ramping-arrival-rate'` (\u003Ca href=\"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fk6\u002Flatest\u002Fusing-k6\u002Fscenarios\u002Fexecutors\u002Framping-arrival-rate\u002F\">k6 documentation\u003C\u002Fa>): it sets a number of iterations per second regardless of how fast the site answers, which resembles visitors arriving better than a fixed number of virtual users. Fill in `startRate`, `timeUnit`, `preAllocatedVUs`, `maxVUs` and `stages` that climb in steps. In the default function, chain `http.get` on the product page then `http.post` on add to cart, with a `check` on status 200.",{"title":100,"body":101},"Set thresholds that fail the test","Add `thresholds` to the options: `http_req_failed: ['rate\u003C0.01']` and `http_req_duration: ['p(95)\u003C800']`. The values are yours, set according to what your customers tolerate, not copied from a figure. If a threshold is not met, k6 exits with a non-zero code, which makes the test replayable in an automatic routine. Note that `check` calls do not have that effect: only thresholds fail the test.",{"title":103,"body":104},"Run the test and watch the server at the same time","Run `k6 run -e BASE_URL=https:\u002F\u002Fcopy.your-domain.com charge.js`. In an SSH session on the server under test, leave `top` or `htop` running and watch `free -m` for memory and swap. Note at which step of the ramp response times take off and which resource saturates first: processor, memory, database connections or disk.",{"title":106,"body":107},"Complete with a quick ab test","ApacheBench checks one specific page in a single line: `ab -n 500 -c 20 -k https:\u002F\u002Fcopy.your-domain.com\u002Fproduct\u002Fexample\u002F`. The `-n` option sets the total number of requests, `-c` the number of simultaneous requests and `-k` enables persistent connections. Apache's documentation states that the tool does not implement HTTP\u002F1.x in full: keep it for before-and-after comparisons around a setting, not for measuring capacity.",{"title":109,"body":110},"Replay the same test after every change","Change one thing at a time: cache, number of PHP processes, a database index. Rerun exactly the same command and store the results in a dated file.",{"type":35,"title":112,"body":113},"Reading the result: the peak, not the average","An average response time hides what the unlucky buyer experiences. Read the 95th percentile, or the 99th for the slowest cases, and the error rate. A store whose average stays fine but where one buyer in twenty waits several seconds loses carts without the average showing it.\n\nLook at the shape of the curve too. A stable time followed by a sudden collapse signals a hard limit, such as a maximum number of database connections or PHP processes. This test does not tell you how many real visitors you will get: it tells you at what arrival rate your copy, under the test conditions, starts to degrade.\n\nNo numerical result is published here, on purpose: a figure measured on a test machine says nothing about yours, and the script above was only run against a dummy target to check its syntax, which proves no capacity. The only measurement that counts is the one you take on your own copy.",{"type":52,"title":115,"headers":116,"rows":120},"Symptoms during the test and leads to follow",[117,118,119],"What you observe","Likely cause","What to measure",[121,125,129,133,137,141],[122,123,124],"Response time rising with load, processor at its maximum","Too many pages built by PHP instead of served from cache","Share of pages served from cache for anonymous visitors",[126,127,128],"Memory full, then swap in use","Too many PHP processes for the available RAM","Memory per PHP process and number of processes allowed",[130,131,132],"502 or 504 errors in bursts","All PHP processes busy, or a saturated queue","PHP pool setting and duration of the slowest requests",[134,135,136],"Calm processor but high response time","Waiting on the database or a third-party service","Slow query log, duration of external calls",[138,139,140],"\"Too many connections\" error","Database connection limit reached","Value of `max_connections` and connections actually used",[142,143,144],"Fast product pages but slow cart","The cart bypasses the cache, as it should, and weighs on the database","Queries triggered by add to cart",{"type":35,"title":146,"body":147},"Cache: what is served fast, what must never be","The \u003Ca href=\"https:\u002F\u002Fdeveloper.woocommerce.com\u002Fdocs\u002Fbest-practices\u002Fperformance\u002Fconfiguring-caching-plugins\">WooCommerce documentation\u003C\u002Fa> is clear: the cart, checkout and account pages must stay dynamic, because they show information specific to the customer. Exclude them from every cache, at plugin, server and delivery-network level, and check the session and cart cookies your WooCommerce version uses. A cart page cached by mistake shows another buyer's cart, which is worse than an outage.\n\nFor the rest, list what can be served as is: home page, categories, product pages for visitors without cookies. The detail of paths to exclude at the delivery-network level is covered in \u003Ca href=\"\u002Fen\u002Fblog\u002Fcloudflare-client-site-agency-cache-ssl-settings\">our guide to Cloudflare and caching for a client site\u003C\u002Fa>. On PrestaShop, the \u003Ca href=\"https:\u002F\u002Fdevdocs.prestashop-project.org\u002F9\u002Fscale\u002Foptimizations\u002F\">developer documentation\u003C\u002Fa> recommends enabling the Smarty cache on the Performance page, and not enabling the Cache section when MySQL or MariaDB runs on the same machine. Check these settings in your version's back office, then replay the test after each change.",{"type":35,"title":149,"body":150},"Database and object cache","Turn on MariaDB's \u003Ca href=\"https:\u002F\u002Fmariadb.com\u002Fkb\u002Fen\u002Fslow-query-log-overview\u002F\">slow query log\u003C\u002Fa> before the test: `SET GLOBAL slow_query_log=1;` then `SET GLOBAL long_query_time=1;` for a one-second threshold, a value you should adjust. These runtime settings disappear on restart; to keep them, put them in the configuration. From MariaDB 10.11, the variables are renamed with the `log_slow_` prefix, so check the name used by your version.\n\nAn object cache such as Redis relieves the database by keeping repeated results in memory. Give it a limit with `maxmemory` and choose the eviction policy with `maxmemory-policy`: The \u003Ca href=\"https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fdevelop\u002Freference\u002Feviction\u002F\">Redis documentation\u003C\u002Fa> says `allkeys-lru` is a good default when some keys are read far more often than the rest, while `noeviction` returns an error when memory is full. Watch `keyspace_hits` and `keyspace_misses` in `INFO stats` during the test: a low hit rate signals a cache that is not helping.",{"type":152,"title":153,"body":154},"tip","Only load what belongs to you","Point the test at your copy, never at the payment gateway, a shipping service or a third-party API: the tool would overload them and could get your account blocked. If your scenario must go through payment, use the provider's test mode, with their agreement.",{"type":35,"title":156,"body":157},"Sizing: a hypothesis to validate by measurement","If the test shows the copy saturates too early, there are two routes: fix the software, or change plan. If the machine remains the limiting factor, raise memory or cores in steps and replay the same test after each step, until the curve holds with a margin you judge sufficient.\n\nA resource recommendation read on a website, this one included, remains a hypothesis: only your measurement on your store counts. The method for reading consumption is detailed in \u003Ca href=\"\u002Fen\u002Fblog\u002Fsizing-a-vps-for-a-client-site-ram-and-cpu\">sizing a VPS for a client's site\u003C\u002Fa>. When one machine is no longer enough, \u003Ca href=\"\u002Fen\u002Fblog\u002Fhaproxy-on-a-vps-load-balancing-and-high-availability\">HAProxy on a VPS\u003C\u002Fa> spreads the load, at the price of a more complex architecture.",{"type":35,"title":159,"body":160},"If you do not run this test yourself","Many merchants hand the store to an agency or a host. The test is still needed: you have to ask for it. Require three things in writing before the freeze date: the dated result of a load test on a copy, with the scenario and the 95th percentile response time read at the peak; the list of planned changes and the agreed freeze date; a signed fallback plan that names the person allowed to switch features off or restore the backup. A report that only quotes the average, or an 'everything is ready' with no result, does not answer the request.\n\nAlso decide with them who makes the call on the day: the fallback costs features, therefore sales, and that decision belongs to the business, not only to the technical provider.",{"type":39,"title":162,"items":163},"The fallback plan, one line per decision",[164,165,166,167,168,169],"**Who decides** — a named person, with a deputy, authorised to trigger the fallback without consulting a committee.","**At what threshold** — for example an error rate or response time you defined during the tests, read by monitoring and not by eye.","**Load-shedding action** — switch off non-essential features: product recommendations, reviews, predictive search, heavy extensions tested one by one during the trial.","**Second action** — enable a clear queue or maintenance page with the expected return time, rather than a raw error.","**Last resort** — restore the pre-freeze backup, with the restore time you measured and the agreement of the person who decides.","**Who informs** — the client, the marketing team pushing the campaign and your host, with a message already written.",{"type":35,"title":171,"body":172},"After the peak: keep the measurement for next year","Keep the script, the command, the results and the change log in a dated folder. Next year you will replay the same test on the new version of the store, and the comparison will show whether extensions added during the year made the journey heavier.\n\nTo follow store availability during the period, see \u003Ca href=\"\u002Fen\u002Fblog\u002Fmonitor-client-site-availability-agency-monthly-report\">the client site availability report\u003C\u002Fa>.","A sales peak deserves a server whose limit you know","Hosting and VPS in the same place as your domain, backups depending on the plan, migration from your current host. Your store stays yours. Plans from 199 DH\u002Fyear for hosting and 99 DH\u002Fmonth for a VPS.","See the business solution","\u002Fsolutions\u002Fprofessionnels",[178,198,217],{"id":179,"slug":180,"slugs":181,"title":185,"excerpt":186,"readTime":187,"views":18,"isPinned":19,"publishedAt":188,"updatedAt":189,"category":190,"categories":195,"featuredImage":29,"bgImage":30,"posterImage":197,"relatedSolution":29},547,"sizing-a-vps-for-a-client-site-ram-and-cpu",{"fr":182,"en":180,"ar":183,"es":184},"dimensionner-vps-ram-cpu-site-client","تحديد-حجم-vps-لموقع-عميل-الذاكرة-والمعالج","dimensionar-un-vps-para-el-sitio-de-un-cliente-ram-y-cpu","Sizing a VPS for a client site: RAM and CPU","Measure the RAM, CPU and disk a client's site really uses at peak, then choose the VPS plan with a written margin you can defend to the client.",10,"2026-10-31T00:00:00+00:00","2026-10-31T20:50:39+00:00",{"id":191,"name":192,"slug":193,"color":194,"icon":193},5,"Comparison","comparatif","bg-info\u002F10 text-info",[196],{"id":191,"name":192,"slug":193,"color":194,"icon":193},"\u002Fblog\u002Fcovers\u002Fdimensionner-vps-ram-cpu-site-client-poster.svg",{"id":199,"slug":200,"slugs":201,"title":205,"excerpt":206,"readTime":187,"views":18,"isPinned":19,"publishedAt":188,"updatedAt":207,"category":208,"categories":214,"featuredImage":29,"bgImage":30,"posterImage":216,"relatedSolution":29},549,"cloudflare-client-site-agency-cache-ssl-settings",{"fr":202,"en":200,"ar":203,"es":204},"cloudflare-site-client-agence-cache-ssl-reglages","إعدادات-cloudflare-موقع-العميل-الكاش-ssl","cloudflare-sitio-cliente-agencia-cache-ssl-ajustes","Cloudflare for a client site: SSL Full (strict) and cache","Put a client's site behind Cloudflare without redirect loops or private pages in cache: Full (strict) mode, cache rules and the checks to run.","2026-11-01T14:14:27+00:00",{"id":209,"name":210,"slug":211,"color":212,"icon":213},8,"Security & Monitoring","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[215],{"id":209,"name":210,"slug":211,"color":212,"icon":213},"\u002Fblog\u002Fcovers\u002Fcloudflare-site-client-agence-cache-ssl-reglages-poster.svg",{"id":218,"slug":219,"slugs":220,"title":224,"excerpt":225,"readTime":226,"views":18,"isPinned":19,"publishedAt":188,"updatedAt":227,"category":228,"categories":229,"featuredImage":29,"bgImage":30,"posterImage":231,"relatedSolution":29},548,"vps-snapshot-vs-backup-what-differs-and-how-restore-works",{"fr":221,"en":219,"ar":222,"es":223},"snapshot-vs-sauvegarde-vps-difference-restauration","اللقطة-مقابل-النسخ-الاحتياطي-للـvps-الفرق-والاستعادة","snapshot-vs-copia-de-seguridad-de-vps-diferencias-y-restauracion","VPS snapshot vs backup: what differs and how restore works","VPS snapshot or backup: what each one protects, what it does not, how restoring works, and a decision rule for the VPS you run for your clients.",9,"2026-10-31T19:07:30+00:00",{"id":209,"name":210,"slug":211,"color":212,"icon":213},[230],{"id":209,"name":210,"slug":211,"color":212,"icon":213},"\u002Fblog\u002Fcovers\u002Fsnapshot-vs-sauvegarde-vps-difference-restauration-poster.svg",1793542940602]