<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Justin Pennington</title>
    <description>The latest articles on DEV Community by Justin Pennington (@justinpennington).</description>
    <link>https://dev.to/justinpennington</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4143207%2F74c64db3-3655-48b0-b476-f8eef6b82cf3.jpg</url>
      <title>DEV Community: Justin Pennington</title>
      <link>https://dev.to/justinpennington</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/justinpennington"/>
    <language>en</language>
    <item>
      <title>Buy vs. Build Is the Wrong Ticket. Ask Who Can Change the Workflow.</title>
      <dc:creator>Justin Pennington</dc:creator>
      <pubDate>Fri, 23 Oct 2026 15:42:40 +0000</pubDate>
      <link>https://dev.to/justinpennington/buy-vs-build-is-the-wrong-ticket-ask-who-can-change-the-workflow-5o0</link>
      <guid>https://dev.to/justinpennington/buy-vs-build-is-the-wrong-ticket-ask-who-can-change-the-workflow-5o0</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://penningtonj.com/blog/buying-or-building-misses-the-real-question" rel="noopener noreferrer"&gt;penningtonj.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you have shipped internal tools for long enough, you have seen this ticket: "Evaluate buy vs. build for X." Somebody attaches a spreadsheet. One column is a SaaS license. The other is an engineering estimate. Whichever number is smaller wins, and the team moves on.&lt;/p&gt;

&lt;p&gt;I run a small product studio in Ponte Vedra, Florida, and I have watched that spreadsheet make the wrong call in both directions. The problem is not the math. The problem is that the spreadsheet measures the cheapest thing to estimate and skips the thing that actually decides whether the project works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The variable nobody puts in a cell
&lt;/h2&gt;

&lt;p&gt;The question that matters is this: &lt;strong&gt;when the workflow changes next quarter, who is allowed to change the system?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It will change. A new service line appears. A customer starts requiring something the current process can't produce. A compliance section shows up in a bid that nobody planned for. A handoff that used to end at "lead created" now has to carry context all the way into delivery.&lt;/p&gt;

&lt;p&gt;Whoever can make that change, quickly and without opening a new project, owns the system. Not whoever paid for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two failure modes, same root cause
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bought, and "close enough."&lt;/strong&gt; Configuration feels like power right up until the thing you need is not a setting. Then you file a feature request, build a workaround, or pay for a customization that belongs cleanly to neither you nor the vendor. Six months later the workaround is the real system and the product is the thing people log into for reporting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built, and orphaned.&lt;/strong&gt; The custom tool matched the business perfectly on launch day. Then the person who built it moved on, nobody was named to keep it matched, and it drifted every month after. Eventually someone trusts a status field that no longer means what the screen says.&lt;/p&gt;

&lt;p&gt;Neither one is a software failure. Both are ownership failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  A better split: common loops vs. specific edges
&lt;/h2&gt;

&lt;p&gt;Instead of "which is cheaper this year," ask whether the workflow is &lt;strong&gt;common enough that someone should be improving it as their full-time job&lt;/strong&gt;, or &lt;strong&gt;specific enough that any general product will always be a compromise your team routes around&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A surprising amount of what sounds unique in discovery is a common loop with local nouns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Work comes in.&lt;/li&gt;
&lt;li&gt;It gets assigned.&lt;/li&gt;
&lt;li&gt;Someone does it.&lt;/li&gt;
&lt;li&gt;Someone else needs to know it's done.&lt;/li&gt;
&lt;li&gt;The invoice follows without a human remembering to start it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That loop wants a product. We stopped rebuilding it as one-off client code at Infraxio and put it into IFX Hub, so task history, approvals next to the work, and closed-deal-to-delivery all live in a system that does not depend on whoever wrote the last version.&lt;/p&gt;

&lt;p&gt;The same logic applies to narrower jobs. Dock scheduling is a good example: the appointment at the door is a promise to a carrier and a plan for the crew inside, and it has to change at the speed of the yard. That is why DockOps is aimed at one job instead of being a tab inside a platform that "also does scheduling."&lt;/p&gt;

