Back

Delegation Planner + RACI Builder Tool

You are here: Home / Support Tools / Delegation Planner + RACI Builder Tool

Delegation Planner + RACI Builder

Map who’s Responsible, Accountable, Consulted, and Informed—then export and share.

How it works
  1. Add your roles (people).
  2. Add your tasks (one line each).
  3. Click cells to set R/A/C/I (1 × A per task; ≥ 1 × R).
  4. Fix warnings, then Export.
Need a quick demo? Run a 15‑second tour. Or insert examples: add sample roles · add sample tasks.
1Add roles
2Add tasks
3Assign R/A/C/I
4Export & share
Tip: Bulk add (one per line). Example: PM\nDesigner\nEngineer\nQA.
Due date optional. Bulk add accepts one task per line.
Presets: load roles, tasks, and valid RACI assignments.
Markdown → Notion/Confluence · CSV → Excel/Sheets
Legend: R does the work · A owns the result · C gives input · I kept in the loop
Rule: each task needs exactly 1 A and ≥ 1 R.
Tip: Click a cell to cycle: blank → R → A → C → I. Right‑click a row for quick actions. Use arrows to move; Space/Enter cycle; Shift+Space clear; A sets Accountable.

Per‑person summary

Add roles and tasks to see a breakdown.

Delegation brief

Select a task to generate a brief you can paste into Slack or email.
See an example output (Markdown)
# RACI Matrix — Website Launch

