{"id":1896629,"date":"2019-10-18T13:19:41","date_gmt":"2019-10-18T17:19:41","guid":{"rendered":"https:\/\/theeventscalendar.com\/knowledgebase\/performance-considerations-2\/"},"modified":"2026-04-23T16:27:57","modified_gmt":"2026-04-23T20:27:57","slug":"calendar-performance","status":"publish","type":"post","link":"https:\/\/theeventscalendar.com\/knowledgebase\/calendar-performance\/","title":{"rendered":"Scaling and Performance for The Events Calendar"},"content":{"rendered":"\n<p>The Events Calendar and its associated plugins can handle large numbers of events and work well even on very high-traffic websites. However, performance is dependent on many environmental factors that the plugin itself is often unable to manage automatically. This article covers the full picture: proactive settings and best practices for keeping your calendar fast, recurring event strategies that protect your database, specific optimizations like month view tooltips, and a step-by-step guide to diagnosing and fixing performance that degrades over time.<\/p>\n\n\n\n<p>We recommend following <a href=\"https:\/\/wordpress.org\/about\/requirements\/\">WordPress\u2019 recommended server configuration<\/a>. If you do not meet their minimums (e.g. PHP 7.4), the suggestions below will likely still fall short.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-the-more-events-you-show-the-costlier-it-gets\">The More Events You Show, the Costlier It Gets<\/h4>\n\n\n\n<p>Just like regular blog posts, events are stored in the database. By default, WordPress displays only the latest 10 blog posts on your homepage \u2014 that loads quickly. But if you change a setting to show 100 or 10,000 posts on the same page, WordPress must work much harder and consume far more resources.<\/p>\n\n\n\n<p>The same logic applies to events. Take <em>Month View<\/em>, where up to 35 days\u2019 worth of events are displayed at once. If an average day contains 10 events and up to 10 or more are listed per day, that is a large number of records to retrieve and render. Building a view with that configuration is much more costly than one showing only 3 events per day. List-type views like <em>List View<\/em> and <em>Photo View<\/em> can be configured to show as many events as you like \u2014 but keep in mind that every event shown has an attached cost in terms of performance.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-strategies-for-scaling\">Strategies for Scaling<\/h2>\n\n\n\n<p>The easiest way to address this is to go to <strong>Events \u2192 Settings<\/strong> and adjust:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The number of events to show per page (affects list-style views like List View, Photo View, etc.)<\/li>\n\n\n\n<li>The number of events to show per day in Month View<\/li>\n<\/ul>\n\n\n\n<p>Reducing these numbers not only improves performance \u2014 it also makes it easier for visitors to absorb all the event information on calendar views.<\/p>\n\n\n\n<p>If project requirements force you to keep event counts high, the next avenue to explore is <strong>caching<\/strong>. Instead of rebuilding each view from scratch every time someone loads it, caching stores the complete view or its building blocks so they can be served faster on subsequent requests. See our <a href=\"https:\/\/theeventscalendar.com\/knowledgebase\/k\/caching-what-when-and-how\/\">Caching: What, When and How<\/a> article for a full explanation of the different types of caching available.<\/p>\n\n\n\n<p>TEC includes a built-in Month View cache option. Go to <strong>Events \u2192 Settings \u2192 General \u2192 Viewing<\/strong> and enable <strong>Enable the Month View Cache<\/strong> to help an event-filled calendar load faster for visitors.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/images.theeventscalendar.com\/kb\/uploads\/2024\/12\/image-6.png\" alt=\"Enable the Month View Cache setting in Events &gt; Settings &gt; General &gt; Viewing\"\/><\/figure>\n\n\n\n<p>Depending on your requirements, caching alone may not be a complete solution \u2014 you may ultimately need to increase server resources as well.<\/p>\n\n\n\n<p>The Events Calendar also includes two maintenance settings found under <strong>Events \u2192 Settings \u2192 General \u2192 Maintenance<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/images.theeventscalendar.com\/kb\/uploads\/2024\/12\/image-7.png\" alt=\"Maintenance settings in Events &gt; Settings &gt; General showing Move to trash and Merge Duplicate options\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Move to trash events older than:<\/strong> Automatically moves past events to trash based on their end date, keeping your database lean.<\/li>\n\n\n\n<li><strong>Merge Duplicate Venues &amp; Organizers:<\/strong> Automatically merges identical venues and organizers to reduce database bloat.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-recurring-events-and-database-load\">Recurring Events and Database Load<\/h2>\n\n\n\n<p>Recurring events are a powerful feature, but if not managed carefully they can lead to significant performance issues, especially on large sites or those with limited server resources.<\/p>\n\n\n\n<p>When you create a recurring event, each instance is stored as a separate post in your database. Setting up a daily event for a year generates 365 separate event posts, each with its own metadata and relationships. This can quickly snowball into thousands of entries and slow down:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Event queries and calendar views<\/li>\n\n\n\n<li>Admin dashboard loading times<\/li>\n\n\n\n<li>Backup and sync operations<\/li>\n<\/ul>\n\n\n\n<p>By default, The Events Calendar generates recurring events for 60 months (five years) when \u201cNever\u201d is selected for \u201cEvents End.\u201d While practical for some use cases, this can cause performance issues on busy sites. To optimize, reduce the recurrence period to 6 or 12 months using the <code>tribe_get_option_recurrenceMaxMonthsAfter<\/code> filter:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n\nfunction custom_recurrence_max_months( $value ) {\n    return 12; \/\/ Change to 6 or 12 for better performance\n}\nadd_filter( &#039;tribe_get_option_recurrenceMaxMonthsAfter&#039;, &#039;custom_recurrence_max_months&#039; );\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-best-practices-for-recurring-events\">Best Practices for Recurring Events<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-limit-the-number-of-recurrences\">Limit the Number of Recurrences<\/h4>\n\n\n\n<p>Avoid creating long-term recurrence rules. Instead of daily events for multiple years, try weekly or monthly patterns with shorter date ranges and manual renewals.<\/p>\n\n\n\n<p><strong>Example:<\/strong> Instead of a daily event for 3 years, create a recurring event for one month at a time.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-use-series-when-practical-events-calendar-pro\">Use Series When Practical (Events Calendar Pro)<\/h4>\n\n\n\n<p>If you\u2019re using Events Calendar Pro, consider grouping related events as a <a href=\"https:\/\/theeventscalendar.com\/knowledgebase\/event-series\/\"><strong>Series<\/strong><\/a> rather than a long recurrence chain. This provides visual and organizational benefits without bloating the database.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-avoid-editing-entire-recurrence-sets\">Avoid Editing Entire Recurrence Sets<\/h4>\n\n\n\n<p>Each time you update a recurring event set, it can trigger updates to every event in the series. If you must make changes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use the \u201cThis and future events\u201d or \u201cThis event only\u201d option when editing<\/li>\n\n\n\n<li>Avoid repeatedly editing the base event and saving all recurrences<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-use-weekly-instead-of-daily-where-possible\">Use Weekly Instead of Daily Where Possible<\/h4>\n\n\n\n<p>Daily events generate a huge number of posts. Switching to weekly recurrences, where appropriate, significantly reduces post count.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-use-the-clean-up-recurring-events-after-setting\">Use the \u201cClean Up Recurring Events After\u201d Setting<\/h4>\n\n\n\n<p>This setting removes older recurrences automatically. Choose a value that fits your record-keeping needs while keeping the database lean.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-consider-individual-events-instead-of-recurrence\">Consider Individual Events Instead of Recurrence<\/h4>\n\n\n\n<p>If an event happens every week but with different details each time, consider creating individual events instead of using recurrence. This gives you full control over titles, descriptions, and settings without tying everything to a master event.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-monitor-your-database\">Monitor Your Database<\/h4>\n\n\n\n<p>If your calendar is large or long-running:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Monitor your database size and performance<\/li>\n\n\n\n<li>Use tools like <a href=\"https:\/\/wordpress.org\/plugins\/query-monitor\/\">Query Monitor<\/a> or your hosting panel\u2019s resource dashboard<\/li>\n\n\n\n<li>Regularly review old or expired events and consider archiving or deleting them<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-optimizing-month-view-tooltip-images\">Optimizing Month View Tooltip Images<\/h2>\n\n\n\n<p>In Month View, event tooltips load full-size featured images by default. While this ensures maximum quality, it adds unnecessary weight to the page and can slow calendar performance. A simple template override lets you use medium-sized images instead \u2014 keeping them sharp while reducing file sizes significantly.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-step-1-locate-the-template-file\">Step 1: Locate the Template File<\/h4>\n\n\n\n<p>The tooltip\u2019s featured image is controlled by a template inside the plugin. Override it in your theme so plugin updates don\u2019t overwrite your customization. The original file is located at:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nwp-content\/plugins\/the-events-calendar\/src\/views\/v2\/month\/calendar-body\/day\/calendar-events\/calendar-event\/tooltip\/featured-image.php\n<\/pre><\/div>\n\n\n<p>For more on template overrides, see <a href=\"https:\/\/theeventscalendar.com\/knowledgebase\/customizing-template-files-2\/\">Customizing Template Files<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-step-2-copy-the-file-to-your-theme\">Step 2: Copy the File to Your Theme<\/h4>\n\n\n\n<p>Copy the file to your theme or child theme at this path:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&#x5B;your-theme]\/tribe\/events\/v2\/month\/calendar-body\/day\/calendar-events\/calendar-event\/tooltip\/featured-image.php\n<\/pre><\/div>\n\n\n<h4 class=\"wp-block-heading\" id=\"h-step-3-update-the-image-size\">Step 3: Update the Image Size<\/h4>\n\n\n\n<p>In your copied file, find the line (around line 29) that defines the <code>src<\/code> attribute of the image and change it to use the <strong>medium<\/strong> thumbnail size:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nsrc=&quot;&amp;lt;?php echo esc_url( $event-&gt;thumbnail-&gt;medium-&gt;url ); ?&gt;&quot;\n<\/pre><\/div>\n\n\n<h4 class=\"wp-block-heading\" id=\"h-the-updated-html\">The Updated HTML<\/h4>\n\n\n\n<p>Here is how your updated code should look:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&amp;lt;div class=&quot;tribe-events-calendar-month__calendar-event-tooltip-featured-image-wrapper&quot;&gt;\n    &amp;lt;img\n        class=&quot;tribe-events-calendar-month__calendar-event-tooltip-featured-image&quot;\n        src=&quot;&amp;lt;?php echo esc_url( $event-&gt;thumbnail-&gt;medium-&gt;url ); ?&gt;&quot;\n        &amp;lt;?php if ( ! empty( $event-&gt;thumbnail-&gt;srcset ) ) : ?&gt;\n            srcset=&quot;&amp;lt;?php echo esc_attr( $event-&gt;thumbnail-&gt;srcset ); ?&gt;&quot;\n        &amp;lt;?php endif; ?&gt;\n        &amp;lt;?php if ( ! empty( $event-&gt;thumbnail-&gt;alt ) ) : ?&gt;\n            alt=&quot;&amp;lt;?php echo esc_attr( $event-&gt;thumbnail-&gt;alt ); ?&gt;&quot;\n        &amp;lt;?php else : ?&gt;\n            alt=&quot;&quot;\n        &amp;lt;?php endif; ?&gt;\n    \/&gt;\n&amp;lt;\/div&gt;\n<\/pre><\/div>\n\n\n<p>By switching from full-size to medium thumbnails, images load faster, tooltip performance improves (especially on slower connections), and visitors still see clear, sharp images. If you want even smaller images, you can change <code>medium<\/code> to another registered size such as <code>thumbnail<\/code> or a custom size defined in your theme.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-troubleshooting-performance-degradation-over-time\">Troubleshooting Performance Degradation Over Time<\/h2>\n\n\n\n<p>As your site grows with more events, attendees, and tickets, you may notice slower load times, delayed imports, or longer page generation. Performance decline rarely happens suddenly \u2014 it is usually the result of cumulative growth or configuration drift. Common causes include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A large number of published or past events in the database<\/li>\n\n\n\n<li>Excessive event recurrence patterns<\/li>\n\n\n\n<li>Bloated postmeta or transients tables<\/li>\n\n\n\n<li>Inefficient caching or expired object cache<\/li>\n\n\n\n<li>Cron or Action Scheduler queues building up<\/li>\n\n\n\n<li>Third-party plugin conflicts or custom template overrides<\/li>\n<\/ul>\n\n\n\n<p>Understanding these factors helps narrow down the issue before applying fixes.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-step-1-benchmark-your-site-s-current-state\">Step 1: Benchmark Your Site\u2019s Current State<\/h4>\n\n\n\n<p>Start by measuring your site\u2019s baseline performance:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use <strong><a href=\"https:\/\/theeventscalendar.com\/knowledgebase\/how-to-find-and-share-slow-database-queries-in-wordpress\/\">Query Monitor<\/a><\/strong> or <strong>Site Health \u2192 Info \u2192 Performance<\/strong><\/li>\n\n\n\n<li>Note the <strong>page load time<\/strong>, <strong>query count<\/strong>, and <strong>memory usage<\/strong> for:\n<ul class=\"wp-block-list\">\n<li>The <code>\/events\/<\/code> archive<\/li>\n\n\n\n<li>A single event page<\/li>\n\n\n\n<li>Your checkout page (if using Event Tickets or Tickets Commerce)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\ud83d\udca1 <em>Save these metrics \u2014 you\u2019ll compare them later to confirm improvements.<\/em><\/p>\n<\/blockquote>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-step-2-check-database-growth\">Step 2: Check Database Growth<\/h4>\n\n\n\n<p>The database is often the root of long-term slowdowns.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-key-tables-to-review\">Key Tables to Review<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Table<\/th><th>Common Issue<\/th><th>Fix<\/th><\/tr><\/thead><tbody><tr><td><code>wp_posts<\/code><\/td><td>Thousands of past or recurring events<\/td><td>Use TEC\u2019s \u201cClean up past events\u201d setting<\/td><\/tr><tr><td><code>wp_postmeta<\/code><\/td><td>Excessive metadata for tickets &amp; RSVPs<\/td><td>Clean via WP-Optimize or a database plugin<\/td><\/tr><tr><td><code>wp_options<\/code><\/td><td>Expired transients or cached queries<\/td><td>Clear transients using WP-CLI or a plugin<\/td><\/tr><tr><td><code>wp_actionscheduler_actions<\/code><\/td><td>Failed or pending background jobs<\/td><td>Delete old entries with the Action Scheduler UI<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>The Events Calendar and its associated plugins can handle large numbers of events and work well even on very high-traffic websites. However, performance is dependent on many environmental factors that the plugin itself is often unable to manage automatically. This article covers the full picture: proactive settings and best practices for keeping your calendar fast, recurring event strategies that protect your database, specific optimizations like month view tooltips, and a step-by-step guide to diagnosing and fixing performance that degrades over time.<\/p>\n\n\n\n<p>We recommend following <a href=\"https:\/\/wordpress.org\/about\/requirements\/\">WordPress\u2019 recommended server configuration<\/a>. If you do not meet their minimums (e.g. PHP 7.4), the suggestions below will likely still fall short.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The Events Calendar and its associated plugins can handle large numbers of events and work well even on very high-traffic websites. However, performance is dependent on many environmental factors that the plugin itself is often unable to manage automatically. This article covers the full picture: proactive settings and best practices for keeping your calendar fast,&#8230;<\/p>\n","protected":false},"author":5,"featured_media":1955565,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_swpsp_post_exclude":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"ep_exclude_from_search":false,"footnotes":""},"categories":[344,347],"tags":[],"stellar-product-taxonomy":[161],"class_list":["post-1896629","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices","category-how-to","stellar-product-taxonomy-the-events-calendar"],"acf":[],"taxonomy_info":{"category":[{"value":344,"label":"Best Practices"},{"value":347,"label":"How To"}],"stellar-product-taxonomy":[{"value":161,"label":"The Events Calendar"}]},"featured_image_src_large":["https:\/\/images.theeventscalendar.com\/kb\/uploads\/2023\/02\/social-share-1024x538.png",1024,538,true],"author_info":{"display_name":"Leah","author_link":"https:\/\/theeventscalendar.com\/knowledgebase\/author\/leahk\/"},"comment_info":0,"category_info":[{"term_id":344,"name":"Best Practices","slug":"best-practices","term_group":0,"term_taxonomy_id":344,"taxonomy":"category","description":"","parent":0,"count":10,"filter":"raw","term_order":"0","cat_ID":344,"category_count":10,"category_description":"","cat_name":"Best Practices","category_nicename":"best-practices","category_parent":0},{"term_id":347,"name":"How To","slug":"how-to","term_group":0,"term_taxonomy_id":347,"taxonomy":"category","description":"","parent":0,"count":109,"filter":"raw","term_order":"0","cat_ID":347,"category_count":109,"category_description":"","cat_name":"How To","category_nicename":"how-to","category_parent":0}],"tag_info":false,"_links":{"self":[{"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/posts\/1896629","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/comments?post=1896629"}],"version-history":[{"count":13,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/posts\/1896629\/revisions"}],"predecessor-version":[{"id":1969919,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/posts\/1896629\/revisions\/1969919"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/media\/1955565"}],"wp:attachment":[{"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/media?parent=1896629"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/categories?post=1896629"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/tags?post=1896629"},{"taxonomy":"stellar-product-taxonomy","embeddable":true,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/stellar-product-taxonomy?post=1896629"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}