&lt;p&gt;Then there are the true edges: a pricing exception, a crew-to-crew handoff, an approval path that would make no sense at the company next door. Forcing those into a generic product usually means the workaround becomes the system. Those are worth building, on the stack you already run, &lt;strong&gt;if&lt;/strong&gt; someone who still works there can change them when the edge moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each choice really commits you to
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;You get&lt;/th&gt;
&lt;th&gt;You owe&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Buy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Other customers fund the roadmap&lt;/td&gt;
&lt;td&gt;Your important changes must match theirs, and arrive before a workaround hardens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Change the workflow without filing a request&lt;/td&gt;
&lt;td&gt;You must keep changing it, forever, with a named owner&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Buying is a great deal for the boring middle: accounting close, payroll, the standard order path. It is a bad deal for the workflow that makes you different, or one your team has already abandoned twice.&lt;/p&gt;

&lt;p&gt;Building without an owner just gets you a more expensive spreadsheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do this before anyone prices anything
&lt;/h2&gt;

&lt;p&gt;Before the license-vs-estimate spreadsheet exists, write down &lt;strong&gt;three workflows that will have to change in the next twelve months&lt;/strong&gt;. Not features. Workflows: who does the work, what they hand off, and what "done" means.&lt;/p&gt;

&lt;p&gt;Next to each one, write &lt;strong&gt;a name&lt;/strong&gt;. Not a team. A person who can change how that workflow runs (in the product, the config, or the codebase) without kicking off a new project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you can't write a name, you're not ready to buy &lt;em&gt;or&lt;/em&gt; build. You're about to design a dependency and call it a system.&lt;/li&gt;
&lt;li&gt;If the name is a vendor's customer success manager, be honest that you're waiting on their roadmap, and only buy if that wait is acceptable for this workflow.&lt;/li&gt;
&lt;li&gt;If the name is someone on your team, choose whatever lets them change it as part of the job, not as an after-hours favor.&lt;/li&gt;
&lt;li&gt;If the name is a contractor who will leave, write down who they hand it to. A build without that handoff is a rental you paid for like you owned it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The smaller number on the spreadsheet isn't the decision. The name next to the workflow is.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Justin Pennington, founder of &lt;a href="https://infraxio.com/justin-pennington" rel="noopener noreferrer"&gt;Infraxio&lt;/a&gt;, a product studio in Ponte Vedra building operational software for businesses across Northeast Florida and beyond. More essays at &lt;a href="https://penningtonj.com" rel="noopener noreferrer"&gt;penningtonj.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>softwareengineering</category>
      <category>startup</category>
      <category>management</category>
    </item>
    <item>
      <title>Make CRM Data a Side Effect of the Work, Not a Chore Next to It</title>
      <dc:creator>Justin Pennington</dc:creator>
      <pubDate>Mon, 19 Oct 2026 16:03:22 +0000</pubDate>
      <link>https://dev.to/justinpennington/make-crm-data-a-side-effect-of-the-work-not-a-chore-next-to-it-5900</link>
      <guid>https://dev.to/justinpennington/make-crm-data-a-side-effect-of-the-work-not-a-chore-next-to-it-5900</guid>
      <description>&lt;p&gt;If you've ever built or administered a CRM, you've probably seen the dashboard that looks great for two weeks and quietly turns into fiction by week three. The usual diagnosis is people: the reps won't log their calls, ops forgets to move the deal stage, marketing assumes someone else will enter the lead.&lt;/p&gt;

&lt;p&gt;I think that diagnosis is wrong, and it leads teams to the wrong fix. The data dies because of where the system sits, not because of who uses it.&lt;/p&gt;

&lt;p&gt;I'm Justin Pennington, founder of Infraxio, based in Ponte Vedra in St. Johns County, Florida. We build operations software for mid-size businesses and run our own company on it. This is a builder-oriented rewrite of an essay on my site, &lt;a href="https://penningtonj.com/blog/nobody-lives-in-the-crm" rel="noopener noreferrer"&gt;Nobody Lives in the CRM&lt;/a&gt;. More about me and what we're building: &lt;a href="https://infraxio.com/justin-pennington" rel="noopener noreferrer"&gt;infraxio.com/justin-pennington&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tab test
&lt;/h2&gt;

&lt;p&gt;Watch what someone on an operations team actually has open at 9 AM on a Monday: chat, email, maybe a project board. The CRM is one tab away, and that tab may as well not exist.&lt;/p&gt;

&lt;p&gt;When a prospect replies, the instinct is to answer in the thread where the conversation is happening and move on. Updating a record is a second action that happens later, if at all. Humans are very good at deleting second actions from their day, and they're right to be. It's overhead that helps someone else run a report.&lt;/p&gt;