| Task               | Due       | PM | Designer | Engineer | QA |
| ------------------ | --------- | -- | -------- | -------- | -- |
| Define scope       | 2025-09-01| A  | C        | I        | I  |
| Design mockups     | 2025-09-08| C  | A        | R        | I  |
| Implement feature  | 2025-09-22| I  | C        | A        | R  |
| Test & release     | 2025-09-29| I  | C        | R        | A  |
Ready to export?
`; }).join('') : 'No tasks yet. Add sample tasks'; } function renderMatrix(){ // Determine which roles to show const visibleRoles = roles.map((r,idx)=>({name:r,idx})).filter(r=> filterIndexTaskDue' + visibleRoles.map(r=>`
${escapeHtml(r.name)}
`).join('') + ''; for(let i=0;i✓` : `A/R`; html += `${escapeHtml(t.name)} ${badge}${t.due||''}`; for(const r of visibleRoles){ const v = (matrix[i] && matrix[i][r.idx]) || ''; html += `
`; } html += ''; } html += '
'; els.matrix.innerHTML = html; } function rowStatus(ti){ const row = matrix[ti]||[]; const aCount = row.filter(x=>x==='A').length; const rCount = row.filter(x=>x==='R').length; return {a:aCount,r:rCount,ok:aCount===1 && rCount>=1}; } function warnings(){ const msgs=[]; let okCount=0; for(let i=0;i`
• ${escapeHtml(m)}
`).join('') + '
'; els.ruleMsg.innerHTML = `Issues: ${msgs.length}. Fix to continue.`; } else if(tasks.length){ els.alerts.innerHTML = '
Looks good. Each task has an A and at least one R.
'; els.ruleMsg.innerHTML = `All good: ${okCount}/${tasks.length} tasks valid.`; } else { els.alerts.textContent=''; els.ruleMsg.textContent='Rule: each task needs exactly 1 A and ≥ 1 R.'; } } function renderSummaries(){ if(!roles.length || !tasks.length){ els.perperson.textContent='Add roles and tasks to see a breakdown.'; els.brief.textContent='Select a task to generate a brief.'; return; } const per = roles.map(()=>({R:[],A:[],C:[],I:[]})); for(let i=0;i{ function seg(letter,label){ const arr=b[letter]; return arr.length? `
${label} (${arr.length}): ${arr.map(x=>escapeHtml(x.name)).join(', ')}
`:''; } return `
${escapeHtml(roles[idx])}
${seg('A','Accountable')}${seg('R','Responsible')}${seg('C','Consulted')}${seg('I','Informed')}
`; }).join(''); if(tasks.length){ setBrief(0); } } function setBrief(i){ if(i=tasks.length){ els.brief.textContent='Select a task to generate a brief.'; return; } const t=tasks[i]; const row = matrix[i]||[]; const A = row.findIndex(x=>x==='A'); const Rs = row.map((v,idx)=> v==='R'? roles[idx]: null).filter(Boolean); const Cs = row.map((v,idx)=> v==='C'? roles[idx]: null).filter(Boolean); const Is = row.map((v,idx)=> v==='I'? roles[idx]: null).filter(Boolean); const aName = A>=0? roles[A]: '—'; const md = `**Task**: ${t.name}\n**Due**: ${t.due||'—'}\n**Accountable (A)**: ${aName}\n**Responsible (R)**: ${Rs.join(', ')||'—'}\n**Consulted (C)**: ${Cs.join(', ')||'—'}\n**Informed (I)**: ${Is.join(', ')||'—'}\n\n**Check‑ins**: Weekly until done\n**Definition of done**: Agree scope; deliver; review; sign‑off.`; els.brief.innerHTML = `
${escapeHtml(md)}
`; } function toMarkdown(){ const headers = ['Task','Due'].concat(roles); const rows = tasks.map((t,ti)=> [''+t.name, t.due||''].concat(roles.map((_,ri)=> matrix[ti][ri]||'')) ); const line = (arr)=> '| '+arr.map(s=> (String(s).replace(/\|/g,'\\|'))).join(' | ')+' |'; const mdTable = [ line(headers), line(headers.map(()=> '---')), ...rows.map(line) ].join('\n'); return `# RACI Matrix\n\n${mdTable}\n`; } function toCSV(){ const headers = ['Task','Due'].concat(roles); const rows = tasks.map((t,ti)=> ['"'+t.name.replace(/"/g,'""')+'"', '"'+(t.due||'')+'"'].concat(roles.map((_,ri)=> '"'+(matrix[ti][ri]||'')+'"')) ); return [headers.join(','), ...rows.map(r=> r.join(','))].join('\n'); } function writeClipboard(txt,btn){ try{ if(navigator.clipboard && typeof navigator.clipboard.writeText==='function'){ const p = navigator.clipboard.writeText(txt); if(p && typeof p.then==='function'){ p.then(()=> flash(btn), ()=> fallback(txt,btn)); } else { fallback(txt,btn); } } else { fallback(txt,btn); } }catch(e){ fallback(txt,btn); } } function fallback(txt,btn){ try{ const ta=document.createElement('textarea'); ta.value=txt; ta.setAttribute('readonly',''); ta.style.position='fixed'; ta.style.left='-9999px'; document.body.appendChild(ta); ta.select(); document.execCommand('copy'); document.body.removeChild(ta);}catch(e){} flash(btn); } function flash(btn){ if(!btn) return; const t=btn.textContent; btn.textContent='Copied!'; setTimeout(()=> btn.textContent=t, 1200); } // Event wiring on(els.addRole,'click', ()=>{ const v=els.roleInput.value.trim(); if(v){ addRole(v); els.roleInput.value=''; } }); on(els.addTask,'click', ()=>{ const v=els.taskInput.value.trim(); if(v){ addTask(v, els.taskDue.value||''); els.taskInput.value=''; els.taskDue.value=''; } }); on(els.bulkRoles,'click', ()=>{ const txt=prompt('Paste roles, one per line'); if(txt!=null){ parseLines(txt).forEach(addRole); }}); on(els.bulkTasks,'click', ()=>{ const txt=prompt('Paste tasks, one per line'); if(txt!=null){ parseLines(txt).forEach(n=> addTask(n,'')); }}); on(els.rolesList,'click', (e)=>{ const del = e.target.getAttribute && e.target.getAttribute('data-del-role'); if(del!=null){ removeRole(Number(del)); return; } const chip = e.target.closest && e.target.closest('[data-role]'); if(chip){ const i=Number(chip.getAttribute('data-role')); const nn=prompt('Rename role', roles[i]); if(nn!=null){ renameRole(i, nn.trim()); } updateFilterOptions(); } }); on(els.tasksList,'click', (e)=>{ const del = e.target.getAttribute && e.target.getAttribute('data-del-task'); if(del!=null){ removeTask(Number(del)); return; } const chip = e.target.closest && e.target.closest('[data-task]'); if(chip){ const i=Number(chip.getAttribute('data-task')); const nn=prompt('Rename task', tasks[i].name); if(nn!=null){ renameTask(i, nn.trim()); } setBrief(i); } }); on(els.matrix,'click', (e)=>{ const btn = e.target.closest && e.target.closest('.chip'); if(!btn) return; const ti = Number(btn.getAttribute('data-ti')); const ri = Number(btn.getAttribute('data-ri')); const next = cycle(btn.getAttribute('data-v')||''); setCell(ti,ri,next); btn.setAttribute('data-v', next); btn.textContent = next || '–'; setBrief(ti); }); // Keyboard support on(els.matrix,'keydown', (e)=>{ const btn = e.target.closest && e.target.closest('.chip'); if(!btn) return; const ti = Number(btn.getAttribute('data-ti')); const ri = Number(btn.getAttribute('data-ri')); if(['ArrowLeft','ArrowRight','ArrowUp','ArrowDown','Enter',' ','Spacebar','a','A'].includes(e.key)) e.preventDefault(); if(e.key==='Enter' || e.key===' ' || e.key==='Spacebar'){ const next=cycle(btn.getAttribute('data-v')||''); setCell(ti,ri,next); btn.setAttribute('data-v', next); btn.textContent=next||'–'; return; } if(e.shiftKey && (e.key===' ' || e.key==='Spacebar')){ setCell(ti,ri,''); btn.setAttribute('data-v',''); btn.textContent='–'; return; } if(e.key==='a' || e.key==='A'){ setCell(ti,ri,'A'); btn.setAttribute('data-v','A'); btn.textContent='A'; return; } const pos = findCellPosition(ti,ri); if(e.key==='ArrowLeft') moveFocus(pos.ti, stepVisibleRole(-1, pos.visibleIndex)); if(e.key==='ArrowRight') moveFocus(pos.ti, stepVisibleRole(1, pos.visibleIndex)); if(e.key==='ArrowUp') moveFocus(Math.max(0, ti-1), ri); if(e.key==='ArrowDown') moveFocus(Math.min(tasks.length-1, ti+1), ri); }); function findCellPosition(ti,ri){ const vis = roles.map((_,idx)=> idx).filter(idx=> filterIndex idx).filter(idx=> filterIndex{ const row = e.target.closest && e.target.closest('tr[data-row]'); if(!row) return; e.preventDefault(); const ti = Number(row.getAttribute('data-row')); const action = prompt('Row actions: type "clear" to clear row, or type role number (1..'+roles.length+') to set A to that role.\nExample: 2'); if(action==null) return; if(action.toLowerCase()==='clear'){ for(let j=0;j=1 && n writeClipboard(toMarkdown(), els.exportMd)); on(els.exportCsv,'click', ()=>{ const csv = toCSV(); const blob=new Blob([csv],{type:'text/csv'}); const url=URL.createObjectURL(blob); const a=document.createElement('a'); a.href=url; a.download='raci.csv'; document.body.appendChild(a); a.click(); setTimeout(()=>{ URL.revokeObjectURL(url); a.remove(); }, 400); }); on(els.share,'click', ()=>{ const state = collectState(); const url = new URL(location.href.split('#')[0]); url.searchParams.set('raci', encodeURIComponent(JSON.stringify(state))); writeClipboard(url.toString(), els.share); }); on(els.reset,'click', ()=>{ if(confirm('Clear roles, tasks, and assignments?')){ roles=[]; tasks=[]; matrix=[]; save(); render(); els.alerts.textContent=''; } }); // Sticky action bar triggers on(els.saMd,'click', ()=> els.exportMd.click()); on(els.saCsv,'click', ()=> els.exportCsv.click()); on(els.saShare,'click', ()=> els.share.click()); // Role filter on(els.roleFilter,'change', ()=>{ filterIndex = Number(els.roleFilter.value||-1); renderMatrix(); }); function updateFilterOptions(){ const v = els.roleFilter.value; els.roleFilter.innerHTML = '' + roles.map((r,i)=> ``).join(''); els.roleFilter.value = (v!=null ? v : '-1'); } // Quick examples on(els.exRoles,'click', (e)=>{ e.preventDefault(); ['PM','Designer','Engineer','QA'].forEach(addRole); }); on(els.exTasks,'click', (e)=>{ e.preventDefault(); ['Define scope','Design mockups','Implement feature','Test & release'].forEach(n=> addTask(n,'')); }); on(root,'click',(e)=>{ if(e.target && e.target.id==='add-ex-roles'){ e.preventDefault(); ['PM','Designer','Engineer','QA'].forEach(addRole); } if(e.target && e.target.id==='add-ex-tasks'){ e.preventDefault(); ['Define scope','Design mockups','Implement feature','Test & release'].forEach(n=> addTask(n,'')); } }); // Save/restore const store={ set(k,v){ try{ localStorage.setItem(k, JSON.stringify(v)); }catch(e){} }, get(k,d){ try{ const v=localStorage.getItem(k); return v? JSON.parse(v): d; }catch(e){ return d; } } }; function collectState(){ return {roles, tasks, matrix}; } function applyState(s){ if(!s) return; roles=Array.isArray(s.roles)? s.roles: []; tasks=Array.isArray(s.tasks)? s.tasks: []; matrix=Array.isArray(s.matrix)? s.matrix: []; render(); } function save(){ store.set('raci_state', collectState()); } // Presets on(els.preset,'click', ()=>{ roles=['PM','Designer','Engineer','QA']; tasks=[{id:1,name:'Define scope',due:''},{id:2,name:'Design mockups',due:''},{id:3,name:'Implement feature',due:''},{id:4,name:'Test & release',due:''}]; matrix=[ ['A','R','C','I'], ['C','A','R','I'], ['I','C','A','R'], ['I','C','R','A'] ]; render(); save(); scrollToMatrix(); }); on(els.preset2,'click', ()=>{ roles=['Scrum Master','Product Owner','Dev Lead','QA']; tasks=[{id:1,name:'Backlog grooming',due:''},{id:2,name:'Sprint planning',due:''},{id:3,name:'Daily stand‑ups',due:''},{id:4,name:'Sprint review',due:''}]; matrix=[ ['I','A','R','C'], ['C','A','R','I'], ['I','C','R','I'], ['I','A','R','C'] ]; render(); save(); scrollToMatrix(); }); on(els.preset3,'click', ()=>{ roles=['Account Manager','Project Manager','Engineer','Client']; tasks=[{id:1,name:'Knowledge transfer',due:''},{id:2,name:'Access & credentials',due:''},{id:3,name:'Support plan',due:''}]; matrix=[ ['C','A','R','I'], ['I','A','R','C'], ['A','C','R','I'] ]; render(); save(); scrollToMatrix(); }); function scrollToMatrix(){ const el = $('#fld-matrix'); if(el){ el.classList.add('pulse'); el.scrollIntoView({behavior:'smooth',block:'center'}); setTimeout(()=> el.classList.remove('pulse'), 1200); } } // Tour on(els.tour,'click', ()=>{ const seq=['#fld-roles','#fld-tasks','#fld-matrix','.sticky-actions']; let i=0; function step(){ if(i>0){ const prev=$(seq[i-1]); if(prev) prev.classList.remove('pulse'); } if(i{ const el=$(s); if(el) el.classList.remove('pulse'); }); } } step(); }); // Init from URL or storage (function init(){ const q = new URLSearchParams(location.search).get('raci'); if(q){ try{ applyState(JSON.parse(decodeURIComponent(q))); }catch(e){} } else { applyState(store.get('raci_state', null)); } render(); })(); // ===== Minimal self-tests ===== (function tests(){ try{ // CRLF parsing const lines=(['a','','b'].join('\r\n')).split(/\r?\n/).map(s=>s.trim()).filter(Boolean); console.assert(lines.length===2 && lines[0]==='a' && lines[1]==='b','CRLF split ok'); // Preset validity $('#preset').click(); const aOk = matrix.every(row=> row.filter(x=>x==='A').length===1); const rOk = matrix.every(row=> row.filter(x=>x==='R').length>=1); console.assert(aOk && rOk, 'Preset rows valid'); // CSV has headers + rows const csv = toCSV(); console.assert(csv.split('\n').length>=5,'CSV rows >=5'); // Keyboard cycle on a cell const first = els.matrix.querySelector('.chip'); if(first){ first.focus(); first.dispatchEvent(new KeyboardEvent('keydown',{key:'Enter',bubbles:true})); } }catch(e){ console.warn('Self-tests failed', e); } })(); // Utils function escapeHtml(s){ return String(s).replace(/&/g,'&').replace(//g,'>'); } function escapeAttr(s){ return String(s).replace(/"/g,'"'); } })();

