[{"data":1,"prerenderedAt":164},["ShallowReactive",2],{"\u002Fportfolio\u002Fmarket-muscles":3},{"id":4,"title":5,"body":6,"case_studies":133,"client":5,"cover":24,"date":140,"description":141,"excerpt":142,"extension":146,"headline":147,"meta":148,"navigation":149,"order":126,"partner":150,"partner_link":151,"path":152,"seo":153,"stem":154,"technology":155,"__hash__":163},"portfolio\u002Fportfolio\u002Fmarket-muscles.md","MarketMuscles",{"type":7,"value":8,"toc":124},"minimark",[9,13,25,30,33,36,40,43,46,49,52,56,59,62,71,78,82,85,92,101,105],[10,11,12],"p",{},"Market Muscles provides an all-in-one marketing and membership management platform for martial arts and dance studios. I joined in October 2018 as the first full-stack engineer, with the company scaling rapidly over the next 18 months.",[10,14,15],{},[16,17],"img",{"alt":18,"className":19,"src":24},"image alt text",[20,21,22,23],"md:w-1\u002F3","md:float-right","my-12","rounded-2xl","\u002Fimg\u002Fportfolio\u002Fmarketmuscles\u002Fmessages-ui.jpg",[26,27,29],"h2",{"id":28},"role","Role",[10,31,32],{},"When I first joined Market Muscles, they had a complex series of WordPress plugins that handled basic lead form collection, and a very poorly performing messaging system which had been built by contractors over the previous 12 months. Like most startup codebases, the code worked, but it was difficult to understand, maintain, and it did not scale.",[10,34,35],{},"My role over the first 6 months was to understand how customers used the software and get to know the codebase by handling support tickets. Throughout the process I was able to build enough context to determine ways to improve it.",[26,37,39],{"id":38},"version-one","Version One",[10,41,42],{},"The first big endeavour was to migrate the core functionality out of WordPress and into a multi-tenant, headless application built on Laravel and a UI built with Vue that could be embedded in the WordPress admin interface.",[10,44,45],{},"Part of this iteration involved migrating hundreds of thousands of records out of 100+ individual WordPress installs and into a centralized MySQL database. I developed custom migration scripts to handle the extract-transform-load process, including creating new accounts in the multi-tenant system and assigning imported data to the correct owners.",[10,47,48],{},"This phase also expanded functionality by providing an interface for two-way SMS messaging and adding features to the marketing workflows system.",[10,50,51],{},"I also formalized policies for GitHub branching, created a standardized deployment process, and shifted to serving assets from AWS CloudFront.",[26,53,55],{"id":54},"version-two","Version Two",[10,57,58],{},"There were several major drivers to begin another major iteration. Market Muscles wanted to massively expand the CRM functionality, marketing automation tools, and break into the membership management industry. For this phase, I hired and onboarded an additional US-based software engineer and contracted with two offshore developers.",[10,60,61],{},"The first constraint to be addressed was to move the UI out of an embedded spot in their website admin and into a full web application experience. The Laravel application was updated with a login flow, dashboard, and dedicated interfaces for each feature. The new UI utilized Tailwind, Vue, and Inertia.",[10,63,64,65,70],{},"Rapid growth of our customer base and the increased utility of our Bulk Messaging and Marketing Automation features exposed the need to optimize these workflows. A daily flood of 10s of thousands of messages required us to rethink this system. Read more about the solution in ",[66,67,69],"a",{"href":68},"\u002Fcase-study\u002Fmm-automated-messaging","the Automated Messaging case study",".",[10,72,73,74,70],{},"To meet the increase in traffic and requirements for security and uptime, I designed a distributed system that shares workload and avoids single-points-of-failure. Read more about this solution in ",[66,75,77],{"href":76},"\u002Fcase-study\u002Fmm-high-availability","the High Availability case study",[26,79,81],{"id":80},"version-three","Version Three",[10,83,84],{},"This iteration brought together the years of data and experience from the previous versions and let us focus on crafting a refined experience for business owners and their customers. I hired and brought up an additional US-based software engineer, as well as another EU-based developer.",[10,86,87,88,70],{},"The a major step in this version was to codify best practices, coding standards, testing, and static analysis across the codebase. As we progressively refactored into utilizing strict typing in PHP, these tools helped us surface issues without needing to write explicit tests. Read more about how this was addressed in ",[66,89,91],{"href":90},"\u002Fcase-study\u002Fmm-static-analysis-testing-linting-laravel","the Static Analysis, Testing, and Linting case study",[10,93,94,95,100],{},"Another benefit of this refactor was to migrate to a Domain-Driven Design pattern. The rapidly expanding set of functionality required us to consider intertwining complexity and enforce ",[96,97,99],"abbr",{"title":98},"Single Responsibility Principle","SRP",", along with the rest of the SOLID design principles.",[26,102,104],{"id":103},"responsibilities-impact","Responsibilities & impact:",[106,107,108,112,115,118,121],"ul",{},[109,110,111],"li",{},"Owned the design and implementation of the platform's infrastructure and development lifecycle",[109,113,114],{},"Led the migration of a monolithic application to a layered architecture, improving separation of concerns and enabling future complexity",[109,116,117],{},"Built and standardised shared systems for data retrieval, DTOs, components, forms, and layouts, reducing duplication and inconsistency",[109,119,120],{},"Reverse-engineered competitors' functionality to guide feature development to maintain industry relevancy and allow us to focus on defining features",[109,122,123],{},"Established conventions and patterns across the full stack that improved developer velocity and long-term maintainability",{"title":125,"searchDepth":126,"depth":126,"links":127},"",2,[128,129,130,131,132],{"id":28,"depth":126,"text":29},{"id":38,"depth":126,"text":39},{"id":54,"depth":126,"text":55},{"id":80,"depth":126,"text":81},{"id":103,"depth":126,"text":104},[134,136,138],{"title":135,"path":68},"Automated Messaging",{"title":137,"path":76},"High Availability",{"title":139,"path":90},"Static Analysis, Testing, and Linting","2024-12-31","Membership Management CRM",{"type":7,"value":143},[144],[10,145,12],{},"md","Architecture and Development for a Membership Management CRM",{},true,"MarketMuscles, LLC","https:\u002F\u002Fwww.marketmuscles.com\u002F","\u002Fportfolio\u002Fmarket-muscles",{"title":5,"description":141},"portfolio\u002Fmarket-muscles",[156,157,158,159,160,161,162],"Enterprise Architecture","Laravel","TypeScript","Vue","Tailwind","WebSockets","Event Driven","VhlDUZmV60kVJzFhlew0S_Sk2PHihkOVCUdStOKpxsk",1790357551896]