&lt;p&gt;So the question I ask when reviewing any internal system is simple: &lt;strong&gt;is this tool on the path of the work, or next to it?&lt;/strong&gt; Tools on the path get adopted without a mandate. Tools next to the path need enforcement forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enforcement is a symptom
&lt;/h2&gt;

&lt;p&gt;The standard response to a dying CRM is a stack of enforcement mechanisms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Required fields that block saving a contact until twelve boxes are filled&lt;/li&gt;
&lt;li&gt;Weekly pipeline reviews where the manager asks why nothing was updated&lt;/li&gt;
&lt;li&gt;Automated nag emails from the admin&lt;/li&gt;
&lt;li&gt;A quarterly "data cleanup day"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of these produces compliance, not adoption. You get data that's late, minimal, and grudging. If you're the engineer asked to add yet another validation rule, that's a signal the architecture is wrong, not that the validation is missing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Re-entry is where data quality goes to die
&lt;/h2&gt;

&lt;p&gt;From a systems point of view, the bigger problem isn't motivation. It's that the CRM is downstream of several other systems and depends on humans to copy data between them.&lt;/p&gt;

&lt;p&gt;Every manual hop is a lossy transform:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hop&lt;/th&gt;
&lt;th&gt;What typically gets lost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Campaign tool to CRM&lt;/td&gt;
&lt;td&gt;Source, engagement history, score&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRM to project tool&lt;/td&gt;
&lt;td&gt;Scope notes, promised dates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Project tool to invoicing&lt;/td&gt;
&lt;td&gt;Completed milestones, billable time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbox to CRM&lt;/td&gt;
&lt;td&gt;The actual conversation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A transposed phone number here, an abbreviated company name there, an optional "lead source" field left blank because the rep was in a hurry. Multiply by every lead, every week, and within a month nobody trusts the data. Once nobody trusts it, nobody updates it. That feedback loop is the week-three cliff.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design principle: state transitions create the records
&lt;/h2&gt;

&lt;p&gt;The fix I keep coming back to is architectural. Put the relationship data inside the workspace where the work happens, and let the records get written as a byproduct of people moving work forward.&lt;/p&gt;

&lt;p&gt;Concretely, that means designing around transitions people already perform, not forms they're asked to fill in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A lead qualifies.&lt;/strong&gt; It should arrive in the workspace with its context attached: which campaign sourced it, what it engaged with, how it scored. Nobody retypes it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A deal closes.&lt;/strong&gt; The delivery tasks should be generated in the same workspace, linked to the same client record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A milestone completes.&lt;/strong&gt; The billing data should already be there, because the work and the time were tracked in the same place.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each step is something the operator was going to do anyway. The data trail is a consequence, not a separate job.&lt;/p&gt;

&lt;p&gt;This is the pattern we built IFX Hub around: the deal, tasks, client updates, time entries, and invoices live in one operational workspace rather than three tools wired together. Upstream, Growth7 handles outbound campaigns, lead scoring, and qualification, and routes qualified leads into that workspace with their history intact. I'm biased, obviously. But the principle holds whatever stack you use, including a homegrown one.&lt;/p&gt;

&lt;h2&gt;
  
  
  A checklist if you're building or picking one
&lt;/h2&gt;

&lt;p&gt;If you're designing an internal ops tool, or evaluating one for your company, these are the questions I'd ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Does work happen inside it?&lt;/strong&gt; If tasks, client communication tracking, and billing live elsewhere, the record will always lag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does data enter exactly once?&lt;/strong&gt; Count the places a client's name gets typed. More than one is a bug.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the first screen useful to the person doing the work?&lt;/strong&gt; Not the VP. The coordinator opening it at 7 AM. If the landing page is a pipeline chart they don't care about, they'll close it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Are reports derived or demanded?&lt;/strong&gt; Forecasts and client health should fall out of real activity, not be assembled by someone filling in fields for a meeting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why the industry keeps shipping the side-trip CRM
&lt;/h2&gt;

&lt;p&gt;Most CRMs are optimized for the person who buys the software, usually a sales leader or CEO who wants pipeline visibility, rather than the person who uses it all day. That's why they demo well in a conference room and stall in the field.&lt;/p&gt;

