{"id":80281,"date":"2026-07-08T00:36:34","date_gmt":"2026-07-07T19:06:34","guid":{"rendered":"https:\/\/www.tothenew.com\/blog\/?p=80281"},"modified":"2026-07-17T08:13:16","modified_gmt":"2026-07-17T02:43:16","slug":"automate-weekly-report-on-kanban-project-with-zero-additional-cost","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/automate-weekly-report-on-kanban-project-with-zero-additional-cost\/","title":{"rendered":"Automate Weekly Report on Kanban Project \u2013 With Zero Additional Cost"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>Every Friday, before sending the weekly status report, I repeated the same routine: open the backlog, scan 60+ rows, identify what changed, extract blockers, update the RAID log, and reformat everything into a professional delivery report.<\/p>\n<p>It took 60\u201390 minutes every week, and almost none of it required real thinking &#8211; it was simply translating data into a report.<\/p>\n<p>I run delivery for a Kanban-based digital project at TOTHENEW for a telecom client. The backlog lives in Google Sheets. Not Jira, not any managed project tool \u2014 because that is what the client\u2019s workflow supports. This is the story of how I automated that entire reporting pipeline without buying a single new tool, without a paid API, and without involving the engineering team.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>The Problem Nobody Talks About<\/strong><\/h2>\n<p>There is a version of this story where someone says: \u201cJust integrate Jira with a reporting tool and automate the whole thing.\u201d<\/p>\n<p>That advice is correct. If you already have Jira.<\/p>\n<p>For the rest of us running delivery on Google Sheets because the client doesn\u2019t use Jira, because procurement won\u2019t approve a new tool mid-engagement, because the team is lean \u2014 that advice doesn\u2019t land. Most real-world delivery setups are messier than what gets written about. The PM is still expected to produce professional reporting anyway.<\/p>\n<p>That gap, between the textbook setup and the real one, is exactly where this approach lives.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>The Setup<\/strong><\/h2>\n<p>The backlog is a Google Sheet with two tabs: Portal (website) and MAPP (mobile app). Every task has a status, a dependency\/RAID column, a risk level, and one column I introduced: AI_Flag.<\/p>\n<p>Throughout the week, as tasks move, I tag the relevant rows with a W in the AI_Flag column. That tag is the only manual input the entire system depends on.<\/p>\n<p>The W-flag was the key design decision. Kanban has no sprint boundary, so there is no natural \u201cthis week\u2019s work\u201d filter. Date hygiene on a live backlog is inconsistent. Tasks get updated at odd times, some never dated. Rather than building brittle date-parsing logic, I made the filter deliberate. I tag what\u2019s relevant throughout the week, and the script processes only what\u2019s tagged.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>What I Built<\/strong><\/h2>\n<p>At the core of the solution is a Python script (<em>weekly_report_generator.py<\/em>). When I run it, it reads the live backlog, validates the data, categorises every tagged task, generates the HTML report, creates a Gmail draft, and finally produces a verification log so I can review everything before sending it.<\/p>\n<ul>\n<li><strong>A fully formatted HTML delivery report<\/strong> with a visual chart, task breakdown by status (Completed \/ In Progress \/ In UAT \/ On Hold), RAID log, active blockers table, and a \u201cComing Up\u201d pipeline section.<\/li>\n<li><strong>A filter output log<\/strong> \u2014 a plain-text verification layer so I can confirm the data before anything goes to the client.<\/li>\n<li><strong>A Gmail draft, created automatically.<\/strong> No copy-paste required.<\/li>\n<\/ul>\n<p>Columns are matched by name with aliases (raid_flag, dependency, and dependencies all resolve to the same field), and status values are normalised so &#8220;Prod Deployed&#8221;, &#8220;Done&#8221;, and &#8220;Completed&#8221; all land in the same bucket.<\/p>\n<p>A validation checkpoint then confirms that no W-flagged row was silently dropped. If something doesn&#8217;t match, the script stops and highlights exactly what failed.<\/p>\n<p>Rather than building custom integrations between each step, I use an LLM to orchestrate the workflow &#8211; retrieving the latest backlog, running the reporting script, presenting the outputs for review, and preparing the Gmail draft. The Python script still owns all business logic and data processing.<\/p>\n<p>The result is a consistent, validated report that&#8217;s ready for a final human review. Here\u2019s what the generated report looks like:<\/p>\n<div id=\"attachment_80279\" style=\"width: 635px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-80279\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-80279 size-large\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/06\/TPF_Weekly_Report_21Jun2026-html-06-22-2026_02_21_PM-720x1024.png\" alt=\"Weekly Report\" width=\"625\" height=\"889\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/06\/TPF_Weekly_Report_21Jun2026-html-06-22-2026_02_21_PM-720x1024.png 720w, \/blog\/wp-ttn-blog\/uploads\/2026\/06\/TPF_Weekly_Report_21Jun2026-html-06-22-2026_02_21_PM-211x300.png 211w, \/blog\/wp-ttn-blog\/uploads\/2026\/06\/TPF_Weekly_Report_21Jun2026-html-06-22-2026_02_21_PM-768x1093.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/06\/TPF_Weekly_Report_21Jun2026-html-06-22-2026_02_21_PM-1079x1536.png 1079w, \/blog\/wp-ttn-blog\/uploads\/2026\/06\/TPF_Weekly_Report_21Jun2026-html-06-22-2026_02_21_PM-1439x2048.png 1439w, \/blog\/wp-ttn-blog\/uploads\/2026\/06\/TPF_Weekly_Report_21Jun2026-html-06-22-2026_02_21_PM-624x888.png 624w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><p id=\"caption-attachment-80279\" class=\"wp-caption-text\">Sample Generated Report<\/p><\/div>\n<p>The report is generated in seconds, but the final review remains intentional. That balance between automation and oversight is what makes the workflow reliable.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>Why Not Just Use Jira? Why Not Fully Automate?<\/strong><\/h2>\n<p>Both fair questions.<\/p>\n<p><strong>On Jira:<\/strong> it\u2019s excellent when the whole project ecosystem is built around it. When the client owns a different workflow, you adapt. Google Sheets is not a compromise. It\u2019s a practical choice made under real constraints.<\/p>\n<p><strong>On Full Automation:<\/strong> I could have automated more. Auto-send the email. Schedule the report to run without me. I didn\u2019t, deliberately. A report sent without someone reviewing it is a liability, not an efficiency. Go-live calls, escalation decisions, and anything that touches the client relationship need a human in the loop. What I automated was the compilation, the mechanical process of transforming project data into a report. The judgment stayed with me.<\/p>\n<p>That boundary was a design choice, not a gap.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>Zero Additional Cost<\/strong><\/h2>\n<p>The entire stack runs on tools already in use:<\/p>\n<ul>\n<li><strong>Google Sheets<\/strong> \u2014 already the project\u2019s backlog source.<\/li>\n<li><strong>Python<\/strong> \u2014 open source, no licence cost.<\/li>\n<li><strong>LLM (Large Language Model)<\/strong> \u2014 used as the AI orchestration layer across the delivery workflow.<\/li>\n<li><strong>Gmail + Google Drive connector<\/strong> \u2014 native integration, no third-party middleware.<\/li>\n<\/ul>\n<p>Because every component was already part of our existing toolset, the only investment was the initial setup. From then on, the time savings became a recurring benefit every Friday.<\/p>\n<p>Although I built this for a telecom delivery project, the same approach can be applied to any team managing work in spreadsheets &#8211; whether for product delivery, operations, or support.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>Key Takeaways<\/strong><\/h2>\n<ul>\n<li><strong>Design your filter convention before anything else.<\/strong> Decide how the system knows what \u201cthis week\u201d means. It needs to be simple enough that you\u2019ll actually maintain it without friction.<\/li>\n<li><strong>Separate data, logic, and output.<\/strong> The sheet is the data layer. The script is the logic layer. The LLM is the orchestration layer. Each can be updated independently.<\/li>\n<li><strong>Build validation before you trust the output.<\/strong> Silent failures (data dropped without any error message) are worse than loud ones. The checkpoint saved me more than once.<\/li>\n<li><strong>Write column resolution with aliases.<\/strong> Real sheets have inconsistencies. Ten minutes of alias mapping prevents months of breakage.<\/li>\n<li><strong>Don\u2019t wait for the ideal setup.<\/strong> If your client is on Google Sheets, build for Google Sheets. The constraint is not the problem \u2014 it\u2019s the starting point.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2>The Outcome<\/h2>\n<ul>\n<li><strong>Before:<\/strong> 60\u201390 minutes every Friday, inconsistent formatting, no structured RAID log, no blockers table.<\/li>\n<li><strong>After:<\/strong> about 5 minutes to run the workflow, review the output, and send the report. The report is more thorough and consistent than the one I produced manually. The client gets more signal and the format never varies.<\/li>\n<\/ul>\n<p>That consistency matters more than I expected. A report that lands every Friday in the same structure, without fail, builds a kind of trust that a better-written but irregular report never quite does.<\/p>\n<p>The gap between \u201cAI can automate delivery work\u201d and \u201cI actually automated my delivery work\u201d is mostly a gap of specificity. The tools exist. The approach isn\u2019t complex. It just requires looking at the exact task you repeat every week and asking: Which parts are mechanical, and which parts actually need me?<\/p>\n<p>AI didn&#8217;t replace my role as a delivery manager. It removed the repetitive work that added little value, leaving me more time for the conversations, decisions, and risks that actually matter. That&#8217;s where I think AI delivers its greatest value &#8211; not replacing judgment, but giving us more time to use it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Every Friday, before sending the weekly status report, I repeated the same routine: open the backlog, scan 60+ rows, identify what changed, extract blockers, update the RAID log, and reformat everything into a professional delivery report. It took 60\u201390 minutes every week, and almost none of it required real thinking &#8211; it was simply [&hellip;]<\/p>\n","protected":false},"author":1200,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":2},"categories":[5878],"tags":[8661,1853,5918,8660,5986],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/80281"}],"collection":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/users\/1200"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=80281"}],"version-history":[{"count":5,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/80281\/revisions"}],"predecessor-version":[{"id":80526,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/80281\/revisions\/80526"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=80281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=80281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=80281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}