Scaling

Scaling Delivery Without Scaling Headcount

⏱ 16 min

An agency that rebuilds its ability registration, MCP server setup, and safety guardrails from scratch for every new client hits a hard ceiling: revenue can only grow as fast as billable hours can be added, since every new client is roughly as expensive to deliver as the last one. The way out isn’t hiring faster, it’s the same answer software engineering has always had for repeated work: standardize the reusable parts into a shared library once, so that a new client engagement means configuring and depending on that library rather than rewriting it. Course 8 already built the real technical pattern for this. This lesson applies it specifically to running a multi-client delivery practice.

What you'll learn in this lesson
Why headcount-linked growth is the default trap
Rebuilding the same abilities and guardrails per client caps how fast you can grow profitably.
Course 8's reusable ability library, as an agency asset
The same Composer package pattern, now shared across every client plugin you ship.
Templated client setups
A scaffold that turns "set up a new client" into filling in a config, not writing new registration code.
What still needs a human, deliberately
Standardizing the repeatable parts doesn't mean removing judgment from the parts that still need it.
Prerequisites

Course 8’s reusable ability library lesson (Composer packaging, PSR-4 autoloading, guarding against duplicate loads). This lesson assumes that pattern and applies it across many client engagements rather than many plugins from one vendor.

Step 1: The trap of rebuilding per client

Rebuild-per-client versus a shared, versioned library
AspectRebuild per clientShared ability library
New client setup timeRoughly constant per client, since the same code is written again each timeShrinks over time as the library covers more of what a typical client needs
Bug fixes and security patchesApplied client by client, easy to miss oneApplied once in the library, every client on that version benefits
Consistency of guardrails (Lesson 5)Depends on whoever built that client’s abilities remembering to add themGuaranteed by depending on the library, the guardrail ships with it
Who can deliver a new clientOnly whoever originally wrote the pattern, or someone who re-derives itAny team member who can configure and depend on an existing package

Imagine a small agency managing twelve client sites, each with its own hand-written ability registration copied and lightly modified from the last client’s code. A security fix to one client’s permission_callback logic, discovered after an incident, has to be manually reapplied to eleven other codebases, and there’s no reliable way to confirm all eleven actually got it. That’s the exact problem a shared, versioned library is built to remove.

Step 2: The same library pattern, now shared across clients

Course 8 covered structuring an ability library as a Composer package with PSR-4 autoloading and a guard against being loaded twice. For an agency, that package becomes a genuine internal product: the set of abilities, permission patterns, and guardrails (including Lesson 5’s environment check) that show up in most client engagements, versioned and improved centrally instead of copy-pasted.

What typically belongs in an agency's shared ability library
The environment guardrail from Lesson 5
Written once, included in every client plugin automatically.
Common, generic abilities
List posts, search content, get/update a post's meta, the shapes that repeat across most WordPress sites regardless of client.
A standard MCP server registration helper
A small wrapper around create_server() with your agency's usual defaults for transport and permission callbacks already set.
A standard audit-logging table and wrapper
Course 4's pattern, shipped once, so every client gets the same audit trail (and the transparency commitment from Lesson 4) by default.

What does not belong in the shared library is anything genuinely client-specific: a client’s own custom post types, their particular brand voice for a chatbot (Lesson 3), or a one-off integration with a system only that client uses. The library’s job is to cover the eighty percent that repeats, the same split Lesson 1 drew between what productizes and what doesn’t.

Step 3: A templated client setup, not a blank plugin

With the library in place, standing up a new client becomes a scaffolding exercise rather than a coding exercise. A minimal, real shape for that scaffold:

my-agency/client-scaffold/
├── composer.json          (requires my-agency/wp-client-abilities: ^2.0)
├── client-config.php      (this client's specific post types, capabilities, branding)
└── my-agency-client.php   (plugin bootstrap, loads the library and this client's config)
// File: my-agency-client.php
require_once __DIR__ . '/vendor/autoload.php';

add_action( 'plugins_loaded', function () {
	// The shared library: common abilities, MCP server helper, guardrails, audit log.
	\MyAgency\ClientAbilities\Registrar::init();

	// This client's own configuration: which post types, which custom abilities.
	require __DIR__ . '/client-config.php';
} );
// File: client-config.php (the only file that changes meaningfully per client)
add_action( 'wp_abilities_api_init', function () {
	wp_register_ability( 'client-acme/list-service-listings', array(
		'label'               => __( 'List Acme service listings', 'my-agency' ),
		'category'            => 'client-acme',
		'input_schema'        => array( 'type' => 'object', 'properties' => array() ),
		'permission_callback' => array( \MyAgency\ClientAbilities\Guardrails::class, 'is_safe_for_ai_write_actions' ),
		'execute_callback'    => function () {
			return get_posts( array( 'post_type' => 'service_listing', 'numberposts' => 20 ) );
		},
	) );
} );

New client onboarding now means filling in client-config.php with that client’s own post types and any genuinely custom abilities, while the shared library keeps providing the guardrails, common abilities, and MCP server setup identically for every client on the same version.

Version the library the same way Course 8 recommended

Once several client sites depend on the shared library, its ability names and schemas are a public contract in exactly the sense Course 8 described. Bump versions deliberately, document breaking changes, and don’t rename an ability a live client site already depends on without a real migration step.

Step 4: What still genuinely needs a human

Standardizing the repeatable parts of delivery isn’t the same as removing judgment from the engagement entirely. Discovery (understanding a specific client’s content model and business rules), the data-handling conversation from Lesson 4, and reviewing what an AI-driven change actually did before approving it (Lesson 5) all still require a person paying attention. Scaling delivery means spending more of your team’s time on those judgment-heavy parts and less on rewriting boilerplate, not eliminating the need for people entirely.

What scales with a shared library, and what doesn't
Scales: ability and guardrail code
Written once, reused everywhere, improved centrally.
Scales: MCP server setup
A standard helper function, configured per client rather than rewritten.
Doesn't scale away: client discovery
Understanding a specific client's data and needs is genuinely per-client work.
Doesn't scale away: human review before approval
Lesson 5's staging-first process still needs a person's judgment, no library replaces that.

Recap

Rebuilding ability registration, MCP server setup, and safety guardrails for every new client caps how fast an agency can grow, since delivery cost stays roughly constant per client. Course 8’s reusable ability library pattern, packaged as an internal Composer package and depended on by every client’s plugin through a thin scaffold, turns the repeatable eighty percent of delivery into configuration instead of new code, while bug fixes and guardrail improvements apply to every client at once instead of client-by-client. What doesn’t scale away, and shouldn’t, is the judgment-heavy work: understanding a specific client’s needs and reviewing AI-driven changes before they reach a live site.

Resources & further reading

← Safe, Staging-First Delivery Supporting Multiple Client Sites at Scale →