&lt;p&gt;I see it constantly with service businesses and contractors across Northeast Florida, from Ponte Vedra to downtown Jacksonville. These are sharp operators. They bought a well-known CRM, did the implementation, did the training. Six months later the most reliable pipeline source is a text thread between the founder and the sales lead.&lt;/p&gt;

&lt;p&gt;That's not a discipline problem. It's a design problem, and design problems are the kind engineers can actually fix.&lt;/p&gt;

&lt;p&gt;So before you add another required field, ask the better question: where does this team already spend its day, and can the CRM function live there instead?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://penningtonj.com/blog/nobody-lives-in-the-crm" rel="noopener noreferrer"&gt;penningtonj.com&lt;/a&gt;. I'm Justin Pennington, founder of Infraxio in Ponte Vedra, Florida. More writing at &lt;a href="https://penningtonj.com" rel="noopener noreferrer"&gt;penningtonj.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What's the worst "required field" you've ever been asked to add to keep a CRM alive? I'd like to hear it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>architecture</category>
      <category>saas</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Model Your AI Agent as an Assignee, Not a Chat Session</title>
      <dc:creator>Justin Pennington</dc:creator>
      <pubDate>Tue, 13 Oct 2026 15:52:42 +0000</pubDate>
      <link>https://dev.to/justinpennington/model-your-ai-agent-as-an-assignee-not-a-chat-session-2ki7</link>
      <guid>https://dev.to/justinpennington/model-your-ai-agent-as-an-assignee-not-a-chat-session-2ki7</guid>
      <description>&lt;p&gt;Most internal AI rollouts I see die the same quiet death. Someone wires up a chatbot, a few people try it, the answers are decent, and six weeks later the tab is closed and nobody misses it. The model was fine. The integration point was wrong.&lt;/p&gt;

&lt;p&gt;I'm Justin Pennington, founder of Infraxio, based in Ponte Vedra in St. Johns County, Florida. We build operations software for mid-size businesses, and we run our own company on it. This is a developer-oriented rewrite of a longer essay on my site, &lt;a href="https://penningtonj.com/blog/put-ai-on-the-task-board" rel="noopener noreferrer"&gt;Put AI on the Task Board, Not in a Chat Window&lt;/a&gt;. More about me and what we build: &lt;a href="https://infraxio.com/justin-pennington" rel="noopener noreferrer"&gt;infraxio.com/justin-pennington&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The short version: if you're building AI into an operational tool, stop modeling the agent as a conversation and start modeling it as a user who can be assigned work.&lt;/p&gt;

&lt;h2&gt;
  
  
  We've shipped this bug before
&lt;/h2&gt;

&lt;p&gt;Anyone who has implemented a CRM has watched this movie. The CRM was a place you had to &lt;em&gt;go to&lt;/em&gt;, not a place where the work already lived. Reps kept their real pipeline in a spreadsheet, the CRM became a reporting surface for management, and adoption numbers looked great right up until someone checked the data.&lt;/p&gt;

&lt;p&gt;Bolt-on AI chat has the same architecture problem. It's a side trip. Side trips don't survive a busy Tuesday.&lt;/p&gt;

&lt;p&gt;People don't abandon tools because the tools are bad. They abandon tools that aren't on the path of least resistance. In most companies, that path is the system of record: the board or tracker where tasks get assigned, statuses change, and work gets reviewed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chat is the wrong primitive for operational work
&lt;/h2&gt;

&lt;p&gt;Chat is great for brainstorming, ad-hoc questions, and first drafts. But look at what a chat session lacks compared to a task:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Chat session&lt;/th&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Assignee&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deadline&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Due date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;Scrollback&lt;/td&gt;
&lt;td&gt;Status column&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review&lt;/td&gt;
&lt;td&gt;Optional, manual&lt;/td&gt;
&lt;td&gt;Built into the workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;History&lt;/td&gt;
&lt;td&gt;A transcript nobody searches&lt;/td&gt;
&lt;td&gt;Activity log on the record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downstream links&lt;/td&gt;
&lt;td&gt;Copy-paste&lt;/td&gt;
&lt;td&gt;Dependencies, parent project, client&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When operational work happens in chat, you've quietly created a parallel system. The real system of record never learns the work happened, and the decision it informed isn't recorded anywhere that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design: the agent is just another assignee
&lt;/h2&gt;