Instant Download Training packages

All you need
to deliver a great training!

Our training material packages come with all you need to provide
a professional and accelerated learning solution with

training-materials-slides2

High Impact
Power Point Slide Deck

To support immersive learning, a high impact professionally designed power point slide deck to engage trainees at all levels.

training-materials-student-workbook2

Student
Workbook

A comprehensive reference workbook you can give out to your class participants as a quick future reference.

training-materials-trainer-guide2222

Trainer
Guide

With step-by-step clear directions with tips and suggestions on what to say and how to present each slide.

excercise-sheets2

Activity
/Exercise Sheets

Various training material and support documents to help you both explain and debrief the different exercises, activities and games Plus a fun final Jeopardy style review game as a fun ending for your training program.

additional-documents2

Additional
Support Documents

To ensure you have all you need to deliver a complete and professional training program, additional supporting documents are included with each full course material package. From training evaluation forms to 5 different certificate templates that you can edit and hand out to your participants at the end of your training.

job_aid_forms2

Job Aids
& Forms

Specific forms designed to extend and reinforce the training that participants can utilize back on the job to help them apply the new learned concepts (Select training material packages)

Get all our training Packages
and Save!

Save over $1500 and Get each full program for under $99.00 & 6 Mini Courses free

Instant Download Training packages

All you need
to deliver a great training!

Our training material packages come with all you need to provide
a professional and accelerated learning solution with

training-materials-slides2

High Impact
Power Point Slide Deck

To support immersive learning, a high impact professionally designed power point slide deck to engage trainees at all levels.

training-materials-student-workbook2

Student
Workbook

A comprehensive reference workbook you can give out to your class participants as a quick future reference.

training-materials-trainer-guide2222

Trainer
Guide

With step-by-step clear directions with tips and suggestions on what to say and how to present each slide.

excercise-sheets2

Activity
/Exercise Sheets

Various training material and support documents to help you both explain and debrief the different exercises, activities and games Plus a fun final Jeopardy style review game as a fun ending for your training program.

additional-documents2

Additional
Support Documents

To ensure you have all you need to deliver a complete and professional training program, additional supporting documents are included with each full course material package. From training evaluation forms to 5 different certificate templates that you can edit and hand out to your participants at the end of your training.

job_aid_forms2

Job Aids
& Forms

Specific forms designed to extend and reinforce the training that participants can utilize back on the job to help them apply the new learned concepts (Select training material packages)

Get all our training Packages
and Save!

Save over $1500 and Get each full program for under $99.00 & 6 Mini Courses free