I love Elementor. I've used it on more client sites than I can count. It lets business owners update their own pages, it's flexible enough to build almost anything, and it's saved me thousands of hours compared to building custom themes from scratch. But here's the thing nobody tells you when you install Elementor: it …
I love Elementor. I’ve used it on more client sites than I can count. It lets business owners update their own pages, it’s flexible enough to build almost anything, and it’s saved me thousands of hours compared to building custom themes from scratch.
But here’s the thing nobody tells you when you install Elementor: it can absolutely destroy your site’s performance if you’re not careful.
I’m Temo from WorkflowDone.com, and over the years I’ve inherited dozens of Elementor sites that looked great on the surface but loaded like they were running on a dial-up connection from 1998. Slow pages, terrible mobile scores, visitors bouncing before anything even shows up.
The good news? Most of these problems are fixable. And you don’t need to be a developer to understand what’s going wrong — you just need to know where to look.
Here are the six biggest Elementor performance pitfalls I see over and over again, and exactly how to fix each one.
1. Unused CSS and JavaScript Bloat — The Silent Killer
The problem: Every time you build a page with Elementor, it loads CSS and JavaScript files for all of its widgets — even the ones you’re not using on that page. So if you built a simple page with just a heading, an image, and a button, Elementor might still load the styles for sliders, accordions, tabs, forms, progress bars, and a dozen other widgets you never touched.
Multiply that across 20 or 30 pages and you’ve got a massive amount of code being downloaded by every visitor for absolutely no reason.
Why it matters for your business: Every extra kilobyte of unused code adds milliseconds to your load time. That might not sound like much, but Google’s own research shows that when page load time goes from 1 second to 3 seconds, the probability of a visitor bouncing increases by 32%. When it hits 5 seconds, that number jumps to 90%. You’re literally paying for hosting to serve code that nobody needs and that drives customers away.
How to fix it:
The first thing I do on every Elementor site is go to Elementor → Settings → Performance and look for two settings:
Improved Asset Loading — Turn this on. It tells Elementor to only load the CSS and JS for widgets that are actually used on each page. This single toggle can cut your unused code by 30-50% depending on the site.
Improved CSS Loading — Also turn this on. It changes how Elementor delivers its stylesheets, reducing render-blocking resources.
Beyond Elementor’s built-in settings, this is where a good caching plugin earns its keep. If you’re using LiteSpeed Cache or WP Rocket (which I talked about in my plugins article), both have options to remove unused CSS. WP Rocket’s “Remove Unused CSS” feature in the File Optimization tab is particularly effective — it scans each page individually and strips out styles that aren’t needed.
Real example: I took over a real estate website built with Elementor that was loading 1.2MB of CSS on every page. After turning on Improved Asset Loading and running WP Rocket’s unused CSS removal, that dropped to about 180KB. The homepage went from a 4.8 second load time to 1.9 seconds. The client didn’t even notice a visual difference — because nothing changed visually. We just removed the invisible junk.
2. Image Handling Mistakes — The Most Common One I See
The problem: Elementor makes it incredibly easy to drag and drop images onto a page. Too easy, honestly. Because what most people do is upload a 4000×3000 pixel photo straight from their phone, drop it into a section that only displays at 800 pixels wide, and call it a day.
The browser still downloads the full-size image. It just shrinks it visually. So your visitor’s phone is downloading a 5MB photo to display it in a space that only needs a 200KB file.
And it gets worse. Elementor’s image widget doesn’t automatically serve WebP or AVIF formats — the modern compressed image formats that are 25-50% smaller than JPEG. So unless you’ve set that up separately, you’re serving outdated file formats on top of oversized dimensions.
Why it matters for your business: Images typically account for 50-80% of a page’s total weight. On the Elementor sites I audit, bad image handling is the number one reason for slow load times. Not the theme. Not the plugins. The images.
How to fix it:
First, before you upload any image to WordPress, resize it. No page on your website needs a 4000-pixel-wide image. For most layouts, 1200-1600 pixels wide is plenty. You can resize images for free using tools like iLoveIMG or even your phone’s built-in photo editor.
Second, install an image optimization plugin like Smush (I covered this in my plugins article too). It’ll automatically compress images as you upload them and can bulk-optimize everything you’ve already uploaded.
Third, enable lazy loading. Elementor actually has a built-in lazy load option under Elementor → Settings → Performance → Lazy Load. Turn it on. This means images below the fold won’t load until the visitor scrolls down to them, which dramatically speeds up the initial page load.
Fourth, serve images in WebP format. If you’re using LiteSpeed Cache, it has built-in WebP conversion. Smush Pro also offers this. WebP images are significantly smaller than JPEG or PNG with virtually no visible quality difference.
Real example: A client’s portfolio page had 24 images on it. Total page weight: 38MB. Thirty-eight megabytes for a single page. After resizing the images to appropriate dimensions, compressing them with Smush, converting to WebP, and enabling lazy loading, the page weight dropped to 2.4MB. Same page. Same images. Same visual quality. Just not insane file sizes anymore.
3. Google Fonts Loading Issues — Death by a Thousand Fonts
The problem: Elementor lets you pick from hundreds of Google Fonts for any text element. And people love this feature — maybe a little too much. I’ve seen sites using 6, 7, even 10 different Google Fonts across their pages. Every font is a separate HTTP request to Google’s servers, and each font weight (regular, bold, italic, etc.) adds another request on top of that.
But here’s the part that really hurts: by default, Elementor loads Google Fonts in a render-blocking way. That means the browser has to download all those fonts from Google before it can show any text on the page. Your visitor is staring at a blank screen while their browser is off fetching seven different typefaces from an external server.
Why it matters for your business: Render-blocking resources are one of the biggest factors in poor Core Web Vitals scores — the metrics Google uses to evaluate your site’s user experience. A bad score here can directly hurt your search rankings. And from a user perspective, the “flash of invisible text” where your page loads but all the text is blank for a second or two is jarring and unprofessional.
How to fix it:
Start by limiting your fonts. Pick two. Maximum three. One for headings, one for body text, and maybe one accent font if you absolutely need it. You do not need a different font for every section of your site. Nobody notices, and your load time will thank you.
Next, go to Elementor → Settings → General and look for the Google Fonts Load setting. Change it to Swap. This tells the browser to display a fallback system font immediately while the Google Font loads in the background. Your visitor sees text right away instead of a blank page.
For an even bigger improvement, consider self-hosting your Google Fonts instead of loading them from Google’s servers. This eliminates the external HTTP requests entirely. You can download any Google Font for free from google-webfonts-helper, upload the files to your server, and reference them in your CSS. It sounds technical, but it’s a one-time setup that makes a noticeable difference.
If you’re using WP Rocket, it actually has a feature to host Google Fonts locally — you just toggle it on. No manual font downloading needed.
Real example: A client’s homepage was loading 8 different Google Fonts with 14 total font weights. The fonts alone added 1.3 seconds to the render time. I consolidated the design to 2 fonts with 4 weights total, switched the loading to “Swap,” and self-hosted them. Font-related render time dropped to under 200 milliseconds. The client said the site “felt” faster before I even told them what I’d changed.
4. DOM Output and Excessive Divs — When Your Page Is Drowning in HTML
The problem: This one is a bit more technical, but it’s important to understand. Every time you add a section in Elementor, it creates a nested structure of HTML elements (called “DOM elements” or just “divs”). A section contains an inner wrapper, which contains a column, which contains a widget wrapper, which contains the actual content.
So a simple heading that should be one line of HTML becomes 5-6 nested layers of code. Add a few sections, some inner sections, columns within columns, and suddenly your page has 1,500+ DOM elements. Google recommends keeping it under 1,400 for good performance.
Why it matters for your business: The more DOM elements on a page, the more work the browser has to do to render it. On mobile devices — where most of your visitors probably are — this is especially painful. Phones have less processing power than desktops, and excessive DOM complexity causes sluggish scrolling, delayed interactions, and that frustrating feeling where you tap a button and nothing happens for a second.
Google PageSpeed Insights specifically flags this as “Avoid an excessive DOM size,” and it directly impacts your Interaction to Next Paint (INP) score — one of the three Core Web Vitals.
How to fix it:
The biggest fix is structural: use Containers instead of the old Section/Column layout. Elementor introduced the Flexbox Container feature specifically to address this problem. Containers use a much flatter HTML structure — fewer nested divs for the same visual result. If you’re still building with the old section-column system, you’re creating roughly 30-40% more DOM elements than you need to.
To enable Containers, go to Elementor → Settings → Features and make sure Flexbox Container is active. For new pages, always build with Containers. For existing pages, it’s worth gradually rebuilding them — especially your highest-traffic pages like the homepage, service pages, and landing pages.
Beyond that, be mindful of nesting. Don’t put a container inside a container inside a container just to achieve a layout effect that could be done with a single container and some flexbox settings. Every layer of nesting adds DOM elements.
Also, audit your pages for hidden or duplicate content. I’ve seen Elementor sites where someone created a section, decided they didn’t like it, and just hid it instead of deleting it. The content is still in the HTML — it’s just invisible. The browser still has to process it all.
Real example: I audited a client’s service page that had over 2,800 DOM elements. For reference, Google recommends under 1,400. The page was built with the old section/column system with lots of unnecessary nesting. I rebuilt the same layout using Flexbox Containers and cleaned up the hidden sections. The DOM count dropped to about 950 elements. The page’s INP score went from “Poor” to “Good” in Google’s assessment, and the client noticed that scrolling on mobile was noticeably smoother.
5. Bad Hosting and Elementor — A Recipe for Frustration
The problem: Elementor is more resource-hungry than a static theme. It runs PHP processes to render pages, it queries the database more frequently, and its editor alone needs decent server resources to function smoothly. If you’re running Elementor on bottom-tier shared hosting — the $3/month plans that cram hundreds of sites onto one server — you’re going to have a bad time.
I’ve seen Elementor sites on cheap hosting where the editor takes 30 seconds to load, saving a page times out, and visitors see 502 or 504 errors during traffic spikes. The site might look fine when you’re the only one on it, but the moment 20 people visit at the same time, the server buckles.
Why it matters for your business: Your hosting is the foundation everything else sits on. You can optimize your images perfectly, minimize your CSS, use Containers, self-host your fonts — and still have a slow site because the server itself can’t keep up. It’s like putting racing tires on a car with a lawn mower engine.
How to fix it:
At a minimum, your hosting should offer:
PHP 8.0 or higher — Elementor runs on PHP, and newer versions are significantly faster. If your host is still running PHP 7.4, you’re leaving free performance on the table.
A LiteSpeed or Nginx server — Apache works, but LiteSpeed and Nginx handle concurrent connections much better, which matters for traffic spikes.
At least 256MB PHP memory limit — Elementor’s editor needs memory. If your server is set to 128MB (a common default on cheap hosting), you’ll get white screens and timeouts when editing complex pages.
Server-level caching — This is why I love LiteSpeed servers with LiteSpeed Cache. The caching happens at the server level, before PHP even gets involved. It’s dramatically faster than any plugin-only caching solution.
For clients on a budget, I recommend hosts like Hostinger, Cloudways, or SiteGround — they offer LiteSpeed or high-performance Nginx setups starting around $10-15/month. The jump from $3 hosting to $10 hosting is the single biggest performance improvement most Elementor sites can make.
Real example: A client was running their Elementor site on a $4/month shared hosting plan. PageSpeed score: 28 on mobile. The editor took forever, the site crashed twice in one month during traffic from a Facebook ad campaign, and they were losing money. I migrated them to Cloudways with a LiteSpeed server — about $14/month. Same site, same plugins, same content. PageSpeed score jumped to 72 on mobile without any other optimization. Then after running through the other fixes in this article, we got it to 91. The hosting was the bottleneck the entire time.
6. Elementor’s Built-In CSS Problems — The Stuff That Piles Up
The problem: Beyond the unused widget CSS I mentioned in pitfall #1, Elementor generates inline CSS and custom stylesheets in ways that accumulate over time. Every custom color, every custom margin, every responsive visibility setting — all of it gets written as CSS. And Elementor stores some of this CSS in the database rather than in static files, which means the server has to generate it dynamically on each page load.
There’s also the issue of Elementor’s global styles. If you set global fonts and colors (which you should), but then override them on individual widgets (which people always do), you end up with both the global styles AND the overrides loading. The global styles become useless weight.
And here’s a sneaky one: when you duplicate a page in Elementor, it often carries over CSS from the original page even if the duplicate doesn’t use the same widgets. Over time, this creates phantom CSS that’s attached to pages for no reason.
Why it matters for your business: All this extra CSS adds up. It increases your total page weight, adds render-blocking resources, and hurts your Largest Contentful Paint (LCP) score — another Core Web Vital that Google uses for rankings. I’ve seen Elementor sites where the CSS alone was over 500KB. For context, an entire well-optimized page should be under 500KB total.
How to fix it:
First, use Elementor’s Global Styles consistently. Set your colors and fonts in Site Settings → Global Colors and Global Fonts, and then use them everywhere instead of setting custom values on individual widgets. This keeps your CSS lean and predictable. Every time you pick a custom hex color instead of selecting from your global palette, you’re adding another CSS rule.
Second, periodically regenerate Elementor’s CSS. Go to Elementor → Tools → General and click “Regenerate CSS & Data.” This rebuilds all of Elementor’s style files from scratch, clearing out orphaned styles and phantom CSS from deleted or duplicated pages. I do this after any major round of edits on a client site.
Third, reduce custom responsive overrides. Elementor lets you set different margins, padding, font sizes, and visibility for desktop, tablet, and mobile. This is powerful but creates three CSS rules for every one setting. Before adding a responsive override, ask yourself: “Does this actually look bad on tablet, or am I just being a perfectionist?” Often the default responsive behavior is good enough.
Fourth, avoid the Custom CSS field on individual widgets unless you absolutely need it. Every widget-level custom CSS rule gets inlined on the page. If you need custom styles, it’s cleaner to add them through your theme’s custom CSS area (under Appearance → Customize → Additional CSS) or in a child theme stylesheet. This way it’s cached properly as a single file rather than scattered across dozens of inline style blocks.
Real example: I inherited a 40-page Elementor site where nearly every widget had custom colors instead of using global styles. The homepage had 847 unique CSS rules — many of them duplicates of the same brand color applied individually. I set up proper global colors, applied them site-wide, deleted the custom overrides, and regenerated the CSS. The homepage CSS went from 420KB to 95KB. Combined with the other fixes in this article, the site’s mobile PageSpeed score went from 34 to 82.
Quick Checklist: The 15-Minute Elementor Performance Audit
If you’ve read this far and you’re feeling overwhelmed, here’s the quick version. Do these things today and you’ll see an immediate improvement:
- Elementor → Settings → Performance — Turn on Improved Asset Loading and Improved CSS Loading
- Elementor → Settings → General — Set Google Fonts Load to “Swap”
- Elementor → Settings → Features — Enable Flexbox Container for new pages
- Elementor → Tools → General — Click “Regenerate CSS & Data”
- Check your fonts — Are you using more than 2-3? Cut the extras
- Check your images — Are any over 1MB? Resize and compress them
- Check your hosting — Is PHP set to 8.0+? Is the memory limit at least 256MB?
- Run PageSpeed Insights — Go to pagespeed.web.dev, enter your URL, and see where you stand
That checklist alone will get most Elementor sites from “embarrassing” to “respectable” in about 15 minutes.
Bottom line of Elementor performance pitfalls
Elementor is a fantastic tool. I’m not here to bash it — I use it every day. But like any powerful tool, it needs to be used thoughtfully. A chainsaw is great for cutting down trees. It’s less great if you’re using it to butter toast.
The performance pitfalls I’ve covered here aren’t Elementor’s fault, really. They’re the result of how easy Elementor makes it to add things without thinking about the consequences. More fonts, more images, more sections, more widgets — it all adds up.
The good news is that every single one of these issues is fixable without redesigning your site or switching to a different builder. Most of them don’t even require a developer — just some time in the settings and a willingness to clean things up.
If your Elementor site feels sluggish and you’re not sure where to start, run through the checklist above. And if you’d rather have someone handle it for you, you know where to find me at WorkflowDone.com.
Your visitors — and Google — will thank you.