&lt;p&gt;This is how we approached AI inside IFX Hub, our operations platform. A task can be handed to a person or to an AI agent, and the mechanics are deliberately identical:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Assign&lt;/strong&gt; the task, with the same fields any task has: description, due date, context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The agent picks it up&lt;/strong&gt; and does the work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status moves to review&lt;/strong&gt; when it's done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A human approves it or sends it back&lt;/strong&gt; with comments, exactly like reviewing a colleague's work.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're designing this yourself, the main implication is in your data model: the assignee field shouldn't care whether it points at a human or an agent. Same task table, same status machine, same comment thread, same permissions checks. No separate "AI results" screen.&lt;/p&gt;

&lt;p&gt;That one decision buys you three things for free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An audit trail.&lt;/strong&gt; Every agent action is logged where human actions are logged. You don't need a separate dashboard to answer "what did the AI do, when, and who signed off?" The task history answers it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review by default.&lt;/strong&gt; Agent output lands on the same board as everything else, so it enters the same review loop. The ops lead who scans the board every morning sees AI-completed and human-completed work side by side. There's no extra step to go check on the bot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accountability.&lt;/strong&gt; When something goes wrong, and something always goes wrong, you can trace it: assigned at this time, produced this output, reviewed by this person, approved or rejected. That chain of custody matters for quality, for compliance, and for not losing track of what happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to route to the agent first
&lt;/h2&gt;

&lt;p&gt;Not every task belongs on an agent's queue. The filter we use internally, and with clients, is three questions. A task is a good first candidate only if it passes all three.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repetitive:&lt;/strong&gt; it follows the same pattern every time. Status updates from structured data, a report from a template, background research for a bid response, a follow-up email triggered by a project milestone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Well-specified:&lt;/strong&gt; you can check the output without senior judgment. The extraction captured the right fields or it didn't. The report matches the template or it doesn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reversible:&lt;/strong&gt; if it's wrong, fixing it is cheap. A draft that needs editing is fine. Deleting records, sending a client communication, or submitting a bid should stay with a human until you have real confidence in that specific workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anything that's novel, ambiguous, &lt;em&gt;and&lt;/em&gt; consequential stays with people: strategy, client relationships, calls that depend on context the system doesn't capture. The point is to take load off people so they can spend time on the work that actually needs them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build for the 7 AM Monday, not the demo
&lt;/h2&gt;

&lt;p&gt;A natural-language query bar or a generative dashboard looks great in a demo. The features that survive are the ones that remove a step from a workflow the user is &lt;em&gt;already&lt;/em&gt; doing. "Assign this to the agent" is one click on a board people already open every morning. "Open the AI tool and explain the context" is a new habit, and new habits lose.&lt;/p&gt;

&lt;p&gt;That's the same lesson I've seen with clients across Jacksonville and Northeast Florida for years, whether the tool was an ERP, a CRM, or now an AI agent: the software has to live where the work happens, create less friction rather than more, and make it obvious what happens when you use it.&lt;/p&gt;

&lt;p&gt;I'm curious how others are handling this. If you've put agents into a production workflow, did you model them as users, as background jobs, or as something else, and what broke?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://penningtonj.com/blog/put-ai-on-the-task-board" rel="noopener noreferrer"&gt;penningtonj.com&lt;/a&gt;. Justin Pennington is the founder of Infraxio in Ponte Vedra, Florida.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>architecture</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Rule of Three for Turning Client Work Into Products</title>
      <dc:creator>Justin Pennington</dc:creator>
      <pubDate>Tue, 06 Oct 2026 15:47:30 +0000</pubDate>
      <link>https://dev.to/justinpennington/the-rule-of-three-for-turning-client-work-into-products-5dof</link>
      <guid>https://dev.to/justinpennington/the-rule-of-three-for-turning-client-work-into-products-5dof</guid>
      <description>&lt;p&gt;I have a simple rule for deciding when client work should become a product: if I have built substantially the same system for three different companies, it is no longer a project. It is a pattern, and patterns deserve a permanent home.&lt;/p&gt;

&lt;p&gt;I am Justin Pennington, founder of Infraxio, based in Ponte Vedra in St. Johns County, Florida. Before we had a product line, we had a client list: custom systems, integrations, and operational fixes delivered one engagement at a time. This post is a developer-flavored rewrite of a longer essay on my site, &lt;a href="https://penningtonj.com/blog/from-client-work-to-products" rel="noopener noreferrer"&gt;From Client Work to Products: What Agency Pain Taught Me About Software That Ships&lt;/a&gt;. More on me and what we build: &lt;a href="https://infraxio.com/justin-pennington" rel="noopener noreferrer"&gt;infraxio.com/justin-pennington&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The third rebuild is the signal
&lt;/h2&gt;

