Sitemap
made by Gemini AI

From Project to Action

A Deep Dive in Advanced Project Management

--

Imagine you’re running a construction firm tasked with a major renovation. The whole job is one Project, like “Urban Loft Revitalization.” This project is naturally broken down into Zones — ‘Roof,’ ‘Exterior Facade,’ or ‘Interior Rooms.’ Within each Zone, you have a Main Task, such as ‘Drywall Installation and Finishing.’ This, in turn, has several Sub Tasks, like ‘Measure and cut drywall’ or ‘Apply joint compound.’ But to really manage the day-to-day work, we find it’s essential to break it down one step further into simple, clear Actions. In our system, an ‘Action’ is the most granular step, like ‘Prepare surfaces’ or ‘Apply first coat.’ While different management tools might call this third level a ‘checklist item’ or a ‘nested subtask,’ we call them ‘Actions’ because they represent the individual steps someone needs to perform.

Press enter or click to view image in full size
what you want to create

The screenshot below shows the result of this structure. We’ve built a master task table where every single Action gets its own row. This view is powerful because you can see both the full hierarchy for any task and its specific details. For example, you can see the Action ‘Install new roofing materials’ is linked to the ‘Roof Replacement’ Sub Task and the ‘Roofing Contractor’ Crew. This layout allows us to track the status (like ‘In Progress’ or ‘Completed’) for each tiny step, giving us a precise overview of the entire project’s health from the ground up.

To make this all work, the data architecture relies on a series of connected tables. It all starts at the top with our Projects table. Each project is then linked to one or more Zones (like ‘Ground Floor’ or ‘Entire Building’ from our DB Zone table). Each Zone can have several Main Tasks ('Demolition & Structural' is a good example). Following that, each Main Task is broken down into Sub Tasks, which you can see in the DB Subtasks table in the screenshot. Finally, each Sub Task (like 'Initial Strip-out') is linked to a list of its individual Actions ('Remove fixtures,' 'Clear debris,' etc.). This strict hierarchy of Project → Zone → Main Task → Sub Task → Action is the key. By also linking our Crews table, we create a single, powerful system that connects the high-level plan all the way down to the specific crew member doing the work.

Press enter or click to view image in full size
the code logic

What this process highlights is that because we’ve set up a robust data architecture with all the relationships linking forwards and backwards, we aren’t locked into one rigid, top-down logic. Instead, the Subtask emerges as the true “key” or central hub in our approach. Think about it: our Subtask row is the piece that connects everything. It knows which Zone it belongs to, it links "up" to its Main Task, and it also links directly to its assigned Crew. This "hub-and-spoke" model, with the Subtask at the center, is what gives us so much flexibility. It allows us to start from anywhere—like our list of Zones—and navigate the relationships to pull the right data, like finding the correct Main Task via the Subtask, and then grabbing all the Actions associated with it.

Avoid doubles

This setup creates a new challenge: what stops a user from accidentally selecting the same zone twice for the same project, creating a flood of duplicate tasks? We had two ways to solve this. The first option was to make our button formula much more complex; it would have to check the entire table for every selected zone to see if it already existed for that project, and then skip any duplicates. The second, much cleaner option was to prevent the user from ever making the mistake in the first place. We’re going with option two, as it’s a far better user experience. Instead of complicating the button, we add a filter directly to the “Selectable options” of our “Select your zone” control. The formula we use is a neat piece of logic that does all the work for us:

CurrentValue.Contains([DB PFU].Filter(project.Contains(_rel_PFU_projects)).zone).Not()

[DB PFU].Filter(...) first finds all the rows in our main table that match the project we've selected (_rel_PFU_projects). Then, .zone gets the list of all zones that are already added to that project. The CurrentValue.Contains(...) part checks if a potential zone from our master list is in that list of already-added zones. Finally, the crucial .Not() at the end flips the result. It tells the control to only show a zone if the previous check was false. In plain English: "Show this zone only if it is not in the list of zones already added to this project." This makes the tool feel smart, the user can't make a mistake, and we avoid the confusion of a user clicking "Add" and having nothing happen.

We’ve successfully designed more than just a task list; we’ve built a robust, 5-level project management system tailored for complex jobs, breaking work down from a single Project all the way to an individual Action. The real breakthrough came from structuring our data architecture correctly. We learned that by linking all our tables, the Subtask naturally becomes the central “hub” that connects everything — its Zone, its Main Task, and its Crew. This flexible “hub-and-spoke” model is what powers our main button, allowing it to navigate multiple relationships and build a complete, granular list. To top it off, by filtering our “Select zone” control, we’ve made the tool smart and error-proof, preventing duplicate work before it can even be selected. This setup is now ready to be scaled; it gives us the precise, ground-level tracking we need without sacrificing a clean, intuitive, and mistake-free experience for the end-user.

On a personal note, creating these in-depth posts takes a lot of time and effort. While I love sharing my knowledge, a little support goes a long way. If you found this helpful, what about a donation and sharing this post with your fellow Coda enthusiasts? Every bit of encouragement helps!

My name is Christiaan, and I regularly blog about Coda. While this article is free, my professional services (including consultations) are not, but I’m always happy to chat and explore potential solutions. You can find my free contributions in the Coda Community and on X. The Coda Community is a fantastic resource for free insights, especially when you share a sample doc.

--

--

Christiaan Huizer
Christiaan Huizer

Written by Christiaan Huizer

I write every week about how to Coda . You find blogs for beginners and experienced makers. Until 7 days after publication you read my blog for free. Welcome!

No responses yet