Curated, not scraped n8n Workflow Directory A hand-picked library of automation templates for n8n — organized by what they actually solve, so you can find the right starting point in under a minute instead of digging through a raw dump of workflows.
30 workflows
7 categories
100% reviewed for setup notes
No workflows match those filters
Try a broader search term or clear your filters to see the full directory.
Every workflow here is written and reviewed for accuracy — including where a template can fail, not just what it does. Node counts and exact configurations vary by n8n version, so treat these as build guides to customize, not one-click imports.
Browse the full node library at n8n.io .
${t.title} ${t.desc}
${t.apps.map(a=>`${a} `).join('')}
`; } function renderGrid(){ let items = TEMPLATES.filter(t=>{ const matchCat = state.category === 'all' || t.category === state.category; const matchComplexity = state.complexity === 'all' || t.complexity === state.complexity; const haystack = (t.title + ' ' + t.desc + ' ' + t.apps.join(' ')).toLowerCase(); const matchSearch = state.search === '' || haystack.includes(state.search); return matchCat && matchComplexity && matchSearch; }); if(state.sort === 'name'){ items.sort((a,b)=>a.title.localeCompare(b.title)); } else if(state.sort === 'complexity-asc'){ items.sort((a,b)=>COMPLEXITY_RANK[a.complexity]-COMPLEXITY_RANK[b.complexity]); } else if(state.sort === 'complexity-desc'){ items.sort((a,b)=>COMPLEXITY_RANK[b.complexity]-COMPLEXITY_RANK[a.complexity]); } const grid = document.getElementById('n8nGrid'); const empty = document.getElementById('n8nEmptyState'); grid.innerHTML = items.map(cardHtml).join(''); empty.classList.toggle('show', items.length === 0); document.getElementById('resultCount').innerHTML = `Showing
${items.length} of
${TEMPLATES.length} workflows`; grid.querySelectorAll('.card').forEach(card=>{ card.addEventListener('click', ()=>openModal(Number(card.dataset.id))); }); } const backdrop = document.getElementById('n8nModalBackdrop'); const modalBody = document.getElementById('n8nModalBody'); let lastFocused = null; function openModal(id){ const t = TEMPLATES.find(x=>x.id === id); const cat = CATEGORIES[t.category]; lastFocused = document.activeElement; modalBody.style.setProperty('--cat-color', cat.color); modalBody.innerHTML = `
${cat.label} ${t.title} ${t.detail}
Best for: ${t.bestFor}
${t.apps.map(a=>`${a} `).join('')}
Explore related nodes on n8n.io ↗ `; backdrop.hidden = false; document.getElementById('n8nModalClose').focus(); document.addEventListener('keydown', onModalKeydown); } function closeModal(){ backdrop.hidden = true; document.removeEventListener('keydown', onModalKeydown); if(lastFocused) lastFocused.focus(); } function onModalKeydown(e){ if(e.key === 'Escape') closeModal(); } document.getElementById('n8nModalClose').addEventListener('click', closeModal); backdrop.addEventListener('click', e=>{ if(e.target === backdrop) closeModal(); }); document.getElementById('n8nTotalCount').textContent = TEMPLATES.length; renderGrid(); })();