&lt;p&gt;The first time you build a post-sale handoff workflow for a client, it feels like custom work. The second time, you reuse a few pieces and call it experience. The third time, you are copy-pasting schemas, renaming fields, and re-fixing bugs you already fixed twice.&lt;/p&gt;

&lt;p&gt;That third rebuild is where I started asking a better question: why am I solving this from scratch every time?&lt;/p&gt;

&lt;p&gt;If you do agency or consulting development, you probably have one of these sitting in your repos right now. The same webhook glue. The same "sync the CRM to the project tool" job. The same reporting view the owner keeps asking for. It just lives in five private repos with five slightly different names.&lt;/p&gt;

&lt;h2&gt;
  
  
  What client work shows you that product teams miss
&lt;/h2&gt;

&lt;p&gt;Pure product teams often learn about pain through discovery calls and feature requests. Client work shows you something rawer: what breaks on a Wednesday afternoon when the system someone bought eighteen months ago does not match how their team actually works.&lt;/p&gt;

&lt;p&gt;The failure modes repeat with almost boring consistency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A CRM that tracks pipeline beautifully and has no idea what happens after the deal closes.&lt;/li&gt;
&lt;li&gt;A project tracker that works for the PM and leaves the owner with a reporting dead zone.&lt;/li&gt;
&lt;li&gt;A marketing stack that generates leads, with the handoff into operations being a chat message and a hope.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each one is fixable with a custom build. We fixed them, repeatedly. But custom builds have a ceiling. They solve the problem for one company, in one context, at one moment. When the team changes or the business grows, the custom solution starts to drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  How that turned into actual products
&lt;/h2&gt;

&lt;p&gt;Every product we run at Infraxio traces back to a pattern we kept rebuilding:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IFX Hub&lt;/strong&gt; came from stitching CRM, project management, invoicing, and operational tracking together for client after client. The post-sale workflow is where context dies, because the CRM knows the client, the project tool knows the tasks, and the accounting system knows the invoices, but none of them know the whole picture. Usually one operations lead holds it together with a spreadsheet and a remarkable memory. Hub is meant to be the system that person wishes they had. We ran our own business on it first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Growth7&lt;/strong&gt; came from growth work for clients. Campaigns produced results, but the client's operational systems could not absorb them, so leads stalled. Growth7 connects growth activity forward into delivery instead of stopping at the conversion event.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IFX Bid&lt;/strong&gt; came from government procurement work, where the options were enterprise software priced for defense contractors or a shared drive of old proposals. The real pain of bid response, past performance narratives, compliance sections spread across people, overlapping deadlines, was living in spreadsheets and email threads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DockOps&lt;/strong&gt; came from dock and yard operations where clipboard and radio were still the state of the art. Scheduling, carrier check-in, yard inventory, and dock assignment are coordination problems with real cost when they go wrong, and mid-size operators were stuck between ancient tools and software built for a much larger scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  When custom should stay custom
&lt;/h2&gt;

&lt;p&gt;The rule of three cuts both ways. Not everything should be productized.&lt;/p&gt;

&lt;p&gt;Some workflows are the competitive advantage. They are tied to one company's structure, one niche, or one operating model, and generalizing them would sand off the exact thing that makes them valuable. If I have built something once and the requirements were deeply tied to that client, it stays bespoke.&lt;/p&gt;

&lt;p&gt;Forcing a product shape onto a genuinely custom problem gives you software that is mediocre at everything instead of excellent at one thing. That is a worse outcome for the client than an honest custom build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shipping the code is about forty percent of it
&lt;/h2&gt;

&lt;p&gt;The other lesson from years of client delivery: writing the software is maybe forty percent of the job. The rest is adoption.&lt;/p&gt;

&lt;p&gt;CRMs fail because the sales team never uses them consistently. ERP rollouts fail because the implementation ignored how the warehouse actually processes orders. Growth tools fail because their output never lands in anyone's daily workflow.&lt;/p&gt;

&lt;p&gt;So our definition of done includes a question that has nothing to do with test coverage: will the person opening this at 7 AM on a Monday actually use it instead of going back to their spreadsheet? If the answer is no, the feature is not done, no matter how clean the code is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the shift is worth it
&lt;/h2&gt;

