HubSpot Code Block | HubDev

Dynamic Blog Filters in HubSpot CMS Using HubL and JavaScript | Boost Engagement & UX

Written by Deepak Jha | 9 November 2025

In today’s competitive digital space, visitors expect speed, personalization, and seamless navigation. A dynamic blog filtering system in HubSpot CMS helps readers instantly find relevant content by category, tag, or author — improving engagement, dwell time, and overall website performance. Here’s how to build one using HubL and JavaScript for a modern, interactive experience.

1. Structuring Blog Data with HubL

First, use HubL to convert your blog posts into structured JSON. This lets JavaScript manipulate and display them dynamically on the frontend.


{% set posts = blog_recent_posts('default', 100) %}
{% set data = posts|map(post => {
  'title': post.name,
  'url': post.absolute_url,
  'tags': post.topic_list|map('name'),
  'author': post.blog_author.display_name,
  'date': post.publish_date|datetimeformat('%b %e, %Y')
}) %}
<script>
  const blogPosts = {{ data|tojson }};
</script>

This approach creates a clean, ready-to-use dataset that JavaScript can filter instantly without reloading the page — crucial for fast-loading HubSpot blogs.

2. Creating a Simple Filter Interface

Now, set up minimal markup for filter options and a container to display posts.

<div id="filter-section">
  <select id="tagFilter">
    <option value="">All Topics</option>
  </select>
</div>

<div id="blogList"></div>

This clean layout ensures full flexibility for responsive styling while keeping the DOM light and accessible.

3. Filtering and Rendering with JavaScript

Next, use JavaScript to populate tag filters and dynamically render filtered blog posts.

<script>
const tags = [...new Set(blogPosts.flatMap(p => p.tags))];
const filter = document.getElementById('tagFilter');
const list = document.getElementById('blogList');

tags.forEach(t => {
  const o = document.createElement('option');
  o.value = t; o.textContent = t;
  filter.appendChild(o);
});

function showPosts(data) {
  list.innerHTML = data.map(p => `
    <article>
      <h4><a href="${p.url}">${p.title}</a></h4>
      <p>${p.author} — ${p.date}</p>
    </article>
  `).join('');
}

filter.addEventListener('change', e => {
  const v = e.target.value;
  showPosts(v ? blogPosts.filter(p => p.tags.includes(v)) : blogPosts);
});

showPosts(blogPosts);
</script>

This enables smooth, instant filtering powered by client-side rendering, reducing server load and improving HubSpot CMS site performance.

4. Styling for Modern UX

Keep styling clean, minimal, and mobile-friendly to complement the HubSpot theme.

<style>
#filter-section { margin-bottom: 1rem; }
#tagFilter { padding: .5rem; border-radius: 6px; }
article { border-bottom: 1px solid #eee; padding: 1rem 0; }
h4 a { color: #222; text-decoration: none; }
h4 a:hover { color: #0066cc; }
</style>

This ensures a consistent, visually polished layout that aligns with modern UI/UX best practices.

Final Thoughts

Adding a dynamic blog filter in HubSpot CMS is one of the most effective ways to deliver a fast, intuitive content experience. By combining HubL for data preparation and JavaScript for interactivity, you can achieve a seamless and professional-level result that enhances user satisfaction and SEO performance.

If you’re exploring advanced HubSpot CMS development, website performance upgrades, or interactive UI integrations — feel free to reach out with your questions or project ideas. Fill out the form below; I’d be glad to help.