&lt;p&gt;We still consult, and we still build custom systems when that is the right call. But the center of gravity has moved toward products that encode the patterns we kept rebuilding.&lt;/p&gt;

&lt;p&gt;A custom engagement ends when the statement of work is complete. A product compounds. Every improvement reaches every customer, and every customer's usage shapes the next improvement. The feedback loop is tighter, and the work outlasts any one engagement.&lt;/p&gt;

&lt;p&gt;If you run an agency or a dev shop, here or anywhere else, and you keep solving the same problem in different wrappers, the product probably already exists in your repos. You just have not extracted it yet.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Justin Pennington is founder of Infraxio, based in Ponte Vedra, Florida. Writing: &lt;a href="https://penningtonj.com" rel="noopener noreferrer"&gt;penningtonj.com&lt;/a&gt;. About: &lt;a href="https://infraxio.com/justin-pennington" rel="noopener noreferrer"&gt;infraxio.com/justin-pennington&lt;/a&gt;. Original essay: &lt;a href="https://penningtonj.com/blog/from-client-work-to-products" rel="noopener noreferrer"&gt;From Client Work to Products&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>startup</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Your Growth Stack Is Blind After the Close</title>
      <dc:creator>Justin Pennington</dc:creator>
      <pubDate>Wed, 30 Sep 2026 15:46:24 +0000</pubDate>
      <link>https://dev.to/justinpennington/your-growth-stack-is-blind-after-the-close-29f2</link>
      <guid>https://dev.to/justinpennington/your-growth-stack-is-blind-after-the-close-29f2</guid>
      <description>&lt;p&gt;Most growth tooling I have evaluated in the last few years sells the same story: more leads, smarter sequences, cleaner scoring, a prettier handoff to sales.&lt;/p&gt;

&lt;p&gt;Then the deal closes.&lt;/p&gt;

&lt;p&gt;The nurtured lead becomes a row in a different system, owned by a different team, with no memory of the twelve touchpoints that got them there. Campaign dashboards stay green. Delivery starts cold. That seam — marketing to operations — is where B2B companies quietly lose context, trust, and hours.&lt;/p&gt;

&lt;p&gt;I am Justin Pennington, founder of Infraxio, based in Ponte Vedra in St. Johns County. This is a Dev.to rewrite of a longer essay on my site; the full version is here: &lt;a href="https://penningtonj.com/blog/where-marketing-stops-and-operations-start" rel="noopener noreferrer"&gt;Where Marketing Stops and Operations Start — and Why That Gap Costs Deals&lt;/a&gt;. More on me and what we build: &lt;a href="https://infraxio.com/justin-pennington" rel="noopener noreferrer"&gt;infraxio.com/justin-pennington&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The seam nobody owns
&lt;/h2&gt;

&lt;p&gt;In a typical org, marketing owns the qualified lead. Sales owns the deal cycle. Ops — onboarding, projects, delivery, invoicing — inherits the result.&lt;/p&gt;

&lt;p&gt;Specialization is fine. Broken context is not.&lt;/p&gt;

&lt;p&gt;The CRM knows deal value, close date, and owner. It usually does &lt;strong&gt;not&lt;/strong&gt; know the scope that was promised, the timeline the buyer expects, or the pain points that actually drove the purchase. That lives in emails, call notes, and proposal docs. Delivery excavates it — if they know to look.&lt;/p&gt;

&lt;p&gt;I have watched this in companies around Jacksonville and Northeast Florida and far outside it. A services firm closes real revenue, then the client's first delivery call is a re-interview of everything they already told sales. That is not one clumsy kickoff. It is an architecture problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the stack stops at the signature
&lt;/h2&gt;

&lt;p&gt;Marketing automation, project tools, and billing rarely share a buyer. The VP of Marketing buys growth. The COO buys the PM suite. The CFO buys invoicing. Each vendor optimizes their slice. Almost nobody designs for the transition.&lt;/p&gt;

&lt;p&gt;So you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A lead-scoring model with no concept of a project or deliverable&lt;/li&gt;
&lt;li&gt;A task board with no concept of campaign attribution&lt;/li&gt;
&lt;li&gt;An invoice system that only wants a line item and a due date&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The "integration layer" is Zapier glue, CSV exports, and the one person who remembers how the pieces fit. When they are out, the handoff breaks.&lt;/p&gt;

&lt;p&gt;If you have ever maintained that glue — webhooks that fire late, field maps that rot, silent sync failures — you already know this is an ops reliability problem wearing a growth costume.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three concrete leaks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Context loss.&lt;/strong&gt; Every time a client repeats themselves to a new person on a new form, trust erodes. That is data continuity failing, not a missing welcome email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attribution gap.&lt;/strong&gt; If growth never sees on-time delivery, renewal, or LTV, you optimize for lead volume or close rate while funding campaigns that produce fast closes and high churn. Half-blind dashboards feel precise until retention shows up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational drag.&lt;/strong&gt; Manual project setup — copy details, assign team, set timeline — is often thirty to sixty minutes per deal. Twenty deals a month is a full workweek of admin that exists only because two systems do not share a schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bridging growth data into delivery
&lt;/h2&gt;

&lt;p&gt;That gap shaped how we build at Infraxio.&lt;/p&gt;

&lt;p&gt;IFX Hub started as the operational spine: CRM, projects, invoicing. Clean ops still fails if marketing and sales data arrives incomplete, inconsistent, or late. That is a big reason Growth7 exists the way it does. Growth7 launched publicly this week — not as another campaign bolt-on, but as a layer meant to connect forward into Hub and the delivery stack so first-touch data survives into fulfillment.&lt;/p&gt;

&lt;p&gt;Saying that is easy. Building it is not. A marketing "lead" is probabilistic — engagement signals, score, maybe. An ops "client" is concrete — contract, scope, timeline, invoice schedule. Bridging those models takes real schema work, not a webhook on deal-won.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agency hours vs. product infrastructure
&lt;/h2&gt;

&lt;p&gt;When we ran growth as agency work — custom campaigns, bespoke reporting — we saw the same failure mode everywhere: marketing produced heat, ops could not absorb it cleanly. Hot leads cooled in onboarding queues with no system to catch them.&lt;/p&gt;

&lt;p&gt;Product thinking asks a different question. Not "how do I run a great campaign for this client," but "how do I connect growth activity to operational delivery for every client, repeatably." That is the difference between selling hours and building infrastructure.&lt;/p&gt;

&lt;p&gt;Growth7 is our product answer. Sequences and ad optimization are table stakes. The value is what happens when the lead converts and the system does not lose its memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "working" looks like
&lt;/h2&gt;

&lt;p&gt;When the marketing-to-ops boundary is designed on purpose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delivery opens a project that already carries sales-cycle context — carried forward, not copy-pasted&lt;/li&gt;
&lt;li&gt;Attribution reaches project completion and retention, so marketing can optimize for LTV&lt;/li&gt;
&lt;li&gt;Capacity planning sees pipeline before close, not after&lt;/li&gt;
&lt;li&gt;The client stops re-explaining themselves at every stage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You do not need one monolithic platform. You need systems that treat the handoff as a first-class interface — the same way good APIs treat contracts between services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build for the seam
&lt;/h2&gt;

&lt;p&gt;Growth7 is live and the Hub integration is working. There is still a long roadmap of tightening that connection. The same philosophy applies across the Infraxio tools: each domain should be strong, and the leverage should come from clean data between them.&lt;/p&gt;

&lt;p&gt;If you are running B2B ops out of Jacksonville, St. Johns County, Ponte Vedra, or anywhere else and you recognize the pattern — converts that stall in onboarding, campaigns that look great until you measure delivered revenue, a team burning hours on handoff work that should be automatic — the fix is rarely "buy another marketing tool" or "buy another ops tool." It is connecting what you have, or replacing pieces with systems built to stay connected.&lt;/p&gt;

&lt;p&gt;That is what we are building. That is what launched this week.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Justin Pennington is founder of Infraxio, based in Ponte Vedra. Writing: &lt;a href="https://penningtonj.com" rel="noopener noreferrer"&gt;penningtonj.com&lt;/a&gt; · About: &lt;a href="https://infraxio.com/justin-pennington" rel="noopener noreferrer"&gt;infraxio.com/justin-pennington&lt;/a&gt; · Original essay: &lt;a href="https://penningtonj.com/blog/where-marketing-stops-and-operations-start" rel="noopener noreferrer"&gt;Where Marketing Stops and Operations Start&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
      <category>startup</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
